You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

608 lines
46 KiB

4 years ago
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = void 0;
  4. var _cssSyntaxError = _interopRequireDefault(require("./css-syntax-error"));
  5. var _stringifier = _interopRequireDefault(require("./stringifier"));
  6. var _stringify = _interopRequireDefault(require("./stringify"));
  7. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  8. function cloneNode(obj, parent) {
  9. var cloned = new obj.constructor();
  10. for (var i in obj) {
  11. if (!obj.hasOwnProperty(i)) continue;
  12. var value = obj[i];
  13. var type = typeof value;
  14. if (i === 'parent' && type === 'object') {
  15. if (parent) cloned[i] = parent;
  16. } else if (i === 'source') {
  17. cloned[i] = value;
  18. } else if (value instanceof Array) {
  19. cloned[i] = value.map(function (j) {
  20. return cloneNode(j, cloned);
  21. });
  22. } else {
  23. if (type === 'object' && value !== null) value = cloneNode(value);
  24. cloned[i] = value;
  25. }
  26. }
  27. return cloned;
  28. }
  29. /**
  30. * All node classes inherit the following common methods.
  31. *
  32. * @abstract
  33. */
  34. var Node =
  35. /*#__PURE__*/
  36. function () {
  37. /**
  38. * @param {object} [defaults] Value for node properties.
  39. */
  40. function Node(defaults) {
  41. if (defaults === void 0) {
  42. defaults = {};
  43. }
  44. this.raws = {};
  45. if (process.env.NODE_ENV !== 'production') {
  46. if (typeof defaults !== 'object' && typeof defaults !== 'undefined') {
  47. throw new Error('PostCSS nodes constructor accepts object, not ' + JSON.stringify(defaults));
  48. }
  49. }
  50. for (var name in defaults) {
  51. this[name] = defaults[name];
  52. }
  53. }
  54. /**
  55. * Returns a `CssSyntaxError` instance containing the original position
  56. * of the node in the source, showing line and column numbers and also
  57. * a small excerpt to facilitate debugging.
  58. *
  59. * If present, an input source map will be used to get the original position
  60. * of the source, even from a previous compilation step
  61. * (e.g., from Sass compilation).
  62. *
  63. * This method produces very useful error messages.
  64. *
  65. * @param {string} message Error description.
  66. * @param {object} [opts] Options.
  67. * @param {string} opts.plugin Plugin name that created this error.
  68. * PostCSS will set it automatically.
  69. * @param {string} opts.word A word inside a nodes string that should
  70. * be highlighted as the source of the error.
  71. * @param {number} opts.index An index inside a nodes string that should
  72. * be highlighted as the source of the error.
  73. *
  74. * @return {CssSyntaxError} Error object to throw it.
  75. *
  76. * @example
  77. * if (!variables[name]) {
  78. * throw decl.error('Unknown variable ' + name, { word: name })
  79. * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black
  80. * // color: $black
  81. * // a
  82. * // ^
  83. * // background: white
  84. * }
  85. */
  86. var _proto = Node.prototype;
  87. _proto.error = function error(message, opts) {
  88. if (opts === void 0) {
  89. opts = {};
  90. }
  91. if (this.source) {
  92. var pos = this.positionBy(opts);
  93. return this.source.input.error(message, pos.line, pos.column, opts);
  94. }
  95. return new _cssSyntaxError.default(message);
  96. }
  97. /**
  98. * This method is provided as a convenience wrapper for {@link Result#warn}.
  99. *
  100. * @param {Result} result The {@link Result} instance
  101. * that will receive the warning.
  102. * @param {string} text Warning message.
  103. * @param {object} [opts] Options
  104. * @param {string} opts.plugin Plugin name that created this warning.
  105. * PostCSS will set it automatically.
  106. * @param {string} opts.word A word inside a nodes string that should
  107. * be highlighted as the source of the warning.
  108. * @param {number} opts.index An index inside a nodes string that should
  109. * be highlighted as the source of the warning.
  110. *
  111. * @return {Warning} Created warning object.
  112. *
  113. * @example
  114. * const plugin = postcss.plugin('postcss-deprecated', () => {
  115. * return (root, result) => {
  116. * root.walkDecls('bad', decl => {
  117. * decl.warn(result, 'Deprecated property bad')
  118. * })
  119. * }
  120. * })
  121. */
  122. ;
  123. _proto.warn = function warn(result, text, opts) {
  124. var data = {
  125. node: this
  126. };
  127. for (var i in opts) {
  128. data[i] = opts[i];
  129. }
  130. return result.warn(text, data);
  131. }
  132. /**
  133. * Removes the node from its parent and cleans the parent properties
  134. * from the node and its children.
  135. *
  136. * @example
  137. * if (decl.prop.match(/^-webkit-/)) {
  138. * decl.remove()
  139. * }
  140. *
  141. * @return {Node} Node to make calls chain.
  142. */
  143. ;
  144. _proto.remove = function remove() {
  145. if (this.parent) {
  146. this.parent.removeChild(this);
  147. }
  148. this.parent = undefined;
  149. return this;
  150. }
  151. /**
  152. * Returns a CSS string representing the node.
  153. *
  154. * @param {stringifier|syntax} [stringifier] A syntax to use
  155. * in string generation.
  156. *
  157. * @return {string} CSS string of this node.
  158. *
  159. * @example
  160. * postcss.rule({ selector: 'a' }).toString() //=> "a {}"
  161. */
  162. ;
  163. _proto.toString = function toString(stringifier) {
  164. if (stringifier === void 0) {
  165. stringifier = _stringify.default;
  166. }
  167. if (stringifier.stringify) stringifier = stringifier.stringify;
  168. var result = '';
  169. stringifier(this, function (i) {
  170. result += i;
  171. });
  172. return result;
  173. }
  174. /**
  175. * Returns an exact clone of the node.
  176. *
  177. * The resulting cloned node and its (cloned) children will retain
  178. * code style properties.
  179. *
  180. * @param {object} [overrides] New properties to override in the clone.
  181. *
  182. * @example
  183. * decl.raws.before //=> "\n "
  184. * const cloned = decl.clone({ prop: '-moz-' + decl.prop })
  185. * cloned.raws.before //=> "\n "
  186. * cloned.toString() //=> -moz-transform: scale(0)
  187. *
  188. * @return {Node} Clone of the node.
  189. */
  190. ;
  191. _proto.clone = function clone(overrides) {
  192. if (overrides === void 0) {
  193. overrides = {};
  194. }
  195. var cloned = cloneNode(this);
  196. for (var name in overrides) {
  197. cloned[name] = overrides[name];
  198. }
  199. return cloned;
  200. }
  201. /**
  202. * Shortcut to clone the node and insert the resulting cloned node
  203. * before the current node.
  204. *
  205. * @param {object} [overrides] Mew properties to override in the clone.
  206. *
  207. * @example
  208. * decl.cloneBefore({ prop: '-moz-' + decl.prop })
  209. *
  210. * @return {Node} New node
  211. */
  212. ;
  213. _proto.cloneBefore = function cloneBefore(overrides) {
  214. if (overrides === void 0) {
  215. overrides = {};
  216. }
  217. var cloned = this.clone(overrides);
  218. this.parent.insertBefore(this, cloned);
  219. return cloned;
  220. }
  221. /**
  222. * Shortcut to clone the node and insert the resulting cloned node
  223. * after the current node.
  224. *
  225. * @param {object} [overrides] New properties to override in the clone.
  226. *
  227. * @return {Node} New node.
  228. */
  229. ;
  230. _proto.cloneAfter = function cloneAfter(overrides) {
  231. if (overrides === void 0) {
  232. overrides = {};
  233. }
  234. var cloned = this.clone(overrides);
  235. this.parent.insertAfter(this, cloned);
  236. return cloned;
  237. }
  238. /**
  239. * Inserts node(s) before the current node and removes the current node.
  240. *
  241. * @param {...Node} nodes Mode(s) to replace current one.
  242. *
  243. * @example
  244. * if (atrule.name === 'mixin') {
  245. * atrule.replaceWith(mixinRules[atrule.params])
  246. * }
  247. *
  248. * @return {Node} Current node to methods chain.
  249. */
  250. ;
  251. _proto.replaceWith = function replaceWith() {
  252. if (this.parent) {
  253. for (var _len = arguments.length, nodes = new Array(_len), _key = 0; _key < _len; _key++) {
  254. nodes[_key] = arguments[_key];
  255. }
  256. for (var _i = 0, _nodes = nodes; _i < _nodes.length; _i++) {
  257. var node = _nodes[_i];
  258. this.parent.insertBefore(this, node);
  259. }
  260. this.remove();
  261. }
  262. return this;
  263. }
  264. /**
  265. * Returns the next child of the nodes parent.
  266. * Returns `undefined` if the current node is the last child.
  267. *
  268. * @return {Node|undefined} Next node.
  269. *
  270. * @example
  271. * if (comment.text === 'delete next') {
  272. * const next = comment.next()
  273. * if (next) {
  274. * next.remove()
  275. * }
  276. * }
  277. */
  278. ;
  279. _proto.next = function next() {
  280. if (!this.parent) return undefined;
  281. var index = this.parent.index(this);
  282. return this.parent.nodes[index + 1];
  283. }
  284. /**
  285. * Returns the previous child of the nodes parent.
  286. * Returns `undefined` if the current node is the first child.
  287. *
  288. * @return {Node|undefined} Previous node.
  289. *
  290. * @example
  291. * const annotation = decl.prev()
  292. * if (annotation.type === 'comment') {
  293. * readAnnotation(annotation.text)
  294. * }
  295. */
  296. ;
  297. _proto.prev = function prev() {
  298. if (!this.parent) return undefined;
  299. var index = this.parent.index(this);
  300. return this.parent.nodes[index - 1];
  301. }
  302. /**
  303. * Insert new node before current node to current nodes parent.
  304. *
  305. * Just alias for `node.parent.insertBefore(node, add)`.
  306. *
  307. * @param {Node|object|string|Node[]} add New node.
  308. *
  309. * @return {Node} This node for methods chain.
  310. *
  311. * @example
  312. * decl.before('content: ""')
  313. */
  314. ;
  315. _proto.before = function before(add) {
  316. this.parent.insertBefore(this, add);
  317. return this;
  318. }
  319. /**
  320. * Insert new node after current node to current nodes parent.
  321. *
  322. * Just alias for `node.parent.insertAfter(node, add)`.
  323. *
  324. * @param {Node|object|string|Node[]} add New node.
  325. *
  326. * @return {Node} This node for methods chain.
  327. *
  328. * @example
  329. * decl.after('color: black')
  330. */
  331. ;
  332. _proto.after = function after(add) {
  333. this.parent.insertAfter(this, add);
  334. return this;
  335. };
  336. _proto.toJSON = function toJSON() {
  337. var fixed = {};
  338. for (var name in this) {
  339. if (!this.hasOwnProperty(name)) continue;
  340. if (name === 'parent') continue;
  341. var value = this[name];
  342. if (value instanceof Array) {
  343. fixed[name] = value.map(function (i) {
  344. if (typeof i === 'object' && i.toJSON) {
  345. return i.toJSON();
  346. } else {
  347. return i;
  348. }
  349. });
  350. } else if (typeof value === 'object' && value.toJSON) {
  351. fixed[name] = value.toJSON();
  352. } else {
  353. fixed[name] = value;
  354. }
  355. }
  356. return fixed;
  357. }
  358. /**
  359. * Returns a {@link Node#raws} value. If the node is missing
  360. * the code style property (because the node was manually built or cloned),
  361. * PostCSS will try to autodetect the code style property by looking
  362. * at other nodes in the tree.
  363. *
  364. * @param {string} prop Name of code style property.
  365. * @param {string} [defaultType] Name of default value, it can be missed
  366. * if the value is the same as prop.
  367. *
  368. * @example
  369. * const root = postcss.parse('a { background: white }')
  370. * root.nodes[0].append({ prop: 'color', value: 'black' })
  371. * root.nodes[0].nodes[1].raws.before //=> undefined
  372. * root.nodes[0].nodes[1].raw('before') //=> ' '
  373. *
  374. * @return {string} Code style value.
  375. */
  376. ;
  377. _proto.raw = function raw(prop, defaultType) {
  378. var str = new _stringifier.default();
  379. return str.raw(this, prop, defaultType);
  380. }
  381. /**
  382. * Finds the Root instance of the nodes tree.
  383. *
  384. * @example
  385. * root.nodes[0].nodes[0].root() === root
  386. *
  387. * @return {Root} Root parent.
  388. */
  389. ;
  390. _proto.root = function root() {
  391. var result = this;
  392. while (result.parent) {
  393. result = result.parent;
  394. }
  395. return result;
  396. }
  397. /**
  398. * Clear the code style properties for the node and its children.
  399. *
  400. * @param {boolean} [keepBetween] Keep the raws.between symbols.
  401. *
  402. * @return {undefined}
  403. *
  404. * @example
  405. * node.raws.before //=> ' '
  406. * node.cleanRaws()
  407. * node.raws.before //=> undefined
  408. */
  409. ;
  410. _proto.cleanRaws = function cleanRaws(keepBetween) {
  411. delete this.raws.before;
  412. delete this.raws.after;
  413. if (!keepBetween) delete this.raws.between;
  414. };
  415. _proto.positionInside = function positionInside(index) {
  416. var string = this.toString();
  417. var column = this.source.start.column;
  418. var line = this.source.start.line;
  419. for (var i = 0; i < index; i++) {
  420. if (string[i] === '\n') {
  421. column = 1;
  422. line += 1;
  423. } else {
  424. column += 1;
  425. }
  426. }
  427. return {
  428. line: line,
  429. column: column
  430. };
  431. };
  432. _proto.positionBy = function positionBy(opts) {
  433. var pos = this.source.start;
  434. if (opts.index) {
  435. pos = this.positionInside(opts.index);
  436. } else if (opts.word) {
  437. var index = this.toString().indexOf(opts.word);
  438. if (index !== -1) pos = this.positionInside(index);
  439. }
  440. return pos;
  441. }
  442. /**
  443. * @memberof Node#
  444. * @member {string} type String representing the nodes type.
  445. * Possible values are `root`, `atrule`, `rule`,
  446. * `decl`, or `comment`.
  447. *
  448. * @example
  449. * postcss.decl({ prop: 'color', value: 'black' }).type //=> 'decl'
  450. */
  451. /**
  452. * @memberof Node#
  453. * @member {Container} parent The nodes parent node.
  454. *
  455. * @example
  456. * root.nodes[0].parent === root
  457. */
  458. /**
  459. * @memberof Node#
  460. * @member {source} source The input source of the node.
  461. *
  462. * The property is used in source map generation.
  463. *
  464. * If you create a node manually (e.g., with `postcss.decl()`),
  465. * that node will not have a `source` property and will be absent
  466. * from the source map. For this reason, the plugin developer should
  467. * consider cloning nodes to create new ones (in which case the new nodes
  468. * source will reference the original, cloned node) or setting
  469. * the `source` property manually.
  470. *
  471. * ```js
  472. * // Bad
  473. * const prefixed = postcss.decl({
  474. * prop: '-moz-' + decl.prop,
  475. * value: decl.value
  476. * })
  477. *
  478. * // Good
  479. * const prefixed = decl.clone({ prop: '-moz-' + decl.prop })
  480. * ```
  481. *
  482. * ```js
  483. * if (atrule.name === 'add-link') {
  484. * const rule = postcss.rule({ selector: 'a', source: atrule.source })
  485. * atrule.parent.insertBefore(atrule, rule)
  486. * }
  487. * ```
  488. *
  489. * @example
  490. * decl.source.input.from //=> '/home/ai/a.sass'
  491. * decl.source.start //=> { line: 10, column: 2 }
  492. * decl.source.end //=> { line: 10, column: 12 }
  493. */
  494. /**
  495. * @memberof Node#
  496. * @member {object} raws Information to generate byte-to-byte equal
  497. * node string as it was in the origin input.
  498. *
  499. * Every parser saves its own properties,
  500. * but the default CSS parser uses:
  501. *
  502. * * `before`: the space symbols before the node. It also stores `*`
  503. * and `_` symbols before the declaration (IE hack).
  504. * * `after`: the space symbols after the last child of the node
  505. * to the end of the node.
  506. * * `between`: the symbols between the property and value
  507. * for declarations, selector and `{` for rules, or last parameter
  508. * and `{` for at-rules.
  509. * * `semicolon`: contains true if the last child has
  510. * an (optional) semicolon.
  511. * * `afterName`: the space between the at-rule name and its parameters.
  512. * * `left`: the space symbols between `/*` and the comments text.
  513. * * `right`: the space symbols between the comments text
  514. * and <code>*&#47;</code>.
  515. * * `important`: the content of the important statement,
  516. * if it is not just `!important`.
  517. *
  518. * PostCSS cleans selectors, declaration values and at-rule parameters
  519. * from comments and extra spaces, but it stores origin content in raws
  520. * properties. As such, if you dont change a declarations value,
  521. * PostCSS will use the raw value with comments.
  522. *
  523. * @example
  524. * const root = postcss.parse('a {\n color:black\n}')
  525. * root.first.first.raws //=> { before: '\n ', between: ':' }
  526. */
  527. ;
  528. return Node;
  529. }();
  530. var _default = Node;
  531. /**
  532. * @typedef {object} position
  533. * @property {number} line Source line in file.
  534. * @property {number} column Source column in file.
  535. */
  536. /**
  537. * @typedef {object} source
  538. * @property {Input} input {@link Input} with input file
  539. * @property {position} start The starting position of the nodes source.
  540. * @property {position} end The ending position of the nodes source.
  541. */
  542. exports.default = _default;
  543. module.exports = exports.default;
  544. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGUuZXM2Il0sIm5hbWVzIjpbImNsb25lTm9kZSIsIm9iaiIsInBhcmVudCIsImNsb25lZCIsImNvbnN0cnVjdG9yIiwiaSIsImhhc093blByb3BlcnR5IiwidmFsdWUiLCJ0eXBlIiwiQXJyYXkiLCJtYXAiLCJqIiwiTm9kZSIsImRlZmF1bHRzIiwicmF3cyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIm5hbWUiLCJlcnJvciIsIm1lc3NhZ2UiLCJvcHRzIiwic291cmNlIiwicG9zIiwicG9zaXRpb25CeSIsImlucHV0IiwibGluZSIsImNvbHVtbiIsIkNzc1N5bnRheEVycm9yIiwid2FybiIsInJlc3VsdCIsInRleHQiLCJkYXRhIiwibm9kZSIsInJlbW92ZSIsInJlbW92ZUNoaWxkIiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzdHJpbmdpZmllciIsImNsb25lIiwib3ZlcnJpZGVzIiwiY2xvbmVCZWZvcmUiLCJpbnNlcnRCZWZvcmUiLCJjbG9uZUFmdGVyIiwiaW5zZXJ0QWZ0ZXIiLCJyZXBsYWNlV2l0aCIsIm5vZGVzIiwibmV4dCIsImluZGV4IiwicHJldiIsImJlZm9yZSIsImFkZCIsImFmdGVyIiwidG9KU09OIiwiZml4ZWQiLCJyYXciLCJwcm9wIiwiZGVmYXVsdFR5cGUiLCJzdHIiLCJTdHJpbmdpZmllciIsInJvb3QiLCJjbGVhblJhd3MiLCJrZWVwQmV0d2VlbiIsImJldHdlZW4iLCJwb3NpdGlvbkluc2lkZSIsInN0cmluZyIsInN0YXJ0Iiwid29yZCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW9CQyxHQUFwQixFQUF5QkMsTUFBekIsRUFBaUM7QUFDL0IsTUFBSUMsTUFBTSxHQUFHLElBQUlGLEdBQUcsQ0FBQ0csV0FBUixFQUFiOztBQUVBLE9BQUssSUFBSUMsQ0FBVCxJQUFjSixHQUFkLEVBQW1CO0FBQ2pCLFFBQUksQ0FBQ0EsR0FBRyxDQUFDSyxjQUFKLENBQW1CRCxDQUFuQixDQUFMLEVBQTRCO0FBQzVCLFFBQUlFLEtBQUssR0FBR04sR0FBRyxDQUFDSSxDQUFELENBQWY7QUFDQSxRQUFJRyxJQUFJLEdBQUcsT0FBT0QsS0FBbEI7O0FBRUEsUUFBSUYsQ0FBQyxLQUFLLFFBQU4sSUFBa0JHLElBQUksS0FBSyxRQUEvQixFQUF5QztBQUN2QyxVQUFJTixNQUFKLEVBQVlDLE1BQU0sQ0FBQ0UsQ0FBRCxDQUFOLEdBQVlILE1BQVo7QUFDYixLQUZELE1BRU8sSUFBSUcsQ0FBQyxLQUFLLFFBQVYsRUFBb0I7QUFDekJGLE1BQUFBLE1BQU0sQ0FBQ0UsQ0FBRCxDQUFOLEdBQVlFLEtBQVo7QUFDRCxLQUZNLE1BRUEsSUFBSUEsS0FBSyxZQUFZRSxLQUFyQixFQUE0QjtBQUNqQ04sTUFBQUEsTUFBTSxDQUFDRSxDQUFELENBQU4sR0FBWUUsS0FBSyxDQUFDRyxHQUFOLENBQVUsVUFBQUMsQ0FBQztBQUFBLGVBQUlYLFNBQVMsQ0FBQ1csQ0FBRCxFQUFJUixNQUFKLENBQWI7QUFBQSxPQUFYLENBQVo7QUFDRCxLQUZNLE1BRUE7QUFDTCxVQUFJSyxJQUFJLEtBQUssUUFBVCxJQUFxQkQsS0FBSyxLQUFLLElBQW5DLEVBQXlDQSxLQUFLLEdBQUdQLFNBQVMsQ0FBQ08sS0FBRCxDQUFqQjtBQUN6Q0osTUFBQUEsTUFBTSxDQUFDRSxDQUFELENBQU4sR0FBWUUsS0FBWjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0osTUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7SUFLTVMsSTs7O0FBQ0o7OztBQUdBLGdCQUFhQyxRQUFiLEVBQTZCO0FBQUEsUUFBaEJBLFFBQWdCO0FBQWhCQSxNQUFBQSxRQUFnQixHQUFMLEVBQUs7QUFBQTs7QUFDM0IsU0FBS0MsSUFBTCxHQUFZLEVBQVo7O0FBQ0EsUUFBSUMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQVosS0FBeUIsWUFBN0IsRUFBMkM7QUFDekMsVUFBSSxPQUFPSixRQUFQLEtBQW9CLFFBQXBCLElBQWdDLE9BQU9BLFFBQVAsS0FBb0IsV0FBeEQsRUFBcUU7QUFDbkUsY0FBTSxJQUFJSyxLQUFKLENBQ0osbURBQ0FDLElBQUksQ0FBQ0MsU0FBTCxDQUFlUCxRQUFmLENBRkksQ0FBTjtBQUlEO0FBQ0Y7O0FBQ0QsU0FBSyxJQUFJUSxJQUFULElBQWlCUixRQUFqQixFQUEyQjtBQUN6QixXQUFLUSxJQUFMLElBQWFSLFFBQVEsQ0FBQ1EsSUFBRCxDQUFyQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBZ0NBQyxLLEdBQUEsZUFBT0MsT0FBUCxFQUFnQkMsSUFBaEIsRUFBNEI7QUFBQSxRQUFaQSxJQUFZO0FBQVpBLE1BQUFBLElBQVksR0FBTCxFQUFLO0FBQUE7O0FBQzFCLFFBQUksS0FBS0MsTUFBVCxFQUFpQjtBQUNmLFVBQUlDLEdBQUcsR0FBRyxLQUFLQyxVQUFMLENBQWdCSCxJQUFoQixDQUFWO0FBQ0EsYUFBTyxLQUFLQyxNQUFMLENBQVlHLEtBQVosQ0FBa0JOLEtBQWxCLENBQXdCQyxPQUF4QixFQUFpQ0csR0FBRyxDQUFDRyxJQUFyQyxFQUEyQ0gsR0FBRyxDQUFDSSxNQUEvQyxFQUF1RE4sSUFBdkQsQ0FBUDtBQUNEOztBQUNELFdBQU8sSUFBSU8sdUJBQUosQ0FBbUJSLE9BQW5CLENBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0F5QkFTLEksR0FBQSxjQUFNQyxNQUFOLEVBQWNDLElBQWQsRUFBb0JWLElBQXBCLEVBQTBCO0FBQ3hCLFFBQUlXLElBQUksR0FBRztBQUFFQyxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUFYOztBQUNBLFNBQUssSUFBSS9CLENBQVQsSUFBY21CLElBQWQ7QUFBb0JXLE1BQUFBLElBQUksQ0FBQzlCLENBQUQsQ0FBSixHQUFVbUIsSUFBSSxDQUFDbkIsQ0FBRCxDQUFkO0FBQXBCOztBQUNBLFdBQU80QixNQUFNLENBQUNELElBQVAsQ0FBWUUsSUFBWixFQUFrQkMsSUFBbEIsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7U0FXQUUsTSxHQUFBLGtCQUFVO0FBQ1IsUUFBSSxLQUFLbkMsTUFBVCxFQUFpQjtBQUNmLFdBQUtBLE1BQUwsQ0FBWW9DLFdBQVosQ0FBd0IsSUFBeEI7QUFDRDs7QUFDRCxTQUFLcEMsTUFBTCxHQUFjcUMsU0FBZDtBQUNBLFdBQU8sSUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7U0FXQUMsUSxHQUFBLGtCQUFVQyxXQUFWLEVBQW1DO0FBQUEsUUFBekJBLFdBQXlCO0FBQXpCQSxNQUFBQSxXQUF5QixHQUFYckIsa0JBQVc7QUFBQTs7QUFDakMsUUFBSXFCLFdBQVcsQ0FBQ3JCLFNBQWhCLEVBQTJCcUIsV0FBVyxH