Files
old-cto-as-you-go/CTOAsYouGo/node_modules/postcss/lib/parser.js

610 lines
55 KiB
JavaScript
Raw Normal View History

2023-07-05 11:02:15 +02:00
"use strict";
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
exports.__esModule = true;
exports.default = void 0;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var _declaration = _interopRequireDefault(require("./declaration"));
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var _tokenize = _interopRequireDefault(require("./tokenize"));
var _comment = _interopRequireDefault(require("./comment"));
var _atRule = _interopRequireDefault(require("./at-rule"));
var _root = _interopRequireDefault(require("./root"));
var _rule = _interopRequireDefault(require("./rule"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
var Parser = /*#__PURE__*/function () {
function Parser(input) {
this.input = input;
this.root = new _root.default();
this.current = this.root;
this.spaces = '';
this.semicolon = false;
this.createTokenizer();
this.root.source = {
input: input,
start: {
line: 1,
column: 1
}
};
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
var _proto = Parser.prototype;
_proto.createTokenizer = function createTokenizer() {
this.tokenizer = (0, _tokenize.default)(this.input);
};
_proto.parse = function parse() {
var token;
2023-07-01 10:42:40 +02:00
while (!this.tokenizer.endOfFile()) {
2023-07-05 11:02:15 +02:00
token = this.tokenizer.nextToken();
2023-07-01 10:42:40 +02:00
switch (token[0]) {
case 'space':
2023-07-05 11:02:15 +02:00
this.spaces += token[1];
break;
2023-07-01 10:42:40 +02:00
case ';':
2023-07-05 11:02:15 +02:00
this.freeSemicolon(token);
break;
2023-07-01 10:42:40 +02:00
case '}':
2023-07-05 11:02:15 +02:00
this.end(token);
break;
2023-07-01 10:42:40 +02:00
case 'comment':
2023-07-05 11:02:15 +02:00
this.comment(token);
break;
2023-07-01 10:42:40 +02:00
case 'at-word':
2023-07-05 11:02:15 +02:00
this.atrule(token);
break;
2023-07-01 10:42:40 +02:00
case '{':
2023-07-05 11:02:15 +02:00
this.emptyRule(token);
break;
2023-07-01 10:42:40 +02:00
default:
2023-07-05 11:02:15 +02:00
this.other(token);
break;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
this.endFile();
};
_proto.comment = function comment(token) {
var node = new _comment.default();
this.init(node, token[2], token[3]);
node.source.end = {
line: token[4],
column: token[5]
};
var text = token[1].slice(2, -2);
2023-07-01 10:42:40 +02:00
if (/^\s*$/.test(text)) {
2023-07-05 11:02:15 +02:00
node.text = '';
node.raws.left = text;
node.raws.right = '';
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
var match = text.match(/^(\s*)([^]*[^\s])(\s*)$/);
node.text = match[2];
node.raws.left = match[1];
node.raws.right = match[3];
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
};
_proto.emptyRule = function emptyRule(token) {
var node = new _rule.default();
this.init(node, token[2], token[3]);
node.selector = '';
node.raws.between = '';
this.current = node;
};
_proto.other = function other(start) {
var end = false;
var type = null;
var colon = false;
var bracket = null;
var brackets = [];
var tokens = [];
var token = start;
2023-07-01 10:42:40 +02:00
while (token) {
2023-07-05 11:02:15 +02:00
type = token[0];
tokens.push(token);
2023-07-01 10:42:40 +02:00
if (type === '(' || type === '[') {
2023-07-05 11:02:15 +02:00
if (!bracket) bracket = token;
brackets.push(type === '(' ? ')' : ']');
2023-07-01 10:42:40 +02:00
} else if (brackets.length === 0) {
if (type === ';') {
if (colon) {
2023-07-05 11:02:15 +02:00
this.decl(tokens);
return;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
break;
2023-07-01 10:42:40 +02:00
}
} else if (type === '{') {
2023-07-05 11:02:15 +02:00
this.rule(tokens);
return;
2023-07-01 10:42:40 +02:00
} else if (type === '}') {
2023-07-05 11:02:15 +02:00
this.tokenizer.back(tokens.pop());
end = true;
break;
2023-07-01 10:42:40 +02:00
} else if (type === ':') {
2023-07-05 11:02:15 +02:00
colon = true;
2023-07-01 10:42:40 +02:00
}
} else if (type === brackets[brackets.length - 1]) {
2023-07-05 11:02:15 +02:00
brackets.pop();
if (brackets.length === 0) bracket = null;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
token = this.tokenizer.nextToken();
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
if (this.tokenizer.endOfFile()) end = true;
if (brackets.length > 0) this.unclosedBracket(bracket);
2023-07-01 10:42:40 +02:00
if (end && colon) {
2023-07-05 11:02:15 +02:00
while (tokens.length) {
token = tokens[tokens.length - 1][0];
if (token !== 'space' && token !== 'comment') break;
this.tokenizer.back(tokens.pop());
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
this.decl(tokens);
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
this.unknownWord(tokens);
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
};
_proto.rule = function rule(tokens) {
tokens.pop();
var node = new _rule.default();
this.init(node, tokens[0][2], tokens[0][3]);
node.raws.between = this.spacesAndCommentsFromEnd(tokens);
this.raw(node, 'selector', tokens);
this.current = node;
};
_proto.decl = function decl(tokens) {
var node = new _declaration.default();
this.init(node);
var last = tokens[tokens.length - 1];
2023-07-01 10:42:40 +02:00
if (last[0] === ';') {
2023-07-05 11:02:15 +02:00
this.semicolon = true;
tokens.pop();
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
if (last[4]) {
node.source.end = {
line: last[4],
column: last[5]
};
} else {
node.source.end = {
line: last[2],
column: last[3]
};
}
2023-07-01 10:42:40 +02:00
while (tokens[0][0] !== 'word') {
2023-07-05 11:02:15 +02:00
if (tokens.length === 1) this.unknownWord(tokens);
node.raws.before += tokens.shift()[1];
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node.source.start = {
line: tokens[0][2],
column: tokens[0][3]
};
node.prop = '';
2023-07-01 10:42:40 +02:00
while (tokens.length) {
2023-07-05 11:02:15 +02:00
var type = tokens[0][0];
2023-07-01 10:42:40 +02:00
if (type === ':' || type === 'space' || type === 'comment') {
2023-07-05 11:02:15 +02:00
break;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node.prop += tokens.shift()[1];
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node.raws.between = '';
var token;
2023-07-01 10:42:40 +02:00
while (tokens.length) {
2023-07-05 11:02:15 +02:00
token = tokens.shift();
2023-07-01 10:42:40 +02:00
if (token[0] === ':') {
2023-07-05 11:02:15 +02:00
node.raws.between += token[1];
break;
2023-07-01 10:42:40 +02:00
} else {
if (token[0] === 'word' && /\w/.test(token[1])) {
2023-07-05 11:02:15 +02:00
this.unknownWord([token]);
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node.raws.between += token[1];
2023-07-01 10:42:40 +02:00
}
}
if (node.prop[0] === '_' || node.prop[0] === '*') {
2023-07-05 11:02:15 +02:00
node.raws.before += node.prop[0];
node.prop = node.prop.slice(1);
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node.raws.between += this.spacesAndCommentsFromStart(tokens);
this.precheckMissedSemicolon(tokens);
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for (var i = tokens.length - 1; i > 0; i--) {
token = tokens[i];
2023-07-01 10:42:40 +02:00
if (token[1].toLowerCase() === '!important') {
2023-07-05 11:02:15 +02:00
node.important = true;
var string = this.stringFrom(tokens, i);
string = this.spacesFromEnd(tokens) + string;
if (string !== ' !important') node.raws.important = string;
break;
2023-07-01 10:42:40 +02:00
} else if (token[1].toLowerCase() === 'important') {
2023-07-05 11:02:15 +02:00
var cache = tokens.slice(0);
var str = '';
for (var j = i; j > 0; j--) {
var _type = cache[j][0];
if (str.trim().indexOf('!') === 0 && _type !== 'space') {
break;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
str = cache.pop()[1] + str;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if (str.trim().indexOf('!') === 0) {
2023-07-05 11:02:15 +02:00
node.important = true;
node.raws.important = str;
tokens = cache;
2023-07-01 10:42:40 +02:00
}
}
if (token[0] !== 'space' && token[0] !== 'comment') {
2023-07-05 11:02:15 +02:00
break;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
this.raw(node, 'value', tokens);
if (node.value.indexOf(':') !== -1) this.checkMissedSemicolon(tokens);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.atrule = function atrule(token) {
var node = new _atRule.default();
node.name = token[1].slice(1);
2023-07-01 10:42:40 +02:00
if (node.name === '') {
2023-07-05 11:02:15 +02:00
this.unnamedAtrule(node, token);
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
this.init(node, token[2], token[3]);
var prev;
var shift;
var last = false;
var open = false;
var params = [];
2023-07-01 10:42:40 +02:00
while (!this.tokenizer.endOfFile()) {
2023-07-05 11:02:15 +02:00
token = this.tokenizer.nextToken();
if (token[0] === ';') {
node.source.end = {
line: token[2],
column: token[3]
};
this.semicolon = true;
break;
} else if (token[0] === '{') {
open = true;
break;
} else if (token[0] === '}') {
if (params.length > 0) {
shift = params.length - 1;
prev = params[shift];
while (prev && prev[0] === 'space') {
prev = params[--shift];
}
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
if (prev) {
node.source.end = {
line: prev[4],
column: prev[5]
};
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
this.end(token);
break;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
params.push(token);
2023-07-01 10:42:40 +02:00
}
if (this.tokenizer.endOfFile()) {
2023-07-05 11:02:15 +02:00
last = true;
break;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
node.raws.between = this.spacesAndCommentsFromEnd(params);
2023-07-01 10:42:40 +02:00
if (params.length) {
2023-07-05 11:02:15 +02:00
node.raws.afterName = this.spacesAndCommentsFromStart(params);
this.raw(node, 'params', params);
2023-07-01 10:42:40 +02:00
if (last) {
2023-07-05 11:02:15 +02:00
token = params[params.length - 1];
node.source.end = {
line: token[4],
column: token[5]
};
this.spaces = node.raws.between;
node.raws.between = '';
2023-07-01 10:42:40 +02:00
}
} else {
2023-07-05 11:02:15 +02:00
node.raws.afterName = '';
node.params = '';
2023-07-01 10:42:40 +02:00
}
if (open) {
2023-07-05 11:02:15 +02:00
node.nodes = [];
this.current = node;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.end = function end(token) {
2023-07-01 10:42:40 +02:00
if (this.current.nodes && this.current.nodes.length) {
2023-07-05 11:02:15 +02:00
this.current.raws.semicolon = this.semicolon;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
this.semicolon = false;
this.current.raws.after = (this.current.raws.after || '') + this.spaces;
this.spaces = '';
2023-07-01 10:42:40 +02:00
if (this.current.parent) {
2023-07-05 11:02:15 +02:00
this.current.source.end = {
line: token[2],
column: token[3]
};
this.current = this.current.parent;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
this.unexpectedClose(token);
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
};
_proto.endFile = function endFile() {
if (this.current.parent) this.unclosedBlock();
2023-07-01 10:42:40 +02:00
if (this.current.nodes && this.current.nodes.length) {
2023-07-05 11:02:15 +02:00
this.current.raws.semicolon = this.semicolon;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
this.current.raws.after = (this.current.raws.after || '') + this.spaces;
};
_proto.freeSemicolon = function freeSemicolon(token) {
this.spaces += token[1];
2023-07-01 10:42:40 +02:00
if (this.current.nodes) {
2023-07-05 11:02:15 +02:00
var prev = this.current.nodes[this.current.nodes.length - 1];
2023-07-01 10:42:40 +02:00
if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {
2023-07-05 11:02:15 +02:00
prev.raws.ownSemicolon = this.spaces;
this.spaces = '';
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
} // Helpers
;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.init = function init(node, line, column) {
this.current.push(node);
2023-07-01 10:42:40 +02:00
node.source = {
2023-07-05 11:02:15 +02:00
start: {
line: line,
column: column
},
2023-07-01 10:42:40 +02:00
input: this.input
2023-07-05 11:02:15 +02:00
};
node.raws.before = this.spaces;
this.spaces = '';
if (node.type !== 'comment') this.semicolon = false;
};
_proto.raw = function raw(node, prop, tokens) {
var token, type;
var length = tokens.length;
var value = '';
var clean = true;
var next, prev;
var pattern = /^([.|#])?([\w])+/i;
for (var i = 0; i < length; i += 1) {
token = tokens[i];
type = token[0];
if (type === 'comment' && node.type === 'rule') {
prev = tokens[i - 1];
next = tokens[i + 1];
if (prev[0] !== 'space' && next[0] !== 'space' && pattern.test(prev[1]) && pattern.test(next[1])) {
value += token[1];
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
clean = false;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
continue;
}
if (type === 'comment' || type === 'space' && i === length - 1) {
clean = false;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
value += token[1];
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if (!clean) {
2023-07-05 11:02:15 +02:00
var raw = tokens.reduce(function (all, i) {
return all + i[1];
}, '');
node.raws[prop] = {
value: value,
raw: raw
};
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
node[prop] = value;
};
_proto.spacesAndCommentsFromEnd = function spacesAndCommentsFromEnd(tokens) {
var lastTokenType;
var spaces = '';
2023-07-01 10:42:40 +02:00
while (tokens.length) {
2023-07-05 11:02:15 +02:00
lastTokenType = tokens[tokens.length - 1][0];
if (lastTokenType !== 'space' && lastTokenType !== 'comment') break;
spaces = tokens.pop()[1] + spaces;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return spaces;
};
_proto.spacesAndCommentsFromStart = function spacesAndCommentsFromStart(tokens) {
var next;
var spaces = '';
2023-07-01 10:42:40 +02:00
while (tokens.length) {
2023-07-05 11:02:15 +02:00
next = tokens[0][0];
if (next !== 'space' && next !== 'comment') break;
spaces += tokens.shift()[1];
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return spaces;
};
_proto.spacesFromEnd = function spacesFromEnd(tokens) {
var lastTokenType;
var spaces = '';
2023-07-01 10:42:40 +02:00
while (tokens.length) {
2023-07-05 11:02:15 +02:00
lastTokenType = tokens[tokens.length - 1][0];
if (lastTokenType !== 'space') break;
spaces = tokens.pop()[1] + spaces;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return spaces;
};
_proto.stringFrom = function stringFrom(tokens, from) {
var result = '';
for (var i = from; i < tokens.length; i++) {
result += tokens[i][1];
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
tokens.splice(from, tokens.length - from);
return result;
};
_proto.colon = function colon(tokens) {
var brackets = 0;
var token, type, prev;
for (var i = 0; i < tokens.length; i++) {
token = tokens[i];
type = token[0];
2023-07-01 10:42:40 +02:00
if (type === '(') {
2023-07-05 11:02:15 +02:00
brackets += 1;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if (type === ')') {
2023-07-05 11:02:15 +02:00
brackets -= 1;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
2023-07-01 10:42:40 +02:00
if (brackets === 0 && type === ':') {
if (!prev) {
2023-07-05 11:02:15 +02:00
this.doubleColon(token);
2023-07-01 10:42:40 +02:00
} else if (prev[0] === 'word' && prev[1] === 'progid') {
2023-07-05 11:02:15 +02:00
continue;
2023-07-01 10:42:40 +02:00
} else {
2023-07-05 11:02:15 +02:00
return i;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
prev = token;
2023-07-01 10:42:40 +02:00
}
2023-07-05 11:02:15 +02:00
return false;
} // Errors
;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.unclosedBracket = function unclosedBracket(bracket) {
throw this.input.error('Unclosed bracket', bracket[2], bracket[3]);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.unknownWord = function unknownWord(tokens) {
throw this.input.error('Unknown word', tokens[0][2], tokens[0][3]);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.unexpectedClose = function unexpectedClose(token) {
throw this.input.error('Unexpected }', token[2], token[3]);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.unclosedBlock = function unclosedBlock() {
var pos = this.current.source.start;
throw this.input.error('Unclosed block', pos.line, pos.column);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.doubleColon = function doubleColon(token) {
throw this.input.error('Double colon', token[2], token[3]);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.unnamedAtrule = function unnamedAtrule(node, token) {
throw this.input.error('At-rule without name', token[2], token[3]);
};
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
_proto.precheckMissedSemicolon = function precheckMissedSemicolon()
/* tokens */
{// Hook for Safe Parser
};
_proto.checkMissedSemicolon = function checkMissedSemicolon(tokens) {
var colon = this.colon(tokens);
if (colon === false) return;
var founded = 0;
var token;
2023-07-01 10:42:40 +02:00
2023-07-05 11:02:15 +02:00
for (var j = colon - 1; j >= 0; j--) {
token = tokens[j];
2023-07-01 10:42:40 +02:00
if (token[0] !== 'space') {
2023-07-05 11:02:15 +02:00
founded += 1;
if (founded === 2) break;
2023-07-01 10:42:40 +02:00
}
}
2023-07-05 11:02:15 +02:00
throw this.input.error('Missed semicolon', token[2], token[3]);
};
return Parser;
}();
exports.default = Parser;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlci5lczYiXSwibmFtZXMiOlsiUGFyc2VyIiwiaW5wdXQiLCJyb290IiwiUm9vdCIsImN1cnJlbnQiLCJzcGFjZXMiLCJzZW1pY29sb24iLCJjcmVhdGVUb2tlbml6ZXIiLCJzb3VyY2UiLCJzdGFydCIsImxpbmUiLCJjb2x1bW4iLCJ0b2tlbml6ZXIiLCJwYXJzZSIsInRva2VuIiwiZW5kT2ZGaWxlIiwibmV4dFRva2VuIiwiZnJlZVNlbWljb2xvbiIsImVuZCIsImNvbW1lbnQiLCJhdHJ1bGUiLCJlbXB0eVJ1bGUiLCJvdGhlciIsImVuZEZpbGUiLCJub2RlIiwiQ29tbWVudCIsImluaXQiLCJ0ZXh0Iiwic2xpY2UiLCJ0ZXN0IiwicmF3cyIsImxlZnQiLCJyaWdodCIsIm1hdGNoIiwiUnVsZSIsInNlbGVjdG9yIiwiYmV0d2VlbiIsInR5cGUiLCJjb2xvbiIsImJyYWNrZXQiLCJicmFja2V0cyIsInRva2VucyIsInB1c2giLCJsZW5ndGgiLCJkZWNsIiwicnVsZSIsImJhY2siLCJwb3AiLCJ1bmNsb3NlZEJyYWNrZXQiLCJ1bmtub3duV29yZCIsInNwYWNlc0FuZENvbW1lbnRzRnJvbUVuZCIsInJhdyIsIkRlY2xhcmF0aW9uIiwibGFzdCIsImJlZm9yZSIsInNoaWZ0IiwicHJvcCIsInNwYWNlc0FuZENvbW1lbnRzRnJvbVN0YXJ0IiwicHJlY2hlY2tNaXNzZWRTZW1pY29sb24iLCJpIiwidG9Mb3dlckNhc2UiLCJpbXBvcnRhbnQiLCJzdHJpbmciLCJzdHJpbmdGcm9tIiwic3BhY2VzRnJvbUVuZCIsImNhY2hlIiwic3RyIiwiaiIsInRyaW0iLCJpbmRleE9mIiwidmFsdWUiLCJjaGVja01pc3NlZFNlbWljb2xvbiIsIkF0UnVsZSIsIm5hbWUiLCJ1bm5hbWVkQXRydWxlIiwicHJldiIsIm9wZW4iLCJwYXJhbXMiLCJhZnRlck5hbWUiLCJub2RlcyIsImFmdGVyIiwicGFyZW50IiwidW5leHBlY3RlZENsb3NlIiwidW5jbG9zZWRCbG9jayIsIm93blNlbWljb2xvbiIsImNsZWFuIiwibmV4dCIsInBhdHRlcm4iLCJyZWR1Y2UiLCJhbGwiLCJsYXN0VG9rZW5UeXBlIiwiZnJvbSIsInJlc3VsdCIsInNwbGljZSIsImRvdWJsZUNvbG9uIiwiZXJyb3IiLCJwb3MiLCJmb3VuZGVkIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBRXFCQSxNO0FBQ25CLGtCQUFhQyxLQUFiLEVBQW9CO0FBQ2xCLFNBQUtBLEtBQUwsR0FBYUEsS0FBYjtBQUVBLFNBQUtDLElBQUwsR0FBWSxJQUFJQyxhQUFKLEVBQVo7QUFDQSxTQUFLQyxPQUFMLEdBQWUsS0FBS0YsSUFBcEI7QUFDQSxTQUFLRyxNQUFMLEdBQWMsRUFBZDtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsS0FBakI7QUFFQSxTQUFLQyxlQUFMO0FBQ0EsU0FBS0wsSUFBTCxDQUFVTSxNQUFWLEdBQW1CO0FBQUVQLE1BQUFBLEtBQUssRUFBTEEsS0FBRjtBQUFTUSxNQUFBQSxLQUFLLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFLENBQVI7QUFBV0MsUUFBQUEsTUFBTSxFQUFFO0FBQW5CO0FBQWhCLEtBQW5CO0FBQ0Q7Ozs7U0FFREosZSxHQUFBLDJCQUFtQjtBQUNqQixTQUFLSyxTQUFMLEdBQWlCLHVCQUFVLEtBQUtYLEtBQWYsQ0FBakI7QUFDRCxHOztTQUVEWSxLLEdBQUEsaUJBQVM7QUFDUCxRQUFJQyxLQUFKOztBQUNBLFdBQU8sQ0FBQyxLQUFLRixTQUFMLENBQWVHLFNBQWYsRUFBUixFQUFvQztBQUNsQ0QsTUFBQUEsS0FBSyxHQUFHLEtBQUtGLFNBQUwsQ0FBZUksU0FBZixFQUFSOztBQUVBLGNBQVFGLEtBQUssQ0FBQyxDQUFELENBQWI7QUFDRSxhQUFLLE9BQUw7QUFDRSxlQUFLVCxNQUFMLElBQWVTLEtBQUssQ0FBQyxDQUFELENBQXBCO0FBQ0E7O0FBRUYsYUFBSyxHQUFMO0FBQ0UsZUFBS0csYUFBTCxDQUFtQkgsS0FBbkI7QUFDQTs7QUFFRixhQUFLLEdBQUw7QUFDRSxlQUFLSSxHQUFMLENBQVNKLEtBQVQ7QUFDQTs7QUFFRixhQUFLLFNBQUw7QUFDRSxlQUFLSyxPQUFMLENBQWFMLEtBQWI7QUFDQTs7QUFFRixhQUFLLFNBQUw7QUFDRSxlQUFLTSxNQUFMLENBQVlOLEtBQVo7QUFDQTs7QUFFRixhQUFLLEdBQUw7QUFDRSxlQUFLTyxTQUFMLENBQWVQLEtBQWY7QUFDQTs7QUFFRjtBQUNFLGVBQUtRLEtBQUwsQ0FBV1IsS0FBWDtBQUNBO0FBM0JKO0FBNkJEOztBQUNELFNBQUtTLE9BQUw7QUFDRCxHOztTQUVESixPLEdBQUEsaUJBQVNMLEtBQVQsRUFBZ0I7QUFDZCxRQUFJVSxJQUFJLEdBQUcsSUFBSUMsZ0JBQUosRUFBWDtBQUNBLFNBQUtDLElBQUwsQ0FBVUYsSUFBVixFQUFnQlYsS0FBSyxDQUFDLENBQUQsQ0FBckIsRUFBMEJBLEtBQUssQ0FBQyxDQUFELENBQS9CO0FBQ0FVLElBQUFBLElBQUksQ0FBQ2hCLE1BQUwsQ0FBWVUsR0FBWixHQUFrQjtBQUFFUixNQUFBQSxJQUFJLEVBQUVJLEtBQUssQ0FBQyxDQUFELENBQWI7QUFBa0JILE1BQUFBLE1BQU0sRUFBRUcsS0FBSyxDQUFDLENBQUQ7QUFBL0IsS0FBbEI7QUFFQSxRQUFJYSxJQUFJLEdBQUdiLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBU2MsS0FBVCxDQUFlLENBQWYsRUFBa0IsQ0FBQyxDQUFuQixDQUFYOztBQUNBLFFBQUksUUFBUUMsSUFBUixDQUFhRixJQUFiLENBQUosRUFBd0I7QUFDdEJILE1BQUFBLElBQUksQ0FBQ0csSUFBTCxHQUFZLEVBQVo7QUFDQUgsTUFBQUEsSUFBSSxDQUFDTSxJQUFMLENBQVVDLElBQVYsR0FBaUJKLElBQWpCO0FBQ0FILE1BQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVRSxLQUFWLEdBQWtCLEVBQWxCO0FBQ0QsS0FKRCxNQUlPO0FBQ0wsVUFBSUMsS0FBSyxHQUFHTixJQUFJLENBQUNNLEtBQUwsQ0FBVyx5QkFBWCxDQUFaO0FBQ0FULE1BQUFBLElBQUksQ0FBQ0csSUFBTCxHQUFZTSxLQUFLLENBQUMsQ0FBRCxDQUFqQjtBQUNBVCxNQUFBQSxJQUFJLENBQUNNLElBQUwsQ0FBVUMsSUFBVixHQUFpQkUsS0FBSyxDQUFDLENBQUQsQ0FBdEI7QUFDQVQsTUFBQUEsSUFBSSxDQUFDTSxJQUFMLENBQVVFLEtBQVYsR0FBa0JDLEtBQUssQ0FBQyxDQUFELENBQXZCO0FBQ0Q7QUFDRixHOztTQUVEWixTLEdBQUEsbUJBQVdQLEtBQVgsRUFBa0I7QUFDaEIsUUFBSVUsSUFBSSxHQUFHLElBQUlVLGFBQUosRUFBWDtBQUNBLFNBQUtSLElBQUwsQ0FBVUYsSUFBVixFQUFnQlYsS0FBSyxDQUFDLENBQUQsQ0FB