Index: trip-planner-front/node_modules/critters/LICENSE
===================================================================
--- trip-planner-front/node_modules/critters/LICENSE	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,202 +1,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2018 Google Inc.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
Index: trip-planner-front/node_modules/critters/README.md
===================================================================
--- trip-planner-front/node_modules/critters/README.md	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,171 +1,0 @@
-<p align="center">
-  <img src="https://i.imgur.com/J0jv1Sz.png" width="240" height="240" alt="critters-webpack-plugin">
-  <h1 align="center">Critters</h1>
-</p>
-
-> Critters is a plugin that inlines your app's [critical CSS] and lazy-loads the rest.
-
-## critters [![npm](https://img.shields.io/npm/v/critters-webpack-plugin.svg?style=flat)](https://www.npmjs.org/package/critters)
-
-It's a little different from [other options](#similar-libraries), because it **doesn't use a headless browser** to render content. This tradeoff allows Critters to be very **fast and lightweight**. It also means Critters inlines all CSS rules used by your document, rather than only those needed for above-the-fold content. For alternatives, see [Similar Libraries](#similar-libraries).
-
-Critters' design makes it a good fit when inlining critical CSS for prerendered/SSR'd Single Page Applications. It was developed to be an excellent compliment to [prerender-loader](https://github.com/GoogleChromeLabs/prerender-loader), combining to dramatically improve first paint time for most Single Page Applications.
-
-## Features
-
-- Fast - no browser, few dependencies
-- Integrates with Webpack [critters-webpack-plugin]
-- Supports preloading and/or inlining critical fonts
-- Prunes unused CSS keyframes and media queries
-- Removes inlined CSS rules from lazy-loaded stylesheets
-
-## Installation
-
-First, install Critters as a development dependency:
-
-```sh
-npm i -D critters
-```
-
-or
-
-```sh
-yarn add -D critters
-```
-
-## Usage
-
-```diff
-+    const Critters = require('critters');
-
-+    const c = new Critters({
-+      // optional configuration (see below)
-+    })
-+    const res = c.process(html)
-```
-
-## Usage with webpack
-
-```diff
-// webpack.config.js
-+const Critters = require('critters-webpack-plugin');
-
-module.exports = {
-  plugins: [
-+    new Critters({
-+      // optional configuration (see below)
-+    })
-  ]
-}
-```
-
-That's it! The resultant html will have its critical CSS inlined and the stylesheets lazy-loaded.
-
-## Usage
-
-<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
-
-### Critters
-
-Create a Critters plugin instance with the given options.
-
-**Parameters**
-
-- `options` **Options** Options to control how Critters inlines CSS.
-
-**Examples**
-
-```javascript
-// webpack.config.js
-module.exports = {
-  plugins: [
-    new Critters({
-      // Outputs: <link rel="preload" onload="this.rel='stylesheet'">
-      preload: 'swap',
-
-      // Don't inline critical font-face rules, but preload the font URLs:
-      preloadFonts: true,
-    }),
-  ],
-};
-```
-
-### Critters
-
-All optional. Pass them to `new Critters({ ... })`.
-
-**Parameters**
-
-- `options`
-
-**Properties**
-
-- `external` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Inline styles from external stylesheets _(default: `true`)_
-- `inlineThreshold` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** Inline external stylesheets smaller than a given size _(default: `0`)_
-- `minimumExternalSize` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
-- `pruneSource` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Remove inlined rules from the external stylesheet _(default: `true`)_
-- `mergeStylesheets` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Merged inlined stylesheets into a
-  single \<style\> tag _(default: `true`)_
-- `additionalStylesheets` **[String[]](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Glob for matching other stylesheets which should be used to evaluate critical CSS _(default: '')_
-- `preload` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Which [preload strategy](#preloadstrategy) to use
-- `noscriptFallback` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Add `<noscript>` fallback to JS-based strategies
-- `inlineFonts` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Inline critical font-face rules _(default: `false`)_
-- `preloadFonts` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Preloads critical fonts _(default: `true`)_
-- `fonts` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Shorthand for setting `inlineFonts`+`preloadFonts`- Values:
-  - `true` to inline critical font-face rules and preload the fonts
-  - `false` to don't inline any font-face rules and don't preload fonts
-- `keyframes` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Controls which keyframes rules are inlined.- Values:
-  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
-  - `"all"` inline all keyframes rules
-  - `"none"` remove all keyframes rules
-- `compress` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Compress resulting critical CSS _(default: `true`)_
-- `logLevel` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Controls [log level](#loglevel) of the plugin _(default: `"info"`)_
-
-### LogLevel
-
-Controls log level of the plugin. Specifies the level the logger should use. A logger will
-not produce output for any log level beneath the specified level. Available levels and order
-are:
-
-- **"info"** _(default)_
-- **"warn"**
-- **"error"**
-- **"trace"**
-- **"debug"**
-- **"silent"**
-
-Type: (`"info"` \| `"warn"` \| `"error"` \| `"trace"` \| `"debug"` \| `"silent"`)
-
-### PreloadStrategy
-
-The mechanism to use for lazy-loading stylesheets.
-_[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
-
-- **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
-- **"body":** Move all external stylesheet links to the end of the document.
-- **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
-- **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
-- **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
-- **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
-
-Type: (default | `"body"` \| `"media"` \| `"swap"` \| `"js"` \| `"js-lazy"`)
-
-## Similar Libraries
-
-There are a number of other libraries that can inline Critical CSS, each with a slightly different approach. Here are a few great options:
-
-- [Critical](https://github.com/addyosmani/critical)
-- [Penthouse](https://github.com/pocketjoso/penthouse)
-- [webpack-critical](https://github.com/lukeed/webpack-critical)
-- [webpack-plugin-critical](https://github.com/nrwl/webpack-plugin-critical)
-- [html-critical-webpack-plugin](https://github.com/anthonygore/html-critical-webpack-plugin)
-- [react-snap](https://github.com/stereobooster/react-snap)
-
-## License
-
-[Apache 2.0](LICENSE)
-
-This is not an official Google product.
-
-[critical css]: https://www.smashingmagazine.com/2015/08/understanding-critical-css/
-[html-webpack-plugin]: https://github.com/jantimon/html-webpack-plugin
Index: trip-planner-front/node_modules/critters/dist/critters.cjs
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.cjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/dist/critters.cjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,1049 @@
+var path = require('path');
+var prettyBytes = require('pretty-bytes');
+var parse5 = require('parse5');
+var select = require('css-select');
+var treeAdapter = require('parse5-htmlparser2-tree-adapter');
+var css = require('css');
+var chalk = require('chalk');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+function _interopNamespace(e) {
+  if (e && e.__esModule) return e;
+  var n = Object.create(null);
+  if (e) {
+    Object.keys(e).forEach(function (k) {
+      if (k !== 'default') {
+        var d = Object.getOwnPropertyDescriptor(e, k);
+        Object.defineProperty(n, k, d.get ? d : {
+          enumerable: true,
+          get: function () {
+            return e[k];
+          }
+        });
+      }
+    });
+  }
+  n['default'] = e;
+  return n;
+}
+
+var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
+var prettyBytes__default = /*#__PURE__*/_interopDefaultLegacy(prettyBytes);
+var parse5__default = /*#__PURE__*/_interopDefaultLegacy(parse5);
+var select__default = /*#__PURE__*/_interopDefaultLegacy(select);
+var treeAdapter__default = /*#__PURE__*/_interopDefaultLegacy(treeAdapter);
+var css__default = /*#__PURE__*/_interopDefaultLegacy(css);
+var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+const PARSE5_OPTS = {
+  treeAdapter: treeAdapter__default['default']
+};
+/**
+ * Parse HTML into a mutable, serializable DOM Document.
+ * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
+ * @param {String} html   HTML to parse into a Document instance
+ */
+
+function createDocument(html) {
+  const document = parse5__default['default'].parse(html, PARSE5_OPTS);
+  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
+
+  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
+
+  document.$$Node = scratch.constructor;
+  const elementProto = Object.getPrototypeOf(scratch);
+  defineProperties(elementProto, ElementExtensions);
+  elementProto.ownerDocument = document;
+  return document;
+}
+/**
+ * Serialize a Document to an HTML String
+ * @param {Document} document   A Document, such as one created via `createDocument()`
+ */
+
+function serializeDocument(document) {
+  return parse5__default['default'].serialize(document, PARSE5_OPTS);
+}
+/**
+ * Methods and descriptors to mix into Element.prototype
+ */
+
+const ElementExtensions = {
+  /** @extends htmlparser2.Element.prototype */
+  nodeName: {
+    get() {
+      return this.tagName.toUpperCase();
+    }
+
+  },
+  id: reflectedProperty('id'),
+  className: reflectedProperty('class'),
+
+  insertBefore(child, referenceNode) {
+    if (!referenceNode) return this.appendChild(child);
+    treeAdapter__default['default'].insertBefore(this, child, referenceNode);
+    return child;
+  },
+
+  appendChild(child) {
+    treeAdapter__default['default'].appendChild(this, child);
+    return child;
+  },
+
+  removeChild(child) {
+    treeAdapter__default['default'].detachNode(child);
+  },
+
+  remove() {
+    treeAdapter__default['default'].detachNode(this);
+  },
+
+  textContent: {
+    get() {
+      return getText(this);
+    },
+
+    set(text) {
+      this.children = [];
+      treeAdapter__default['default'].insertText(this, text);
+    }
+
+  },
+
+  setAttribute(name, value) {
+    if (this.attribs == null) this.attribs = {};
+    if (value == null) value = '';
+    this.attribs[name] = value;
+  },
+
+  removeAttribute(name) {
+    if (this.attribs != null) {
+      delete this.attribs[name];
+    }
+  },
+
+  getAttribute(name) {
+    return this.attribs != null && this.attribs[name];
+  },
+
+  hasAttribute(name) {
+    return this.attribs != null && this.attribs[name] != null;
+  },
+
+  getAttributeNode(name) {
+    const value = this.getAttribute(name);
+    if (value != null) return {
+      specified: true,
+      value
+    };
+  }
+
+};
+/**
+ * Methods and descriptors to mix into the global document instance
+ * @private
+ */
+
+const DocumentExtensions = {
+  /** @extends htmlparser2.Document.prototype */
+  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
+  // TODO: verify if these are needed for css-select
+  nodeType: {
+    get() {
+      return 9;
+    }
+
+  },
+  contentType: {
+    get() {
+      return 'text/html';
+    }
+
+  },
+  nodeName: {
+    get() {
+      return '#document';
+    }
+
+  },
+  documentElement: {
+    get() {
+      // Find the first <html> element within the document
+      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
+    }
+
+  },
+  compatMode: {
+    get() {
+      const compatMode = {
+        'no-quirks': 'CSS1Compat',
+        quirks: 'BackCompat',
+        'limited-quirks': 'CSS1Compat'
+      };
+      return compatMode[treeAdapter__default['default'].getDocumentMode(this)];
+    }
+
+  },
+  body: {
+    get() {
+      return this.querySelector('body');
+    }
+
+  },
+
+  createElement(name) {
+    return treeAdapter__default['default'].createElement(name, null, []);
+  },
+
+  createTextNode(text) {
+    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
+    const Node = this.$$Node;
+    return new Node({
+      type: 'text',
+      data: text,
+      parent: null,
+      prev: null,
+      next: null
+    });
+  },
+
+  querySelector(sel) {
+    return select__default['default'].selectOne(sel, this.documentElement);
+  },
+
+  querySelectorAll(sel) {
+    if (sel === ':root') {
+      return this;
+    }
+
+    return select__default['default'](sel, this.documentElement);
+  }
+
+};
+/**
+ * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
+ * @private
+ */
+
+function defineProperties(obj, properties) {
+  for (const i in properties) {
+    const value = properties[i];
+    Object.defineProperty(obj, i, typeof value === 'function' ? {
+      value
+    } : value);
+  }
+}
+/**
+ * Create a property descriptor defining a getter/setter pair alias for a named attribute.
+ * @private
+ */
+
+
+function reflectedProperty(attributeName) {
+  return {
+    get() {
+      return this.getAttribute(attributeName);
+    },
+
+    set(value) {
+      this.setAttribute(attributeName, value);
+    }
+
+  };
+}
+/**
+ * Helper to get the text content of a node
+ * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
+ * @private
+ */
+
+
+function getText(node) {
+  if (Array.isArray(node)) return node.map(getText).join('');
+  if (treeAdapter__default['default'].isElementNode(node)) return node.name === 'br' ? '\n' : getText(node.children);
+  if (treeAdapter__default['default'].isTextNode(node)) return node.data;
+  return '';
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * Parse a textual CSS Stylesheet into a Stylesheet instance.
+ * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
+ * @see https://github.com/reworkcss/css
+ * @private
+ * @param {String} stylesheet
+ * @returns {css.Stylesheet} ast
+ */
+
+function parseStylesheet(stylesheet) {
+  return css__default['default'].parse(stylesheet);
+}
+/**
+ * Serialize a ReworkCSS Stylesheet to a String of CSS.
+ * @private
+ * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
+ * @param {Object} options              Options to pass to `css.stringify()`
+ * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
+ */
+
+function serializeStylesheet(ast, options) {
+  return css__default['default'].stringify(ast, options);
+}
+/**
+ * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
+ * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
+ * @private
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ * @returns {(rule) => void} nonDestructiveIterator
+ */
+
+function markOnly(predicate) {
+  return rule => {
+    const sel = rule.selectors;
+
+    if (predicate(rule) === false) {
+      rule.$$remove = true;
+    }
+
+    rule.$$markedSelectors = rule.selectors;
+
+    if (rule._other) {
+      rule._other.$$markedSelectors = rule._other.selectors;
+    }
+
+    rule.selectors = sel;
+  };
+}
+/**
+ * Apply filtered selectors to a rule from a previous markOnly run.
+ * @private
+ * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
+*/
+
+function applyMarkedSelectors(rule) {
+  if (rule.$$markedSelectors) {
+    rule.selectors = rule.$$markedSelectors;
+  }
+
+  if (rule._other) {
+    applyMarkedSelectors(rule._other);
+  }
+}
+/**
+ * Recursively walk all rules in a stylesheet.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ */
+
+function walkStyleRules(node, iterator) {
+  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
+  node.rules = node.rules.filter(rule => {
+    if (rule.rules) {
+      walkStyleRules(rule, iterator);
+    }
+
+    rule._other = undefined;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+}
+/**
+ * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {css.Rule} node2      A second tree identical to `node`
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
+ */
+
+function walkStyleRulesWithReverseMirror(node, node2, iterator) {
+  if (node2 === null) return walkStyleRules(node, iterator);
+  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
+  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
+    const rule2 = rules2[index];
+
+    if (rule.rules) {
+      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
+    }
+
+    rule._other = rule2;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
+// This is just a quicker version of generating the compliment of the set returned from a filter operation.
+
+function splitFilter(a, b, predicate) {
+  const aOut = [];
+  const bOut = [];
+
+  for (let index = 0; index < a.length; index++) {
+    if (predicate(a[index], index, a, b)) {
+      aOut.push(a[index]);
+    } else {
+      bOut.push(a[index]);
+    }
+  }
+
+  return [aOut, bOut];
+} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
+
+
+function filterSelectors(predicate) {
+  if (this._other) {
+    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
+    this.selectors = a;
+    this._other.selectors = b;
+  } else {
+    this.selectors = this.selectors.filter(predicate);
+  }
+}
+
+const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
+const defaultLogger = {
+  trace(msg) {
+    console.trace(msg);
+  },
+
+  debug(msg) {
+    console.debug(msg);
+  },
+
+  warn(msg) {
+    console.warn(chalk__default['default'].yellow(msg));
+  },
+
+  error(msg) {
+    console.error(chalk__default['default'].bold.red(msg));
+  },
+
+  info(msg) {
+    console.info(chalk__default['default'].bold.blue(msg));
+  },
+
+  silent() {}
+
+};
+function createLogger(logLevel) {
+  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
+  return LOG_LEVELS.reduce((logger, type, index) => {
+    if (index >= logLevelIdx) {
+      logger[type] = defaultLogger[type];
+    } else {
+      logger[type] = defaultLogger.silent;
+    }
+
+    return logger;
+  }, {});
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * The mechanism to use for lazy-loading stylesheets.
+ * _[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
+ *
+ * - **null:** (default) Move stylesheet links to the end of the document and insert preload meta tags in their place.
+ * - **"body":** Move all external stylesheet links to the end of the document.
+ * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
+ * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
+ * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
+ * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
+ * @typedef {(null|'body'|'media'|'swap'|'js'|'js-lazy')} PreloadStrategy
+ * @public
+ */
+
+/**
+ * Controls which keyframes rules are inlined.
+ * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
+ * - **"all":** Inline all keyframes rules.
+ * - **"none":** Remove all keyframes rules.
+ * @typedef {('critical'|'all'|'none')} KeyframeStrategy
+ * @private
+ */
+
+/**
+ * Controls log level of the plugin. Specifies the level the logger should use. A logger will
+ * not produce output for any log level beneath the specified level. Available levels and order
+ * are:
+ *
+ * - **"info"** _(default)_
+ * - **"warn"**
+ * - **"error"**
+ * - **"trace"**
+ * - **"debug"**
+ * - **"silent"**
+ * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
+ * @public
+ */
+
+/**
+ * Custom logger interface:
+ * @typedef Logger
+ * @property {(msg: string) => void} trace - Prints a trace message
+ * @property {(msg: string) => void} debug - Prints a debug message
+ * @property {(msg: string) => void} info - Prints an information message
+ * @property {(msg: string) => void} warn - Prints a warning message
+ * @property {(msg: string) => void} error - Prints an error message
+ * @public
+ */
+
+/**
+ * All optional. Pass them to `new Critters({ ... })`.
+ * @public
+ * @typedef Options
+ * @property {string} [path=''] Base path location of the CSS files _(default: `''`)_
+ * @property {string} [publicPath=''] Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
+ * @property {boolean} [external=true] Inline styles from external stylesheets _(default: `true`)_
+ * @property {number} [inlineThreshold=0] Inline external stylesheets smaller than a given size _(default: `0`)_
+ * @property {number} [minimumExternalSize=0] If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
+ * @property {boolean} [pruneSource=false] Remove inlined rules from the external stylesheet _(default: `false`)_
+ * @property {boolean} [mergeStylesheets=true] Merged inlined stylesheets into a single <style> tag _(default: `true`)_
+ * @property {string[]} [additionalStylesheets=[]] Glob for matching other stylesheets to be used while looking for critical CSS
+ * @property {PreloadStrategy} [preload=null] Which preload strategy to use for stylesheets
+ * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
+ * @property {boolean} [inlineFonts=false] Inline critical font-face rules _(default: `false`)_
+ * @property {boolean} [preloadFonts=true] Preloads critical fonts _(default: `true`)_
+ * @property {boolean|undefined} [fonts] Shorthand for setting `inlineFonts`+`preloadFonts`
+ *  - Values:
+ *  - `true` to inline critical font-face rules and preload the fonts
+ *  - `false` to don't inline any font-face rules and don't preload fonts
+ * @property {KeyframeStrategy} [keyframes='critical'] Controls which keyframes rules are inlined (default: 'critical')
+ * @property {Boolean} [compress=true] Compress resulting critical CSS (defaults to true)
+ * @property {LogLevel} [logLevel="info"] Controls the log level of the plugin (defaults to "info")
+ * @property {Logger} [logger] Provide a custom logger interface
+ */
+
+/**
+ * @typedef {{
+ *   readFile(f: string): Promise<string>,
+ *   readFile(f: string, callback: (err: any, data: string) => void): void,
+ * }} FileSystem
+ */
+
+/**
+ * Create an instance of Critters with custom options.
+ * The `.process()` method can be called repeatedly to re-use this instance and its cache.
+ * @param {Options} [options]
+ */
+
+class Critters {
+  /** @private */
+  constructor(options) {
+    this.options = Object.assign({
+      logLevel: 'info',
+      path: '',
+      publicPath: '',
+      reduceInlineStyles: true,
+      pruneSource: false,
+      additionalStylesheets: []
+    }, options || {});
+    /** @type {FileSystem | null} */
+
+    this.fs = null;
+    this.urlFilter = this.options.filter;
+
+    if (this.urlFilter instanceof RegExp) {
+      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
+    }
+
+    this.logger = this.options.logger || createLogger(this.options.logLevel);
+  }
+  /**
+   * Process an HTML document to inline critical CSS from its stylesheets.
+   * @param {string} html String containing a full HTML document to be parsed.
+   * @returns {Promise<string>} A modified copy of the provided HTML with critical CSS inlined.
+   */
+
+
+  async process(html) {
+    const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
+
+    const document = createDocument(html);
+
+    if (this.options.additionalStylesheets.length > 0) {
+      this.embedAdditionalStylesheet(document);
+    } // `external:false` skips processing of external sheets
+
+
+    if (this.options.external !== false) {
+      const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
+      await Promise.all(externalSheets.map(link => this.embedLinkedStylesheet(link, document)));
+    } // go through all the style tags in the document and reduce them to only critical CSS
+
+
+    const styles = this.getAffectedStyleTags(document);
+    await Promise.all(styles.map(style => this.processStyle(style, document)));
+
+    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
+      await this.mergeStylesheets(document);
+    } // serialize the document back to HTML and we're done
+
+
+    const output = serializeDocument(document);
+    const end = process.hrtime.bigint();
+    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
+    return output;
+  }
+  /**
+   * Read the contents of a file from the specified filesystem or disk.
+   * Override this method to customize how stylesheets are loaded.
+   */
+
+
+  readFile(filename) {
+    const fs = this.fs;
+    return new Promise((resolve, reject) => {
+      const callback = (err, data) => {
+        if (err) reject(err);else resolve(data);
+      };
+
+      if (fs && fs.readFile) {
+        const ret = fs.readFile(filename, callback);
+        if (ret && ret.then) resolve(ret);
+      } else {
+        Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('fs')); }).then(fs => {
+          fs.readFile(filename, 'utf-8', callback);
+        }).catch(callback);
+      }
+    });
+  }
+  /**
+   * Get the style tags that need processing
+   * @private
+   */
+
+
+  getAffectedStyleTags(document) {
+    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
+
+    if (this.options.reduceInlineStyles === false) {
+      return styles.filter(style => style.$$external);
+    }
+
+    return styles;
+  }
+  /** @private */
+
+
+  async mergeStylesheets(document) {
+    const styles = this.getAffectedStyleTags(document);
+
+    if (styles.length === 0) {
+      this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
+      return;
+    }
+
+    const first = styles[0];
+    let sheet = first.textContent;
+
+    for (let i = 1; i < styles.length; i++) {
+      const node = styles[i];
+      sheet += node.textContent;
+      node.remove();
+    }
+
+    first.textContent = sheet;
+  }
+  /**
+   * Given a stylesheet URL, returns the corresponding CSS asset.
+   * Overriding this method requires doing your own URL normalization, so it's generally better to override `readFile()`.
+   */
+
+
+  async getCssAsset(href) {
+    const outputPath = this.options.path;
+    const publicPath = this.options.publicPath; // CHECK - the output path
+    // path on disk (with output.publicPath removed)
+
+    let normalizedPath = href.replace(/^\//, '');
+    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
+
+    if (normalizedPath.indexOf(pathPrefix) === 0) {
+      normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
+    }
+
+    const filename = path__default['default'].resolve(outputPath, normalizedPath);
+    let sheet;
+
+    try {
+      sheet = await this.readFile(filename);
+    } catch (e) {
+      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
+    }
+
+    return sheet;
+  }
+  /** @private */
+
+
+  checkInlineThreshold(link, style, sheet) {
+    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
+      const href = style.$$name;
+      style.$$reduce = false;
+      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
+      link.remove();
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
+   * @private
+   */
+
+
+  async embedAdditionalStylesheet(document) {
+    const styleSheetsIncluded = [];
+    const sources = await Promise.all(this.options.additionalStylesheets.map(cssFile => {
+      if (styleSheetsIncluded.includes(cssFile)) {
+        return;
+      }
+
+      styleSheetsIncluded.push(cssFile);
+      const style = document.createElement('style');
+      style.$$external = true;
+      return this.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
+    }));
+    sources.forEach(([sheet, style]) => {
+      if (!sheet) return;
+      style.textContent = sheet;
+      document.head.appendChild(style);
+    });
+  }
+  /**
+   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
+   * @private
+   */
+
+
+  async embedLinkedStylesheet(link, document) {
+    const href = link.getAttribute('href');
+    const media = link.getAttribute('media');
+    const preloadMode = this.options.preload; // skip filtered resources, or network resources if no filter is provided
+
+    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
+      return Promise.resolve();
+    } // the reduced critical CSS gets injected into a new <style> tag
+
+
+    const style = document.createElement('style');
+    style.$$external = true;
+    const sheet = await this.getCssAsset(href, style);
+
+    if (!sheet) {
+      return;
+    }
+
+    style.textContent = sheet;
+    style.$$name = href;
+    style.$$links = [link];
+    link.parentNode.insertBefore(style, link);
+
+    if (this.checkInlineThreshold(link, style, sheet)) {
+      return;
+    } // CSS loader is only injected for the first sheet, then this becomes an empty string
+
+
+    let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
+    const lazy = preloadMode === 'js-lazy';
+
+    if (lazy) {
+      cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
+    } // Allow disabling any mutation of the stylesheet link:
+
+
+    if (preloadMode === false) return;
+    let noscriptFallback = false;
+
+    if (preloadMode === 'body') {
+      document.body.appendChild(link);
+    } else {
+      link.setAttribute('rel', 'preload');
+      link.setAttribute('as', 'style');
+
+      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
+        const script = document.createElement('script');
+        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
+
+        script.textContent = js;
+        link.parentNode.insertBefore(script, link.nextSibling);
+        style.$$links.push(script);
+        cssLoaderPreamble = '';
+        noscriptFallback = true;
+      } else if (preloadMode === 'media') {
+        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
+        link.setAttribute('rel', 'stylesheet');
+        link.removeAttribute('as');
+        link.setAttribute('media', 'print');
+        link.setAttribute('onload', `this.media='${media || 'all'}'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap') {
+        link.setAttribute('onload', "this.rel='stylesheet'");
+        noscriptFallback = true;
+      } else {
+        const bodyLink = document.createElement('link');
+        bodyLink.setAttribute('rel', 'stylesheet');
+        if (media) bodyLink.setAttribute('media', media);
+        bodyLink.setAttribute('href', href);
+        document.body.appendChild(bodyLink);
+        style.$$links.push(bodyLink);
+      }
+    }
+
+    if (this.options.noscriptFallback !== false && noscriptFallback) {
+      const noscript = document.createElement('noscript');
+      const noscriptLink = document.createElement('link');
+      noscriptLink.setAttribute('rel', 'stylesheet');
+      noscriptLink.setAttribute('href', href);
+      if (media) noscriptLink.setAttribute('media', media);
+      noscript.appendChild(noscriptLink);
+      link.parentNode.insertBefore(noscript, link.nextSibling);
+      style.$$links.push(noscript);
+    }
+  }
+  /**
+   * Prune the source CSS files
+   * @private
+   */
+
+
+  pruneSource(style, before, sheetInverse) {
+    // if external stylesheet would be below minimum size, just inline everything
+    const minSize = this.options.minimumExternalSize;
+    const name = style.$$name;
+
+    if (minSize && sheetInverse.length < minSize) {
+      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
+      style.textContent = before; // remove any associated external resources/loaders:
+
+      if (style.$$links) {
+        for (const link of style.$$links) {
+          const parent = link.parentNode;
+          if (parent) parent.removeChild(link);
+        }
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
+   * @private
+   */
+
+
+  async processStyle(style, document) {
+    if (style.$$reduce === false) return;
+    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
+    const options = this.options; // const document = style.ownerDocument;
+
+    const head = document.querySelector('head');
+    let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
+
+    if (keyframesMode === true) keyframesMode = 'all';
+    if (keyframesMode === false) keyframesMode = 'none';
+    let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
+
+    const before = sheet; // Skip empty stylesheets
+
+    if (!sheet) return;
+    const ast = parseStylesheet(sheet);
+    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
+
+    let criticalFonts = '';
+    const failedSelectors = [];
+    const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
+    // This first pass is also used to collect font and keyframe usage used in the second pass.
+
+    walkStyleRules(ast, markOnly(rule => {
+      if (rule.type === 'rule') {
+        // Filter the selector list down to only those match
+        rule.filterSelectors(sel => {
+          // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
+          // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
+          if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
+            return true;
+          }
+
+          sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
+          if (!sel) return false;
+
+          try {
+            return document.querySelector(sel) != null;
+          } catch (e) {
+            failedSelectors.push(sel + ' -> ' + e.message);
+            return false;
+          }
+        }); // If there are no matched selectors, remove the rule:
+
+        if (rule.selectors.length === 0) {
+          return false;
+        }
+
+        if (rule.declarations) {
+          for (let i = 0; i < rule.declarations.length; i++) {
+            const decl = rule.declarations[i]; // detect used fonts
+
+            if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
+              criticalFonts += ' ' + decl.value;
+            } // detect used keyframes
+
+
+            if (decl.property === 'animation' || decl.property === 'animation-name') {
+              // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
+              const names = decl.value.split(/\s+/);
+
+              for (let j = 0; j < names.length; j++) {
+                const name = names[j].trim();
+                if (name) criticalKeyframeNames.push(name);
+              }
+            }
+          }
+        }
+      } // keep font rules, they're handled in the second pass:
+
+
+      if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
+
+      const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
+      return !rules || rules.length !== 0;
+    }));
+
+    if (failedSelectors.length !== 0) {
+      this.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
+    }
+
+    const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
+    const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
+    const preloadedFonts = []; // Second pass, using data picked up from the first
+
+    walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
+      // remove any rules marked in the first pass
+      if (rule.$$remove === true) return false;
+      applyMarkedSelectors(rule); // prune @keyframes rules
+
+      if (rule.type === 'keyframes') {
+        if (keyframesMode === 'none') return false;
+        if (keyframesMode === 'all') return true;
+        return criticalKeyframeNames.indexOf(rule.name) !== -1;
+      } // prune @font-face rules
+
+
+      if (rule.type === 'font-face') {
+        let family, src;
+
+        for (let i = 0; i < rule.declarations.length; i++) {
+          const decl = rule.declarations[i];
+
+          if (decl.property === 'src') {
+            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
+            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
+          } else if (decl.property === 'font-family') {
+            family = decl.value;
+          }
+        }
+
+        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
+          preloadedFonts.push(src);
+          const preload = document.createElement('link');
+          preload.setAttribute('rel', 'preload');
+          preload.setAttribute('as', 'font');
+          preload.setAttribute('crossorigin', 'anonymous');
+          preload.setAttribute('href', src.trim());
+          head.appendChild(preload);
+        } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
+
+
+        if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
+          return false;
+        }
+      }
+    });
+    sheet = serializeStylesheet(ast, {
+      compress: this.options.compress !== false
+    }).trim(); // If all rules were removed, get rid of the style element entirely
+
+    if (sheet.trim().length === 0) {
+      if (style.parentNode) {
+        style.remove();
+      }
+
+      return;
+    }
+
+    let afterText = '';
+    let styleInlinedCompletely = false;
+
+    if (options.pruneSource) {
+      const sheetInverse = serializeStylesheet(astInverse, {
+        compress: this.options.compress !== false
+      });
+      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
+
+      if (styleInlinedCompletely) {
+        const percent = sheetInverse.length / before.length * 100;
+        afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes__default['default'](sheetInverse.length)}`;
+      }
+    } // replace the inline stylesheet with its critical'd counterpart
+
+
+    if (!styleInlinedCompletely) {
+      style.textContent = sheet;
+    } // output stats
+
+
+    const percent = sheet.length / before.length * 100 | 0;
+    this.logger.info('\u001b[32mInlined ' + prettyBytes__default['default'](sheet.length) + ' (' + percent + '% of original ' + prettyBytes__default['default'](before.length) + ') of ' + name + afterText + '.\u001b[39m');
+  }
+
+}
+
+module.exports = Critters;
Index: trip-planner-front/node_modules/critters/dist/critters.cjs.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.cjs.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/dist/critters.cjs.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,1003 @@
+var path = require('path');
+var prettyBytes = require('pretty-bytes');
+var parse5 = require('parse5');
+var select = require('css-select');
+var treeAdapter = require('parse5-htmlparser2-tree-adapter');
+var css = require('css');
+var chalk = require('chalk');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
+var prettyBytes__default = /*#__PURE__*/_interopDefaultLegacy(prettyBytes);
+var parse5__default = /*#__PURE__*/_interopDefaultLegacy(parse5);
+var select__default = /*#__PURE__*/_interopDefaultLegacy(select);
+var treeAdapter__default = /*#__PURE__*/_interopDefaultLegacy(treeAdapter);
+var css__default = /*#__PURE__*/_interopDefaultLegacy(css);
+var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+const PARSE5_OPTS = {
+  treeAdapter: treeAdapter__default['default']
+};
+/**
+ * Parse HTML into a mutable, serializable DOM Document.
+ * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
+ * @param {String} html   HTML to parse into a Document instance
+ */
+
+function createDocument(html) {
+  const document = parse5__default['default'].parse(html, PARSE5_OPTS);
+  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
+
+  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
+
+  document.$$Node = scratch.constructor;
+  const elementProto = Object.getPrototypeOf(scratch);
+  defineProperties(elementProto, ElementExtensions);
+  elementProto.ownerDocument = document;
+  return document;
+}
+/**
+ * Serialize a Document to an HTML String
+ * @param {Document} document   A Document, such as one created via `createDocument()`
+ */
+
+function serializeDocument(document) {
+  return parse5__default['default'].serialize(document, PARSE5_OPTS);
+}
+/**
+ * Methods and descriptors to mix into Element.prototype
+ */
+
+const ElementExtensions = {
+  /** @extends htmlparser2.Element.prototype */
+  nodeName: {
+    get() {
+      return this.tagName.toUpperCase();
+    }
+
+  },
+  id: reflectedProperty('id'),
+  className: reflectedProperty('class'),
+
+  insertBefore(child, referenceNode) {
+    if (!referenceNode) return this.appendChild(child);
+    treeAdapter__default['default'].insertBefore(this, child, referenceNode);
+    return child;
+  },
+
+  appendChild(child) {
+    treeAdapter__default['default'].appendChild(this, child);
+    return child;
+  },
+
+  removeChild(child) {
+    treeAdapter__default['default'].detachNode(child);
+  },
+
+  remove() {
+    treeAdapter__default['default'].detachNode(this);
+  },
+
+  textContent: {
+    get() {
+      return getText(this);
+    },
+
+    set(text) {
+      this.children = [];
+      treeAdapter__default['default'].insertText(this, text);
+    }
+
+  },
+
+  setAttribute(name, value) {
+    if (this.attribs == null) this.attribs = {};
+    if (value == null) value = '';
+    this.attribs[name] = value;
+  },
+
+  removeAttribute(name) {
+    if (this.attribs != null) {
+      delete this.attribs[name];
+    }
+  },
+
+  getAttribute(name) {
+    return this.attribs != null && this.attribs[name];
+  },
+
+  hasAttribute(name) {
+    return this.attribs != null && this.attribs[name] != null;
+  },
+
+  getAttributeNode(name) {
+    const value = this.getAttribute(name);
+    if (value != null) return {
+      specified: true,
+      value
+    };
+  }
+
+};
+/**
+ * Methods and descriptors to mix into the global document instance
+ * @private
+ */
+
+const DocumentExtensions = {
+  /** @extends htmlparser2.Document.prototype */
+  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
+  // TODO: verify if these are needed for css-select
+  nodeType: {
+    get() {
+      return 9;
+    }
+
+  },
+  contentType: {
+    get() {
+      return 'text/html';
+    }
+
+  },
+  nodeName: {
+    get() {
+      return '#document';
+    }
+
+  },
+  documentElement: {
+    get() {
+      // Find the first <html> element within the document
+      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
+    }
+
+  },
+  compatMode: {
+    get() {
+      const compatMode = {
+        'no-quirks': 'CSS1Compat',
+        quirks: 'BackCompat',
+        'limited-quirks': 'CSS1Compat'
+      };
+      return compatMode[treeAdapter__default['default'].getDocumentMode(this)];
+    }
+
+  },
+  body: {
+    get() {
+      return this.querySelector('body');
+    }
+
+  },
+
+  createElement(name) {
+    return treeAdapter__default['default'].createElement(name, null, []);
+  },
+
+  createTextNode(text) {
+    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
+    const Node = this.$$Node;
+    return new Node({
+      type: 'text',
+      data: text,
+      parent: null,
+      prev: null,
+      next: null
+    });
+  },
+
+  querySelector(sel) {
+    return select__default['default'].selectOne(sel, this.documentElement);
+  },
+
+  querySelectorAll(sel) {
+    if (sel === ':root') {
+      return this;
+    }
+
+    return select__default['default'](sel, this.documentElement);
+  }
+
+};
+/**
+ * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
+ * @private
+ */
+
+function defineProperties(obj, properties) {
+  for (const i in properties) {
+    const value = properties[i];
+    Object.defineProperty(obj, i, typeof value === 'function' ? {
+      value
+    } : value);
+  }
+}
+/**
+ * Create a property descriptor defining a getter/setter pair alias for a named attribute.
+ * @private
+ */
+
+
+function reflectedProperty(attributeName) {
+  return {
+    get() {
+      return this.getAttribute(attributeName);
+    },
+
+    set(value) {
+      this.setAttribute(attributeName, value);
+    }
+
+  };
+}
+/**
+ * Helper to get the text content of a node
+ * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
+ * @private
+ */
+
+
+function getText(node) {
+  if (Array.isArray(node)) return node.map(getText).join('');
+  if (treeAdapter__default['default'].isElementNode(node)) return node.name === 'br' ? '\n' : getText(node.children);
+  if (treeAdapter__default['default'].isTextNode(node)) return node.data;
+  return '';
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * Parse a textual CSS Stylesheet into a Stylesheet instance.
+ * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
+ * @see https://github.com/reworkcss/css
+ * @private
+ * @param {String} stylesheet
+ * @returns {css.Stylesheet} ast
+ */
+
+function parseStylesheet(stylesheet) {
+  return css__default['default'].parse(stylesheet);
+}
+/**
+ * Serialize a ReworkCSS Stylesheet to a String of CSS.
+ * @private
+ * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
+ * @param {Object} options              Options to pass to `css.stringify()`
+ * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
+ */
+
+function serializeStylesheet(ast, options) {
+  return css__default['default'].stringify(ast, options);
+}
+/**
+ * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
+ * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
+ * @private
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ * @returns {(rule) => void} nonDestructiveIterator
+ */
+
+function markOnly(predicate) {
+  return rule => {
+    const sel = rule.selectors;
+
+    if (predicate(rule) === false) {
+      rule.$$remove = true;
+    }
+
+    rule.$$markedSelectors = rule.selectors;
+
+    if (rule._other) {
+      rule._other.$$markedSelectors = rule._other.selectors;
+    }
+
+    rule.selectors = sel;
+  };
+}
+/**
+ * Apply filtered selectors to a rule from a previous markOnly run.
+ * @private
+ * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
+*/
+
+function applyMarkedSelectors(rule) {
+  if (rule.$$markedSelectors) {
+    rule.selectors = rule.$$markedSelectors;
+  }
+
+  if (rule._other) {
+    applyMarkedSelectors(rule._other);
+  }
+}
+/**
+ * Recursively walk all rules in a stylesheet.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ */
+
+function walkStyleRules(node, iterator) {
+  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
+  node.rules = node.rules.filter(rule => {
+    if (rule.rules) {
+      walkStyleRules(rule, iterator);
+    }
+
+    rule._other = undefined;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+}
+/**
+ * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {css.Rule} node2      A second tree identical to `node`
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
+ */
+
+function walkStyleRulesWithReverseMirror(node, node2, iterator) {
+  if (node2 === null) return walkStyleRules(node, iterator);
+  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
+  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
+    const rule2 = rules2[index];
+
+    if (rule.rules) {
+      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
+    }
+
+    rule._other = rule2;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
+// This is just a quicker version of generating the compliment of the set returned from a filter operation.
+
+function splitFilter(a, b, predicate) {
+  const aOut = [];
+  const bOut = [];
+
+  for (let index = 0; index < a.length; index++) {
+    if (predicate(a[index], index, a, b)) {
+      aOut.push(a[index]);
+    } else {
+      bOut.push(a[index]);
+    }
+  }
+
+  return [aOut, bOut];
+} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
+
+
+function filterSelectors(predicate) {
+  if (this._other) {
+    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
+    this.selectors = a;
+    this._other.selectors = b;
+  } else {
+    this.selectors = this.selectors.filter(predicate);
+  }
+}
+
+const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
+const defaultLogger = {
+  trace(msg) {
+    console.trace(msg);
+  },
+
+  debug(msg) {
+    console.debug(msg);
+  },
+
+  warn(msg) {
+    console.warn(chalk__default['default'].yellow(msg));
+  },
+
+  error(msg) {
+    console.error(chalk__default['default'].bold.red(msg));
+  },
+
+  info(msg) {
+    console.info(chalk__default['default'].bold.blue(msg));
+  },
+
+  silent() {}
+
+};
+function createLogger(logLevel) {
+  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
+  return LOG_LEVELS.reduce((logger, type, index) => {
+    if (index >= logLevelIdx) {
+      logger[type] = defaultLogger[type];
+    } else {
+      logger[type] = defaultLogger.silent;
+    }
+
+    return logger;
+  }, {});
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * The mechanism to use for lazy-loading stylesheets.
+ * _[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
+ *
+ * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
+ * - **"body":** Move all external stylesheet links to the end of the document.
+ * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
+ * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
+ * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
+ * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
+ * @typedef {(default|'body'|'media'|'swap'|'js'|'js-lazy')} PreloadStrategy
+ * @public
+ */
+
+/**
+ * Controls which keyframes rules are inlined.
+ *
+ * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
+ * - **"all":** Inline all keyframes rules.
+ * - **"none":** Remove all keyframes rules.
+ * @typedef {('critical'|'all'|'none')} KeyframeStrategy
+ * @private
+ * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
+ */
+
+/**
+ * Controls log level of the plugin. Specifies the level the logger should use. A logger will
+ * not produce output for any log level beneath the specified level. Available levels and order
+ * are:
+ *
+ * - **"info"** _(default)_
+ * - **"warn"**
+ * - **"error"**
+ * - **"trace"**
+ * - **"debug"**
+ * - **"silent"**
+ * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
+ * @public
+ */
+
+/**
+ * Custom logger interface:
+ * @typedef {object} Logger
+ * @public
+ * @property {function(String)} trace - Prints a trace message
+ * @property {function(String)} debug - Prints a debug message
+ * @property {function(String)} info - Prints an information message
+ * @property {function(String)} warn - Prints a warning message
+ * @property {function(String)} error - Prints an error message
+ */
+
+/**
+ * All optional. Pass them to `new Critters({ ... })`.
+ * @public
+ * @typedef Options
+ * @property {String} path     Base path location of the CSS files _(default: `''`)_
+ * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
+ * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
+ * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
+ * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
+ * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
+ * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
+ * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
+ * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
+ * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
+ * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
+ * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
+ * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
+ *  - Values:
+ *  - `true` to inline critical font-face rules and preload the fonts
+ *  - `false` to don't inline any font-face rules and don't preload fonts
+ * @property {String} keyframes     Controls which keyframes rules are inlined.
+ *  - Values:
+ *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
+ *  - `"all"` inline all keyframes rules
+ *  - `"none"` remove all keyframes rules
+ * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
+ * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
+ * @property {object} logger        Provide a custom logger interface {@link Logger logger}
+ */
+
+class Critters {
+  /** @private */
+  constructor(options) {
+    this.options = Object.assign({
+      logLevel: 'info',
+      path: '',
+      publicPath: '',
+      reduceInlineStyles: true,
+      pruneSource: false,
+      additionalStylesheets: []
+    }, options || {});
+    this.urlFilter = this.options.filter;
+
+    if (this.urlFilter instanceof RegExp) {
+      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
+    }
+
+    this.logger = this.options.logger || createLogger(this.options.logLevel);
+  }
+  /**
+   * Read the contents of a file from the specified filesystem or disk
+   */
+
+
+  readFile(filename) {
+    const fs = this.fs;
+    return new Promise((resolve, reject) => {
+      const callback = (err, data) => {
+        if (err) reject(err);else resolve(data);
+      };
+
+      if (fs && fs.readFile) {
+        fs.readFile(filename, callback);
+      } else {
+        require('fs').readFile(filename, 'utf8', callback);
+      }
+    });
+  }
+  /**
+   * Apply critical CSS processing to the html
+   */
+
+
+  async process(html) {
+    const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
+
+    const document = createDocument(html);
+
+    if (this.options.additionalStylesheets.length > 0) {
+      this.embedAdditionalStylesheet(document);
+    } // `external:false` skips processing of external sheets
+
+
+    if (this.options.external !== false) {
+      const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
+      await Promise.all(externalSheets.map(link => this.embedLinkedStylesheet(link, document)));
+    } // go through all the style tags in the document and reduce them to only critical CSS
+
+
+    const styles = this.getAffectedStyleTags(document);
+    await Promise.all(styles.map(style => this.processStyle(style, document)));
+
+    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
+      await this.mergeStylesheets(document);
+    } // serialize the document back to HTML and we're done
+
+
+    const output = serializeDocument(document);
+    const end = process.hrtime.bigint();
+    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
+    return output;
+  }
+  /**
+   * Get the style tags that need processing
+   */
+
+
+  getAffectedStyleTags(document) {
+    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
+
+    if (this.options.reduceInlineStyles === false) {
+      return styles.filter(style => style.$$external);
+    }
+
+    return styles;
+  }
+
+  async mergeStylesheets(document) {
+    const styles = this.getAffectedStyleTags(document);
+
+    if (styles.length === 0) {
+      this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
+      return;
+    }
+
+    const first = styles[0];
+    let sheet = first.textContent;
+
+    for (let i = 1; i < styles.length; i++) {
+      const node = styles[i];
+      sheet += node.textContent;
+      node.remove();
+    }
+
+    first.textContent = sheet;
+  }
+  /**
+   * Given href, find the corresponding CSS asset
+   */
+
+
+  async getCssAsset(href) {
+    const outputPath = this.options.path;
+    const publicPath = this.options.publicPath; // CHECK - the output path
+    // path on disk (with output.publicPath removed)
+
+    let normalizedPath = href.replace(/^\//, '');
+    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
+
+    if (normalizedPath.indexOf(pathPrefix) === 0) {
+      normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
+    }
+
+    const filename = path__default['default'].resolve(outputPath, normalizedPath);
+    let sheet;
+
+    try {
+      sheet = await this.readFile(filename);
+    } catch (e) {
+      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
+    }
+
+    return sheet;
+  }
+
+  checkInlineThreshold(link, style, sheet) {
+    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
+      const href = style.$$name;
+      style.$$reduce = false;
+      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
+      link.remove();
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
+   */
+
+
+  async embedAdditionalStylesheet(document) {
+    const styleSheetsIncluded = [];
+    const sources = await Promise.all(this.options.additionalStylesheets.map(cssFile => {
+      if (styleSheetsIncluded.includes(cssFile)) {
+        return;
+      }
+
+      styleSheetsIncluded.push(cssFile);
+      const style = document.createElement('style');
+      style.$$external = true;
+      return this.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
+    }));
+    sources.forEach(([sheet, style]) => {
+      if (!sheet) return;
+      style.textContent = sheet;
+      document.head.appendChild(style);
+    });
+  }
+  /**
+   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
+   */
+
+
+  async embedLinkedStylesheet(link, document) {
+    const href = link.getAttribute('href');
+    const media = link.getAttribute('media');
+    const preloadMode = this.options.preload; // skip filtered resources, or network resources if no filter is provided
+
+    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
+      return Promise.resolve();
+    } // the reduced critical CSS gets injected into a new <style> tag
+
+
+    const style = document.createElement('style');
+    style.$$external = true;
+    const sheet = await this.getCssAsset(href, style);
+
+    if (!sheet) {
+      return;
+    }
+
+    style.textContent = sheet;
+    style.$$name = href;
+    style.$$links = [link];
+    link.parentNode.insertBefore(style, link);
+
+    if (this.checkInlineThreshold(link, style, sheet)) {
+      return;
+    } // CSS loader is only injected for the first sheet, then this becomes an empty string
+
+
+    let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
+    const lazy = preloadMode === 'js-lazy';
+
+    if (lazy) {
+      cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
+    } // Allow disabling any mutation of the stylesheet link:
+
+
+    if (preloadMode === false) return;
+    let noscriptFallback = false;
+
+    if (preloadMode === 'body') {
+      document.body.appendChild(link);
+    } else {
+      link.setAttribute('rel', 'preload');
+      link.setAttribute('as', 'style');
+
+      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
+        const script = document.createElement('script');
+        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
+
+        script.textContent = js;
+        link.parentNode.insertBefore(script, link.nextSibling);
+        style.$$links.push(script);
+        cssLoaderPreamble = '';
+        noscriptFallback = true;
+      } else if (preloadMode === 'media') {
+        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
+        link.setAttribute('rel', 'stylesheet');
+        link.removeAttribute('as');
+        link.setAttribute('media', 'print');
+        link.setAttribute('onload', `this.media='${media || 'all'}'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap') {
+        link.setAttribute('onload', "this.rel='stylesheet'");
+        noscriptFallback = true;
+      } else {
+        const bodyLink = document.createElement('link');
+        bodyLink.setAttribute('rel', 'stylesheet');
+        if (media) bodyLink.setAttribute('media', media);
+        bodyLink.setAttribute('href', href);
+        document.body.appendChild(bodyLink);
+        style.$$links.push(bodyLink);
+      }
+    }
+
+    if (this.options.noscriptFallback !== false && noscriptFallback) {
+      const noscript = document.createElement('noscript');
+      const noscriptLink = document.createElement('link');
+      noscriptLink.setAttribute('rel', 'stylesheet');
+      noscriptLink.setAttribute('href', href);
+      if (media) noscriptLink.setAttribute('media', media);
+      noscript.appendChild(noscriptLink);
+      link.parentNode.insertBefore(noscript, link.nextSibling);
+      style.$$links.push(noscript);
+    }
+  }
+  /**
+   * Prune the source CSS files
+   */
+
+
+  pruneSource(style, before, sheetInverse) {
+    // if external stylesheet would be below minimum size, just inline everything
+    const minSize = this.options.minimumExternalSize;
+    const name = style.$$name;
+
+    if (minSize && sheetInverse.length < minSize) {
+      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
+      style.textContent = before; // remove any associated external resources/loaders:
+
+      if (style.$$links) {
+        for (const link of style.$$links) {
+          const parent = link.parentNode;
+          if (parent) parent.removeChild(link);
+        }
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
+   */
+
+
+  async processStyle(style, document) {
+    if (style.$$reduce === false) return;
+    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
+    const options = this.options; // const document = style.ownerDocument;
+
+    const head = document.querySelector('head');
+    let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
+
+    if (keyframesMode === true) keyframesMode = 'all';
+    if (keyframesMode === false) keyframesMode = 'none';
+    let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
+
+    const before = sheet; // Skip empty stylesheets
+
+    if (!sheet) return;
+    const ast = parseStylesheet(sheet);
+    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
+
+    let criticalFonts = '';
+    const failedSelectors = [];
+    const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
+    // This first pass is also used to collect font and keyframe usage used in the second pass.
+
+    walkStyleRules(ast, markOnly(rule => {
+      if (rule.type === 'rule') {
+        // Filter the selector list down to only those match
+        rule.filterSelectors(sel => {
+          // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
+          // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
+          if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
+            return true;
+          }
+
+          sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
+          if (!sel) return false;
+
+          try {
+            return document.querySelector(sel) != null;
+          } catch (e) {
+            failedSelectors.push(sel + ' -> ' + e.message);
+            return false;
+          }
+        }); // If there are no matched selectors, remove the rule:
+
+        if (rule.selectors.length === 0) {
+          return false;
+        }
+
+        if (rule.declarations) {
+          for (let i = 0; i < rule.declarations.length; i++) {
+            const decl = rule.declarations[i]; // detect used fonts
+
+            if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
+              criticalFonts += ' ' + decl.value;
+            } // detect used keyframes
+
+
+            if (decl.property === 'animation' || decl.property === 'animation-name') {
+              // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
+              const names = decl.value.split(/\s+/);
+
+              for (let j = 0; j < names.length; j++) {
+                const name = names[j].trim();
+                if (name) criticalKeyframeNames.push(name);
+              }
+            }
+          }
+        }
+      } // keep font rules, they're handled in the second pass:
+
+
+      if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
+
+      const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
+      return !rules || rules.length !== 0;
+    }));
+
+    if (failedSelectors.length !== 0) {
+      this.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
+    }
+
+    const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
+    const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
+    const preloadedFonts = []; // Second pass, using data picked up from the first
+
+    walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
+      // remove any rules marked in the first pass
+      if (rule.$$remove === true) return false;
+      applyMarkedSelectors(rule); // prune @keyframes rules
+
+      if (rule.type === 'keyframes') {
+        if (keyframesMode === 'none') return false;
+        if (keyframesMode === 'all') return true;
+        return criticalKeyframeNames.indexOf(rule.name) !== -1;
+      } // prune @font-face rules
+
+
+      if (rule.type === 'font-face') {
+        let family, src;
+
+        for (let i = 0; i < rule.declarations.length; i++) {
+          const decl = rule.declarations[i];
+
+          if (decl.property === 'src') {
+            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
+            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
+          } else if (decl.property === 'font-family') {
+            family = decl.value;
+          }
+        }
+
+        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
+          preloadedFonts.push(src);
+          const preload = document.createElement('link');
+          preload.setAttribute('rel', 'preload');
+          preload.setAttribute('as', 'font');
+          preload.setAttribute('crossorigin', 'anonymous');
+          preload.setAttribute('href', src.trim());
+          head.appendChild(preload);
+        } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
+
+
+        if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
+          return false;
+        }
+      }
+    });
+    sheet = serializeStylesheet(ast, {
+      compress: this.options.compress !== false
+    }).trim(); // If all rules were removed, get rid of the style element entirely
+
+    if (sheet.trim().length === 0) {
+      if (style.parentNode) {
+        style.remove();
+      }
+
+      return;
+    }
+
+    let afterText = '';
+    let styleInlinedCompletely = false;
+
+    if (options.pruneSource) {
+      const sheetInverse = serializeStylesheet(astInverse, {
+        compress: this.options.compress !== false
+      });
+      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
+
+      if (styleInlinedCompletely) {
+        const percent = sheetInverse.length / before.length * 100;
+        afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes__default['default'](sheetInverse.length)}`;
+      }
+    } // replace the inline stylesheet with its critical'd counterpart
+
+
+    if (!styleInlinedCompletely) {
+      style.textContent = sheet;
+    } // output stats
+
+
+    const percent = sheet.length / before.length * 100 | 0;
+    this.logger.info('\u001b[32mInlined ' + prettyBytes__default['default'](sheet.length) + ' (' + percent + '% of original ' + prettyBytes__default['default'](before.length) + ') of ' + name + afterText + '.\u001b[39m');
+  }
+
+}
+
+module.exports = Critters;
Index: trip-planner-front/node_modules/critters/dist/critters.esm.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.esm.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,10288 +1,0 @@
-import path from 'path';
-import prettyBytes from 'pretty-bytes';
-import parse5 from 'parse5';
-import css from 'css';
-import chalk from 'chalk';
-
-var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, basedir, module) {
-	return module = {
-	  path: basedir,
-	  exports: {},
-	  require: function (path, base) {
-      return commonjsRequire();
-    }
-	}, fn(module, module.exports), module.exports;
-}
-
-function getCjsExportFromNamespace (n) {
-	return n && n['default'] || n;
-}
-
-function commonjsRequire () {
-	throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
-}
-
-//Types of elements found in the DOM
-var domelementtype = {
-	Text: "text", //Text
-	Directive: "directive", //<? ... ?>
-	Comment: "comment", //<!-- ... -->
-	Script: "script", //<script> tags
-	Style: "style", //<style> tags
-	Tag: "tag", //Any tag
-	CDATA: "cdata", //<![CDATA[ ... ]]>
-	Doctype: "doctype",
-
-	isTag: function(elem){
-		return elem.type === "tag" || elem.type === "script" || elem.type === "style";
-	}
-};
-
-var lib = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Tests whether an element is a tag or not.
- *
- * @param elem Element to test
- */
-function isTag(elem) {
-    return (elem.type === "tag" /* Tag */ ||
-        elem.type === "script" /* Script */ ||
-        elem.type === "style" /* Style */);
-}
-exports.isTag = isTag;
-// Exports for backwards compatibility
-exports.Text = "text" /* Text */; //Text
-exports.Directive = "directive" /* Directive */; //<? ... ?>
-exports.Comment = "comment" /* Comment */; //<!-- ... -->
-exports.Script = "script" /* Script */; //<script> tags
-exports.Style = "style" /* Style */; //<style> tags
-exports.Tag = "tag" /* Tag */; //Any tag
-exports.CDATA = "cdata" /* CDATA */; //<![CDATA[ ... ]]>
-exports.Doctype = "doctype" /* Doctype */;
-});
-
-var Aacute = "Á";
-var aacute = "á";
-var Abreve = "Ă";
-var abreve = "ă";
-var ac = "∾";
-var acd = "∿";
-var acE = "∾̳";
-var Acirc = "Â";
-var acirc = "â";
-var acute = "´";
-var Acy = "А";
-var acy = "а";
-var AElig = "Æ";
-var aelig = "æ";
-var af = "⁡";
-var Afr = "𝔄";
-var afr = "𝔞";
-var Agrave = "À";
-var agrave = "à";
-var alefsym = "ℵ";
-var aleph = "ℵ";
-var Alpha = "Α";
-var alpha = "α";
-var Amacr = "Ā";
-var amacr = "ā";
-var amalg = "⨿";
-var amp = "&";
-var AMP = "&";
-var andand = "⩕";
-var And = "⩓";
-var and = "∧";
-var andd = "⩜";
-var andslope = "⩘";
-var andv = "⩚";
-var ang = "∠";
-var ange = "⦤";
-var angle = "∠";
-var angmsdaa = "⦨";
-var angmsdab = "⦩";
-var angmsdac = "⦪";
-var angmsdad = "⦫";
-var angmsdae = "⦬";
-var angmsdaf = "⦭";
-var angmsdag = "⦮";
-var angmsdah = "⦯";
-var angmsd = "∡";
-var angrt = "∟";
-var angrtvb = "⊾";
-var angrtvbd = "⦝";
-var angsph = "∢";
-var angst = "Å";
-var angzarr = "⍼";
-var Aogon = "Ą";
-var aogon = "ą";
-var Aopf = "𝔸";
-var aopf = "𝕒";
-var apacir = "⩯";
-var ap = "≈";
-var apE = "⩰";
-var ape = "≊";
-var apid = "≋";
-var apos = "'";
-var ApplyFunction = "⁡";
-var approx = "≈";
-var approxeq = "≊";
-var Aring = "Å";
-var aring = "å";
-var Ascr = "𝒜";
-var ascr = "𝒶";
-var Assign = "≔";
-var ast = "*";
-var asymp = "≈";
-var asympeq = "≍";
-var Atilde = "Ã";
-var atilde = "ã";
-var Auml = "Ä";
-var auml = "ä";
-var awconint = "∳";
-var awint = "⨑";
-var backcong = "≌";
-var backepsilon = "϶";
-var backprime = "‵";
-var backsim = "∽";
-var backsimeq = "⋍";
-var Backslash = "∖";
-var Barv = "⫧";
-var barvee = "⊽";
-var barwed = "⌅";
-var Barwed = "⌆";
-var barwedge = "⌅";
-var bbrk = "⎵";
-var bbrktbrk = "⎶";
-var bcong = "≌";
-var Bcy = "Б";
-var bcy = "б";
-var bdquo = "„";
-var becaus = "∵";
-var because = "∵";
-var Because = "∵";
-var bemptyv = "⦰";
-var bepsi = "϶";
-var bernou = "ℬ";
-var Bernoullis = "ℬ";
-var Beta = "Β";
-var beta = "β";
-var beth = "ℶ";
-var between = "≬";
-var Bfr = "𝔅";
-var bfr = "𝔟";
-var bigcap = "⋂";
-var bigcirc = "◯";
-var bigcup = "⋃";
-var bigodot = "⨀";
-var bigoplus = "⨁";
-var bigotimes = "⨂";
-var bigsqcup = "⨆";
-var bigstar = "★";
-var bigtriangledown = "▽";
-var bigtriangleup = "△";
-var biguplus = "⨄";
-var bigvee = "⋁";
-var bigwedge = "⋀";
-var bkarow = "⤍";
-var blacklozenge = "⧫";
-var blacksquare = "▪";
-var blacktriangle = "▴";
-var blacktriangledown = "▾";
-var blacktriangleleft = "◂";
-var blacktriangleright = "▸";
-var blank = "␣";
-var blk12 = "▒";
-var blk14 = "░";
-var blk34 = "▓";
-var block = "█";
-var bne = "=⃥";
-var bnequiv = "≡⃥";
-var bNot = "⫭";
-var bnot = "⌐";
-var Bopf = "𝔹";
-var bopf = "𝕓";
-var bot = "⊥";
-var bottom = "⊥";
-var bowtie = "⋈";
-var boxbox = "⧉";
-var boxdl = "┐";
-var boxdL = "╕";
-var boxDl = "╖";
-var boxDL = "╗";
-var boxdr = "┌";
-var boxdR = "╒";
-var boxDr = "╓";
-var boxDR = "╔";
-var boxh = "─";
-var boxH = "═";
-var boxhd = "┬";
-var boxHd = "╤";
-var boxhD = "╥";
-var boxHD = "╦";
-var boxhu = "┴";
-var boxHu = "╧";
-var boxhU = "╨";
-var boxHU = "╩";
-var boxminus = "⊟";
-var boxplus = "⊞";
-var boxtimes = "⊠";
-var boxul = "┘";
-var boxuL = "╛";
-var boxUl = "╜";
-var boxUL = "╝";
-var boxur = "└";
-var boxuR = "╘";
-var boxUr = "╙";
-var boxUR = "╚";
-var boxv = "│";
-var boxV = "║";
-var boxvh = "┼";
-var boxvH = "╪";
-var boxVh = "╫";
-var boxVH = "╬";
-var boxvl = "┤";
-var boxvL = "╡";
-var boxVl = "╢";
-var boxVL = "╣";
-var boxvr = "├";
-var boxvR = "╞";
-var boxVr = "╟";
-var boxVR = "╠";
-var bprime = "‵";
-var breve = "˘";
-var Breve = "˘";
-var brvbar = "¦";
-var bscr = "𝒷";
-var Bscr = "ℬ";
-var bsemi = "⁏";
-var bsim = "∽";
-var bsime = "⋍";
-var bsolb = "⧅";
-var bsol = "\\";
-var bsolhsub = "⟈";
-var bull = "•";
-var bullet = "•";
-var bump = "≎";
-var bumpE = "⪮";
-var bumpe = "≏";
-var Bumpeq = "≎";
-var bumpeq = "≏";
-var Cacute = "Ć";
-var cacute = "ć";
-var capand = "⩄";
-var capbrcup = "⩉";
-var capcap = "⩋";
-var cap = "∩";
-var Cap = "⋒";
-var capcup = "⩇";
-var capdot = "⩀";
-var CapitalDifferentialD = "ⅅ";
-var caps = "∩︀";
-var caret = "⁁";
-var caron = "ˇ";
-var Cayleys = "ℭ";
-var ccaps = "⩍";
-var Ccaron = "Č";
-var ccaron = "č";
-var Ccedil = "Ç";
-var ccedil = "ç";
-var Ccirc = "Ĉ";
-var ccirc = "ĉ";
-var Cconint = "∰";
-var ccups = "⩌";
-var ccupssm = "⩐";
-var Cdot = "Ċ";
-var cdot = "ċ";
-var cedil = "¸";
-var Cedilla = "¸";
-var cemptyv = "⦲";
-var cent = "¢";
-var centerdot = "·";
-var CenterDot = "·";
-var cfr = "𝔠";
-var Cfr = "ℭ";
-var CHcy = "Ч";
-var chcy = "ч";
-var check = "✓";
-var checkmark = "✓";
-var Chi = "Χ";
-var chi = "χ";
-var circ = "ˆ";
-var circeq = "≗";
-var circlearrowleft = "↺";
-var circlearrowright = "↻";
-var circledast = "⊛";
-var circledcirc = "⊚";
-var circleddash = "⊝";
-var CircleDot = "⊙";
-var circledR = "®";
-var circledS = "Ⓢ";
-var CircleMinus = "⊖";
-var CirclePlus = "⊕";
-var CircleTimes = "⊗";
-var cir = "○";
-var cirE = "⧃";
-var cire = "≗";
-var cirfnint = "⨐";
-var cirmid = "⫯";
-var cirscir = "⧂";
-var ClockwiseContourIntegral = "∲";
-var CloseCurlyDoubleQuote = "”";
-var CloseCurlyQuote = "’";
-var clubs = "♣";
-var clubsuit = "♣";
-var colon = ":";
-var Colon = "∷";
-var Colone = "⩴";
-var colone = "≔";
-var coloneq = "≔";
-var comma = ",";
-var commat = "@";
-var comp = "∁";
-var compfn = "∘";
-var complement = "∁";
-var complexes = "ℂ";
-var cong = "≅";
-var congdot = "⩭";
-var Congruent = "≡";
-var conint = "∮";
-var Conint = "∯";
-var ContourIntegral = "∮";
-var copf = "𝕔";
-var Copf = "ℂ";
-var coprod = "∐";
-var Coproduct = "∐";
-var copy = "©";
-var COPY = "©";
-var copysr = "℗";
-var CounterClockwiseContourIntegral = "∳";
-var crarr = "↵";
-var cross = "✗";
-var Cross = "⨯";
-var Cscr = "𝒞";
-var cscr = "𝒸";
-var csub = "⫏";
-var csube = "⫑";
-var csup = "⫐";
-var csupe = "⫒";
-var ctdot = "⋯";
-var cudarrl = "⤸";
-var cudarrr = "⤵";
-var cuepr = "⋞";
-var cuesc = "⋟";
-var cularr = "↶";
-var cularrp = "⤽";
-var cupbrcap = "⩈";
-var cupcap = "⩆";
-var CupCap = "≍";
-var cup = "∪";
-var Cup = "⋓";
-var cupcup = "⩊";
-var cupdot = "⊍";
-var cupor = "⩅";
-var cups = "∪︀";
-var curarr = "↷";
-var curarrm = "⤼";
-var curlyeqprec = "⋞";
-var curlyeqsucc = "⋟";
-var curlyvee = "⋎";
-var curlywedge = "⋏";
-var curren = "¤";
-var curvearrowleft = "↶";
-var curvearrowright = "↷";
-var cuvee = "⋎";
-var cuwed = "⋏";
-var cwconint = "∲";
-var cwint = "∱";
-var cylcty = "⌭";
-var dagger = "†";
-var Dagger = "‡";
-var daleth = "ℸ";
-var darr = "↓";
-var Darr = "↡";
-var dArr = "⇓";
-var dash = "‐";
-var Dashv = "⫤";
-var dashv = "⊣";
-var dbkarow = "⤏";
-var dblac = "˝";
-var Dcaron = "Ď";
-var dcaron = "ď";
-var Dcy = "Д";
-var dcy = "д";
-var ddagger = "‡";
-var ddarr = "⇊";
-var DD = "ⅅ";
-var dd = "ⅆ";
-var DDotrahd = "⤑";
-var ddotseq = "⩷";
-var deg = "°";
-var Del = "∇";
-var Delta = "Δ";
-var delta = "δ";
-var demptyv = "⦱";
-var dfisht = "⥿";
-var Dfr = "𝔇";
-var dfr = "𝔡";
-var dHar = "⥥";
-var dharl = "⇃";
-var dharr = "⇂";
-var DiacriticalAcute = "´";
-var DiacriticalDot = "˙";
-var DiacriticalDoubleAcute = "˝";
-var DiacriticalGrave = "`";
-var DiacriticalTilde = "˜";
-var diam = "⋄";
-var diamond = "⋄";
-var Diamond = "⋄";
-var diamondsuit = "♦";
-var diams = "♦";
-var die = "¨";
-var DifferentialD = "ⅆ";
-var digamma = "ϝ";
-var disin = "⋲";
-var div = "÷";
-var divide = "÷";
-var divideontimes = "⋇";
-var divonx = "⋇";
-var DJcy = "Ђ";
-var djcy = "ђ";
-var dlcorn = "⌞";
-var dlcrop = "⌍";
-var dollar = "$";
-var Dopf = "𝔻";
-var dopf = "𝕕";
-var Dot = "¨";
-var dot = "˙";
-var DotDot = "⃜";
-var doteq = "≐";
-var doteqdot = "≑";
-var DotEqual = "≐";
-var dotminus = "∸";
-var dotplus = "∔";
-var dotsquare = "⊡";
-var doublebarwedge = "⌆";
-var DoubleContourIntegral = "∯";
-var DoubleDot = "¨";
-var DoubleDownArrow = "⇓";
-var DoubleLeftArrow = "⇐";
-var DoubleLeftRightArrow = "⇔";
-var DoubleLeftTee = "⫤";
-var DoubleLongLeftArrow = "⟸";
-var DoubleLongLeftRightArrow = "⟺";
-var DoubleLongRightArrow = "⟹";
-var DoubleRightArrow = "⇒";
-var DoubleRightTee = "⊨";
-var DoubleUpArrow = "⇑";
-var DoubleUpDownArrow = "⇕";
-var DoubleVerticalBar = "∥";
-var DownArrowBar = "⤓";
-var downarrow = "↓";
-var DownArrow = "↓";
-var Downarrow = "⇓";
-var DownArrowUpArrow = "⇵";
-var DownBreve = "̑";
-var downdownarrows = "⇊";
-var downharpoonleft = "⇃";
-var downharpoonright = "⇂";
-var DownLeftRightVector = "⥐";
-var DownLeftTeeVector = "⥞";
-var DownLeftVectorBar = "⥖";
-var DownLeftVector = "↽";
-var DownRightTeeVector = "⥟";
-var DownRightVectorBar = "⥗";
-var DownRightVector = "⇁";
-var DownTeeArrow = "↧";
-var DownTee = "⊤";
-var drbkarow = "⤐";
-var drcorn = "⌟";
-var drcrop = "⌌";
-var Dscr = "𝒟";
-var dscr = "𝒹";
-var DScy = "Ѕ";
-var dscy = "ѕ";
-var dsol = "⧶";
-var Dstrok = "Đ";
-var dstrok = "đ";
-var dtdot = "⋱";
-var dtri = "▿";
-var dtrif = "▾";
-var duarr = "⇵";
-var duhar = "⥯";
-var dwangle = "⦦";
-var DZcy = "Џ";
-var dzcy = "џ";
-var dzigrarr = "⟿";
-var Eacute = "É";
-var eacute = "é";
-var easter = "⩮";
-var Ecaron = "Ě";
-var ecaron = "ě";
-var Ecirc = "Ê";
-var ecirc = "ê";
-var ecir = "≖";
-var ecolon = "≕";
-var Ecy = "Э";
-var ecy = "э";
-var eDDot = "⩷";
-var Edot = "Ė";
-var edot = "ė";
-var eDot = "≑";
-var ee = "ⅇ";
-var efDot = "≒";
-var Efr = "𝔈";
-var efr = "𝔢";
-var eg = "⪚";
-var Egrave = "È";
-var egrave = "è";
-var egs = "⪖";
-var egsdot = "⪘";
-var el = "⪙";
-var Element = "∈";
-var elinters = "⏧";
-var ell = "ℓ";
-var els = "⪕";
-var elsdot = "⪗";
-var Emacr = "Ē";
-var emacr = "ē";
-var empty = "∅";
-var emptyset = "∅";
-var EmptySmallSquare = "◻";
-var emptyv = "∅";
-var EmptyVerySmallSquare = "▫";
-var emsp13 = " ";
-var emsp14 = " ";
-var emsp = " ";
-var ENG = "Ŋ";
-var eng = "ŋ";
-var ensp = " ";
-var Eogon = "Ę";
-var eogon = "ę";
-var Eopf = "𝔼";
-var eopf = "𝕖";
-var epar = "⋕";
-var eparsl = "⧣";
-var eplus = "⩱";
-var epsi = "ε";
-var Epsilon = "Ε";
-var epsilon = "ε";
-var epsiv = "ϵ";
-var eqcirc = "≖";
-var eqcolon = "≕";
-var eqsim = "≂";
-var eqslantgtr = "⪖";
-var eqslantless = "⪕";
-var Equal = "⩵";
-var equals = "=";
-var EqualTilde = "≂";
-var equest = "≟";
-var Equilibrium = "⇌";
-var equiv = "≡";
-var equivDD = "⩸";
-var eqvparsl = "⧥";
-var erarr = "⥱";
-var erDot = "≓";
-var escr = "ℯ";
-var Escr = "ℰ";
-var esdot = "≐";
-var Esim = "⩳";
-var esim = "≂";
-var Eta = "Η";
-var eta = "η";
-var ETH = "Ð";
-var eth = "ð";
-var Euml = "Ë";
-var euml = "ë";
-var euro = "€";
-var excl = "!";
-var exist = "∃";
-var Exists = "∃";
-var expectation = "ℰ";
-var exponentiale = "ⅇ";
-var ExponentialE = "ⅇ";
-var fallingdotseq = "≒";
-var Fcy = "Ф";
-var fcy = "ф";
-var female = "♀";
-var ffilig = "ﬃ";
-var fflig = "ﬀ";
-var ffllig = "ﬄ";
-var Ffr = "𝔉";
-var ffr = "𝔣";
-var filig = "ﬁ";
-var FilledSmallSquare = "◼";
-var FilledVerySmallSquare = "▪";
-var fjlig = "fj";
-var flat = "♭";
-var fllig = "ﬂ";
-var fltns = "▱";
-var fnof = "ƒ";
-var Fopf = "𝔽";
-var fopf = "𝕗";
-var forall = "∀";
-var ForAll = "∀";
-var fork = "⋔";
-var forkv = "⫙";
-var Fouriertrf = "ℱ";
-var fpartint = "⨍";
-var frac12 = "½";
-var frac13 = "⅓";
-var frac14 = "¼";
-var frac15 = "⅕";
-var frac16 = "⅙";
-var frac18 = "⅛";
-var frac23 = "⅔";
-var frac25 = "⅖";
-var frac34 = "¾";
-var frac35 = "⅗";
-var frac38 = "⅜";
-var frac45 = "⅘";
-var frac56 = "⅚";
-var frac58 = "⅝";
-var frac78 = "⅞";
-var frasl = "⁄";
-var frown = "⌢";
-var fscr = "𝒻";
-var Fscr = "ℱ";
-var gacute = "ǵ";
-var Gamma = "Γ";
-var gamma = "γ";
-var Gammad = "Ϝ";
-var gammad = "ϝ";
-var gap = "⪆";
-var Gbreve = "Ğ";
-var gbreve = "ğ";
-var Gcedil = "Ģ";
-var Gcirc = "Ĝ";
-var gcirc = "ĝ";
-var Gcy = "Г";
-var gcy = "г";
-var Gdot = "Ġ";
-var gdot = "ġ";
-var ge = "≥";
-var gE = "≧";
-var gEl = "⪌";
-var gel = "⋛";
-var geq = "≥";
-var geqq = "≧";
-var geqslant = "⩾";
-var gescc = "⪩";
-var ges = "⩾";
-var gesdot = "⪀";
-var gesdoto = "⪂";
-var gesdotol = "⪄";
-var gesl = "⋛︀";
-var gesles = "⪔";
-var Gfr = "𝔊";
-var gfr = "𝔤";
-var gg = "≫";
-var Gg = "⋙";
-var ggg = "⋙";
-var gimel = "ℷ";
-var GJcy = "Ѓ";
-var gjcy = "ѓ";
-var gla = "⪥";
-var gl = "≷";
-var glE = "⪒";
-var glj = "⪤";
-var gnap = "⪊";
-var gnapprox = "⪊";
-var gne = "⪈";
-var gnE = "≩";
-var gneq = "⪈";
-var gneqq = "≩";
-var gnsim = "⋧";
-var Gopf = "𝔾";
-var gopf = "𝕘";
-var grave = "`";
-var GreaterEqual = "≥";
-var GreaterEqualLess = "⋛";
-var GreaterFullEqual = "≧";
-var GreaterGreater = "⪢";
-var GreaterLess = "≷";
-var GreaterSlantEqual = "⩾";
-var GreaterTilde = "≳";
-var Gscr = "𝒢";
-var gscr = "ℊ";
-var gsim = "≳";
-var gsime = "⪎";
-var gsiml = "⪐";
-var gtcc = "⪧";
-var gtcir = "⩺";
-var gt = ">";
-var GT = ">";
-var Gt = "≫";
-var gtdot = "⋗";
-var gtlPar = "⦕";
-var gtquest = "⩼";
-var gtrapprox = "⪆";
-var gtrarr = "⥸";
-var gtrdot = "⋗";
-var gtreqless = "⋛";
-var gtreqqless = "⪌";
-var gtrless = "≷";
-var gtrsim = "≳";
-var gvertneqq = "≩︀";
-var gvnE = "≩︀";
-var Hacek = "ˇ";
-var hairsp = " ";
-var half = "½";
-var hamilt = "ℋ";
-var HARDcy = "Ъ";
-var hardcy = "ъ";
-var harrcir = "⥈";
-var harr = "↔";
-var hArr = "⇔";
-var harrw = "↭";
-var Hat = "^";
-var hbar = "ℏ";
-var Hcirc = "Ĥ";
-var hcirc = "ĥ";
-var hearts = "♥";
-var heartsuit = "♥";
-var hellip = "…";
-var hercon = "⊹";
-var hfr = "𝔥";
-var Hfr = "ℌ";
-var HilbertSpace = "ℋ";
-var hksearow = "⤥";
-var hkswarow = "⤦";
-var hoarr = "⇿";
-var homtht = "∻";
-var hookleftarrow = "↩";
-var hookrightarrow = "↪";
-var hopf = "𝕙";
-var Hopf = "ℍ";
-var horbar = "―";
-var HorizontalLine = "─";
-var hscr = "𝒽";
-var Hscr = "ℋ";
-var hslash = "ℏ";
-var Hstrok = "Ħ";
-var hstrok = "ħ";
-var HumpDownHump = "≎";
-var HumpEqual = "≏";
-var hybull = "⁃";
-var hyphen = "‐";
-var Iacute = "Í";
-var iacute = "í";
-var ic = "⁣";
-var Icirc = "Î";
-var icirc = "î";
-var Icy = "И";
-var icy = "и";
-var Idot = "İ";
-var IEcy = "Е";
-var iecy = "е";
-var iexcl = "¡";
-var iff = "⇔";
-var ifr = "𝔦";
-var Ifr = "ℑ";
-var Igrave = "Ì";
-var igrave = "ì";
-var ii = "ⅈ";
-var iiiint = "⨌";
-var iiint = "∭";
-var iinfin = "⧜";
-var iiota = "℩";
-var IJlig = "Ĳ";
-var ijlig = "ĳ";
-var Imacr = "Ī";
-var imacr = "ī";
-var image = "ℑ";
-var ImaginaryI = "ⅈ";
-var imagline = "ℐ";
-var imagpart = "ℑ";
-var imath = "ı";
-var Im = "ℑ";
-var imof = "⊷";
-var imped = "Ƶ";
-var Implies = "⇒";
-var incare = "℅";
-var infin = "∞";
-var infintie = "⧝";
-var inodot = "ı";
-var intcal = "⊺";
-var int = "∫";
-var Int = "∬";
-var integers = "ℤ";
-var Integral = "∫";
-var intercal = "⊺";
-var Intersection = "⋂";
-var intlarhk = "⨗";
-var intprod = "⨼";
-var InvisibleComma = "⁣";
-var InvisibleTimes = "⁢";
-var IOcy = "Ё";
-var iocy = "ё";
-var Iogon = "Į";
-var iogon = "į";
-var Iopf = "𝕀";
-var iopf = "𝕚";
-var Iota = "Ι";
-var iota = "ι";
-var iprod = "⨼";
-var iquest = "¿";
-var iscr = "𝒾";
-var Iscr = "ℐ";
-var isin = "∈";
-var isindot = "⋵";
-var isinE = "⋹";
-var isins = "⋴";
-var isinsv = "⋳";
-var isinv = "∈";
-var it = "⁢";
-var Itilde = "Ĩ";
-var itilde = "ĩ";
-var Iukcy = "І";
-var iukcy = "і";
-var Iuml = "Ï";
-var iuml = "ï";
-var Jcirc = "Ĵ";
-var jcirc = "ĵ";
-var Jcy = "Й";
-var jcy = "й";
-var Jfr = "𝔍";
-var jfr = "𝔧";
-var jmath = "ȷ";
-var Jopf = "𝕁";
-var jopf = "𝕛";
-var Jscr = "𝒥";
-var jscr = "𝒿";
-var Jsercy = "Ј";
-var jsercy = "ј";
-var Jukcy = "Є";
-var jukcy = "є";
-var Kappa = "Κ";
-var kappa = "κ";
-var kappav = "ϰ";
-var Kcedil = "Ķ";
-var kcedil = "ķ";
-var Kcy = "К";
-var kcy = "к";
-var Kfr = "𝔎";
-var kfr = "𝔨";
-var kgreen = "ĸ";
-var KHcy = "Х";
-var khcy = "х";
-var KJcy = "Ќ";
-var kjcy = "ќ";
-var Kopf = "𝕂";
-var kopf = "𝕜";
-var Kscr = "𝒦";
-var kscr = "𝓀";
-var lAarr = "⇚";
-var Lacute = "Ĺ";
-var lacute = "ĺ";
-var laemptyv = "⦴";
-var lagran = "ℒ";
-var Lambda = "Λ";
-var lambda = "λ";
-var lang = "⟨";
-var Lang = "⟪";
-var langd = "⦑";
-var langle = "⟨";
-var lap = "⪅";
-var Laplacetrf = "ℒ";
-var laquo = "«";
-var larrb = "⇤";
-var larrbfs = "⤟";
-var larr = "←";
-var Larr = "↞";
-var lArr = "⇐";
-var larrfs = "⤝";
-var larrhk = "↩";
-var larrlp = "↫";
-var larrpl = "⤹";
-var larrsim = "⥳";
-var larrtl = "↢";
-var latail = "⤙";
-var lAtail = "⤛";
-var lat = "⪫";
-var late = "⪭";
-var lates = "⪭︀";
-var lbarr = "⤌";
-var lBarr = "⤎";
-var lbbrk = "❲";
-var lbrace = "{";
-var lbrack = "[";
-var lbrke = "⦋";
-var lbrksld = "⦏";
-var lbrkslu = "⦍";
-var Lcaron = "Ľ";
-var lcaron = "ľ";
-var Lcedil = "Ļ";
-var lcedil = "ļ";
-var lceil = "⌈";
-var lcub = "{";
-var Lcy = "Л";
-var lcy = "л";
-var ldca = "⤶";
-var ldquo = "“";
-var ldquor = "„";
-var ldrdhar = "⥧";
-var ldrushar = "⥋";
-var ldsh = "↲";
-var le = "≤";
-var lE = "≦";
-var LeftAngleBracket = "⟨";
-var LeftArrowBar = "⇤";
-var leftarrow = "←";
-var LeftArrow = "←";
-var Leftarrow = "⇐";
-var LeftArrowRightArrow = "⇆";
-var leftarrowtail = "↢";
-var LeftCeiling = "⌈";
-var LeftDoubleBracket = "⟦";
-var LeftDownTeeVector = "⥡";
-var LeftDownVectorBar = "⥙";
-var LeftDownVector = "⇃";
-var LeftFloor = "⌊";
-var leftharpoondown = "↽";
-var leftharpoonup = "↼";
-var leftleftarrows = "⇇";
-var leftrightarrow = "↔";
-var LeftRightArrow = "↔";
-var Leftrightarrow = "⇔";
-var leftrightarrows = "⇆";
-var leftrightharpoons = "⇋";
-var leftrightsquigarrow = "↭";
-var LeftRightVector = "⥎";
-var LeftTeeArrow = "↤";
-var LeftTee = "⊣";
-var LeftTeeVector = "⥚";
-var leftthreetimes = "⋋";
-var LeftTriangleBar = "⧏";
-var LeftTriangle = "⊲";
-var LeftTriangleEqual = "⊴";
-var LeftUpDownVector = "⥑";
-var LeftUpTeeVector = "⥠";
-var LeftUpVectorBar = "⥘";
-var LeftUpVector = "↿";
-var LeftVectorBar = "⥒";
-var LeftVector = "↼";
-var lEg = "⪋";
-var leg = "⋚";
-var leq = "≤";
-var leqq = "≦";
-var leqslant = "⩽";
-var lescc = "⪨";
-var les = "⩽";
-var lesdot = "⩿";
-var lesdoto = "⪁";
-var lesdotor = "⪃";
-var lesg = "⋚︀";
-var lesges = "⪓";
-var lessapprox = "⪅";
-var lessdot = "⋖";
-var lesseqgtr = "⋚";
-var lesseqqgtr = "⪋";
-var LessEqualGreater = "⋚";
-var LessFullEqual = "≦";
-var LessGreater = "≶";
-var lessgtr = "≶";
-var LessLess = "⪡";
-var lesssim = "≲";
-var LessSlantEqual = "⩽";
-var LessTilde = "≲";
-var lfisht = "⥼";
-var lfloor = "⌊";
-var Lfr = "𝔏";
-var lfr = "𝔩";
-var lg = "≶";
-var lgE = "⪑";
-var lHar = "⥢";
-var lhard = "↽";
-var lharu = "↼";
-var lharul = "⥪";
-var lhblk = "▄";
-var LJcy = "Љ";
-var ljcy = "љ";
-var llarr = "⇇";
-var ll = "≪";
-var Ll = "⋘";
-var llcorner = "⌞";
-var Lleftarrow = "⇚";
-var llhard = "⥫";
-var lltri = "◺";
-var Lmidot = "Ŀ";
-var lmidot = "ŀ";
-var lmoustache = "⎰";
-var lmoust = "⎰";
-var lnap = "⪉";
-var lnapprox = "⪉";
-var lne = "⪇";
-var lnE = "≨";
-var lneq = "⪇";
-var lneqq = "≨";
-var lnsim = "⋦";
-var loang = "⟬";
-var loarr = "⇽";
-var lobrk = "⟦";
-var longleftarrow = "⟵";
-var LongLeftArrow = "⟵";
-var Longleftarrow = "⟸";
-var longleftrightarrow = "⟷";
-var LongLeftRightArrow = "⟷";
-var Longleftrightarrow = "⟺";
-var longmapsto = "⟼";
-var longrightarrow = "⟶";
-var LongRightArrow = "⟶";
-var Longrightarrow = "⟹";
-var looparrowleft = "↫";
-var looparrowright = "↬";
-var lopar = "⦅";
-var Lopf = "𝕃";
-var lopf = "𝕝";
-var loplus = "⨭";
-var lotimes = "⨴";
-var lowast = "∗";
-var lowbar = "_";
-var LowerLeftArrow = "↙";
-var LowerRightArrow = "↘";
-var loz = "◊";
-var lozenge = "◊";
-var lozf = "⧫";
-var lpar = "(";
-var lparlt = "⦓";
-var lrarr = "⇆";
-var lrcorner = "⌟";
-var lrhar = "⇋";
-var lrhard = "⥭";
-var lrm = "‎";
-var lrtri = "⊿";
-var lsaquo = "‹";
-var lscr = "𝓁";
-var Lscr = "ℒ";
-var lsh = "↰";
-var Lsh = "↰";
-var lsim = "≲";
-var lsime = "⪍";
-var lsimg = "⪏";
-var lsqb = "[";
-var lsquo = "‘";
-var lsquor = "‚";
-var Lstrok = "Ł";
-var lstrok = "ł";
-var ltcc = "⪦";
-var ltcir = "⩹";
-var lt = "<";
-var LT = "<";
-var Lt = "≪";
-var ltdot = "⋖";
-var lthree = "⋋";
-var ltimes = "⋉";
-var ltlarr = "⥶";
-var ltquest = "⩻";
-var ltri = "◃";
-var ltrie = "⊴";
-var ltrif = "◂";
-var ltrPar = "⦖";
-var lurdshar = "⥊";
-var luruhar = "⥦";
-var lvertneqq = "≨︀";
-var lvnE = "≨︀";
-var macr = "¯";
-var male = "♂";
-var malt = "✠";
-var maltese = "✠";
-var map = "↦";
-var mapsto = "↦";
-var mapstodown = "↧";
-var mapstoleft = "↤";
-var mapstoup = "↥";
-var marker = "▮";
-var mcomma = "⨩";
-var Mcy = "М";
-var mcy = "м";
-var mdash = "—";
-var mDDot = "∺";
-var measuredangle = "∡";
-var MediumSpace = " ";
-var Mellintrf = "ℳ";
-var Mfr = "𝔐";
-var mfr = "𝔪";
-var mho = "℧";
-var micro = "µ";
-var midast = "*";
-var midcir = "⫰";
-var mid = "∣";
-var middot = "·";
-var minusb = "⊟";
-var minus = "−";
-var minusd = "∸";
-var minusdu = "⨪";
-var MinusPlus = "∓";
-var mlcp = "⫛";
-var mldr = "…";
-var mnplus = "∓";
-var models = "⊧";
-var Mopf = "𝕄";
-var mopf = "𝕞";
-var mp = "∓";
-var mscr = "𝓂";
-var Mscr = "ℳ";
-var mstpos = "∾";
-var Mu = "Μ";
-var mu = "μ";
-var multimap = "⊸";
-var mumap = "⊸";
-var nabla = "∇";
-var Nacute = "Ń";
-var nacute = "ń";
-var nang = "∠⃒";
-var nap = "≉";
-var napE = "⩰̸";
-var napid = "≋̸";
-var napos = "ŉ";
-var napprox = "≉";
-var natural = "♮";
-var naturals = "ℕ";
-var natur = "♮";
-var nbsp = " ";
-var nbump = "≎̸";
-var nbumpe = "≏̸";
-var ncap = "⩃";
-var Ncaron = "Ň";
-var ncaron = "ň";
-var Ncedil = "Ņ";
-var ncedil = "ņ";
-var ncong = "≇";
-var ncongdot = "⩭̸";
-var ncup = "⩂";
-var Ncy = "Н";
-var ncy = "н";
-var ndash = "–";
-var nearhk = "⤤";
-var nearr = "↗";
-var neArr = "⇗";
-var nearrow = "↗";
-var ne = "≠";
-var nedot = "≐̸";
-var NegativeMediumSpace = "​";
-var NegativeThickSpace = "​";
-var NegativeThinSpace = "​";
-var NegativeVeryThinSpace = "​";
-var nequiv = "≢";
-var nesear = "⤨";
-var nesim = "≂̸";
-var NestedGreaterGreater = "≫";
-var NestedLessLess = "≪";
-var NewLine = "\n";
-var nexist = "∄";
-var nexists = "∄";
-var Nfr = "𝔑";
-var nfr = "𝔫";
-var ngE = "≧̸";
-var nge = "≱";
-var ngeq = "≱";
-var ngeqq = "≧̸";
-var ngeqslant = "⩾̸";
-var nges = "⩾̸";
-var nGg = "⋙̸";
-var ngsim = "≵";
-var nGt = "≫⃒";
-var ngt = "≯";
-var ngtr = "≯";
-var nGtv = "≫̸";
-var nharr = "↮";
-var nhArr = "⇎";
-var nhpar = "⫲";
-var ni = "∋";
-var nis = "⋼";
-var nisd = "⋺";
-var niv = "∋";
-var NJcy = "Њ";
-var njcy = "њ";
-var nlarr = "↚";
-var nlArr = "⇍";
-var nldr = "‥";
-var nlE = "≦̸";
-var nle = "≰";
-var nleftarrow = "↚";
-var nLeftarrow = "⇍";
-var nleftrightarrow = "↮";
-var nLeftrightarrow = "⇎";
-var nleq = "≰";
-var nleqq = "≦̸";
-var nleqslant = "⩽̸";
-var nles = "⩽̸";
-var nless = "≮";
-var nLl = "⋘̸";
-var nlsim = "≴";
-var nLt = "≪⃒";
-var nlt = "≮";
-var nltri = "⋪";
-var nltrie = "⋬";
-var nLtv = "≪̸";
-var nmid = "∤";
-var NoBreak = "⁠";
-var NonBreakingSpace = " ";
-var nopf = "𝕟";
-var Nopf = "ℕ";
-var Not = "⫬";
-var not = "¬";
-var NotCongruent = "≢";
-var NotCupCap = "≭";
-var NotDoubleVerticalBar = "∦";
-var NotElement = "∉";
-var NotEqual = "≠";
-var NotEqualTilde = "≂̸";
-var NotExists = "∄";
-var NotGreater = "≯";
-var NotGreaterEqual = "≱";
-var NotGreaterFullEqual = "≧̸";
-var NotGreaterGreater = "≫̸";
-var NotGreaterLess = "≹";
-var NotGreaterSlantEqual = "⩾̸";
-var NotGreaterTilde = "≵";
-var NotHumpDownHump = "≎̸";
-var NotHumpEqual = "≏̸";
-var notin = "∉";
-var notindot = "⋵̸";
-var notinE = "⋹̸";
-var notinva = "∉";
-var notinvb = "⋷";
-var notinvc = "⋶";
-var NotLeftTriangleBar = "⧏̸";
-var NotLeftTriangle = "⋪";
-var NotLeftTriangleEqual = "⋬";
-var NotLess = "≮";
-var NotLessEqual = "≰";
-var NotLessGreater = "≸";
-var NotLessLess = "≪̸";
-var NotLessSlantEqual = "⩽̸";
-var NotLessTilde = "≴";
-var NotNestedGreaterGreater = "⪢̸";
-var NotNestedLessLess = "⪡̸";
-var notni = "∌";
-var notniva = "∌";
-var notnivb = "⋾";
-var notnivc = "⋽";
-var NotPrecedes = "⊀";
-var NotPrecedesEqual = "⪯̸";
-var NotPrecedesSlantEqual = "⋠";
-var NotReverseElement = "∌";
-var NotRightTriangleBar = "⧐̸";
-var NotRightTriangle = "⋫";
-var NotRightTriangleEqual = "⋭";
-var NotSquareSubset = "⊏̸";
-var NotSquareSubsetEqual = "⋢";
-var NotSquareSuperset = "⊐̸";
-var NotSquareSupersetEqual = "⋣";
-var NotSubset = "⊂⃒";
-var NotSubsetEqual = "⊈";
-var NotSucceeds = "⊁";
-var NotSucceedsEqual = "⪰̸";
-var NotSucceedsSlantEqual = "⋡";
-var NotSucceedsTilde = "≿̸";
-var NotSuperset = "⊃⃒";
-var NotSupersetEqual = "⊉";
-var NotTilde = "≁";
-var NotTildeEqual = "≄";
-var NotTildeFullEqual = "≇";
-var NotTildeTilde = "≉";
-var NotVerticalBar = "∤";
-var nparallel = "∦";
-var npar = "∦";
-var nparsl = "⫽⃥";
-var npart = "∂̸";
-var npolint = "⨔";
-var npr = "⊀";
-var nprcue = "⋠";
-var nprec = "⊀";
-var npreceq = "⪯̸";
-var npre = "⪯̸";
-var nrarrc = "⤳̸";
-var nrarr = "↛";
-var nrArr = "⇏";
-var nrarrw = "↝̸";
-var nrightarrow = "↛";
-var nRightarrow = "⇏";
-var nrtri = "⋫";
-var nrtrie = "⋭";
-var nsc = "⊁";
-var nsccue = "⋡";
-var nsce = "⪰̸";
-var Nscr = "𝒩";
-var nscr = "𝓃";
-var nshortmid = "∤";
-var nshortparallel = "∦";
-var nsim = "≁";
-var nsime = "≄";
-var nsimeq = "≄";
-var nsmid = "∤";
-var nspar = "∦";
-var nsqsube = "⋢";
-var nsqsupe = "⋣";
-var nsub = "⊄";
-var nsubE = "⫅̸";
-var nsube = "⊈";
-var nsubset = "⊂⃒";
-var nsubseteq = "⊈";
-var nsubseteqq = "⫅̸";
-var nsucc = "⊁";
-var nsucceq = "⪰̸";
-var nsup = "⊅";
-var nsupE = "⫆̸";
-var nsupe = "⊉";
-var nsupset = "⊃⃒";
-var nsupseteq = "⊉";
-var nsupseteqq = "⫆̸";
-var ntgl = "≹";
-var Ntilde = "Ñ";
-var ntilde = "ñ";
-var ntlg = "≸";
-var ntriangleleft = "⋪";
-var ntrianglelefteq = "⋬";
-var ntriangleright = "⋫";
-var ntrianglerighteq = "⋭";
-var Nu = "Ν";
-var nu = "ν";
-var num = "#";
-var numero = "№";
-var numsp = " ";
-var nvap = "≍⃒";
-var nvdash = "⊬";
-var nvDash = "⊭";
-var nVdash = "⊮";
-var nVDash = "⊯";
-var nvge = "≥⃒";
-var nvgt = ">⃒";
-var nvHarr = "⤄";
-var nvinfin = "⧞";
-var nvlArr = "⤂";
-var nvle = "≤⃒";
-var nvlt = "<⃒";
-var nvltrie = "⊴⃒";
-var nvrArr = "⤃";
-var nvrtrie = "⊵⃒";
-var nvsim = "∼⃒";
-var nwarhk = "⤣";
-var nwarr = "↖";
-var nwArr = "⇖";
-var nwarrow = "↖";
-var nwnear = "⤧";
-var Oacute = "Ó";
-var oacute = "ó";
-var oast = "⊛";
-var Ocirc = "Ô";
-var ocirc = "ô";
-var ocir = "⊚";
-var Ocy = "О";
-var ocy = "о";
-var odash = "⊝";
-var Odblac = "Ő";
-var odblac = "ő";
-var odiv = "⨸";
-var odot = "⊙";
-var odsold = "⦼";
-var OElig = "Œ";
-var oelig = "œ";
-var ofcir = "⦿";
-var Ofr = "𝔒";
-var ofr = "𝔬";
-var ogon = "˛";
-var Ograve = "Ò";
-var ograve = "ò";
-var ogt = "⧁";
-var ohbar = "⦵";
-var ohm = "Ω";
-var oint = "∮";
-var olarr = "↺";
-var olcir = "⦾";
-var olcross = "⦻";
-var oline = "‾";
-var olt = "⧀";
-var Omacr = "Ō";
-var omacr = "ō";
-var Omega = "Ω";
-var omega = "ω";
-var Omicron = "Ο";
-var omicron = "ο";
-var omid = "⦶";
-var ominus = "⊖";
-var Oopf = "𝕆";
-var oopf = "𝕠";
-var opar = "⦷";
-var OpenCurlyDoubleQuote = "“";
-var OpenCurlyQuote = "‘";
-var operp = "⦹";
-var oplus = "⊕";
-var orarr = "↻";
-var Or = "⩔";
-var or = "∨";
-var ord = "⩝";
-var order = "ℴ";
-var orderof = "ℴ";
-var ordf = "ª";
-var ordm = "º";
-var origof = "⊶";
-var oror = "⩖";
-var orslope = "⩗";
-var orv = "⩛";
-var oS = "Ⓢ";
-var Oscr = "𝒪";
-var oscr = "ℴ";
-var Oslash = "Ø";
-var oslash = "ø";
-var osol = "⊘";
-var Otilde = "Õ";
-var otilde = "õ";
-var otimesas = "⨶";
-var Otimes = "⨷";
-var otimes = "⊗";
-var Ouml = "Ö";
-var ouml = "ö";
-var ovbar = "⌽";
-var OverBar = "‾";
-var OverBrace = "⏞";
-var OverBracket = "⎴";
-var OverParenthesis = "⏜";
-var para = "¶";
-var parallel = "∥";
-var par = "∥";
-var parsim = "⫳";
-var parsl = "⫽";
-var part = "∂";
-var PartialD = "∂";
-var Pcy = "П";
-var pcy = "п";
-var percnt = "%";
-var period = ".";
-var permil = "‰";
-var perp = "⊥";
-var pertenk = "‱";
-var Pfr = "𝔓";
-var pfr = "𝔭";
-var Phi = "Φ";
-var phi = "φ";
-var phiv = "ϕ";
-var phmmat = "ℳ";
-var phone = "☎";
-var Pi = "Π";
-var pi = "π";
-var pitchfork = "⋔";
-var piv = "ϖ";
-var planck = "ℏ";
-var planckh = "ℎ";
-var plankv = "ℏ";
-var plusacir = "⨣";
-var plusb = "⊞";
-var pluscir = "⨢";
-var plus = "+";
-var plusdo = "∔";
-var plusdu = "⨥";
-var pluse = "⩲";
-var PlusMinus = "±";
-var plusmn = "±";
-var plussim = "⨦";
-var plustwo = "⨧";
-var pm = "±";
-var Poincareplane = "ℌ";
-var pointint = "⨕";
-var popf = "𝕡";
-var Popf = "ℙ";
-var pound = "£";
-var prap = "⪷";
-var Pr = "⪻";
-var pr = "≺";
-var prcue = "≼";
-var precapprox = "⪷";
-var prec = "≺";
-var preccurlyeq = "≼";
-var Precedes = "≺";
-var PrecedesEqual = "⪯";
-var PrecedesSlantEqual = "≼";
-var PrecedesTilde = "≾";
-var preceq = "⪯";
-var precnapprox = "⪹";
-var precneqq = "⪵";
-var precnsim = "⋨";
-var pre = "⪯";
-var prE = "⪳";
-var precsim = "≾";
-var prime = "′";
-var Prime = "″";
-var primes = "ℙ";
-var prnap = "⪹";
-var prnE = "⪵";
-var prnsim = "⋨";
-var prod = "∏";
-var Product = "∏";
-var profalar = "⌮";
-var profline = "⌒";
-var profsurf = "⌓";
-var prop = "∝";
-var Proportional = "∝";
-var Proportion = "∷";
-var propto = "∝";
-var prsim = "≾";
-var prurel = "⊰";
-var Pscr = "𝒫";
-var pscr = "𝓅";
-var Psi = "Ψ";
-var psi = "ψ";
-var puncsp = " ";
-var Qfr = "𝔔";
-var qfr = "𝔮";
-var qint = "⨌";
-var qopf = "𝕢";
-var Qopf = "ℚ";
-var qprime = "⁗";
-var Qscr = "𝒬";
-var qscr = "𝓆";
-var quaternions = "ℍ";
-var quatint = "⨖";
-var quest = "?";
-var questeq = "≟";
-var quot = "\"";
-var QUOT = "\"";
-var rAarr = "⇛";
-var race = "∽̱";
-var Racute = "Ŕ";
-var racute = "ŕ";
-var radic = "√";
-var raemptyv = "⦳";
-var rang = "⟩";
-var Rang = "⟫";
-var rangd = "⦒";
-var range = "⦥";
-var rangle = "⟩";
-var raquo = "»";
-var rarrap = "⥵";
-var rarrb = "⇥";
-var rarrbfs = "⤠";
-var rarrc = "⤳";
-var rarr = "→";
-var Rarr = "↠";
-var rArr = "⇒";
-var rarrfs = "⤞";
-var rarrhk = "↪";
-var rarrlp = "↬";
-var rarrpl = "⥅";
-var rarrsim = "⥴";
-var Rarrtl = "⤖";
-var rarrtl = "↣";
-var rarrw = "↝";
-var ratail = "⤚";
-var rAtail = "⤜";
-var ratio = "∶";
-var rationals = "ℚ";
-var rbarr = "⤍";
-var rBarr = "⤏";
-var RBarr = "⤐";
-var rbbrk = "❳";
-var rbrace = "}";
-var rbrack = "]";
-var rbrke = "⦌";
-var rbrksld = "⦎";
-var rbrkslu = "⦐";
-var Rcaron = "Ř";
-var rcaron = "ř";
-var Rcedil = "Ŗ";
-var rcedil = "ŗ";
-var rceil = "⌉";
-var rcub = "}";
-var Rcy = "Р";
-var rcy = "р";
-var rdca = "⤷";
-var rdldhar = "⥩";
-var rdquo = "”";
-var rdquor = "”";
-var rdsh = "↳";
-var real = "ℜ";
-var realine = "ℛ";
-var realpart = "ℜ";
-var reals = "ℝ";
-var Re = "ℜ";
-var rect = "▭";
-var reg = "®";
-var REG = "®";
-var ReverseElement = "∋";
-var ReverseEquilibrium = "⇋";
-var ReverseUpEquilibrium = "⥯";
-var rfisht = "⥽";
-var rfloor = "⌋";
-var rfr = "𝔯";
-var Rfr = "ℜ";
-var rHar = "⥤";
-var rhard = "⇁";
-var rharu = "⇀";
-var rharul = "⥬";
-var Rho = "Ρ";
-var rho = "ρ";
-var rhov = "ϱ";
-var RightAngleBracket = "⟩";
-var RightArrowBar = "⇥";
-var rightarrow = "→";
-var RightArrow = "→";
-var Rightarrow = "⇒";
-var RightArrowLeftArrow = "⇄";
-var rightarrowtail = "↣";
-var RightCeiling = "⌉";
-var RightDoubleBracket = "⟧";
-var RightDownTeeVector = "⥝";
-var RightDownVectorBar = "⥕";
-var RightDownVector = "⇂";
-var RightFloor = "⌋";
-var rightharpoondown = "⇁";
-var rightharpoonup = "⇀";
-var rightleftarrows = "⇄";
-var rightleftharpoons = "⇌";
-var rightrightarrows = "⇉";
-var rightsquigarrow = "↝";
-var RightTeeArrow = "↦";
-var RightTee = "⊢";
-var RightTeeVector = "⥛";
-var rightthreetimes = "⋌";
-var RightTriangleBar = "⧐";
-var RightTriangle = "⊳";
-var RightTriangleEqual = "⊵";
-var RightUpDownVector = "⥏";
-var RightUpTeeVector = "⥜";
-var RightUpVectorBar = "⥔";
-var RightUpVector = "↾";
-var RightVectorBar = "⥓";
-var RightVector = "⇀";
-var ring = "˚";
-var risingdotseq = "≓";
-var rlarr = "⇄";
-var rlhar = "⇌";
-var rlm = "‏";
-var rmoustache = "⎱";
-var rmoust = "⎱";
-var rnmid = "⫮";
-var roang = "⟭";
-var roarr = "⇾";
-var robrk = "⟧";
-var ropar = "⦆";
-var ropf = "𝕣";
-var Ropf = "ℝ";
-var roplus = "⨮";
-var rotimes = "⨵";
-var RoundImplies = "⥰";
-var rpar = ")";
-var rpargt = "⦔";
-var rppolint = "⨒";
-var rrarr = "⇉";
-var Rrightarrow = "⇛";
-var rsaquo = "›";
-var rscr = "𝓇";
-var Rscr = "ℛ";
-var rsh = "↱";
-var Rsh = "↱";
-var rsqb = "]";
-var rsquo = "’";
-var rsquor = "’";
-var rthree = "⋌";
-var rtimes = "⋊";
-var rtri = "▹";
-var rtrie = "⊵";
-var rtrif = "▸";
-var rtriltri = "⧎";
-var RuleDelayed = "⧴";
-var ruluhar = "⥨";
-var rx = "℞";
-var Sacute = "Ś";
-var sacute = "ś";
-var sbquo = "‚";
-var scap = "⪸";
-var Scaron = "Š";
-var scaron = "š";
-var Sc = "⪼";
-var sc = "≻";
-var sccue = "≽";
-var sce = "⪰";
-var scE = "⪴";
-var Scedil = "Ş";
-var scedil = "ş";
-var Scirc = "Ŝ";
-var scirc = "ŝ";
-var scnap = "⪺";
-var scnE = "⪶";
-var scnsim = "⋩";
-var scpolint = "⨓";
-var scsim = "≿";
-var Scy = "С";
-var scy = "с";
-var sdotb = "⊡";
-var sdot = "⋅";
-var sdote = "⩦";
-var searhk = "⤥";
-var searr = "↘";
-var seArr = "⇘";
-var searrow = "↘";
-var sect = "§";
-var semi = ";";
-var seswar = "⤩";
-var setminus = "∖";
-var setmn = "∖";
-var sext = "✶";
-var Sfr = "𝔖";
-var sfr = "𝔰";
-var sfrown = "⌢";
-var sharp = "♯";
-var SHCHcy = "Щ";
-var shchcy = "щ";
-var SHcy = "Ш";
-var shcy = "ш";
-var ShortDownArrow = "↓";
-var ShortLeftArrow = "←";
-var shortmid = "∣";
-var shortparallel = "∥";
-var ShortRightArrow = "→";
-var ShortUpArrow = "↑";
-var shy = "­";
-var Sigma = "Σ";
-var sigma = "σ";
-var sigmaf = "ς";
-var sigmav = "ς";
-var sim = "∼";
-var simdot = "⩪";
-var sime = "≃";
-var simeq = "≃";
-var simg = "⪞";
-var simgE = "⪠";
-var siml = "⪝";
-var simlE = "⪟";
-var simne = "≆";
-var simplus = "⨤";
-var simrarr = "⥲";
-var slarr = "←";
-var SmallCircle = "∘";
-var smallsetminus = "∖";
-var smashp = "⨳";
-var smeparsl = "⧤";
-var smid = "∣";
-var smile = "⌣";
-var smt = "⪪";
-var smte = "⪬";
-var smtes = "⪬︀";
-var SOFTcy = "Ь";
-var softcy = "ь";
-var solbar = "⌿";
-var solb = "⧄";
-var sol = "/";
-var Sopf = "𝕊";
-var sopf = "𝕤";
-var spades = "♠";
-var spadesuit = "♠";
-var spar = "∥";
-var sqcap = "⊓";
-var sqcaps = "⊓︀";
-var sqcup = "⊔";
-var sqcups = "⊔︀";
-var Sqrt = "√";
-var sqsub = "⊏";
-var sqsube = "⊑";
-var sqsubset = "⊏";
-var sqsubseteq = "⊑";
-var sqsup = "⊐";
-var sqsupe = "⊒";
-var sqsupset = "⊐";
-var sqsupseteq = "⊒";
-var square = "□";
-var Square = "□";
-var SquareIntersection = "⊓";
-var SquareSubset = "⊏";
-var SquareSubsetEqual = "⊑";
-var SquareSuperset = "⊐";
-var SquareSupersetEqual = "⊒";
-var SquareUnion = "⊔";
-var squarf = "▪";
-var squ = "□";
-var squf = "▪";
-var srarr = "→";
-var Sscr = "𝒮";
-var sscr = "𝓈";
-var ssetmn = "∖";
-var ssmile = "⌣";
-var sstarf = "⋆";
-var Star = "⋆";
-var star = "☆";
-var starf = "★";
-var straightepsilon = "ϵ";
-var straightphi = "ϕ";
-var strns = "¯";
-var sub = "⊂";
-var Sub = "⋐";
-var subdot = "⪽";
-var subE = "⫅";
-var sube = "⊆";
-var subedot = "⫃";
-var submult = "⫁";
-var subnE = "⫋";
-var subne = "⊊";
-var subplus = "⪿";
-var subrarr = "⥹";
-var subset = "⊂";
-var Subset = "⋐";
-var subseteq = "⊆";
-var subseteqq = "⫅";
-var SubsetEqual = "⊆";
-var subsetneq = "⊊";
-var subsetneqq = "⫋";
-var subsim = "⫇";
-var subsub = "⫕";
-var subsup = "⫓";
-var succapprox = "⪸";
-var succ = "≻";
-var succcurlyeq = "≽";
-var Succeeds = "≻";
-var SucceedsEqual = "⪰";
-var SucceedsSlantEqual = "≽";
-var SucceedsTilde = "≿";
-var succeq = "⪰";
-var succnapprox = "⪺";
-var succneqq = "⪶";
-var succnsim = "⋩";
-var succsim = "≿";
-var SuchThat = "∋";
-var sum = "∑";
-var Sum = "∑";
-var sung = "♪";
-var sup1 = "¹";
-var sup2 = "²";
-var sup3 = "³";
-var sup = "⊃";
-var Sup = "⋑";
-var supdot = "⪾";
-var supdsub = "⫘";
-var supE = "⫆";
-var supe = "⊇";
-var supedot = "⫄";
-var Superset = "⊃";
-var SupersetEqual = "⊇";
-var suphsol = "⟉";
-var suphsub = "⫗";
-var suplarr = "⥻";
-var supmult = "⫂";
-var supnE = "⫌";
-var supne = "⊋";
-var supplus = "⫀";
-var supset = "⊃";
-var Supset = "⋑";
-var supseteq = "⊇";
-var supseteqq = "⫆";
-var supsetneq = "⊋";
-var supsetneqq = "⫌";
-var supsim = "⫈";
-var supsub = "⫔";
-var supsup = "⫖";
-var swarhk = "⤦";
-var swarr = "↙";
-var swArr = "⇙";
-var swarrow = "↙";
-var swnwar = "⤪";
-var szlig = "ß";
-var Tab = "\t";
-var target = "⌖";
-var Tau = "Τ";
-var tau = "τ";
-var tbrk = "⎴";
-var Tcaron = "Ť";
-var tcaron = "ť";
-var Tcedil = "Ţ";
-var tcedil = "ţ";
-var Tcy = "Т";
-var tcy = "т";
-var tdot = "⃛";
-var telrec = "⌕";
-var Tfr = "𝔗";
-var tfr = "𝔱";
-var there4 = "∴";
-var therefore = "∴";
-var Therefore = "∴";
-var Theta = "Θ";
-var theta = "θ";
-var thetasym = "ϑ";
-var thetav = "ϑ";
-var thickapprox = "≈";
-var thicksim = "∼";
-var ThickSpace = "  ";
-var ThinSpace = " ";
-var thinsp = " ";
-var thkap = "≈";
-var thksim = "∼";
-var THORN = "Þ";
-var thorn = "þ";
-var tilde = "˜";
-var Tilde = "∼";
-var TildeEqual = "≃";
-var TildeFullEqual = "≅";
-var TildeTilde = "≈";
-var timesbar = "⨱";
-var timesb = "⊠";
-var times = "×";
-var timesd = "⨰";
-var tint = "∭";
-var toea = "⤨";
-var topbot = "⌶";
-var topcir = "⫱";
-var top = "⊤";
-var Topf = "𝕋";
-var topf = "𝕥";
-var topfork = "⫚";
-var tosa = "⤩";
-var tprime = "‴";
-var trade = "™";
-var TRADE = "™";
-var triangle = "▵";
-var triangledown = "▿";
-var triangleleft = "◃";
-var trianglelefteq = "⊴";
-var triangleq = "≜";
-var triangleright = "▹";
-var trianglerighteq = "⊵";
-var tridot = "◬";
-var trie = "≜";
-var triminus = "⨺";
-var TripleDot = "⃛";
-var triplus = "⨹";
-var trisb = "⧍";
-var tritime = "⨻";
-var trpezium = "⏢";
-var Tscr = "𝒯";
-var tscr = "𝓉";
-var TScy = "Ц";
-var tscy = "ц";
-var TSHcy = "Ћ";
-var tshcy = "ћ";
-var Tstrok = "Ŧ";
-var tstrok = "ŧ";
-var twixt = "≬";
-var twoheadleftarrow = "↞";
-var twoheadrightarrow = "↠";
-var Uacute = "Ú";
-var uacute = "ú";
-var uarr = "↑";
-var Uarr = "↟";
-var uArr = "⇑";
-var Uarrocir = "⥉";
-var Ubrcy = "Ў";
-var ubrcy = "ў";
-var Ubreve = "Ŭ";
-var ubreve = "ŭ";
-var Ucirc = "Û";
-var ucirc = "û";
-var Ucy = "У";
-var ucy = "у";
-var udarr = "⇅";
-var Udblac = "Ű";
-var udblac = "ű";
-var udhar = "⥮";
-var ufisht = "⥾";
-var Ufr = "𝔘";
-var ufr = "𝔲";
-var Ugrave = "Ù";
-var ugrave = "ù";
-var uHar = "⥣";
-var uharl = "↿";
-var uharr = "↾";
-var uhblk = "▀";
-var ulcorn = "⌜";
-var ulcorner = "⌜";
-var ulcrop = "⌏";
-var ultri = "◸";
-var Umacr = "Ū";
-var umacr = "ū";
-var uml = "¨";
-var UnderBar = "_";
-var UnderBrace = "⏟";
-var UnderBracket = "⎵";
-var UnderParenthesis = "⏝";
-var Union = "⋃";
-var UnionPlus = "⊎";
-var Uogon = "Ų";
-var uogon = "ų";
-var Uopf = "𝕌";
-var uopf = "𝕦";
-var UpArrowBar = "⤒";
-var uparrow = "↑";
-var UpArrow = "↑";
-var Uparrow = "⇑";
-var UpArrowDownArrow = "⇅";
-var updownarrow = "↕";
-var UpDownArrow = "↕";
-var Updownarrow = "⇕";
-var UpEquilibrium = "⥮";
-var upharpoonleft = "↿";
-var upharpoonright = "↾";
-var uplus = "⊎";
-var UpperLeftArrow = "↖";
-var UpperRightArrow = "↗";
-var upsi = "υ";
-var Upsi = "ϒ";
-var upsih = "ϒ";
-var Upsilon = "Υ";
-var upsilon = "υ";
-var UpTeeArrow = "↥";
-var UpTee = "⊥";
-var upuparrows = "⇈";
-var urcorn = "⌝";
-var urcorner = "⌝";
-var urcrop = "⌎";
-var Uring = "Ů";
-var uring = "ů";
-var urtri = "◹";
-var Uscr = "𝒰";
-var uscr = "𝓊";
-var utdot = "⋰";
-var Utilde = "Ũ";
-var utilde = "ũ";
-var utri = "▵";
-var utrif = "▴";
-var uuarr = "⇈";
-var Uuml = "Ü";
-var uuml = "ü";
-var uwangle = "⦧";
-var vangrt = "⦜";
-var varepsilon = "ϵ";
-var varkappa = "ϰ";
-var varnothing = "∅";
-var varphi = "ϕ";
-var varpi = "ϖ";
-var varpropto = "∝";
-var varr = "↕";
-var vArr = "⇕";
-var varrho = "ϱ";
-var varsigma = "ς";
-var varsubsetneq = "⊊︀";
-var varsubsetneqq = "⫋︀";
-var varsupsetneq = "⊋︀";
-var varsupsetneqq = "⫌︀";
-var vartheta = "ϑ";
-var vartriangleleft = "⊲";
-var vartriangleright = "⊳";
-var vBar = "⫨";
-var Vbar = "⫫";
-var vBarv = "⫩";
-var Vcy = "В";
-var vcy = "в";
-var vdash = "⊢";
-var vDash = "⊨";
-var Vdash = "⊩";
-var VDash = "⊫";
-var Vdashl = "⫦";
-var veebar = "⊻";
-var vee = "∨";
-var Vee = "⋁";
-var veeeq = "≚";
-var vellip = "⋮";
-var verbar = "|";
-var Verbar = "‖";
-var vert = "|";
-var Vert = "‖";
-var VerticalBar = "∣";
-var VerticalLine = "|";
-var VerticalSeparator = "❘";
-var VerticalTilde = "≀";
-var VeryThinSpace = " ";
-var Vfr = "𝔙";
-var vfr = "𝔳";
-var vltri = "⊲";
-var vnsub = "⊂⃒";
-var vnsup = "⊃⃒";
-var Vopf = "𝕍";
-var vopf = "𝕧";
-var vprop = "∝";
-var vrtri = "⊳";
-var Vscr = "𝒱";
-var vscr = "𝓋";
-var vsubnE = "⫋︀";
-var vsubne = "⊊︀";
-var vsupnE = "⫌︀";
-var vsupne = "⊋︀";
-var Vvdash = "⊪";
-var vzigzag = "⦚";
-var Wcirc = "Ŵ";
-var wcirc = "ŵ";
-var wedbar = "⩟";
-var wedge = "∧";
-var Wedge = "⋀";
-var wedgeq = "≙";
-var weierp = "℘";
-var Wfr = "𝔚";
-var wfr = "𝔴";
-var Wopf = "𝕎";
-var wopf = "𝕨";
-var wp = "℘";
-var wr = "≀";
-var wreath = "≀";
-var Wscr = "𝒲";
-var wscr = "𝓌";
-var xcap = "⋂";
-var xcirc = "◯";
-var xcup = "⋃";
-var xdtri = "▽";
-var Xfr = "𝔛";
-var xfr = "𝔵";
-var xharr = "⟷";
-var xhArr = "⟺";
-var Xi = "Ξ";
-var xi = "ξ";
-var xlarr = "⟵";
-var xlArr = "⟸";
-var xmap = "⟼";
-var xnis = "⋻";
-var xodot = "⨀";
-var Xopf = "𝕏";
-var xopf = "𝕩";
-var xoplus = "⨁";
-var xotime = "⨂";
-var xrarr = "⟶";
-var xrArr = "⟹";
-var Xscr = "𝒳";
-var xscr = "𝓍";
-var xsqcup = "⨆";
-var xuplus = "⨄";
-var xutri = "△";
-var xvee = "⋁";
-var xwedge = "⋀";
-var Yacute = "Ý";
-var yacute = "ý";
-var YAcy = "Я";
-var yacy = "я";
-var Ycirc = "Ŷ";
-var ycirc = "ŷ";
-var Ycy = "Ы";
-var ycy = "ы";
-var yen = "¥";
-var Yfr = "𝔜";
-var yfr = "𝔶";
-var YIcy = "Ї";
-var yicy = "ї";
-var Yopf = "𝕐";
-var yopf = "𝕪";
-var Yscr = "𝒴";
-var yscr = "𝓎";
-var YUcy = "Ю";
-var yucy = "ю";
-var yuml = "ÿ";
-var Yuml = "Ÿ";
-var Zacute = "Ź";
-var zacute = "ź";
-var Zcaron = "Ž";
-var zcaron = "ž";
-var Zcy = "З";
-var zcy = "з";
-var Zdot = "Ż";
-var zdot = "ż";
-var zeetrf = "ℨ";
-var ZeroWidthSpace = "​";
-var Zeta = "Ζ";
-var zeta = "ζ";
-var zfr = "𝔷";
-var Zfr = "ℨ";
-var ZHcy = "Ж";
-var zhcy = "ж";
-var zigrarr = "⇝";
-var zopf = "𝕫";
-var Zopf = "ℤ";
-var Zscr = "𝒵";
-var zscr = "𝓏";
-var zwj = "‍";
-var zwnj = "‌";
-var entities = {
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	"in": "∈",
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	"Map": "⤅",
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj
-};
-
-var entities$1 = {
-	__proto__: null,
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj,
-	'default': entities
-};
-
-var Aacute$1 = "Á";
-var aacute$1 = "á";
-var Acirc$1 = "Â";
-var acirc$1 = "â";
-var acute$1 = "´";
-var AElig$1 = "Æ";
-var aelig$1 = "æ";
-var Agrave$1 = "À";
-var agrave$1 = "à";
-var amp$1 = "&";
-var AMP$1 = "&";
-var Aring$1 = "Å";
-var aring$1 = "å";
-var Atilde$1 = "Ã";
-var atilde$1 = "ã";
-var Auml$1 = "Ä";
-var auml$1 = "ä";
-var brvbar$1 = "¦";
-var Ccedil$1 = "Ç";
-var ccedil$1 = "ç";
-var cedil$1 = "¸";
-var cent$1 = "¢";
-var copy$1 = "©";
-var COPY$1 = "©";
-var curren$1 = "¤";
-var deg$1 = "°";
-var divide$1 = "÷";
-var Eacute$1 = "É";
-var eacute$1 = "é";
-var Ecirc$1 = "Ê";
-var ecirc$1 = "ê";
-var Egrave$1 = "È";
-var egrave$1 = "è";
-var ETH$1 = "Ð";
-var eth$1 = "ð";
-var Euml$1 = "Ë";
-var euml$1 = "ë";
-var frac12$1 = "½";
-var frac14$1 = "¼";
-var frac34$1 = "¾";
-var gt$1 = ">";
-var GT$1 = ">";
-var Iacute$1 = "Í";
-var iacute$1 = "í";
-var Icirc$1 = "Î";
-var icirc$1 = "î";
-var iexcl$1 = "¡";
-var Igrave$1 = "Ì";
-var igrave$1 = "ì";
-var iquest$1 = "¿";
-var Iuml$1 = "Ï";
-var iuml$1 = "ï";
-var laquo$1 = "«";
-var lt$1 = "<";
-var LT$1 = "<";
-var macr$1 = "¯";
-var micro$1 = "µ";
-var middot$1 = "·";
-var nbsp$1 = " ";
-var not$1 = "¬";
-var Ntilde$1 = "Ñ";
-var ntilde$1 = "ñ";
-var Oacute$1 = "Ó";
-var oacute$1 = "ó";
-var Ocirc$1 = "Ô";
-var ocirc$1 = "ô";
-var Ograve$1 = "Ò";
-var ograve$1 = "ò";
-var ordf$1 = "ª";
-var ordm$1 = "º";
-var Oslash$1 = "Ø";
-var oslash$1 = "ø";
-var Otilde$1 = "Õ";
-var otilde$1 = "õ";
-var Ouml$1 = "Ö";
-var ouml$1 = "ö";
-var para$1 = "¶";
-var plusmn$1 = "±";
-var pound$1 = "£";
-var quot$1 = "\"";
-var QUOT$1 = "\"";
-var raquo$1 = "»";
-var reg$1 = "®";
-var REG$1 = "®";
-var sect$1 = "§";
-var shy$1 = "­";
-var sup1$1 = "¹";
-var sup2$1 = "²";
-var sup3$1 = "³";
-var szlig$1 = "ß";
-var THORN$1 = "Þ";
-var thorn$1 = "þ";
-var times$1 = "×";
-var Uacute$1 = "Ú";
-var uacute$1 = "ú";
-var Ucirc$1 = "Û";
-var ucirc$1 = "û";
-var Ugrave$1 = "Ù";
-var ugrave$1 = "ù";
-var uml$1 = "¨";
-var Uuml$1 = "Ü";
-var uuml$1 = "ü";
-var Yacute$1 = "Ý";
-var yacute$1 = "ý";
-var yen$1 = "¥";
-var yuml$1 = "ÿ";
-var legacy = {
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1
-};
-
-var legacy$1 = {
-	__proto__: null,
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1,
-	'default': legacy
-};
-
-var amp$2 = "&";
-var apos$1 = "'";
-var gt$2 = ">";
-var lt$2 = "<";
-var quot$2 = "\"";
-var xml = {
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2
-};
-
-var xml$1 = {
-	__proto__: null,
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2,
-	'default': xml
-};
-
-var decode = {
-	"0": 65533,
-	"128": 8364,
-	"130": 8218,
-	"131": 402,
-	"132": 8222,
-	"133": 8230,
-	"134": 8224,
-	"135": 8225,
-	"136": 710,
-	"137": 8240,
-	"138": 352,
-	"139": 8249,
-	"140": 338,
-	"142": 381,
-	"145": 8216,
-	"146": 8217,
-	"147": 8220,
-	"148": 8221,
-	"149": 8226,
-	"150": 8211,
-	"151": 8212,
-	"152": 732,
-	"153": 8482,
-	"154": 353,
-	"155": 8250,
-	"156": 339,
-	"158": 382,
-	"159": 376
-};
-
-var decode$1 = {
-	__proto__: null,
-	'default': decode
-};
-
-var require$$0 = getCjsExportFromNamespace(decode$1);
-
-var decode_codepoint = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var decode_json_1 = __importDefault(require$$0);
-// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
-function decodeCodePoint(codePoint) {
-    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
-        return "\uFFFD";
-    }
-    if (codePoint in decode_json_1.default) {
-        codePoint = decode_json_1.default[codePoint];
-    }
-    var output = "";
-    if (codePoint > 0xffff) {
-        codePoint -= 0x10000;
-        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
-        codePoint = 0xdc00 | (codePoint & 0x3ff);
-    }
-    output += String.fromCharCode(codePoint);
-    return output;
-}
-exports.default = decodeCodePoint;
-});
-
-var require$$1 = getCjsExportFromNamespace(entities$1);
-
-var require$$1$1 = getCjsExportFromNamespace(legacy$1);
-
-var require$$0$1 = getCjsExportFromNamespace(xml$1);
-
-var decode$2 = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
-var entities_json_1 = __importDefault(require$$1);
-var legacy_json_1 = __importDefault(require$$1$1);
-var xml_json_1 = __importDefault(require$$0$1);
-var decode_codepoint_1 = __importDefault(decode_codepoint);
-exports.decodeXML = getStrictDecoder(xml_json_1.default);
-exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
-function getStrictDecoder(map) {
-    var keys = Object.keys(map).join("|");
-    var replace = getReplacer(map);
-    keys += "|#[xX][\\da-fA-F]+|#\\d+";
-    var re = new RegExp("&(?:" + keys + ");", "g");
-    return function (str) { return String(str).replace(re, replace); };
-}
-var sorter = function (a, b) { return (a < b ? 1 : -1); };
-exports.decodeHTML = (function () {
-    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
-    var keys = Object.keys(entities_json_1.default).sort(sorter);
-    for (var i = 0, j = 0; i < keys.length; i++) {
-        if (legacy[j] === keys[i]) {
-            keys[i] += ";?";
-            j++;
-        }
-        else {
-            keys[i] += ";";
-        }
-    }
-    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
-    var replace = getReplacer(entities_json_1.default);
-    function replacer(str) {
-        if (str.substr(-1) !== ";")
-            str += ";";
-        return replace(str);
-    }
-    //TODO consider creating a merged map
-    return function (str) { return String(str).replace(re, replacer); };
-})();
-function getReplacer(map) {
-    return function replace(str) {
-        if (str.charAt(1) === "#") {
-            var secondChar = str.charAt(2);
-            if (secondChar === "X" || secondChar === "x") {
-                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
-            }
-            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
-        }
-        return map[str.slice(1, -1)];
-    };
-}
-});
-
-var encode = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.escape = exports.encodeHTML = exports.encodeXML = void 0;
-var xml_json_1 = __importDefault(require$$0$1);
-var inverseXML = getInverseObj(xml_json_1.default);
-var xmlReplacer = getInverseReplacer(inverseXML);
-exports.encodeXML = getInverse(inverseXML, xmlReplacer);
-var entities_json_1 = __importDefault(require$$1);
-var inverseHTML = getInverseObj(entities_json_1.default);
-var htmlReplacer = getInverseReplacer(inverseHTML);
-exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
-function getInverseObj(obj) {
-    return Object.keys(obj)
-        .sort()
-        .reduce(function (inverse, name) {
-        inverse[obj[name]] = "&" + name + ";";
-        return inverse;
-    }, {});
-}
-function getInverseReplacer(inverse) {
-    var single = [];
-    var multiple = [];
-    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
-        var k = _a[_i];
-        if (k.length === 1) {
-            // Add value to single array
-            single.push("\\" + k);
-        }
-        else {
-            // Add value to multiple array
-            multiple.push(k);
-        }
-    }
-    // Add ranges to single characters.
-    single.sort();
-    for (var start = 0; start < single.length - 1; start++) {
-        // Find the end of a run of characters
-        var end = start;
-        while (end < single.length - 1 &&
-            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
-            end += 1;
-        }
-        var count = 1 + end - start;
-        // We want to replace at least three characters
-        if (count < 3)
-            continue;
-        single.splice(start, count, single[start] + "-" + single[end]);
-    }
-    multiple.unshift("[" + single.join("") + "]");
-    return new RegExp(multiple.join("|"), "g");
-}
-var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
-function singleCharReplacer(c) {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";";
-}
-function getInverse(inverse, re) {
-    return function (data) {
-        return data
-            .replace(re, function (name) { return inverse[name]; })
-            .replace(reNonASCII, singleCharReplacer);
-    };
-}
-var reXmlChars = getInverseReplacer(inverseXML);
-function escape(data) {
-    return data
-        .replace(reXmlChars, singleCharReplacer)
-        .replace(reNonASCII, singleCharReplacer);
-}
-exports.escape = escape;
-});
-
-var lib$1 = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.encode = exports.decodeStrict = exports.decode = void 0;
-
-
-/**
- * Decodes a string with entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decode(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data);
-}
-exports.decode = decode;
-/**
- * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decodeStrict(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data);
-}
-exports.decodeStrict = decodeStrict;
-/**
- * Encodes a string with entities.
- *
- * @param data String to encode.
- * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function encode$1(data, level) {
-    return (!level || level <= 0 ? encode.encodeXML : encode.encodeHTML)(data);
-}
-exports.encode = encode$1;
-var encode_2 = encode;
-Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
-Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
-// Legacy aliases
-Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-var decode_2 = decode$2;
-Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-// Legacy aliases
-Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-});
-
-var elementNames = {
-	altglyph: "altGlyph",
-	altglyphdef: "altGlyphDef",
-	altglyphitem: "altGlyphItem",
-	animatecolor: "animateColor",
-	animatemotion: "animateMotion",
-	animatetransform: "animateTransform",
-	clippath: "clipPath",
-	feblend: "feBlend",
-	fecolormatrix: "feColorMatrix",
-	fecomponenttransfer: "feComponentTransfer",
-	fecomposite: "feComposite",
-	feconvolvematrix: "feConvolveMatrix",
-	fediffuselighting: "feDiffuseLighting",
-	fedisplacementmap: "feDisplacementMap",
-	fedistantlight: "feDistantLight",
-	fedropshadow: "feDropShadow",
-	feflood: "feFlood",
-	fefunca: "feFuncA",
-	fefuncb: "feFuncB",
-	fefuncg: "feFuncG",
-	fefuncr: "feFuncR",
-	fegaussianblur: "feGaussianBlur",
-	feimage: "feImage",
-	femerge: "feMerge",
-	femergenode: "feMergeNode",
-	femorphology: "feMorphology",
-	feoffset: "feOffset",
-	fepointlight: "fePointLight",
-	fespecularlighting: "feSpecularLighting",
-	fespotlight: "feSpotLight",
-	fetile: "feTile",
-	feturbulence: "feTurbulence",
-	foreignobject: "foreignObject",
-	glyphref: "glyphRef",
-	lineargradient: "linearGradient",
-	radialgradient: "radialGradient",
-	textpath: "textPath"
-};
-var attributeNames = {
-	definitionurl: "definitionURL",
-	attributename: "attributeName",
-	attributetype: "attributeType",
-	basefrequency: "baseFrequency",
-	baseprofile: "baseProfile",
-	calcmode: "calcMode",
-	clippathunits: "clipPathUnits",
-	diffuseconstant: "diffuseConstant",
-	edgemode: "edgeMode",
-	filterunits: "filterUnits",
-	glyphref: "glyphRef",
-	gradienttransform: "gradientTransform",
-	gradientunits: "gradientUnits",
-	kernelmatrix: "kernelMatrix",
-	kernelunitlength: "kernelUnitLength",
-	keypoints: "keyPoints",
-	keysplines: "keySplines",
-	keytimes: "keyTimes",
-	lengthadjust: "lengthAdjust",
-	limitingconeangle: "limitingConeAngle",
-	markerheight: "markerHeight",
-	markerunits: "markerUnits",
-	markerwidth: "markerWidth",
-	maskcontentunits: "maskContentUnits",
-	maskunits: "maskUnits",
-	numoctaves: "numOctaves",
-	pathlength: "pathLength",
-	patterncontentunits: "patternContentUnits",
-	patterntransform: "patternTransform",
-	patternunits: "patternUnits",
-	pointsatx: "pointsAtX",
-	pointsaty: "pointsAtY",
-	pointsatz: "pointsAtZ",
-	preservealpha: "preserveAlpha",
-	preserveaspectratio: "preserveAspectRatio",
-	primitiveunits: "primitiveUnits",
-	refx: "refX",
-	refy: "refY",
-	repeatcount: "repeatCount",
-	repeatdur: "repeatDur",
-	requiredextensions: "requiredExtensions",
-	requiredfeatures: "requiredFeatures",
-	specularconstant: "specularConstant",
-	specularexponent: "specularExponent",
-	spreadmethod: "spreadMethod",
-	startoffset: "startOffset",
-	stddeviation: "stdDeviation",
-	stitchtiles: "stitchTiles",
-	surfacescale: "surfaceScale",
-	systemlanguage: "systemLanguage",
-	tablevalues: "tableValues",
-	targetx: "targetX",
-	targety: "targetY",
-	textlength: "textLength",
-	viewbox: "viewBox",
-	viewtarget: "viewTarget",
-	xchannelselector: "xChannelSelector",
-	ychannelselector: "yChannelSelector",
-	zoomandpan: "zoomAndPan"
-};
-var foreignNames = {
-	elementNames: elementNames,
-	attributeNames: attributeNames
-};
-
-var foreignNames$1 = {
-	__proto__: null,
-	elementNames: elementNames,
-	attributeNames: attributeNames,
-	'default': foreignNames
-};
-
-var foreignNames$2 = getCjsExportFromNamespace(foreignNames$1);
-
-var domSerializer = createCommonjsModule(function (module) {
-/*
-  Module dependencies
-*/
-
-
-
-/* mixed-case SVG and MathML tags & attributes
-   recognized by the HTML parser, see
-   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
-*/
-
-foreignNames$2.elementNames.__proto__ = null; /* use as a simple dictionary */
-foreignNames$2.attributeNames.__proto__ = null;
-
-var unencodedElements = {
-  __proto__: null,
-  style: true,
-  script: true,
-  xmp: true,
-  iframe: true,
-  noembed: true,
-  noframes: true,
-  plaintext: true,
-  noscript: true
-};
-
-/*
-  Format attributes
-*/
-function formatAttrs(attributes, opts) {
-  if (!attributes) return;
-
-  var output = '';
-  var value;
-
-  // Loop through the attributes
-  for (var key in attributes) {
-    value = attributes[key];
-    if (output) {
-      output += ' ';
-    }
-
-    if (opts.xmlMode === 'foreign') {
-      /* fix up mixed-case attribute names */
-      key = foreignNames$2.attributeNames[key] || key;
-    }
-    output += key;
-    if ((value !== null && value !== '') || opts.xmlMode) {
-      output +=
-        '="' +
-        (opts.decodeEntities
-          ? lib$1.encodeXML(value)
-          : value.replace(/\"/g, '&quot;')) +
-        '"';
-    }
-  }
-
-  return output;
-}
-
-/*
-  Self-enclosing tags (stolen from node-htmlparser)
-*/
-var singleTag = {
-  __proto__: null,
-  area: true,
-  base: true,
-  basefont: true,
-  br: true,
-  col: true,
-  command: true,
-  embed: true,
-  frame: true,
-  hr: true,
-  img: true,
-  input: true,
-  isindex: true,
-  keygen: true,
-  link: true,
-  meta: true,
-  param: true,
-  source: true,
-  track: true,
-  wbr: true
-};
-
-var render = (module.exports = function(dom, opts) {
-  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];
-  opts = opts || {};
-
-  var output = '';
-
-  for (var i = 0; i < dom.length; i++) {
-    var elem = dom[i];
-
-    if (elem.type === 'root') output += render(elem.children, opts);
-    else if (lib.isTag(elem)) output += renderTag(elem, opts);
-    else if (elem.type === lib.Directive)
-      output += renderDirective(elem);
-    else if (elem.type === lib.Comment) output += renderComment(elem);
-    else if (elem.type === lib.CDATA) output += renderCdata(elem);
-    else output += renderText(elem, opts);
-  }
-
-  return output;
-});
-
-var foreignModeIntegrationPoints = [
-  'mi',
-  'mo',
-  'mn',
-  'ms',
-  'mtext',
-  'annotation-xml',
-  'foreignObject',
-  'desc',
-  'title'
-];
-
-function renderTag(elem, opts) {
-  // Handle SVG / MathML in HTML
-  if (opts.xmlMode === 'foreign') {
-    /* fix up mixed-case element names */
-    elem.name = foreignNames$2.elementNames[elem.name] || elem.name;
-    /* exit foreign mode at integration points */
-    if (
-      elem.parent &&
-      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0
-    )
-      opts = Object.assign({}, opts, { xmlMode: false });
-  }
-  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {
-    opts = Object.assign({}, opts, { xmlMode: 'foreign' });
-  }
-
-  var tag = '<' + elem.name;
-  var attribs = formatAttrs(elem.attribs, opts);
-
-  if (attribs) {
-    tag += ' ' + attribs;
-  }
-
-  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {
-    tag += '/>';
-  } else {
-    tag += '>';
-    if (elem.children) {
-      tag += render(elem.children, opts);
-    }
-
-    if (!singleTag[elem.name] || opts.xmlMode) {
-      tag += '</' + elem.name + '>';
-    }
-  }
-
-  return tag;
-}
-
-function renderDirective(elem) {
-  return '<' + elem.data + '>';
-}
-
-function renderText(elem, opts) {
-  var data = elem.data || '';
-
-  // if entities weren't decoded, no need to encode them back
-  if (
-    opts.decodeEntities &&
-    !(elem.parent && elem.parent.name in unencodedElements)
-  ) {
-    data = lib$1.encodeXML(data);
-  }
-
-  return data;
-}
-
-function renderCdata(elem) {
-  return '<![CDATA[' + elem.children[0].data + ']]>';
-}
-
-function renderComment(elem) {
-  return '<!--' + elem.data + '-->';
-}
-});
-
-var isTag = domelementtype.isTag;
-
-var stringify = {
-	getInnerHTML: getInnerHTML,
-	getOuterHTML: domSerializer,
-	getText: getText
-};
-
-function getInnerHTML(elem, opts){
-	return elem.children ? elem.children.map(function(elem){
-		return domSerializer(elem, opts);
-	}).join("") : "";
-}
-
-function getText(elem){
-	if(Array.isArray(elem)) return elem.map(getText).join("");
-	if(isTag(elem) || elem.type === domelementtype.CDATA) return getText(elem.children);
-	if(elem.type === domelementtype.Text) return elem.data;
-	return "";
-}
-
-var traversal = createCommonjsModule(function (module, exports) {
-var getChildren = exports.getChildren = function(elem){
-	return elem.children;
-};
-
-var getParent = exports.getParent = function(elem){
-	return elem.parent;
-};
-
-exports.getSiblings = function(elem){
-	var parent = getParent(elem);
-	return parent ? getChildren(parent) : [elem];
-};
-
-exports.getAttributeValue = function(elem, name){
-	return elem.attribs && elem.attribs[name];
-};
-
-exports.hasAttrib = function(elem, name){
-	return !!elem.attribs && hasOwnProperty.call(elem.attribs, name);
-};
-
-exports.getName = function(elem){
-	return elem.name;
-};
-});
-
-var removeElement = function(elem){
-	if(elem.prev) elem.prev.next = elem.next;
-	if(elem.next) elem.next.prev = elem.prev;
-
-	if(elem.parent){
-		var childs = elem.parent.children;
-		childs.splice(childs.lastIndexOf(elem), 1);
-	}
-};
-
-var replaceElement = function(elem, replacement){
-	var prev = replacement.prev = elem.prev;
-	if(prev){
-		prev.next = replacement;
-	}
-
-	var next = replacement.next = elem.next;
-	if(next){
-		next.prev = replacement;
-	}
-
-	var parent = replacement.parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs[childs.lastIndexOf(elem)] = replacement;
-	}
-};
-
-var appendChild = function(elem, child){
-	child.parent = elem;
-
-	if(elem.children.push(child) !== 1){
-		var sibling = elem.children[elem.children.length - 2];
-		sibling.next = child;
-		child.prev = sibling;
-		child.next = null;
-	}
-};
-
-var append = function(elem, next){
-	var parent = elem.parent,
-		currNext = elem.next;
-
-	next.next = currNext;
-	next.prev = elem;
-	elem.next = next;
-	next.parent = parent;
-
-	if(currNext){
-		currNext.prev = next;
-		if(parent){
-			var childs = parent.children;
-			childs.splice(childs.lastIndexOf(currNext), 0, next);
-		}
-	} else if(parent){
-		parent.children.push(next);
-	}
-};
-
-var prepend = function(elem, prev){
-	var parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs.splice(childs.lastIndexOf(elem), 0, prev);
-	}
-
-	if(elem.prev){
-		elem.prev.next = prev;
-	}
-	
-	prev.parent = parent;
-	prev.prev = elem.prev;
-	prev.next = elem;
-	elem.prev = prev;
-};
-
-var manipulation = {
-	removeElement: removeElement,
-	replaceElement: replaceElement,
-	appendChild: appendChild,
-	append: append,
-	prepend: prepend
-};
-
-var isTag$1 = domelementtype.isTag;
-
-var querying = {
-	filter: filter,
-	find: find,
-	findOneChild: findOneChild,
-	findOne: findOne,
-	existsOne: existsOne,
-	findAll: findAll
-};
-
-function filter(test, element, recurse, limit){
-	if(!Array.isArray(element)) element = [element];
-
-	if(typeof limit !== "number" || !isFinite(limit)){
-		limit = Infinity;
-	}
-	return find(test, element, recurse !== false, limit);
-}
-
-function find(test, elems, recurse, limit){
-	var result = [], childs;
-
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(test(elems[i])){
-			result.push(elems[i]);
-			if(--limit <= 0) break;
-		}
-
-		childs = elems[i].children;
-		if(recurse && childs && childs.length > 0){
-			childs = find(test, childs, recurse, limit);
-			result = result.concat(childs);
-			limit -= childs.length;
-			if(limit <= 0) break;
-		}
-	}
-
-	return result;
-}
-
-function findOneChild(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(test(elems[i])) return elems[i];
-	}
-
-	return null;
-}
-
-function findOne(test, elems){
-	var elem = null;
-
-	for(var i = 0, l = elems.length; i < l && !elem; i++){
-		if(!isTag$1(elems[i])){
-			continue;
-		} else if(test(elems[i])){
-			elem = elems[i];
-		} else if(elems[i].children.length > 0){
-			elem = findOne(test, elems[i].children);
-		}
-	}
-
-	return elem;
-}
-
-function existsOne(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(
-			isTag$1(elems[i]) && (
-				test(elems[i]) || (
-					elems[i].children.length > 0 &&
-					existsOne(test, elems[i].children)
-				)
-			)
-		){
-			return true;
-		}
-	}
-
-	return false;
-}
-
-function findAll(test, elems){
-	var result = [];
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(!isTag$1(elems[i])) continue;
-		if(test(elems[i])) result.push(elems[i]);
-
-		if(elems[i].children.length > 0){
-			result = result.concat(findAll(test, elems[i].children));
-		}
-	}
-	return result;
-}
-
-var legacy$2 = createCommonjsModule(function (module, exports) {
-var isTag = exports.isTag = domelementtype.isTag;
-
-exports.testElement = function(options, element){
-	for(var key in options){
-		if(!options.hasOwnProperty(key));
-		else if(key === "tag_name"){
-			if(!isTag(element) || !options.tag_name(element.name)){
-				return false;
-			}
-		} else if(key === "tag_type"){
-			if(!options.tag_type(element.type)) return false;
-		} else if(key === "tag_contains"){
-			if(isTag(element) || !options.tag_contains(element.data)){
-				return false;
-			}
-		} else if(!element.attribs || !options[key](element.attribs[key])){
-			return false;
-		}
-	}
-	return true;
-};
-
-var Checks = {
-	tag_name: function(name){
-		if(typeof name === "function"){
-			return function(elem){ return isTag(elem) && name(elem.name); };
-		} else if(name === "*"){
-			return isTag;
-		} else {
-			return function(elem){ return isTag(elem) && elem.name === name; };
-		}
-	},
-	tag_type: function(type){
-		if(typeof type === "function"){
-			return function(elem){ return type(elem.type); };
-		} else {
-			return function(elem){ return elem.type === type; };
-		}
-	},
-	tag_contains: function(data){
-		if(typeof data === "function"){
-			return function(elem){ return !isTag(elem) && data(elem.data); };
-		} else {
-			return function(elem){ return !isTag(elem) && elem.data === data; };
-		}
-	}
-};
-
-function getAttribCheck(attrib, value){
-	if(typeof value === "function"){
-		return function(elem){ return elem.attribs && value(elem.attribs[attrib]); };
-	} else {
-		return function(elem){ return elem.attribs && elem.attribs[attrib] === value; };
-	}
-}
-
-function combineFuncs(a, b){
-	return function(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-exports.getElements = function(options, element, recurse, limit){
-	var funcs = Object.keys(options).map(function(key){
-		var value = options[key];
-		return key in Checks ? Checks[key](value) : getAttribCheck(key, value);
-	});
-
-	return funcs.length === 0 ? [] : this.filter(
-		funcs.reduce(combineFuncs),
-		element, recurse, limit
-	);
-};
-
-exports.getElementById = function(id, element, recurse){
-	if(!Array.isArray(element)) element = [element];
-	return this.findOne(getAttribCheck("id", id), element, recurse !== false);
-};
-
-exports.getElementsByTagName = function(name, element, recurse, limit){
-	return this.filter(Checks.tag_name(name), element, recurse, limit);
-};
-
-exports.getElementsByTagType = function(type, element, recurse, limit){
-	return this.filter(Checks.tag_type(type), element, recurse, limit);
-};
-});
-
-var helpers = createCommonjsModule(function (module, exports) {
-// removeSubsets
-// Given an array of nodes, remove any member that is contained by another.
-exports.removeSubsets = function(nodes) {
-	var idx = nodes.length, node, ancestor, replace;
-
-	// Check if each node (or one of its ancestors) is already contained in the
-	// array.
-	while (--idx > -1) {
-		node = ancestor = nodes[idx];
-
-		// Temporarily remove the node under consideration
-		nodes[idx] = null;
-		replace = true;
-
-		while (ancestor) {
-			if (nodes.indexOf(ancestor) > -1) {
-				replace = false;
-				nodes.splice(idx, 1);
-				break;
-			}
-			ancestor = ancestor.parent;
-		}
-
-		// If the node has been found to be unique, re-insert it.
-		if (replace) {
-			nodes[idx] = node;
-		}
-	}
-
-	return nodes;
-};
-
-// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition
-var POSITION = {
-	DISCONNECTED: 1,
-	PRECEDING: 2,
-	FOLLOWING: 4,
-	CONTAINS: 8,
-	CONTAINED_BY: 16
-};
-
-// Compare the position of one node against another node in any other document.
-// The return value is a bitmask with the following values:
-//
-// document order:
-// > There is an ordering, document order, defined on all the nodes in the
-// > document corresponding to the order in which the first character of the
-// > XML representation of each node occurs in the XML representation of the
-// > document after expansion of general entities. Thus, the document element
-// > node will be the first node. Element nodes occur before their children.
-// > Thus, document order orders element nodes in order of the occurrence of
-// > their start-tag in the XML (after expansion of entities). The attribute
-// > nodes of an element occur after the element and before its children. The
-// > relative order of attribute nodes is implementation-dependent./
-// Source:
-// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
-//
-// @argument {Node} nodaA The first node to use in the comparison
-// @argument {Node} nodeB The second node to use in the comparison
-//
-// @return {Number} A bitmask describing the input nodes' relative position.
-//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
-//         a description of these values.
-var comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {
-	var aParents = [];
-	var bParents = [];
-	var current, sharedParent, siblings, aSibling, bSibling, idx;
-
-	if (nodeA === nodeB) {
-		return 0;
-	}
-
-	current = nodeA;
-	while (current) {
-		aParents.unshift(current);
-		current = current.parent;
-	}
-	current = nodeB;
-	while (current) {
-		bParents.unshift(current);
-		current = current.parent;
-	}
-
-	idx = 0;
-	while (aParents[idx] === bParents[idx]) {
-		idx++;
-	}
-
-	if (idx === 0) {
-		return POSITION.DISCONNECTED;
-	}
-
-	sharedParent = aParents[idx - 1];
-	siblings = sharedParent.children;
-	aSibling = aParents[idx];
-	bSibling = bParents[idx];
-
-	if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
-		if (sharedParent === nodeB) {
-			return POSITION.FOLLOWING | POSITION.CONTAINED_BY;
-		}
-		return POSITION.FOLLOWING;
-	} else {
-		if (sharedParent === nodeA) {
-			return POSITION.PRECEDING | POSITION.CONTAINS;
-		}
-		return POSITION.PRECEDING;
-	}
-};
-
-// Sort an array of nodes based on their relative position in the document and
-// remove any duplicate nodes. If the array contains nodes that do not belong
-// to the same document, sort order is unspecified.
-//
-// @argument {Array} nodes Array of DOM nodes
-//
-// @returns {Array} collection of unique nodes, sorted in document order
-exports.uniqueSort = function(nodes) {
-	var idx = nodes.length, node, position;
-
-	nodes = nodes.slice();
-
-	while (--idx > -1) {
-		node = nodes[idx];
-		position = nodes.indexOf(node);
-		if (position > -1 && position < idx) {
-			nodes.splice(idx, 1);
-		}
-	}
-	nodes.sort(function(a, b) {
-		var relative = comparePos(a, b);
-		if (relative & POSITION.PRECEDING) {
-			return -1;
-		} else if (relative & POSITION.FOLLOWING) {
-			return 1;
-		}
-		return 0;
-	});
-
-	return nodes;
-};
-});
-
-var domutils = createCommonjsModule(function (module) {
-var DomUtils = module.exports;
-
-[
-	stringify,
-	traversal,
-	manipulation,
-	querying,
-	legacy$2,
-	helpers
-].forEach(function(ext){
-	Object.keys(ext).forEach(function(key){
-		DomUtils[key] = ext[key].bind(DomUtils);
-	});
-});
-});
-
-var parse_1 = parse;
-
-//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
-
-//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
-var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
-
-/*
-	parses a nth-check formula, returns an array of two numbers
-*/
-function parse(formula){
-	formula = formula.trim().toLowerCase();
-
-	if(formula === "even"){
-		return [2, 0];
-	} else if(formula === "odd"){
-		return [2, 1];
-	} else {
-		var parsed = formula.match(re_nthElement);
-
-		if(!parsed){
-			throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')");
-		}
-
-		var a;
-
-		if(parsed[1]){
-			a = parseInt(parsed[1], 10);
-			if(isNaN(a)){
-				if(parsed[1].charAt(0) === "-") a = -1;
-				else a = 1;
-			}
-		} else a = 0;
-
-		return [
-			a,
-			parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0
-		];
-	}
-}
-
-var boolbase = {
-	trueFunc: function trueFunc(){
-		return true;
-	},
-	falseFunc: function falseFunc(){
-		return false;
-	}
-};
-
-var compile_1 = compile;
-
-var trueFunc  = boolbase.trueFunc,
-    falseFunc = boolbase.falseFunc;
-
-/*
-	returns a function that checks if an elements index matches the given rule
-	highly optimized to return the fastest solution
-*/
-function compile(parsed){
-	var a = parsed[0],
-	    b = parsed[1] - 1;
-
-	//when b <= 0, a*n won't be possible for any matches when a < 0
-	//besides, the specification says that no element is matched when a and b are 0
-	if(b < 0 && a <= 0) return falseFunc;
-
-	//when a is in the range -1..1, it matches any element (so only b is checked)
-	if(a ===-1) return function(pos){ return pos <= b; };
-	if(a === 0) return function(pos){ return pos === b; };
-	//when b <= 0 and a === 1, they match any element
-	if(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };
-
-	//when a > 0, modulo can be used to check if there is a match
-	var bMod = b % a;
-	if(bMod < 0) bMod += a;
-
-	if(a > 1){
-		return function(pos){
-			return pos >= b && pos % a === bMod;
-		};
-	}
-
-	a *= -1; //make `a` positive
-
-	return function(pos){
-		return pos <= b && pos % a === bMod;
-	};
-}
-
-var nthCheck = function nthCheck(formula){
-	return compile_1(parse_1(formula));
-};
-
-var parse_1$1 = parse_1;
-var compile_1$1 = compile_1;
-nthCheck.parse = parse_1$1;
-nthCheck.compile = compile_1$1;
-
-var hasAttrib = domutils.hasAttrib,
-    getAttributeValue = domutils.getAttributeValue,
-    falseFunc$1 = boolbase.falseFunc;
-
-//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469
-var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
-
-/*
-	attribute selectors
-*/
-
-var attributeRules = {
-	__proto__: null,
-	equals: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function equalsIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function equals(elem){
-			return getAttributeValue(elem, name) === value && next(elem);
-		};
-	},
-	hyphen: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function hyphenIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null &&
-						(attr.length === len || attr.charAt(len) === "-") &&
-						attr.substr(0, len).toLowerCase() === value &&
-						next(elem);
-			};
-		}
-
-		return function hyphen(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null &&
-					attr.substr(0, len) === value &&
-					(attr.length === len || attr.charAt(len) === "-") &&
-					next(elem);
-		};
-	},
-	element: function(next, data){
-		var name = data.name,
-		    value = data.value;
-
-		if(/\s/.test(value)){
-			return falseFunc$1;
-		}
-
-		value = value.replace(reChars, "\\$&");
-
-		var pattern = "(?:^|\\s)" + value + "(?:$|\\s)",
-		    flags = data.ignoreCase ? "i" : "",
-		    regex = new RegExp(pattern, flags);
-
-		return function element(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && regex.test(attr) && next(elem);
-		};
-	},
-	exists: function(next, data){
-		var name = data.name;
-		return function exists(elem){
-			return hasAttrib(elem, name) && next(elem);
-		};
-	},
-	start: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-		
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function startIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function start(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(0, len) === value && next(elem);
-		};
-	},
-	end: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len   = -value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function endIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function end(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(len) === value && next(elem);
-		};
-	},
-	any: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			var regex = new RegExp(value.replace(reChars, "\\$&"), "i");
-
-			return function anyIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && regex.test(attr) && next(elem);
-			};
-		}
-
-		return function any(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.indexOf(value) >= 0 && next(elem);
-		};
-	},
-	not: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return function notEmpty(elem){
-				return !!getAttributeValue(elem, name) && next(elem);
-			};
-		} else if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function notIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() !== value && next(elem);
-			};
-		}
-
-		return function not(elem){
-			return getAttributeValue(elem, name) !== value && next(elem);
-		};
-	}
-};
-
-var attributes = {
-	compile: function(next, data, options){
-		if(options && options.strict && (
-			data.ignoreCase || data.action === "not"
-		)) throw SyntaxError("Unsupported attribute selector");
-		return attributeRules[data.action](next, data);
-	},
-	rules: attributeRules
-};
-
-/*
-	pseudo selectors
-
-	---
-
-	they are available in two forms:
-	* filters called when the selector
-	  is compiled and return a function
-	  that needs to return next()
-	* pseudos get called on execution
-	  they need to return a boolean
-*/
-
-var isTag$2       = domutils.isTag,
-    getText$1     = domutils.getText,
-    getParent   = domutils.getParent,
-    getChildren = domutils.getChildren,
-    getSiblings = domutils.getSiblings,
-    hasAttrib$1   = domutils.hasAttrib,
-    getName     = domutils.getName,
-    getAttribute= domutils.getAttributeValue,
-    checkAttrib = attributes.rules.equals,
-    trueFunc$1    = boolbase.trueFunc,
-    falseFunc$2   = boolbase.falseFunc;
-
-//helper methods
-function getFirstElement(elems){
-	for(var i = 0; elems && i < elems.length; i++){
-		if(isTag$2(elems[i])) return elems[i];
-	}
-}
-
-function getAttribFunc(name, value){
-	var data = {name: name, value: value};
-	return function attribFunc(next){
-		return checkAttrib(next, data);
-	};
-}
-
-function getChildFunc(next){
-	return function(elem){
-		return !!getParent(elem) && next(elem);
-	};
-}
-
-var filters = {
-	contains: function(next, text){
-		return function contains(elem){
-			return next(elem) && getText$1(elem).indexOf(text) >= 0;
-		};
-	},
-	icontains: function(next, text){
-		var itext = text.toLowerCase();
-		return function icontains(elem){
-			return next(elem) &&
-				getText$1(elem).toLowerCase().indexOf(itext) >= 0;
-		};
-	},
-
-	//location specific methods
-	"nth-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0, pos = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-
-    //TODO determine the actual root element
-    root: function(next){
-        return function(elem){
-            return !getParent(elem) && next(elem);
-        };
-    },
-
-    scope: function(next, rule, options, context){
-        if(!context || context.length === 0){
-            //equivalent to :root
-            return filters.root(next);
-        }
-
-        if(context.length === 1){
-            //NOTE: can't be unpacked, as :has uses this for side-effects
-            return function(elem){
-                return context[0] === elem && next(elem);
-            };
-        }
-
-        return function(elem){
-            return context.indexOf(elem) >= 0 && next(elem);
-        };
-    },
-
-	//jQuery extensions (others follow as pseudos)
-	checkbox: getAttribFunc("type", "checkbox"),
-	file: getAttribFunc("type", "file"),
-	password: getAttribFunc("type", "password"),
-	radio: getAttribFunc("type", "radio"),
-	reset: getAttribFunc("type", "reset"),
-	image: getAttribFunc("type", "image"),
-	submit: getAttribFunc("type", "submit")
-};
-
-//while filters are precompiled, pseudos get called when they are needed
-var pseudos = {
-	empty: function(elem){
-		return !getChildren(elem).some(function(elem){
-			return isTag$2(elem) || elem.type === "text";
-		});
-	},
-
-	"first-child": function(elem){
-		return getFirstElement(getSiblings(elem)) === elem;
-	},
-	"last-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length - 1; i >= 0; i--){
-			if(siblings[i] === elem) return true;
-			if(isTag$2(siblings[i])) break;
-		}
-
-		return false;
-	},
-	"first-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"last-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length-1; i >= 0; i--){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"only-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0, j = siblings.length; i < j; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) continue;
-				if(getName(siblings[i]) === getName(elem)) return false;
-			}
-		}
-
-		return true;
-	},
-	"only-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i]) && siblings[i] !== elem) return false;
-		}
-
-		return true;
-	},
-
-	//:matches(a, area, link)[href]
-	link: function(elem){
-		return hasAttrib$1(elem, "href");
-	},
-	visited: falseFunc$2, //seems to be a valid implementation
-	//TODO: :any-link once the name is finalized (as an alias of :link)
-
-	//forms
-	//to consider: :target
-
-	//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)
-	selected: function(elem){
-		if(hasAttrib$1(elem, "selected")) return true;
-		else if(getName(elem) !== "option") return false;
-
-		//the first <option> in a <select> is also selected
-		var parent = getParent(elem);
-
-		if(
-			!parent ||
-			getName(parent) !== "select" ||
-			hasAttrib$1(parent, "multiple")
-		) return false;
-
-		var siblings = getChildren(parent),
-			sawElem  = false;
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem){
-					sawElem = true;
-				} else if(!sawElem){
-					return false;
-				} else if(hasAttrib$1(siblings[i], "selected")){
-					return false;
-				}
-			}
-		}
-
-		return sawElem;
-	},
-	//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
-	//:matches(
-	//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],
-	//  optgroup[disabled] > option),
-	// fieldset[disabled] * //TODO not child of first <legend>
-	//)
-	disabled: function(elem){
-		return hasAttrib$1(elem, "disabled");
-	},
-	enabled: function(elem){
-		return !hasAttrib$1(elem, "disabled");
-	},
-	//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)
-	checked: function(elem){
-		return hasAttrib$1(elem, "checked") || pseudos.selected(elem);
-	},
-	//:matches(input, select, textarea)[required]
-	required: function(elem){
-		return hasAttrib$1(elem, "required");
-	},
-	//:matches(input, select, textarea):not([required])
-	optional: function(elem){
-		return !hasAttrib$1(elem, "required");
-	},
-
-	//jQuery extensions
-
-	//:not(:empty)
-	parent: function(elem){
-		return !pseudos.empty(elem);
-	},
-	//:matches(h1, h2, h3, h4, h5, h6)
-	header: function(elem){
-		var name = getName(elem);
-		return name === "h1" ||
-		       name === "h2" ||
-		       name === "h3" ||
-		       name === "h4" ||
-		       name === "h5" ||
-		       name === "h6";
-	},
-
-	//:matches(button, input[type=button])
-	button: function(elem){
-		var name = getName(elem);
-		return name === "button" ||
-		       name === "input" &&
-		       getAttribute(elem, "type") === "button";
-	},
-	//:matches(input, textarea, select, button)
-	input: function(elem){
-		var name = getName(elem);
-		return name === "input" ||
-		       name === "textarea" ||
-		       name === "select" ||
-		       name === "button";
-	},
-	//input:matches(:not([type!='']), [type='text' i])
-	text: function(elem){
-		var attr;
-		return getName(elem) === "input" && (
-			!(attr = getAttribute(elem, "type")) ||
-			attr.toLowerCase() === "text"
-		);
-	}
-};
-
-function verifyArgs(func, name, subselect){
-	if(subselect === null){
-		if(func.length > 1 && name !== "scope"){
-			throw new SyntaxError("pseudo-selector :" + name + " requires an argument");
-		}
-	} else {
-		if(func.length === 1){
-			throw new SyntaxError("pseudo-selector :" + name + " doesn't have any arguments");
-		}
-	}
-}
-
-//FIXME this feels hacky
-var re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;
-
-var pseudos_1 = {
-	compile: function(next, data, options, context){
-		var name = data.name,
-			subselect = data.data;
-
-		if(options && options.strict && !re_CSS3.test(name)){
-			throw SyntaxError(":" + name + " isn't part of CSS3");
-		}
-
-		if(typeof filters[name] === "function"){
-			verifyArgs(filters[name], name,  subselect);
-			return filters[name](next, subselect, options, context);
-		} else if(typeof pseudos[name] === "function"){
-			var func = pseudos[name];
-			verifyArgs(func, name, subselect);
-
-			if(next === trueFunc$1) return func;
-
-			return function pseudoArgs(elem){
-				return func(elem, subselect) && next(elem);
-			};
-		} else {
-			throw new SyntaxError("unmatched pseudo-class :" + name);
-		}
-	},
-	filters: filters,
-	pseudos: pseudos
-};
-
-var cssWhat = parse$1;
-
-var re_name = /^(?:\\.|[\w\-\u00b0-\uFFFF])+/,
-    re_escape = /\\([\da-f]{1,6}\s?|(\s)|.)/ig,
-    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
-    re_attr = /^\s*((?:\\.|[\w\u00b0-\uFFFF\-])+)\s*(?:(\S?)=\s*(?:(['"])([^]*?)\3|(#?(?:\\.|[\w\u00b0-\uFFFF\-])*)|)|)\s*(i)?\]/;
-
-var actionTypes = {
-	__proto__: null,
-	"undefined": "exists",
-	"":  "equals",
-	"~": "element",
-	"^": "start",
-	"$": "end",
-	"*": "any",
-	"!": "not",
-	"|": "hyphen"
-};
-
-var simpleSelectors = {
-	__proto__: null,
-	">": "child",
-	"<": "parent",
-	"~": "sibling",
-	"+": "adjacent"
-};
-
-var attribSelectors = {
-	__proto__: null,
-	"#": ["id", "equals"],
-	".": ["class", "element"]
-};
-
-//pseudos, whose data-property is parsed as well
-var unpackPseudos = {
-	__proto__: null,
-	"has": true,
-	"not": true,
-	"matches": true
-};
-
-var stripQuotesFromPseudos = {
-	__proto__: null,
-	"contains": true,
-	"icontains": true
-};
-
-var quotes = {
-	__proto__: null,
-	"\"": true,
-	"'": true
-};
-
-//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
-function funescape( _, escaped, escapedWhitespace ) {
-	var high = "0x" + escaped - 0x10000;
-	// NaN means non-codepoint
-	// Support: Firefox
-	// Workaround erroneous numeric interpretation of +"0x"
-	return high !== high || escapedWhitespace ?
-		escaped :
-		// BMP codepoint
-		high < 0 ?
-			String.fromCharCode( high + 0x10000 ) :
-			// Supplemental Plane codepoint (surrogate pair)
-			String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-}
-
-function unescapeCSS(str){
-	return str.replace(re_escape, funescape);
-}
-
-function isWhitespace(c){
-	return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
-}
-
-function parse$1(selector, options){
-	var subselects = [];
-
-	selector = parseSelector(subselects, selector + "", options);
-
-	if(selector !== ""){
-		throw new SyntaxError("Unmatched selector: " + selector);
-	}
-
-	return subselects;
-}
-
-function parseSelector(subselects, selector, options){
-	var tokens = [],
-		sawWS = false,
-		data, firstChar, name, quot;
-
-	function getName(){
-		var sub = selector.match(re_name)[0];
-		selector = selector.substr(sub.length);
-		return unescapeCSS(sub);
-	}
-
-	function stripWhitespace(start){
-		while(isWhitespace(selector.charAt(start))) start++;
-		selector = selector.substr(start);
-	}
-
-	function isEscaped(pos) {
-		var slashCount = 0;
-
-		while (selector.charAt(--pos) === "\\") slashCount++;
-		return (slashCount & 1) === 1;
-	}
-
-	stripWhitespace(0);
-
-	while(selector !== ""){
-		firstChar = selector.charAt(0);
-
-		if(isWhitespace(firstChar)){
-			sawWS = true;
-			stripWhitespace(1);
-		} else if(firstChar in simpleSelectors){
-			tokens.push({type: simpleSelectors[firstChar]});
-			sawWS = false;
-
-			stripWhitespace(1);
-		} else if(firstChar === ","){
-			if(tokens.length === 0){
-				throw new SyntaxError("empty sub-selector");
-			}
-			subselects.push(tokens);
-			tokens = [];
-			sawWS = false;
-			stripWhitespace(1);
-		} else {
-			if(sawWS){
-				if(tokens.length > 0){
-					tokens.push({type: "descendant"});
-				}
-				sawWS = false;
-			}
-
-			if(firstChar === "*"){
-				selector = selector.substr(1);
-				tokens.push({type: "universal"});
-			} else if(firstChar in attribSelectors){
-				selector = selector.substr(1);
-				tokens.push({
-					type: "attribute",
-					name: attribSelectors[firstChar][0],
-					action: attribSelectors[firstChar][1],
-					value: getName(),
-					ignoreCase: false
-				});
-			} else if(firstChar === "["){
-				selector = selector.substr(1);
-				data = selector.match(re_attr);
-				if(!data){
-					throw new SyntaxError("Malformed attribute selector: " + selector);
-				}
-				selector = selector.substr(data[0].length);
-				name = unescapeCSS(data[1]);
-
-				if(
-					!options || (
-						"lowerCaseAttributeNames" in options ?
-							options.lowerCaseAttributeNames :
-							!options.xmlMode
-					)
-				){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({
-					type: "attribute",
-					name: name,
-					action: actionTypes[data[2]],
-					value: unescapeCSS(data[4] || data[5] || ""),
-					ignoreCase: !!data[6]
-				});
-
-			} else if(firstChar === ":"){
-				if(selector.charAt(1) === ":"){
-					selector = selector.substr(2);
-					tokens.push({type: "pseudo-element", name: getName().toLowerCase()});
-					continue;
-				}
-
-				selector = selector.substr(1);
-
-				name = getName().toLowerCase();
-				data = null;
-
-				if(selector.charAt(0) === "("){
-					if(name in unpackPseudos){
-						quot = selector.charAt(1);
-						var quoted = quot in quotes;
-
-						selector = selector.substr(quoted + 1);
-
-						data = [];
-						selector = parseSelector(data, selector, options);
-
-						if(quoted){
-							if(selector.charAt(0) !== quot){
-								throw new SyntaxError("unmatched quotes in :" + name);
-							} else {
-								selector = selector.substr(1);
-							}
-						}
-
-						if(selector.charAt(0) !== ")"){
-							throw new SyntaxError("missing closing parenthesis in :" + name + " " + selector);
-						}
-
-						selector = selector.substr(1);
-					} else {
-						var pos = 1, counter = 1;
-
-						for(; counter > 0 && pos < selector.length; pos++){
-							if(selector.charAt(pos) === "(" && !isEscaped(pos)) counter++;
-							else if(selector.charAt(pos) === ")" && !isEscaped(pos)) counter--;
-						}
-
-						if(counter){
-							throw new SyntaxError("parenthesis not matched");
-						}
-
-						data = selector.substr(1, pos - 2);
-						selector = selector.substr(pos);
-
-						if(name in stripQuotesFromPseudos){
-							quot = data.charAt(0);
-
-							if(quot === data.slice(-1) && quot in quotes){
-								data = data.slice(1, -1);
-							}
-
-							data = unescapeCSS(data);
-						}
-					}
-				}
-
-				tokens.push({type: "pseudo", name: name, data: data});
-			} else if(re_name.test(selector)){
-				name = getName();
-
-				if(!options || ("lowerCaseTags" in options ? options.lowerCaseTags : !options.xmlMode)){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({type: "tag", name: name});
-			} else {
-				if(tokens.length && tokens[tokens.length - 1].type === "descendant"){
-					tokens.pop();
-				}
-				addToken(subselects, tokens);
-				return selector;
-			}
-		}
-	}
-
-	addToken(subselects, tokens);
-
-	return selector;
-}
-
-function addToken(subselects, tokens){
-	if(subselects.length > 0 && tokens.length === 0){
-		throw new SyntaxError("empty sub-selector");
-	}
-
-	subselects.push(tokens);
-}
-
-var isTag$3       = domutils.isTag,
-    getParent$1   = domutils.getParent,
-    getChildren$1 = domutils.getChildren,
-    getSiblings$1 = domutils.getSiblings,
-    getName$1     = domutils.getName;
-
-/*
-	all available rules
-*/
-var general = {
-	__proto__: null,
-
-	attribute: attributes.compile,
-	pseudo: pseudos_1.compile,
-
-	//tags
-	tag: function(next, data){
-		var name = data.name;
-		return function tag(elem){
-			return getName$1(elem) === name && next(elem);
-		};
-	},
-
-	//traversal
-	descendant: function(next, rule, options, context, acceptSelf){
-		return function descendant(elem){
-
-			if (acceptSelf && next(elem)) return true;
-
-			var found = false;
-
-			while(!found && (elem = getParent$1(elem))){
-				found = next(elem);
-			}
-
-			return found;
-		};
-	},
-	parent: function(next, data, options){
-		if(options && options.strict) throw SyntaxError("Parent selector isn't part of CSS3");
-
-		return function parent(elem){
-			return getChildren$1(elem).some(test);
-		};
-
-		function test(elem){
-			return isTag$3(elem) && next(elem);
-		}
-	},
-	child: function(next){
-		return function child(elem){
-			var parent = getParent$1(elem);
-			return !!parent && next(parent);
-		};
-	},
-	sibling: function(next){
-		return function sibling(elem){
-			var siblings = getSiblings$1(elem);
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(next(siblings[i])) return true;
-				}
-			}
-
-			return false;
-		};
-	},
-	adjacent: function(next){
-		return function adjacent(elem){
-			var siblings = getSiblings$1(elem),
-			    lastElement;
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					lastElement = siblings[i];
-				}
-			}
-
-			return !!lastElement && next(lastElement);
-		};
-	},
-	universal: function(next){
-		return next;
-	}
-};
-
-var universal = 50;
-var tag = 30;
-var attribute = 1;
-var pseudo = 0;
-var descendant = -1;
-var child = -1;
-var parent = -1;
-var sibling = -1;
-var adjacent = -1;
-var procedure = {
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent
-};
-
-var procedure$1 = {
-	__proto__: null,
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent,
-	'default': procedure
-};
-
-var procedure$2 = getCjsExportFromNamespace(procedure$1);
-
-var sort = sortByProcedure;
-
-/*
-	sort the parts of the passed selector,
-	as there is potential for optimization
-	(some types of selectors are faster than others)
-*/
-
-
-
-var attributes$1 = {
-	__proto__: null,
-	exists: 10,
-	equals: 8,
-	not: 7,
-	start: 6,
-	end: 6,
-	any: 5,
-	hyphen: 4,
-	element: 4
-};
-
-function sortByProcedure(arr){
-	var procs = arr.map(getProcedure);
-	for(var i = 1; i < arr.length; i++){
-		var procNew = procs[i];
-
-		if(procNew < 0) continue;
-
-		for(var j = i - 1; j >= 0 && procNew < procs[j]; j--){
-			var token = arr[j + 1];
-			arr[j + 1] = arr[j];
-			arr[j] = token;
-			procs[j + 1] = procs[j];
-			procs[j] = procNew;
-		}
-	}
-}
-
-function getProcedure(token){
-	var proc = procedure$2[token.type];
-
-	if(proc === procedure$2.attribute){
-		proc = attributes$1[token.action];
-
-		if(proc === attributes$1.equals && token.name === "id"){
-			//prefer ID selectors (eg. #ID)
-			proc = 9;
-		}
-
-		if(token.ignoreCase){
-			//ignoreCase adds some overhead, prefer "normal" token
-			//this is a binary operation, to ensure it's still an int
-			proc >>= 1;
-		}
-	} else if(proc === procedure$2.pseudo){
-		if(!token.data){
-			proc = 3;
-		} else if(token.name === "has" || token.name === "contains"){
-			proc = 0; //expensive in any case
-		} else if(token.name === "matches" || token.name === "not"){
-			proc = 0;
-			for(var i = 0; i < token.data.length; i++){
-				//TODO better handling of complex selectors
-				if(token.data[i].length !== 1) continue;
-				var cur = getProcedure(token.data[i][0]);
-				//avoid executing :has or :contains
-				if(cur === 0){
-					proc = 0;
-					break;
-				}
-				if(cur > proc) proc = cur;
-			}
-			if(token.data.length > 1 && proc > 0) proc -= 1;
-		} else {
-			proc = 1;
-		}
-	}
-	return proc;
-}
-
-/*
-	compiles a selector to an executable function
-*/
-
-var compile_1$2 = compile$1;
-var compileUnsafe_1 = compileUnsafe;
-var compileToken_1 = compileToken;
-
-var isTag$4       = domutils.isTag,
-    trueFunc$2    = boolbase.trueFunc,
-    falseFunc$3   = boolbase.falseFunc;
-
-function compile$1(selector, options, context){
-	var next = compileUnsafe(selector, options, context);
-	return wrap(next);
-}
-
-function wrap(next){
-	return function base(elem){
-		return isTag$4(elem) && next(elem);
-	};
-}
-
-function compileUnsafe(selector, options, context){
-	var token = cssWhat(selector, options);
-	return compileToken(token, options, context);
-}
-
-function includesScopePseudo(t){
-    return t.type === "pseudo" && (
-        t.name === "scope" || (
-            Array.isArray(t.data) &&
-            t.data.some(function(data){
-                return data.some(includesScopePseudo);
-            })
-        )
-    );
-}
-
-var DESCENDANT_TOKEN = {type: "descendant"},
-    SCOPE_TOKEN = {type: "pseudo", name: "scope"},
-    PLACEHOLDER_ELEMENT = {},
-    getParent$2 = domutils.getParent;
-
-//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
-//http://www.w3.org/TR/selectors4/#absolutizing
-function absolutize(token, context){
-    //TODO better check if context is document
-    var hasContext = !!context && !!context.length && context.every(function(e){
-        return e === PLACEHOLDER_ELEMENT || !!getParent$2(e);
-    });
-
-
-    token.forEach(function(t){
-        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant"); else if(hasContext && !includesScopePseudo(t)){
-            t.unshift(DESCENDANT_TOKEN);
-        } else {
-            return;
-        }
-
-        t.unshift(SCOPE_TOKEN);
-    });
-}
-
-function compileToken(token, options, context){
-    token = token.filter(function(t){ return t.length > 0; });
-
-	token.forEach(sort);
-
-	var isArrayContext = Array.isArray(context);
-
-    context = (options && options.context) || context;
-
-    if(context && !isArrayContext) context = [context];
-
-    absolutize(token, context);
-
-	return token
-		.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })
-		.reduce(reduceRules, falseFunc$3);
-}
-
-function isTraversal(t){
-	return procedure$2[t.type] < 0;
-}
-
-function compileRules(rules, options, context, isArrayContext){
-	var acceptSelf = (isArrayContext && rules[0].name === "scope" && rules[1].type === "descendant");
-	return rules.reduce(function(func, rule, index){
-		if(func === falseFunc$3) return func;
-		return general[rule.type](func, rule, options, context, acceptSelf && index === 1);
-	}, options && options.rootFunc || trueFunc$2);
-}
-
-function reduceRules(a, b){
-	if(b === falseFunc$3 || a === trueFunc$2){
-		return a;
-	}
-	if(a === falseFunc$3 || b === trueFunc$2){
-		return b;
-	}
-
-	return function combine(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-//:not, :has and :matches have to compile selectors
-//doing this in lib/pseudos.js would lead to circular dependencies,
-//so we add them here
-
-var filters$1     = pseudos_1.filters,
-    existsOne$1   = domutils.existsOne,
-    isTag$4       = domutils.isTag,
-    getChildren$2 = domutils.getChildren;
-
-
-function containsTraversal(t){
-	return t.some(isTraversal);
-}
-
-filters$1.not = function(next, token, options, context){
-	var opts = {
-	    	xmlMode: !!(options && options.xmlMode),
-	    	strict: !!(options && options.strict)
-	    };
-
-	if(opts.strict){
-		if(token.length > 1 || token.some(containsTraversal)){
-			throw new SyntaxError("complex selectors in :not aren't allowed in strict mode");
-		}
-	}
-
-    var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return next;
-	if(func === trueFunc$2)  return falseFunc$3;
-
-	return function(elem){
-		return !func(elem) && next(elem);
-	};
-};
-
-filters$1.has = function(next, token, options){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict)
-	};
-
-    //FIXME: Uses an array as a pointer to the current element (side effects)
-    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;
-
-	var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return falseFunc$3;
-	if(func === trueFunc$2)  return function(elem){
-			return getChildren$2(elem).some(isTag$4) && next(elem);
-		};
-
-	func = wrap(func);
-
-    if(context){
-        return function has(elem){
-		return next(elem) && (
-                (context[0] = elem), existsOne$1(func, getChildren$2(elem))
-            );
-	};
-    }
-
-    return function has(elem){
-		return next(elem) && existsOne$1(func, getChildren$2(elem));
-	};
-};
-
-filters$1.matches = function(next, token, options, context){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict),
-		rootFunc: next
-	};
-
-	return compileToken(token, opts, context);
-};
-compile_1$2.compileUnsafe = compileUnsafe_1;
-compile_1$2.compileToken = compileToken_1;
-
-var cssSelect = CSSselect;
-
-var findOne$1       = domutils.findOne,
-    findAll$1       = domutils.findAll,
-    getChildren$3   = domutils.getChildren,
-    removeSubsets = domutils.removeSubsets,
-    falseFunc$4     = boolbase.falseFunc,
-    compileUnsafe$1 = compile_1$2.compileUnsafe,
-    compileToken$1  = compile_1$2.compileToken;
-
-function getSelectorFunc(searchFunc){
-	return function select(query, elems, options){
-        if(typeof query !== "function") query = compileUnsafe$1(query, options, elems);
-        if(!Array.isArray(elems)) elems = getChildren$3(elems);
-		else elems = removeSubsets(elems);
-		return searchFunc(query, elems);
-	};
-}
-
-var selectAll = getSelectorFunc(function selectAll(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? [] : findAll$1(query, elems);
-});
-
-var selectOne = getSelectorFunc(function selectOne(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? null : findOne$1(query, elems);
-});
-
-function is(elem, query, options){
-	return (typeof query === "function" ? query : compile_1$2(query, options))(elem);
-}
-
-/*
-	the exported interface
-*/
-function CSSselect(query, elems, options){
-	return selectAll(query, elems, options);
-}
-
-CSSselect.compile = compile_1$2;
-CSSselect.filters = pseudos_1.filters;
-CSSselect.pseudos = pseudos_1.pseudos;
-
-CSSselect.selectAll = selectAll;
-CSSselect.selectOne = selectOne;
-
-CSSselect.is = is;
-
-//legacy methods (might be removed)
-CSSselect.parse = compile_1$2;
-CSSselect.iterate = selectAll;
-
-//hooks
-CSSselect._compileUnsafe = compileUnsafe$1;
-CSSselect._compileToken = compileToken$1;
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
-const PARSE5_OPTS = {
-  treeAdapter
-};
-/**
- * Parse HTML into a mutable, serializable DOM Document.
- * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
- * @param {String} html   HTML to parse into a Document instance
- */
-
-function createDocument(html) {
-  const document = parse5.parse(html, PARSE5_OPTS);
-  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
-
-  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
-
-  document.$$Node = scratch.constructor;
-  const elementProto = Object.getPrototypeOf(scratch);
-  defineProperties(elementProto, ElementExtensions);
-  elementProto.ownerDocument = document;
-  return document;
-}
-/**
- * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-
-function serializeDocument(document) {
-  return parse5.serialize(document, PARSE5_OPTS);
-}
-/**
- * Methods and descriptors to mix into Element.prototype
- */
-
-const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
-  nodeName: {
-    get() {
-      return this.tagName.toUpperCase();
-    }
-
-  },
-  id: reflectedProperty('id'),
-  className: reflectedProperty('class'),
-
-  insertBefore(child, referenceNode) {
-    if (!referenceNode) return this.appendChild(child);
-    treeAdapter.insertBefore(this, child, referenceNode);
-    return child;
-  },
-
-  appendChild(child) {
-    treeAdapter.appendChild(this, child);
-    return child;
-  },
-
-  removeChild(child) {
-    treeAdapter.detachNode(child);
-  },
-
-  remove() {
-    treeAdapter.detachNode(this);
-  },
-
-  textContent: {
-    get() {
-      return getText$2(this);
-    },
-
-    set(text) {
-      this.children = [];
-      treeAdapter.insertText(this, text);
-    }
-
-  },
-
-  setAttribute(name, value) {
-    if (this.attribs == null) this.attribs = {};
-    if (value == null) value = '';
-    this.attribs[name] = value;
-  },
-
-  removeAttribute(name) {
-    if (this.attribs != null) {
-      delete this.attribs[name];
-    }
-  },
-
-  getAttribute(name) {
-    return this.attribs != null && this.attribs[name];
-  },
-
-  hasAttribute(name) {
-    return this.attribs != null && this.attribs[name] != null;
-  },
-
-  getAttributeNode(name) {
-    const value = this.getAttribute(name);
-    if (value != null) return {
-      specified: true,
-      value
-    };
-  }
-
-};
-/**
- * Methods and descriptors to mix into the global document instance
- * @private
- */
-
-const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
-  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
-  // TODO: verify if these are needed for css-select
-  nodeType: {
-    get() {
-      return 9;
-    }
-
-  },
-  contentType: {
-    get() {
-      return 'text/html';
-    }
-
-  },
-  nodeName: {
-    get() {
-      return '#document';
-    }
-
-  },
-  documentElement: {
-    get() {
-      // Find the first <html> element within the document
-      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
-    }
-
-  },
-  compatMode: {
-    get() {
-      const compatMode = {
-        'no-quirks': 'CSS1Compat',
-        quirks: 'BackCompat',
-        'limited-quirks': 'CSS1Compat'
-      };
-      return compatMode[treeAdapter.getDocumentMode(this)];
-    }
-
-  },
-  body: {
-    get() {
-      return this.querySelector('body');
-    }
-
-  },
-
-  createElement(name) {
-    return treeAdapter.createElement(name, null, []);
-  },
-
-  createTextNode(text) {
-    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
-    const Node = this.$$Node;
-    return new Node({
-      type: 'text',
-      data: text,
-      parent: null,
-      prev: null,
-      next: null
-    });
-  },
-
-  querySelector(sel) {
-    return cssSelect.selectOne(sel, this.documentElement);
-  },
-
-  querySelectorAll(sel) {
-    if (sel === ':root') {
-      return this;
-    }
-
-    return cssSelect(sel, this.documentElement);
-  }
-
-};
-/**
- * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
- * @private
- */
-
-function defineProperties(obj, properties) {
-  for (const i in properties) {
-    const value = properties[i];
-    Object.defineProperty(obj, i, typeof value === 'function' ? {
-      value
-    } : value);
-  }
-}
-/**
- * Create a property descriptor defining a getter/setter pair alias for a named attribute.
- * @private
- */
-
-
-function reflectedProperty(attributeName) {
-  return {
-    get() {
-      return this.getAttribute(attributeName);
-    },
-
-    set(value) {
-      this.setAttribute(attributeName, value);
-    }
-
-  };
-}
-/**
- * Helper to get the text content of a node
- * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
- * @private
- */
-
-
-function getText$2(node) {
-  if (Array.isArray(node)) return node.map(getText$2).join('');
-  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText$2(node.children);
-  if (treeAdapter.isTextNode(node)) return node.data;
-  return '';
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * Parse a textual CSS Stylesheet into a Stylesheet instance.
- * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
- * @see https://github.com/reworkcss/css
- * @private
- * @param {String} stylesheet
- * @returns {css.Stylesheet} ast
- */
-
-function parseStylesheet(stylesheet) {
-  return css.parse(stylesheet);
-}
-/**
- * Serialize a ReworkCSS Stylesheet to a String of CSS.
- * @private
- * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
- * @param {Object} options              Options to pass to `css.stringify()`
- * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
- */
-
-function serializeStylesheet(ast, options) {
-  return css.stringify(ast, options);
-}
-/**
- * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
- * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
- * @private
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- * @returns {(rule) => void} nonDestructiveIterator
- */
-
-function markOnly(predicate) {
-  return rule => {
-    const sel = rule.selectors;
-
-    if (predicate(rule) === false) {
-      rule.$$remove = true;
-    }
-
-    rule.$$markedSelectors = rule.selectors;
-
-    if (rule._other) {
-      rule._other.$$markedSelectors = rule._other.selectors;
-    }
-
-    rule.selectors = sel;
-  };
-}
-/**
- * Apply filtered selectors to a rule from a previous markOnly run.
- * @private
- * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
-*/
-
-function applyMarkedSelectors(rule) {
-  if (rule.$$markedSelectors) {
-    rule.selectors = rule.$$markedSelectors;
-  }
-
-  if (rule._other) {
-    applyMarkedSelectors(rule._other);
-  }
-}
-/**
- * Recursively walk all rules in a stylesheet.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- */
-
-function walkStyleRules(node, iterator) {
-  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-  node.rules = node.rules.filter(rule => {
-    if (rule.rules) {
-      walkStyleRules(rule, iterator);
-    }
-
-    rule._other = undefined;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-}
-/**
- * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {css.Rule} node2      A second tree identical to `node`
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
- */
-
-function walkStyleRulesWithReverseMirror(node, node2, iterator) {
-  if (node2 === null) return walkStyleRules(node, iterator);
-  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
-  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
-    const rule2 = rules2[index];
-
-    if (rule.rules) {
-      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
-    }
-
-    rule._other = rule2;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
-// This is just a quicker version of generating the compliment of the set returned from a filter operation.
-
-function splitFilter(a, b, predicate) {
-  const aOut = [];
-  const bOut = [];
-
-  for (let index = 0; index < a.length; index++) {
-    if (predicate(a[index], index, a, b)) {
-      aOut.push(a[index]);
-    } else {
-      bOut.push(a[index]);
-    }
-  }
-
-  return [aOut, bOut];
-} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
-
-
-function filterSelectors(predicate) {
-  if (this._other) {
-    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
-    this.selectors = a;
-    this._other.selectors = b;
-  } else {
-    this.selectors = this.selectors.filter(predicate);
-  }
-}
-
-const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
-const defaultLogger = {
-  trace(msg) {
-    console.trace(msg);
-  },
-
-  debug(msg) {
-    console.debug(msg);
-  },
-
-  warn(msg) {
-    console.warn(chalk.yellow(msg));
-  },
-
-  error(msg) {
-    console.error(chalk.bold.red(msg));
-  },
-
-  info(msg) {
-    console.info(chalk.bold.blue(msg));
-  },
-
-  silent() {}
-
-};
-function createLogger(logLevel) {
-  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
-  return LOG_LEVELS.reduce((logger, type, index) => {
-    if (index >= logLevelIdx) {
-      logger[type] = defaultLogger[type];
-    } else {
-      logger[type] = defaultLogger.silent;
-    }
-
-    return logger;
-  }, {});
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * The mechanism to use for lazy-loading stylesheets.
- * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
- *
- * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
- * - **"body":** Move all external stylesheet links to the end of the document.
- * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. <kbd>JS</kbd>
- * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>
- * - **"swap-high":** Use `<link rel="alternate stylesheet preload">` and swap to `rel="stylesheet"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>
- * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>
- * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
- * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy
- * @public
- */
-
-/**
- * Controls which keyframes rules are inlined.
- *
- * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
- * - **"all":** Inline all keyframes rules.
- * - **"none":** Remove all keyframes rules.
- * @typedef {('critical'|'all'|'none')} KeyframeStrategy
- * @private
- * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
- */
-
-/**
- * Controls log level of the plugin. Specifies the level the logger should use. A logger will
- * not produce output for any log level beneath the specified level. Available levels and order
- * are:
- *
- * - **"info"** _(default)_
- * - **"warn"**
- * - **"error"**
- * - **"trace"**
- * - **"debug"**
- * - **"silent"**
- * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
- * @public
- */
-
-/**
- * Custom logger interface:
- * @typedef {object} Logger
- * @public
- * @property {function(String)} trace - Prints a trace message
- * @property {function(String)} debug - Prints a debug message
- * @property {function(String)} info - Prints an information message
- * @property {function(String)} warn - Prints a warning message
- * @property {function(String)} error - Prints an error message
- */
-
-/**
- * All optional. Pass them to `new Critters({ ... })`.
- * @public
- * @typedef Options
- * @property {String} path     Base path location of the CSS files _(default: `''`)_
- * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
- * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
- * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
- * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
- * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
- * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
- * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
- * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
- * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
- * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
- * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
- * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
- *  - Values:
- *  - `true` to inline critical font-face rules and preload the fonts
- *  - `false` to don't inline any font-face rules and don't preload fonts
- * @property {String} keyframes     Controls which keyframes rules are inlined.
- *  - Values:
- *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
- *  - `"all"` inline all keyframes rules
- *  - `"none"` remove all keyframes rules
- * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
- * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
- * @property {object} logger        Provide a custom logger interface {@link Logger logger}
- */
-
-function _catch(body, recover) {
-  try {
-    var result = body();
-  } catch (e) {
-    return recover(e);
-  }
-
-  if (result && result.then) {
-    return result.then(void 0, recover);
-  }
-
-  return result;
-}
-
-class Critters {
-  /** @private */
-  constructor(options) {
-    this.options = Object.assign({
-      logLevel: 'info',
-      path: '',
-      publicPath: '',
-      reduceInlineStyles: true,
-      pruneSource: false,
-      additionalStylesheets: []
-    }, options || {});
-    this.urlFilter = this.options.filter;
-
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-
-    this.logger = this.options.logger || createLogger(this.options.logLevel);
-  }
-  /**
-   * Read the contents of a file from the specified filesystem or disk
-   */
-
-
-  readFile(filename) {
-    const fs = this.fs;
-    return new Promise((resolve, reject) => {
-      const callback = (err, data) => {
-        if (err) reject(err);else resolve(data);
-      };
-
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  }
-  /**
-   * Apply critical CSS processing to the html
-   */
-
-
-  process(html) {
-    try {
-      const _this = this;
-
-      function _temp4() {
-        // go through all the style tags in the document and reduce them to only critical CSS
-        const styles = _this.getAffectedStyleTags(document);
-
-        return Promise.resolve(Promise.all(styles.map(style => _this.processStyle(style, document)))).then(function () {
-          function _temp2() {
-            // serialize the document back to HTML and we're done
-            const output = serializeDocument(document);
-            const end = process.hrtime.bigint();
-
-            _this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
-
-            return output;
-          }
-
-          const _temp = function () {
-            if (_this.options.mergeStylesheets !== false && styles.length !== 0) {
-              return Promise.resolve(_this.mergeStylesheets(document)).then(function () {});
-            }
-          }();
-
-          return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
-        });
-      }
-
-      const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
-
-      const document = createDocument(html);
-
-      if (_this.options.additionalStylesheets.length > 0) {
-        _this.embedAdditionalStylesheet(document);
-      } // `external:false` skips processing of external sheets
-
-
-      const _temp3 = function () {
-        if (_this.options.external !== false) {
-          const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
-          return Promise.resolve(Promise.all(externalSheets.map(link => _this.embedLinkedStylesheet(link, document)))).then(function () {});
-        }
-      }();
-
-      return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-  /**
-   * Get the style tags that need processing
-   */
-
-
-  getAffectedStyleTags(document) {
-    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
-
-    if (this.options.reduceInlineStyles === false) {
-      return styles.filter(style => style.$$external);
-    }
-
-    return styles;
-  }
-
-  mergeStylesheets(document) {
-    try {
-      const _this2 = this;
-
-      const styles = _this2.getAffectedStyleTags(document);
-
-      if (styles.length === 0) {
-        _this2.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
-
-        return Promise.resolve();
-      }
-
-      const first = styles[0];
-      let sheet = first.textContent;
-
-      for (let i = 1; i < styles.length; i++) {
-        const node = styles[i];
-        sheet += node.textContent;
-        node.remove();
-      }
-
-      first.textContent = sheet;
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-  /**
-   * Given href, find the corresponding CSS asset
-   */
-
-
-  getCssAsset(href) {
-    try {
-      const _this3 = this;
-
-      const outputPath = _this3.options.path;
-      const publicPath = _this3.options.publicPath; // CHECK - the output path
-      // path on disk (with output.publicPath removed)
-
-      let normalizedPath = href.replace(/^\//, '');
-      const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-      if (normalizedPath.indexOf(pathPrefix) === 0) {
-        normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
-      }
-
-      const filename = path.resolve(outputPath, normalizedPath);
-      let sheet;
-
-      const _temp5 = _catch(function () {
-        return Promise.resolve(_this3.readFile(filename)).then(function (_this3$readFile) {
-          sheet = _this3$readFile;
-        });
-      }, function () {
-        _this3.logger.warn(`Unable to locate stylesheet: ${filename}`);
-      });
-
-      return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {
-        return sheet;
-      }) : sheet);
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-
-  checkInlineThreshold(link, style, sheet) {
-    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
-      const href = style.$$name;
-      style.$$reduce = false;
-      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
-      link.remove();
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
-   */
-
-
-  embedAdditionalStylesheet(document) {
-    try {
-      const _this4 = this;
-
-      const styleSheetsIncluded = [];
-      return Promise.resolve(Promise.all(_this4.options.additionalStylesheets.map(cssFile => {
-        if (styleSheetsIncluded.includes(cssFile)) {
-          return;
-        }
-
-        styleSheetsIncluded.push(cssFile);
-        const style = document.createElement('style');
-        style.$$external = true;
-        return _this4.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
-      }))).then(function (sources) {
-        sources.forEach(([sheet, style]) => {
-          if (!sheet) return;
-          style.textContent = sheet;
-          document.head.appendChild(style);
-        });
-      });
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-  /**
-   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-   */
-
-
-  embedLinkedStylesheet(link, document) {
-    try {
-      const _this5 = this;
-
-      const href = link.getAttribute('href');
-      const media = link.getAttribute('media');
-      const preloadMode = _this5.options.preload; // skip filtered resources, or network resources if no filter is provided
-
-      if (_this5.urlFilter ? _this5.urlFilter(href) : !(href || '').match(/\.css$/)) {
-        return Promise.resolve();
-      } // the reduced critical CSS gets injected into a new <style> tag
-
-
-      const style = document.createElement('style');
-      style.$$external = true;
-      return Promise.resolve(_this5.getCssAsset(href, style)).then(function (sheet) {
-        if (!sheet) {
-          return;
-        }
-
-        style.textContent = sheet;
-        style.$$name = href;
-        style.$$links = [link];
-        link.parentNode.insertBefore(style, link);
-
-        if (_this5.checkInlineThreshold(link, style, sheet)) {
-          return;
-        } // CSS loader is only injected for the first sheet, then this becomes an empty string
-
-
-        let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-        const lazy = preloadMode === 'js-lazy';
-
-        if (lazy) {
-          cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
-        } // Allow disabling any mutation of the stylesheet link:
-
-
-        if (preloadMode === false) return;
-        let noscriptFallback = false;
-
-        if (preloadMode === 'body') {
-          document.body.appendChild(link);
-        } else {
-          link.setAttribute('rel', 'preload');
-          link.setAttribute('as', 'style');
-
-          if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-            const script = document.createElement('script');
-            const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
-
-            script.textContent = js;
-            link.parentNode.insertBefore(script, link.nextSibling);
-            style.$$links.push(script);
-            cssLoaderPreamble = '';
-            noscriptFallback = true;
-          } else if (preloadMode === 'media') {
-            // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-            link.setAttribute('rel', 'stylesheet');
-            link.removeAttribute('as');
-            link.setAttribute('media', 'print');
-            link.setAttribute('onload', `this.media='${media || 'all'}'`);
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap-high') {
-            // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
-            link.setAttribute('rel', 'alternate stylesheet preload');
-            link.setAttribute('title', 'styles');
-            link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap') {
-            link.setAttribute('onload', "this.rel='stylesheet'");
-            noscriptFallback = true;
-          } else {
-            const bodyLink = document.createElement('link');
-            bodyLink.setAttribute('rel', 'stylesheet');
-            if (media) bodyLink.setAttribute('media', media);
-            bodyLink.setAttribute('href', href);
-            document.body.appendChild(bodyLink);
-            style.$$links.push(bodyLink);
-          }
-        }
-
-        if (_this5.options.noscriptFallback !== false && noscriptFallback) {
-          const noscript = document.createElement('noscript');
-          const noscriptLink = document.createElement('link');
-          noscriptLink.setAttribute('rel', 'stylesheet');
-          noscriptLink.setAttribute('href', href);
-          if (media) noscriptLink.setAttribute('media', media);
-          noscript.appendChild(noscriptLink);
-          link.parentNode.insertBefore(noscript, link.nextSibling);
-          style.$$links.push(noscript);
-        }
-      });
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-  /**
-   * Prune the source CSS files
-   */
-
-
-  pruneSource(style, before, sheetInverse) {
-    // if external stylesheet would be below minimum size, just inline everything
-    const minSize = this.options.minimumExternalSize;
-    const name = style.$$name;
-
-    if (minSize && sheetInverse.length < minSize) {
-      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
-      style.textContent = before; // remove any associated external resources/loaders:
-
-      if (style.$$links) {
-        for (const link of style.$$links) {
-          const parent = link.parentNode;
-          if (parent) parent.removeChild(link);
-        }
-      }
-
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-
-
-  processStyle(style, document) {
-    try {
-      const _this6 = this;
-
-      if (style.$$reduce === false) return Promise.resolve();
-      const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-      const options = _this6.options; // const document = style.ownerDocument;
-
-      const head = document.querySelector('head');
-      let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-      if (keyframesMode === true) keyframesMode = 'all';
-      if (keyframesMode === false) keyframesMode = 'none';
-      let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
-
-      const before = sheet; // Skip empty stylesheets
-
-      if (!sheet) return Promise.resolve();
-      const ast = parseStylesheet(sheet);
-      const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-      let criticalFonts = '';
-      const failedSelectors = [];
-      const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-      // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-      walkStyleRules(ast, markOnly(rule => {
-        if (rule.type === 'rule') {
-          // Filter the selector list down to only those match
-          rule.filterSelectors(sel => {
-            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
-              return true;
-            }
-
-            sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
-            if (!sel) return false;
-
-            try {
-              return document.querySelector(sel) != null;
-            } catch (e) {
-              failedSelectors.push(sel + ' -> ' + e.message);
-              return false;
-            }
-          }); // If there are no matched selectors, remove the rule:
-
-          if (rule.selectors.length === 0) {
-            return false;
-          }
-
-          if (rule.declarations) {
-            for (let i = 0; i < rule.declarations.length; i++) {
-              const decl = rule.declarations[i]; // detect used fonts
-
-              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-                criticalFonts += ' ' + decl.value;
-              } // detect used keyframes
-
-
-              if (decl.property === 'animation' || decl.property === 'animation-name') {
-                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                const names = decl.value.split(/\s+/);
-
-                for (let j = 0; j < names.length; j++) {
-                  const name = names[j].trim();
-                  if (name) criticalKeyframeNames.push(name);
-                }
-              }
-            }
-          }
-        } // keep font rules, they're handled in the second pass:
-
-
-        if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-        const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
-        return !rules || rules.length !== 0;
-      }));
-
-      if (failedSelectors.length !== 0) {
-        _this6.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
-      }
-
-      const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
-      const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
-      const preloadedFonts = []; // Second pass, using data picked up from the first
-
-      walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
-        // remove any rules marked in the first pass
-        if (rule.$$remove === true) return false;
-        applyMarkedSelectors(rule); // prune @keyframes rules
-
-        if (rule.type === 'keyframes') {
-          if (keyframesMode === 'none') return false;
-          if (keyframesMode === 'all') return true;
-          return criticalKeyframeNames.indexOf(rule.name) !== -1;
-        } // prune @font-face rules
-
-
-        if (rule.type === 'font-face') {
-          let family, src;
-
-          for (let i = 0; i < rule.declarations.length; i++) {
-            const decl = rule.declarations[i];
-
-            if (decl.property === 'src') {
-              // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-              src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-            } else if (decl.property === 'font-family') {
-              family = decl.value;
-            }
-          }
-
-          if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-            preloadedFonts.push(src);
-            const preload = document.createElement('link');
-            preload.setAttribute('rel', 'preload');
-            preload.setAttribute('as', 'font');
-            preload.setAttribute('crossorigin', 'anonymous');
-            preload.setAttribute('href', src.trim());
-            head.appendChild(preload);
-          } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-
-          if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
-            return false;
-          }
-        }
-      });
-      sheet = serializeStylesheet(ast, {
-        compress: _this6.options.compress !== false
-      }).trim(); // If all rules were removed, get rid of the style element entirely
-
-      if (sheet.trim().length === 0) {
-        if (style.parentNode) {
-          style.remove();
-        }
-
-        return Promise.resolve();
-      }
-
-      let afterText = '';
-      let styleInlinedCompletely = false;
-
-      if (options.pruneSource) {
-        const sheetInverse = serializeStylesheet(astInverse, {
-          compress: _this6.options.compress !== false
-        });
-        styleInlinedCompletely = _this6.pruneSource(style, before, sheetInverse);
-
-        if (styleInlinedCompletely) {
-          const percent = sheetInverse.length / before.length * 100;
-          afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
-        }
-      } // replace the inline stylesheet with its critical'd counterpart
-
-
-      if (!styleInlinedCompletely) {
-        style.textContent = sheet;
-      } // output stats
-
-
-      const percent = sheet.length / before.length * 100 | 0;
-
-      _this6.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
-
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  }
-
-}
-
-export default Critters;
-//# sourceMappingURL=critters.esm.js.map
Index: trip-planner-front/node_modules/critters/dist/critters.esm.js.map
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.esm.js.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"critters.esm.js","sources":["../node_modules/domelementtype/index.js","../node_modules/dom-serializer/node_modules/domelementtype/lib/index.js","../node_modules/entities/lib/decode_codepoint.js","../node_modules/entities/lib/decode.js","../node_modules/entities/lib/encode.js","../node_modules/entities/lib/index.js","../node_modules/dom-serializer/index.js","../node_modules/css-select/node_modules/domutils/lib/stringify.js","../node_modules/css-select/node_modules/domutils/lib/traversal.js","../node_modules/css-select/node_modules/domutils/lib/manipulation.js","../node_modules/css-select/node_modules/domutils/lib/querying.js","../node_modules/css-select/node_modules/domutils/lib/legacy.js","../node_modules/css-select/node_modules/domutils/lib/helpers.js","../node_modules/css-select/node_modules/domutils/index.js","../node_modules/nth-check/parse.js","../node_modules/boolbase/index.js","../node_modules/nth-check/compile.js","../node_modules/nth-check/index.js","../node_modules/css-select/lib/attributes.js","../node_modules/css-select/lib/pseudos.js","../node_modules/css-what/index.js","../node_modules/css-select/lib/general.js","../node_modules/css-select/lib/sort.js","../node_modules/css-select/lib/compile.js","../node_modules/css-select/index.js","../src/dom.js","../src/css.js","../src/util.js","../src/index.js"],"sourcesContent":["//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\tDoctype: \"doctype\",\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === \"tag\" /* Tag */ ||\n        elem.type === \"script\" /* Script */ ||\n        elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    var output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var keys = Object.keys(map).join(\"|\");\n    var replace = getReplacer(map);\n    keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n    var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n    return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    //TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        return map[str.slice(1, -1)];\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escape = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nfunction singleCharReplacer(c) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return \"&#x\" + c.codePointAt(0).toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n    return data\n        .replace(reXmlChars, singleCharReplacer)\n        .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\n// Legacy aliases\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","/*\n  Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n   recognized by the HTML parser, see\n   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n  __proto__: null,\n  style: true,\n  script: true,\n  xmp: true,\n  iframe: true,\n  noembed: true,\n  noframes: true,\n  plaintext: true,\n  noscript: true\n};\n\n/*\n  Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n  if (!attributes) return;\n\n  var output = '';\n  var value;\n\n  // Loop through the attributes\n  for (var key in attributes) {\n    value = attributes[key];\n    if (output) {\n      output += ' ';\n    }\n\n    if (opts.xmlMode === 'foreign') {\n      /* fix up mixed-case attribute names */\n      key = foreignNames.attributeNames[key] || key;\n    }\n    output += key;\n    if ((value !== null && value !== '') || opts.xmlMode) {\n      output +=\n        '=\"' +\n        (opts.decodeEntities\n          ? entities.encodeXML(value)\n          : value.replace(/\\\"/g, '&quot;')) +\n        '\"';\n    }\n  }\n\n  return output;\n}\n\n/*\n  Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n  __proto__: null,\n  area: true,\n  base: true,\n  basefont: true,\n  br: true,\n  col: true,\n  command: true,\n  embed: true,\n  frame: true,\n  hr: true,\n  img: true,\n  input: true,\n  isindex: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n  opts = opts || {};\n\n  var output = '';\n\n  for (var i = 0; i < dom.length; i++) {\n    var elem = dom[i];\n\n    if (elem.type === 'root') output += render(elem.children, opts);\n    else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n    else if (elem.type === ElementType.Directive)\n      output += renderDirective(elem);\n    else if (elem.type === ElementType.Comment) output += renderComment(elem);\n    else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n    else output += renderText(elem, opts);\n  }\n\n  return output;\n});\n\nvar foreignModeIntegrationPoints = [\n  'mi',\n  'mo',\n  'mn',\n  'ms',\n  'mtext',\n  'annotation-xml',\n  'foreignObject',\n  'desc',\n  'title'\n];\n\nfunction renderTag(elem, opts) {\n  // Handle SVG / MathML in HTML\n  if (opts.xmlMode === 'foreign') {\n    /* fix up mixed-case element names */\n    elem.name = foreignNames.elementNames[elem.name] || elem.name;\n    /* exit foreign mode at integration points */\n    if (\n      elem.parent &&\n      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n    )\n      opts = Object.assign({}, opts, { xmlMode: false });\n  }\n  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n    opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n  }\n\n  var tag = '<' + elem.name;\n  var attribs = formatAttrs(elem.attribs, opts);\n\n  if (attribs) {\n    tag += ' ' + attribs;\n  }\n\n  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n    tag += '/>';\n  } else {\n    tag += '>';\n    if (elem.children) {\n      tag += render(elem.children, opts);\n    }\n\n    if (!singleTag[elem.name] || opts.xmlMode) {\n      tag += '</' + elem.name + '>';\n    }\n  }\n\n  return tag;\n}\n\nfunction renderDirective(elem) {\n  return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n  var data = elem.data || '';\n\n  // if entities weren't decoded, no need to encode them back\n  if (\n    opts.decodeEntities &&\n    !(elem.parent && elem.parent.name in unencodedElements)\n  ) {\n    data = entities.encodeXML(data);\n  }\n\n  return data;\n}\n\nfunction renderCdata(elem) {\n  return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n  return '<!--' + elem.data + '-->';\n}\n","var ElementType = require(\"domelementtype\"),\n    getOuterHTML = require(\"dom-serializer\"),\n    isTag = ElementType.isTag;\n\nmodule.exports = {\n\tgetInnerHTML: getInnerHTML,\n\tgetOuterHTML: getOuterHTML,\n\tgetText: getText\n};\n\nfunction getInnerHTML(elem, opts){\n\treturn elem.children ? elem.children.map(function(elem){\n\t\treturn getOuterHTML(elem, opts);\n\t}).join(\"\") : \"\";\n}\n\nfunction getText(elem){\n\tif(Array.isArray(elem)) return elem.map(getText).join(\"\");\n\tif(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);\n\tif(elem.type === ElementType.Text) return elem.data;\n\treturn \"\";\n}\n","var getChildren = exports.getChildren = function(elem){\n\treturn elem.children;\n};\n\nvar getParent = exports.getParent = function(elem){\n\treturn elem.parent;\n};\n\nexports.getSiblings = function(elem){\n\tvar parent = getParent(elem);\n\treturn parent ? getChildren(parent) : [elem];\n};\n\nexports.getAttributeValue = function(elem, name){\n\treturn elem.attribs && elem.attribs[name];\n};\n\nexports.hasAttrib = function(elem, name){\n\treturn !!elem.attribs && hasOwnProperty.call(elem.attribs, name);\n};\n\nexports.getName = function(elem){\n\treturn elem.name;\n};\n","exports.removeElement = function(elem){\n\tif(elem.prev) elem.prev.next = elem.next;\n\tif(elem.next) elem.next.prev = elem.prev;\n\n\tif(elem.parent){\n\t\tvar childs = elem.parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 1);\n\t}\n};\n\nexports.replaceElement = function(elem, replacement){\n\tvar prev = replacement.prev = elem.prev;\n\tif(prev){\n\t\tprev.next = replacement;\n\t}\n\n\tvar next = replacement.next = elem.next;\n\tif(next){\n\t\tnext.prev = replacement;\n\t}\n\n\tvar parent = replacement.parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds[childs.lastIndexOf(elem)] = replacement;\n\t}\n};\n\nexports.appendChild = function(elem, child){\n\tchild.parent = elem;\n\n\tif(elem.children.push(child) !== 1){\n\t\tvar sibling = elem.children[elem.children.length - 2];\n\t\tsibling.next = child;\n\t\tchild.prev = sibling;\n\t\tchild.next = null;\n\t}\n};\n\nexports.append = function(elem, next){\n\tvar parent = elem.parent,\n\t\tcurrNext = elem.next;\n\n\tnext.next = currNext;\n\tnext.prev = elem;\n\telem.next = next;\n\tnext.parent = parent;\n\n\tif(currNext){\n\t\tcurrNext.prev = next;\n\t\tif(parent){\n\t\t\tvar childs = parent.children;\n\t\t\tchilds.splice(childs.lastIndexOf(currNext), 0, next);\n\t\t}\n\t} else if(parent){\n\t\tparent.children.push(next);\n\t}\n};\n\nexports.prepend = function(elem, prev){\n\tvar parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 0, prev);\n\t}\n\n\tif(elem.prev){\n\t\telem.prev.next = prev;\n\t}\n\t\n\tprev.parent = parent;\n\tprev.prev = elem.prev;\n\tprev.next = elem;\n\telem.prev = prev;\n};\n\n\n","var isTag = require(\"domelementtype\").isTag;\n\nmodule.exports = {\n\tfilter: filter,\n\tfind: find,\n\tfindOneChild: findOneChild,\n\tfindOne: findOne,\n\texistsOne: existsOne,\n\tfindAll: findAll\n};\n\nfunction filter(test, element, recurse, limit){\n\tif(!Array.isArray(element)) element = [element];\n\n\tif(typeof limit !== \"number\" || !isFinite(limit)){\n\t\tlimit = Infinity;\n\t}\n\treturn find(test, element, recurse !== false, limit);\n}\n\nfunction find(test, elems, recurse, limit){\n\tvar result = [], childs;\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(test(elems[i])){\n\t\t\tresult.push(elems[i]);\n\t\t\tif(--limit <= 0) break;\n\t\t}\n\n\t\tchilds = elems[i].children;\n\t\tif(recurse && childs && childs.length > 0){\n\t\t\tchilds = find(test, childs, recurse, limit);\n\t\t\tresult = result.concat(childs);\n\t\t\tlimit -= childs.length;\n\t\t\tif(limit <= 0) break;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findOneChild(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(test(elems[i])) return elems[i];\n\t}\n\n\treturn null;\n}\n\nfunction findOne(test, elems){\n\tvar elem = null;\n\n\tfor(var i = 0, l = elems.length; i < l && !elem; i++){\n\t\tif(!isTag(elems[i])){\n\t\t\tcontinue;\n\t\t} else if(test(elems[i])){\n\t\t\telem = elems[i];\n\t\t} else if(elems[i].children.length > 0){\n\t\t\telem = findOne(test, elems[i].children);\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction existsOne(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(\n\t\t\tisTag(elems[i]) && (\n\t\t\t\ttest(elems[i]) || (\n\t\t\t\t\telems[i].children.length > 0 &&\n\t\t\t\t\texistsOne(test, elems[i].children)\n\t\t\t\t)\n\t\t\t)\n\t\t){\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction findAll(test, elems){\n\tvar result = [];\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\n\t\tif(elems[i].children.length > 0){\n\t\t\tresult = result.concat(findAll(test, elems[i].children));\n\t\t}\n\t}\n\treturn result;\n}\n","var ElementType = require(\"domelementtype\");\nvar isTag = exports.isTag = ElementType.isTag;\n\nexports.testElement = function(options, element){\n\tfor(var key in options){\n\t\tif(!options.hasOwnProperty(key));\n\t\telse if(key === \"tag_name\"){\n\t\t\tif(!isTag(element) || !options.tag_name(element.name)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(key === \"tag_type\"){\n\t\t\tif(!options.tag_type(element.type)) return false;\n\t\t} else if(key === \"tag_contains\"){\n\t\t\tif(isTag(element) || !options.tag_contains(element.data)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(!element.attribs || !options[key](element.attribs[key])){\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\nvar Checks = {\n\ttag_name: function(name){\n\t\tif(typeof name === \"function\"){\n\t\t\treturn function(elem){ return isTag(elem) && name(elem.name); };\n\t\t} else if(name === \"*\"){\n\t\t\treturn isTag;\n\t\t} else {\n\t\t\treturn function(elem){ return isTag(elem) && elem.name === name; };\n\t\t}\n\t},\n\ttag_type: function(type){\n\t\tif(typeof type === \"function\"){\n\t\t\treturn function(elem){ return type(elem.type); };\n\t\t} else {\n\t\t\treturn function(elem){ return elem.type === type; };\n\t\t}\n\t},\n\ttag_contains: function(data){\n\t\tif(typeof data === \"function\"){\n\t\t\treturn function(elem){ return !isTag(elem) && data(elem.data); };\n\t\t} else {\n\t\t\treturn function(elem){ return !isTag(elem) && elem.data === data; };\n\t\t}\n\t}\n};\n\nfunction getAttribCheck(attrib, value){\n\tif(typeof value === \"function\"){\n\t\treturn function(elem){ return elem.attribs && value(elem.attribs[attrib]); };\n\t} else {\n\t\treturn function(elem){ return elem.attribs && elem.attribs[attrib] === value; };\n\t}\n}\n\nfunction combineFuncs(a, b){\n\treturn function(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\nexports.getElements = function(options, element, recurse, limit){\n\tvar funcs = Object.keys(options).map(function(key){\n\t\tvar value = options[key];\n\t\treturn key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n\t});\n\n\treturn funcs.length === 0 ? [] : this.filter(\n\t\tfuncs.reduce(combineFuncs),\n\t\telement, recurse, limit\n\t);\n};\n\nexports.getElementById = function(id, element, recurse){\n\tif(!Array.isArray(element)) element = [element];\n\treturn this.findOne(getAttribCheck(\"id\", id), element, recurse !== false);\n};\n\nexports.getElementsByTagName = function(name, element, recurse, limit){\n\treturn this.filter(Checks.tag_name(name), element, recurse, limit);\n};\n\nexports.getElementsByTagType = function(type, element, recurse, limit){\n\treturn this.filter(Checks.tag_type(type), element, recurse, limit);\n};\n","// removeSubsets\n// Given an array of nodes, remove any member that is contained by another.\nexports.removeSubsets = function(nodes) {\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile (--idx > -1) {\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile (ancestor) {\n\t\t\tif (nodes.indexOf(ancestor) > -1) {\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = ancestor.parent;\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif (replace) {\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n};\n\n// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition\nvar POSITION = {\n\tDISCONNECTED: 1,\n\tPRECEDING: 2,\n\tFOLLOWING: 4,\n\tCONTAINS: 8,\n\tCONTAINED_BY: 16\n};\n\n// Compare the position of one node against another node in any other document.\n// The return value is a bitmask with the following values:\n//\n// document order:\n// > There is an ordering, document order, defined on all the nodes in the\n// > document corresponding to the order in which the first character of the\n// > XML representation of each node occurs in the XML representation of the\n// > document after expansion of general entities. Thus, the document element\n// > node will be the first node. Element nodes occur before their children.\n// > Thus, document order orders element nodes in order of the occurrence of\n// > their start-tag in the XML (after expansion of entities). The attribute\n// > nodes of an element occur after the element and before its children. The\n// > relative order of attribute nodes is implementation-dependent./\n// Source:\n// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n//\n// @argument {Node} nodaA The first node to use in the comparison\n// @argument {Node} nodeB The second node to use in the comparison\n//\n// @return {Number} A bitmask describing the input nodes' relative position.\n//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n//         a description of these values.\nvar comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {\n\tvar aParents = [];\n\tvar bParents = [];\n\tvar current, sharedParent, siblings, aSibling, bSibling, idx;\n\n\tif (nodeA === nodeB) {\n\t\treturn 0;\n\t}\n\n\tcurrent = nodeA;\n\twhile (current) {\n\t\taParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\tcurrent = nodeB;\n\twhile (current) {\n\t\tbParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\n\tidx = 0;\n\twhile (aParents[idx] === bParents[idx]) {\n\t\tidx++;\n\t}\n\n\tif (idx === 0) {\n\t\treturn POSITION.DISCONNECTED;\n\t}\n\n\tsharedParent = aParents[idx - 1];\n\tsiblings = sharedParent.children;\n\taSibling = aParents[idx];\n\tbSibling = bParents[idx];\n\n\tif (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n\t\tif (sharedParent === nodeB) {\n\t\t\treturn POSITION.FOLLOWING | POSITION.CONTAINED_BY;\n\t\t}\n\t\treturn POSITION.FOLLOWING;\n\t} else {\n\t\tif (sharedParent === nodeA) {\n\t\t\treturn POSITION.PRECEDING | POSITION.CONTAINS;\n\t\t}\n\t\treturn POSITION.PRECEDING;\n\t}\n};\n\n// Sort an array of nodes based on their relative position in the document and\n// remove any duplicate nodes. If the array contains nodes that do not belong\n// to the same document, sort order is unspecified.\n//\n// @argument {Array} nodes Array of DOM nodes\n//\n// @returns {Array} collection of unique nodes, sorted in document order\nexports.uniqueSort = function(nodes) {\n\tvar idx = nodes.length, node, position;\n\n\tnodes = nodes.slice();\n\n\twhile (--idx > -1) {\n\t\tnode = nodes[idx];\n\t\tposition = nodes.indexOf(node);\n\t\tif (position > -1 && position < idx) {\n\t\t\tnodes.splice(idx, 1);\n\t\t}\n\t}\n\tnodes.sort(function(a, b) {\n\t\tvar relative = comparePos(a, b);\n\t\tif (relative & POSITION.PRECEDING) {\n\t\t\treturn -1;\n\t\t} else if (relative & POSITION.FOLLOWING) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\treturn nodes;\n};\n","var DomUtils = module.exports;\n\n[\n\trequire(\"./lib/stringify\"),\n\trequire(\"./lib/traversal\"),\n\trequire(\"./lib/manipulation\"),\n\trequire(\"./lib/querying\"),\n\trequire(\"./lib/legacy\"),\n\trequire(\"./lib/helpers\")\n].forEach(function(ext){\n\tObject.keys(ext).forEach(function(key){\n\t\tDomUtils[key] = ext[key].bind(DomUtils);\n\t});\n});\n","module.exports = parse;\n\n//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\n\n//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\nvar re_nthElement = /^([+\\-]?\\d*n)?\\s*(?:([+\\-]?)\\s*(\\d+))?$/;\n\n/*\n\tparses a nth-check formula, returns an array of two numbers\n*/\nfunction parse(formula){\n\tformula = formula.trim().toLowerCase();\n\n\tif(formula === \"even\"){\n\t\treturn [2, 0];\n\t} else if(formula === \"odd\"){\n\t\treturn [2, 1];\n\t} else {\n\t\tvar parsed = formula.match(re_nthElement);\n\n\t\tif(!parsed){\n\t\t\tthrow new SyntaxError(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n\t\t}\n\n\t\tvar a;\n\n\t\tif(parsed[1]){\n\t\t\ta = parseInt(parsed[1], 10);\n\t\t\tif(isNaN(a)){\n\t\t\t\tif(parsed[1].charAt(0) === \"-\") a = -1;\n\t\t\t\telse a = 1;\n\t\t\t}\n\t\t} else a = 0;\n\n\t\treturn [\n\t\t\ta,\n\t\t\tparsed[3] ? parseInt((parsed[2] || \"\") + parsed[3], 10) : 0\n\t\t];\n\t}\n}\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","module.exports = compile;\n\nvar BaseFuncs = require(\"boolbase\"),\n    trueFunc  = BaseFuncs.trueFunc,\n    falseFunc = BaseFuncs.falseFunc;\n\n/*\n\treturns a function that checks if an elements index matches the given rule\n\thighly optimized to return the fastest solution\n*/\nfunction compile(parsed){\n\tvar a = parsed[0],\n\t    b = parsed[1] - 1;\n\n\t//when b <= 0, a*n won't be possible for any matches when a < 0\n\t//besides, the specification says that no element is matched when a and b are 0\n\tif(b < 0 && a <= 0) return falseFunc;\n\n\t//when a is in the range -1..1, it matches any element (so only b is checked)\n\tif(a ===-1) return function(pos){ return pos <= b; };\n\tif(a === 0) return function(pos){ return pos === b; };\n\t//when b <= 0 and a === 1, they match any element\n\tif(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };\n\n\t//when a > 0, modulo can be used to check if there is a match\n\tvar bMod = b % a;\n\tif(bMod < 0) bMod += a;\n\n\tif(a > 1){\n\t\treturn function(pos){\n\t\t\treturn pos >= b && pos % a === bMod;\n\t\t};\n\t}\n\n\ta *= -1; //make `a` positive\n\n\treturn function(pos){\n\t\treturn pos <= b && pos % a === bMod;\n\t};\n}","var parse = require(\"./parse.js\"),\n    compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","var DomUtils  = require(\"domutils\"),\n    hasAttrib = DomUtils.hasAttrib,\n    getAttributeValue = DomUtils.getAttributeValue,\n    falseFunc = require(\"boolbase\").falseFunc;\n\n//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\n\n/*\n\tattribute selectors\n*/\n\nvar attributeRules = {\n\t__proto__: null,\n\tequals: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function equalsIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function equals(elem){\n\t\t\treturn getAttributeValue(elem, name) === value && next(elem);\n\t\t};\n\t},\n\thyphen: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function hyphenIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null &&\n\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\tattr.substr(0, len).toLowerCase() === value &&\n\t\t\t\t\t\tnext(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function hyphen(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null &&\n\t\t\t\t\tattr.substr(0, len) === value &&\n\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\tnext(elem);\n\t\t};\n\t},\n\telement: function(next, data){\n\t\tvar name = data.name,\n\t\t    value = data.value;\n\n\t\tif(/\\s/.test(value)){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tvalue = value.replace(reChars, \"\\\\$&\");\n\n\t\tvar pattern = \"(?:^|\\\\s)\" + value + \"(?:$|\\\\s)\",\n\t\t    flags = data.ignoreCase ? \"i\" : \"\",\n\t\t    regex = new RegExp(pattern, flags);\n\n\t\treturn function element(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t};\n\t},\n\texists: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function exists(elem){\n\t\t\treturn hasAttrib(elem, name) && next(elem);\n\t\t};\n\t},\n\tstart: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\t\t\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function startIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function start(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(0, len) === value && next(elem);\n\t\t};\n\t},\n\tend: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len   = -value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function endIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function end(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(len) === value && next(elem);\n\t\t};\n\t},\n\tany: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvar regex = new RegExp(value.replace(reChars, \"\\\\$&\"), \"i\");\n\n\t\t\treturn function anyIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function any(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.indexOf(value) >= 0 && next(elem);\n\t\t};\n\t},\n\tnot: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn function notEmpty(elem){\n\t\t\t\treturn !!getAttributeValue(elem, name) && next(elem);\n\t\t\t};\n\t\t} else if(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function notIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() !== value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function not(elem){\n\t\t\treturn getAttributeValue(elem, name) !== value && next(elem);\n\t\t};\n\t}\n};\n\nmodule.exports = {\n\tcompile: function(next, data, options){\n\t\tif(options && options.strict && (\n\t\t\tdata.ignoreCase || data.action === \"not\"\n\t\t)) throw SyntaxError(\"Unsupported attribute selector\");\n\t\treturn attributeRules[data.action](next, data);\n\t},\n\trules: attributeRules\n};\n","/*\n\tpseudo selectors\n\n\t---\n\n\tthey are available in two forms:\n\t* filters called when the selector\n\t  is compiled and return a function\n\t  that needs to return next()\n\t* pseudos get called on execution\n\t  they need to return a boolean\n*/\n\nvar DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getText     = DomUtils.getText,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    hasAttrib   = DomUtils.hasAttrib,\n    getName     = DomUtils.getName,\n    getAttribute= DomUtils.getAttributeValue,\n    getNCheck   = require(\"nth-check\"),\n    checkAttrib = require(\"./attributes.js\").rules.equals,\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc;\n\n//helper methods\nfunction getFirstElement(elems){\n\tfor(var i = 0; elems && i < elems.length; i++){\n\t\tif(isTag(elems[i])) return elems[i];\n\t}\n}\n\nfunction getAttribFunc(name, value){\n\tvar data = {name: name, value: value};\n\treturn function attribFunc(next){\n\t\treturn checkAttrib(next, data);\n\t};\n}\n\nfunction getChildFunc(next){\n\treturn function(elem){\n\t\treturn !!getParent(elem) && next(elem);\n\t};\n}\n\nvar filters = {\n\tcontains: function(next, text){\n\t\treturn function contains(elem){\n\t\t\treturn next(elem) && getText(elem).indexOf(text) >= 0;\n\t\t};\n\t},\n\ticontains: function(next, text){\n\t\tvar itext = text.toLowerCase();\n\t\treturn function icontains(elem){\n\t\t\treturn next(elem) &&\n\t\t\t\tgetText(elem).toLowerCase().indexOf(itext) >= 0;\n\t\t};\n\t},\n\n\t//location specific methods\n\t\"nth-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0, pos = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\n    //TODO determine the actual root element\n    root: function(next){\n        return function(elem){\n            return !getParent(elem) && next(elem);\n        };\n    },\n\n    scope: function(next, rule, options, context){\n        if(!context || context.length === 0){\n            //equivalent to :root\n            return filters.root(next);\n        }\n\n        if(context.length === 1){\n            //NOTE: can't be unpacked, as :has uses this for side-effects\n            return function(elem){\n                return context[0] === elem && next(elem);\n            };\n        }\n\n        return function(elem){\n            return context.indexOf(elem) >= 0 && next(elem);\n        };\n    },\n\n\t//jQuery extensions (others follow as pseudos)\n\tcheckbox: getAttribFunc(\"type\", \"checkbox\"),\n\tfile: getAttribFunc(\"type\", \"file\"),\n\tpassword: getAttribFunc(\"type\", \"password\"),\n\tradio: getAttribFunc(\"type\", \"radio\"),\n\treset: getAttribFunc(\"type\", \"reset\"),\n\timage: getAttribFunc(\"type\", \"image\"),\n\tsubmit: getAttribFunc(\"type\", \"submit\")\n};\n\n//while filters are precompiled, pseudos get called when they are needed\nvar pseudos = {\n\tempty: function(elem){\n\t\treturn !getChildren(elem).some(function(elem){\n\t\t\treturn isTag(elem) || elem.type === \"text\";\n\t\t});\n\t},\n\n\t\"first-child\": function(elem){\n\t\treturn getFirstElement(getSiblings(elem)) === elem;\n\t},\n\t\"last-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\tif(siblings[i] === elem) return true;\n\t\t\tif(isTag(siblings[i])) break;\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"first-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"last-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length-1; i >= 0; i--){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"only-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0, j = siblings.length; i < j; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) continue;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) return false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\t\"only-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i]) && siblings[i] !== elem) return false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t//:matches(a, area, link)[href]\n\tlink: function(elem){\n\t\treturn hasAttrib(elem, \"href\");\n\t},\n\tvisited: falseFunc, //seems to be a valid implementation\n\t//TODO: :any-link once the name is finalized (as an alias of :link)\n\n\t//forms\n\t//to consider: :target\n\n\t//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)\n\tselected: function(elem){\n\t\tif(hasAttrib(elem, \"selected\")) return true;\n\t\telse if(getName(elem) !== \"option\") return false;\n\n\t\t//the first <option> in a <select> is also selected\n\t\tvar parent = getParent(elem);\n\n\t\tif(\n\t\t\t!parent ||\n\t\t\tgetName(parent) !== \"select\" ||\n\t\t\thasAttrib(parent, \"multiple\")\n\t\t) return false;\n\n\t\tvar siblings = getChildren(parent),\n\t\t\tsawElem  = false;\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem){\n\t\t\t\t\tsawElem = true;\n\t\t\t\t} else if(!sawElem){\n\t\t\t\t\treturn false;\n\t\t\t\t} else if(hasAttrib(siblings[i], \"selected\")){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sawElem;\n\t},\n\t//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n\t//:matches(\n\t//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],\n\t//  optgroup[disabled] > option),\n\t// fieldset[disabled] * //TODO not child of first <legend>\n\t//)\n\tdisabled: function(elem){\n\t\treturn hasAttrib(elem, \"disabled\");\n\t},\n\tenabled: function(elem){\n\t\treturn !hasAttrib(elem, \"disabled\");\n\t},\n\t//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)\n\tchecked: function(elem){\n\t\treturn hasAttrib(elem, \"checked\") || pseudos.selected(elem);\n\t},\n\t//:matches(input, select, textarea)[required]\n\trequired: function(elem){\n\t\treturn hasAttrib(elem, \"required\");\n\t},\n\t//:matches(input, select, textarea):not([required])\n\toptional: function(elem){\n\t\treturn !hasAttrib(elem, \"required\");\n\t},\n\n\t//jQuery extensions\n\n\t//:not(:empty)\n\tparent: function(elem){\n\t\treturn !pseudos.empty(elem);\n\t},\n\t//:matches(h1, h2, h3, h4, h5, h6)\n\theader: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"h1\" ||\n\t\t       name === \"h2\" ||\n\t\t       name === \"h3\" ||\n\t\t       name === \"h4\" ||\n\t\t       name === \"h5\" ||\n\t\t       name === \"h6\";\n\t},\n\n\t//:matches(button, input[type=button])\n\tbutton: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"button\" ||\n\t\t       name === \"input\" &&\n\t\t       getAttribute(elem, \"type\") === \"button\";\n\t},\n\t//:matches(input, textarea, select, button)\n\tinput: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"input\" ||\n\t\t       name === \"textarea\" ||\n\t\t       name === \"select\" ||\n\t\t       name === \"button\";\n\t},\n\t//input:matches(:not([type!='']), [type='text' i])\n\ttext: function(elem){\n\t\tvar attr;\n\t\treturn getName(elem) === \"input\" && (\n\t\t\t!(attr = getAttribute(elem, \"type\")) ||\n\t\t\tattr.toLowerCase() === \"text\"\n\t\t);\n\t}\n};\n\nfunction verifyArgs(func, name, subselect){\n\tif(subselect === null){\n\t\tif(func.length > 1 && name !== \"scope\"){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" requires an argument\");\n\t\t}\n\t} else {\n\t\tif(func.length === 1){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" doesn't have any arguments\");\n\t\t}\n\t}\n}\n\n//FIXME this feels hacky\nvar re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;\n\nmodule.exports = {\n\tcompile: function(next, data, options, context){\n\t\tvar name = data.name,\n\t\t\tsubselect = data.data;\n\n\t\tif(options && options.strict && !re_CSS3.test(name)){\n\t\t\tthrow SyntaxError(\":\" + name + \" isn't part of CSS3\");\n\t\t}\n\n\t\tif(typeof filters[name] === \"function\"){\n\t\t\tverifyArgs(filters[name], name,  subselect);\n\t\t\treturn filters[name](next, subselect, options, context);\n\t\t} else if(typeof pseudos[name] === \"function\"){\n\t\t\tvar func = pseudos[name];\n\t\t\tverifyArgs(func, name, subselect);\n\n\t\t\tif(next === trueFunc) return func;\n\n\t\t\treturn function pseudoArgs(elem){\n\t\t\t\treturn func(elem, subselect) && next(elem);\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new SyntaxError(\"unmatched pseudo-class :\" + name);\n\t\t}\n\t},\n\tfilters: filters,\n\tpseudos: pseudos\n};\n","\"use strict\";\n\nmodule.exports = parse;\n\nvar re_name = /^(?:\\\\.|[\\w\\-\\u00b0-\\uFFFF])+/,\n    re_escape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/ig,\n    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87\n    re_attr = /^\\s*((?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])+)\\s*(?:(\\S?)=\\s*(?:(['\"])([^]*?)\\3|(#?(?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])*)|)|)\\s*(i)?\\]/;\n\nvar actionTypes = {\n\t__proto__: null,\n\t\"undefined\": \"exists\",\n\t\"\":  \"equals\",\n\t\"~\": \"element\",\n\t\"^\": \"start\",\n\t\"$\": \"end\",\n\t\"*\": \"any\",\n\t\"!\": \"not\",\n\t\"|\": \"hyphen\"\n};\n\nvar simpleSelectors = {\n\t__proto__: null,\n\t\">\": \"child\",\n\t\"<\": \"parent\",\n\t\"~\": \"sibling\",\n\t\"+\": \"adjacent\"\n};\n\nvar attribSelectors = {\n\t__proto__: null,\n\t\"#\": [\"id\", \"equals\"],\n\t\".\": [\"class\", \"element\"]\n};\n\n//pseudos, whose data-property is parsed as well\nvar unpackPseudos = {\n\t__proto__: null,\n\t\"has\": true,\n\t\"not\": true,\n\t\"matches\": true\n};\n\nvar stripQuotesFromPseudos = {\n\t__proto__: null,\n\t\"contains\": true,\n\t\"icontains\": true\n};\n\nvar quotes = {\n\t__proto__: null,\n\t\"\\\"\": true,\n\t\"'\": true\n};\n\n//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139\nfunction funescape( _, escaped, escapedWhitespace ) {\n\tvar high = \"0x\" + escaped - 0x10000;\n\t// NaN means non-codepoint\n\t// Support: Firefox\n\t// Workaround erroneous numeric interpretation of +\"0x\"\n\treturn high !== high || escapedWhitespace ?\n\t\tescaped :\n\t\t// BMP codepoint\n\t\thigh < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n}\n\nfunction unescapeCSS(str){\n\treturn str.replace(re_escape, funescape);\n}\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n\nfunction parse(selector, options){\n\tvar subselects = [];\n\n\tselector = parseSelector(subselects, selector + \"\", options);\n\n\tif(selector !== \"\"){\n\t\tthrow new SyntaxError(\"Unmatched selector: \" + selector);\n\t}\n\n\treturn subselects;\n}\n\nfunction parseSelector(subselects, selector, options){\n\tvar tokens = [],\n\t\tsawWS = false,\n\t\tdata, firstChar, name, quot;\n\n\tfunction getName(){\n\t\tvar sub = selector.match(re_name)[0];\n\t\tselector = selector.substr(sub.length);\n\t\treturn unescapeCSS(sub);\n\t}\n\n\tfunction stripWhitespace(start){\n\t\twhile(isWhitespace(selector.charAt(start))) start++;\n\t\tselector = selector.substr(start);\n\t}\n\n\tfunction isEscaped(pos) {\n\t\tvar slashCount = 0;\n\n\t\twhile (selector.charAt(--pos) === \"\\\\\") slashCount++;\n\t\treturn (slashCount & 1) === 1;\n\t}\n\n\tstripWhitespace(0);\n\n\twhile(selector !== \"\"){\n\t\tfirstChar = selector.charAt(0);\n\n\t\tif(isWhitespace(firstChar)){\n\t\t\tsawWS = true;\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar in simpleSelectors){\n\t\t\ttokens.push({type: simpleSelectors[firstChar]});\n\t\t\tsawWS = false;\n\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar === \",\"){\n\t\t\tif(tokens.length === 0){\n\t\t\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t\t\t}\n\t\t\tsubselects.push(tokens);\n\t\t\ttokens = [];\n\t\t\tsawWS = false;\n\t\t\tstripWhitespace(1);\n\t\t} else {\n\t\t\tif(sawWS){\n\t\t\t\tif(tokens.length > 0){\n\t\t\t\t\ttokens.push({type: \"descendant\"});\n\t\t\t\t}\n\t\t\t\tsawWS = false;\n\t\t\t}\n\n\t\t\tif(firstChar === \"*\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({type: \"universal\"});\n\t\t\t} else if(firstChar in attribSelectors){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: attribSelectors[firstChar][0],\n\t\t\t\t\taction: attribSelectors[firstChar][1],\n\t\t\t\t\tvalue: getName(),\n\t\t\t\t\tignoreCase: false\n\t\t\t\t});\n\t\t\t} else if(firstChar === \"[\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\tdata = selector.match(re_attr);\n\t\t\t\tif(!data){\n\t\t\t\t\tthrow new SyntaxError(\"Malformed attribute selector: \" + selector);\n\t\t\t\t}\n\t\t\t\tselector = selector.substr(data[0].length);\n\t\t\t\tname = unescapeCSS(data[1]);\n\n\t\t\t\tif(\n\t\t\t\t\t!options || (\n\t\t\t\t\t\t\"lowerCaseAttributeNames\" in options ?\n\t\t\t\t\t\t\toptions.lowerCaseAttributeNames :\n\t\t\t\t\t\t\t!options.xmlMode\n\t\t\t\t\t)\n\t\t\t\t){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: name,\n\t\t\t\t\taction: actionTypes[data[2]],\n\t\t\t\t\tvalue: unescapeCSS(data[4] || data[5] || \"\"),\n\t\t\t\t\tignoreCase: !!data[6]\n\t\t\t\t});\n\n\t\t\t} else if(firstChar === \":\"){\n\t\t\t\tif(selector.charAt(1) === \":\"){\n\t\t\t\t\tselector = selector.substr(2);\n\t\t\t\t\ttokens.push({type: \"pseudo-element\", name: getName().toLowerCase()});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.substr(1);\n\n\t\t\t\tname = getName().toLowerCase();\n\t\t\t\tdata = null;\n\n\t\t\t\tif(selector.charAt(0) === \"(\"){\n\t\t\t\t\tif(name in unpackPseudos){\n\t\t\t\t\t\tquot = selector.charAt(1);\n\t\t\t\t\t\tvar quoted = quot in quotes;\n\n\t\t\t\t\t\tselector = selector.substr(quoted + 1);\n\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tselector = parseSelector(data, selector, options);\n\n\t\t\t\t\t\tif(quoted){\n\t\t\t\t\t\t\tif(selector.charAt(0) !== quot){\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\"unmatched quotes in :\" + name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(selector.charAt(0) !== \")\"){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"missing closing parenthesis in :\" + name + \" \" + selector);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar pos = 1, counter = 1;\n\n\t\t\t\t\t\tfor(; counter > 0 && pos < selector.length; pos++){\n\t\t\t\t\t\t\tif(selector.charAt(pos) === \"(\" && !isEscaped(pos)) counter++;\n\t\t\t\t\t\t\telse if(selector.charAt(pos) === \")\" && !isEscaped(pos)) counter--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"parenthesis not matched\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = selector.substr(1, pos - 2);\n\t\t\t\t\t\tselector = selector.substr(pos);\n\n\t\t\t\t\t\tif(name in stripQuotesFromPseudos){\n\t\t\t\t\t\t\tquot = data.charAt(0);\n\n\t\t\t\t\t\t\tif(quot === data.slice(-1) && quot in quotes){\n\t\t\t\t\t\t\t\tdata = data.slice(1, -1);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdata = unescapeCSS(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"pseudo\", name: name, data: data});\n\t\t\t} else if(re_name.test(selector)){\n\t\t\t\tname = getName();\n\n\t\t\t\tif(!options || (\"lowerCaseTags\" in options ? options.lowerCaseTags : !options.xmlMode)){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"tag\", name: name});\n\t\t\t} else {\n\t\t\t\tif(tokens.length && tokens[tokens.length - 1].type === \"descendant\"){\n\t\t\t\t\ttokens.pop();\n\t\t\t\t}\n\t\t\t\taddToken(subselects, tokens);\n\t\t\t\treturn selector;\n\t\t\t}\n\t\t}\n\t}\n\n\taddToken(subselects, tokens);\n\n\treturn selector;\n}\n\nfunction addToken(subselects, tokens){\n\tif(subselects.length > 0 && tokens.length === 0){\n\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t}\n\n\tsubselects.push(tokens);\n}\n","var DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    getName     = DomUtils.getName;\n\n/*\n\tall available rules\n*/\nmodule.exports = {\n\t__proto__: null,\n\n\tattribute: require(\"./attributes.js\").compile,\n\tpseudo: require(\"./pseudos.js\").compile,\n\n\t//tags\n\ttag: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function tag(elem){\n\t\t\treturn getName(elem) === name && next(elem);\n\t\t};\n\t},\n\n\t//traversal\n\tdescendant: function(next, rule, options, context, acceptSelf){\n\t\treturn function descendant(elem){\n\n\t\t\tif (acceptSelf && next(elem)) return true;\n\n\t\t\tvar found = false;\n\n\t\t\twhile(!found && (elem = getParent(elem))){\n\t\t\t\tfound = next(elem);\n\t\t\t}\n\n\t\t\treturn found;\n\t\t};\n\t},\n\tparent: function(next, data, options){\n\t\tif(options && options.strict) throw SyntaxError(\"Parent selector isn't part of CSS3\");\n\n\t\treturn function parent(elem){\n\t\t\treturn getChildren(elem).some(test);\n\t\t};\n\n\t\tfunction test(elem){\n\t\t\treturn isTag(elem) && next(elem);\n\t\t}\n\t},\n\tchild: function(next){\n\t\treturn function child(elem){\n\t\t\tvar parent = getParent(elem);\n\t\t\treturn !!parent && next(parent);\n\t\t};\n\t},\n\tsibling: function(next){\n\t\treturn function sibling(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(next(siblings[i])) return true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\t},\n\tadjacent: function(next){\n\t\treturn function adjacent(elem){\n\t\t\tvar siblings = getSiblings(elem),\n\t\t\t    lastElement;\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tlastElement = siblings[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !!lastElement && next(lastElement);\n\t\t};\n\t},\n\tuniversal: function(next){\n\t\treturn next;\n\t}\n};","module.exports = sortByProcedure;\n\n/*\n\tsort the parts of the passed selector,\n\tas there is potential for optimization\n\t(some types of selectors are faster than others)\n*/\n\nvar procedure = require(\"./procedure.json\");\n\nvar attributes = {\n\t__proto__: null,\n\texists: 10,\n\tequals: 8,\n\tnot: 7,\n\tstart: 6,\n\tend: 6,\n\tany: 5,\n\thyphen: 4,\n\telement: 4\n};\n\nfunction sortByProcedure(arr){\n\tvar procs = arr.map(getProcedure);\n\tfor(var i = 1; i < arr.length; i++){\n\t\tvar procNew = procs[i];\n\n\t\tif(procNew < 0) continue;\n\n\t\tfor(var j = i - 1; j >= 0 && procNew < procs[j]; j--){\n\t\t\tvar token = arr[j + 1];\n\t\t\tarr[j + 1] = arr[j];\n\t\t\tarr[j] = token;\n\t\t\tprocs[j + 1] = procs[j];\n\t\t\tprocs[j] = procNew;\n\t\t}\n\t}\n}\n\nfunction getProcedure(token){\n\tvar proc = procedure[token.type];\n\n\tif(proc === procedure.attribute){\n\t\tproc = attributes[token.action];\n\n\t\tif(proc === attributes.equals && token.name === \"id\"){\n\t\t\t//prefer ID selectors (eg. #ID)\n\t\t\tproc = 9;\n\t\t}\n\n\t\tif(token.ignoreCase){\n\t\t\t//ignoreCase adds some overhead, prefer \"normal\" token\n\t\t\t//this is a binary operation, to ensure it's still an int\n\t\t\tproc >>= 1;\n\t\t}\n\t} else if(proc === procedure.pseudo){\n\t\tif(!token.data){\n\t\t\tproc = 3;\n\t\t} else if(token.name === \"has\" || token.name === \"contains\"){\n\t\t\tproc = 0; //expensive in any case\n\t\t} else if(token.name === \"matches\" || token.name === \"not\"){\n\t\t\tproc = 0;\n\t\t\tfor(var i = 0; i < token.data.length; i++){\n\t\t\t\t//TODO better handling of complex selectors\n\t\t\t\tif(token.data[i].length !== 1) continue;\n\t\t\t\tvar cur = getProcedure(token.data[i][0]);\n\t\t\t\t//avoid executing :has or :contains\n\t\t\t\tif(cur === 0){\n\t\t\t\t\tproc = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(cur > proc) proc = cur;\n\t\t\t}\n\t\t\tif(token.data.length > 1 && proc > 0) proc -= 1;\n\t\t} else {\n\t\t\tproc = 1;\n\t\t}\n\t}\n\treturn proc;\n}\n","/*\n\tcompiles a selector to an executable function\n*/\n\nmodule.exports = compile;\nmodule.exports.compileUnsafe = compileUnsafe;\nmodule.exports.compileToken = compileToken;\n\nvar parse       = require(\"css-what\"),\n    DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    Rules       = require(\"./general.js\"),\n    sortRules   = require(\"./sort.js\"),\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc,\n    procedure   = require(\"./procedure.json\");\n\nfunction compile(selector, options, context){\n\tvar next = compileUnsafe(selector, options, context);\n\treturn wrap(next);\n}\n\nfunction wrap(next){\n\treturn function base(elem){\n\t\treturn isTag(elem) && next(elem);\n\t};\n}\n\nfunction compileUnsafe(selector, options, context){\n\tvar token = parse(selector, options);\n\treturn compileToken(token, options, context);\n}\n\nfunction includesScopePseudo(t){\n    return t.type === \"pseudo\" && (\n        t.name === \"scope\" || (\n            Array.isArray(t.data) &&\n            t.data.some(function(data){\n                return data.some(includesScopePseudo);\n            })\n        )\n    );\n}\n\nvar DESCENDANT_TOKEN = {type: \"descendant\"},\n    SCOPE_TOKEN = {type: \"pseudo\", name: \"scope\"},\n    PLACEHOLDER_ELEMENT = {},\n    getParent = DomUtils.getParent;\n\n//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n//http://www.w3.org/TR/selectors4/#absolutizing\nfunction absolutize(token, context){\n    //TODO better check if context is document\n    var hasContext = !!context && !!context.length && context.every(function(e){\n        return e === PLACEHOLDER_ELEMENT || !!getParent(e);\n    });\n\n\n    token.forEach(function(t){\n        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== \"descendant\"){\n            //don't return in else branch\n        } else if(hasContext && !includesScopePseudo(t)){\n            t.unshift(DESCENDANT_TOKEN);\n        } else {\n            return;\n        }\n\n        t.unshift(SCOPE_TOKEN);\n    });\n}\n\nfunction compileToken(token, options, context){\n    token = token.filter(function(t){ return t.length > 0; });\n\n\ttoken.forEach(sortRules);\n\n\tvar isArrayContext = Array.isArray(context);\n\n    context = (options && options.context) || context;\n\n    if(context && !isArrayContext) context = [context];\n\n    absolutize(token, context);\n\n\treturn token\n\t\t.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })\n\t\t.reduce(reduceRules, falseFunc);\n}\n\nfunction isTraversal(t){\n\treturn procedure[t.type] < 0;\n}\n\nfunction compileRules(rules, options, context, isArrayContext){\n\tvar acceptSelf = (isArrayContext && rules[0].name === \"scope\" && rules[1].type === \"descendant\");\n\treturn rules.reduce(function(func, rule, index){\n\t\tif(func === falseFunc) return func;\n\t\treturn Rules[rule.type](func, rule, options, context, acceptSelf && index === 1);\n\t}, options && options.rootFunc || trueFunc);\n}\n\nfunction reduceRules(a, b){\n\tif(b === falseFunc || a === trueFunc){\n\t\treturn a;\n\t}\n\tif(a === falseFunc || b === trueFunc){\n\t\treturn b;\n\t}\n\n\treturn function combine(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\n//:not, :has and :matches have to compile selectors\n//doing this in lib/pseudos.js would lead to circular dependencies,\n//so we add them here\n\nvar Pseudos     = require(\"./pseudos.js\"),\n    filters     = Pseudos.filters,\n    existsOne   = DomUtils.existsOne,\n    isTag       = DomUtils.isTag,\n    getChildren = DomUtils.getChildren;\n\n\nfunction containsTraversal(t){\n\treturn t.some(isTraversal);\n}\n\nfilters.not = function(next, token, options, context){\n\tvar opts = {\n\t    \txmlMode: !!(options && options.xmlMode),\n\t    \tstrict: !!(options && options.strict)\n\t    };\n\n\tif(opts.strict){\n\t\tif(token.length > 1 || token.some(containsTraversal)){\n\t\t\tthrow new SyntaxError(\"complex selectors in :not aren't allowed in strict mode\");\n\t\t}\n\t}\n\n    var func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return next;\n\tif(func === trueFunc)  return falseFunc;\n\n\treturn function(elem){\n\t\treturn !func(elem) && next(elem);\n\t};\n};\n\nfilters.has = function(next, token, options){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict)\n\t};\n\n    //FIXME: Uses an array as a pointer to the current element (side effects)\n    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;\n\n\tvar func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return falseFunc;\n\tif(func === trueFunc)  return function(elem){\n\t\t\treturn getChildren(elem).some(isTag) && next(elem);\n\t\t};\n\n\tfunc = wrap(func);\n\n    if(context){\n        return function has(elem){\n\t\treturn next(elem) && (\n                (context[0] = elem), existsOne(func, getChildren(elem))\n            );\n\t};\n    }\n\n    return function has(elem){\n\t\treturn next(elem) && existsOne(func, getChildren(elem));\n\t};\n};\n\nfilters.matches = function(next, token, options, context){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict),\n\t\trootFunc: next\n\t};\n\n\treturn compileToken(token, opts, context);\n};\n","\"use strict\";\n\nmodule.exports = CSSselect;\n\nvar Pseudos       = require(\"./lib/pseudos.js\"),\n    DomUtils      = require(\"domutils\"),\n    findOne       = DomUtils.findOne,\n    findAll       = DomUtils.findAll,\n    getChildren   = DomUtils.getChildren,\n    removeSubsets = DomUtils.removeSubsets,\n    falseFunc     = require(\"boolbase\").falseFunc,\n    compile       = require(\"./lib/compile.js\"),\n    compileUnsafe = compile.compileUnsafe,\n    compileToken  = compile.compileToken;\n\nfunction getSelectorFunc(searchFunc){\n\treturn function select(query, elems, options){\n        if(typeof query !== \"function\") query = compileUnsafe(query, options, elems);\n        if(!Array.isArray(elems)) elems = getChildren(elems);\n\t\telse elems = removeSubsets(elems);\n\t\treturn searchFunc(query, elems);\n\t};\n}\n\nvar selectAll = getSelectorFunc(function selectAll(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? [] : findAll(query, elems);\n});\n\nvar selectOne = getSelectorFunc(function selectOne(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? null : findOne(query, elems);\n});\n\nfunction is(elem, query, options){\n\treturn (typeof query === \"function\" ? query : compile(query, options))(elem);\n}\n\n/*\n\tthe exported interface\n*/\nfunction CSSselect(query, elems, options){\n\treturn selectAll(query, elems, options);\n}\n\nCSSselect.compile = compile;\nCSSselect.filters = Pseudos.filters;\nCSSselect.pseudos = Pseudos.pseudos;\n\nCSSselect.selectAll = selectAll;\nCSSselect.selectOne = selectOne;\n\nCSSselect.is = is;\n\n//legacy methods (might be removed)\nCSSselect.parse = compile;\nCSSselect.iterate = selectAll;\n\n//hooks\nCSSselect._compileUnsafe = compileUnsafe;\nCSSselect._compileToken = compileToken;\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport parse5 from 'parse5';\nimport select from 'css-select';\n\n// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere\nconst treeAdapter = require('parse5-htmlparser2-tree-adapter');\n\nconst PARSE5_OPTS = {\n  treeAdapter\n};\n\n/**\n * Parse HTML into a mutable, serializable DOM Document.\n * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.\n * @param {String} html   HTML to parse into a Document instance\n */\nexport function createDocument(html) {\n  const document = parse5.parse(html, PARSE5_OPTS);\n\n  defineProperties(document, DocumentExtensions);\n\n  // Extend Element.prototype with DOM manipulation methods.\n  const scratch = document.createElement('div');\n  // Get a reference to the base Node class - used by createTextNode()\n  document.$$Node = scratch.constructor;\n  const elementProto = Object.getPrototypeOf(scratch);\n  defineProperties(elementProto, ElementExtensions);\n  elementProto.ownerDocument = document;\n\n  return document;\n}\n\n/**\n * Serialize a Document to an HTML String\n * @param {Document} document   A Document, such as one created via `createDocument()`\n */\nexport function serializeDocument(document) {\n  return parse5.serialize(document, PARSE5_OPTS);\n}\n\n/**\n * Methods and descriptors to mix into Element.prototype\n */\nconst ElementExtensions = {\n  /** @extends htmlparser2.Element.prototype */\n\n  nodeName: {\n    get() {\n      return this.tagName.toUpperCase();\n    }\n  },\n\n  id: reflectedProperty('id'),\n\n  className: reflectedProperty('class'),\n\n  insertBefore(child, referenceNode) {\n    if (!referenceNode) return this.appendChild(child);\n    treeAdapter.insertBefore(this, child, referenceNode);\n    return child;\n  },\n\n  appendChild(child) {\n    treeAdapter.appendChild(this, child);\n    return child;\n  },\n\n  removeChild(child) {\n    treeAdapter.detachNode(child);\n  },\n\n  remove() {\n    treeAdapter.detachNode(this);\n  },\n\n  textContent: {\n    get() {\n      return getText(this);\n    },\n\n    set(text) {\n      this.children = [];\n      treeAdapter.insertText(this, text);\n    }\n  },\n\n  setAttribute(name, value) {\n    if (this.attribs == null) this.attribs = {};\n    if (value == null) value = '';\n    this.attribs[name] = value;\n  },\n\n  removeAttribute(name) {\n    if (this.attribs != null) {\n      delete this.attribs[name];\n    }\n  },\n\n  getAttribute(name) {\n    return this.attribs != null && this.attribs[name];\n  },\n\n  hasAttribute(name) {\n    return this.attribs != null && this.attribs[name] != null;\n  },\n\n  getAttributeNode(name) {\n    const value = this.getAttribute(name);\n    if (value != null) return { specified: true, value };\n  }\n};\n\n/**\n * Methods and descriptors to mix into the global document instance\n * @private\n */\nconst DocumentExtensions = {\n  /** @extends htmlparser2.Document.prototype */\n\n  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.\n  // TODO: verify if these are needed for css-select\n  nodeType: {\n    get() {\n      return 9;\n    }\n  },\n\n  contentType: {\n    get() {\n      return 'text/html';\n    }\n  },\n\n  nodeName: {\n    get() {\n      return '#document';\n    }\n  },\n\n  documentElement: {\n    get() {\n      // Find the first <html> element within the document\n      return this.childNodes.filter(\n        (child) => String(child.tagName).toLowerCase() === 'html'\n      );\n    }\n  },\n\n  compatMode: {\n    get() {\n      const compatMode = {\n        'no-quirks': 'CSS1Compat',\n        quirks: 'BackCompat',\n        'limited-quirks': 'CSS1Compat'\n      };\n      return compatMode[treeAdapter.getDocumentMode(this)];\n    }\n  },\n\n  body: {\n    get() {\n      return this.querySelector('body');\n    }\n  },\n\n  createElement(name) {\n    return treeAdapter.createElement(name, null, []);\n  },\n\n  createTextNode(text) {\n    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM\n    const Node = this.$$Node;\n    return new Node({\n      type: 'text',\n      data: text,\n      parent: null,\n      prev: null,\n      next: null\n    });\n  },\n\n  querySelector(sel) {\n    return select.selectOne(sel, this.documentElement);\n  },\n\n  querySelectorAll(sel) {\n    if (sel === ':root') {\n      return this;\n    }\n    return select(sel, this.documentElement);\n  }\n};\n\n/**\n * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.\n * @private\n */\nfunction defineProperties(obj, properties) {\n  for (const i in properties) {\n    const value = properties[i];\n    Object.defineProperty(\n      obj,\n      i,\n      typeof value === 'function' ? { value } : value\n    );\n  }\n}\n\n/**\n * Create a property descriptor defining a getter/setter pair alias for a named attribute.\n * @private\n */\nfunction reflectedProperty(attributeName) {\n  return {\n    get() {\n      return this.getAttribute(attributeName);\n    },\n    set(value) {\n      this.setAttribute(attributeName, value);\n    }\n  };\n}\n\n/**\n * Helper to get the text content of a node\n * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21\n * @private\n */\nfunction getText(node) {\n  if (Array.isArray(node)) return node.map(getText).join('');\n  if (treeAdapter.isElementNode(node))\n    return node.name === 'br' ? '\\n' : getText(node.children);\n  if (treeAdapter.isTextNode(node)) return node.data;\n  return '';\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport css from 'css';\n\n/**\n * Parse a textual CSS Stylesheet into a Stylesheet instance.\n * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.\n * @see https://github.com/reworkcss/css\n * @private\n * @param {String} stylesheet\n * @returns {css.Stylesheet} ast\n */\nexport function parseStylesheet (stylesheet) {\n  return css.parse(stylesheet);\n}\n\n/**\n * Serialize a ReworkCSS Stylesheet to a String of CSS.\n * @private\n * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`\n * @param {Object} options              Options to pass to `css.stringify()`\n * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)\n */\nexport function serializeStylesheet (ast, options) {\n  return css.stringify(ast, options);\n}\n\n/**\n * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.\n * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).\n * @private\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n * @returns {(rule) => void} nonDestructiveIterator\n */\nexport function markOnly (predicate) {\n  return rule => {\n    const sel = rule.selectors;\n    if (predicate(rule) === false) {\n      rule.$$remove = true;\n    }\n    rule.$$markedSelectors = rule.selectors;\n    if (rule._other) {\n      rule._other.$$markedSelectors = rule._other.selectors;\n    }\n    rule.selectors = sel;\n  };\n}\n\n/**\n * Apply filtered selectors to a rule from a previous markOnly run.\n * @private\n * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).\n*/\nexport function applyMarkedSelectors (rule) {\n  if (rule.$$markedSelectors) {\n    rule.selectors = rule.$$markedSelectors;\n  }\n  if (rule._other) {\n    applyMarkedSelectors(rule._other);\n  }\n}\n\n/**\n * Recursively walk all rules in a stylesheet.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n */\nexport function walkStyleRules (node, iterator) {\n  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);\n\n  node.rules = node.rules.filter(rule => {\n    if (rule.rules) {\n      walkStyleRules(rule, iterator);\n    }\n    rule._other = undefined;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n/**\n * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {css.Rule} node2      A second tree identical to `node`\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.\n */\nexport function walkStyleRulesWithReverseMirror (node, node2, iterator) {\n  if (node2 === null) return walkStyleRules(node, iterator);\n\n  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);\n\n  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {\n    const rule2 = rules2[index];\n    if (rule.rules) {\n      walkStyleRulesWithReverseMirror(rule, rule2, iterator);\n    }\n    rule._other = rule2;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n// Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.\n// This is just a quicker version of generating the compliment of the set returned from a filter operation.\nfunction splitFilter (a, b, predicate) {\n  const aOut = [];\n  const bOut = [];\n  for (let index = 0; index < a.length; index++) {\n    if (predicate(a[index], index, a, b)) {\n      aOut.push(a[index]);\n    } else {\n      bOut.push(a[index]);\n    }\n  }\n  return [aOut, bOut];\n}\n\n// can be invoked on a style rule to subset its selectors (with reverse mirroring)\nfunction filterSelectors (predicate) {\n  if (this._other) {\n    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);\n    this.selectors = a;\n    this._other.selectors = b;\n  } else {\n    this.selectors = this.selectors.filter(predicate);\n  }\n}\n","import chalk from 'chalk';\n\nconst LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];\n\nexport const defaultLogger = {\n  trace(msg) {\n    console.trace(msg);\n  },\n\n  debug(msg) {\n    console.debug(msg);\n  },\n\n  warn(msg) {\n    console.warn(chalk.yellow(msg));\n  },\n\n  error(msg) {\n    console.error(chalk.bold.red(msg));\n  },\n\n  info(msg) {\n    console.info(chalk.bold.blue(msg));\n  },\n\n  silent() {}\n};\n\nexport function createLogger(logLevel) {\n  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);\n\n  return LOG_LEVELS.reduce((logger, type, index) => {\n    if (index >= logLevelIdx) {\n      logger[type] = defaultLogger[type];\n    } else {\n      logger[type] = defaultLogger.silent;\n    }\n    return logger;\n  }, {});\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { createDocument, serializeDocument } from './dom';\nimport {\n  parseStylesheet,\n  serializeStylesheet,\n  walkStyleRules,\n  walkStyleRulesWithReverseMirror,\n  markOnly,\n  applyMarkedSelectors\n} from './css';\nimport { createLogger } from './util';\n\n/**\n * The mechanism to use for lazy-loading stylesheets.\n * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).\n *\n * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.\n * - **\"body\":** Move all external stylesheet links to the end of the document.\n * - **\"media\":** Load stylesheets asynchronously by adding `media=\"not x\"` and removing once loaded. <kbd>JS</kbd>\n * - **\"swap\":** Convert stylesheet links to preloads that swap to `rel=\"stylesheet\"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>\n * - **\"swap-high\":** Use `<link rel=\"alternate stylesheet preload\">` and swap to `rel=\"stylesheet\"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>\n * - **\"js\":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>\n * - **\"js-lazy\":** Like `\"js\"`, but the stylesheet is disabled until fully loaded.\n * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy\n * @public\n */\n\n/**\n * Controls which keyframes rules are inlined.\n *\n * - **\"critical\":** _(default)_ inline keyframes rules that are used by the critical CSS.\n * - **\"all\":** Inline all keyframes rules.\n * - **\"none\":** Remove all keyframes rules.\n * @typedef {('critical'|'all'|'none')} KeyframeStrategy\n * @private\n * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_\n */\n\n/**\n * Controls log level of the plugin. Specifies the level the logger should use. A logger will\n * not produce output for any log level beneath the specified level. Available levels and order\n * are:\n *\n * - **\"info\"** _(default)_\n * - **\"warn\"**\n * - **\"error\"**\n * - **\"trace\"**\n * - **\"debug\"**\n * - **\"silent\"**\n * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel\n * @public\n */\n\n/**\n * Custom logger interface:\n * @typedef {object} Logger\n * @public\n * @property {function(String)} trace - Prints a trace message\n * @property {function(String)} debug - Prints a debug message\n * @property {function(String)} info - Prints an information message\n * @property {function(String)} warn - Prints a warning message\n * @property {function(String)} error - Prints an error message\n */\n\n/**\n * All optional. Pass them to `new Critters({ ... })`.\n * @public\n * @typedef Options\n * @property {String} path     Base path location of the CSS files _(default: `''`)_\n * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_\n * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_\n * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_\n * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_\n * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_\n * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_\n * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.\n * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use\n * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies\n * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_\n * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_\n * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`\n *  - Values:\n *  - `true` to inline critical font-face rules and preload the fonts\n *  - `false` to don't inline any font-face rules and don't preload fonts\n * @property {String} keyframes     Controls which keyframes rules are inlined.\n *  - Values:\n *  - `\"critical\"`: _(default)_ inline keyframes rules used by the critical CSS\n *  - `\"all\"` inline all keyframes rules\n *  - `\"none\"` remove all keyframes rules\n * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_\n * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `\"info\"`)_\n * @property {object} logger        Provide a custom logger interface {@link Logger logger}\n */\n\nexport default class Critters {\n  /** @private */\n  constructor(options) {\n    this.options = Object.assign(\n      {\n        logLevel: 'info',\n        path: '',\n        publicPath: '',\n        reduceInlineStyles: true,\n        pruneSource: false,\n        additionalStylesheets: []\n      },\n      options || {}\n    );\n\n    this.urlFilter = this.options.filter;\n    if (this.urlFilter instanceof RegExp) {\n      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);\n    }\n\n    this.logger = this.options.logger || createLogger(this.options.logLevel);\n  }\n\n  /**\n   * Read the contents of a file from the specified filesystem or disk\n   */\n  readFile(filename) {\n    const fs = this.fs;\n    return new Promise((resolve, reject) => {\n      const callback = (err, data) => {\n        if (err) reject(err);\n        else resolve(data);\n      };\n      if (fs && fs.readFile) {\n        fs.readFile(filename, callback);\n      } else {\n        require('fs').readFile(filename, 'utf8', callback);\n      }\n    });\n  }\n\n  /**\n   * Apply critical CSS processing to the html\n   */\n  async process(html) {\n    const start = process.hrtime.bigint();\n\n    // Parse the generated HTML in a DOM we can mutate\n    const document = createDocument(html);\n\n    if (this.options.additionalStylesheets.length > 0) {\n      this.embedAdditionalStylesheet(document);\n    }\n\n    // `external:false` skips processing of external sheets\n    if (this.options.external !== false) {\n      const externalSheets = [].slice.call(\n        document.querySelectorAll('link[rel=\"stylesheet\"]')\n      );\n\n      await Promise.all(\n        externalSheets.map((link) => this.embedLinkedStylesheet(link, document))\n      );\n    }\n\n    // go through all the style tags in the document and reduce them to only critical CSS\n    const styles = this.getAffectedStyleTags(document);\n\n    await Promise.all(\n      styles.map((style) => this.processStyle(style, document))\n    );\n\n    if (this.options.mergeStylesheets !== false && styles.length !== 0) {\n      await this.mergeStylesheets(document);\n    }\n\n    // serialize the document back to HTML and we're done\n    const output = serializeDocument(document);\n    const end = process.hrtime.bigint();\n    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);\n    return output;\n  }\n\n  /**\n   * Get the style tags that need processing\n   */\n  getAffectedStyleTags(document) {\n    const styles = [].slice.call(document.querySelectorAll('style'));\n\n    // `inline:false` skips processing of inline stylesheets\n    if (this.options.reduceInlineStyles === false) {\n      return styles.filter((style) => style.$$external);\n    }\n    return styles;\n  }\n\n  async mergeStylesheets(document) {\n    const styles = this.getAffectedStyleTags(document);\n    if (styles.length === 0) {\n      this.logger.warn(\n        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'\n      );\n      return;\n    }\n    const first = styles[0];\n    let sheet = first.textContent;\n\n    for (let i = 1; i < styles.length; i++) {\n      const node = styles[i];\n      sheet += node.textContent;\n      node.remove();\n    }\n\n    first.textContent = sheet;\n  }\n\n  /**\n   * Given href, find the corresponding CSS asset\n   */\n  async getCssAsset(href) {\n    const outputPath = this.options.path;\n    const publicPath = this.options.publicPath;\n\n    // CHECK - the output path\n    // path on disk (with output.publicPath removed)\n    let normalizedPath = href.replace(/^\\//, '');\n    const pathPrefix = (publicPath || '').replace(/(^\\/|\\/$)/g, '') + '/';\n    if (normalizedPath.indexOf(pathPrefix) === 0) {\n      normalizedPath = normalizedPath\n        .substring(pathPrefix.length)\n        .replace(/^\\//, '');\n    }\n    const filename = path.resolve(outputPath, normalizedPath);\n\n    let sheet;\n\n    try {\n      sheet = await this.readFile(filename);\n    } catch (e) {\n      this.logger.warn(`Unable to locate stylesheet: ${filename}`);\n    }\n\n    return sheet;\n  }\n\n  checkInlineThreshold(link, style, sheet) {\n    if (\n      this.options.inlineThreshold &&\n      sheet.length < this.options.inlineThreshold\n    ) {\n      const href = style.$$name;\n      style.$$reduce = false;\n      this.logger.info(\n        `\\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\\u001b[39m`\n      );\n      link.remove();\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)\n   */\n  async embedAdditionalStylesheet(document) {\n    const styleSheetsIncluded = [];\n\n    const sources = await Promise.all(\n      this.options.additionalStylesheets.map((cssFile) => {\n        if (styleSheetsIncluded.includes(cssFile)) {\n          return;\n        }\n        styleSheetsIncluded.push(cssFile);\n        const style = document.createElement('style');\n        style.$$external = true;\n        return this.getCssAsset(cssFile, style).then((sheet) => [sheet, style]);\n      })\n    );\n\n    sources.forEach(([sheet, style]) => {\n      if (!sheet) return;\n      style.textContent = sheet;\n      document.head.appendChild(style);\n    });\n  }\n\n  /**\n   * Inline the target stylesheet referred to by a <link rel=\"stylesheet\"> (assuming it passes `options.filter`)\n   */\n  async embedLinkedStylesheet(link, document) {\n    const href = link.getAttribute('href');\n    const media = link.getAttribute('media');\n\n    const preloadMode = this.options.preload;\n\n    // skip filtered resources, or network resources if no filter is provided\n    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\\.css$/)) {\n      return Promise.resolve();\n    }\n\n    // the reduced critical CSS gets injected into a new <style> tag\n    const style = document.createElement('style');\n    style.$$external = true;\n    const sheet = await this.getCssAsset(href, style);\n\n    if (!sheet) {\n      return;\n    }\n\n    style.textContent = sheet;\n    style.$$name = href;\n    style.$$links = [link];\n    link.parentNode.insertBefore(style, link);\n\n    if (this.checkInlineThreshold(link, style, sheet)) {\n      return;\n    }\n\n    // CSS loader is only injected for the first sheet, then this becomes an empty string\n    let cssLoaderPreamble =\n      \"function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}\";\n    const lazy = preloadMode === 'js-lazy';\n    if (lazy) {\n      cssLoaderPreamble = cssLoaderPreamble.replace(\n        'l.href',\n        \"l.media='print';l.onload=function(){l.media=m};l.href\"\n      );\n    }\n\n    // Allow disabling any mutation of the stylesheet link:\n    if (preloadMode === false) return;\n\n    let noscriptFallback = false;\n\n    if (preloadMode === 'body') {\n      document.body.appendChild(link);\n    } else {\n      link.setAttribute('rel', 'preload');\n      link.setAttribute('as', 'style');\n      if (preloadMode === 'js' || preloadMode === 'js-lazy') {\n        const script = document.createElement('script');\n        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${\n          lazy ? ',' + JSON.stringify(media || 'all') : ''\n        })`;\n        // script.appendChild(document.createTextNode(js));\n        script.textContent = js;\n        link.parentNode.insertBefore(script, link.nextSibling);\n        style.$$links.push(script);\n        cssLoaderPreamble = '';\n        noscriptFallback = true;\n      } else if (preloadMode === 'media') {\n        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26\n        link.setAttribute('rel', 'stylesheet');\n        link.removeAttribute('as');\n        link.setAttribute('media', 'print');\n        link.setAttribute('onload', `this.media='${media || 'all'}'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap-high') {\n        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html\n        link.setAttribute('rel', 'alternate stylesheet preload');\n        link.setAttribute('title', 'styles');\n        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap') {\n        link.setAttribute('onload', \"this.rel='stylesheet'\");\n        noscriptFallback = true;\n      } else {\n        const bodyLink = document.createElement('link');\n        bodyLink.setAttribute('rel', 'stylesheet');\n        if (media) bodyLink.setAttribute('media', media);\n        bodyLink.setAttribute('href', href);\n        document.body.appendChild(bodyLink);\n        style.$$links.push(bodyLink);\n      }\n    }\n\n    if (this.options.noscriptFallback !== false && noscriptFallback) {\n      const noscript = document.createElement('noscript');\n      const noscriptLink = document.createElement('link');\n      noscriptLink.setAttribute('rel', 'stylesheet');\n      noscriptLink.setAttribute('href', href);\n      if (media) noscriptLink.setAttribute('media', media);\n      noscript.appendChild(noscriptLink);\n      link.parentNode.insertBefore(noscript, link.nextSibling);\n      style.$$links.push(noscript);\n    }\n  }\n\n  /**\n   * Prune the source CSS files\n   */\n  pruneSource(style, before, sheetInverse) {\n    // if external stylesheet would be below minimum size, just inline everything\n    const minSize = this.options.minimumExternalSize;\n    const name = style.$$name;\n    if (minSize && sheetInverse.length < minSize) {\n      this.logger.info(\n        `\\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\\u001b[39m`\n      );\n      style.textContent = before;\n      // remove any associated external resources/loaders:\n      if (style.$$links) {\n        for (const link of style.$$links) {\n          const parent = link.parentNode;\n          if (parent) parent.removeChild(link);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.\n   */\n  async processStyle(style, document) {\n    if (style.$$reduce === false) return;\n\n    const name = style.$$name ? style.$$name.replace(/^\\//, '') : 'inline CSS';\n    const options = this.options;\n    // const document = style.ownerDocument;\n    const head = document.querySelector('head');\n    let keyframesMode = options.keyframes || 'critical';\n    // we also accept a boolean value for options.keyframes\n    if (keyframesMode === true) keyframesMode = 'all';\n    if (keyframesMode === false) keyframesMode = 'none';\n\n    let sheet = style.textContent;\n\n    // store a reference to the previous serialized stylesheet for reporting stats\n    const before = sheet;\n\n    // Skip empty stylesheets\n    if (!sheet) return;\n\n    const ast = parseStylesheet(sheet);\n    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;\n\n    // a string to search for font names (very loose)\n    let criticalFonts = '';\n\n    const failedSelectors = [];\n\n    const criticalKeyframeNames = [];\n\n    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.\n    // This first pass is also used to collect font and keyframe usage used in the second pass.\n    walkStyleRules(\n      ast,\n      markOnly((rule) => {\n        if (rule.type === 'rule') {\n          // Filter the selector list down to only those match\n          rule.filterSelectors((sel) => {\n            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.\n            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.\n            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {\n              return true;\n            }\n            sel = sel\n              .replace(/(?<!\\\\)::?[a-z-]+(?![a-z-(])/gi, '')\n              .replace(/::?not\\(\\s*\\)/g, '')\n              .trim();\n            if (!sel) return false;\n\n            try {\n              return document.querySelector(sel) != null;\n            } catch (e) {\n              failedSelectors.push(sel + ' -> ' + e.message);\n              return false;\n            }\n          });\n          // If there are no matched selectors, remove the rule:\n          if (rule.selectors.length === 0) {\n            return false;\n          }\n\n          if (rule.declarations) {\n            for (let i = 0; i < rule.declarations.length; i++) {\n              const decl = rule.declarations[i];\n\n              // detect used fonts\n              if (decl.property && decl.property.match(/\\bfont(-family)?\\b/i)) {\n                criticalFonts += ' ' + decl.value;\n              }\n\n              // detect used keyframes\n              if (\n                decl.property === 'animation' ||\n                decl.property === 'animation-name'\n              ) {\n                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.\n                const names = decl.value.split(/\\s+/);\n                for (let j = 0; j < names.length; j++) {\n                  const name = names[j].trim();\n                  if (name) criticalKeyframeNames.push(name);\n                }\n              }\n            }\n          }\n        }\n\n        // keep font rules, they're handled in the second pass:\n        if (rule.type === 'font-face') return;\n\n        // If there are no remaining rules, remove the whole rule:\n        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);\n        return !rules || rules.length !== 0;\n      })\n    );\n\n    if (failedSelectors.length !== 0) {\n      this.logger.warn(\n        `${\n          failedSelectors.length\n        } rules skipped due to selector errors:\\n  ${failedSelectors.join(\n          '\\n  '\n        )}`\n      );\n    }\n\n    const shouldPreloadFonts =\n      options.fonts === true || options.preloadFonts === true;\n    const shouldInlineFonts =\n      options.fonts !== false && options.inlineFonts === true;\n\n    const preloadedFonts = [];\n    // Second pass, using data picked up from the first\n    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {\n      // remove any rules marked in the first pass\n      if (rule.$$remove === true) return false;\n\n      applyMarkedSelectors(rule);\n\n      // prune @keyframes rules\n      if (rule.type === 'keyframes') {\n        if (keyframesMode === 'none') return false;\n        if (keyframesMode === 'all') return true;\n        return criticalKeyframeNames.indexOf(rule.name) !== -1;\n      }\n\n      // prune @font-face rules\n      if (rule.type === 'font-face') {\n        let family, src;\n        for (let i = 0; i < rule.declarations.length; i++) {\n          const decl = rule.declarations[i];\n          if (decl.property === 'src') {\n            // @todo parse this properly and generate multiple preloads with type=\"font/woff2\" etc\n            src = (decl.value.match(/url\\s*\\(\\s*(['\"]?)(.+?)\\1\\s*\\)/) || [])[2];\n          } else if (decl.property === 'font-family') {\n            family = decl.value;\n          }\n        }\n\n        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {\n          preloadedFonts.push(src);\n          const preload = document.createElement('link');\n          preload.setAttribute('rel', 'preload');\n          preload.setAttribute('as', 'font');\n          preload.setAttribute('crossorigin', 'anonymous');\n          preload.setAttribute('href', src.trim());\n          head.appendChild(preload);\n        }\n\n        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:\n        if (\n          !family ||\n          !src ||\n          criticalFonts.indexOf(family) === -1 ||\n          !shouldInlineFonts\n        ) {\n          return false;\n        }\n      }\n    });\n\n    sheet = serializeStylesheet(ast, {\n      compress: this.options.compress !== false\n    }).trim();\n\n    // If all rules were removed, get rid of the style element entirely\n    if (sheet.trim().length === 0) {\n      if (style.parentNode) {\n        style.remove();\n      }\n      return;\n    }\n\n    let afterText = '';\n    let styleInlinedCompletely = false;\n    if (options.pruneSource) {\n      const sheetInverse = serializeStylesheet(astInverse, {\n        compress: this.options.compress !== false\n      });\n\n      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);\n\n      if (styleInlinedCompletely) {\n        const percent = (sheetInverse.length / before.length) * 100;\n        afterText = `, reducing non-inlined size ${\n          percent | 0\n        }% to ${prettyBytes(sheetInverse.length)}`;\n      }\n    }\n\n    // replace the inline stylesheet with its critical'd counterpart\n    if (!styleInlinedCompletely) {\n      style.textContent = sheet;\n    }\n\n    // output stats\n    const percent = ((sheet.length / before.length) * 100) | 0;\n    this.logger.info(\n      '\\u001b[32mInlined ' +\n        prettyBytes(sheet.length) +\n        ' (' +\n        percent +\n        '% of original ' +\n        prettyBytes(before.length) +\n        ') of ' +\n        name +\n        afterText +\n        '.\\u001b[39m'\n    );\n  }\n}\n"],"names":["this","require$$0","require$$1","require$$2","require$$3","decode_1","encode","encode_1","foreignNames","entities","ElementType","getOuterHTML","isTag","require$$4","require$$5","BaseFuncs","compile","parse","DomUtils","falseFunc","getText","hasAttrib","trueFunc","getNCheck","getParent","getChildren","getSiblings","getName","attributes","procedure","sortRules","Rules","filters","Pseudos","existsOne","findOne","findAll","compileUnsafe","compileToken","treeAdapter","require","PARSE5_OPTS","createDocument","html","document","parse5","defineProperties","DocumentExtensions","scratch","createElement","$$Node","constructor","elementProto","Object","getPrototypeOf","ElementExtensions","ownerDocument","serializeDocument","serialize","nodeName","get","tagName","toUpperCase","id","reflectedProperty","className","insertBefore","child","referenceNode","appendChild","removeChild","detachNode","remove","textContent","set","text","children","insertText","setAttribute","name","value","attribs","removeAttribute","getAttribute","hasAttribute","getAttributeNode","specified","nodeType","contentType","documentElement","childNodes","filter","String","toLowerCase","compatMode","quirks","getDocumentMode","body","querySelector","createTextNode","Node","type","data","parent","prev","next","sel","select","selectOne","querySelectorAll","obj","properties","i","defineProperty","attributeName","node","Array","isArray","map","join","isElementNode","isTextNode","parseStylesheet","stylesheet","css","serializeStylesheet","ast","options","stringify","markOnly","predicate","rule","selectors","$$remove","$$markedSelectors","_other","applyMarkedSelectors","walkStyleRules","iterator","rules","undefined","filterSelectors","walkStyleRulesWithReverseMirror","node2","splitFilter","index","rules2","rule2","a","b","aOut","bOut","length","push","LOG_LEVELS","defaultLogger","trace","msg","console","debug","warn","chalk","yellow","error","bold","red","info","blue","silent","createLogger","logLevel","logLevelIdx","indexOf","reduce","logger","recover","result","e","then","Critters","assign","path","publicPath","reduceInlineStyles","pruneSource","additionalStylesheets","urlFilter","RegExp","test","bind","readFile","filename","fs","Promise","resolve","reject","callback","err","process","styles","getAffectedStyleTags","all","style","processStyle","output","end","hrtime","bigint","parseFloat","start","mergeStylesheets","embedAdditionalStylesheet","external","externalSheets","slice","call","link","embedLinkedStylesheet","$$external","first","sheet","getCssAsset","href","outputPath","normalizedPath","replace","pathPrefix","substring","checkInlineThreshold","inlineThreshold","$$name","$$reduce","styleSheetsIncluded","cssFile","includes","sources","forEach","head","media","preloadMode","preload","match","$$links","parentNode","cssLoaderPreamble","lazy","noscriptFallback","script","js","JSON","nextSibling","bodyLink","noscript","noscriptLink","before","sheetInverse","minSize","minimumExternalSize","keyframesMode","keyframes","astInverse","criticalFonts","failedSelectors","criticalKeyframeNames","trim","message","declarations","decl","property","names","split","j","shouldPreloadFonts","fonts","preloadFonts","shouldInlineFonts","inlineFonts","preloadedFonts","family","src","compress","afterText","styleInlinedCompletely","percent","prettyBytes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,kBAAc,GAAG;AACjB,CAAC,IAAI,EAAE,MAAM;AACb,CAAC,SAAS,EAAE,WAAW;AACvB,CAAC,OAAO,EAAE,SAAS;AACnB,CAAC,MAAM,EAAE,QAAQ;AACjB,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,GAAG,EAAE,KAAK;AACX,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,OAAO,EAAE,SAAS;AACnB;AACA,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;AACtB,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAChF,EAAE;AACF,CAAC;;;ACdD,AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,CAAC,IAAI,EAAE;AACrB,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,KAAK;AAC/B,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ;AAC9B,QAAQ,IAAI,CAAC,IAAI,KAAK,OAAO,cAAc;AAC3C,CAAC;AACD,aAAa,GAAG,KAAK,CAAC;AACtB;AACA,YAAY,GAAG,MAAM,YAAY;AACjC,iBAAiB,GAAG,WAAW,iBAAiB;AAChD,eAAe,GAAG,SAAS,eAAe;AAC1C,cAAc,GAAG,QAAQ,cAAc;AACvC,aAAa,GAAG,OAAO,aAAa;AACpC,WAAW,GAAG,KAAK,WAAW;AAC9B,aAAa,GAAG,OAAO,aAAa;AACpC,eAAe,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
Index: trip-planner-front/node_modules/critters/dist/critters.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/dist/critters.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -4,9218 +4,8 @@
 var prettyBytes = _interopDefault(require('pretty-bytes'));
 var parse5 = _interopDefault(require('parse5'));
-var css = _interopDefault(require('css'));
+var cssSelect = require('css-select');
+var treeAdapter = _interopDefault(require('parse5-htmlparser2-tree-adapter'));
+var postcss = require('postcss');
 var chalk = _interopDefault(require('chalk'));
-
-var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, basedir, module) {
-	return module = {
-	  path: basedir,
-	  exports: {},
-	  require: function (path, base) {
-      return commonjsRequire();
-    }
-	}, fn(module, module.exports), module.exports;
-}
-
-function getCjsExportFromNamespace (n) {
-	return n && n['default'] || n;
-}
-
-function commonjsRequire () {
-	throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
-}
-
-//Types of elements found in the DOM
-var domelementtype = {
-	Text: "text", //Text
-	Directive: "directive", //<? ... ?>
-	Comment: "comment", //<!-- ... -->
-	Script: "script", //<script> tags
-	Style: "style", //<style> tags
-	Tag: "tag", //Any tag
-	CDATA: "cdata", //<![CDATA[ ... ]]>
-	Doctype: "doctype",
-
-	isTag: function(elem){
-		return elem.type === "tag" || elem.type === "script" || elem.type === "style";
-	}
-};
-
-var lib = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Tests whether an element is a tag or not.
- *
- * @param elem Element to test
- */
-function isTag(elem) {
-    return (elem.type === "tag" /* Tag */ ||
-        elem.type === "script" /* Script */ ||
-        elem.type === "style" /* Style */);
-}
-exports.isTag = isTag;
-// Exports for backwards compatibility
-exports.Text = "text" /* Text */; //Text
-exports.Directive = "directive" /* Directive */; //<? ... ?>
-exports.Comment = "comment" /* Comment */; //<!-- ... -->
-exports.Script = "script" /* Script */; //<script> tags
-exports.Style = "style" /* Style */; //<style> tags
-exports.Tag = "tag" /* Tag */; //Any tag
-exports.CDATA = "cdata" /* CDATA */; //<![CDATA[ ... ]]>
-exports.Doctype = "doctype" /* Doctype */;
-});
-
-var Aacute = "Á";
-var aacute = "á";
-var Abreve = "Ă";
-var abreve = "ă";
-var ac = "∾";
-var acd = "∿";
-var acE = "∾̳";
-var Acirc = "Â";
-var acirc = "â";
-var acute = "´";
-var Acy = "А";
-var acy = "а";
-var AElig = "Æ";
-var aelig = "æ";
-var af = "⁡";
-var Afr = "𝔄";
-var afr = "𝔞";
-var Agrave = "À";
-var agrave = "à";
-var alefsym = "ℵ";
-var aleph = "ℵ";
-var Alpha = "Α";
-var alpha = "α";
-var Amacr = "Ā";
-var amacr = "ā";
-var amalg = "⨿";
-var amp = "&";
-var AMP = "&";
-var andand = "⩕";
-var And = "⩓";
-var and = "∧";
-var andd = "⩜";
-var andslope = "⩘";
-var andv = "⩚";
-var ang = "∠";
-var ange = "⦤";
-var angle = "∠";
-var angmsdaa = "⦨";
-var angmsdab = "⦩";
-var angmsdac = "⦪";
-var angmsdad = "⦫";
-var angmsdae = "⦬";
-var angmsdaf = "⦭";
-var angmsdag = "⦮";
-var angmsdah = "⦯";
-var angmsd = "∡";
-var angrt = "∟";
-var angrtvb = "⊾";
-var angrtvbd = "⦝";
-var angsph = "∢";
-var angst = "Å";
-var angzarr = "⍼";
-var Aogon = "Ą";
-var aogon = "ą";
-var Aopf = "𝔸";
-var aopf = "𝕒";
-var apacir = "⩯";
-var ap = "≈";
-var apE = "⩰";
-var ape = "≊";
-var apid = "≋";
-var apos = "'";
-var ApplyFunction = "⁡";
-var approx = "≈";
-var approxeq = "≊";
-var Aring = "Å";
-var aring = "å";
-var Ascr = "𝒜";
-var ascr = "𝒶";
-var Assign = "≔";
-var ast = "*";
-var asymp = "≈";
-var asympeq = "≍";
-var Atilde = "Ã";
-var atilde = "ã";
-var Auml = "Ä";
-var auml = "ä";
-var awconint = "∳";
-var awint = "⨑";
-var backcong = "≌";
-var backepsilon = "϶";
-var backprime = "‵";
-var backsim = "∽";
-var backsimeq = "⋍";
-var Backslash = "∖";
-var Barv = "⫧";
-var barvee = "⊽";
-var barwed = "⌅";
-var Barwed = "⌆";
-var barwedge = "⌅";
-var bbrk = "⎵";
-var bbrktbrk = "⎶";
-var bcong = "≌";
-var Bcy = "Б";
-var bcy = "б";
-var bdquo = "„";
-var becaus = "∵";
-var because = "∵";
-var Because = "∵";
-var bemptyv = "⦰";
-var bepsi = "϶";
-var bernou = "ℬ";
-var Bernoullis = "ℬ";
-var Beta = "Β";
-var beta = "β";
-var beth = "ℶ";
-var between = "≬";
-var Bfr = "𝔅";
-var bfr = "𝔟";
-var bigcap = "⋂";
-var bigcirc = "◯";
-var bigcup = "⋃";
-var bigodot = "⨀";
-var bigoplus = "⨁";
-var bigotimes = "⨂";
-var bigsqcup = "⨆";
-var bigstar = "★";
-var bigtriangledown = "▽";
-var bigtriangleup = "△";
-var biguplus = "⨄";
-var bigvee = "⋁";
-var bigwedge = "⋀";
-var bkarow = "⤍";
-var blacklozenge = "⧫";
-var blacksquare = "▪";
-var blacktriangle = "▴";
-var blacktriangledown = "▾";
-var blacktriangleleft = "◂";
-var blacktriangleright = "▸";
-var blank = "␣";
-var blk12 = "▒";
-var blk14 = "░";
-var blk34 = "▓";
-var block = "█";
-var bne = "=⃥";
-var bnequiv = "≡⃥";
-var bNot = "⫭";
-var bnot = "⌐";
-var Bopf = "𝔹";
-var bopf = "𝕓";
-var bot = "⊥";
-var bottom = "⊥";
-var bowtie = "⋈";
-var boxbox = "⧉";
-var boxdl = "┐";
-var boxdL = "╕";
-var boxDl = "╖";
-var boxDL = "╗";
-var boxdr = "┌";
-var boxdR = "╒";
-var boxDr = "╓";
-var boxDR = "╔";
-var boxh = "─";
-var boxH = "═";
-var boxhd = "┬";
-var boxHd = "╤";
-var boxhD = "╥";
-var boxHD = "╦";
-var boxhu = "┴";
-var boxHu = "╧";
-var boxhU = "╨";
-var boxHU = "╩";
-var boxminus = "⊟";
-var boxplus = "⊞";
-var boxtimes = "⊠";
-var boxul = "┘";
-var boxuL = "╛";
-var boxUl = "╜";
-var boxUL = "╝";
-var boxur = "└";
-var boxuR = "╘";
-var boxUr = "╙";
-var boxUR = "╚";
-var boxv = "│";
-var boxV = "║";
-var boxvh = "┼";
-var boxvH = "╪";
-var boxVh = "╫";
-var boxVH = "╬";
-var boxvl = "┤";
-var boxvL = "╡";
-var boxVl = "╢";
-var boxVL = "╣";
-var boxvr = "├";
-var boxvR = "╞";
-var boxVr = "╟";
-var boxVR = "╠";
-var bprime = "‵";
-var breve = "˘";
-var Breve = "˘";
-var brvbar = "¦";
-var bscr = "𝒷";
-var Bscr = "ℬ";
-var bsemi = "⁏";
-var bsim = "∽";
-var bsime = "⋍";
-var bsolb = "⧅";
-var bsol = "\\";
-var bsolhsub = "⟈";
-var bull = "•";
-var bullet = "•";
-var bump = "≎";
-var bumpE = "⪮";
-var bumpe = "≏";
-var Bumpeq = "≎";
-var bumpeq = "≏";
-var Cacute = "Ć";
-var cacute = "ć";
-var capand = "⩄";
-var capbrcup = "⩉";
-var capcap = "⩋";
-var cap = "∩";
-var Cap = "⋒";
-var capcup = "⩇";
-var capdot = "⩀";
-var CapitalDifferentialD = "ⅅ";
-var caps = "∩︀";
-var caret = "⁁";
-var caron = "ˇ";
-var Cayleys = "ℭ";
-var ccaps = "⩍";
-var Ccaron = "Č";
-var ccaron = "č";
-var Ccedil = "Ç";
-var ccedil = "ç";
-var Ccirc = "Ĉ";
-var ccirc = "ĉ";
-var Cconint = "∰";
-var ccups = "⩌";
-var ccupssm = "⩐";
-var Cdot = "Ċ";
-var cdot = "ċ";
-var cedil = "¸";
-var Cedilla = "¸";
-var cemptyv = "⦲";
-var cent = "¢";
-var centerdot = "·";
-var CenterDot = "·";
-var cfr = "𝔠";
-var Cfr = "ℭ";
-var CHcy = "Ч";
-var chcy = "ч";
-var check = "✓";
-var checkmark = "✓";
-var Chi = "Χ";
-var chi = "χ";
-var circ = "ˆ";
-var circeq = "≗";
-var circlearrowleft = "↺";
-var circlearrowright = "↻";
-var circledast = "⊛";
-var circledcirc = "⊚";
-var circleddash = "⊝";
-var CircleDot = "⊙";
-var circledR = "®";
-var circledS = "Ⓢ";
-var CircleMinus = "⊖";
-var CirclePlus = "⊕";
-var CircleTimes = "⊗";
-var cir = "○";
-var cirE = "⧃";
-var cire = "≗";
-var cirfnint = "⨐";
-var cirmid = "⫯";
-var cirscir = "⧂";
-var ClockwiseContourIntegral = "∲";
-var CloseCurlyDoubleQuote = "”";
-var CloseCurlyQuote = "’";
-var clubs = "♣";
-var clubsuit = "♣";
-var colon = ":";
-var Colon = "∷";
-var Colone = "⩴";
-var colone = "≔";
-var coloneq = "≔";
-var comma = ",";
-var commat = "@";
-var comp = "∁";
-var compfn = "∘";
-var complement = "∁";
-var complexes = "ℂ";
-var cong = "≅";
-var congdot = "⩭";
-var Congruent = "≡";
-var conint = "∮";
-var Conint = "∯";
-var ContourIntegral = "∮";
-var copf = "𝕔";
-var Copf = "ℂ";
-var coprod = "∐";
-var Coproduct = "∐";
-var copy = "©";
-var COPY = "©";
-var copysr = "℗";
-var CounterClockwiseContourIntegral = "∳";
-var crarr = "↵";
-var cross = "✗";
-var Cross = "⨯";
-var Cscr = "𝒞";
-var cscr = "𝒸";
-var csub = "⫏";
-var csube = "⫑";
-var csup = "⫐";
-var csupe = "⫒";
-var ctdot = "⋯";
-var cudarrl = "⤸";
-var cudarrr = "⤵";
-var cuepr = "⋞";
-var cuesc = "⋟";
-var cularr = "↶";
-var cularrp = "⤽";
-var cupbrcap = "⩈";
-var cupcap = "⩆";
-var CupCap = "≍";
-var cup = "∪";
-var Cup = "⋓";
-var cupcup = "⩊";
-var cupdot = "⊍";
-var cupor = "⩅";
-var cups = "∪︀";
-var curarr = "↷";
-var curarrm = "⤼";
-var curlyeqprec = "⋞";
-var curlyeqsucc = "⋟";
-var curlyvee = "⋎";
-var curlywedge = "⋏";
-var curren = "¤";
-var curvearrowleft = "↶";
-var curvearrowright = "↷";
-var cuvee = "⋎";
-var cuwed = "⋏";
-var cwconint = "∲";
-var cwint = "∱";
-var cylcty = "⌭";
-var dagger = "†";
-var Dagger = "‡";
-var daleth = "ℸ";
-var darr = "↓";
-var Darr = "↡";
-var dArr = "⇓";
-var dash = "‐";
-var Dashv = "⫤";
-var dashv = "⊣";
-var dbkarow = "⤏";
-var dblac = "˝";
-var Dcaron = "Ď";
-var dcaron = "ď";
-var Dcy = "Д";
-var dcy = "д";
-var ddagger = "‡";
-var ddarr = "⇊";
-var DD = "ⅅ";
-var dd = "ⅆ";
-var DDotrahd = "⤑";
-var ddotseq = "⩷";
-var deg = "°";
-var Del = "∇";
-var Delta = "Δ";
-var delta = "δ";
-var demptyv = "⦱";
-var dfisht = "⥿";
-var Dfr = "𝔇";
-var dfr = "𝔡";
-var dHar = "⥥";
-var dharl = "⇃";
-var dharr = "⇂";
-var DiacriticalAcute = "´";
-var DiacriticalDot = "˙";
-var DiacriticalDoubleAcute = "˝";
-var DiacriticalGrave = "`";
-var DiacriticalTilde = "˜";
-var diam = "⋄";
-var diamond = "⋄";
-var Diamond = "⋄";
-var diamondsuit = "♦";
-var diams = "♦";
-var die = "¨";
-var DifferentialD = "ⅆ";
-var digamma = "ϝ";
-var disin = "⋲";
-var div = "÷";
-var divide = "÷";
-var divideontimes = "⋇";
-var divonx = "⋇";
-var DJcy = "Ђ";
-var djcy = "ђ";
-var dlcorn = "⌞";
-var dlcrop = "⌍";
-var dollar = "$";
-var Dopf = "𝔻";
-var dopf = "𝕕";
-var Dot = "¨";
-var dot = "˙";
-var DotDot = "⃜";
-var doteq = "≐";
-var doteqdot = "≑";
-var DotEqual = "≐";
-var dotminus = "∸";
-var dotplus = "∔";
-var dotsquare = "⊡";
-var doublebarwedge = "⌆";
-var DoubleContourIntegral = "∯";
-var DoubleDot = "¨";
-var DoubleDownArrow = "⇓";
-var DoubleLeftArrow = "⇐";
-var DoubleLeftRightArrow = "⇔";
-var DoubleLeftTee = "⫤";
-var DoubleLongLeftArrow = "⟸";
-var DoubleLongLeftRightArrow = "⟺";
-var DoubleLongRightArrow = "⟹";
-var DoubleRightArrow = "⇒";
-var DoubleRightTee = "⊨";
-var DoubleUpArrow = "⇑";
-var DoubleUpDownArrow = "⇕";
-var DoubleVerticalBar = "∥";
-var DownArrowBar = "⤓";
-var downarrow = "↓";
-var DownArrow = "↓";
-var Downarrow = "⇓";
-var DownArrowUpArrow = "⇵";
-var DownBreve = "̑";
-var downdownarrows = "⇊";
-var downharpoonleft = "⇃";
-var downharpoonright = "⇂";
-var DownLeftRightVector = "⥐";
-var DownLeftTeeVector = "⥞";
-var DownLeftVectorBar = "⥖";
-var DownLeftVector = "↽";
-var DownRightTeeVector = "⥟";
-var DownRightVectorBar = "⥗";
-var DownRightVector = "⇁";
-var DownTeeArrow = "↧";
-var DownTee = "⊤";
-var drbkarow = "⤐";
-var drcorn = "⌟";
-var drcrop = "⌌";
-var Dscr = "𝒟";
-var dscr = "𝒹";
-var DScy = "Ѕ";
-var dscy = "ѕ";
-var dsol = "⧶";
-var Dstrok = "Đ";
-var dstrok = "đ";
-var dtdot = "⋱";
-var dtri = "▿";
-var dtrif = "▾";
-var duarr = "⇵";
-var duhar = "⥯";
-var dwangle = "⦦";
-var DZcy = "Џ";
-var dzcy = "џ";
-var dzigrarr = "⟿";
-var Eacute = "É";
-var eacute = "é";
-var easter = "⩮";
-var Ecaron = "Ě";
-var ecaron = "ě";
-var Ecirc = "Ê";
-var ecirc = "ê";
-var ecir = "≖";
-var ecolon = "≕";
-var Ecy = "Э";
-var ecy = "э";
-var eDDot = "⩷";
-var Edot = "Ė";
-var edot = "ė";
-var eDot = "≑";
-var ee = "ⅇ";
-var efDot = "≒";
-var Efr = "𝔈";
-var efr = "𝔢";
-var eg = "⪚";
-var Egrave = "È";
-var egrave = "è";
-var egs = "⪖";
-var egsdot = "⪘";
-var el = "⪙";
-var Element = "∈";
-var elinters = "⏧";
-var ell = "ℓ";
-var els = "⪕";
-var elsdot = "⪗";
-var Emacr = "Ē";
-var emacr = "ē";
-var empty = "∅";
-var emptyset = "∅";
-var EmptySmallSquare = "◻";
-var emptyv = "∅";
-var EmptyVerySmallSquare = "▫";
-var emsp13 = " ";
-var emsp14 = " ";
-var emsp = " ";
-var ENG = "Ŋ";
-var eng = "ŋ";
-var ensp = " ";
-var Eogon = "Ę";
-var eogon = "ę";
-var Eopf = "𝔼";
-var eopf = "𝕖";
-var epar = "⋕";
-var eparsl = "⧣";
-var eplus = "⩱";
-var epsi = "ε";
-var Epsilon = "Ε";
-var epsilon = "ε";
-var epsiv = "ϵ";
-var eqcirc = "≖";
-var eqcolon = "≕";
-var eqsim = "≂";
-var eqslantgtr = "⪖";
-var eqslantless = "⪕";
-var Equal = "⩵";
-var equals = "=";
-var EqualTilde = "≂";
-var equest = "≟";
-var Equilibrium = "⇌";
-var equiv = "≡";
-var equivDD = "⩸";
-var eqvparsl = "⧥";
-var erarr = "⥱";
-var erDot = "≓";
-var escr = "ℯ";
-var Escr = "ℰ";
-var esdot = "≐";
-var Esim = "⩳";
-var esim = "≂";
-var Eta = "Η";
-var eta = "η";
-var ETH = "Ð";
-var eth = "ð";
-var Euml = "Ë";
-var euml = "ë";
-var euro = "€";
-var excl = "!";
-var exist = "∃";
-var Exists = "∃";
-var expectation = "ℰ";
-var exponentiale = "ⅇ";
-var ExponentialE = "ⅇ";
-var fallingdotseq = "≒";
-var Fcy = "Ф";
-var fcy = "ф";
-var female = "♀";
-var ffilig = "ﬃ";
-var fflig = "ﬀ";
-var ffllig = "ﬄ";
-var Ffr = "𝔉";
-var ffr = "𝔣";
-var filig = "ﬁ";
-var FilledSmallSquare = "◼";
-var FilledVerySmallSquare = "▪";
-var fjlig = "fj";
-var flat = "♭";
-var fllig = "ﬂ";
-var fltns = "▱";
-var fnof = "ƒ";
-var Fopf = "𝔽";
-var fopf = "𝕗";
-var forall = "∀";
-var ForAll = "∀";
-var fork = "⋔";
-var forkv = "⫙";
-var Fouriertrf = "ℱ";
-var fpartint = "⨍";
-var frac12 = "½";
-var frac13 = "⅓";
-var frac14 = "¼";
-var frac15 = "⅕";
-var frac16 = "⅙";
-var frac18 = "⅛";
-var frac23 = "⅔";
-var frac25 = "⅖";
-var frac34 = "¾";
-var frac35 = "⅗";
-var frac38 = "⅜";
-var frac45 = "⅘";
-var frac56 = "⅚";
-var frac58 = "⅝";
-var frac78 = "⅞";
-var frasl = "⁄";
-var frown = "⌢";
-var fscr = "𝒻";
-var Fscr = "ℱ";
-var gacute = "ǵ";
-var Gamma = "Γ";
-var gamma = "γ";
-var Gammad = "Ϝ";
-var gammad = "ϝ";
-var gap = "⪆";
-var Gbreve = "Ğ";
-var gbreve = "ğ";
-var Gcedil = "Ģ";
-var Gcirc = "Ĝ";
-var gcirc = "ĝ";
-var Gcy = "Г";
-var gcy = "г";
-var Gdot = "Ġ";
-var gdot = "ġ";
-var ge = "≥";
-var gE = "≧";
-var gEl = "⪌";
-var gel = "⋛";
-var geq = "≥";
-var geqq = "≧";
-var geqslant = "⩾";
-var gescc = "⪩";
-var ges = "⩾";
-var gesdot = "⪀";
-var gesdoto = "⪂";
-var gesdotol = "⪄";
-var gesl = "⋛︀";
-var gesles = "⪔";
-var Gfr = "𝔊";
-var gfr = "𝔤";
-var gg = "≫";
-var Gg = "⋙";
-var ggg = "⋙";
-var gimel = "ℷ";
-var GJcy = "Ѓ";
-var gjcy = "ѓ";
-var gla = "⪥";
-var gl = "≷";
-var glE = "⪒";
-var glj = "⪤";
-var gnap = "⪊";
-var gnapprox = "⪊";
-var gne = "⪈";
-var gnE = "≩";
-var gneq = "⪈";
-var gneqq = "≩";
-var gnsim = "⋧";
-var Gopf = "𝔾";
-var gopf = "𝕘";
-var grave = "`";
-var GreaterEqual = "≥";
-var GreaterEqualLess = "⋛";
-var GreaterFullEqual = "≧";
-var GreaterGreater = "⪢";
-var GreaterLess = "≷";
-var GreaterSlantEqual = "⩾";
-var GreaterTilde = "≳";
-var Gscr = "𝒢";
-var gscr = "ℊ";
-var gsim = "≳";
-var gsime = "⪎";
-var gsiml = "⪐";
-var gtcc = "⪧";
-var gtcir = "⩺";
-var gt = ">";
-var GT = ">";
-var Gt = "≫";
-var gtdot = "⋗";
-var gtlPar = "⦕";
-var gtquest = "⩼";
-var gtrapprox = "⪆";
-var gtrarr = "⥸";
-var gtrdot = "⋗";
-var gtreqless = "⋛";
-var gtreqqless = "⪌";
-var gtrless = "≷";
-var gtrsim = "≳";
-var gvertneqq = "≩︀";
-var gvnE = "≩︀";
-var Hacek = "ˇ";
-var hairsp = " ";
-var half = "½";
-var hamilt = "ℋ";
-var HARDcy = "Ъ";
-var hardcy = "ъ";
-var harrcir = "⥈";
-var harr = "↔";
-var hArr = "⇔";
-var harrw = "↭";
-var Hat = "^";
-var hbar = "ℏ";
-var Hcirc = "Ĥ";
-var hcirc = "ĥ";
-var hearts = "♥";
-var heartsuit = "♥";
-var hellip = "…";
-var hercon = "⊹";
-var hfr = "𝔥";
-var Hfr = "ℌ";
-var HilbertSpace = "ℋ";
-var hksearow = "⤥";
-var hkswarow = "⤦";
-var hoarr = "⇿";
-var homtht = "∻";
-var hookleftarrow = "↩";
-var hookrightarrow = "↪";
-var hopf = "𝕙";
-var Hopf = "ℍ";
-var horbar = "―";
-var HorizontalLine = "─";
-var hscr = "𝒽";
-var Hscr = "ℋ";
-var hslash = "ℏ";
-var Hstrok = "Ħ";
-var hstrok = "ħ";
-var HumpDownHump = "≎";
-var HumpEqual = "≏";
-var hybull = "⁃";
-var hyphen = "‐";
-var Iacute = "Í";
-var iacute = "í";
-var ic = "⁣";
-var Icirc = "Î";
-var icirc = "î";
-var Icy = "И";
-var icy = "и";
-var Idot = "İ";
-var IEcy = "Е";
-var iecy = "е";
-var iexcl = "¡";
-var iff = "⇔";
-var ifr = "𝔦";
-var Ifr = "ℑ";
-var Igrave = "Ì";
-var igrave = "ì";
-var ii = "ⅈ";
-var iiiint = "⨌";
-var iiint = "∭";
-var iinfin = "⧜";
-var iiota = "℩";
-var IJlig = "Ĳ";
-var ijlig = "ĳ";
-var Imacr = "Ī";
-var imacr = "ī";
-var image = "ℑ";
-var ImaginaryI = "ⅈ";
-var imagline = "ℐ";
-var imagpart = "ℑ";
-var imath = "ı";
-var Im = "ℑ";
-var imof = "⊷";
-var imped = "Ƶ";
-var Implies = "⇒";
-var incare = "℅";
-var infin = "∞";
-var infintie = "⧝";
-var inodot = "ı";
-var intcal = "⊺";
-var int = "∫";
-var Int = "∬";
-var integers = "ℤ";
-var Integral = "∫";
-var intercal = "⊺";
-var Intersection = "⋂";
-var intlarhk = "⨗";
-var intprod = "⨼";
-var InvisibleComma = "⁣";
-var InvisibleTimes = "⁢";
-var IOcy = "Ё";
-var iocy = "ё";
-var Iogon = "Į";
-var iogon = "į";
-var Iopf = "𝕀";
-var iopf = "𝕚";
-var Iota = "Ι";
-var iota = "ι";
-var iprod = "⨼";
-var iquest = "¿";
-var iscr = "𝒾";
-var Iscr = "ℐ";
-var isin = "∈";
-var isindot = "⋵";
-var isinE = "⋹";
-var isins = "⋴";
-var isinsv = "⋳";
-var isinv = "∈";
-var it = "⁢";
-var Itilde = "Ĩ";
-var itilde = "ĩ";
-var Iukcy = "І";
-var iukcy = "і";
-var Iuml = "Ï";
-var iuml = "ï";
-var Jcirc = "Ĵ";
-var jcirc = "ĵ";
-var Jcy = "Й";
-var jcy = "й";
-var Jfr = "𝔍";
-var jfr = "𝔧";
-var jmath = "ȷ";
-var Jopf = "𝕁";
-var jopf = "𝕛";
-var Jscr = "𝒥";
-var jscr = "𝒿";
-var Jsercy = "Ј";
-var jsercy = "ј";
-var Jukcy = "Є";
-var jukcy = "є";
-var Kappa = "Κ";
-var kappa = "κ";
-var kappav = "ϰ";
-var Kcedil = "Ķ";
-var kcedil = "ķ";
-var Kcy = "К";
-var kcy = "к";
-var Kfr = "𝔎";
-var kfr = "𝔨";
-var kgreen = "ĸ";
-var KHcy = "Х";
-var khcy = "х";
-var KJcy = "Ќ";
-var kjcy = "ќ";
-var Kopf = "𝕂";
-var kopf = "𝕜";
-var Kscr = "𝒦";
-var kscr = "𝓀";
-var lAarr = "⇚";
-var Lacute = "Ĺ";
-var lacute = "ĺ";
-var laemptyv = "⦴";
-var lagran = "ℒ";
-var Lambda = "Λ";
-var lambda = "λ";
-var lang = "⟨";
-var Lang = "⟪";
-var langd = "⦑";
-var langle = "⟨";
-var lap = "⪅";
-var Laplacetrf = "ℒ";
-var laquo = "«";
-var larrb = "⇤";
-var larrbfs = "⤟";
-var larr = "←";
-var Larr = "↞";
-var lArr = "⇐";
-var larrfs = "⤝";
-var larrhk = "↩";
-var larrlp = "↫";
-var larrpl = "⤹";
-var larrsim = "⥳";
-var larrtl = "↢";
-var latail = "⤙";
-var lAtail = "⤛";
-var lat = "⪫";
-var late = "⪭";
-var lates = "⪭︀";
-var lbarr = "⤌";
-var lBarr = "⤎";
-var lbbrk = "❲";
-var lbrace = "{";
-var lbrack = "[";
-var lbrke = "⦋";
-var lbrksld = "⦏";
-var lbrkslu = "⦍";
-var Lcaron = "Ľ";
-var lcaron = "ľ";
-var Lcedil = "Ļ";
-var lcedil = "ļ";
-var lceil = "⌈";
-var lcub = "{";
-var Lcy = "Л";
-var lcy = "л";
-var ldca = "⤶";
-var ldquo = "“";
-var ldquor = "„";
-var ldrdhar = "⥧";
-var ldrushar = "⥋";
-var ldsh = "↲";
-var le = "≤";
-var lE = "≦";
-var LeftAngleBracket = "⟨";
-var LeftArrowBar = "⇤";
-var leftarrow = "←";
-var LeftArrow = "←";
-var Leftarrow = "⇐";
-var LeftArrowRightArrow = "⇆";
-var leftarrowtail = "↢";
-var LeftCeiling = "⌈";
-var LeftDoubleBracket = "⟦";
-var LeftDownTeeVector = "⥡";
-var LeftDownVectorBar = "⥙";
-var LeftDownVector = "⇃";
-var LeftFloor = "⌊";
-var leftharpoondown = "↽";
-var leftharpoonup = "↼";
-var leftleftarrows = "⇇";
-var leftrightarrow = "↔";
-var LeftRightArrow = "↔";
-var Leftrightarrow = "⇔";
-var leftrightarrows = "⇆";
-var leftrightharpoons = "⇋";
-var leftrightsquigarrow = "↭";
-var LeftRightVector = "⥎";
-var LeftTeeArrow = "↤";
-var LeftTee = "⊣";
-var LeftTeeVector = "⥚";
-var leftthreetimes = "⋋";
-var LeftTriangleBar = "⧏";
-var LeftTriangle = "⊲";
-var LeftTriangleEqual = "⊴";
-var LeftUpDownVector = "⥑";
-var LeftUpTeeVector = "⥠";
-var LeftUpVectorBar = "⥘";
-var LeftUpVector = "↿";
-var LeftVectorBar = "⥒";
-var LeftVector = "↼";
-var lEg = "⪋";
-var leg = "⋚";
-var leq = "≤";
-var leqq = "≦";
-var leqslant = "⩽";
-var lescc = "⪨";
-var les = "⩽";
-var lesdot = "⩿";
-var lesdoto = "⪁";
-var lesdotor = "⪃";
-var lesg = "⋚︀";
-var lesges = "⪓";
-var lessapprox = "⪅";
-var lessdot = "⋖";
-var lesseqgtr = "⋚";
-var lesseqqgtr = "⪋";
-var LessEqualGreater = "⋚";
-var LessFullEqual = "≦";
-var LessGreater = "≶";
-var lessgtr = "≶";
-var LessLess = "⪡";
-var lesssim = "≲";
-var LessSlantEqual = "⩽";
-var LessTilde = "≲";
-var lfisht = "⥼";
-var lfloor = "⌊";
-var Lfr = "𝔏";
-var lfr = "𝔩";
-var lg = "≶";
-var lgE = "⪑";
-var lHar = "⥢";
-var lhard = "↽";
-var lharu = "↼";
-var lharul = "⥪";
-var lhblk = "▄";
-var LJcy = "Љ";
-var ljcy = "љ";
-var llarr = "⇇";
-var ll = "≪";
-var Ll = "⋘";
-var llcorner = "⌞";
-var Lleftarrow = "⇚";
-var llhard = "⥫";
-var lltri = "◺";
-var Lmidot = "Ŀ";
-var lmidot = "ŀ";
-var lmoustache = "⎰";
-var lmoust = "⎰";
-var lnap = "⪉";
-var lnapprox = "⪉";
-var lne = "⪇";
-var lnE = "≨";
-var lneq = "⪇";
-var lneqq = "≨";
-var lnsim = "⋦";
-var loang = "⟬";
-var loarr = "⇽";
-var lobrk = "⟦";
-var longleftarrow = "⟵";
-var LongLeftArrow = "⟵";
-var Longleftarrow = "⟸";
-var longleftrightarrow = "⟷";
-var LongLeftRightArrow = "⟷";
-var Longleftrightarrow = "⟺";
-var longmapsto = "⟼";
-var longrightarrow = "⟶";
-var LongRightArrow = "⟶";
-var Longrightarrow = "⟹";
-var looparrowleft = "↫";
-var looparrowright = "↬";
-var lopar = "⦅";
-var Lopf = "𝕃";
-var lopf = "𝕝";
-var loplus = "⨭";
-var lotimes = "⨴";
-var lowast = "∗";
-var lowbar = "_";
-var LowerLeftArrow = "↙";
-var LowerRightArrow = "↘";
-var loz = "◊";
-var lozenge = "◊";
-var lozf = "⧫";
-var lpar = "(";
-var lparlt = "⦓";
-var lrarr = "⇆";
-var lrcorner = "⌟";
-var lrhar = "⇋";
-var lrhard = "⥭";
-var lrm = "‎";
-var lrtri = "⊿";
-var lsaquo = "‹";
-var lscr = "𝓁";
-var Lscr = "ℒ";
-var lsh = "↰";
-var Lsh = "↰";
-var lsim = "≲";
-var lsime = "⪍";
-var lsimg = "⪏";
-var lsqb = "[";
-var lsquo = "‘";
-var lsquor = "‚";
-var Lstrok = "Ł";
-var lstrok = "ł";
-var ltcc = "⪦";
-var ltcir = "⩹";
-var lt = "<";
-var LT = "<";
-var Lt = "≪";
-var ltdot = "⋖";
-var lthree = "⋋";
-var ltimes = "⋉";
-var ltlarr = "⥶";
-var ltquest = "⩻";
-var ltri = "◃";
-var ltrie = "⊴";
-var ltrif = "◂";
-var ltrPar = "⦖";
-var lurdshar = "⥊";
-var luruhar = "⥦";
-var lvertneqq = "≨︀";
-var lvnE = "≨︀";
-var macr = "¯";
-var male = "♂";
-var malt = "✠";
-var maltese = "✠";
-var map = "↦";
-var mapsto = "↦";
-var mapstodown = "↧";
-var mapstoleft = "↤";
-var mapstoup = "↥";
-var marker = "▮";
-var mcomma = "⨩";
-var Mcy = "М";
-var mcy = "м";
-var mdash = "—";
-var mDDot = "∺";
-var measuredangle = "∡";
-var MediumSpace = " ";
-var Mellintrf = "ℳ";
-var Mfr = "𝔐";
-var mfr = "𝔪";
-var mho = "℧";
-var micro = "µ";
-var midast = "*";
-var midcir = "⫰";
-var mid = "∣";
-var middot = "·";
-var minusb = "⊟";
-var minus = "−";
-var minusd = "∸";
-var minusdu = "⨪";
-var MinusPlus = "∓";
-var mlcp = "⫛";
-var mldr = "…";
-var mnplus = "∓";
-var models = "⊧";
-var Mopf = "𝕄";
-var mopf = "𝕞";
-var mp = "∓";
-var mscr = "𝓂";
-var Mscr = "ℳ";
-var mstpos = "∾";
-var Mu = "Μ";
-var mu = "μ";
-var multimap = "⊸";
-var mumap = "⊸";
-var nabla = "∇";
-var Nacute = "Ń";
-var nacute = "ń";
-var nang = "∠⃒";
-var nap = "≉";
-var napE = "⩰̸";
-var napid = "≋̸";
-var napos = "ŉ";
-var napprox = "≉";
-var natural = "♮";
-var naturals = "ℕ";
-var natur = "♮";
-var nbsp = " ";
-var nbump = "≎̸";
-var nbumpe = "≏̸";
-var ncap = "⩃";
-var Ncaron = "Ň";
-var ncaron = "ň";
-var Ncedil = "Ņ";
-var ncedil = "ņ";
-var ncong = "≇";
-var ncongdot = "⩭̸";
-var ncup = "⩂";
-var Ncy = "Н";
-var ncy = "н";
-var ndash = "–";
-var nearhk = "⤤";
-var nearr = "↗";
-var neArr = "⇗";
-var nearrow = "↗";
-var ne = "≠";
-var nedot = "≐̸";
-var NegativeMediumSpace = "​";
-var NegativeThickSpace = "​";
-var NegativeThinSpace = "​";
-var NegativeVeryThinSpace = "​";
-var nequiv = "≢";
-var nesear = "⤨";
-var nesim = "≂̸";
-var NestedGreaterGreater = "≫";
-var NestedLessLess = "≪";
-var NewLine = "\n";
-var nexist = "∄";
-var nexists = "∄";
-var Nfr = "𝔑";
-var nfr = "𝔫";
-var ngE = "≧̸";
-var nge = "≱";
-var ngeq = "≱";
-var ngeqq = "≧̸";
-var ngeqslant = "⩾̸";
-var nges = "⩾̸";
-var nGg = "⋙̸";
-var ngsim = "≵";
-var nGt = "≫⃒";
-var ngt = "≯";
-var ngtr = "≯";
-var nGtv = "≫̸";
-var nharr = "↮";
-var nhArr = "⇎";
-var nhpar = "⫲";
-var ni = "∋";
-var nis = "⋼";
-var nisd = "⋺";
-var niv = "∋";
-var NJcy = "Њ";
-var njcy = "њ";
-var nlarr = "↚";
-var nlArr = "⇍";
-var nldr = "‥";
-var nlE = "≦̸";
-var nle = "≰";
-var nleftarrow = "↚";
-var nLeftarrow = "⇍";
-var nleftrightarrow = "↮";
-var nLeftrightarrow = "⇎";
-var nleq = "≰";
-var nleqq = "≦̸";
-var nleqslant = "⩽̸";
-var nles = "⩽̸";
-var nless = "≮";
-var nLl = "⋘̸";
-var nlsim = "≴";
-var nLt = "≪⃒";
-var nlt = "≮";
-var nltri = "⋪";
-var nltrie = "⋬";
-var nLtv = "≪̸";
-var nmid = "∤";
-var NoBreak = "⁠";
-var NonBreakingSpace = " ";
-var nopf = "𝕟";
-var Nopf = "ℕ";
-var Not = "⫬";
-var not = "¬";
-var NotCongruent = "≢";
-var NotCupCap = "≭";
-var NotDoubleVerticalBar = "∦";
-var NotElement = "∉";
-var NotEqual = "≠";
-var NotEqualTilde = "≂̸";
-var NotExists = "∄";
-var NotGreater = "≯";
-var NotGreaterEqual = "≱";
-var NotGreaterFullEqual = "≧̸";
-var NotGreaterGreater = "≫̸";
-var NotGreaterLess = "≹";
-var NotGreaterSlantEqual = "⩾̸";
-var NotGreaterTilde = "≵";
-var NotHumpDownHump = "≎̸";
-var NotHumpEqual = "≏̸";
-var notin = "∉";
-var notindot = "⋵̸";
-var notinE = "⋹̸";
-var notinva = "∉";
-var notinvb = "⋷";
-var notinvc = "⋶";
-var NotLeftTriangleBar = "⧏̸";
-var NotLeftTriangle = "⋪";
-var NotLeftTriangleEqual = "⋬";
-var NotLess = "≮";
-var NotLessEqual = "≰";
-var NotLessGreater = "≸";
-var NotLessLess = "≪̸";
-var NotLessSlantEqual = "⩽̸";
-var NotLessTilde = "≴";
-var NotNestedGreaterGreater = "⪢̸";
-var NotNestedLessLess = "⪡̸";
-var notni = "∌";
-var notniva = "∌";
-var notnivb = "⋾";
-var notnivc = "⋽";
-var NotPrecedes = "⊀";
-var NotPrecedesEqual = "⪯̸";
-var NotPrecedesSlantEqual = "⋠";
-var NotReverseElement = "∌";
-var NotRightTriangleBar = "⧐̸";
-var NotRightTriangle = "⋫";
-var NotRightTriangleEqual = "⋭";
-var NotSquareSubset = "⊏̸";
-var NotSquareSubsetEqual = "⋢";
-var NotSquareSuperset = "⊐̸";
-var NotSquareSupersetEqual = "⋣";
-var NotSubset = "⊂⃒";
-var NotSubsetEqual = "⊈";
-var NotSucceeds = "⊁";
-var NotSucceedsEqual = "⪰̸";
-var NotSucceedsSlantEqual = "⋡";
-var NotSucceedsTilde = "≿̸";
-var NotSuperset = "⊃⃒";
-var NotSupersetEqual = "⊉";
-var NotTilde = "≁";
-var NotTildeEqual = "≄";
-var NotTildeFullEqual = "≇";
-var NotTildeTilde = "≉";
-var NotVerticalBar = "∤";
-var nparallel = "∦";
-var npar = "∦";
-var nparsl = "⫽⃥";
-var npart = "∂̸";
-var npolint = "⨔";
-var npr = "⊀";
-var nprcue = "⋠";
-var nprec = "⊀";
-var npreceq = "⪯̸";
-var npre = "⪯̸";
-var nrarrc = "⤳̸";
-var nrarr = "↛";
-var nrArr = "⇏";
-var nrarrw = "↝̸";
-var nrightarrow = "↛";
-var nRightarrow = "⇏";
-var nrtri = "⋫";
-var nrtrie = "⋭";
-var nsc = "⊁";
-var nsccue = "⋡";
-var nsce = "⪰̸";
-var Nscr = "𝒩";
-var nscr = "𝓃";
-var nshortmid = "∤";
-var nshortparallel = "∦";
-var nsim = "≁";
-var nsime = "≄";
-var nsimeq = "≄";
-var nsmid = "∤";
-var nspar = "∦";
-var nsqsube = "⋢";
-var nsqsupe = "⋣";
-var nsub = "⊄";
-var nsubE = "⫅̸";
-var nsube = "⊈";
-var nsubset = "⊂⃒";
-var nsubseteq = "⊈";
-var nsubseteqq = "⫅̸";
-var nsucc = "⊁";
-var nsucceq = "⪰̸";
-var nsup = "⊅";
-var nsupE = "⫆̸";
-var nsupe = "⊉";
-var nsupset = "⊃⃒";
-var nsupseteq = "⊉";
-var nsupseteqq = "⫆̸";
-var ntgl = "≹";
-var Ntilde = "Ñ";
-var ntilde = "ñ";
-var ntlg = "≸";
-var ntriangleleft = "⋪";
-var ntrianglelefteq = "⋬";
-var ntriangleright = "⋫";
-var ntrianglerighteq = "⋭";
-var Nu = "Ν";
-var nu = "ν";
-var num = "#";
-var numero = "№";
-var numsp = " ";
-var nvap = "≍⃒";
-var nvdash = "⊬";
-var nvDash = "⊭";
-var nVdash = "⊮";
-var nVDash = "⊯";
-var nvge = "≥⃒";
-var nvgt = ">⃒";
-var nvHarr = "⤄";
-var nvinfin = "⧞";
-var nvlArr = "⤂";
-var nvle = "≤⃒";
-var nvlt = "<⃒";
-var nvltrie = "⊴⃒";
-var nvrArr = "⤃";
-var nvrtrie = "⊵⃒";
-var nvsim = "∼⃒";
-var nwarhk = "⤣";
-var nwarr = "↖";
-var nwArr = "⇖";
-var nwarrow = "↖";
-var nwnear = "⤧";
-var Oacute = "Ó";
-var oacute = "ó";
-var oast = "⊛";
-var Ocirc = "Ô";
-var ocirc = "ô";
-var ocir = "⊚";
-var Ocy = "О";
-var ocy = "о";
-var odash = "⊝";
-var Odblac = "Ő";
-var odblac = "ő";
-var odiv = "⨸";
-var odot = "⊙";
-var odsold = "⦼";
-var OElig = "Œ";
-var oelig = "œ";
-var ofcir = "⦿";
-var Ofr = "𝔒";
-var ofr = "𝔬";
-var ogon = "˛";
-var Ograve = "Ò";
-var ograve = "ò";
-var ogt = "⧁";
-var ohbar = "⦵";
-var ohm = "Ω";
-var oint = "∮";
-var olarr = "↺";
-var olcir = "⦾";
-var olcross = "⦻";
-var oline = "‾";
-var olt = "⧀";
-var Omacr = "Ō";
-var omacr = "ō";
-var Omega = "Ω";
-var omega = "ω";
-var Omicron = "Ο";
-var omicron = "ο";
-var omid = "⦶";
-var ominus = "⊖";
-var Oopf = "𝕆";
-var oopf = "𝕠";
-var opar = "⦷";
-var OpenCurlyDoubleQuote = "“";
-var OpenCurlyQuote = "‘";
-var operp = "⦹";
-var oplus = "⊕";
-var orarr = "↻";
-var Or = "⩔";
-var or = "∨";
-var ord = "⩝";
-var order = "ℴ";
-var orderof = "ℴ";
-var ordf = "ª";
-var ordm = "º";
-var origof = "⊶";
-var oror = "⩖";
-var orslope = "⩗";
-var orv = "⩛";
-var oS = "Ⓢ";
-var Oscr = "𝒪";
-var oscr = "ℴ";
-var Oslash = "Ø";
-var oslash = "ø";
-var osol = "⊘";
-var Otilde = "Õ";
-var otilde = "õ";
-var otimesas = "⨶";
-var Otimes = "⨷";
-var otimes = "⊗";
-var Ouml = "Ö";
-var ouml = "ö";
-var ovbar = "⌽";
-var OverBar = "‾";
-var OverBrace = "⏞";
-var OverBracket = "⎴";
-var OverParenthesis = "⏜";
-var para = "¶";
-var parallel = "∥";
-var par = "∥";
-var parsim = "⫳";
-var parsl = "⫽";
-var part = "∂";
-var PartialD = "∂";
-var Pcy = "П";
-var pcy = "п";
-var percnt = "%";
-var period = ".";
-var permil = "‰";
-var perp = "⊥";
-var pertenk = "‱";
-var Pfr = "𝔓";
-var pfr = "𝔭";
-var Phi = "Φ";
-var phi = "φ";
-var phiv = "ϕ";
-var phmmat = "ℳ";
-var phone = "☎";
-var Pi = "Π";
-var pi = "π";
-var pitchfork = "⋔";
-var piv = "ϖ";
-var planck = "ℏ";
-var planckh = "ℎ";
-var plankv = "ℏ";
-var plusacir = "⨣";
-var plusb = "⊞";
-var pluscir = "⨢";
-var plus = "+";
-var plusdo = "∔";
-var plusdu = "⨥";
-var pluse = "⩲";
-var PlusMinus = "±";
-var plusmn = "±";
-var plussim = "⨦";
-var plustwo = "⨧";
-var pm = "±";
-var Poincareplane = "ℌ";
-var pointint = "⨕";
-var popf = "𝕡";
-var Popf = "ℙ";
-var pound = "£";
-var prap = "⪷";
-var Pr = "⪻";
-var pr = "≺";
-var prcue = "≼";
-var precapprox = "⪷";
-var prec = "≺";
-var preccurlyeq = "≼";
-var Precedes = "≺";
-var PrecedesEqual = "⪯";
-var PrecedesSlantEqual = "≼";
-var PrecedesTilde = "≾";
-var preceq = "⪯";
-var precnapprox = "⪹";
-var precneqq = "⪵";
-var precnsim = "⋨";
-var pre = "⪯";
-var prE = "⪳";
-var precsim = "≾";
-var prime = "′";
-var Prime = "″";
-var primes = "ℙ";
-var prnap = "⪹";
-var prnE = "⪵";
-var prnsim = "⋨";
-var prod = "∏";
-var Product = "∏";
-var profalar = "⌮";
-var profline = "⌒";
-var profsurf = "⌓";
-var prop = "∝";
-var Proportional = "∝";
-var Proportion = "∷";
-var propto = "∝";
-var prsim = "≾";
-var prurel = "⊰";
-var Pscr = "𝒫";
-var pscr = "𝓅";
-var Psi = "Ψ";
-var psi = "ψ";
-var puncsp = " ";
-var Qfr = "𝔔";
-var qfr = "𝔮";
-var qint = "⨌";
-var qopf = "𝕢";
-var Qopf = "ℚ";
-var qprime = "⁗";
-var Qscr = "𝒬";
-var qscr = "𝓆";
-var quaternions = "ℍ";
-var quatint = "⨖";
-var quest = "?";
-var questeq = "≟";
-var quot = "\"";
-var QUOT = "\"";
-var rAarr = "⇛";
-var race = "∽̱";
-var Racute = "Ŕ";
-var racute = "ŕ";
-var radic = "√";
-var raemptyv = "⦳";
-var rang = "⟩";
-var Rang = "⟫";
-var rangd = "⦒";
-var range = "⦥";
-var rangle = "⟩";
-var raquo = "»";
-var rarrap = "⥵";
-var rarrb = "⇥";
-var rarrbfs = "⤠";
-var rarrc = "⤳";
-var rarr = "→";
-var Rarr = "↠";
-var rArr = "⇒";
-var rarrfs = "⤞";
-var rarrhk = "↪";
-var rarrlp = "↬";
-var rarrpl = "⥅";
-var rarrsim = "⥴";
-var Rarrtl = "⤖";
-var rarrtl = "↣";
-var rarrw = "↝";
-var ratail = "⤚";
-var rAtail = "⤜";
-var ratio = "∶";
-var rationals = "ℚ";
-var rbarr = "⤍";
-var rBarr = "⤏";
-var RBarr = "⤐";
-var rbbrk = "❳";
-var rbrace = "}";
-var rbrack = "]";
-var rbrke = "⦌";
-var rbrksld = "⦎";
-var rbrkslu = "⦐";
-var Rcaron = "Ř";
-var rcaron = "ř";
-var Rcedil = "Ŗ";
-var rcedil = "ŗ";
-var rceil = "⌉";
-var rcub = "}";
-var Rcy = "Р";
-var rcy = "р";
-var rdca = "⤷";
-var rdldhar = "⥩";
-var rdquo = "”";
-var rdquor = "”";
-var rdsh = "↳";
-var real = "ℜ";
-var realine = "ℛ";
-var realpart = "ℜ";
-var reals = "ℝ";
-var Re = "ℜ";
-var rect = "▭";
-var reg = "®";
-var REG = "®";
-var ReverseElement = "∋";
-var ReverseEquilibrium = "⇋";
-var ReverseUpEquilibrium = "⥯";
-var rfisht = "⥽";
-var rfloor = "⌋";
-var rfr = "𝔯";
-var Rfr = "ℜ";
-var rHar = "⥤";
-var rhard = "⇁";
-var rharu = "⇀";
-var rharul = "⥬";
-var Rho = "Ρ";
-var rho = "ρ";
-var rhov = "ϱ";
-var RightAngleBracket = "⟩";
-var RightArrowBar = "⇥";
-var rightarrow = "→";
-var RightArrow = "→";
-var Rightarrow = "⇒";
-var RightArrowLeftArrow = "⇄";
-var rightarrowtail = "↣";
-var RightCeiling = "⌉";
-var RightDoubleBracket = "⟧";
-var RightDownTeeVector = "⥝";
-var RightDownVectorBar = "⥕";
-var RightDownVector = "⇂";
-var RightFloor = "⌋";
-var rightharpoondown = "⇁";
-var rightharpoonup = "⇀";
-var rightleftarrows = "⇄";
-var rightleftharpoons = "⇌";
-var rightrightarrows = "⇉";
-var rightsquigarrow = "↝";
-var RightTeeArrow = "↦";
-var RightTee = "⊢";
-var RightTeeVector = "⥛";
-var rightthreetimes = "⋌";
-var RightTriangleBar = "⧐";
-var RightTriangle = "⊳";
-var RightTriangleEqual = "⊵";
-var RightUpDownVector = "⥏";
-var RightUpTeeVector = "⥜";
-var RightUpVectorBar = "⥔";
-var RightUpVector = "↾";
-var RightVectorBar = "⥓";
-var RightVector = "⇀";
-var ring = "˚";
-var risingdotseq = "≓";
-var rlarr = "⇄";
-var rlhar = "⇌";
-var rlm = "‏";
-var rmoustache = "⎱";
-var rmoust = "⎱";
-var rnmid = "⫮";
-var roang = "⟭";
-var roarr = "⇾";
-var robrk = "⟧";
-var ropar = "⦆";
-var ropf = "𝕣";
-var Ropf = "ℝ";
-var roplus = "⨮";
-var rotimes = "⨵";
-var RoundImplies = "⥰";
-var rpar = ")";
-var rpargt = "⦔";
-var rppolint = "⨒";
-var rrarr = "⇉";
-var Rrightarrow = "⇛";
-var rsaquo = "›";
-var rscr = "𝓇";
-var Rscr = "ℛ";
-var rsh = "↱";
-var Rsh = "↱";
-var rsqb = "]";
-var rsquo = "’";
-var rsquor = "’";
-var rthree = "⋌";
-var rtimes = "⋊";
-var rtri = "▹";
-var rtrie = "⊵";
-var rtrif = "▸";
-var rtriltri = "⧎";
-var RuleDelayed = "⧴";
-var ruluhar = "⥨";
-var rx = "℞";
-var Sacute = "Ś";
-var sacute = "ś";
-var sbquo = "‚";
-var scap = "⪸";
-var Scaron = "Š";
-var scaron = "š";
-var Sc = "⪼";
-var sc = "≻";
-var sccue = "≽";
-var sce = "⪰";
-var scE = "⪴";
-var Scedil = "Ş";
-var scedil = "ş";
-var Scirc = "Ŝ";
-var scirc = "ŝ";
-var scnap = "⪺";
-var scnE = "⪶";
-var scnsim = "⋩";
-var scpolint = "⨓";
-var scsim = "≿";
-var Scy = "С";
-var scy = "с";
-var sdotb = "⊡";
-var sdot = "⋅";
-var sdote = "⩦";
-var searhk = "⤥";
-var searr = "↘";
-var seArr = "⇘";
-var searrow = "↘";
-var sect = "§";
-var semi = ";";
-var seswar = "⤩";
-var setminus = "∖";
-var setmn = "∖";
-var sext = "✶";
-var Sfr = "𝔖";
-var sfr = "𝔰";
-var sfrown = "⌢";
-var sharp = "♯";
-var SHCHcy = "Щ";
-var shchcy = "щ";
-var SHcy = "Ш";
-var shcy = "ш";
-var ShortDownArrow = "↓";
-var ShortLeftArrow = "←";
-var shortmid = "∣";
-var shortparallel = "∥";
-var ShortRightArrow = "→";
-var ShortUpArrow = "↑";
-var shy = "­";
-var Sigma = "Σ";
-var sigma = "σ";
-var sigmaf = "ς";
-var sigmav = "ς";
-var sim = "∼";
-var simdot = "⩪";
-var sime = "≃";
-var simeq = "≃";
-var simg = "⪞";
-var simgE = "⪠";
-var siml = "⪝";
-var simlE = "⪟";
-var simne = "≆";
-var simplus = "⨤";
-var simrarr = "⥲";
-var slarr = "←";
-var SmallCircle = "∘";
-var smallsetminus = "∖";
-var smashp = "⨳";
-var smeparsl = "⧤";
-var smid = "∣";
-var smile = "⌣";
-var smt = "⪪";
-var smte = "⪬";
-var smtes = "⪬︀";
-var SOFTcy = "Ь";
-var softcy = "ь";
-var solbar = "⌿";
-var solb = "⧄";
-var sol = "/";
-var Sopf = "𝕊";
-var sopf = "𝕤";
-var spades = "♠";
-var spadesuit = "♠";
-var spar = "∥";
-var sqcap = "⊓";
-var sqcaps = "⊓︀";
-var sqcup = "⊔";
-var sqcups = "⊔︀";
-var Sqrt = "√";
-var sqsub = "⊏";
-var sqsube = "⊑";
-var sqsubset = "⊏";
-var sqsubseteq = "⊑";
-var sqsup = "⊐";
-var sqsupe = "⊒";
-var sqsupset = "⊐";
-var sqsupseteq = "⊒";
-var square = "□";
-var Square = "□";
-var SquareIntersection = "⊓";
-var SquareSubset = "⊏";
-var SquareSubsetEqual = "⊑";
-var SquareSuperset = "⊐";
-var SquareSupersetEqual = "⊒";
-var SquareUnion = "⊔";
-var squarf = "▪";
-var squ = "□";
-var squf = "▪";
-var srarr = "→";
-var Sscr = "𝒮";
-var sscr = "𝓈";
-var ssetmn = "∖";
-var ssmile = "⌣";
-var sstarf = "⋆";
-var Star = "⋆";
-var star = "☆";
-var starf = "★";
-var straightepsilon = "ϵ";
-var straightphi = "ϕ";
-var strns = "¯";
-var sub = "⊂";
-var Sub = "⋐";
-var subdot = "⪽";
-var subE = "⫅";
-var sube = "⊆";
-var subedot = "⫃";
-var submult = "⫁";
-var subnE = "⫋";
-var subne = "⊊";
-var subplus = "⪿";
-var subrarr = "⥹";
-var subset = "⊂";
-var Subset = "⋐";
-var subseteq = "⊆";
-var subseteqq = "⫅";
-var SubsetEqual = "⊆";
-var subsetneq = "⊊";
-var subsetneqq = "⫋";
-var subsim = "⫇";
-var subsub = "⫕";
-var subsup = "⫓";
-var succapprox = "⪸";
-var succ = "≻";
-var succcurlyeq = "≽";
-var Succeeds = "≻";
-var SucceedsEqual = "⪰";
-var SucceedsSlantEqual = "≽";
-var SucceedsTilde = "≿";
-var succeq = "⪰";
-var succnapprox = "⪺";
-var succneqq = "⪶";
-var succnsim = "⋩";
-var succsim = "≿";
-var SuchThat = "∋";
-var sum = "∑";
-var Sum = "∑";
-var sung = "♪";
-var sup1 = "¹";
-var sup2 = "²";
-var sup3 = "³";
-var sup = "⊃";
-var Sup = "⋑";
-var supdot = "⪾";
-var supdsub = "⫘";
-var supE = "⫆";
-var supe = "⊇";
-var supedot = "⫄";
-var Superset = "⊃";
-var SupersetEqual = "⊇";
-var suphsol = "⟉";
-var suphsub = "⫗";
-var suplarr = "⥻";
-var supmult = "⫂";
-var supnE = "⫌";
-var supne = "⊋";
-var supplus = "⫀";
-var supset = "⊃";
-var Supset = "⋑";
-var supseteq = "⊇";
-var supseteqq = "⫆";
-var supsetneq = "⊋";
-var supsetneqq = "⫌";
-var supsim = "⫈";
-var supsub = "⫔";
-var supsup = "⫖";
-var swarhk = "⤦";
-var swarr = "↙";
-var swArr = "⇙";
-var swarrow = "↙";
-var swnwar = "⤪";
-var szlig = "ß";
-var Tab = "\t";
-var target = "⌖";
-var Tau = "Τ";
-var tau = "τ";
-var tbrk = "⎴";
-var Tcaron = "Ť";
-var tcaron = "ť";
-var Tcedil = "Ţ";
-var tcedil = "ţ";
-var Tcy = "Т";
-var tcy = "т";
-var tdot = "⃛";
-var telrec = "⌕";
-var Tfr = "𝔗";
-var tfr = "𝔱";
-var there4 = "∴";
-var therefore = "∴";
-var Therefore = "∴";
-var Theta = "Θ";
-var theta = "θ";
-var thetasym = "ϑ";
-var thetav = "ϑ";
-var thickapprox = "≈";
-var thicksim = "∼";
-var ThickSpace = "  ";
-var ThinSpace = " ";
-var thinsp = " ";
-var thkap = "≈";
-var thksim = "∼";
-var THORN = "Þ";
-var thorn = "þ";
-var tilde = "˜";
-var Tilde = "∼";
-var TildeEqual = "≃";
-var TildeFullEqual = "≅";
-var TildeTilde = "≈";
-var timesbar = "⨱";
-var timesb = "⊠";
-var times = "×";
-var timesd = "⨰";
-var tint = "∭";
-var toea = "⤨";
-var topbot = "⌶";
-var topcir = "⫱";
-var top = "⊤";
-var Topf = "𝕋";
-var topf = "𝕥";
-var topfork = "⫚";
-var tosa = "⤩";
-var tprime = "‴";
-var trade = "™";
-var TRADE = "™";
-var triangle = "▵";
-var triangledown = "▿";
-var triangleleft = "◃";
-var trianglelefteq = "⊴";
-var triangleq = "≜";
-var triangleright = "▹";
-var trianglerighteq = "⊵";
-var tridot = "◬";
-var trie = "≜";
-var triminus = "⨺";
-var TripleDot = "⃛";
-var triplus = "⨹";
-var trisb = "⧍";
-var tritime = "⨻";
-var trpezium = "⏢";
-var Tscr = "𝒯";
-var tscr = "𝓉";
-var TScy = "Ц";
-var tscy = "ц";
-var TSHcy = "Ћ";
-var tshcy = "ћ";
-var Tstrok = "Ŧ";
-var tstrok = "ŧ";
-var twixt = "≬";
-var twoheadleftarrow = "↞";
-var twoheadrightarrow = "↠";
-var Uacute = "Ú";
-var uacute = "ú";
-var uarr = "↑";
-var Uarr = "↟";
-var uArr = "⇑";
-var Uarrocir = "⥉";
-var Ubrcy = "Ў";
-var ubrcy = "ў";
-var Ubreve = "Ŭ";
-var ubreve = "ŭ";
-var Ucirc = "Û";
-var ucirc = "û";
-var Ucy = "У";
-var ucy = "у";
-var udarr = "⇅";
-var Udblac = "Ű";
-var udblac = "ű";
-var udhar = "⥮";
-var ufisht = "⥾";
-var Ufr = "𝔘";
-var ufr = "𝔲";
-var Ugrave = "Ù";
-var ugrave = "ù";
-var uHar = "⥣";
-var uharl = "↿";
-var uharr = "↾";
-var uhblk = "▀";
-var ulcorn = "⌜";
-var ulcorner = "⌜";
-var ulcrop = "⌏";
-var ultri = "◸";
-var Umacr = "Ū";
-var umacr = "ū";
-var uml = "¨";
-var UnderBar = "_";
-var UnderBrace = "⏟";
-var UnderBracket = "⎵";
-var UnderParenthesis = "⏝";
-var Union = "⋃";
-var UnionPlus = "⊎";
-var Uogon = "Ų";
-var uogon = "ų";
-var Uopf = "𝕌";
-var uopf = "𝕦";
-var UpArrowBar = "⤒";
-var uparrow = "↑";
-var UpArrow = "↑";
-var Uparrow = "⇑";
-var UpArrowDownArrow = "⇅";
-var updownarrow = "↕";
-var UpDownArrow = "↕";
-var Updownarrow = "⇕";
-var UpEquilibrium = "⥮";
-var upharpoonleft = "↿";
-var upharpoonright = "↾";
-var uplus = "⊎";
-var UpperLeftArrow = "↖";
-var UpperRightArrow = "↗";
-var upsi = "υ";
-var Upsi = "ϒ";
-var upsih = "ϒ";
-var Upsilon = "Υ";
-var upsilon = "υ";
-var UpTeeArrow = "↥";
-var UpTee = "⊥";
-var upuparrows = "⇈";
-var urcorn = "⌝";
-var urcorner = "⌝";
-var urcrop = "⌎";
-var Uring = "Ů";
-var uring = "ů";
-var urtri = "◹";
-var Uscr = "𝒰";
-var uscr = "𝓊";
-var utdot = "⋰";
-var Utilde = "Ũ";
-var utilde = "ũ";
-var utri = "▵";
-var utrif = "▴";
-var uuarr = "⇈";
-var Uuml = "Ü";
-var uuml = "ü";
-var uwangle = "⦧";
-var vangrt = "⦜";
-var varepsilon = "ϵ";
-var varkappa = "ϰ";
-var varnothing = "∅";
-var varphi = "ϕ";
-var varpi = "ϖ";
-var varpropto = "∝";
-var varr = "↕";
-var vArr = "⇕";
-var varrho = "ϱ";
-var varsigma = "ς";
-var varsubsetneq = "⊊︀";
-var varsubsetneqq = "⫋︀";
-var varsupsetneq = "⊋︀";
-var varsupsetneqq = "⫌︀";
-var vartheta = "ϑ";
-var vartriangleleft = "⊲";
-var vartriangleright = "⊳";
-var vBar = "⫨";
-var Vbar = "⫫";
-var vBarv = "⫩";
-var Vcy = "В";
-var vcy = "в";
-var vdash = "⊢";
-var vDash = "⊨";
-var Vdash = "⊩";
-var VDash = "⊫";
-var Vdashl = "⫦";
-var veebar = "⊻";
-var vee = "∨";
-var Vee = "⋁";
-var veeeq = "≚";
-var vellip = "⋮";
-var verbar = "|";
-var Verbar = "‖";
-var vert = "|";
-var Vert = "‖";
-var VerticalBar = "∣";
-var VerticalLine = "|";
-var VerticalSeparator = "❘";
-var VerticalTilde = "≀";
-var VeryThinSpace = " ";
-var Vfr = "𝔙";
-var vfr = "𝔳";
-var vltri = "⊲";
-var vnsub = "⊂⃒";
-var vnsup = "⊃⃒";
-var Vopf = "𝕍";
-var vopf = "𝕧";
-var vprop = "∝";
-var vrtri = "⊳";
-var Vscr = "𝒱";
-var vscr = "𝓋";
-var vsubnE = "⫋︀";
-var vsubne = "⊊︀";
-var vsupnE = "⫌︀";
-var vsupne = "⊋︀";
-var Vvdash = "⊪";
-var vzigzag = "⦚";
-var Wcirc = "Ŵ";
-var wcirc = "ŵ";
-var wedbar = "⩟";
-var wedge = "∧";
-var Wedge = "⋀";
-var wedgeq = "≙";
-var weierp = "℘";
-var Wfr = "𝔚";
-var wfr = "𝔴";
-var Wopf = "𝕎";
-var wopf = "𝕨";
-var wp = "℘";
-var wr = "≀";
-var wreath = "≀";
-var Wscr = "𝒲";
-var wscr = "𝓌";
-var xcap = "⋂";
-var xcirc = "◯";
-var xcup = "⋃";
-var xdtri = "▽";
-var Xfr = "𝔛";
-var xfr = "𝔵";
-var xharr = "⟷";
-var xhArr = "⟺";
-var Xi = "Ξ";
-var xi = "ξ";
-var xlarr = "⟵";
-var xlArr = "⟸";
-var xmap = "⟼";
-var xnis = "⋻";
-var xodot = "⨀";
-var Xopf = "𝕏";
-var xopf = "𝕩";
-var xoplus = "⨁";
-var xotime = "⨂";
-var xrarr = "⟶";
-var xrArr = "⟹";
-var Xscr = "𝒳";
-var xscr = "𝓍";
-var xsqcup = "⨆";
-var xuplus = "⨄";
-var xutri = "△";
-var xvee = "⋁";
-var xwedge = "⋀";
-var Yacute = "Ý";
-var yacute = "ý";
-var YAcy = "Я";
-var yacy = "я";
-var Ycirc = "Ŷ";
-var ycirc = "ŷ";
-var Ycy = "Ы";
-var ycy = "ы";
-var yen = "¥";
-var Yfr = "𝔜";
-var yfr = "𝔶";
-var YIcy = "Ї";
-var yicy = "ї";
-var Yopf = "𝕐";
-var yopf = "𝕪";
-var Yscr = "𝒴";
-var yscr = "𝓎";
-var YUcy = "Ю";
-var yucy = "ю";
-var yuml = "ÿ";
-var Yuml = "Ÿ";
-var Zacute = "Ź";
-var zacute = "ź";
-var Zcaron = "Ž";
-var zcaron = "ž";
-var Zcy = "З";
-var zcy = "з";
-var Zdot = "Ż";
-var zdot = "ż";
-var zeetrf = "ℨ";
-var ZeroWidthSpace = "​";
-var Zeta = "Ζ";
-var zeta = "ζ";
-var zfr = "𝔷";
-var Zfr = "ℨ";
-var ZHcy = "Ж";
-var zhcy = "ж";
-var zigrarr = "⇝";
-var zopf = "𝕫";
-var Zopf = "ℤ";
-var Zscr = "𝒵";
-var zscr = "𝓏";
-var zwj = "‍";
-var zwnj = "‌";
-var entities = {
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	"in": "∈",
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	"Map": "⤅",
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj
-};
-
-var entities$1 = {
-	__proto__: null,
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj,
-	'default': entities
-};
-
-var Aacute$1 = "Á";
-var aacute$1 = "á";
-var Acirc$1 = "Â";
-var acirc$1 = "â";
-var acute$1 = "´";
-var AElig$1 = "Æ";
-var aelig$1 = "æ";
-var Agrave$1 = "À";
-var agrave$1 = "à";
-var amp$1 = "&";
-var AMP$1 = "&";
-var Aring$1 = "Å";
-var aring$1 = "å";
-var Atilde$1 = "Ã";
-var atilde$1 = "ã";
-var Auml$1 = "Ä";
-var auml$1 = "ä";
-var brvbar$1 = "¦";
-var Ccedil$1 = "Ç";
-var ccedil$1 = "ç";
-var cedil$1 = "¸";
-var cent$1 = "¢";
-var copy$1 = "©";
-var COPY$1 = "©";
-var curren$1 = "¤";
-var deg$1 = "°";
-var divide$1 = "÷";
-var Eacute$1 = "É";
-var eacute$1 = "é";
-var Ecirc$1 = "Ê";
-var ecirc$1 = "ê";
-var Egrave$1 = "È";
-var egrave$1 = "è";
-var ETH$1 = "Ð";
-var eth$1 = "ð";
-var Euml$1 = "Ë";
-var euml$1 = "ë";
-var frac12$1 = "½";
-var frac14$1 = "¼";
-var frac34$1 = "¾";
-var gt$1 = ">";
-var GT$1 = ">";
-var Iacute$1 = "Í";
-var iacute$1 = "í";
-var Icirc$1 = "Î";
-var icirc$1 = "î";
-var iexcl$1 = "¡";
-var Igrave$1 = "Ì";
-var igrave$1 = "ì";
-var iquest$1 = "¿";
-var Iuml$1 = "Ï";
-var iuml$1 = "ï";
-var laquo$1 = "«";
-var lt$1 = "<";
-var LT$1 = "<";
-var macr$1 = "¯";
-var micro$1 = "µ";
-var middot$1 = "·";
-var nbsp$1 = " ";
-var not$1 = "¬";
-var Ntilde$1 = "Ñ";
-var ntilde$1 = "ñ";
-var Oacute$1 = "Ó";
-var oacute$1 = "ó";
-var Ocirc$1 = "Ô";
-var ocirc$1 = "ô";
-var Ograve$1 = "Ò";
-var ograve$1 = "ò";
-var ordf$1 = "ª";
-var ordm$1 = "º";
-var Oslash$1 = "Ø";
-var oslash$1 = "ø";
-var Otilde$1 = "Õ";
-var otilde$1 = "õ";
-var Ouml$1 = "Ö";
-var ouml$1 = "ö";
-var para$1 = "¶";
-var plusmn$1 = "±";
-var pound$1 = "£";
-var quot$1 = "\"";
-var QUOT$1 = "\"";
-var raquo$1 = "»";
-var reg$1 = "®";
-var REG$1 = "®";
-var sect$1 = "§";
-var shy$1 = "­";
-var sup1$1 = "¹";
-var sup2$1 = "²";
-var sup3$1 = "³";
-var szlig$1 = "ß";
-var THORN$1 = "Þ";
-var thorn$1 = "þ";
-var times$1 = "×";
-var Uacute$1 = "Ú";
-var uacute$1 = "ú";
-var Ucirc$1 = "Û";
-var ucirc$1 = "û";
-var Ugrave$1 = "Ù";
-var ugrave$1 = "ù";
-var uml$1 = "¨";
-var Uuml$1 = "Ü";
-var uuml$1 = "ü";
-var Yacute$1 = "Ý";
-var yacute$1 = "ý";
-var yen$1 = "¥";
-var yuml$1 = "ÿ";
-var legacy = {
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1
-};
-
-var legacy$1 = {
-	__proto__: null,
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1,
-	'default': legacy
-};
-
-var amp$2 = "&";
-var apos$1 = "'";
-var gt$2 = ">";
-var lt$2 = "<";
-var quot$2 = "\"";
-var xml = {
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2
-};
-
-var xml$1 = {
-	__proto__: null,
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2,
-	'default': xml
-};
-
-var decode = {
-	"0": 65533,
-	"128": 8364,
-	"130": 8218,
-	"131": 402,
-	"132": 8222,
-	"133": 8230,
-	"134": 8224,
-	"135": 8225,
-	"136": 710,
-	"137": 8240,
-	"138": 352,
-	"139": 8249,
-	"140": 338,
-	"142": 381,
-	"145": 8216,
-	"146": 8217,
-	"147": 8220,
-	"148": 8221,
-	"149": 8226,
-	"150": 8211,
-	"151": 8212,
-	"152": 732,
-	"153": 8482,
-	"154": 353,
-	"155": 8250,
-	"156": 339,
-	"158": 382,
-	"159": 376
-};
-
-var decode$1 = {
-	__proto__: null,
-	'default': decode
-};
-
-var require$$0 = getCjsExportFromNamespace(decode$1);
-
-var decode_codepoint = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var decode_json_1 = __importDefault(require$$0);
-// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
-function decodeCodePoint(codePoint) {
-    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
-        return "\uFFFD";
-    }
-    if (codePoint in decode_json_1.default) {
-        codePoint = decode_json_1.default[codePoint];
-    }
-    var output = "";
-    if (codePoint > 0xffff) {
-        codePoint -= 0x10000;
-        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
-        codePoint = 0xdc00 | (codePoint & 0x3ff);
-    }
-    output += String.fromCharCode(codePoint);
-    return output;
-}
-exports.default = decodeCodePoint;
-});
-
-var require$$1 = getCjsExportFromNamespace(entities$1);
-
-var require$$1$1 = getCjsExportFromNamespace(legacy$1);
-
-var require$$0$1 = getCjsExportFromNamespace(xml$1);
-
-var decode$2 = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
-var entities_json_1 = __importDefault(require$$1);
-var legacy_json_1 = __importDefault(require$$1$1);
-var xml_json_1 = __importDefault(require$$0$1);
-var decode_codepoint_1 = __importDefault(decode_codepoint);
-exports.decodeXML = getStrictDecoder(xml_json_1.default);
-exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
-function getStrictDecoder(map) {
-    var keys = Object.keys(map).join("|");
-    var replace = getReplacer(map);
-    keys += "|#[xX][\\da-fA-F]+|#\\d+";
-    var re = new RegExp("&(?:" + keys + ");", "g");
-    return function (str) { return String(str).replace(re, replace); };
-}
-var sorter = function (a, b) { return (a < b ? 1 : -1); };
-exports.decodeHTML = (function () {
-    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
-    var keys = Object.keys(entities_json_1.default).sort(sorter);
-    for (var i = 0, j = 0; i < keys.length; i++) {
-        if (legacy[j] === keys[i]) {
-            keys[i] += ";?";
-            j++;
-        }
-        else {
-            keys[i] += ";";
-        }
-    }
-    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
-    var replace = getReplacer(entities_json_1.default);
-    function replacer(str) {
-        if (str.substr(-1) !== ";")
-            str += ";";
-        return replace(str);
-    }
-    //TODO consider creating a merged map
-    return function (str) { return String(str).replace(re, replacer); };
-})();
-function getReplacer(map) {
-    return function replace(str) {
-        if (str.charAt(1) === "#") {
-            var secondChar = str.charAt(2);
-            if (secondChar === "X" || secondChar === "x") {
-                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
-            }
-            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
-        }
-        return map[str.slice(1, -1)];
-    };
-}
-});
-
-var encode = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.escape = exports.encodeHTML = exports.encodeXML = void 0;
-var xml_json_1 = __importDefault(require$$0$1);
-var inverseXML = getInverseObj(xml_json_1.default);
-var xmlReplacer = getInverseReplacer(inverseXML);
-exports.encodeXML = getInverse(inverseXML, xmlReplacer);
-var entities_json_1 = __importDefault(require$$1);
-var inverseHTML = getInverseObj(entities_json_1.default);
-var htmlReplacer = getInverseReplacer(inverseHTML);
-exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
-function getInverseObj(obj) {
-    return Object.keys(obj)
-        .sort()
-        .reduce(function (inverse, name) {
-        inverse[obj[name]] = "&" + name + ";";
-        return inverse;
-    }, {});
-}
-function getInverseReplacer(inverse) {
-    var single = [];
-    var multiple = [];
-    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
-        var k = _a[_i];
-        if (k.length === 1) {
-            // Add value to single array
-            single.push("\\" + k);
-        }
-        else {
-            // Add value to multiple array
-            multiple.push(k);
-        }
-    }
-    // Add ranges to single characters.
-    single.sort();
-    for (var start = 0; start < single.length - 1; start++) {
-        // Find the end of a run of characters
-        var end = start;
-        while (end < single.length - 1 &&
-            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
-            end += 1;
-        }
-        var count = 1 + end - start;
-        // We want to replace at least three characters
-        if (count < 3)
-            continue;
-        single.splice(start, count, single[start] + "-" + single[end]);
-    }
-    multiple.unshift("[" + single.join("") + "]");
-    return new RegExp(multiple.join("|"), "g");
-}
-var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
-function singleCharReplacer(c) {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";";
-}
-function getInverse(inverse, re) {
-    return function (data) {
-        return data
-            .replace(re, function (name) { return inverse[name]; })
-            .replace(reNonASCII, singleCharReplacer);
-    };
-}
-var reXmlChars = getInverseReplacer(inverseXML);
-function escape(data) {
-    return data
-        .replace(reXmlChars, singleCharReplacer)
-        .replace(reNonASCII, singleCharReplacer);
-}
-exports.escape = escape;
-});
-
-var lib$1 = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.encode = exports.decodeStrict = exports.decode = void 0;
-
-
-/**
- * Decodes a string with entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decode(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data);
-}
-exports.decode = decode;
-/**
- * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decodeStrict(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data);
-}
-exports.decodeStrict = decodeStrict;
-/**
- * Encodes a string with entities.
- *
- * @param data String to encode.
- * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function encode$1(data, level) {
-    return (!level || level <= 0 ? encode.encodeXML : encode.encodeHTML)(data);
-}
-exports.encode = encode$1;
-var encode_2 = encode;
-Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
-Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
-// Legacy aliases
-Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-var decode_2 = decode$2;
-Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-// Legacy aliases
-Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-});
-
-var elementNames = {
-	altglyph: "altGlyph",
-	altglyphdef: "altGlyphDef",
-	altglyphitem: "altGlyphItem",
-	animatecolor: "animateColor",
-	animatemotion: "animateMotion",
-	animatetransform: "animateTransform",
-	clippath: "clipPath",
-	feblend: "feBlend",
-	fecolormatrix: "feColorMatrix",
-	fecomponenttransfer: "feComponentTransfer",
-	fecomposite: "feComposite",
-	feconvolvematrix: "feConvolveMatrix",
-	fediffuselighting: "feDiffuseLighting",
-	fedisplacementmap: "feDisplacementMap",
-	fedistantlight: "feDistantLight",
-	fedropshadow: "feDropShadow",
-	feflood: "feFlood",
-	fefunca: "feFuncA",
-	fefuncb: "feFuncB",
-	fefuncg: "feFuncG",
-	fefuncr: "feFuncR",
-	fegaussianblur: "feGaussianBlur",
-	feimage: "feImage",
-	femerge: "feMerge",
-	femergenode: "feMergeNode",
-	femorphology: "feMorphology",
-	feoffset: "feOffset",
-	fepointlight: "fePointLight",
-	fespecularlighting: "feSpecularLighting",
-	fespotlight: "feSpotLight",
-	fetile: "feTile",
-	feturbulence: "feTurbulence",
-	foreignobject: "foreignObject",
-	glyphref: "glyphRef",
-	lineargradient: "linearGradient",
-	radialgradient: "radialGradient",
-	textpath: "textPath"
-};
-var attributeNames = {
-	definitionurl: "definitionURL",
-	attributename: "attributeName",
-	attributetype: "attributeType",
-	basefrequency: "baseFrequency",
-	baseprofile: "baseProfile",
-	calcmode: "calcMode",
-	clippathunits: "clipPathUnits",
-	diffuseconstant: "diffuseConstant",
-	edgemode: "edgeMode",
-	filterunits: "filterUnits",
-	glyphref: "glyphRef",
-	gradienttransform: "gradientTransform",
-	gradientunits: "gradientUnits",
-	kernelmatrix: "kernelMatrix",
-	kernelunitlength: "kernelUnitLength",
-	keypoints: "keyPoints",
-	keysplines: "keySplines",
-	keytimes: "keyTimes",
-	lengthadjust: "lengthAdjust",
-	limitingconeangle: "limitingConeAngle",
-	markerheight: "markerHeight",
-	markerunits: "markerUnits",
-	markerwidth: "markerWidth",
-	maskcontentunits: "maskContentUnits",
-	maskunits: "maskUnits",
-	numoctaves: "numOctaves",
-	pathlength: "pathLength",
-	patterncontentunits: "patternContentUnits",
-	patterntransform: "patternTransform",
-	patternunits: "patternUnits",
-	pointsatx: "pointsAtX",
-	pointsaty: "pointsAtY",
-	pointsatz: "pointsAtZ",
-	preservealpha: "preserveAlpha",
-	preserveaspectratio: "preserveAspectRatio",
-	primitiveunits: "primitiveUnits",
-	refx: "refX",
-	refy: "refY",
-	repeatcount: "repeatCount",
-	repeatdur: "repeatDur",
-	requiredextensions: "requiredExtensions",
-	requiredfeatures: "requiredFeatures",
-	specularconstant: "specularConstant",
-	specularexponent: "specularExponent",
-	spreadmethod: "spreadMethod",
-	startoffset: "startOffset",
-	stddeviation: "stdDeviation",
-	stitchtiles: "stitchTiles",
-	surfacescale: "surfaceScale",
-	systemlanguage: "systemLanguage",
-	tablevalues: "tableValues",
-	targetx: "targetX",
-	targety: "targetY",
-	textlength: "textLength",
-	viewbox: "viewBox",
-	viewtarget: "viewTarget",
-	xchannelselector: "xChannelSelector",
-	ychannelselector: "yChannelSelector",
-	zoomandpan: "zoomAndPan"
-};
-var foreignNames = {
-	elementNames: elementNames,
-	attributeNames: attributeNames
-};
-
-var foreignNames$1 = {
-	__proto__: null,
-	elementNames: elementNames,
-	attributeNames: attributeNames,
-	'default': foreignNames
-};
-
-var foreignNames$2 = getCjsExportFromNamespace(foreignNames$1);
-
-var domSerializer = createCommonjsModule(function (module) {
-/*
-  Module dependencies
-*/
-
-
-
-/* mixed-case SVG and MathML tags & attributes
-   recognized by the HTML parser, see
-   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
-*/
-
-foreignNames$2.elementNames.__proto__ = null; /* use as a simple dictionary */
-foreignNames$2.attributeNames.__proto__ = null;
-
-var unencodedElements = {
-  __proto__: null,
-  style: true,
-  script: true,
-  xmp: true,
-  iframe: true,
-  noembed: true,
-  noframes: true,
-  plaintext: true,
-  noscript: true
-};
-
-/*
-  Format attributes
-*/
-function formatAttrs(attributes, opts) {
-  if (!attributes) return;
-
-  var output = '';
-  var value;
-
-  // Loop through the attributes
-  for (var key in attributes) {
-    value = attributes[key];
-    if (output) {
-      output += ' ';
-    }
-
-    if (opts.xmlMode === 'foreign') {
-      /* fix up mixed-case attribute names */
-      key = foreignNames$2.attributeNames[key] || key;
-    }
-    output += key;
-    if ((value !== null && value !== '') || opts.xmlMode) {
-      output +=
-        '="' +
-        (opts.decodeEntities
-          ? lib$1.encodeXML(value)
-          : value.replace(/\"/g, '&quot;')) +
-        '"';
-    }
-  }
-
-  return output;
-}
-
-/*
-  Self-enclosing tags (stolen from node-htmlparser)
-*/
-var singleTag = {
-  __proto__: null,
-  area: true,
-  base: true,
-  basefont: true,
-  br: true,
-  col: true,
-  command: true,
-  embed: true,
-  frame: true,
-  hr: true,
-  img: true,
-  input: true,
-  isindex: true,
-  keygen: true,
-  link: true,
-  meta: true,
-  param: true,
-  source: true,
-  track: true,
-  wbr: true
-};
-
-var render = (module.exports = function(dom, opts) {
-  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];
-  opts = opts || {};
-
-  var output = '';
-
-  for (var i = 0; i < dom.length; i++) {
-    var elem = dom[i];
-
-    if (elem.type === 'root') output += render(elem.children, opts);
-    else if (lib.isTag(elem)) output += renderTag(elem, opts);
-    else if (elem.type === lib.Directive)
-      output += renderDirective(elem);
-    else if (elem.type === lib.Comment) output += renderComment(elem);
-    else if (elem.type === lib.CDATA) output += renderCdata(elem);
-    else output += renderText(elem, opts);
-  }
-
-  return output;
-});
-
-var foreignModeIntegrationPoints = [
-  'mi',
-  'mo',
-  'mn',
-  'ms',
-  'mtext',
-  'annotation-xml',
-  'foreignObject',
-  'desc',
-  'title'
-];
-
-function renderTag(elem, opts) {
-  // Handle SVG / MathML in HTML
-  if (opts.xmlMode === 'foreign') {
-    /* fix up mixed-case element names */
-    elem.name = foreignNames$2.elementNames[elem.name] || elem.name;
-    /* exit foreign mode at integration points */
-    if (
-      elem.parent &&
-      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0
-    )
-      opts = Object.assign({}, opts, { xmlMode: false });
-  }
-  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {
-    opts = Object.assign({}, opts, { xmlMode: 'foreign' });
-  }
-
-  var tag = '<' + elem.name;
-  var attribs = formatAttrs(elem.attribs, opts);
-
-  if (attribs) {
-    tag += ' ' + attribs;
-  }
-
-  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {
-    tag += '/>';
-  } else {
-    tag += '>';
-    if (elem.children) {
-      tag += render(elem.children, opts);
-    }
-
-    if (!singleTag[elem.name] || opts.xmlMode) {
-      tag += '</' + elem.name + '>';
-    }
-  }
-
-  return tag;
-}
-
-function renderDirective(elem) {
-  return '<' + elem.data + '>';
-}
-
-function renderText(elem, opts) {
-  var data = elem.data || '';
-
-  // if entities weren't decoded, no need to encode them back
-  if (
-    opts.decodeEntities &&
-    !(elem.parent && elem.parent.name in unencodedElements)
-  ) {
-    data = lib$1.encodeXML(data);
-  }
-
-  return data;
-}
-
-function renderCdata(elem) {
-  return '<![CDATA[' + elem.children[0].data + ']]>';
-}
-
-function renderComment(elem) {
-  return '<!--' + elem.data + '-->';
-}
-});
-
-var isTag = domelementtype.isTag;
-
-var stringify = {
-	getInnerHTML: getInnerHTML,
-	getOuterHTML: domSerializer,
-	getText: getText
-};
-
-function getInnerHTML(elem, opts){
-	return elem.children ? elem.children.map(function(elem){
-		return domSerializer(elem, opts);
-	}).join("") : "";
-}
-
-function getText(elem){
-	if(Array.isArray(elem)) return elem.map(getText).join("");
-	if(isTag(elem) || elem.type === domelementtype.CDATA) return getText(elem.children);
-	if(elem.type === domelementtype.Text) return elem.data;
-	return "";
-}
-
-var traversal = createCommonjsModule(function (module, exports) {
-var getChildren = exports.getChildren = function(elem){
-	return elem.children;
-};
-
-var getParent = exports.getParent = function(elem){
-	return elem.parent;
-};
-
-exports.getSiblings = function(elem){
-	var parent = getParent(elem);
-	return parent ? getChildren(parent) : [elem];
-};
-
-exports.getAttributeValue = function(elem, name){
-	return elem.attribs && elem.attribs[name];
-};
-
-exports.hasAttrib = function(elem, name){
-	return !!elem.attribs && hasOwnProperty.call(elem.attribs, name);
-};
-
-exports.getName = function(elem){
-	return elem.name;
-};
-});
-
-var removeElement = function(elem){
-	if(elem.prev) elem.prev.next = elem.next;
-	if(elem.next) elem.next.prev = elem.prev;
-
-	if(elem.parent){
-		var childs = elem.parent.children;
-		childs.splice(childs.lastIndexOf(elem), 1);
-	}
-};
-
-var replaceElement = function(elem, replacement){
-	var prev = replacement.prev = elem.prev;
-	if(prev){
-		prev.next = replacement;
-	}
-
-	var next = replacement.next = elem.next;
-	if(next){
-		next.prev = replacement;
-	}
-
-	var parent = replacement.parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs[childs.lastIndexOf(elem)] = replacement;
-	}
-};
-
-var appendChild = function(elem, child){
-	child.parent = elem;
-
-	if(elem.children.push(child) !== 1){
-		var sibling = elem.children[elem.children.length - 2];
-		sibling.next = child;
-		child.prev = sibling;
-		child.next = null;
-	}
-};
-
-var append = function(elem, next){
-	var parent = elem.parent,
-		currNext = elem.next;
-
-	next.next = currNext;
-	next.prev = elem;
-	elem.next = next;
-	next.parent = parent;
-
-	if(currNext){
-		currNext.prev = next;
-		if(parent){
-			var childs = parent.children;
-			childs.splice(childs.lastIndexOf(currNext), 0, next);
-		}
-	} else if(parent){
-		parent.children.push(next);
-	}
-};
-
-var prepend = function(elem, prev){
-	var parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs.splice(childs.lastIndexOf(elem), 0, prev);
-	}
-
-	if(elem.prev){
-		elem.prev.next = prev;
-	}
-	
-	prev.parent = parent;
-	prev.prev = elem.prev;
-	prev.next = elem;
-	elem.prev = prev;
-};
-
-var manipulation = {
-	removeElement: removeElement,
-	replaceElement: replaceElement,
-	appendChild: appendChild,
-	append: append,
-	prepend: prepend
-};
-
-var isTag$1 = domelementtype.isTag;
-
-var querying = {
-	filter: filter,
-	find: find,
-	findOneChild: findOneChild,
-	findOne: findOne,
-	existsOne: existsOne,
-	findAll: findAll
-};
-
-function filter(test, element, recurse, limit){
-	if(!Array.isArray(element)) element = [element];
-
-	if(typeof limit !== "number" || !isFinite(limit)){
-		limit = Infinity;
-	}
-	return find(test, element, recurse !== false, limit);
-}
-
-function find(test, elems, recurse, limit){
-	var result = [], childs;
-
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(test(elems[i])){
-			result.push(elems[i]);
-			if(--limit <= 0) break;
-		}
-
-		childs = elems[i].children;
-		if(recurse && childs && childs.length > 0){
-			childs = find(test, childs, recurse, limit);
-			result = result.concat(childs);
-			limit -= childs.length;
-			if(limit <= 0) break;
-		}
-	}
-
-	return result;
-}
-
-function findOneChild(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(test(elems[i])) return elems[i];
-	}
-
-	return null;
-}
-
-function findOne(test, elems){
-	var elem = null;
-
-	for(var i = 0, l = elems.length; i < l && !elem; i++){
-		if(!isTag$1(elems[i])){
-			continue;
-		} else if(test(elems[i])){
-			elem = elems[i];
-		} else if(elems[i].children.length > 0){
-			elem = findOne(test, elems[i].children);
-		}
-	}
-
-	return elem;
-}
-
-function existsOne(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(
-			isTag$1(elems[i]) && (
-				test(elems[i]) || (
-					elems[i].children.length > 0 &&
-					existsOne(test, elems[i].children)
-				)
-			)
-		){
-			return true;
-		}
-	}
-
-	return false;
-}
-
-function findAll(test, elems){
-	var result = [];
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(!isTag$1(elems[i])) continue;
-		if(test(elems[i])) result.push(elems[i]);
-
-		if(elems[i].children.length > 0){
-			result = result.concat(findAll(test, elems[i].children));
-		}
-	}
-	return result;
-}
-
-var legacy$2 = createCommonjsModule(function (module, exports) {
-var isTag = exports.isTag = domelementtype.isTag;
-
-exports.testElement = function(options, element){
-	for(var key in options){
-		if(!options.hasOwnProperty(key));
-		else if(key === "tag_name"){
-			if(!isTag(element) || !options.tag_name(element.name)){
-				return false;
-			}
-		} else if(key === "tag_type"){
-			if(!options.tag_type(element.type)) return false;
-		} else if(key === "tag_contains"){
-			if(isTag(element) || !options.tag_contains(element.data)){
-				return false;
-			}
-		} else if(!element.attribs || !options[key](element.attribs[key])){
-			return false;
-		}
-	}
-	return true;
-};
-
-var Checks = {
-	tag_name: function(name){
-		if(typeof name === "function"){
-			return function(elem){ return isTag(elem) && name(elem.name); };
-		} else if(name === "*"){
-			return isTag;
-		} else {
-			return function(elem){ return isTag(elem) && elem.name === name; };
-		}
-	},
-	tag_type: function(type){
-		if(typeof type === "function"){
-			return function(elem){ return type(elem.type); };
-		} else {
-			return function(elem){ return elem.type === type; };
-		}
-	},
-	tag_contains: function(data){
-		if(typeof data === "function"){
-			return function(elem){ return !isTag(elem) && data(elem.data); };
-		} else {
-			return function(elem){ return !isTag(elem) && elem.data === data; };
-		}
-	}
-};
-
-function getAttribCheck(attrib, value){
-	if(typeof value === "function"){
-		return function(elem){ return elem.attribs && value(elem.attribs[attrib]); };
-	} else {
-		return function(elem){ return elem.attribs && elem.attribs[attrib] === value; };
-	}
-}
-
-function combineFuncs(a, b){
-	return function(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-exports.getElements = function(options, element, recurse, limit){
-	var funcs = Object.keys(options).map(function(key){
-		var value = options[key];
-		return key in Checks ? Checks[key](value) : getAttribCheck(key, value);
-	});
-
-	return funcs.length === 0 ? [] : this.filter(
-		funcs.reduce(combineFuncs),
-		element, recurse, limit
-	);
-};
-
-exports.getElementById = function(id, element, recurse){
-	if(!Array.isArray(element)) element = [element];
-	return this.findOne(getAttribCheck("id", id), element, recurse !== false);
-};
-
-exports.getElementsByTagName = function(name, element, recurse, limit){
-	return this.filter(Checks.tag_name(name), element, recurse, limit);
-};
-
-exports.getElementsByTagType = function(type, element, recurse, limit){
-	return this.filter(Checks.tag_type(type), element, recurse, limit);
-};
-});
-
-var helpers = createCommonjsModule(function (module, exports) {
-// removeSubsets
-// Given an array of nodes, remove any member that is contained by another.
-exports.removeSubsets = function(nodes) {
-	var idx = nodes.length, node, ancestor, replace;
-
-	// Check if each node (or one of its ancestors) is already contained in the
-	// array.
-	while (--idx > -1) {
-		node = ancestor = nodes[idx];
-
-		// Temporarily remove the node under consideration
-		nodes[idx] = null;
-		replace = true;
-
-		while (ancestor) {
-			if (nodes.indexOf(ancestor) > -1) {
-				replace = false;
-				nodes.splice(idx, 1);
-				break;
-			}
-			ancestor = ancestor.parent;
-		}
-
-		// If the node has been found to be unique, re-insert it.
-		if (replace) {
-			nodes[idx] = node;
-		}
-	}
-
-	return nodes;
-};
-
-// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition
-var POSITION = {
-	DISCONNECTED: 1,
-	PRECEDING: 2,
-	FOLLOWING: 4,
-	CONTAINS: 8,
-	CONTAINED_BY: 16
-};
-
-// Compare the position of one node against another node in any other document.
-// The return value is a bitmask with the following values:
-//
-// document order:
-// > There is an ordering, document order, defined on all the nodes in the
-// > document corresponding to the order in which the first character of the
-// > XML representation of each node occurs in the XML representation of the
-// > document after expansion of general entities. Thus, the document element
-// > node will be the first node. Element nodes occur before their children.
-// > Thus, document order orders element nodes in order of the occurrence of
-// > their start-tag in the XML (after expansion of entities). The attribute
-// > nodes of an element occur after the element and before its children. The
-// > relative order of attribute nodes is implementation-dependent./
-// Source:
-// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
-//
-// @argument {Node} nodaA The first node to use in the comparison
-// @argument {Node} nodeB The second node to use in the comparison
-//
-// @return {Number} A bitmask describing the input nodes' relative position.
-//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
-//         a description of these values.
-var comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {
-	var aParents = [];
-	var bParents = [];
-	var current, sharedParent, siblings, aSibling, bSibling, idx;
-
-	if (nodeA === nodeB) {
-		return 0;
-	}
-
-	current = nodeA;
-	while (current) {
-		aParents.unshift(current);
-		current = current.parent;
-	}
-	current = nodeB;
-	while (current) {
-		bParents.unshift(current);
-		current = current.parent;
-	}
-
-	idx = 0;
-	while (aParents[idx] === bParents[idx]) {
-		idx++;
-	}
-
-	if (idx === 0) {
-		return POSITION.DISCONNECTED;
-	}
-
-	sharedParent = aParents[idx - 1];
-	siblings = sharedParent.children;
-	aSibling = aParents[idx];
-	bSibling = bParents[idx];
-
-	if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
-		if (sharedParent === nodeB) {
-			return POSITION.FOLLOWING | POSITION.CONTAINED_BY;
-		}
-		return POSITION.FOLLOWING;
-	} else {
-		if (sharedParent === nodeA) {
-			return POSITION.PRECEDING | POSITION.CONTAINS;
-		}
-		return POSITION.PRECEDING;
-	}
-};
-
-// Sort an array of nodes based on their relative position in the document and
-// remove any duplicate nodes. If the array contains nodes that do not belong
-// to the same document, sort order is unspecified.
-//
-// @argument {Array} nodes Array of DOM nodes
-//
-// @returns {Array} collection of unique nodes, sorted in document order
-exports.uniqueSort = function(nodes) {
-	var idx = nodes.length, node, position;
-
-	nodes = nodes.slice();
-
-	while (--idx > -1) {
-		node = nodes[idx];
-		position = nodes.indexOf(node);
-		if (position > -1 && position < idx) {
-			nodes.splice(idx, 1);
-		}
-	}
-	nodes.sort(function(a, b) {
-		var relative = comparePos(a, b);
-		if (relative & POSITION.PRECEDING) {
-			return -1;
-		} else if (relative & POSITION.FOLLOWING) {
-			return 1;
-		}
-		return 0;
-	});
-
-	return nodes;
-};
-});
-
-var domutils = createCommonjsModule(function (module) {
-var DomUtils = module.exports;
-
-[
-	stringify,
-	traversal,
-	manipulation,
-	querying,
-	legacy$2,
-	helpers
-].forEach(function(ext){
-	Object.keys(ext).forEach(function(key){
-		DomUtils[key] = ext[key].bind(DomUtils);
-	});
-});
-});
-
-var parse_1 = parse;
-
-//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
-
-//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
-var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
-
-/*
-	parses a nth-check formula, returns an array of two numbers
-*/
-function parse(formula){
-	formula = formula.trim().toLowerCase();
-
-	if(formula === "even"){
-		return [2, 0];
-	} else if(formula === "odd"){
-		return [2, 1];
-	} else {
-		var parsed = formula.match(re_nthElement);
-
-		if(!parsed){
-			throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')");
-		}
-
-		var a;
-
-		if(parsed[1]){
-			a = parseInt(parsed[1], 10);
-			if(isNaN(a)){
-				if(parsed[1].charAt(0) === "-") a = -1;
-				else a = 1;
-			}
-		} else a = 0;
-
-		return [
-			a,
-			parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0
-		];
-	}
-}
-
-var boolbase = {
-	trueFunc: function trueFunc(){
-		return true;
-	},
-	falseFunc: function falseFunc(){
-		return false;
-	}
-};
-
-var compile_1 = compile;
-
-var trueFunc  = boolbase.trueFunc,
-    falseFunc = boolbase.falseFunc;
-
-/*
-	returns a function that checks if an elements index matches the given rule
-	highly optimized to return the fastest solution
-*/
-function compile(parsed){
-	var a = parsed[0],
-	    b = parsed[1] - 1;
-
-	//when b <= 0, a*n won't be possible for any matches when a < 0
-	//besides, the specification says that no element is matched when a and b are 0
-	if(b < 0 && a <= 0) return falseFunc;
-
-	//when a is in the range -1..1, it matches any element (so only b is checked)
-	if(a ===-1) return function(pos){ return pos <= b; };
-	if(a === 0) return function(pos){ return pos === b; };
-	//when b <= 0 and a === 1, they match any element
-	if(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };
-
-	//when a > 0, modulo can be used to check if there is a match
-	var bMod = b % a;
-	if(bMod < 0) bMod += a;
-
-	if(a > 1){
-		return function(pos){
-			return pos >= b && pos % a === bMod;
-		};
-	}
-
-	a *= -1; //make `a` positive
-
-	return function(pos){
-		return pos <= b && pos % a === bMod;
-	};
-}
-
-var nthCheck = function nthCheck(formula){
-	return compile_1(parse_1(formula));
-};
-
-var parse_1$1 = parse_1;
-var compile_1$1 = compile_1;
-nthCheck.parse = parse_1$1;
-nthCheck.compile = compile_1$1;
-
-var hasAttrib = domutils.hasAttrib,
-    getAttributeValue = domutils.getAttributeValue,
-    falseFunc$1 = boolbase.falseFunc;
-
-//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469
-var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
-
-/*
-	attribute selectors
-*/
-
-var attributeRules = {
-	__proto__: null,
-	equals: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function equalsIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function equals(elem){
-			return getAttributeValue(elem, name) === value && next(elem);
-		};
-	},
-	hyphen: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function hyphenIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null &&
-						(attr.length === len || attr.charAt(len) === "-") &&
-						attr.substr(0, len).toLowerCase() === value &&
-						next(elem);
-			};
-		}
-
-		return function hyphen(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null &&
-					attr.substr(0, len) === value &&
-					(attr.length === len || attr.charAt(len) === "-") &&
-					next(elem);
-		};
-	},
-	element: function(next, data){
-		var name = data.name,
-		    value = data.value;
-
-		if(/\s/.test(value)){
-			return falseFunc$1;
-		}
-
-		value = value.replace(reChars, "\\$&");
-
-		var pattern = "(?:^|\\s)" + value + "(?:$|\\s)",
-		    flags = data.ignoreCase ? "i" : "",
-		    regex = new RegExp(pattern, flags);
-
-		return function element(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && regex.test(attr) && next(elem);
-		};
-	},
-	exists: function(next, data){
-		var name = data.name;
-		return function exists(elem){
-			return hasAttrib(elem, name) && next(elem);
-		};
-	},
-	start: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-		
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function startIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function start(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(0, len) === value && next(elem);
-		};
-	},
-	end: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len   = -value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function endIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function end(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(len) === value && next(elem);
-		};
-	},
-	any: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			var regex = new RegExp(value.replace(reChars, "\\$&"), "i");
-
-			return function anyIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && regex.test(attr) && next(elem);
-			};
-		}
-
-		return function any(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.indexOf(value) >= 0 && next(elem);
-		};
-	},
-	not: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return function notEmpty(elem){
-				return !!getAttributeValue(elem, name) && next(elem);
-			};
-		} else if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function notIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() !== value && next(elem);
-			};
-		}
-
-		return function not(elem){
-			return getAttributeValue(elem, name) !== value && next(elem);
-		};
-	}
-};
-
-var attributes = {
-	compile: function(next, data, options){
-		if(options && options.strict && (
-			data.ignoreCase || data.action === "not"
-		)) throw SyntaxError("Unsupported attribute selector");
-		return attributeRules[data.action](next, data);
-	},
-	rules: attributeRules
-};
-
-/*
-	pseudo selectors
-
-	---
-
-	they are available in two forms:
-	* filters called when the selector
-	  is compiled and return a function
-	  that needs to return next()
-	* pseudos get called on execution
-	  they need to return a boolean
-*/
-
-var isTag$2       = domutils.isTag,
-    getText$1     = domutils.getText,
-    getParent   = domutils.getParent,
-    getChildren = domutils.getChildren,
-    getSiblings = domutils.getSiblings,
-    hasAttrib$1   = domutils.hasAttrib,
-    getName     = domutils.getName,
-    getAttribute= domutils.getAttributeValue,
-    checkAttrib = attributes.rules.equals,
-    trueFunc$1    = boolbase.trueFunc,
-    falseFunc$2   = boolbase.falseFunc;
-
-//helper methods
-function getFirstElement(elems){
-	for(var i = 0; elems && i < elems.length; i++){
-		if(isTag$2(elems[i])) return elems[i];
-	}
-}
-
-function getAttribFunc(name, value){
-	var data = {name: name, value: value};
-	return function attribFunc(next){
-		return checkAttrib(next, data);
-	};
-}
-
-function getChildFunc(next){
-	return function(elem){
-		return !!getParent(elem) && next(elem);
-	};
-}
-
-var filters = {
-	contains: function(next, text){
-		return function contains(elem){
-			return next(elem) && getText$1(elem).indexOf(text) >= 0;
-		};
-	},
-	icontains: function(next, text){
-		var itext = text.toLowerCase();
-		return function icontains(elem){
-			return next(elem) &&
-				getText$1(elem).toLowerCase().indexOf(itext) >= 0;
-		};
-	},
-
-	//location specific methods
-	"nth-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0, pos = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-
-    //TODO determine the actual root element
-    root: function(next){
-        return function(elem){
-            return !getParent(elem) && next(elem);
-        };
-    },
-
-    scope: function(next, rule, options, context){
-        if(!context || context.length === 0){
-            //equivalent to :root
-            return filters.root(next);
-        }
-
-        if(context.length === 1){
-            //NOTE: can't be unpacked, as :has uses this for side-effects
-            return function(elem){
-                return context[0] === elem && next(elem);
-            };
-        }
-
-        return function(elem){
-            return context.indexOf(elem) >= 0 && next(elem);
-        };
-    },
-
-	//jQuery extensions (others follow as pseudos)
-	checkbox: getAttribFunc("type", "checkbox"),
-	file: getAttribFunc("type", "file"),
-	password: getAttribFunc("type", "password"),
-	radio: getAttribFunc("type", "radio"),
-	reset: getAttribFunc("type", "reset"),
-	image: getAttribFunc("type", "image"),
-	submit: getAttribFunc("type", "submit")
-};
-
-//while filters are precompiled, pseudos get called when they are needed
-var pseudos = {
-	empty: function(elem){
-		return !getChildren(elem).some(function(elem){
-			return isTag$2(elem) || elem.type === "text";
-		});
-	},
-
-	"first-child": function(elem){
-		return getFirstElement(getSiblings(elem)) === elem;
-	},
-	"last-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length - 1; i >= 0; i--){
-			if(siblings[i] === elem) return true;
-			if(isTag$2(siblings[i])) break;
-		}
-
-		return false;
-	},
-	"first-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"last-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length-1; i >= 0; i--){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"only-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0, j = siblings.length; i < j; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) continue;
-				if(getName(siblings[i]) === getName(elem)) return false;
-			}
-		}
-
-		return true;
-	},
-	"only-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i]) && siblings[i] !== elem) return false;
-		}
-
-		return true;
-	},
-
-	//:matches(a, area, link)[href]
-	link: function(elem){
-		return hasAttrib$1(elem, "href");
-	},
-	visited: falseFunc$2, //seems to be a valid implementation
-	//TODO: :any-link once the name is finalized (as an alias of :link)
-
-	//forms
-	//to consider: :target
-
-	//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)
-	selected: function(elem){
-		if(hasAttrib$1(elem, "selected")) return true;
-		else if(getName(elem) !== "option") return false;
-
-		//the first <option> in a <select> is also selected
-		var parent = getParent(elem);
-
-		if(
-			!parent ||
-			getName(parent) !== "select" ||
-			hasAttrib$1(parent, "multiple")
-		) return false;
-
-		var siblings = getChildren(parent),
-			sawElem  = false;
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem){
-					sawElem = true;
-				} else if(!sawElem){
-					return false;
-				} else if(hasAttrib$1(siblings[i], "selected")){
-					return false;
-				}
-			}
-		}
-
-		return sawElem;
-	},
-	//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
-	//:matches(
-	//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],
-	//  optgroup[disabled] > option),
-	// fieldset[disabled] * //TODO not child of first <legend>
-	//)
-	disabled: function(elem){
-		return hasAttrib$1(elem, "disabled");
-	},
-	enabled: function(elem){
-		return !hasAttrib$1(elem, "disabled");
-	},
-	//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)
-	checked: function(elem){
-		return hasAttrib$1(elem, "checked") || pseudos.selected(elem);
-	},
-	//:matches(input, select, textarea)[required]
-	required: function(elem){
-		return hasAttrib$1(elem, "required");
-	},
-	//:matches(input, select, textarea):not([required])
-	optional: function(elem){
-		return !hasAttrib$1(elem, "required");
-	},
-
-	//jQuery extensions
-
-	//:not(:empty)
-	parent: function(elem){
-		return !pseudos.empty(elem);
-	},
-	//:matches(h1, h2, h3, h4, h5, h6)
-	header: function(elem){
-		var name = getName(elem);
-		return name === "h1" ||
-		       name === "h2" ||
-		       name === "h3" ||
-		       name === "h4" ||
-		       name === "h5" ||
-		       name === "h6";
-	},
-
-	//:matches(button, input[type=button])
-	button: function(elem){
-		var name = getName(elem);
-		return name === "button" ||
-		       name === "input" &&
-		       getAttribute(elem, "type") === "button";
-	},
-	//:matches(input, textarea, select, button)
-	input: function(elem){
-		var name = getName(elem);
-		return name === "input" ||
-		       name === "textarea" ||
-		       name === "select" ||
-		       name === "button";
-	},
-	//input:matches(:not([type!='']), [type='text' i])
-	text: function(elem){
-		var attr;
-		return getName(elem) === "input" && (
-			!(attr = getAttribute(elem, "type")) ||
-			attr.toLowerCase() === "text"
-		);
-	}
-};
-
-function verifyArgs(func, name, subselect){
-	if(subselect === null){
-		if(func.length > 1 && name !== "scope"){
-			throw new SyntaxError("pseudo-selector :" + name + " requires an argument");
-		}
-	} else {
-		if(func.length === 1){
-			throw new SyntaxError("pseudo-selector :" + name + " doesn't have any arguments");
-		}
-	}
-}
-
-//FIXME this feels hacky
-var re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;
-
-var pseudos_1 = {
-	compile: function(next, data, options, context){
-		var name = data.name,
-			subselect = data.data;
-
-		if(options && options.strict && !re_CSS3.test(name)){
-			throw SyntaxError(":" + name + " isn't part of CSS3");
-		}
-
-		if(typeof filters[name] === "function"){
-			verifyArgs(filters[name], name,  subselect);
-			return filters[name](next, subselect, options, context);
-		} else if(typeof pseudos[name] === "function"){
-			var func = pseudos[name];
-			verifyArgs(func, name, subselect);
-
-			if(next === trueFunc$1) return func;
-
-			return function pseudoArgs(elem){
-				return func(elem, subselect) && next(elem);
-			};
-		} else {
-			throw new SyntaxError("unmatched pseudo-class :" + name);
-		}
-	},
-	filters: filters,
-	pseudos: pseudos
-};
-
-var cssWhat = parse$1;
-
-var re_name = /^(?:\\.|[\w\-\u00b0-\uFFFF])+/,
-    re_escape = /\\([\da-f]{1,6}\s?|(\s)|.)/ig,
-    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
-    re_attr = /^\s*((?:\\.|[\w\u00b0-\uFFFF\-])+)\s*(?:(\S?)=\s*(?:(['"])([^]*?)\3|(#?(?:\\.|[\w\u00b0-\uFFFF\-])*)|)|)\s*(i)?\]/;
-
-var actionTypes = {
-	__proto__: null,
-	"undefined": "exists",
-	"":  "equals",
-	"~": "element",
-	"^": "start",
-	"$": "end",
-	"*": "any",
-	"!": "not",
-	"|": "hyphen"
-};
-
-var simpleSelectors = {
-	__proto__: null,
-	">": "child",
-	"<": "parent",
-	"~": "sibling",
-	"+": "adjacent"
-};
-
-var attribSelectors = {
-	__proto__: null,
-	"#": ["id", "equals"],
-	".": ["class", "element"]
-};
-
-//pseudos, whose data-property is parsed as well
-var unpackPseudos = {
-	__proto__: null,
-	"has": true,
-	"not": true,
-	"matches": true
-};
-
-var stripQuotesFromPseudos = {
-	__proto__: null,
-	"contains": true,
-	"icontains": true
-};
-
-var quotes = {
-	__proto__: null,
-	"\"": true,
-	"'": true
-};
-
-//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
-function funescape( _, escaped, escapedWhitespace ) {
-	var high = "0x" + escaped - 0x10000;
-	// NaN means non-codepoint
-	// Support: Firefox
-	// Workaround erroneous numeric interpretation of +"0x"
-	return high !== high || escapedWhitespace ?
-		escaped :
-		// BMP codepoint
-		high < 0 ?
-			String.fromCharCode( high + 0x10000 ) :
-			// Supplemental Plane codepoint (surrogate pair)
-			String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-}
-
-function unescapeCSS(str){
-	return str.replace(re_escape, funescape);
-}
-
-function isWhitespace(c){
-	return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
-}
-
-function parse$1(selector, options){
-	var subselects = [];
-
-	selector = parseSelector(subselects, selector + "", options);
-
-	if(selector !== ""){
-		throw new SyntaxError("Unmatched selector: " + selector);
-	}
-
-	return subselects;
-}
-
-function parseSelector(subselects, selector, options){
-	var tokens = [],
-		sawWS = false,
-		data, firstChar, name, quot;
-
-	function getName(){
-		var sub = selector.match(re_name)[0];
-		selector = selector.substr(sub.length);
-		return unescapeCSS(sub);
-	}
-
-	function stripWhitespace(start){
-		while(isWhitespace(selector.charAt(start))) start++;
-		selector = selector.substr(start);
-	}
-
-	function isEscaped(pos) {
-		var slashCount = 0;
-
-		while (selector.charAt(--pos) === "\\") slashCount++;
-		return (slashCount & 1) === 1;
-	}
-
-	stripWhitespace(0);
-
-	while(selector !== ""){
-		firstChar = selector.charAt(0);
-
-		if(isWhitespace(firstChar)){
-			sawWS = true;
-			stripWhitespace(1);
-		} else if(firstChar in simpleSelectors){
-			tokens.push({type: simpleSelectors[firstChar]});
-			sawWS = false;
-
-			stripWhitespace(1);
-		} else if(firstChar === ","){
-			if(tokens.length === 0){
-				throw new SyntaxError("empty sub-selector");
-			}
-			subselects.push(tokens);
-			tokens = [];
-			sawWS = false;
-			stripWhitespace(1);
-		} else {
-			if(sawWS){
-				if(tokens.length > 0){
-					tokens.push({type: "descendant"});
-				}
-				sawWS = false;
-			}
-
-			if(firstChar === "*"){
-				selector = selector.substr(1);
-				tokens.push({type: "universal"});
-			} else if(firstChar in attribSelectors){
-				selector = selector.substr(1);
-				tokens.push({
-					type: "attribute",
-					name: attribSelectors[firstChar][0],
-					action: attribSelectors[firstChar][1],
-					value: getName(),
-					ignoreCase: false
-				});
-			} else if(firstChar === "["){
-				selector = selector.substr(1);
-				data = selector.match(re_attr);
-				if(!data){
-					throw new SyntaxError("Malformed attribute selector: " + selector);
-				}
-				selector = selector.substr(data[0].length);
-				name = unescapeCSS(data[1]);
-
-				if(
-					!options || (
-						"lowerCaseAttributeNames" in options ?
-							options.lowerCaseAttributeNames :
-							!options.xmlMode
-					)
-				){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({
-					type: "attribute",
-					name: name,
-					action: actionTypes[data[2]],
-					value: unescapeCSS(data[4] || data[5] || ""),
-					ignoreCase: !!data[6]
-				});
-
-			} else if(firstChar === ":"){
-				if(selector.charAt(1) === ":"){
-					selector = selector.substr(2);
-					tokens.push({type: "pseudo-element", name: getName().toLowerCase()});
-					continue;
-				}
-
-				selector = selector.substr(1);
-
-				name = getName().toLowerCase();
-				data = null;
-
-				if(selector.charAt(0) === "("){
-					if(name in unpackPseudos){
-						quot = selector.charAt(1);
-						var quoted = quot in quotes;
-
-						selector = selector.substr(quoted + 1);
-
-						data = [];
-						selector = parseSelector(data, selector, options);
-
-						if(quoted){
-							if(selector.charAt(0) !== quot){
-								throw new SyntaxError("unmatched quotes in :" + name);
-							} else {
-								selector = selector.substr(1);
-							}
-						}
-
-						if(selector.charAt(0) !== ")"){
-							throw new SyntaxError("missing closing parenthesis in :" + name + " " + selector);
-						}
-
-						selector = selector.substr(1);
-					} else {
-						var pos = 1, counter = 1;
-
-						for(; counter > 0 && pos < selector.length; pos++){
-							if(selector.charAt(pos) === "(" && !isEscaped(pos)) counter++;
-							else if(selector.charAt(pos) === ")" && !isEscaped(pos)) counter--;
-						}
-
-						if(counter){
-							throw new SyntaxError("parenthesis not matched");
-						}
-
-						data = selector.substr(1, pos - 2);
-						selector = selector.substr(pos);
-
-						if(name in stripQuotesFromPseudos){
-							quot = data.charAt(0);
-
-							if(quot === data.slice(-1) && quot in quotes){
-								data = data.slice(1, -1);
-							}
-
-							data = unescapeCSS(data);
-						}
-					}
-				}
-
-				tokens.push({type: "pseudo", name: name, data: data});
-			} else if(re_name.test(selector)){
-				name = getName();
-
-				if(!options || ("lowerCaseTags" in options ? options.lowerCaseTags : !options.xmlMode)){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({type: "tag", name: name});
-			} else {
-				if(tokens.length && tokens[tokens.length - 1].type === "descendant"){
-					tokens.pop();
-				}
-				addToken(subselects, tokens);
-				return selector;
-			}
-		}
-	}
-
-	addToken(subselects, tokens);
-
-	return selector;
-}
-
-function addToken(subselects, tokens){
-	if(subselects.length > 0 && tokens.length === 0){
-		throw new SyntaxError("empty sub-selector");
-	}
-
-	subselects.push(tokens);
-}
-
-var isTag$3       = domutils.isTag,
-    getParent$1   = domutils.getParent,
-    getChildren$1 = domutils.getChildren,
-    getSiblings$1 = domutils.getSiblings,
-    getName$1     = domutils.getName;
-
-/*
-	all available rules
-*/
-var general = {
-	__proto__: null,
-
-	attribute: attributes.compile,
-	pseudo: pseudos_1.compile,
-
-	//tags
-	tag: function(next, data){
-		var name = data.name;
-		return function tag(elem){
-			return getName$1(elem) === name && next(elem);
-		};
-	},
-
-	//traversal
-	descendant: function(next, rule, options, context, acceptSelf){
-		return function descendant(elem){
-
-			if (acceptSelf && next(elem)) return true;
-
-			var found = false;
-
-			while(!found && (elem = getParent$1(elem))){
-				found = next(elem);
-			}
-
-			return found;
-		};
-	},
-	parent: function(next, data, options){
-		if(options && options.strict) throw SyntaxError("Parent selector isn't part of CSS3");
-
-		return function parent(elem){
-			return getChildren$1(elem).some(test);
-		};
-
-		function test(elem){
-			return isTag$3(elem) && next(elem);
-		}
-	},
-	child: function(next){
-		return function child(elem){
-			var parent = getParent$1(elem);
-			return !!parent && next(parent);
-		};
-	},
-	sibling: function(next){
-		return function sibling(elem){
-			var siblings = getSiblings$1(elem);
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(next(siblings[i])) return true;
-				}
-			}
-
-			return false;
-		};
-	},
-	adjacent: function(next){
-		return function adjacent(elem){
-			var siblings = getSiblings$1(elem),
-			    lastElement;
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					lastElement = siblings[i];
-				}
-			}
-
-			return !!lastElement && next(lastElement);
-		};
-	},
-	universal: function(next){
-		return next;
-	}
-};
-
-var universal = 50;
-var tag = 30;
-var attribute = 1;
-var pseudo = 0;
-var descendant = -1;
-var child = -1;
-var parent = -1;
-var sibling = -1;
-var adjacent = -1;
-var procedure = {
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent
-};
-
-var procedure$1 = {
-	__proto__: null,
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent,
-	'default': procedure
-};
-
-var procedure$2 = getCjsExportFromNamespace(procedure$1);
-
-var sort = sortByProcedure;
-
-/*
-	sort the parts of the passed selector,
-	as there is potential for optimization
-	(some types of selectors are faster than others)
-*/
-
-
-
-var attributes$1 = {
-	__proto__: null,
-	exists: 10,
-	equals: 8,
-	not: 7,
-	start: 6,
-	end: 6,
-	any: 5,
-	hyphen: 4,
-	element: 4
-};
-
-function sortByProcedure(arr){
-	var procs = arr.map(getProcedure);
-	for(var i = 1; i < arr.length; i++){
-		var procNew = procs[i];
-
-		if(procNew < 0) continue;
-
-		for(var j = i - 1; j >= 0 && procNew < procs[j]; j--){
-			var token = arr[j + 1];
-			arr[j + 1] = arr[j];
-			arr[j] = token;
-			procs[j + 1] = procs[j];
-			procs[j] = procNew;
-		}
-	}
-}
-
-function getProcedure(token){
-	var proc = procedure$2[token.type];
-
-	if(proc === procedure$2.attribute){
-		proc = attributes$1[token.action];
-
-		if(proc === attributes$1.equals && token.name === "id"){
-			//prefer ID selectors (eg. #ID)
-			proc = 9;
-		}
-
-		if(token.ignoreCase){
-			//ignoreCase adds some overhead, prefer "normal" token
-			//this is a binary operation, to ensure it's still an int
-			proc >>= 1;
-		}
-	} else if(proc === procedure$2.pseudo){
-		if(!token.data){
-			proc = 3;
-		} else if(token.name === "has" || token.name === "contains"){
-			proc = 0; //expensive in any case
-		} else if(token.name === "matches" || token.name === "not"){
-			proc = 0;
-			for(var i = 0; i < token.data.length; i++){
-				//TODO better handling of complex selectors
-				if(token.data[i].length !== 1) continue;
-				var cur = getProcedure(token.data[i][0]);
-				//avoid executing :has or :contains
-				if(cur === 0){
-					proc = 0;
-					break;
-				}
-				if(cur > proc) proc = cur;
-			}
-			if(token.data.length > 1 && proc > 0) proc -= 1;
-		} else {
-			proc = 1;
-		}
-	}
-	return proc;
-}
-
-/*
-	compiles a selector to an executable function
-*/
-
-var compile_1$2 = compile$1;
-var compileUnsafe_1 = compileUnsafe;
-var compileToken_1 = compileToken;
-
-var isTag$4       = domutils.isTag,
-    trueFunc$2    = boolbase.trueFunc,
-    falseFunc$3   = boolbase.falseFunc;
-
-function compile$1(selector, options, context){
-	var next = compileUnsafe(selector, options, context);
-	return wrap(next);
-}
-
-function wrap(next){
-	return function base(elem){
-		return isTag$4(elem) && next(elem);
-	};
-}
-
-function compileUnsafe(selector, options, context){
-	var token = cssWhat(selector, options);
-	return compileToken(token, options, context);
-}
-
-function includesScopePseudo(t){
-    return t.type === "pseudo" && (
-        t.name === "scope" || (
-            Array.isArray(t.data) &&
-            t.data.some(function(data){
-                return data.some(includesScopePseudo);
-            })
-        )
-    );
-}
-
-var DESCENDANT_TOKEN = {type: "descendant"},
-    SCOPE_TOKEN = {type: "pseudo", name: "scope"},
-    PLACEHOLDER_ELEMENT = {},
-    getParent$2 = domutils.getParent;
-
-//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
-//http://www.w3.org/TR/selectors4/#absolutizing
-function absolutize(token, context){
-    //TODO better check if context is document
-    var hasContext = !!context && !!context.length && context.every(function(e){
-        return e === PLACEHOLDER_ELEMENT || !!getParent$2(e);
-    });
-
-
-    token.forEach(function(t){
-        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant"); else if(hasContext && !includesScopePseudo(t)){
-            t.unshift(DESCENDANT_TOKEN);
-        } else {
-            return;
-        }
-
-        t.unshift(SCOPE_TOKEN);
-    });
-}
-
-function compileToken(token, options, context){
-    token = token.filter(function(t){ return t.length > 0; });
-
-	token.forEach(sort);
-
-	var isArrayContext = Array.isArray(context);
-
-    context = (options && options.context) || context;
-
-    if(context && !isArrayContext) context = [context];
-
-    absolutize(token, context);
-
-	return token
-		.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })
-		.reduce(reduceRules, falseFunc$3);
-}
-
-function isTraversal(t){
-	return procedure$2[t.type] < 0;
-}
-
-function compileRules(rules, options, context, isArrayContext){
-	var acceptSelf = (isArrayContext && rules[0].name === "scope" && rules[1].type === "descendant");
-	return rules.reduce(function(func, rule, index){
-		if(func === falseFunc$3) return func;
-		return general[rule.type](func, rule, options, context, acceptSelf && index === 1);
-	}, options && options.rootFunc || trueFunc$2);
-}
-
-function reduceRules(a, b){
-	if(b === falseFunc$3 || a === trueFunc$2){
-		return a;
-	}
-	if(a === falseFunc$3 || b === trueFunc$2){
-		return b;
-	}
-
-	return function combine(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-//:not, :has and :matches have to compile selectors
-//doing this in lib/pseudos.js would lead to circular dependencies,
-//so we add them here
-
-var filters$1     = pseudos_1.filters,
-    existsOne$1   = domutils.existsOne,
-    isTag$4       = domutils.isTag,
-    getChildren$2 = domutils.getChildren;
-
-
-function containsTraversal(t){
-	return t.some(isTraversal);
-}
-
-filters$1.not = function(next, token, options, context){
-	var opts = {
-	    	xmlMode: !!(options && options.xmlMode),
-	    	strict: !!(options && options.strict)
-	    };
-
-	if(opts.strict){
-		if(token.length > 1 || token.some(containsTraversal)){
-			throw new SyntaxError("complex selectors in :not aren't allowed in strict mode");
-		}
-	}
-
-    var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return next;
-	if(func === trueFunc$2)  return falseFunc$3;
-
-	return function(elem){
-		return !func(elem) && next(elem);
-	};
-};
-
-filters$1.has = function(next, token, options){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict)
-	};
-
-    //FIXME: Uses an array as a pointer to the current element (side effects)
-    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;
-
-	var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return falseFunc$3;
-	if(func === trueFunc$2)  return function(elem){
-			return getChildren$2(elem).some(isTag$4) && next(elem);
-		};
-
-	func = wrap(func);
-
-    if(context){
-        return function has(elem){
-		return next(elem) && (
-                (context[0] = elem), existsOne$1(func, getChildren$2(elem))
-            );
-	};
-    }
-
-    return function has(elem){
-		return next(elem) && existsOne$1(func, getChildren$2(elem));
-	};
-};
-
-filters$1.matches = function(next, token, options, context){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict),
-		rootFunc: next
-	};
-
-	return compileToken(token, opts, context);
-};
-compile_1$2.compileUnsafe = compileUnsafe_1;
-compile_1$2.compileToken = compileToken_1;
-
-var cssSelect = CSSselect;
-
-var findOne$1       = domutils.findOne,
-    findAll$1       = domutils.findAll,
-    getChildren$3   = domutils.getChildren,
-    removeSubsets = domutils.removeSubsets,
-    falseFunc$4     = boolbase.falseFunc,
-    compileUnsafe$1 = compile_1$2.compileUnsafe,
-    compileToken$1  = compile_1$2.compileToken;
-
-function getSelectorFunc(searchFunc){
-	return function select(query, elems, options){
-        if(typeof query !== "function") query = compileUnsafe$1(query, options, elems);
-        if(!Array.isArray(elems)) elems = getChildren$3(elems);
-		else elems = removeSubsets(elems);
-		return searchFunc(query, elems);
-	};
-}
-
-var selectAll = getSelectorFunc(function selectAll(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? [] : findAll$1(query, elems);
-});
-
-var selectOne = getSelectorFunc(function selectOne(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? null : findOne$1(query, elems);
-});
-
-function is(elem, query, options){
-	return (typeof query === "function" ? query : compile_1$2(query, options))(elem);
-}
-
-/*
-	the exported interface
-*/
-function CSSselect(query, elems, options){
-	return selectAll(query, elems, options);
-}
-
-CSSselect.compile = compile_1$2;
-CSSselect.filters = pseudos_1.filters;
-CSSselect.pseudos = pseudos_1.pseudos;
-
-CSSselect.selectAll = selectAll;
-CSSselect.selectOne = selectOne;
-
-CSSselect.is = is;
-
-//legacy methods (might be removed)
-CSSselect.parse = compile_1$2;
-CSSselect.iterate = selectAll;
-
-//hooks
-CSSselect._compileUnsafe = compileUnsafe$1;
-CSSselect._compileToken = compileToken$1;
 
 /**
@@ -9235,6 +25,4 @@
  */
 
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
 const PARSE5_OPTS = {
   treeAdapter
@@ -9247,5 +35,7 @@
 
 function createDocument(html) {
-  const document = parse5.parse(html, PARSE5_OPTS);
+  const document =
+  /** @type {HTMLDocument} */
+  parse5.parse(html, PARSE5_OPTS);
   defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
 
@@ -9260,5 +50,5 @@
 /**
  * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
+ * @param {HTMLDocument} document   A Document, such as one created via `createDocument()`
  */
 
@@ -9266,10 +56,13 @@
   return parse5.serialize(document, PARSE5_OPTS);
 }
+/** @typedef {treeAdapter.Document & typeof ElementExtensions} HTMLDocument */
+
 /**
  * Methods and descriptors to mix into Element.prototype
+ * @private
  */
 
 const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
+  /** @extends treeAdapter.Element.prototype */
   nodeName: {
     get() {
@@ -9302,5 +95,5 @@
   textContent: {
     get() {
-      return getText$2(this);
+      return getText(this);
     },
 
@@ -9347,5 +140,5 @@
 
 const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
+  /** @extends treeAdapter.Document.prototype */
   // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
   // TODO: verify if these are needed for css-select
@@ -9418,5 +211,5 @@
     }
 
-    return cssSelect(sel, this.documentElement);
+    return cssSelect.selectAll(sel, this.documentElement);
   }
 
@@ -9460,7 +253,7 @@
 
 
-function getText$2(node) {
-  if (Array.isArray(node)) return node.map(getText$2).join('');
-  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText$2(node.children);
+function getText(node) {
+  if (Array.isArray(node)) return node.map(getText).join('');
+  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText(node.children);
   if (treeAdapter.isTextNode(node)) return node.data;
   return '';
@@ -9484,6 +277,6 @@
 /**
  * Parse a textual CSS Stylesheet into a Stylesheet instance.
- * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
- * @see https://github.com/reworkcss/css
+ * Stylesheet is a mutable postcss AST with format similar to CSSOM.
+ * @see https://github.com/postcss/postcss/
  * @private
  * @param {String} stylesheet
@@ -9492,16 +285,50 @@
 
 function parseStylesheet(stylesheet) {
-  return css.parse(stylesheet);
-}
-/**
- * Serialize a ReworkCSS Stylesheet to a String of CSS.
+  return postcss.parse(stylesheet);
+}
+/**
+ * Serialize a postcss Stylesheet to a String of CSS.
  * @private
  * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
- * @param {Object} options              Options to pass to `css.stringify()`
+ * @param {Object} options              Options used by the stringify logic
  * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
  */
 
 function serializeStylesheet(ast, options) {
-  return css.stringify(ast, options);
+  let cssStr = '';
+  postcss.stringify(ast, (result, node, type) => {
+    var _node$raws;
+
+    if (!options.compress) {
+      cssStr += result;
+      return;
+    } // Simple minification logic
+
+
+    if ((node == null ? void 0 : node.type) === 'comment') return;
+
+    if ((node == null ? void 0 : node.type) === 'decl') {
+      const prefix = node.prop + node.raws.between;
+      cssStr += result.replace(prefix, prefix.trim());
+      return;
+    }
+
+    if (type === 'start') {
+      if (node.type === 'rule' && node.selectors) {
+        cssStr += node.selectors.join(',') + '{';
+      } else {
+        cssStr += result.replace(/\s\{$/, '{');
+      }
+
+      return;
+    }
+
+    if (type === 'end' && result === '}' && node != null && (_node$raws = node.raws) != null && _node$raws.semicolon) {
+      cssStr = cssStr.slice(0, -1);
+    }
+
+    cssStr += result.trim();
+  });
+  return cssStr;
 }
 /**
@@ -9534,5 +361,5 @@
  * @private
  * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
-*/
+ */
 
 function applyMarkedSelectors(rule) {
@@ -9553,7 +380,6 @@
 
 function walkStyleRules(node, iterator) {
-  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-  node.rules = node.rules.filter(rule => {
-    if (rule.rules) {
+  node.nodes = node.nodes.filter(rule => {
+    if (hasNestedRules(rule)) {
       walkStyleRules(rule, iterator);
     }
@@ -9574,9 +400,8 @@
 function walkStyleRulesWithReverseMirror(node, node2, iterator) {
   if (node2 === null) return walkStyleRules(node, iterator);
-  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
-  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
+  [node.nodes, node2.nodes] = splitFilter(node.nodes, node2.nodes, (rule, index, rules, rules2) => {
     const rule2 = rules2[index];
 
-    if (rule.rules) {
+    if (hasNestedRules(rule)) {
       walkStyleRulesWithReverseMirror(rule, rule2, iterator);
     }
@@ -9586,6 +411,12 @@
     return iterator(rule) !== false;
   });
+} // Checks if a node has nested rules, like @media
+// @keyframes are an exception since they are evaluated as a whole
+
+function hasNestedRules(rule) {
+  return rule.nodes && rule.nodes.length && rule.nodes.some(n => n.type === 'rule' || n.type === 'atrule') && rule.name !== 'keyframes';
 } // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
 // This is just a quicker version of generating the compliment of the set returned from a filter operation.
+
 
 function splitFilter(a, b, predicate) {
@@ -9670,4 +501,5 @@
 /**
  * The mechanism to use for lazy-loading stylesheets.
+ *
  * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
  *
@@ -9750,18 +582,4 @@
  */
 
-function _catch(body, recover) {
-  try {
-    var result = body();
-  } catch (e) {
-    return recover(e);
-  }
-
-  if (result && result.then) {
-    return result.then(void 0, recover);
-  }
-
-  return result;
-}
-
 class Critters {
   /** @private */
@@ -9807,53 +625,32 @@
 
 
-  process(html) {
-    try {
-      const _this = this;
-
-      function _temp4() {
-        // go through all the style tags in the document and reduce them to only critical CSS
-        const styles = _this.getAffectedStyleTags(document);
-
-        return Promise.resolve(Promise.all(styles.map(style => _this.processStyle(style, document)))).then(function () {
-          function _temp2() {
-            // serialize the document back to HTML and we're done
-            const output = serializeDocument(document);
-            const end = process.hrtime.bigint();
-
-            _this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
-
-            return output;
-          }
-
-          const _temp = function () {
-            if (_this.options.mergeStylesheets !== false && styles.length !== 0) {
-              return Promise.resolve(_this.mergeStylesheets(document)).then(function () {});
-            }
-          }();
-
-          return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
-        });
-      }
-
-      const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
-
-      const document = createDocument(html);
-
-      if (_this.options.additionalStylesheets.length > 0) {
-        _this.embedAdditionalStylesheet(document);
-      } // `external:false` skips processing of external sheets
-
-
-      const _temp3 = function () {
-        if (_this.options.external !== false) {
-          const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
-          return Promise.resolve(Promise.all(externalSheets.map(link => _this.embedLinkedStylesheet(link, document)))).then(function () {});
-        }
-      }();
-
-      return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
-    } catch (e) {
-      return Promise.reject(e);
-    }
+  async process(html) {
+    const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
+
+    const document = createDocument(html);
+
+    if (this.options.additionalStylesheets.length > 0) {
+      this.embedAdditionalStylesheet(document);
+    } // `external:false` skips processing of external sheets
+
+
+    if (this.options.external !== false) {
+      const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
+      await Promise.all(externalSheets.map(link => this.embedLinkedStylesheet(link, document)));
+    } // go through all the style tags in the document and reduce them to only critical CSS
+
+
+    const styles = this.getAffectedStyleTags(document);
+    await Promise.all(styles.map(style => this.processStyle(style, document)));
+
+    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
+      await this.mergeStylesheets(document);
+    } // serialize the document back to HTML and we're done
+
+
+    const output = serializeDocument(document);
+    const end = process.hrtime.bigint();
+    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
+    return output;
   }
   /**
@@ -9872,30 +669,22 @@
   }
 
-  mergeStylesheets(document) {
-    try {
-      const _this2 = this;
-
-      const styles = _this2.getAffectedStyleTags(document);
-
-      if (styles.length === 0) {
-        _this2.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
-
-        return Promise.resolve();
-      }
-
-      const first = styles[0];
-      let sheet = first.textContent;
-
-      for (let i = 1; i < styles.length; i++) {
-        const node = styles[i];
-        sheet += node.textContent;
-        node.remove();
-      }
-
-      first.textContent = sheet;
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
+  async mergeStylesheets(document) {
+    const styles = this.getAffectedStyleTags(document);
+
+    if (styles.length === 0) {
+      this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
+      return;
+    }
+
+    const first = styles[0];
+    let sheet = first.textContent;
+
+    for (let i = 1; i < styles.length; i++) {
+      const node = styles[i];
+      sheet += node.textContent;
+      node.remove();
+    }
+
+    first.textContent = sheet;
   }
   /**
@@ -9904,36 +693,31 @@
 
 
-  getCssAsset(href) {
+  async getCssAsset(href) {
+    const outputPath = this.options.path;
+    const publicPath = this.options.publicPath; // CHECK - the output path
+    // path on disk (with output.publicPath removed)
+
+    let normalizedPath = href.replace(/^\//, '');
+    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
+
+    if (normalizedPath.indexOf(pathPrefix) === 0) {
+      normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
+    } // Ignore remote stylesheets
+
+
+    if (/^https:\/\//.test(normalizedPath) || href.startsWith('//')) {
+      return undefined;
+    }
+
+    const filename = path.resolve(outputPath, normalizedPath);
+    let sheet;
+
     try {
-      const _this3 = this;
-
-      const outputPath = _this3.options.path;
-      const publicPath = _this3.options.publicPath; // CHECK - the output path
-      // path on disk (with output.publicPath removed)
-
-      let normalizedPath = href.replace(/^\//, '');
-      const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-      if (normalizedPath.indexOf(pathPrefix) === 0) {
-        normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
-      }
-
-      const filename = path.resolve(outputPath, normalizedPath);
-      let sheet;
-
-      const _temp5 = _catch(function () {
-        return Promise.resolve(_this3.readFile(filename)).then(function (_this3$readFile) {
-          sheet = _this3$readFile;
-        });
-      }, function () {
-        _this3.logger.warn(`Unable to locate stylesheet: ${filename}`);
-      });
-
-      return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {
-        return sheet;
-      }) : sheet);
+      sheet = await this.readFile(filename);
     } catch (e) {
-      return Promise.reject(e);
-    }
+      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
+    }
+
+    return sheet;
   }
 
@@ -9954,28 +738,21 @@
 
 
-  embedAdditionalStylesheet(document) {
-    try {
-      const _this4 = this;
-
-      const styleSheetsIncluded = [];
-      return Promise.resolve(Promise.all(_this4.options.additionalStylesheets.map(cssFile => {
-        if (styleSheetsIncluded.includes(cssFile)) {
-          return;
-        }
-
-        styleSheetsIncluded.push(cssFile);
-        const style = document.createElement('style');
-        style.$$external = true;
-        return _this4.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
-      }))).then(function (sources) {
-        sources.forEach(([sheet, style]) => {
-          if (!sheet) return;
-          style.textContent = sheet;
-          document.head.appendChild(style);
-        });
-      });
-    } catch (e) {
-      return Promise.reject(e);
-    }
+  async embedAdditionalStylesheet(document) {
+    const styleSheetsIncluded = [];
+    const sources = await Promise.all(this.options.additionalStylesheets.map(cssFile => {
+      if (styleSheetsIncluded.includes(cssFile)) {
+        return;
+      }
+
+      styleSheetsIncluded.push(cssFile);
+      const style = document.createElement('style');
+      style.$$external = true;
+      return this.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
+    }));
+    sources.forEach(([sheet, style]) => {
+      if (!sheet) return;
+      style.textContent = sheet;
+      document.head.appendChild(style);
+    });
   }
   /**
@@ -9984,99 +761,93 @@
 
 
-  embedLinkedStylesheet(link, document) {
-    try {
-      const _this5 = this;
-
-      const href = link.getAttribute('href');
-      const media = link.getAttribute('media');
-      const preloadMode = _this5.options.preload; // skip filtered resources, or network resources if no filter is provided
-
-      if (_this5.urlFilter ? _this5.urlFilter(href) : !(href || '').match(/\.css$/)) {
-        return Promise.resolve();
-      } // the reduced critical CSS gets injected into a new <style> tag
-
-
-      const style = document.createElement('style');
-      style.$$external = true;
-      return Promise.resolve(_this5.getCssAsset(href, style)).then(function (sheet) {
-        if (!sheet) {
-          return;
-        }
-
-        style.textContent = sheet;
-        style.$$name = href;
-        style.$$links = [link];
-        link.parentNode.insertBefore(style, link);
-
-        if (_this5.checkInlineThreshold(link, style, sheet)) {
-          return;
-        } // CSS loader is only injected for the first sheet, then this becomes an empty string
-
-
-        let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-        const lazy = preloadMode === 'js-lazy';
-
-        if (lazy) {
-          cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
-        } // Allow disabling any mutation of the stylesheet link:
-
-
-        if (preloadMode === false) return;
-        let noscriptFallback = false;
-
-        if (preloadMode === 'body') {
-          document.body.appendChild(link);
-        } else {
-          link.setAttribute('rel', 'preload');
-          link.setAttribute('as', 'style');
-
-          if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-            const script = document.createElement('script');
-            const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
-
-            script.textContent = js;
-            link.parentNode.insertBefore(script, link.nextSibling);
-            style.$$links.push(script);
-            cssLoaderPreamble = '';
-            noscriptFallback = true;
-          } else if (preloadMode === 'media') {
-            // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-            link.setAttribute('rel', 'stylesheet');
-            link.removeAttribute('as');
-            link.setAttribute('media', 'print');
-            link.setAttribute('onload', `this.media='${media || 'all'}'`);
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap-high') {
-            // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
-            link.setAttribute('rel', 'alternate stylesheet preload');
-            link.setAttribute('title', 'styles');
-            link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap') {
-            link.setAttribute('onload', "this.rel='stylesheet'");
-            noscriptFallback = true;
-          } else {
-            const bodyLink = document.createElement('link');
-            bodyLink.setAttribute('rel', 'stylesheet');
-            if (media) bodyLink.setAttribute('media', media);
-            bodyLink.setAttribute('href', href);
-            document.body.appendChild(bodyLink);
-            style.$$links.push(bodyLink);
-          }
-        }
-
-        if (_this5.options.noscriptFallback !== false && noscriptFallback) {
-          const noscript = document.createElement('noscript');
-          const noscriptLink = document.createElement('link');
-          noscriptLink.setAttribute('rel', 'stylesheet');
-          noscriptLink.setAttribute('href', href);
-          if (media) noscriptLink.setAttribute('media', media);
-          noscript.appendChild(noscriptLink);
-          link.parentNode.insertBefore(noscript, link.nextSibling);
-          style.$$links.push(noscript);
-        }
-      });
-    } catch (e) {
-      return Promise.reject(e);
+  async embedLinkedStylesheet(link, document) {
+    const href = link.getAttribute('href');
+    const media = link.getAttribute('media');
+    const preloadMode = this.options.preload; // skip filtered resources, or network resources if no filter is provided
+
+    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
+      return Promise.resolve();
+    } // the reduced critical CSS gets injected into a new <style> tag
+
+
+    const style = document.createElement('style');
+    style.$$external = true;
+    const sheet = await this.getCssAsset(href, style);
+
+    if (!sheet) {
+      return;
+    }
+
+    style.textContent = sheet;
+    style.$$name = href;
+    style.$$links = [link];
+    link.parentNode.insertBefore(style, link);
+
+    if (this.checkInlineThreshold(link, style, sheet)) {
+      return;
+    } // CSS loader is only injected for the first sheet, then this becomes an empty string
+
+
+    let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
+    const lazy = preloadMode === 'js-lazy';
+
+    if (lazy) {
+      cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
+    } // Allow disabling any mutation of the stylesheet link:
+
+
+    if (preloadMode === false) return;
+    let noscriptFallback = false;
+
+    if (preloadMode === 'body') {
+      document.body.appendChild(link);
+    } else {
+      link.setAttribute('rel', 'preload');
+      link.setAttribute('as', 'style');
+
+      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
+        const script = document.createElement('script');
+        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
+
+        script.textContent = js;
+        link.parentNode.insertBefore(script, link.nextSibling);
+        style.$$links.push(script);
+        cssLoaderPreamble = '';
+        noscriptFallback = true;
+      } else if (preloadMode === 'media') {
+        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
+        link.setAttribute('rel', 'stylesheet');
+        link.removeAttribute('as');
+        link.setAttribute('media', 'print');
+        link.setAttribute('onload', `this.media='${media || 'all'}'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap-high') {
+        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
+        link.setAttribute('rel', 'alternate stylesheet preload');
+        link.setAttribute('title', 'styles');
+        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap') {
+        link.setAttribute('onload', "this.rel='stylesheet'");
+        noscriptFallback = true;
+      } else {
+        const bodyLink = document.createElement('link');
+        bodyLink.setAttribute('rel', 'stylesheet');
+        if (media) bodyLink.setAttribute('media', media);
+        bodyLink.setAttribute('href', href);
+        document.body.appendChild(bodyLink);
+        style.$$links.push(bodyLink);
+      }
+    }
+
+    if (this.options.noscriptFallback !== false && noscriptFallback) {
+      const noscript = document.createElement('noscript');
+      const noscriptLink = document.createElement('link');
+      noscriptLink.setAttribute('rel', 'stylesheet');
+      noscriptLink.setAttribute('href', href);
+      if (media) noscriptLink.setAttribute('media', media);
+      noscript.appendChild(noscriptLink);
+      link.parentNode.insertBefore(noscript, link.nextSibling);
+      style.$$links.push(noscript);
     }
   }
@@ -10112,175 +883,166 @@
 
 
-  processStyle(style, document) {
-    try {
-      const _this6 = this;
-
-      if (style.$$reduce === false) return Promise.resolve();
-      const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-      const options = _this6.options; // const document = style.ownerDocument;
-
-      const head = document.querySelector('head');
-      let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-      if (keyframesMode === true) keyframesMode = 'all';
-      if (keyframesMode === false) keyframesMode = 'none';
-      let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
-
-      const before = sheet; // Skip empty stylesheets
-
-      if (!sheet) return Promise.resolve();
-      const ast = parseStylesheet(sheet);
-      const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-      let criticalFonts = '';
-      const failedSelectors = [];
-      const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-      // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-      walkStyleRules(ast, markOnly(rule => {
-        if (rule.type === 'rule') {
-          // Filter the selector list down to only those match
-          rule.filterSelectors(sel => {
-            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
-              return true;
-            }
-
-            sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
-            if (!sel) return false;
-
-            try {
-              return document.querySelector(sel) != null;
-            } catch (e) {
-              failedSelectors.push(sel + ' -> ' + e.message);
-              return false;
-            }
-          }); // If there are no matched selectors, remove the rule:
-
-          if (rule.selectors.length === 0) {
+  async processStyle(style, document) {
+    if (style.$$reduce === false) return;
+    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
+    const options = this.options; // const document = style.ownerDocument;
+
+    const head = document.querySelector('head');
+    let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
+
+    if (keyframesMode === true) keyframesMode = 'all';
+    if (keyframesMode === false) keyframesMode = 'none';
+    let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
+
+    const before = sheet; // Skip empty stylesheets
+
+    if (!sheet) return;
+    const ast = parseStylesheet(sheet);
+    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
+
+    let criticalFonts = '';
+    const failedSelectors = [];
+    const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
+    // This first pass is also used to collect font and keyframe usage used in the second pass.
+
+    walkStyleRules(ast, markOnly(rule => {
+      if (rule.type === 'rule') {
+        // Filter the selector list down to only those match
+        rule.filterSelectors(sel => {
+          // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
+          // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
+          if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
+            return true;
+          }
+
+          sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
+          if (!sel) return false;
+
+          try {
+            return document.querySelector(sel) != null;
+          } catch (e) {
+            failedSelectors.push(sel + ' -> ' + e.message);
             return false;
           }
-
-          if (rule.declarations) {
-            for (let i = 0; i < rule.declarations.length; i++) {
-              const decl = rule.declarations[i]; // detect used fonts
-
-              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-                criticalFonts += ' ' + decl.value;
-              } // detect used keyframes
-
-
-              if (decl.property === 'animation' || decl.property === 'animation-name') {
-                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                const names = decl.value.split(/\s+/);
-
-                for (let j = 0; j < names.length; j++) {
-                  const name = names[j].trim();
-                  if (name) criticalKeyframeNames.push(name);
-                }
+        }); // If there are no matched selectors, remove the rule:
+
+        if (!rule.selector) {
+          return false;
+        }
+
+        if (rule.nodes) {
+          for (let i = 0; i < rule.nodes.length; i++) {
+            const decl = rule.nodes[i]; // detect used fonts
+
+            if (decl.prop && decl.prop.match(/\bfont(-family)?\b/i)) {
+              criticalFonts += ' ' + decl.value;
+            } // detect used keyframes
+
+
+            if (decl.prop === 'animation' || decl.prop === 'animation-name') {
+              // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
+              const names = decl.value.split(/\s+/);
+
+              for (let j = 0; j < names.length; j++) {
+                const name = names[j].trim();
+                if (name) criticalKeyframeNames.push(name);
               }
             }
           }
-        } // keep font rules, they're handled in the second pass:
-
-
-        if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-        const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
-        return !rules || rules.length !== 0;
-      }));
-
-      if (failedSelectors.length !== 0) {
-        _this6.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
-      }
-
-      const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
-      const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
-      const preloadedFonts = []; // Second pass, using data picked up from the first
-
-      walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
-        // remove any rules marked in the first pass
-        if (rule.$$remove === true) return false;
-        applyMarkedSelectors(rule); // prune @keyframes rules
-
-        if (rule.type === 'keyframes') {
-          if (keyframesMode === 'none') return false;
-          if (keyframesMode === 'all') return true;
-          return criticalKeyframeNames.indexOf(rule.name) !== -1;
-        } // prune @font-face rules
-
-
-        if (rule.type === 'font-face') {
-          let family, src;
-
-          for (let i = 0; i < rule.declarations.length; i++) {
-            const decl = rule.declarations[i];
-
-            if (decl.property === 'src') {
-              // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-              src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-            } else if (decl.property === 'font-family') {
-              family = decl.value;
-            }
-          }
-
-          if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-            preloadedFonts.push(src);
-            const preload = document.createElement('link');
-            preload.setAttribute('rel', 'preload');
-            preload.setAttribute('as', 'font');
-            preload.setAttribute('crossorigin', 'anonymous');
-            preload.setAttribute('href', src.trim());
-            head.appendChild(preload);
-          } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-
-          if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
-            return false;
+        }
+      } // keep font rules, they're handled in the second pass:
+
+
+      if (rule.type === 'atrule' && rule.name === 'font-face') return; // If there are no remaining rules, remove the whole rule:
+
+      const rules = rule.nodes && rule.nodes.filter(rule => !rule.$$remove);
+      return !rules || rules.length !== 0;
+    }));
+
+    if (failedSelectors.length !== 0) {
+      this.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
+    }
+
+    const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
+    const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
+    const preloadedFonts = []; // Second pass, using data picked up from the first
+
+    walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
+      // remove any rules marked in the first pass
+      if (rule.$$remove === true) return false;
+      applyMarkedSelectors(rule); // prune @keyframes rules
+
+      if (rule.type === 'atrule' && rule.name === 'keyframes') {
+        if (keyframesMode === 'none') return false;
+        if (keyframesMode === 'all') return true;
+        return criticalKeyframeNames.indexOf(rule.params) !== -1;
+      } // prune @font-face rules
+
+
+      if (rule.type === 'atrule' && rule.name === 'font-face') {
+        let family, src;
+
+        for (let i = 0; i < rule.nodes.length; i++) {
+          const decl = rule.nodes[i];
+
+          if (decl.prop === 'src') {
+            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
+            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
+          } else if (decl.prop === 'font-family') {
+            family = decl.value;
           }
         }
+
+        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
+          preloadedFonts.push(src);
+          const preload = document.createElement('link');
+          preload.setAttribute('rel', 'preload');
+          preload.setAttribute('as', 'font');
+          preload.setAttribute('crossorigin', 'anonymous');
+          preload.setAttribute('href', src.trim());
+          head.appendChild(preload);
+        } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
+
+
+        if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
+          return false;
+        }
+      }
+    });
+    sheet = serializeStylesheet(ast, {
+      compress: this.options.compress !== false
+    }); // If all rules were removed, get rid of the style element entirely
+
+    if (sheet.trim().length === 0) {
+      if (style.parentNode) {
+        style.remove();
+      }
+
+      return;
+    }
+
+    let afterText = '';
+    let styleInlinedCompletely = false;
+
+    if (options.pruneSource) {
+      const sheetInverse = serializeStylesheet(astInverse, {
+        compress: this.options.compress !== false
       });
-      sheet = serializeStylesheet(ast, {
-        compress: _this6.options.compress !== false
-      }).trim(); // If all rules were removed, get rid of the style element entirely
-
-      if (sheet.trim().length === 0) {
-        if (style.parentNode) {
-          style.remove();
-        }
-
-        return Promise.resolve();
+      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
+
+      if (styleInlinedCompletely) {
+        const percent = sheetInverse.length / before.length * 100;
+        afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
       }
-
-      let afterText = '';
-      let styleInlinedCompletely = false;
-
-      if (options.pruneSource) {
-        const sheetInverse = serializeStylesheet(astInverse, {
-          compress: _this6.options.compress !== false
-        });
-        styleInlinedCompletely = _this6.pruneSource(style, before, sheetInverse);
-
-        if (styleInlinedCompletely) {
-          const percent = sheetInverse.length / before.length * 100;
-          afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
-        }
-      } // replace the inline stylesheet with its critical'd counterpart
-
-
-      if (!styleInlinedCompletely) {
-        style.textContent = sheet;
-      } // output stats
-
-
-      const percent = sheet.length / before.length * 100 | 0;
-
-      _this6.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
-
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
+    } // replace the inline stylesheet with its critical'd counterpart
+
+
+    if (!styleInlinedCompletely) {
+      style.textContent = sheet;
+    } // output stats
+
+
+    const percent = sheet.length / before.length * 100 | 0;
+    this.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
   }
 
@@ -10288,3 +1050,2 @@
 
 module.exports = Critters;
-//# sourceMappingURL=critters.js.map
Index: trip-planner-front/node_modules/critters/dist/critters.js.map
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.js.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"critters.js","sources":["../node_modules/domelementtype/index.js","../node_modules/dom-serializer/node_modules/domelementtype/lib/index.js","../node_modules/entities/lib/decode_codepoint.js","../node_modules/entities/lib/decode.js","../node_modules/entities/lib/encode.js","../node_modules/entities/lib/index.js","../node_modules/dom-serializer/index.js","../node_modules/css-select/node_modules/domutils/lib/stringify.js","../node_modules/css-select/node_modules/domutils/lib/traversal.js","../node_modules/css-select/node_modules/domutils/lib/manipulation.js","../node_modules/css-select/node_modules/domutils/lib/querying.js","../node_modules/css-select/node_modules/domutils/lib/legacy.js","../node_modules/css-select/node_modules/domutils/lib/helpers.js","../node_modules/css-select/node_modules/domutils/index.js","../node_modules/nth-check/parse.js","../node_modules/boolbase/index.js","../node_modules/nth-check/compile.js","../node_modules/nth-check/index.js","../node_modules/css-select/lib/attributes.js","../node_modules/css-select/lib/pseudos.js","../node_modules/css-what/index.js","../node_modules/css-select/lib/general.js","../node_modules/css-select/lib/sort.js","../node_modules/css-select/lib/compile.js","../node_modules/css-select/index.js","../src/dom.js","../src/css.js","../src/util.js","../src/index.js"],"sourcesContent":["//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\tDoctype: \"doctype\",\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === \"tag\" /* Tag */ ||\n        elem.type === \"script\" /* Script */ ||\n        elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    var output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var keys = Object.keys(map).join(\"|\");\n    var replace = getReplacer(map);\n    keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n    var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n    return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    //TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        return map[str.slice(1, -1)];\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escape = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nfunction singleCharReplacer(c) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return \"&#x\" + c.codePointAt(0).toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n    return data\n        .replace(reXmlChars, singleCharReplacer)\n        .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\n// Legacy aliases\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","/*\n  Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n   recognized by the HTML parser, see\n   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n  __proto__: null,\n  style: true,\n  script: true,\n  xmp: true,\n  iframe: true,\n  noembed: true,\n  noframes: true,\n  plaintext: true,\n  noscript: true\n};\n\n/*\n  Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n  if (!attributes) return;\n\n  var output = '';\n  var value;\n\n  // Loop through the attributes\n  for (var key in attributes) {\n    value = attributes[key];\n    if (output) {\n      output += ' ';\n    }\n\n    if (opts.xmlMode === 'foreign') {\n      /* fix up mixed-case attribute names */\n      key = foreignNames.attributeNames[key] || key;\n    }\n    output += key;\n    if ((value !== null && value !== '') || opts.xmlMode) {\n      output +=\n        '=\"' +\n        (opts.decodeEntities\n          ? entities.encodeXML(value)\n          : value.replace(/\\\"/g, '&quot;')) +\n        '\"';\n    }\n  }\n\n  return output;\n}\n\n/*\n  Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n  __proto__: null,\n  area: true,\n  base: true,\n  basefont: true,\n  br: true,\n  col: true,\n  command: true,\n  embed: true,\n  frame: true,\n  hr: true,\n  img: true,\n  input: true,\n  isindex: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n  opts = opts || {};\n\n  var output = '';\n\n  for (var i = 0; i < dom.length; i++) {\n    var elem = dom[i];\n\n    if (elem.type === 'root') output += render(elem.children, opts);\n    else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n    else if (elem.type === ElementType.Directive)\n      output += renderDirective(elem);\n    else if (elem.type === ElementType.Comment) output += renderComment(elem);\n    else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n    else output += renderText(elem, opts);\n  }\n\n  return output;\n});\n\nvar foreignModeIntegrationPoints = [\n  'mi',\n  'mo',\n  'mn',\n  'ms',\n  'mtext',\n  'annotation-xml',\n  'foreignObject',\n  'desc',\n  'title'\n];\n\nfunction renderTag(elem, opts) {\n  // Handle SVG / MathML in HTML\n  if (opts.xmlMode === 'foreign') {\n    /* fix up mixed-case element names */\n    elem.name = foreignNames.elementNames[elem.name] || elem.name;\n    /* exit foreign mode at integration points */\n    if (\n      elem.parent &&\n      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n    )\n      opts = Object.assign({}, opts, { xmlMode: false });\n  }\n  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n    opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n  }\n\n  var tag = '<' + elem.name;\n  var attribs = formatAttrs(elem.attribs, opts);\n\n  if (attribs) {\n    tag += ' ' + attribs;\n  }\n\n  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n    tag += '/>';\n  } else {\n    tag += '>';\n    if (elem.children) {\n      tag += render(elem.children, opts);\n    }\n\n    if (!singleTag[elem.name] || opts.xmlMode) {\n      tag += '</' + elem.name + '>';\n    }\n  }\n\n  return tag;\n}\n\nfunction renderDirective(elem) {\n  return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n  var data = elem.data || '';\n\n  // if entities weren't decoded, no need to encode them back\n  if (\n    opts.decodeEntities &&\n    !(elem.parent && elem.parent.name in unencodedElements)\n  ) {\n    data = entities.encodeXML(data);\n  }\n\n  return data;\n}\n\nfunction renderCdata(elem) {\n  return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n  return '<!--' + elem.data + '-->';\n}\n","var ElementType = require(\"domelementtype\"),\n    getOuterHTML = require(\"dom-serializer\"),\n    isTag = ElementType.isTag;\n\nmodule.exports = {\n\tgetInnerHTML: getInnerHTML,\n\tgetOuterHTML: getOuterHTML,\n\tgetText: getText\n};\n\nfunction getInnerHTML(elem, opts){\n\treturn elem.children ? elem.children.map(function(elem){\n\t\treturn getOuterHTML(elem, opts);\n\t}).join(\"\") : \"\";\n}\n\nfunction getText(elem){\n\tif(Array.isArray(elem)) return elem.map(getText).join(\"\");\n\tif(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);\n\tif(elem.type === ElementType.Text) return elem.data;\n\treturn \"\";\n}\n","var getChildren = exports.getChildren = function(elem){\n\treturn elem.children;\n};\n\nvar getParent = exports.getParent = function(elem){\n\treturn elem.parent;\n};\n\nexports.getSiblings = function(elem){\n\tvar parent = getParent(elem);\n\treturn parent ? getChildren(parent) : [elem];\n};\n\nexports.getAttributeValue = function(elem, name){\n\treturn elem.attribs && elem.attribs[name];\n};\n\nexports.hasAttrib = function(elem, name){\n\treturn !!elem.attribs && hasOwnProperty.call(elem.attribs, name);\n};\n\nexports.getName = function(elem){\n\treturn elem.name;\n};\n","exports.removeElement = function(elem){\n\tif(elem.prev) elem.prev.next = elem.next;\n\tif(elem.next) elem.next.prev = elem.prev;\n\n\tif(elem.parent){\n\t\tvar childs = elem.parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 1);\n\t}\n};\n\nexports.replaceElement = function(elem, replacement){\n\tvar prev = replacement.prev = elem.prev;\n\tif(prev){\n\t\tprev.next = replacement;\n\t}\n\n\tvar next = replacement.next = elem.next;\n\tif(next){\n\t\tnext.prev = replacement;\n\t}\n\n\tvar parent = replacement.parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds[childs.lastIndexOf(elem)] = replacement;\n\t}\n};\n\nexports.appendChild = function(elem, child){\n\tchild.parent = elem;\n\n\tif(elem.children.push(child) !== 1){\n\t\tvar sibling = elem.children[elem.children.length - 2];\n\t\tsibling.next = child;\n\t\tchild.prev = sibling;\n\t\tchild.next = null;\n\t}\n};\n\nexports.append = function(elem, next){\n\tvar parent = elem.parent,\n\t\tcurrNext = elem.next;\n\n\tnext.next = currNext;\n\tnext.prev = elem;\n\telem.next = next;\n\tnext.parent = parent;\n\n\tif(currNext){\n\t\tcurrNext.prev = next;\n\t\tif(parent){\n\t\t\tvar childs = parent.children;\n\t\t\tchilds.splice(childs.lastIndexOf(currNext), 0, next);\n\t\t}\n\t} else if(parent){\n\t\tparent.children.push(next);\n\t}\n};\n\nexports.prepend = function(elem, prev){\n\tvar parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 0, prev);\n\t}\n\n\tif(elem.prev){\n\t\telem.prev.next = prev;\n\t}\n\t\n\tprev.parent = parent;\n\tprev.prev = elem.prev;\n\tprev.next = elem;\n\telem.prev = prev;\n};\n\n\n","var isTag = require(\"domelementtype\").isTag;\n\nmodule.exports = {\n\tfilter: filter,\n\tfind: find,\n\tfindOneChild: findOneChild,\n\tfindOne: findOne,\n\texistsOne: existsOne,\n\tfindAll: findAll\n};\n\nfunction filter(test, element, recurse, limit){\n\tif(!Array.isArray(element)) element = [element];\n\n\tif(typeof limit !== \"number\" || !isFinite(limit)){\n\t\tlimit = Infinity;\n\t}\n\treturn find(test, element, recurse !== false, limit);\n}\n\nfunction find(test, elems, recurse, limit){\n\tvar result = [], childs;\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(test(elems[i])){\n\t\t\tresult.push(elems[i]);\n\t\t\tif(--limit <= 0) break;\n\t\t}\n\n\t\tchilds = elems[i].children;\n\t\tif(recurse && childs && childs.length > 0){\n\t\t\tchilds = find(test, childs, recurse, limit);\n\t\t\tresult = result.concat(childs);\n\t\t\tlimit -= childs.length;\n\t\t\tif(limit <= 0) break;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findOneChild(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(test(elems[i])) return elems[i];\n\t}\n\n\treturn null;\n}\n\nfunction findOne(test, elems){\n\tvar elem = null;\n\n\tfor(var i = 0, l = elems.length; i < l && !elem; i++){\n\t\tif(!isTag(elems[i])){\n\t\t\tcontinue;\n\t\t} else if(test(elems[i])){\n\t\t\telem = elems[i];\n\t\t} else if(elems[i].children.length > 0){\n\t\t\telem = findOne(test, elems[i].children);\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction existsOne(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(\n\t\t\tisTag(elems[i]) && (\n\t\t\t\ttest(elems[i]) || (\n\t\t\t\t\telems[i].children.length > 0 &&\n\t\t\t\t\texistsOne(test, elems[i].children)\n\t\t\t\t)\n\t\t\t)\n\t\t){\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction findAll(test, elems){\n\tvar result = [];\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\n\t\tif(elems[i].children.length > 0){\n\t\t\tresult = result.concat(findAll(test, elems[i].children));\n\t\t}\n\t}\n\treturn result;\n}\n","var ElementType = require(\"domelementtype\");\nvar isTag = exports.isTag = ElementType.isTag;\n\nexports.testElement = function(options, element){\n\tfor(var key in options){\n\t\tif(!options.hasOwnProperty(key));\n\t\telse if(key === \"tag_name\"){\n\t\t\tif(!isTag(element) || !options.tag_name(element.name)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(key === \"tag_type\"){\n\t\t\tif(!options.tag_type(element.type)) return false;\n\t\t} else if(key === \"tag_contains\"){\n\t\t\tif(isTag(element) || !options.tag_contains(element.data)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(!element.attribs || !options[key](element.attribs[key])){\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\nvar Checks = {\n\ttag_name: function(name){\n\t\tif(typeof name === \"function\"){\n\t\t\treturn function(elem){ return isTag(elem) && name(elem.name); };\n\t\t} else if(name === \"*\"){\n\t\t\treturn isTag;\n\t\t} else {\n\t\t\treturn function(elem){ return isTag(elem) && elem.name === name; };\n\t\t}\n\t},\n\ttag_type: function(type){\n\t\tif(typeof type === \"function\"){\n\t\t\treturn function(elem){ return type(elem.type); };\n\t\t} else {\n\t\t\treturn function(elem){ return elem.type === type; };\n\t\t}\n\t},\n\ttag_contains: function(data){\n\t\tif(typeof data === \"function\"){\n\t\t\treturn function(elem){ return !isTag(elem) && data(elem.data); };\n\t\t} else {\n\t\t\treturn function(elem){ return !isTag(elem) && elem.data === data; };\n\t\t}\n\t}\n};\n\nfunction getAttribCheck(attrib, value){\n\tif(typeof value === \"function\"){\n\t\treturn function(elem){ return elem.attribs && value(elem.attribs[attrib]); };\n\t} else {\n\t\treturn function(elem){ return elem.attribs && elem.attribs[attrib] === value; };\n\t}\n}\n\nfunction combineFuncs(a, b){\n\treturn function(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\nexports.getElements = function(options, element, recurse, limit){\n\tvar funcs = Object.keys(options).map(function(key){\n\t\tvar value = options[key];\n\t\treturn key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n\t});\n\n\treturn funcs.length === 0 ? [] : this.filter(\n\t\tfuncs.reduce(combineFuncs),\n\t\telement, recurse, limit\n\t);\n};\n\nexports.getElementById = function(id, element, recurse){\n\tif(!Array.isArray(element)) element = [element];\n\treturn this.findOne(getAttribCheck(\"id\", id), element, recurse !== false);\n};\n\nexports.getElementsByTagName = function(name, element, recurse, limit){\n\treturn this.filter(Checks.tag_name(name), element, recurse, limit);\n};\n\nexports.getElementsByTagType = function(type, element, recurse, limit){\n\treturn this.filter(Checks.tag_type(type), element, recurse, limit);\n};\n","// removeSubsets\n// Given an array of nodes, remove any member that is contained by another.\nexports.removeSubsets = function(nodes) {\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile (--idx > -1) {\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile (ancestor) {\n\t\t\tif (nodes.indexOf(ancestor) > -1) {\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = ancestor.parent;\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif (replace) {\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n};\n\n// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition\nvar POSITION = {\n\tDISCONNECTED: 1,\n\tPRECEDING: 2,\n\tFOLLOWING: 4,\n\tCONTAINS: 8,\n\tCONTAINED_BY: 16\n};\n\n// Compare the position of one node against another node in any other document.\n// The return value is a bitmask with the following values:\n//\n// document order:\n// > There is an ordering, document order, defined on all the nodes in the\n// > document corresponding to the order in which the first character of the\n// > XML representation of each node occurs in the XML representation of the\n// > document after expansion of general entities. Thus, the document element\n// > node will be the first node. Element nodes occur before their children.\n// > Thus, document order orders element nodes in order of the occurrence of\n// > their start-tag in the XML (after expansion of entities). The attribute\n// > nodes of an element occur after the element and before its children. The\n// > relative order of attribute nodes is implementation-dependent./\n// Source:\n// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n//\n// @argument {Node} nodaA The first node to use in the comparison\n// @argument {Node} nodeB The second node to use in the comparison\n//\n// @return {Number} A bitmask describing the input nodes' relative position.\n//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n//         a description of these values.\nvar comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {\n\tvar aParents = [];\n\tvar bParents = [];\n\tvar current, sharedParent, siblings, aSibling, bSibling, idx;\n\n\tif (nodeA === nodeB) {\n\t\treturn 0;\n\t}\n\n\tcurrent = nodeA;\n\twhile (current) {\n\t\taParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\tcurrent = nodeB;\n\twhile (current) {\n\t\tbParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\n\tidx = 0;\n\twhile (aParents[idx] === bParents[idx]) {\n\t\tidx++;\n\t}\n\n\tif (idx === 0) {\n\t\treturn POSITION.DISCONNECTED;\n\t}\n\n\tsharedParent = aParents[idx - 1];\n\tsiblings = sharedParent.children;\n\taSibling = aParents[idx];\n\tbSibling = bParents[idx];\n\n\tif (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n\t\tif (sharedParent === nodeB) {\n\t\t\treturn POSITION.FOLLOWING | POSITION.CONTAINED_BY;\n\t\t}\n\t\treturn POSITION.FOLLOWING;\n\t} else {\n\t\tif (sharedParent === nodeA) {\n\t\t\treturn POSITION.PRECEDING | POSITION.CONTAINS;\n\t\t}\n\t\treturn POSITION.PRECEDING;\n\t}\n};\n\n// Sort an array of nodes based on their relative position in the document and\n// remove any duplicate nodes. If the array contains nodes that do not belong\n// to the same document, sort order is unspecified.\n//\n// @argument {Array} nodes Array of DOM nodes\n//\n// @returns {Array} collection of unique nodes, sorted in document order\nexports.uniqueSort = function(nodes) {\n\tvar idx = nodes.length, node, position;\n\n\tnodes = nodes.slice();\n\n\twhile (--idx > -1) {\n\t\tnode = nodes[idx];\n\t\tposition = nodes.indexOf(node);\n\t\tif (position > -1 && position < idx) {\n\t\t\tnodes.splice(idx, 1);\n\t\t}\n\t}\n\tnodes.sort(function(a, b) {\n\t\tvar relative = comparePos(a, b);\n\t\tif (relative & POSITION.PRECEDING) {\n\t\t\treturn -1;\n\t\t} else if (relative & POSITION.FOLLOWING) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\treturn nodes;\n};\n","var DomUtils = module.exports;\n\n[\n\trequire(\"./lib/stringify\"),\n\trequire(\"./lib/traversal\"),\n\trequire(\"./lib/manipulation\"),\n\trequire(\"./lib/querying\"),\n\trequire(\"./lib/legacy\"),\n\trequire(\"./lib/helpers\")\n].forEach(function(ext){\n\tObject.keys(ext).forEach(function(key){\n\t\tDomUtils[key] = ext[key].bind(DomUtils);\n\t});\n});\n","module.exports = parse;\n\n//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\n\n//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\nvar re_nthElement = /^([+\\-]?\\d*n)?\\s*(?:([+\\-]?)\\s*(\\d+))?$/;\n\n/*\n\tparses a nth-check formula, returns an array of two numbers\n*/\nfunction parse(formula){\n\tformula = formula.trim().toLowerCase();\n\n\tif(formula === \"even\"){\n\t\treturn [2, 0];\n\t} else if(formula === \"odd\"){\n\t\treturn [2, 1];\n\t} else {\n\t\tvar parsed = formula.match(re_nthElement);\n\n\t\tif(!parsed){\n\t\t\tthrow new SyntaxError(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n\t\t}\n\n\t\tvar a;\n\n\t\tif(parsed[1]){\n\t\t\ta = parseInt(parsed[1], 10);\n\t\t\tif(isNaN(a)){\n\t\t\t\tif(parsed[1].charAt(0) === \"-\") a = -1;\n\t\t\t\telse a = 1;\n\t\t\t}\n\t\t} else a = 0;\n\n\t\treturn [\n\t\t\ta,\n\t\t\tparsed[3] ? parseInt((parsed[2] || \"\") + parsed[3], 10) : 0\n\t\t];\n\t}\n}\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","module.exports = compile;\n\nvar BaseFuncs = require(\"boolbase\"),\n    trueFunc  = BaseFuncs.trueFunc,\n    falseFunc = BaseFuncs.falseFunc;\n\n/*\n\treturns a function that checks if an elements index matches the given rule\n\thighly optimized to return the fastest solution\n*/\nfunction compile(parsed){\n\tvar a = parsed[0],\n\t    b = parsed[1] - 1;\n\n\t//when b <= 0, a*n won't be possible for any matches when a < 0\n\t//besides, the specification says that no element is matched when a and b are 0\n\tif(b < 0 && a <= 0) return falseFunc;\n\n\t//when a is in the range -1..1, it matches any element (so only b is checked)\n\tif(a ===-1) return function(pos){ return pos <= b; };\n\tif(a === 0) return function(pos){ return pos === b; };\n\t//when b <= 0 and a === 1, they match any element\n\tif(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };\n\n\t//when a > 0, modulo can be used to check if there is a match\n\tvar bMod = b % a;\n\tif(bMod < 0) bMod += a;\n\n\tif(a > 1){\n\t\treturn function(pos){\n\t\t\treturn pos >= b && pos % a === bMod;\n\t\t};\n\t}\n\n\ta *= -1; //make `a` positive\n\n\treturn function(pos){\n\t\treturn pos <= b && pos % a === bMod;\n\t};\n}","var parse = require(\"./parse.js\"),\n    compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","var DomUtils  = require(\"domutils\"),\n    hasAttrib = DomUtils.hasAttrib,\n    getAttributeValue = DomUtils.getAttributeValue,\n    falseFunc = require(\"boolbase\").falseFunc;\n\n//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\n\n/*\n\tattribute selectors\n*/\n\nvar attributeRules = {\n\t__proto__: null,\n\tequals: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function equalsIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function equals(elem){\n\t\t\treturn getAttributeValue(elem, name) === value && next(elem);\n\t\t};\n\t},\n\thyphen: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function hyphenIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null &&\n\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\tattr.substr(0, len).toLowerCase() === value &&\n\t\t\t\t\t\tnext(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function hyphen(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null &&\n\t\t\t\t\tattr.substr(0, len) === value &&\n\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\tnext(elem);\n\t\t};\n\t},\n\telement: function(next, data){\n\t\tvar name = data.name,\n\t\t    value = data.value;\n\n\t\tif(/\\s/.test(value)){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tvalue = value.replace(reChars, \"\\\\$&\");\n\n\t\tvar pattern = \"(?:^|\\\\s)\" + value + \"(?:$|\\\\s)\",\n\t\t    flags = data.ignoreCase ? \"i\" : \"\",\n\t\t    regex = new RegExp(pattern, flags);\n\n\t\treturn function element(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t};\n\t},\n\texists: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function exists(elem){\n\t\t\treturn hasAttrib(elem, name) && next(elem);\n\t\t};\n\t},\n\tstart: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\t\t\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function startIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function start(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(0, len) === value && next(elem);\n\t\t};\n\t},\n\tend: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len   = -value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function endIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function end(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(len) === value && next(elem);\n\t\t};\n\t},\n\tany: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvar regex = new RegExp(value.replace(reChars, \"\\\\$&\"), \"i\");\n\n\t\t\treturn function anyIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function any(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.indexOf(value) >= 0 && next(elem);\n\t\t};\n\t},\n\tnot: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn function notEmpty(elem){\n\t\t\t\treturn !!getAttributeValue(elem, name) && next(elem);\n\t\t\t};\n\t\t} else if(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function notIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() !== value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function not(elem){\n\t\t\treturn getAttributeValue(elem, name) !== value && next(elem);\n\t\t};\n\t}\n};\n\nmodule.exports = {\n\tcompile: function(next, data, options){\n\t\tif(options && options.strict && (\n\t\t\tdata.ignoreCase || data.action === \"not\"\n\t\t)) throw SyntaxError(\"Unsupported attribute selector\");\n\t\treturn attributeRules[data.action](next, data);\n\t},\n\trules: attributeRules\n};\n","/*\n\tpseudo selectors\n\n\t---\n\n\tthey are available in two forms:\n\t* filters called when the selector\n\t  is compiled and return a function\n\t  that needs to return next()\n\t* pseudos get called on execution\n\t  they need to return a boolean\n*/\n\nvar DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getText     = DomUtils.getText,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    hasAttrib   = DomUtils.hasAttrib,\n    getName     = DomUtils.getName,\n    getAttribute= DomUtils.getAttributeValue,\n    getNCheck   = require(\"nth-check\"),\n    checkAttrib = require(\"./attributes.js\").rules.equals,\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc;\n\n//helper methods\nfunction getFirstElement(elems){\n\tfor(var i = 0; elems && i < elems.length; i++){\n\t\tif(isTag(elems[i])) return elems[i];\n\t}\n}\n\nfunction getAttribFunc(name, value){\n\tvar data = {name: name, value: value};\n\treturn function attribFunc(next){\n\t\treturn checkAttrib(next, data);\n\t};\n}\n\nfunction getChildFunc(next){\n\treturn function(elem){\n\t\treturn !!getParent(elem) && next(elem);\n\t};\n}\n\nvar filters = {\n\tcontains: function(next, text){\n\t\treturn function contains(elem){\n\t\t\treturn next(elem) && getText(elem).indexOf(text) >= 0;\n\t\t};\n\t},\n\ticontains: function(next, text){\n\t\tvar itext = text.toLowerCase();\n\t\treturn function icontains(elem){\n\t\t\treturn next(elem) &&\n\t\t\t\tgetText(elem).toLowerCase().indexOf(itext) >= 0;\n\t\t};\n\t},\n\n\t//location specific methods\n\t\"nth-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0, pos = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\n    //TODO determine the actual root element\n    root: function(next){\n        return function(elem){\n            return !getParent(elem) && next(elem);\n        };\n    },\n\n    scope: function(next, rule, options, context){\n        if(!context || context.length === 0){\n            //equivalent to :root\n            return filters.root(next);\n        }\n\n        if(context.length === 1){\n            //NOTE: can't be unpacked, as :has uses this for side-effects\n            return function(elem){\n                return context[0] === elem && next(elem);\n            };\n        }\n\n        return function(elem){\n            return context.indexOf(elem) >= 0 && next(elem);\n        };\n    },\n\n\t//jQuery extensions (others follow as pseudos)\n\tcheckbox: getAttribFunc(\"type\", \"checkbox\"),\n\tfile: getAttribFunc(\"type\", \"file\"),\n\tpassword: getAttribFunc(\"type\", \"password\"),\n\tradio: getAttribFunc(\"type\", \"radio\"),\n\treset: getAttribFunc(\"type\", \"reset\"),\n\timage: getAttribFunc(\"type\", \"image\"),\n\tsubmit: getAttribFunc(\"type\", \"submit\")\n};\n\n//while filters are precompiled, pseudos get called when they are needed\nvar pseudos = {\n\tempty: function(elem){\n\t\treturn !getChildren(elem).some(function(elem){\n\t\t\treturn isTag(elem) || elem.type === \"text\";\n\t\t});\n\t},\n\n\t\"first-child\": function(elem){\n\t\treturn getFirstElement(getSiblings(elem)) === elem;\n\t},\n\t\"last-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\tif(siblings[i] === elem) return true;\n\t\t\tif(isTag(siblings[i])) break;\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"first-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"last-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length-1; i >= 0; i--){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"only-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0, j = siblings.length; i < j; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) continue;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) return false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\t\"only-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i]) && siblings[i] !== elem) return false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t//:matches(a, area, link)[href]\n\tlink: function(elem){\n\t\treturn hasAttrib(elem, \"href\");\n\t},\n\tvisited: falseFunc, //seems to be a valid implementation\n\t//TODO: :any-link once the name is finalized (as an alias of :link)\n\n\t//forms\n\t//to consider: :target\n\n\t//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)\n\tselected: function(elem){\n\t\tif(hasAttrib(elem, \"selected\")) return true;\n\t\telse if(getName(elem) !== \"option\") return false;\n\n\t\t//the first <option> in a <select> is also selected\n\t\tvar parent = getParent(elem);\n\n\t\tif(\n\t\t\t!parent ||\n\t\t\tgetName(parent) !== \"select\" ||\n\t\t\thasAttrib(parent, \"multiple\")\n\t\t) return false;\n\n\t\tvar siblings = getChildren(parent),\n\t\t\tsawElem  = false;\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem){\n\t\t\t\t\tsawElem = true;\n\t\t\t\t} else if(!sawElem){\n\t\t\t\t\treturn false;\n\t\t\t\t} else if(hasAttrib(siblings[i], \"selected\")){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sawElem;\n\t},\n\t//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n\t//:matches(\n\t//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],\n\t//  optgroup[disabled] > option),\n\t// fieldset[disabled] * //TODO not child of first <legend>\n\t//)\n\tdisabled: function(elem){\n\t\treturn hasAttrib(elem, \"disabled\");\n\t},\n\tenabled: function(elem){\n\t\treturn !hasAttrib(elem, \"disabled\");\n\t},\n\t//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)\n\tchecked: function(elem){\n\t\treturn hasAttrib(elem, \"checked\") || pseudos.selected(elem);\n\t},\n\t//:matches(input, select, textarea)[required]\n\trequired: function(elem){\n\t\treturn hasAttrib(elem, \"required\");\n\t},\n\t//:matches(input, select, textarea):not([required])\n\toptional: function(elem){\n\t\treturn !hasAttrib(elem, \"required\");\n\t},\n\n\t//jQuery extensions\n\n\t//:not(:empty)\n\tparent: function(elem){\n\t\treturn !pseudos.empty(elem);\n\t},\n\t//:matches(h1, h2, h3, h4, h5, h6)\n\theader: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"h1\" ||\n\t\t       name === \"h2\" ||\n\t\t       name === \"h3\" ||\n\t\t       name === \"h4\" ||\n\t\t       name === \"h5\" ||\n\t\t       name === \"h6\";\n\t},\n\n\t//:matches(button, input[type=button])\n\tbutton: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"button\" ||\n\t\t       name === \"input\" &&\n\t\t       getAttribute(elem, \"type\") === \"button\";\n\t},\n\t//:matches(input, textarea, select, button)\n\tinput: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"input\" ||\n\t\t       name === \"textarea\" ||\n\t\t       name === \"select\" ||\n\t\t       name === \"button\";\n\t},\n\t//input:matches(:not([type!='']), [type='text' i])\n\ttext: function(elem){\n\t\tvar attr;\n\t\treturn getName(elem) === \"input\" && (\n\t\t\t!(attr = getAttribute(elem, \"type\")) ||\n\t\t\tattr.toLowerCase() === \"text\"\n\t\t);\n\t}\n};\n\nfunction verifyArgs(func, name, subselect){\n\tif(subselect === null){\n\t\tif(func.length > 1 && name !== \"scope\"){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" requires an argument\");\n\t\t}\n\t} else {\n\t\tif(func.length === 1){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" doesn't have any arguments\");\n\t\t}\n\t}\n}\n\n//FIXME this feels hacky\nvar re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;\n\nmodule.exports = {\n\tcompile: function(next, data, options, context){\n\t\tvar name = data.name,\n\t\t\tsubselect = data.data;\n\n\t\tif(options && options.strict && !re_CSS3.test(name)){\n\t\t\tthrow SyntaxError(\":\" + name + \" isn't part of CSS3\");\n\t\t}\n\n\t\tif(typeof filters[name] === \"function\"){\n\t\t\tverifyArgs(filters[name], name,  subselect);\n\t\t\treturn filters[name](next, subselect, options, context);\n\t\t} else if(typeof pseudos[name] === \"function\"){\n\t\t\tvar func = pseudos[name];\n\t\t\tverifyArgs(func, name, subselect);\n\n\t\t\tif(next === trueFunc) return func;\n\n\t\t\treturn function pseudoArgs(elem){\n\t\t\t\treturn func(elem, subselect) && next(elem);\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new SyntaxError(\"unmatched pseudo-class :\" + name);\n\t\t}\n\t},\n\tfilters: filters,\n\tpseudos: pseudos\n};\n","\"use strict\";\n\nmodule.exports = parse;\n\nvar re_name = /^(?:\\\\.|[\\w\\-\\u00b0-\\uFFFF])+/,\n    re_escape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/ig,\n    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87\n    re_attr = /^\\s*((?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])+)\\s*(?:(\\S?)=\\s*(?:(['\"])([^]*?)\\3|(#?(?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])*)|)|)\\s*(i)?\\]/;\n\nvar actionTypes = {\n\t__proto__: null,\n\t\"undefined\": \"exists\",\n\t\"\":  \"equals\",\n\t\"~\": \"element\",\n\t\"^\": \"start\",\n\t\"$\": \"end\",\n\t\"*\": \"any\",\n\t\"!\": \"not\",\n\t\"|\": \"hyphen\"\n};\n\nvar simpleSelectors = {\n\t__proto__: null,\n\t\">\": \"child\",\n\t\"<\": \"parent\",\n\t\"~\": \"sibling\",\n\t\"+\": \"adjacent\"\n};\n\nvar attribSelectors = {\n\t__proto__: null,\n\t\"#\": [\"id\", \"equals\"],\n\t\".\": [\"class\", \"element\"]\n};\n\n//pseudos, whose data-property is parsed as well\nvar unpackPseudos = {\n\t__proto__: null,\n\t\"has\": true,\n\t\"not\": true,\n\t\"matches\": true\n};\n\nvar stripQuotesFromPseudos = {\n\t__proto__: null,\n\t\"contains\": true,\n\t\"icontains\": true\n};\n\nvar quotes = {\n\t__proto__: null,\n\t\"\\\"\": true,\n\t\"'\": true\n};\n\n//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139\nfunction funescape( _, escaped, escapedWhitespace ) {\n\tvar high = \"0x\" + escaped - 0x10000;\n\t// NaN means non-codepoint\n\t// Support: Firefox\n\t// Workaround erroneous numeric interpretation of +\"0x\"\n\treturn high !== high || escapedWhitespace ?\n\t\tescaped :\n\t\t// BMP codepoint\n\t\thigh < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n}\n\nfunction unescapeCSS(str){\n\treturn str.replace(re_escape, funescape);\n}\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n\nfunction parse(selector, options){\n\tvar subselects = [];\n\n\tselector = parseSelector(subselects, selector + \"\", options);\n\n\tif(selector !== \"\"){\n\t\tthrow new SyntaxError(\"Unmatched selector: \" + selector);\n\t}\n\n\treturn subselects;\n}\n\nfunction parseSelector(subselects, selector, options){\n\tvar tokens = [],\n\t\tsawWS = false,\n\t\tdata, firstChar, name, quot;\n\n\tfunction getName(){\n\t\tvar sub = selector.match(re_name)[0];\n\t\tselector = selector.substr(sub.length);\n\t\treturn unescapeCSS(sub);\n\t}\n\n\tfunction stripWhitespace(start){\n\t\twhile(isWhitespace(selector.charAt(start))) start++;\n\t\tselector = selector.substr(start);\n\t}\n\n\tfunction isEscaped(pos) {\n\t\tvar slashCount = 0;\n\n\t\twhile (selector.charAt(--pos) === \"\\\\\") slashCount++;\n\t\treturn (slashCount & 1) === 1;\n\t}\n\n\tstripWhitespace(0);\n\n\twhile(selector !== \"\"){\n\t\tfirstChar = selector.charAt(0);\n\n\t\tif(isWhitespace(firstChar)){\n\t\t\tsawWS = true;\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar in simpleSelectors){\n\t\t\ttokens.push({type: simpleSelectors[firstChar]});\n\t\t\tsawWS = false;\n\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar === \",\"){\n\t\t\tif(tokens.length === 0){\n\t\t\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t\t\t}\n\t\t\tsubselects.push(tokens);\n\t\t\ttokens = [];\n\t\t\tsawWS = false;\n\t\t\tstripWhitespace(1);\n\t\t} else {\n\t\t\tif(sawWS){\n\t\t\t\tif(tokens.length > 0){\n\t\t\t\t\ttokens.push({type: \"descendant\"});\n\t\t\t\t}\n\t\t\t\tsawWS = false;\n\t\t\t}\n\n\t\t\tif(firstChar === \"*\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({type: \"universal\"});\n\t\t\t} else if(firstChar in attribSelectors){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: attribSelectors[firstChar][0],\n\t\t\t\t\taction: attribSelectors[firstChar][1],\n\t\t\t\t\tvalue: getName(),\n\t\t\t\t\tignoreCase: false\n\t\t\t\t});\n\t\t\t} else if(firstChar === \"[\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\tdata = selector.match(re_attr);\n\t\t\t\tif(!data){\n\t\t\t\t\tthrow new SyntaxError(\"Malformed attribute selector: \" + selector);\n\t\t\t\t}\n\t\t\t\tselector = selector.substr(data[0].length);\n\t\t\t\tname = unescapeCSS(data[1]);\n\n\t\t\t\tif(\n\t\t\t\t\t!options || (\n\t\t\t\t\t\t\"lowerCaseAttributeNames\" in options ?\n\t\t\t\t\t\t\toptions.lowerCaseAttributeNames :\n\t\t\t\t\t\t\t!options.xmlMode\n\t\t\t\t\t)\n\t\t\t\t){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: name,\n\t\t\t\t\taction: actionTypes[data[2]],\n\t\t\t\t\tvalue: unescapeCSS(data[4] || data[5] || \"\"),\n\t\t\t\t\tignoreCase: !!data[6]\n\t\t\t\t});\n\n\t\t\t} else if(firstChar === \":\"){\n\t\t\t\tif(selector.charAt(1) === \":\"){\n\t\t\t\t\tselector = selector.substr(2);\n\t\t\t\t\ttokens.push({type: \"pseudo-element\", name: getName().toLowerCase()});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.substr(1);\n\n\t\t\t\tname = getName().toLowerCase();\n\t\t\t\tdata = null;\n\n\t\t\t\tif(selector.charAt(0) === \"(\"){\n\t\t\t\t\tif(name in unpackPseudos){\n\t\t\t\t\t\tquot = selector.charAt(1);\n\t\t\t\t\t\tvar quoted = quot in quotes;\n\n\t\t\t\t\t\tselector = selector.substr(quoted + 1);\n\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tselector = parseSelector(data, selector, options);\n\n\t\t\t\t\t\tif(quoted){\n\t\t\t\t\t\t\tif(selector.charAt(0) !== quot){\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\"unmatched quotes in :\" + name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(selector.charAt(0) !== \")\"){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"missing closing parenthesis in :\" + name + \" \" + selector);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar pos = 1, counter = 1;\n\n\t\t\t\t\t\tfor(; counter > 0 && pos < selector.length; pos++){\n\t\t\t\t\t\t\tif(selector.charAt(pos) === \"(\" && !isEscaped(pos)) counter++;\n\t\t\t\t\t\t\telse if(selector.charAt(pos) === \")\" && !isEscaped(pos)) counter--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"parenthesis not matched\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = selector.substr(1, pos - 2);\n\t\t\t\t\t\tselector = selector.substr(pos);\n\n\t\t\t\t\t\tif(name in stripQuotesFromPseudos){\n\t\t\t\t\t\t\tquot = data.charAt(0);\n\n\t\t\t\t\t\t\tif(quot === data.slice(-1) && quot in quotes){\n\t\t\t\t\t\t\t\tdata = data.slice(1, -1);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdata = unescapeCSS(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"pseudo\", name: name, data: data});\n\t\t\t} else if(re_name.test(selector)){\n\t\t\t\tname = getName();\n\n\t\t\t\tif(!options || (\"lowerCaseTags\" in options ? options.lowerCaseTags : !options.xmlMode)){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"tag\", name: name});\n\t\t\t} else {\n\t\t\t\tif(tokens.length && tokens[tokens.length - 1].type === \"descendant\"){\n\t\t\t\t\ttokens.pop();\n\t\t\t\t}\n\t\t\t\taddToken(subselects, tokens);\n\t\t\t\treturn selector;\n\t\t\t}\n\t\t}\n\t}\n\n\taddToken(subselects, tokens);\n\n\treturn selector;\n}\n\nfunction addToken(subselects, tokens){\n\tif(subselects.length > 0 && tokens.length === 0){\n\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t}\n\n\tsubselects.push(tokens);\n}\n","var DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    getName     = DomUtils.getName;\n\n/*\n\tall available rules\n*/\nmodule.exports = {\n\t__proto__: null,\n\n\tattribute: require(\"./attributes.js\").compile,\n\tpseudo: require(\"./pseudos.js\").compile,\n\n\t//tags\n\ttag: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function tag(elem){\n\t\t\treturn getName(elem) === name && next(elem);\n\t\t};\n\t},\n\n\t//traversal\n\tdescendant: function(next, rule, options, context, acceptSelf){\n\t\treturn function descendant(elem){\n\n\t\t\tif (acceptSelf && next(elem)) return true;\n\n\t\t\tvar found = false;\n\n\t\t\twhile(!found && (elem = getParent(elem))){\n\t\t\t\tfound = next(elem);\n\t\t\t}\n\n\t\t\treturn found;\n\t\t};\n\t},\n\tparent: function(next, data, options){\n\t\tif(options && options.strict) throw SyntaxError(\"Parent selector isn't part of CSS3\");\n\n\t\treturn function parent(elem){\n\t\t\treturn getChildren(elem).some(test);\n\t\t};\n\n\t\tfunction test(elem){\n\t\t\treturn isTag(elem) && next(elem);\n\t\t}\n\t},\n\tchild: function(next){\n\t\treturn function child(elem){\n\t\t\tvar parent = getParent(elem);\n\t\t\treturn !!parent && next(parent);\n\t\t};\n\t},\n\tsibling: function(next){\n\t\treturn function sibling(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(next(siblings[i])) return true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\t},\n\tadjacent: function(next){\n\t\treturn function adjacent(elem){\n\t\t\tvar siblings = getSiblings(elem),\n\t\t\t    lastElement;\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tlastElement = siblings[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !!lastElement && next(lastElement);\n\t\t};\n\t},\n\tuniversal: function(next){\n\t\treturn next;\n\t}\n};","module.exports = sortByProcedure;\n\n/*\n\tsort the parts of the passed selector,\n\tas there is potential for optimization\n\t(some types of selectors are faster than others)\n*/\n\nvar procedure = require(\"./procedure.json\");\n\nvar attributes = {\n\t__proto__: null,\n\texists: 10,\n\tequals: 8,\n\tnot: 7,\n\tstart: 6,\n\tend: 6,\n\tany: 5,\n\thyphen: 4,\n\telement: 4\n};\n\nfunction sortByProcedure(arr){\n\tvar procs = arr.map(getProcedure);\n\tfor(var i = 1; i < arr.length; i++){\n\t\tvar procNew = procs[i];\n\n\t\tif(procNew < 0) continue;\n\n\t\tfor(var j = i - 1; j >= 0 && procNew < procs[j]; j--){\n\t\t\tvar token = arr[j + 1];\n\t\t\tarr[j + 1] = arr[j];\n\t\t\tarr[j] = token;\n\t\t\tprocs[j + 1] = procs[j];\n\t\t\tprocs[j] = procNew;\n\t\t}\n\t}\n}\n\nfunction getProcedure(token){\n\tvar proc = procedure[token.type];\n\n\tif(proc === procedure.attribute){\n\t\tproc = attributes[token.action];\n\n\t\tif(proc === attributes.equals && token.name === \"id\"){\n\t\t\t//prefer ID selectors (eg. #ID)\n\t\t\tproc = 9;\n\t\t}\n\n\t\tif(token.ignoreCase){\n\t\t\t//ignoreCase adds some overhead, prefer \"normal\" token\n\t\t\t//this is a binary operation, to ensure it's still an int\n\t\t\tproc >>= 1;\n\t\t}\n\t} else if(proc === procedure.pseudo){\n\t\tif(!token.data){\n\t\t\tproc = 3;\n\t\t} else if(token.name === \"has\" || token.name === \"contains\"){\n\t\t\tproc = 0; //expensive in any case\n\t\t} else if(token.name === \"matches\" || token.name === \"not\"){\n\t\t\tproc = 0;\n\t\t\tfor(var i = 0; i < token.data.length; i++){\n\t\t\t\t//TODO better handling of complex selectors\n\t\t\t\tif(token.data[i].length !== 1) continue;\n\t\t\t\tvar cur = getProcedure(token.data[i][0]);\n\t\t\t\t//avoid executing :has or :contains\n\t\t\t\tif(cur === 0){\n\t\t\t\t\tproc = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(cur > proc) proc = cur;\n\t\t\t}\n\t\t\tif(token.data.length > 1 && proc > 0) proc -= 1;\n\t\t} else {\n\t\t\tproc = 1;\n\t\t}\n\t}\n\treturn proc;\n}\n","/*\n\tcompiles a selector to an executable function\n*/\n\nmodule.exports = compile;\nmodule.exports.compileUnsafe = compileUnsafe;\nmodule.exports.compileToken = compileToken;\n\nvar parse       = require(\"css-what\"),\n    DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    Rules       = require(\"./general.js\"),\n    sortRules   = require(\"./sort.js\"),\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc,\n    procedure   = require(\"./procedure.json\");\n\nfunction compile(selector, options, context){\n\tvar next = compileUnsafe(selector, options, context);\n\treturn wrap(next);\n}\n\nfunction wrap(next){\n\treturn function base(elem){\n\t\treturn isTag(elem) && next(elem);\n\t};\n}\n\nfunction compileUnsafe(selector, options, context){\n\tvar token = parse(selector, options);\n\treturn compileToken(token, options, context);\n}\n\nfunction includesScopePseudo(t){\n    return t.type === \"pseudo\" && (\n        t.name === \"scope\" || (\n            Array.isArray(t.data) &&\n            t.data.some(function(data){\n                return data.some(includesScopePseudo);\n            })\n        )\n    );\n}\n\nvar DESCENDANT_TOKEN = {type: \"descendant\"},\n    SCOPE_TOKEN = {type: \"pseudo\", name: \"scope\"},\n    PLACEHOLDER_ELEMENT = {},\n    getParent = DomUtils.getParent;\n\n//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n//http://www.w3.org/TR/selectors4/#absolutizing\nfunction absolutize(token, context){\n    //TODO better check if context is document\n    var hasContext = !!context && !!context.length && context.every(function(e){\n        return e === PLACEHOLDER_ELEMENT || !!getParent(e);\n    });\n\n\n    token.forEach(function(t){\n        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== \"descendant\"){\n            //don't return in else branch\n        } else if(hasContext && !includesScopePseudo(t)){\n            t.unshift(DESCENDANT_TOKEN);\n        } else {\n            return;\n        }\n\n        t.unshift(SCOPE_TOKEN);\n    });\n}\n\nfunction compileToken(token, options, context){\n    token = token.filter(function(t){ return t.length > 0; });\n\n\ttoken.forEach(sortRules);\n\n\tvar isArrayContext = Array.isArray(context);\n\n    context = (options && options.context) || context;\n\n    if(context && !isArrayContext) context = [context];\n\n    absolutize(token, context);\n\n\treturn token\n\t\t.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })\n\t\t.reduce(reduceRules, falseFunc);\n}\n\nfunction isTraversal(t){\n\treturn procedure[t.type] < 0;\n}\n\nfunction compileRules(rules, options, context, isArrayContext){\n\tvar acceptSelf = (isArrayContext && rules[0].name === \"scope\" && rules[1].type === \"descendant\");\n\treturn rules.reduce(function(func, rule, index){\n\t\tif(func === falseFunc) return func;\n\t\treturn Rules[rule.type](func, rule, options, context, acceptSelf && index === 1);\n\t}, options && options.rootFunc || trueFunc);\n}\n\nfunction reduceRules(a, b){\n\tif(b === falseFunc || a === trueFunc){\n\t\treturn a;\n\t}\n\tif(a === falseFunc || b === trueFunc){\n\t\treturn b;\n\t}\n\n\treturn function combine(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\n//:not, :has and :matches have to compile selectors\n//doing this in lib/pseudos.js would lead to circular dependencies,\n//so we add them here\n\nvar Pseudos     = require(\"./pseudos.js\"),\n    filters     = Pseudos.filters,\n    existsOne   = DomUtils.existsOne,\n    isTag       = DomUtils.isTag,\n    getChildren = DomUtils.getChildren;\n\n\nfunction containsTraversal(t){\n\treturn t.some(isTraversal);\n}\n\nfilters.not = function(next, token, options, context){\n\tvar opts = {\n\t    \txmlMode: !!(options && options.xmlMode),\n\t    \tstrict: !!(options && options.strict)\n\t    };\n\n\tif(opts.strict){\n\t\tif(token.length > 1 || token.some(containsTraversal)){\n\t\t\tthrow new SyntaxError(\"complex selectors in :not aren't allowed in strict mode\");\n\t\t}\n\t}\n\n    var func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return next;\n\tif(func === trueFunc)  return falseFunc;\n\n\treturn function(elem){\n\t\treturn !func(elem) && next(elem);\n\t};\n};\n\nfilters.has = function(next, token, options){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict)\n\t};\n\n    //FIXME: Uses an array as a pointer to the current element (side effects)\n    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;\n\n\tvar func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return falseFunc;\n\tif(func === trueFunc)  return function(elem){\n\t\t\treturn getChildren(elem).some(isTag) && next(elem);\n\t\t};\n\n\tfunc = wrap(func);\n\n    if(context){\n        return function has(elem){\n\t\treturn next(elem) && (\n                (context[0] = elem), existsOne(func, getChildren(elem))\n            );\n\t};\n    }\n\n    return function has(elem){\n\t\treturn next(elem) && existsOne(func, getChildren(elem));\n\t};\n};\n\nfilters.matches = function(next, token, options, context){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict),\n\t\trootFunc: next\n\t};\n\n\treturn compileToken(token, opts, context);\n};\n","\"use strict\";\n\nmodule.exports = CSSselect;\n\nvar Pseudos       = require(\"./lib/pseudos.js\"),\n    DomUtils      = require(\"domutils\"),\n    findOne       = DomUtils.findOne,\n    findAll       = DomUtils.findAll,\n    getChildren   = DomUtils.getChildren,\n    removeSubsets = DomUtils.removeSubsets,\n    falseFunc     = require(\"boolbase\").falseFunc,\n    compile       = require(\"./lib/compile.js\"),\n    compileUnsafe = compile.compileUnsafe,\n    compileToken  = compile.compileToken;\n\nfunction getSelectorFunc(searchFunc){\n\treturn function select(query, elems, options){\n        if(typeof query !== \"function\") query = compileUnsafe(query, options, elems);\n        if(!Array.isArray(elems)) elems = getChildren(elems);\n\t\telse elems = removeSubsets(elems);\n\t\treturn searchFunc(query, elems);\n\t};\n}\n\nvar selectAll = getSelectorFunc(function selectAll(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? [] : findAll(query, elems);\n});\n\nvar selectOne = getSelectorFunc(function selectOne(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? null : findOne(query, elems);\n});\n\nfunction is(elem, query, options){\n\treturn (typeof query === \"function\" ? query : compile(query, options))(elem);\n}\n\n/*\n\tthe exported interface\n*/\nfunction CSSselect(query, elems, options){\n\treturn selectAll(query, elems, options);\n}\n\nCSSselect.compile = compile;\nCSSselect.filters = Pseudos.filters;\nCSSselect.pseudos = Pseudos.pseudos;\n\nCSSselect.selectAll = selectAll;\nCSSselect.selectOne = selectOne;\n\nCSSselect.is = is;\n\n//legacy methods (might be removed)\nCSSselect.parse = compile;\nCSSselect.iterate = selectAll;\n\n//hooks\nCSSselect._compileUnsafe = compileUnsafe;\nCSSselect._compileToken = compileToken;\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport parse5 from 'parse5';\nimport select from 'css-select';\n\n// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere\nconst treeAdapter = require('parse5-htmlparser2-tree-adapter');\n\nconst PARSE5_OPTS = {\n  treeAdapter\n};\n\n/**\n * Parse HTML into a mutable, serializable DOM Document.\n * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.\n * @param {String} html   HTML to parse into a Document instance\n */\nexport function createDocument(html) {\n  const document = parse5.parse(html, PARSE5_OPTS);\n\n  defineProperties(document, DocumentExtensions);\n\n  // Extend Element.prototype with DOM manipulation methods.\n  const scratch = document.createElement('div');\n  // Get a reference to the base Node class - used by createTextNode()\n  document.$$Node = scratch.constructor;\n  const elementProto = Object.getPrototypeOf(scratch);\n  defineProperties(elementProto, ElementExtensions);\n  elementProto.ownerDocument = document;\n\n  return document;\n}\n\n/**\n * Serialize a Document to an HTML String\n * @param {Document} document   A Document, such as one created via `createDocument()`\n */\nexport function serializeDocument(document) {\n  return parse5.serialize(document, PARSE5_OPTS);\n}\n\n/**\n * Methods and descriptors to mix into Element.prototype\n */\nconst ElementExtensions = {\n  /** @extends htmlparser2.Element.prototype */\n\n  nodeName: {\n    get() {\n      return this.tagName.toUpperCase();\n    }\n  },\n\n  id: reflectedProperty('id'),\n\n  className: reflectedProperty('class'),\n\n  insertBefore(child, referenceNode) {\n    if (!referenceNode) return this.appendChild(child);\n    treeAdapter.insertBefore(this, child, referenceNode);\n    return child;\n  },\n\n  appendChild(child) {\n    treeAdapter.appendChild(this, child);\n    return child;\n  },\n\n  removeChild(child) {\n    treeAdapter.detachNode(child);\n  },\n\n  remove() {\n    treeAdapter.detachNode(this);\n  },\n\n  textContent: {\n    get() {\n      return getText(this);\n    },\n\n    set(text) {\n      this.children = [];\n      treeAdapter.insertText(this, text);\n    }\n  },\n\n  setAttribute(name, value) {\n    if (this.attribs == null) this.attribs = {};\n    if (value == null) value = '';\n    this.attribs[name] = value;\n  },\n\n  removeAttribute(name) {\n    if (this.attribs != null) {\n      delete this.attribs[name];\n    }\n  },\n\n  getAttribute(name) {\n    return this.attribs != null && this.attribs[name];\n  },\n\n  hasAttribute(name) {\n    return this.attribs != null && this.attribs[name] != null;\n  },\n\n  getAttributeNode(name) {\n    const value = this.getAttribute(name);\n    if (value != null) return { specified: true, value };\n  }\n};\n\n/**\n * Methods and descriptors to mix into the global document instance\n * @private\n */\nconst DocumentExtensions = {\n  /** @extends htmlparser2.Document.prototype */\n\n  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.\n  // TODO: verify if these are needed for css-select\n  nodeType: {\n    get() {\n      return 9;\n    }\n  },\n\n  contentType: {\n    get() {\n      return 'text/html';\n    }\n  },\n\n  nodeName: {\n    get() {\n      return '#document';\n    }\n  },\n\n  documentElement: {\n    get() {\n      // Find the first <html> element within the document\n      return this.childNodes.filter(\n        (child) => String(child.tagName).toLowerCase() === 'html'\n      );\n    }\n  },\n\n  compatMode: {\n    get() {\n      const compatMode = {\n        'no-quirks': 'CSS1Compat',\n        quirks: 'BackCompat',\n        'limited-quirks': 'CSS1Compat'\n      };\n      return compatMode[treeAdapter.getDocumentMode(this)];\n    }\n  },\n\n  body: {\n    get() {\n      return this.querySelector('body');\n    }\n  },\n\n  createElement(name) {\n    return treeAdapter.createElement(name, null, []);\n  },\n\n  createTextNode(text) {\n    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM\n    const Node = this.$$Node;\n    return new Node({\n      type: 'text',\n      data: text,\n      parent: null,\n      prev: null,\n      next: null\n    });\n  },\n\n  querySelector(sel) {\n    return select.selectOne(sel, this.documentElement);\n  },\n\n  querySelectorAll(sel) {\n    if (sel === ':root') {\n      return this;\n    }\n    return select(sel, this.documentElement);\n  }\n};\n\n/**\n * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.\n * @private\n */\nfunction defineProperties(obj, properties) {\n  for (const i in properties) {\n    const value = properties[i];\n    Object.defineProperty(\n      obj,\n      i,\n      typeof value === 'function' ? { value } : value\n    );\n  }\n}\n\n/**\n * Create a property descriptor defining a getter/setter pair alias for a named attribute.\n * @private\n */\nfunction reflectedProperty(attributeName) {\n  return {\n    get() {\n      return this.getAttribute(attributeName);\n    },\n    set(value) {\n      this.setAttribute(attributeName, value);\n    }\n  };\n}\n\n/**\n * Helper to get the text content of a node\n * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21\n * @private\n */\nfunction getText(node) {\n  if (Array.isArray(node)) return node.map(getText).join('');\n  if (treeAdapter.isElementNode(node))\n    return node.name === 'br' ? '\\n' : getText(node.children);\n  if (treeAdapter.isTextNode(node)) return node.data;\n  return '';\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport css from 'css';\n\n/**\n * Parse a textual CSS Stylesheet into a Stylesheet instance.\n * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.\n * @see https://github.com/reworkcss/css\n * @private\n * @param {String} stylesheet\n * @returns {css.Stylesheet} ast\n */\nexport function parseStylesheet (stylesheet) {\n  return css.parse(stylesheet);\n}\n\n/**\n * Serialize a ReworkCSS Stylesheet to a String of CSS.\n * @private\n * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`\n * @param {Object} options              Options to pass to `css.stringify()`\n * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)\n */\nexport function serializeStylesheet (ast, options) {\n  return css.stringify(ast, options);\n}\n\n/**\n * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.\n * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).\n * @private\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n * @returns {(rule) => void} nonDestructiveIterator\n */\nexport function markOnly (predicate) {\n  return rule => {\n    const sel = rule.selectors;\n    if (predicate(rule) === false) {\n      rule.$$remove = true;\n    }\n    rule.$$markedSelectors = rule.selectors;\n    if (rule._other) {\n      rule._other.$$markedSelectors = rule._other.selectors;\n    }\n    rule.selectors = sel;\n  };\n}\n\n/**\n * Apply filtered selectors to a rule from a previous markOnly run.\n * @private\n * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).\n*/\nexport function applyMarkedSelectors (rule) {\n  if (rule.$$markedSelectors) {\n    rule.selectors = rule.$$markedSelectors;\n  }\n  if (rule._other) {\n    applyMarkedSelectors(rule._other);\n  }\n}\n\n/**\n * Recursively walk all rules in a stylesheet.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n */\nexport function walkStyleRules (node, iterator) {\n  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);\n\n  node.rules = node.rules.filter(rule => {\n    if (rule.rules) {\n      walkStyleRules(rule, iterator);\n    }\n    rule._other = undefined;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n/**\n * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {css.Rule} node2      A second tree identical to `node`\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.\n */\nexport function walkStyleRulesWithReverseMirror (node, node2, iterator) {\n  if (node2 === null) return walkStyleRules(node, iterator);\n\n  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);\n\n  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {\n    const rule2 = rules2[index];\n    if (rule.rules) {\n      walkStyleRulesWithReverseMirror(rule, rule2, iterator);\n    }\n    rule._other = rule2;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n// Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.\n// This is just a quicker version of generating the compliment of the set returned from a filter operation.\nfunction splitFilter (a, b, predicate) {\n  const aOut = [];\n  const bOut = [];\n  for (let index = 0; index < a.length; index++) {\n    if (predicate(a[index], index, a, b)) {\n      aOut.push(a[index]);\n    } else {\n      bOut.push(a[index]);\n    }\n  }\n  return [aOut, bOut];\n}\n\n// can be invoked on a style rule to subset its selectors (with reverse mirroring)\nfunction filterSelectors (predicate) {\n  if (this._other) {\n    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);\n    this.selectors = a;\n    this._other.selectors = b;\n  } else {\n    this.selectors = this.selectors.filter(predicate);\n  }\n}\n","import chalk from 'chalk';\n\nconst LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];\n\nexport const defaultLogger = {\n  trace(msg) {\n    console.trace(msg);\n  },\n\n  debug(msg) {\n    console.debug(msg);\n  },\n\n  warn(msg) {\n    console.warn(chalk.yellow(msg));\n  },\n\n  error(msg) {\n    console.error(chalk.bold.red(msg));\n  },\n\n  info(msg) {\n    console.info(chalk.bold.blue(msg));\n  },\n\n  silent() {}\n};\n\nexport function createLogger(logLevel) {\n  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);\n\n  return LOG_LEVELS.reduce((logger, type, index) => {\n    if (index >= logLevelIdx) {\n      logger[type] = defaultLogger[type];\n    } else {\n      logger[type] = defaultLogger.silent;\n    }\n    return logger;\n  }, {});\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { createDocument, serializeDocument } from './dom';\nimport {\n  parseStylesheet,\n  serializeStylesheet,\n  walkStyleRules,\n  walkStyleRulesWithReverseMirror,\n  markOnly,\n  applyMarkedSelectors\n} from './css';\nimport { createLogger } from './util';\n\n/**\n * The mechanism to use for lazy-loading stylesheets.\n * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).\n *\n * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.\n * - **\"body\":** Move all external stylesheet links to the end of the document.\n * - **\"media\":** Load stylesheets asynchronously by adding `media=\"not x\"` and removing once loaded. <kbd>JS</kbd>\n * - **\"swap\":** Convert stylesheet links to preloads that swap to `rel=\"stylesheet\"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>\n * - **\"swap-high\":** Use `<link rel=\"alternate stylesheet preload\">` and swap to `rel=\"stylesheet\"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>\n * - **\"js\":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>\n * - **\"js-lazy\":** Like `\"js\"`, but the stylesheet is disabled until fully loaded.\n * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy\n * @public\n */\n\n/**\n * Controls which keyframes rules are inlined.\n *\n * - **\"critical\":** _(default)_ inline keyframes rules that are used by the critical CSS.\n * - **\"all\":** Inline all keyframes rules.\n * - **\"none\":** Remove all keyframes rules.\n * @typedef {('critical'|'all'|'none')} KeyframeStrategy\n * @private\n * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_\n */\n\n/**\n * Controls log level of the plugin. Specifies the level the logger should use. A logger will\n * not produce output for any log level beneath the specified level. Available levels and order\n * are:\n *\n * - **\"info\"** _(default)_\n * - **\"warn\"**\n * - **\"error\"**\n * - **\"trace\"**\n * - **\"debug\"**\n * - **\"silent\"**\n * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel\n * @public\n */\n\n/**\n * Custom logger interface:\n * @typedef {object} Logger\n * @public\n * @property {function(String)} trace - Prints a trace message\n * @property {function(String)} debug - Prints a debug message\n * @property {function(String)} info - Prints an information message\n * @property {function(String)} warn - Prints a warning message\n * @property {function(String)} error - Prints an error message\n */\n\n/**\n * All optional. Pass them to `new Critters({ ... })`.\n * @public\n * @typedef Options\n * @property {String} path     Base path location of the CSS files _(default: `''`)_\n * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_\n * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_\n * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_\n * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_\n * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_\n * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_\n * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.\n * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use\n * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies\n * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_\n * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_\n * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`\n *  - Values:\n *  - `true` to inline critical font-face rules and preload the fonts\n *  - `false` to don't inline any font-face rules and don't preload fonts\n * @property {String} keyframes     Controls which keyframes rules are inlined.\n *  - Values:\n *  - `\"critical\"`: _(default)_ inline keyframes rules used by the critical CSS\n *  - `\"all\"` inline all keyframes rules\n *  - `\"none\"` remove all keyframes rules\n * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_\n * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `\"info\"`)_\n * @property {object} logger        Provide a custom logger interface {@link Logger logger}\n */\n\nexport default class Critters {\n  /** @private */\n  constructor(options) {\n    this.options = Object.assign(\n      {\n        logLevel: 'info',\n        path: '',\n        publicPath: '',\n        reduceInlineStyles: true,\n        pruneSource: false,\n        additionalStylesheets: []\n      },\n      options || {}\n    );\n\n    this.urlFilter = this.options.filter;\n    if (this.urlFilter instanceof RegExp) {\n      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);\n    }\n\n    this.logger = this.options.logger || createLogger(this.options.logLevel);\n  }\n\n  /**\n   * Read the contents of a file from the specified filesystem or disk\n   */\n  readFile(filename) {\n    const fs = this.fs;\n    return new Promise((resolve, reject) => {\n      const callback = (err, data) => {\n        if (err) reject(err);\n        else resolve(data);\n      };\n      if (fs && fs.readFile) {\n        fs.readFile(filename, callback);\n      } else {\n        require('fs').readFile(filename, 'utf8', callback);\n      }\n    });\n  }\n\n  /**\n   * Apply critical CSS processing to the html\n   */\n  async process(html) {\n    const start = process.hrtime.bigint();\n\n    // Parse the generated HTML in a DOM we can mutate\n    const document = createDocument(html);\n\n    if (this.options.additionalStylesheets.length > 0) {\n      this.embedAdditionalStylesheet(document);\n    }\n\n    // `external:false` skips processing of external sheets\n    if (this.options.external !== false) {\n      const externalSheets = [].slice.call(\n        document.querySelectorAll('link[rel=\"stylesheet\"]')\n      );\n\n      await Promise.all(\n        externalSheets.map((link) => this.embedLinkedStylesheet(link, document))\n      );\n    }\n\n    // go through all the style tags in the document and reduce them to only critical CSS\n    const styles = this.getAffectedStyleTags(document);\n\n    await Promise.all(\n      styles.map((style) => this.processStyle(style, document))\n    );\n\n    if (this.options.mergeStylesheets !== false && styles.length !== 0) {\n      await this.mergeStylesheets(document);\n    }\n\n    // serialize the document back to HTML and we're done\n    const output = serializeDocument(document);\n    const end = process.hrtime.bigint();\n    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);\n    return output;\n  }\n\n  /**\n   * Get the style tags that need processing\n   */\n  getAffectedStyleTags(document) {\n    const styles = [].slice.call(document.querySelectorAll('style'));\n\n    // `inline:false` skips processing of inline stylesheets\n    if (this.options.reduceInlineStyles === false) {\n      return styles.filter((style) => style.$$external);\n    }\n    return styles;\n  }\n\n  async mergeStylesheets(document) {\n    const styles = this.getAffectedStyleTags(document);\n    if (styles.length === 0) {\n      this.logger.warn(\n        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'\n      );\n      return;\n    }\n    const first = styles[0];\n    let sheet = first.textContent;\n\n    for (let i = 1; i < styles.length; i++) {\n      const node = styles[i];\n      sheet += node.textContent;\n      node.remove();\n    }\n\n    first.textContent = sheet;\n  }\n\n  /**\n   * Given href, find the corresponding CSS asset\n   */\n  async getCssAsset(href) {\n    const outputPath = this.options.path;\n    const publicPath = this.options.publicPath;\n\n    // CHECK - the output path\n    // path on disk (with output.publicPath removed)\n    let normalizedPath = href.replace(/^\\//, '');\n    const pathPrefix = (publicPath || '').replace(/(^\\/|\\/$)/g, '') + '/';\n    if (normalizedPath.indexOf(pathPrefix) === 0) {\n      normalizedPath = normalizedPath\n        .substring(pathPrefix.length)\n        .replace(/^\\//, '');\n    }\n    const filename = path.resolve(outputPath, normalizedPath);\n\n    let sheet;\n\n    try {\n      sheet = await this.readFile(filename);\n    } catch (e) {\n      this.logger.warn(`Unable to locate stylesheet: ${filename}`);\n    }\n\n    return sheet;\n  }\n\n  checkInlineThreshold(link, style, sheet) {\n    if (\n      this.options.inlineThreshold &&\n      sheet.length < this.options.inlineThreshold\n    ) {\n      const href = style.$$name;\n      style.$$reduce = false;\n      this.logger.info(\n        `\\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\\u001b[39m`\n      );\n      link.remove();\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)\n   */\n  async embedAdditionalStylesheet(document) {\n    const styleSheetsIncluded = [];\n\n    const sources = await Promise.all(\n      this.options.additionalStylesheets.map((cssFile) => {\n        if (styleSheetsIncluded.includes(cssFile)) {\n          return;\n        }\n        styleSheetsIncluded.push(cssFile);\n        const style = document.createElement('style');\n        style.$$external = true;\n        return this.getCssAsset(cssFile, style).then((sheet) => [sheet, style]);\n      })\n    );\n\n    sources.forEach(([sheet, style]) => {\n      if (!sheet) return;\n      style.textContent = sheet;\n      document.head.appendChild(style);\n    });\n  }\n\n  /**\n   * Inline the target stylesheet referred to by a <link rel=\"stylesheet\"> (assuming it passes `options.filter`)\n   */\n  async embedLinkedStylesheet(link, document) {\n    const href = link.getAttribute('href');\n    const media = link.getAttribute('media');\n\n    const preloadMode = this.options.preload;\n\n    // skip filtered resources, or network resources if no filter is provided\n    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\\.css$/)) {\n      return Promise.resolve();\n    }\n\n    // the reduced critical CSS gets injected into a new <style> tag\n    const style = document.createElement('style');\n    style.$$external = true;\n    const sheet = await this.getCssAsset(href, style);\n\n    if (!sheet) {\n      return;\n    }\n\n    style.textContent = sheet;\n    style.$$name = href;\n    style.$$links = [link];\n    link.parentNode.insertBefore(style, link);\n\n    if (this.checkInlineThreshold(link, style, sheet)) {\n      return;\n    }\n\n    // CSS loader is only injected for the first sheet, then this becomes an empty string\n    let cssLoaderPreamble =\n      \"function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}\";\n    const lazy = preloadMode === 'js-lazy';\n    if (lazy) {\n      cssLoaderPreamble = cssLoaderPreamble.replace(\n        'l.href',\n        \"l.media='print';l.onload=function(){l.media=m};l.href\"\n      );\n    }\n\n    // Allow disabling any mutation of the stylesheet link:\n    if (preloadMode === false) return;\n\n    let noscriptFallback = false;\n\n    if (preloadMode === 'body') {\n      document.body.appendChild(link);\n    } else {\n      link.setAttribute('rel', 'preload');\n      link.setAttribute('as', 'style');\n      if (preloadMode === 'js' || preloadMode === 'js-lazy') {\n        const script = document.createElement('script');\n        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${\n          lazy ? ',' + JSON.stringify(media || 'all') : ''\n        })`;\n        // script.appendChild(document.createTextNode(js));\n        script.textContent = js;\n        link.parentNode.insertBefore(script, link.nextSibling);\n        style.$$links.push(script);\n        cssLoaderPreamble = '';\n        noscriptFallback = true;\n      } else if (preloadMode === 'media') {\n        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26\n        link.setAttribute('rel', 'stylesheet');\n        link.removeAttribute('as');\n        link.setAttribute('media', 'print');\n        link.setAttribute('onload', `this.media='${media || 'all'}'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap-high') {\n        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html\n        link.setAttribute('rel', 'alternate stylesheet preload');\n        link.setAttribute('title', 'styles');\n        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap') {\n        link.setAttribute('onload', \"this.rel='stylesheet'\");\n        noscriptFallback = true;\n      } else {\n        const bodyLink = document.createElement('link');\n        bodyLink.setAttribute('rel', 'stylesheet');\n        if (media) bodyLink.setAttribute('media', media);\n        bodyLink.setAttribute('href', href);\n        document.body.appendChild(bodyLink);\n        style.$$links.push(bodyLink);\n      }\n    }\n\n    if (this.options.noscriptFallback !== false && noscriptFallback) {\n      const noscript = document.createElement('noscript');\n      const noscriptLink = document.createElement('link');\n      noscriptLink.setAttribute('rel', 'stylesheet');\n      noscriptLink.setAttribute('href', href);\n      if (media) noscriptLink.setAttribute('media', media);\n      noscript.appendChild(noscriptLink);\n      link.parentNode.insertBefore(noscript, link.nextSibling);\n      style.$$links.push(noscript);\n    }\n  }\n\n  /**\n   * Prune the source CSS files\n   */\n  pruneSource(style, before, sheetInverse) {\n    // if external stylesheet would be below minimum size, just inline everything\n    const minSize = this.options.minimumExternalSize;\n    const name = style.$$name;\n    if (minSize && sheetInverse.length < minSize) {\n      this.logger.info(\n        `\\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\\u001b[39m`\n      );\n      style.textContent = before;\n      // remove any associated external resources/loaders:\n      if (style.$$links) {\n        for (const link of style.$$links) {\n          const parent = link.parentNode;\n          if (parent) parent.removeChild(link);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.\n   */\n  async processStyle(style, document) {\n    if (style.$$reduce === false) return;\n\n    const name = style.$$name ? style.$$name.replace(/^\\//, '') : 'inline CSS';\n    const options = this.options;\n    // const document = style.ownerDocument;\n    const head = document.querySelector('head');\n    let keyframesMode = options.keyframes || 'critical';\n    // we also accept a boolean value for options.keyframes\n    if (keyframesMode === true) keyframesMode = 'all';\n    if (keyframesMode === false) keyframesMode = 'none';\n\n    let sheet = style.textContent;\n\n    // store a reference to the previous serialized stylesheet for reporting stats\n    const before = sheet;\n\n    // Skip empty stylesheets\n    if (!sheet) return;\n\n    const ast = parseStylesheet(sheet);\n    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;\n\n    // a string to search for font names (very loose)\n    let criticalFonts = '';\n\n    const failedSelectors = [];\n\n    const criticalKeyframeNames = [];\n\n    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.\n    // This first pass is also used to collect font and keyframe usage used in the second pass.\n    walkStyleRules(\n      ast,\n      markOnly((rule) => {\n        if (rule.type === 'rule') {\n          // Filter the selector list down to only those match\n          rule.filterSelectors((sel) => {\n            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.\n            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.\n            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {\n              return true;\n            }\n            sel = sel\n              .replace(/(?<!\\\\)::?[a-z-]+(?![a-z-(])/gi, '')\n              .replace(/::?not\\(\\s*\\)/g, '')\n              .trim();\n            if (!sel) return false;\n\n            try {\n              return document.querySelector(sel) != null;\n            } catch (e) {\n              failedSelectors.push(sel + ' -> ' + e.message);\n              return false;\n            }\n          });\n          // If there are no matched selectors, remove the rule:\n          if (rule.selectors.length === 0) {\n            return false;\n          }\n\n          if (rule.declarations) {\n            for (let i = 0; i < rule.declarations.length; i++) {\n              const decl = rule.declarations[i];\n\n              // detect used fonts\n              if (decl.property && decl.property.match(/\\bfont(-family)?\\b/i)) {\n                criticalFonts += ' ' + decl.value;\n              }\n\n              // detect used keyframes\n              if (\n                decl.property === 'animation' ||\n                decl.property === 'animation-name'\n              ) {\n                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.\n                const names = decl.value.split(/\\s+/);\n                for (let j = 0; j < names.length; j++) {\n                  const name = names[j].trim();\n                  if (name) criticalKeyframeNames.push(name);\n                }\n              }\n            }\n          }\n        }\n\n        // keep font rules, they're handled in the second pass:\n        if (rule.type === 'font-face') return;\n\n        // If there are no remaining rules, remove the whole rule:\n        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);\n        return !rules || rules.length !== 0;\n      })\n    );\n\n    if (failedSelectors.length !== 0) {\n      this.logger.warn(\n        `${\n          failedSelectors.length\n        } rules skipped due to selector errors:\\n  ${failedSelectors.join(\n          '\\n  '\n        )}`\n      );\n    }\n\n    const shouldPreloadFonts =\n      options.fonts === true || options.preloadFonts === true;\n    const shouldInlineFonts =\n      options.fonts !== false && options.inlineFonts === true;\n\n    const preloadedFonts = [];\n    // Second pass, using data picked up from the first\n    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {\n      // remove any rules marked in the first pass\n      if (rule.$$remove === true) return false;\n\n      applyMarkedSelectors(rule);\n\n      // prune @keyframes rules\n      if (rule.type === 'keyframes') {\n        if (keyframesMode === 'none') return false;\n        if (keyframesMode === 'all') return true;\n        return criticalKeyframeNames.indexOf(rule.name) !== -1;\n      }\n\n      // prune @font-face rules\n      if (rule.type === 'font-face') {\n        let family, src;\n        for (let i = 0; i < rule.declarations.length; i++) {\n          const decl = rule.declarations[i];\n          if (decl.property === 'src') {\n            // @todo parse this properly and generate multiple preloads with type=\"font/woff2\" etc\n            src = (decl.value.match(/url\\s*\\(\\s*(['\"]?)(.+?)\\1\\s*\\)/) || [])[2];\n          } else if (decl.property === 'font-family') {\n            family = decl.value;\n          }\n        }\n\n        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {\n          preloadedFonts.push(src);\n          const preload = document.createElement('link');\n          preload.setAttribute('rel', 'preload');\n          preload.setAttribute('as', 'font');\n          preload.setAttribute('crossorigin', 'anonymous');\n          preload.setAttribute('href', src.trim());\n          head.appendChild(preload);\n        }\n\n        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:\n        if (\n          !family ||\n          !src ||\n          criticalFonts.indexOf(family) === -1 ||\n          !shouldInlineFonts\n        ) {\n          return false;\n        }\n      }\n    });\n\n    sheet = serializeStylesheet(ast, {\n      compress: this.options.compress !== false\n    }).trim();\n\n    // If all rules were removed, get rid of the style element entirely\n    if (sheet.trim().length === 0) {\n      if (style.parentNode) {\n        style.remove();\n      }\n      return;\n    }\n\n    let afterText = '';\n    let styleInlinedCompletely = false;\n    if (options.pruneSource) {\n      const sheetInverse = serializeStylesheet(astInverse, {\n        compress: this.options.compress !== false\n      });\n\n      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);\n\n      if (styleInlinedCompletely) {\n        const percent = (sheetInverse.length / before.length) * 100;\n        afterText = `, reducing non-inlined size ${\n          percent | 0\n        }% to ${prettyBytes(sheetInverse.length)}`;\n      }\n    }\n\n    // replace the inline stylesheet with its critical'd counterpart\n    if (!styleInlinedCompletely) {\n      style.textContent = sheet;\n    }\n\n    // output stats\n    const percent = ((sheet.length / before.length) * 100) | 0;\n    this.logger.info(\n      '\\u001b[32mInlined ' +\n        prettyBytes(sheet.length) +\n        ' (' +\n        percent +\n        '% of original ' +\n        prettyBytes(before.length) +\n        ') of ' +\n        name +\n        afterText +\n        '.\\u001b[39m'\n    );\n  }\n}\n"],"names":["this","require$$0","require$$1","require$$2","require$$3","decode_1","encode","encode_1","foreignNames","entities","ElementType","getOuterHTML","isTag","require$$4","require$$5","BaseFuncs","compile","parse","DomUtils","falseFunc","getText","hasAttrib","trueFunc","getNCheck","getParent","getChildren","getSiblings","getName","attributes","procedure","sortRules","Rules","filters","Pseudos","existsOne","findOne","findAll","compileUnsafe","compileToken","treeAdapter","require","PARSE5_OPTS","createDocument","html","document","parse5","defineProperties","DocumentExtensions","scratch","createElement","$$Node","constructor","elementProto","Object","getPrototypeOf","ElementExtensions","ownerDocument","serializeDocument","serialize","nodeName","get","tagName","toUpperCase","id","reflectedProperty","className","insertBefore","child","referenceNode","appendChild","removeChild","detachNode","remove","textContent","set","text","children","insertText","setAttribute","name","value","attribs","removeAttribute","getAttribute","hasAttribute","getAttributeNode","specified","nodeType","contentType","documentElement","childNodes","filter","String","toLowerCase","compatMode","quirks","getDocumentMode","body","querySelector","createTextNode","Node","type","data","parent","prev","next","sel","select","selectOne","querySelectorAll","obj","properties","i","defineProperty","attributeName","node","Array","isArray","map","join","isElementNode","isTextNode","parseStylesheet","stylesheet","css","serializeStylesheet","ast","options","stringify","markOnly","predicate","rule","selectors","$$remove","$$markedSelectors","_other","applyMarkedSelectors","walkStyleRules","iterator","rules","undefined","filterSelectors","walkStyleRulesWithReverseMirror","node2","splitFilter","index","rules2","rule2","a","b","aOut","bOut","length","push","LOG_LEVELS","defaultLogger","trace","msg","console","debug","warn","chalk","yellow","error","bold","red","info","blue","silent","createLogger","logLevel","logLevelIdx","indexOf","reduce","logger","recover","result","e","then","Critters","assign","path","publicPath","reduceInlineStyles","pruneSource","additionalStylesheets","urlFilter","RegExp","test","bind","readFile","filename","fs","Promise","resolve","reject","callback","err","process","styles","getAffectedStyleTags","all","style","processStyle","output","end","hrtime","bigint","parseFloat","start","mergeStylesheets","embedAdditionalStylesheet","external","externalSheets","slice","call","link","embedLinkedStylesheet","$$external","first","sheet","getCssAsset","href","outputPath","normalizedPath","replace","pathPrefix","substring","checkInlineThreshold","inlineThreshold","$$name","$$reduce","styleSheetsIncluded","cssFile","includes","sources","forEach","head","media","preloadMode","preload","match","$$links","parentNode","cssLoaderPreamble","lazy","noscriptFallback","script","js","JSON","nextSibling","bodyLink","noscript","noscriptLink","before","sheetInverse","minSize","minimumExternalSize","keyframesMode","keyframes","astInverse","criticalFonts","failedSelectors","criticalKeyframeNames","trim","message","declarations","decl","property","names","split","j","shouldPreloadFonts","fonts","preloadFonts","shouldInlineFonts","inlineFonts","preloadedFonts","family","src","compress","afterText","styleInlinedCompletely","percent","prettyBytes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,kBAAc,GAAG;AACjB,CAAC,IAAI,EAAE,MAAM;AACb,CAAC,SAAS,EAAE,WAAW;AACvB,CAAC,OAAO,EAAE,SAAS;AACnB,CAAC,MAAM,EAAE,QAAQ;AACjB,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,GAAG,EAAE,KAAK;AACX,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,OAAO,EAAE,SAAS;AACnB;AACA,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;AACtB,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAChF,EAAE;AACF,CAAC;;;ACdD,AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,CAAC,IAAI,EAAE;AACrB,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,KAAK;AAC/B,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ;AAC9B,QAAQ,IAAI,CAAC,IAAI,KAAK,OAAO,cAAc;AAC3C,CAAC;AACD,aAAa,GAAG,KAAK,CAAC;AACtB;AACA,YAAY,GAAG,MAAM,YAAY;AACjC,iBAAiB,GAAG,WAAW,iBAAiB;AAChD,eAAe,GAAG,SAAS,eAAe;AAC1C,cAAc,GAAG,QAAQ,cAAc;AACvC,aAAa,GAAG,OAAO,aAAa;AACpC,WAAW,GAAG,KAAK,WAAW;AAC9B,aAAa,GAAG,OAAO,aAAa;AACpC,eAAe,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
Index: trip-planner-front/node_modules/critters/dist/critters.mjs
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.mjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/dist/critters.mjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,1049 @@
+import path from 'path';
+import prettyBytes from 'pretty-bytes';
+import parse5 from 'parse5';
+import { selectOne, selectAll } from 'css-select';
+import treeAdapter from 'parse5-htmlparser2-tree-adapter';
+import { parse, stringify } from 'postcss';
+import chalk from 'chalk';
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+const PARSE5_OPTS = {
+  treeAdapter
+};
+/**
+ * Parse HTML into a mutable, serializable DOM Document.
+ * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
+ * @param {String} html   HTML to parse into a Document instance
+ */
+
+function createDocument(html) {
+  const document =
+  /** @type {HTMLDocument} */
+  parse5.parse(html, PARSE5_OPTS);
+  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
+
+  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
+
+  document.$$Node = scratch.constructor;
+  const elementProto = Object.getPrototypeOf(scratch);
+  defineProperties(elementProto, ElementExtensions);
+  elementProto.ownerDocument = document;
+  return document;
+}
+/**
+ * Serialize a Document to an HTML String
+ * @param {HTMLDocument} document   A Document, such as one created via `createDocument()`
+ */
+
+function serializeDocument(document) {
+  return parse5.serialize(document, PARSE5_OPTS);
+}
+/** @typedef {treeAdapter.Document & typeof ElementExtensions} HTMLDocument */
+
+/**
+ * Methods and descriptors to mix into Element.prototype
+ * @private
+ */
+
+const ElementExtensions = {
+  /** @extends treeAdapter.Element.prototype */
+  nodeName: {
+    get() {
+      return this.tagName.toUpperCase();
+    }
+
+  },
+  id: reflectedProperty('id'),
+  className: reflectedProperty('class'),
+
+  insertBefore(child, referenceNode) {
+    if (!referenceNode) return this.appendChild(child);
+    treeAdapter.insertBefore(this, child, referenceNode);
+    return child;
+  },
+
+  appendChild(child) {
+    treeAdapter.appendChild(this, child);
+    return child;
+  },
+
+  removeChild(child) {
+    treeAdapter.detachNode(child);
+  },
+
+  remove() {
+    treeAdapter.detachNode(this);
+  },
+
+  textContent: {
+    get() {
+      return getText(this);
+    },
+
+    set(text) {
+      this.children = [];
+      treeAdapter.insertText(this, text);
+    }
+
+  },
+
+  setAttribute(name, value) {
+    if (this.attribs == null) this.attribs = {};
+    if (value == null) value = '';
+    this.attribs[name] = value;
+  },
+
+  removeAttribute(name) {
+    if (this.attribs != null) {
+      delete this.attribs[name];
+    }
+  },
+
+  getAttribute(name) {
+    return this.attribs != null && this.attribs[name];
+  },
+
+  hasAttribute(name) {
+    return this.attribs != null && this.attribs[name] != null;
+  },
+
+  getAttributeNode(name) {
+    const value = this.getAttribute(name);
+    if (value != null) return {
+      specified: true,
+      value
+    };
+  }
+
+};
+/**
+ * Methods and descriptors to mix into the global document instance
+ * @private
+ */
+
+const DocumentExtensions = {
+  /** @extends treeAdapter.Document.prototype */
+  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
+  // TODO: verify if these are needed for css-select
+  nodeType: {
+    get() {
+      return 9;
+    }
+
+  },
+  contentType: {
+    get() {
+      return 'text/html';
+    }
+
+  },
+  nodeName: {
+    get() {
+      return '#document';
+    }
+
+  },
+  documentElement: {
+    get() {
+      // Find the first <html> element within the document
+      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
+    }
+
+  },
+  compatMode: {
+    get() {
+      const compatMode = {
+        'no-quirks': 'CSS1Compat',
+        quirks: 'BackCompat',
+        'limited-quirks': 'CSS1Compat'
+      };
+      return compatMode[treeAdapter.getDocumentMode(this)];
+    }
+
+  },
+  body: {
+    get() {
+      return this.querySelector('body');
+    }
+
+  },
+
+  createElement(name) {
+    return treeAdapter.createElement(name, null, []);
+  },
+
+  createTextNode(text) {
+    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
+    const Node = this.$$Node;
+    return new Node({
+      type: 'text',
+      data: text,
+      parent: null,
+      prev: null,
+      next: null
+    });
+  },
+
+  querySelector(sel) {
+    return selectOne(sel, this.documentElement);
+  },
+
+  querySelectorAll(sel) {
+    if (sel === ':root') {
+      return this;
+    }
+
+    return selectAll(sel, this.documentElement);
+  }
+
+};
+/**
+ * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
+ * @private
+ */
+
+function defineProperties(obj, properties) {
+  for (const i in properties) {
+    const value = properties[i];
+    Object.defineProperty(obj, i, typeof value === 'function' ? {
+      value
+    } : value);
+  }
+}
+/**
+ * Create a property descriptor defining a getter/setter pair alias for a named attribute.
+ * @private
+ */
+
+
+function reflectedProperty(attributeName) {
+  return {
+    get() {
+      return this.getAttribute(attributeName);
+    },
+
+    set(value) {
+      this.setAttribute(attributeName, value);
+    }
+
+  };
+}
+/**
+ * Helper to get the text content of a node
+ * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
+ * @private
+ */
+
+
+function getText(node) {
+  if (Array.isArray(node)) return node.map(getText).join('');
+  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText(node.children);
+  if (treeAdapter.isTextNode(node)) return node.data;
+  return '';
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * Parse a textual CSS Stylesheet into a Stylesheet instance.
+ * Stylesheet is a mutable postcss AST with format similar to CSSOM.
+ * @see https://github.com/postcss/postcss/
+ * @private
+ * @param {String} stylesheet
+ * @returns {css.Stylesheet} ast
+ */
+
+function parseStylesheet(stylesheet) {
+  return parse(stylesheet);
+}
+/**
+ * Serialize a postcss Stylesheet to a String of CSS.
+ * @private
+ * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
+ * @param {Object} options              Options used by the stringify logic
+ * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
+ */
+
+function serializeStylesheet(ast, options) {
+  let cssStr = '';
+  stringify(ast, (result, node, type) => {
+    var _node$raws;
+
+    if (!options.compress) {
+      cssStr += result;
+      return;
+    } // Simple minification logic
+
+
+    if ((node == null ? void 0 : node.type) === 'comment') return;
+
+    if ((node == null ? void 0 : node.type) === 'decl') {
+      const prefix = node.prop + node.raws.between;
+      cssStr += result.replace(prefix, prefix.trim());
+      return;
+    }
+
+    if (type === 'start') {
+      if (node.type === 'rule' && node.selectors) {
+        cssStr += node.selectors.join(',') + '{';
+      } else {
+        cssStr += result.replace(/\s\{$/, '{');
+      }
+
+      return;
+    }
+
+    if (type === 'end' && result === '}' && node != null && (_node$raws = node.raws) != null && _node$raws.semicolon) {
+      cssStr = cssStr.slice(0, -1);
+    }
+
+    cssStr += result.trim();
+  });
+  return cssStr;
+}
+/**
+ * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
+ * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
+ * @private
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ * @returns {(rule) => void} nonDestructiveIterator
+ */
+
+function markOnly(predicate) {
+  return rule => {
+    const sel = rule.selectors;
+
+    if (predicate(rule) === false) {
+      rule.$$remove = true;
+    }
+
+    rule.$$markedSelectors = rule.selectors;
+
+    if (rule._other) {
+      rule._other.$$markedSelectors = rule._other.selectors;
+    }
+
+    rule.selectors = sel;
+  };
+}
+/**
+ * Apply filtered selectors to a rule from a previous markOnly run.
+ * @private
+ * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
+ */
+
+function applyMarkedSelectors(rule) {
+  if (rule.$$markedSelectors) {
+    rule.selectors = rule.$$markedSelectors;
+  }
+
+  if (rule._other) {
+    applyMarkedSelectors(rule._other);
+  }
+}
+/**
+ * Recursively walk all rules in a stylesheet.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
+ */
+
+function walkStyleRules(node, iterator) {
+  node.nodes = node.nodes.filter(rule => {
+    if (hasNestedRules(rule)) {
+      walkStyleRules(rule, iterator);
+    }
+
+    rule._other = undefined;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+}
+/**
+ * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
+ * @private
+ * @param {css.Rule} node       A Stylesheet or Rule to descend into.
+ * @param {css.Rule} node2      A second tree identical to `node`
+ * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
+ */
+
+function walkStyleRulesWithReverseMirror(node, node2, iterator) {
+  if (node2 === null) return walkStyleRules(node, iterator);
+  [node.nodes, node2.nodes] = splitFilter(node.nodes, node2.nodes, (rule, index, rules, rules2) => {
+    const rule2 = rules2[index];
+
+    if (hasNestedRules(rule)) {
+      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
+    }
+
+    rule._other = rule2;
+    rule.filterSelectors = filterSelectors;
+    return iterator(rule) !== false;
+  });
+} // Checks if a node has nested rules, like @media
+// @keyframes are an exception since they are evaluated as a whole
+
+function hasNestedRules(rule) {
+  return rule.nodes && rule.nodes.length && rule.nodes.some(n => n.type === 'rule' || n.type === 'atrule') && rule.name !== 'keyframes';
+} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
+// This is just a quicker version of generating the compliment of the set returned from a filter operation.
+
+
+function splitFilter(a, b, predicate) {
+  const aOut = [];
+  const bOut = [];
+
+  for (let index = 0; index < a.length; index++) {
+    if (predicate(a[index], index, a, b)) {
+      aOut.push(a[index]);
+    } else {
+      bOut.push(a[index]);
+    }
+  }
+
+  return [aOut, bOut];
+} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
+
+
+function filterSelectors(predicate) {
+  if (this._other) {
+    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
+    this.selectors = a;
+    this._other.selectors = b;
+  } else {
+    this.selectors = this.selectors.filter(predicate);
+  }
+}
+
+const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
+const defaultLogger = {
+  trace(msg) {
+    console.trace(msg);
+  },
+
+  debug(msg) {
+    console.debug(msg);
+  },
+
+  warn(msg) {
+    console.warn(chalk.yellow(msg));
+  },
+
+  error(msg) {
+    console.error(chalk.bold.red(msg));
+  },
+
+  info(msg) {
+    console.info(chalk.bold.blue(msg));
+  },
+
+  silent() {}
+
+};
+function createLogger(logLevel) {
+  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
+  return LOG_LEVELS.reduce((logger, type, index) => {
+    if (index >= logLevelIdx) {
+      logger[type] = defaultLogger[type];
+    } else {
+      logger[type] = defaultLogger.silent;
+    }
+
+    return logger;
+  }, {});
+}
+
+/**
+ * Copyright 2018 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * The mechanism to use for lazy-loading stylesheets.
+ *
+ * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
+ *
+ * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
+ * - **"body":** Move all external stylesheet links to the end of the document.
+ * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. <kbd>JS</kbd>
+ * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>
+ * - **"swap-high":** Use `<link rel="alternate stylesheet preload">` and swap to `rel="stylesheet"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>
+ * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>
+ * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
+ * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy
+ * @public
+ */
+
+/**
+ * Controls which keyframes rules are inlined.
+ *
+ * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
+ * - **"all":** Inline all keyframes rules.
+ * - **"none":** Remove all keyframes rules.
+ * @typedef {('critical'|'all'|'none')} KeyframeStrategy
+ * @private
+ * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
+ */
+
+/**
+ * Controls log level of the plugin. Specifies the level the logger should use. A logger will
+ * not produce output for any log level beneath the specified level. Available levels and order
+ * are:
+ *
+ * - **"info"** _(default)_
+ * - **"warn"**
+ * - **"error"**
+ * - **"trace"**
+ * - **"debug"**
+ * - **"silent"**
+ * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
+ * @public
+ */
+
+/**
+ * Custom logger interface:
+ * @typedef {object} Logger
+ * @public
+ * @property {function(String)} trace - Prints a trace message
+ * @property {function(String)} debug - Prints a debug message
+ * @property {function(String)} info - Prints an information message
+ * @property {function(String)} warn - Prints a warning message
+ * @property {function(String)} error - Prints an error message
+ */
+
+/**
+ * All optional. Pass them to `new Critters({ ... })`.
+ * @public
+ * @typedef Options
+ * @property {String} path     Base path location of the CSS files _(default: `''`)_
+ * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
+ * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
+ * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
+ * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
+ * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
+ * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
+ * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
+ * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
+ * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
+ * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
+ * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
+ * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
+ *  - Values:
+ *  - `true` to inline critical font-face rules and preload the fonts
+ *  - `false` to don't inline any font-face rules and don't preload fonts
+ * @property {String} keyframes     Controls which keyframes rules are inlined.
+ *  - Values:
+ *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
+ *  - `"all"` inline all keyframes rules
+ *  - `"none"` remove all keyframes rules
+ * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
+ * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
+ * @property {object} logger        Provide a custom logger interface {@link Logger logger}
+ */
+
+class Critters {
+  /** @private */
+  constructor(options) {
+    this.options = Object.assign({
+      logLevel: 'info',
+      path: '',
+      publicPath: '',
+      reduceInlineStyles: true,
+      pruneSource: false,
+      additionalStylesheets: []
+    }, options || {});
+    this.urlFilter = this.options.filter;
+
+    if (this.urlFilter instanceof RegExp) {
+      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
+    }
+
+    this.logger = this.options.logger || createLogger(this.options.logLevel);
+  }
+  /**
+   * Read the contents of a file from the specified filesystem or disk
+   */
+
+
+  readFile(filename) {
+    const fs = this.fs;
+    return new Promise((resolve, reject) => {
+      const callback = (err, data) => {
+        if (err) reject(err);else resolve(data);
+      };
+
+      if (fs && fs.readFile) {
+        fs.readFile(filename, callback);
+      } else {
+        require('fs').readFile(filename, 'utf8', callback);
+      }
+    });
+  }
+  /**
+   * Apply critical CSS processing to the html
+   */
+
+
+  async process(html) {
+    const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
+
+    const document = createDocument(html);
+
+    if (this.options.additionalStylesheets.length > 0) {
+      this.embedAdditionalStylesheet(document);
+    } // `external:false` skips processing of external sheets
+
+
+    if (this.options.external !== false) {
+      const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
+      await Promise.all(externalSheets.map(link => this.embedLinkedStylesheet(link, document)));
+    } // go through all the style tags in the document and reduce them to only critical CSS
+
+
+    const styles = this.getAffectedStyleTags(document);
+    await Promise.all(styles.map(style => this.processStyle(style, document)));
+
+    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
+      await this.mergeStylesheets(document);
+    } // serialize the document back to HTML and we're done
+
+
+    const output = serializeDocument(document);
+    const end = process.hrtime.bigint();
+    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
+    return output;
+  }
+  /**
+   * Get the style tags that need processing
+   */
+
+
+  getAffectedStyleTags(document) {
+    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
+
+    if (this.options.reduceInlineStyles === false) {
+      return styles.filter(style => style.$$external);
+    }
+
+    return styles;
+  }
+
+  async mergeStylesheets(document) {
+    const styles = this.getAffectedStyleTags(document);
+
+    if (styles.length === 0) {
+      this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
+      return;
+    }
+
+    const first = styles[0];
+    let sheet = first.textContent;
+
+    for (let i = 1; i < styles.length; i++) {
+      const node = styles[i];
+      sheet += node.textContent;
+      node.remove();
+    }
+
+    first.textContent = sheet;
+  }
+  /**
+   * Given href, find the corresponding CSS asset
+   */
+
+
+  async getCssAsset(href) {
+    const outputPath = this.options.path;
+    const publicPath = this.options.publicPath; // CHECK - the output path
+    // path on disk (with output.publicPath removed)
+
+    let normalizedPath = href.replace(/^\//, '');
+    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
+
+    if (normalizedPath.indexOf(pathPrefix) === 0) {
+      normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
+    } // Ignore remote stylesheets
+
+
+    if (/^https:\/\//.test(normalizedPath) || href.startsWith('//')) {
+      return undefined;
+    }
+
+    const filename = path.resolve(outputPath, normalizedPath);
+    let sheet;
+
+    try {
+      sheet = await this.readFile(filename);
+    } catch (e) {
+      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
+    }
+
+    return sheet;
+  }
+
+  checkInlineThreshold(link, style, sheet) {
+    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
+      const href = style.$$name;
+      style.$$reduce = false;
+      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
+      link.remove();
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
+   */
+
+
+  async embedAdditionalStylesheet(document) {
+    const styleSheetsIncluded = [];
+    const sources = await Promise.all(this.options.additionalStylesheets.map(cssFile => {
+      if (styleSheetsIncluded.includes(cssFile)) {
+        return;
+      }
+
+      styleSheetsIncluded.push(cssFile);
+      const style = document.createElement('style');
+      style.$$external = true;
+      return this.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
+    }));
+    sources.forEach(([sheet, style]) => {
+      if (!sheet) return;
+      style.textContent = sheet;
+      document.head.appendChild(style);
+    });
+  }
+  /**
+   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
+   */
+
+
+  async embedLinkedStylesheet(link, document) {
+    const href = link.getAttribute('href');
+    const media = link.getAttribute('media');
+    const preloadMode = this.options.preload; // skip filtered resources, or network resources if no filter is provided
+
+    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
+      return Promise.resolve();
+    } // the reduced critical CSS gets injected into a new <style> tag
+
+
+    const style = document.createElement('style');
+    style.$$external = true;
+    const sheet = await this.getCssAsset(href, style);
+
+    if (!sheet) {
+      return;
+    }
+
+    style.textContent = sheet;
+    style.$$name = href;
+    style.$$links = [link];
+    link.parentNode.insertBefore(style, link);
+
+    if (this.checkInlineThreshold(link, style, sheet)) {
+      return;
+    } // CSS loader is only injected for the first sheet, then this becomes an empty string
+
+
+    let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
+    const lazy = preloadMode === 'js-lazy';
+
+    if (lazy) {
+      cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
+    } // Allow disabling any mutation of the stylesheet link:
+
+
+    if (preloadMode === false) return;
+    let noscriptFallback = false;
+
+    if (preloadMode === 'body') {
+      document.body.appendChild(link);
+    } else {
+      link.setAttribute('rel', 'preload');
+      link.setAttribute('as', 'style');
+
+      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
+        const script = document.createElement('script');
+        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
+
+        script.textContent = js;
+        link.parentNode.insertBefore(script, link.nextSibling);
+        style.$$links.push(script);
+        cssLoaderPreamble = '';
+        noscriptFallback = true;
+      } else if (preloadMode === 'media') {
+        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
+        link.setAttribute('rel', 'stylesheet');
+        link.removeAttribute('as');
+        link.setAttribute('media', 'print');
+        link.setAttribute('onload', `this.media='${media || 'all'}'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap-high') {
+        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
+        link.setAttribute('rel', 'alternate stylesheet preload');
+        link.setAttribute('title', 'styles');
+        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
+        noscriptFallback = true;
+      } else if (preloadMode === 'swap') {
+        link.setAttribute('onload', "this.rel='stylesheet'");
+        noscriptFallback = true;
+      } else {
+        const bodyLink = document.createElement('link');
+        bodyLink.setAttribute('rel', 'stylesheet');
+        if (media) bodyLink.setAttribute('media', media);
+        bodyLink.setAttribute('href', href);
+        document.body.appendChild(bodyLink);
+        style.$$links.push(bodyLink);
+      }
+    }
+
+    if (this.options.noscriptFallback !== false && noscriptFallback) {
+      const noscript = document.createElement('noscript');
+      const noscriptLink = document.createElement('link');
+      noscriptLink.setAttribute('rel', 'stylesheet');
+      noscriptLink.setAttribute('href', href);
+      if (media) noscriptLink.setAttribute('media', media);
+      noscript.appendChild(noscriptLink);
+      link.parentNode.insertBefore(noscript, link.nextSibling);
+      style.$$links.push(noscript);
+    }
+  }
+  /**
+   * Prune the source CSS files
+   */
+
+
+  pruneSource(style, before, sheetInverse) {
+    // if external stylesheet would be below minimum size, just inline everything
+    const minSize = this.options.minimumExternalSize;
+    const name = style.$$name;
+
+    if (minSize && sheetInverse.length < minSize) {
+      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
+      style.textContent = before; // remove any associated external resources/loaders:
+
+      if (style.$$links) {
+        for (const link of style.$$links) {
+          const parent = link.parentNode;
+          if (parent) parent.removeChild(link);
+        }
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+  /**
+   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
+   */
+
+
+  async processStyle(style, document) {
+    if (style.$$reduce === false) return;
+    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
+    const options = this.options; // const document = style.ownerDocument;
+
+    const head = document.querySelector('head');
+    let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
+
+    if (keyframesMode === true) keyframesMode = 'all';
+    if (keyframesMode === false) keyframesMode = 'none';
+    let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
+
+    const before = sheet; // Skip empty stylesheets
+
+    if (!sheet) return;
+    const ast = parseStylesheet(sheet);
+    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
+
+    let criticalFonts = '';
+    const failedSelectors = [];
+    const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
+    // This first pass is also used to collect font and keyframe usage used in the second pass.
+
+    walkStyleRules(ast, markOnly(rule => {
+      if (rule.type === 'rule') {
+        // Filter the selector list down to only those match
+        rule.filterSelectors(sel => {
+          // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
+          // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
+          if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
+            return true;
+          }
+
+          sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
+          if (!sel) return false;
+
+          try {
+            return document.querySelector(sel) != null;
+          } catch (e) {
+            failedSelectors.push(sel + ' -> ' + e.message);
+            return false;
+          }
+        }); // If there are no matched selectors, remove the rule:
+
+        if (!rule.selector) {
+          return false;
+        }
+
+        if (rule.nodes) {
+          for (let i = 0; i < rule.nodes.length; i++) {
+            const decl = rule.nodes[i]; // detect used fonts
+
+            if (decl.prop && decl.prop.match(/\bfont(-family)?\b/i)) {
+              criticalFonts += ' ' + decl.value;
+            } // detect used keyframes
+
+
+            if (decl.prop === 'animation' || decl.prop === 'animation-name') {
+              // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
+              const names = decl.value.split(/\s+/);
+
+              for (let j = 0; j < names.length; j++) {
+                const name = names[j].trim();
+                if (name) criticalKeyframeNames.push(name);
+              }
+            }
+          }
+        }
+      } // keep font rules, they're handled in the second pass:
+
+
+      if (rule.type === 'atrule' && rule.name === 'font-face') return; // If there are no remaining rules, remove the whole rule:
+
+      const rules = rule.nodes && rule.nodes.filter(rule => !rule.$$remove);
+      return !rules || rules.length !== 0;
+    }));
+
+    if (failedSelectors.length !== 0) {
+      this.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
+    }
+
+    const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
+    const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
+    const preloadedFonts = []; // Second pass, using data picked up from the first
+
+    walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
+      // remove any rules marked in the first pass
+      if (rule.$$remove === true) return false;
+      applyMarkedSelectors(rule); // prune @keyframes rules
+
+      if (rule.type === 'atrule' && rule.name === 'keyframes') {
+        if (keyframesMode === 'none') return false;
+        if (keyframesMode === 'all') return true;
+        return criticalKeyframeNames.indexOf(rule.params) !== -1;
+      } // prune @font-face rules
+
+
+      if (rule.type === 'atrule' && rule.name === 'font-face') {
+        let family, src;
+
+        for (let i = 0; i < rule.nodes.length; i++) {
+          const decl = rule.nodes[i];
+
+          if (decl.prop === 'src') {
+            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
+            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
+          } else if (decl.prop === 'font-family') {
+            family = decl.value;
+          }
+        }
+
+        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
+          preloadedFonts.push(src);
+          const preload = document.createElement('link');
+          preload.setAttribute('rel', 'preload');
+          preload.setAttribute('as', 'font');
+          preload.setAttribute('crossorigin', 'anonymous');
+          preload.setAttribute('href', src.trim());
+          head.appendChild(preload);
+        } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
+
+
+        if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
+          return false;
+        }
+      }
+    });
+    sheet = serializeStylesheet(ast, {
+      compress: this.options.compress !== false
+    }); // If all rules were removed, get rid of the style element entirely
+
+    if (sheet.trim().length === 0) {
+      if (style.parentNode) {
+        style.remove();
+      }
+
+      return;
+    }
+
+    let afterText = '';
+    let styleInlinedCompletely = false;
+
+    if (options.pruneSource) {
+      const sheetInverse = serializeStylesheet(astInverse, {
+        compress: this.options.compress !== false
+      });
+      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
+
+      if (styleInlinedCompletely) {
+        const percent = sheetInverse.length / before.length * 100;
+        afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
+      }
+    } // replace the inline stylesheet with its critical'd counterpart
+
+
+    if (!styleInlinedCompletely) {
+      style.textContent = sheet;
+    } // output stats
+
+
+    const percent = sheet.length / before.length * 100 | 0;
+    this.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
+  }
+
+}
+
+export default Critters;
Index: trip-planner-front/node_modules/critters/dist/critters.modern.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.modern.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,10214 +1,0 @@
-import path from 'path';
-import prettyBytes from 'pretty-bytes';
-import parse5 from 'parse5';
-import css from 'css';
-import chalk from 'chalk';
-
-var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function createCommonjsModule(fn, basedir, module) {
-	return module = {
-	  path: basedir,
-	  exports: {},
-	  require: function (path, base) {
-      return commonjsRequire();
-    }
-	}, fn(module, module.exports), module.exports;
-}
-
-function getCjsExportFromNamespace (n) {
-	return n && n['default'] || n;
-}
-
-function commonjsRequire () {
-	throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
-}
-
-//Types of elements found in the DOM
-var domelementtype = {
-	Text: "text", //Text
-	Directive: "directive", //<? ... ?>
-	Comment: "comment", //<!-- ... -->
-	Script: "script", //<script> tags
-	Style: "style", //<style> tags
-	Tag: "tag", //Any tag
-	CDATA: "cdata", //<![CDATA[ ... ]]>
-	Doctype: "doctype",
-
-	isTag: function(elem){
-		return elem.type === "tag" || elem.type === "script" || elem.type === "style";
-	}
-};
-
-var lib = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Tests whether an element is a tag or not.
- *
- * @param elem Element to test
- */
-function isTag(elem) {
-    return (elem.type === "tag" /* Tag */ ||
-        elem.type === "script" /* Script */ ||
-        elem.type === "style" /* Style */);
-}
-exports.isTag = isTag;
-// Exports for backwards compatibility
-exports.Text = "text" /* Text */; //Text
-exports.Directive = "directive" /* Directive */; //<? ... ?>
-exports.Comment = "comment" /* Comment */; //<!-- ... -->
-exports.Script = "script" /* Script */; //<script> tags
-exports.Style = "style" /* Style */; //<style> tags
-exports.Tag = "tag" /* Tag */; //Any tag
-exports.CDATA = "cdata" /* CDATA */; //<![CDATA[ ... ]]>
-exports.Doctype = "doctype" /* Doctype */;
-});
-
-var Aacute = "Á";
-var aacute = "á";
-var Abreve = "Ă";
-var abreve = "ă";
-var ac = "∾";
-var acd = "∿";
-var acE = "∾̳";
-var Acirc = "Â";
-var acirc = "â";
-var acute = "´";
-var Acy = "А";
-var acy = "а";
-var AElig = "Æ";
-var aelig = "æ";
-var af = "⁡";
-var Afr = "𝔄";
-var afr = "𝔞";
-var Agrave = "À";
-var agrave = "à";
-var alefsym = "ℵ";
-var aleph = "ℵ";
-var Alpha = "Α";
-var alpha = "α";
-var Amacr = "Ā";
-var amacr = "ā";
-var amalg = "⨿";
-var amp = "&";
-var AMP = "&";
-var andand = "⩕";
-var And = "⩓";
-var and = "∧";
-var andd = "⩜";
-var andslope = "⩘";
-var andv = "⩚";
-var ang = "∠";
-var ange = "⦤";
-var angle = "∠";
-var angmsdaa = "⦨";
-var angmsdab = "⦩";
-var angmsdac = "⦪";
-var angmsdad = "⦫";
-var angmsdae = "⦬";
-var angmsdaf = "⦭";
-var angmsdag = "⦮";
-var angmsdah = "⦯";
-var angmsd = "∡";
-var angrt = "∟";
-var angrtvb = "⊾";
-var angrtvbd = "⦝";
-var angsph = "∢";
-var angst = "Å";
-var angzarr = "⍼";
-var Aogon = "Ą";
-var aogon = "ą";
-var Aopf = "𝔸";
-var aopf = "𝕒";
-var apacir = "⩯";
-var ap = "≈";
-var apE = "⩰";
-var ape = "≊";
-var apid = "≋";
-var apos = "'";
-var ApplyFunction = "⁡";
-var approx = "≈";
-var approxeq = "≊";
-var Aring = "Å";
-var aring = "å";
-var Ascr = "𝒜";
-var ascr = "𝒶";
-var Assign = "≔";
-var ast = "*";
-var asymp = "≈";
-var asympeq = "≍";
-var Atilde = "Ã";
-var atilde = "ã";
-var Auml = "Ä";
-var auml = "ä";
-var awconint = "∳";
-var awint = "⨑";
-var backcong = "≌";
-var backepsilon = "϶";
-var backprime = "‵";
-var backsim = "∽";
-var backsimeq = "⋍";
-var Backslash = "∖";
-var Barv = "⫧";
-var barvee = "⊽";
-var barwed = "⌅";
-var Barwed = "⌆";
-var barwedge = "⌅";
-var bbrk = "⎵";
-var bbrktbrk = "⎶";
-var bcong = "≌";
-var Bcy = "Б";
-var bcy = "б";
-var bdquo = "„";
-var becaus = "∵";
-var because = "∵";
-var Because = "∵";
-var bemptyv = "⦰";
-var bepsi = "϶";
-var bernou = "ℬ";
-var Bernoullis = "ℬ";
-var Beta = "Β";
-var beta = "β";
-var beth = "ℶ";
-var between = "≬";
-var Bfr = "𝔅";
-var bfr = "𝔟";
-var bigcap = "⋂";
-var bigcirc = "◯";
-var bigcup = "⋃";
-var bigodot = "⨀";
-var bigoplus = "⨁";
-var bigotimes = "⨂";
-var bigsqcup = "⨆";
-var bigstar = "★";
-var bigtriangledown = "▽";
-var bigtriangleup = "△";
-var biguplus = "⨄";
-var bigvee = "⋁";
-var bigwedge = "⋀";
-var bkarow = "⤍";
-var blacklozenge = "⧫";
-var blacksquare = "▪";
-var blacktriangle = "▴";
-var blacktriangledown = "▾";
-var blacktriangleleft = "◂";
-var blacktriangleright = "▸";
-var blank = "␣";
-var blk12 = "▒";
-var blk14 = "░";
-var blk34 = "▓";
-var block = "█";
-var bne = "=⃥";
-var bnequiv = "≡⃥";
-var bNot = "⫭";
-var bnot = "⌐";
-var Bopf = "𝔹";
-var bopf = "𝕓";
-var bot = "⊥";
-var bottom = "⊥";
-var bowtie = "⋈";
-var boxbox = "⧉";
-var boxdl = "┐";
-var boxdL = "╕";
-var boxDl = "╖";
-var boxDL = "╗";
-var boxdr = "┌";
-var boxdR = "╒";
-var boxDr = "╓";
-var boxDR = "╔";
-var boxh = "─";
-var boxH = "═";
-var boxhd = "┬";
-var boxHd = "╤";
-var boxhD = "╥";
-var boxHD = "╦";
-var boxhu = "┴";
-var boxHu = "╧";
-var boxhU = "╨";
-var boxHU = "╩";
-var boxminus = "⊟";
-var boxplus = "⊞";
-var boxtimes = "⊠";
-var boxul = "┘";
-var boxuL = "╛";
-var boxUl = "╜";
-var boxUL = "╝";
-var boxur = "└";
-var boxuR = "╘";
-var boxUr = "╙";
-var boxUR = "╚";
-var boxv = "│";
-var boxV = "║";
-var boxvh = "┼";
-var boxvH = "╪";
-var boxVh = "╫";
-var boxVH = "╬";
-var boxvl = "┤";
-var boxvL = "╡";
-var boxVl = "╢";
-var boxVL = "╣";
-var boxvr = "├";
-var boxvR = "╞";
-var boxVr = "╟";
-var boxVR = "╠";
-var bprime = "‵";
-var breve = "˘";
-var Breve = "˘";
-var brvbar = "¦";
-var bscr = "𝒷";
-var Bscr = "ℬ";
-var bsemi = "⁏";
-var bsim = "∽";
-var bsime = "⋍";
-var bsolb = "⧅";
-var bsol = "\\";
-var bsolhsub = "⟈";
-var bull = "•";
-var bullet = "•";
-var bump = "≎";
-var bumpE = "⪮";
-var bumpe = "≏";
-var Bumpeq = "≎";
-var bumpeq = "≏";
-var Cacute = "Ć";
-var cacute = "ć";
-var capand = "⩄";
-var capbrcup = "⩉";
-var capcap = "⩋";
-var cap = "∩";
-var Cap = "⋒";
-var capcup = "⩇";
-var capdot = "⩀";
-var CapitalDifferentialD = "ⅅ";
-var caps = "∩︀";
-var caret = "⁁";
-var caron = "ˇ";
-var Cayleys = "ℭ";
-var ccaps = "⩍";
-var Ccaron = "Č";
-var ccaron = "č";
-var Ccedil = "Ç";
-var ccedil = "ç";
-var Ccirc = "Ĉ";
-var ccirc = "ĉ";
-var Cconint = "∰";
-var ccups = "⩌";
-var ccupssm = "⩐";
-var Cdot = "Ċ";
-var cdot = "ċ";
-var cedil = "¸";
-var Cedilla = "¸";
-var cemptyv = "⦲";
-var cent = "¢";
-var centerdot = "·";
-var CenterDot = "·";
-var cfr = "𝔠";
-var Cfr = "ℭ";
-var CHcy = "Ч";
-var chcy = "ч";
-var check = "✓";
-var checkmark = "✓";
-var Chi = "Χ";
-var chi = "χ";
-var circ = "ˆ";
-var circeq = "≗";
-var circlearrowleft = "↺";
-var circlearrowright = "↻";
-var circledast = "⊛";
-var circledcirc = "⊚";
-var circleddash = "⊝";
-var CircleDot = "⊙";
-var circledR = "®";
-var circledS = "Ⓢ";
-var CircleMinus = "⊖";
-var CirclePlus = "⊕";
-var CircleTimes = "⊗";
-var cir = "○";
-var cirE = "⧃";
-var cire = "≗";
-var cirfnint = "⨐";
-var cirmid = "⫯";
-var cirscir = "⧂";
-var ClockwiseContourIntegral = "∲";
-var CloseCurlyDoubleQuote = "”";
-var CloseCurlyQuote = "’";
-var clubs = "♣";
-var clubsuit = "♣";
-var colon = ":";
-var Colon = "∷";
-var Colone = "⩴";
-var colone = "≔";
-var coloneq = "≔";
-var comma = ",";
-var commat = "@";
-var comp = "∁";
-var compfn = "∘";
-var complement = "∁";
-var complexes = "ℂ";
-var cong = "≅";
-var congdot = "⩭";
-var Congruent = "≡";
-var conint = "∮";
-var Conint = "∯";
-var ContourIntegral = "∮";
-var copf = "𝕔";
-var Copf = "ℂ";
-var coprod = "∐";
-var Coproduct = "∐";
-var copy = "©";
-var COPY = "©";
-var copysr = "℗";
-var CounterClockwiseContourIntegral = "∳";
-var crarr = "↵";
-var cross = "✗";
-var Cross = "⨯";
-var Cscr = "𝒞";
-var cscr = "𝒸";
-var csub = "⫏";
-var csube = "⫑";
-var csup = "⫐";
-var csupe = "⫒";
-var ctdot = "⋯";
-var cudarrl = "⤸";
-var cudarrr = "⤵";
-var cuepr = "⋞";
-var cuesc = "⋟";
-var cularr = "↶";
-var cularrp = "⤽";
-var cupbrcap = "⩈";
-var cupcap = "⩆";
-var CupCap = "≍";
-var cup = "∪";
-var Cup = "⋓";
-var cupcup = "⩊";
-var cupdot = "⊍";
-var cupor = "⩅";
-var cups = "∪︀";
-var curarr = "↷";
-var curarrm = "⤼";
-var curlyeqprec = "⋞";
-var curlyeqsucc = "⋟";
-var curlyvee = "⋎";
-var curlywedge = "⋏";
-var curren = "¤";
-var curvearrowleft = "↶";
-var curvearrowright = "↷";
-var cuvee = "⋎";
-var cuwed = "⋏";
-var cwconint = "∲";
-var cwint = "∱";
-var cylcty = "⌭";
-var dagger = "†";
-var Dagger = "‡";
-var daleth = "ℸ";
-var darr = "↓";
-var Darr = "↡";
-var dArr = "⇓";
-var dash = "‐";
-var Dashv = "⫤";
-var dashv = "⊣";
-var dbkarow = "⤏";
-var dblac = "˝";
-var Dcaron = "Ď";
-var dcaron = "ď";
-var Dcy = "Д";
-var dcy = "д";
-var ddagger = "‡";
-var ddarr = "⇊";
-var DD = "ⅅ";
-var dd = "ⅆ";
-var DDotrahd = "⤑";
-var ddotseq = "⩷";
-var deg = "°";
-var Del = "∇";
-var Delta = "Δ";
-var delta = "δ";
-var demptyv = "⦱";
-var dfisht = "⥿";
-var Dfr = "𝔇";
-var dfr = "𝔡";
-var dHar = "⥥";
-var dharl = "⇃";
-var dharr = "⇂";
-var DiacriticalAcute = "´";
-var DiacriticalDot = "˙";
-var DiacriticalDoubleAcute = "˝";
-var DiacriticalGrave = "`";
-var DiacriticalTilde = "˜";
-var diam = "⋄";
-var diamond = "⋄";
-var Diamond = "⋄";
-var diamondsuit = "♦";
-var diams = "♦";
-var die = "¨";
-var DifferentialD = "ⅆ";
-var digamma = "ϝ";
-var disin = "⋲";
-var div = "÷";
-var divide = "÷";
-var divideontimes = "⋇";
-var divonx = "⋇";
-var DJcy = "Ђ";
-var djcy = "ђ";
-var dlcorn = "⌞";
-var dlcrop = "⌍";
-var dollar = "$";
-var Dopf = "𝔻";
-var dopf = "𝕕";
-var Dot = "¨";
-var dot = "˙";
-var DotDot = "⃜";
-var doteq = "≐";
-var doteqdot = "≑";
-var DotEqual = "≐";
-var dotminus = "∸";
-var dotplus = "∔";
-var dotsquare = "⊡";
-var doublebarwedge = "⌆";
-var DoubleContourIntegral = "∯";
-var DoubleDot = "¨";
-var DoubleDownArrow = "⇓";
-var DoubleLeftArrow = "⇐";
-var DoubleLeftRightArrow = "⇔";
-var DoubleLeftTee = "⫤";
-var DoubleLongLeftArrow = "⟸";
-var DoubleLongLeftRightArrow = "⟺";
-var DoubleLongRightArrow = "⟹";
-var DoubleRightArrow = "⇒";
-var DoubleRightTee = "⊨";
-var DoubleUpArrow = "⇑";
-var DoubleUpDownArrow = "⇕";
-var DoubleVerticalBar = "∥";
-var DownArrowBar = "⤓";
-var downarrow = "↓";
-var DownArrow = "↓";
-var Downarrow = "⇓";
-var DownArrowUpArrow = "⇵";
-var DownBreve = "̑";
-var downdownarrows = "⇊";
-var downharpoonleft = "⇃";
-var downharpoonright = "⇂";
-var DownLeftRightVector = "⥐";
-var DownLeftTeeVector = "⥞";
-var DownLeftVectorBar = "⥖";
-var DownLeftVector = "↽";
-var DownRightTeeVector = "⥟";
-var DownRightVectorBar = "⥗";
-var DownRightVector = "⇁";
-var DownTeeArrow = "↧";
-var DownTee = "⊤";
-var drbkarow = "⤐";
-var drcorn = "⌟";
-var drcrop = "⌌";
-var Dscr = "𝒟";
-var dscr = "𝒹";
-var DScy = "Ѕ";
-var dscy = "ѕ";
-var dsol = "⧶";
-var Dstrok = "Đ";
-var dstrok = "đ";
-var dtdot = "⋱";
-var dtri = "▿";
-var dtrif = "▾";
-var duarr = "⇵";
-var duhar = "⥯";
-var dwangle = "⦦";
-var DZcy = "Џ";
-var dzcy = "џ";
-var dzigrarr = "⟿";
-var Eacute = "É";
-var eacute = "é";
-var easter = "⩮";
-var Ecaron = "Ě";
-var ecaron = "ě";
-var Ecirc = "Ê";
-var ecirc = "ê";
-var ecir = "≖";
-var ecolon = "≕";
-var Ecy = "Э";
-var ecy = "э";
-var eDDot = "⩷";
-var Edot = "Ė";
-var edot = "ė";
-var eDot = "≑";
-var ee = "ⅇ";
-var efDot = "≒";
-var Efr = "𝔈";
-var efr = "𝔢";
-var eg = "⪚";
-var Egrave = "È";
-var egrave = "è";
-var egs = "⪖";
-var egsdot = "⪘";
-var el = "⪙";
-var Element = "∈";
-var elinters = "⏧";
-var ell = "ℓ";
-var els = "⪕";
-var elsdot = "⪗";
-var Emacr = "Ē";
-var emacr = "ē";
-var empty = "∅";
-var emptyset = "∅";
-var EmptySmallSquare = "◻";
-var emptyv = "∅";
-var EmptyVerySmallSquare = "▫";
-var emsp13 = " ";
-var emsp14 = " ";
-var emsp = " ";
-var ENG = "Ŋ";
-var eng = "ŋ";
-var ensp = " ";
-var Eogon = "Ę";
-var eogon = "ę";
-var Eopf = "𝔼";
-var eopf = "𝕖";
-var epar = "⋕";
-var eparsl = "⧣";
-var eplus = "⩱";
-var epsi = "ε";
-var Epsilon = "Ε";
-var epsilon = "ε";
-var epsiv = "ϵ";
-var eqcirc = "≖";
-var eqcolon = "≕";
-var eqsim = "≂";
-var eqslantgtr = "⪖";
-var eqslantless = "⪕";
-var Equal = "⩵";
-var equals = "=";
-var EqualTilde = "≂";
-var equest = "≟";
-var Equilibrium = "⇌";
-var equiv = "≡";
-var equivDD = "⩸";
-var eqvparsl = "⧥";
-var erarr = "⥱";
-var erDot = "≓";
-var escr = "ℯ";
-var Escr = "ℰ";
-var esdot = "≐";
-var Esim = "⩳";
-var esim = "≂";
-var Eta = "Η";
-var eta = "η";
-var ETH = "Ð";
-var eth = "ð";
-var Euml = "Ë";
-var euml = "ë";
-var euro = "€";
-var excl = "!";
-var exist = "∃";
-var Exists = "∃";
-var expectation = "ℰ";
-var exponentiale = "ⅇ";
-var ExponentialE = "ⅇ";
-var fallingdotseq = "≒";
-var Fcy = "Ф";
-var fcy = "ф";
-var female = "♀";
-var ffilig = "ﬃ";
-var fflig = "ﬀ";
-var ffllig = "ﬄ";
-var Ffr = "𝔉";
-var ffr = "𝔣";
-var filig = "ﬁ";
-var FilledSmallSquare = "◼";
-var FilledVerySmallSquare = "▪";
-var fjlig = "fj";
-var flat = "♭";
-var fllig = "ﬂ";
-var fltns = "▱";
-var fnof = "ƒ";
-var Fopf = "𝔽";
-var fopf = "𝕗";
-var forall = "∀";
-var ForAll = "∀";
-var fork = "⋔";
-var forkv = "⫙";
-var Fouriertrf = "ℱ";
-var fpartint = "⨍";
-var frac12 = "½";
-var frac13 = "⅓";
-var frac14 = "¼";
-var frac15 = "⅕";
-var frac16 = "⅙";
-var frac18 = "⅛";
-var frac23 = "⅔";
-var frac25 = "⅖";
-var frac34 = "¾";
-var frac35 = "⅗";
-var frac38 = "⅜";
-var frac45 = "⅘";
-var frac56 = "⅚";
-var frac58 = "⅝";
-var frac78 = "⅞";
-var frasl = "⁄";
-var frown = "⌢";
-var fscr = "𝒻";
-var Fscr = "ℱ";
-var gacute = "ǵ";
-var Gamma = "Γ";
-var gamma = "γ";
-var Gammad = "Ϝ";
-var gammad = "ϝ";
-var gap = "⪆";
-var Gbreve = "Ğ";
-var gbreve = "ğ";
-var Gcedil = "Ģ";
-var Gcirc = "Ĝ";
-var gcirc = "ĝ";
-var Gcy = "Г";
-var gcy = "г";
-var Gdot = "Ġ";
-var gdot = "ġ";
-var ge = "≥";
-var gE = "≧";
-var gEl = "⪌";
-var gel = "⋛";
-var geq = "≥";
-var geqq = "≧";
-var geqslant = "⩾";
-var gescc = "⪩";
-var ges = "⩾";
-var gesdot = "⪀";
-var gesdoto = "⪂";
-var gesdotol = "⪄";
-var gesl = "⋛︀";
-var gesles = "⪔";
-var Gfr = "𝔊";
-var gfr = "𝔤";
-var gg = "≫";
-var Gg = "⋙";
-var ggg = "⋙";
-var gimel = "ℷ";
-var GJcy = "Ѓ";
-var gjcy = "ѓ";
-var gla = "⪥";
-var gl = "≷";
-var glE = "⪒";
-var glj = "⪤";
-var gnap = "⪊";
-var gnapprox = "⪊";
-var gne = "⪈";
-var gnE = "≩";
-var gneq = "⪈";
-var gneqq = "≩";
-var gnsim = "⋧";
-var Gopf = "𝔾";
-var gopf = "𝕘";
-var grave = "`";
-var GreaterEqual = "≥";
-var GreaterEqualLess = "⋛";
-var GreaterFullEqual = "≧";
-var GreaterGreater = "⪢";
-var GreaterLess = "≷";
-var GreaterSlantEqual = "⩾";
-var GreaterTilde = "≳";
-var Gscr = "𝒢";
-var gscr = "ℊ";
-var gsim = "≳";
-var gsime = "⪎";
-var gsiml = "⪐";
-var gtcc = "⪧";
-var gtcir = "⩺";
-var gt = ">";
-var GT = ">";
-var Gt = "≫";
-var gtdot = "⋗";
-var gtlPar = "⦕";
-var gtquest = "⩼";
-var gtrapprox = "⪆";
-var gtrarr = "⥸";
-var gtrdot = "⋗";
-var gtreqless = "⋛";
-var gtreqqless = "⪌";
-var gtrless = "≷";
-var gtrsim = "≳";
-var gvertneqq = "≩︀";
-var gvnE = "≩︀";
-var Hacek = "ˇ";
-var hairsp = " ";
-var half = "½";
-var hamilt = "ℋ";
-var HARDcy = "Ъ";
-var hardcy = "ъ";
-var harrcir = "⥈";
-var harr = "↔";
-var hArr = "⇔";
-var harrw = "↭";
-var Hat = "^";
-var hbar = "ℏ";
-var Hcirc = "Ĥ";
-var hcirc = "ĥ";
-var hearts = "♥";
-var heartsuit = "♥";
-var hellip = "…";
-var hercon = "⊹";
-var hfr = "𝔥";
-var Hfr = "ℌ";
-var HilbertSpace = "ℋ";
-var hksearow = "⤥";
-var hkswarow = "⤦";
-var hoarr = "⇿";
-var homtht = "∻";
-var hookleftarrow = "↩";
-var hookrightarrow = "↪";
-var hopf = "𝕙";
-var Hopf = "ℍ";
-var horbar = "―";
-var HorizontalLine = "─";
-var hscr = "𝒽";
-var Hscr = "ℋ";
-var hslash = "ℏ";
-var Hstrok = "Ħ";
-var hstrok = "ħ";
-var HumpDownHump = "≎";
-var HumpEqual = "≏";
-var hybull = "⁃";
-var hyphen = "‐";
-var Iacute = "Í";
-var iacute = "í";
-var ic = "⁣";
-var Icirc = "Î";
-var icirc = "î";
-var Icy = "И";
-var icy = "и";
-var Idot = "İ";
-var IEcy = "Е";
-var iecy = "е";
-var iexcl = "¡";
-var iff = "⇔";
-var ifr = "𝔦";
-var Ifr = "ℑ";
-var Igrave = "Ì";
-var igrave = "ì";
-var ii = "ⅈ";
-var iiiint = "⨌";
-var iiint = "∭";
-var iinfin = "⧜";
-var iiota = "℩";
-var IJlig = "Ĳ";
-var ijlig = "ĳ";
-var Imacr = "Ī";
-var imacr = "ī";
-var image = "ℑ";
-var ImaginaryI = "ⅈ";
-var imagline = "ℐ";
-var imagpart = "ℑ";
-var imath = "ı";
-var Im = "ℑ";
-var imof = "⊷";
-var imped = "Ƶ";
-var Implies = "⇒";
-var incare = "℅";
-var infin = "∞";
-var infintie = "⧝";
-var inodot = "ı";
-var intcal = "⊺";
-var int = "∫";
-var Int = "∬";
-var integers = "ℤ";
-var Integral = "∫";
-var intercal = "⊺";
-var Intersection = "⋂";
-var intlarhk = "⨗";
-var intprod = "⨼";
-var InvisibleComma = "⁣";
-var InvisibleTimes = "⁢";
-var IOcy = "Ё";
-var iocy = "ё";
-var Iogon = "Į";
-var iogon = "į";
-var Iopf = "𝕀";
-var iopf = "𝕚";
-var Iota = "Ι";
-var iota = "ι";
-var iprod = "⨼";
-var iquest = "¿";
-var iscr = "𝒾";
-var Iscr = "ℐ";
-var isin = "∈";
-var isindot = "⋵";
-var isinE = "⋹";
-var isins = "⋴";
-var isinsv = "⋳";
-var isinv = "∈";
-var it = "⁢";
-var Itilde = "Ĩ";
-var itilde = "ĩ";
-var Iukcy = "І";
-var iukcy = "і";
-var Iuml = "Ï";
-var iuml = "ï";
-var Jcirc = "Ĵ";
-var jcirc = "ĵ";
-var Jcy = "Й";
-var jcy = "й";
-var Jfr = "𝔍";
-var jfr = "𝔧";
-var jmath = "ȷ";
-var Jopf = "𝕁";
-var jopf = "𝕛";
-var Jscr = "𝒥";
-var jscr = "𝒿";
-var Jsercy = "Ј";
-var jsercy = "ј";
-var Jukcy = "Є";
-var jukcy = "є";
-var Kappa = "Κ";
-var kappa = "κ";
-var kappav = "ϰ";
-var Kcedil = "Ķ";
-var kcedil = "ķ";
-var Kcy = "К";
-var kcy = "к";
-var Kfr = "𝔎";
-var kfr = "𝔨";
-var kgreen = "ĸ";
-var KHcy = "Х";
-var khcy = "х";
-var KJcy = "Ќ";
-var kjcy = "ќ";
-var Kopf = "𝕂";
-var kopf = "𝕜";
-var Kscr = "𝒦";
-var kscr = "𝓀";
-var lAarr = "⇚";
-var Lacute = "Ĺ";
-var lacute = "ĺ";
-var laemptyv = "⦴";
-var lagran = "ℒ";
-var Lambda = "Λ";
-var lambda = "λ";
-var lang = "⟨";
-var Lang = "⟪";
-var langd = "⦑";
-var langle = "⟨";
-var lap = "⪅";
-var Laplacetrf = "ℒ";
-var laquo = "«";
-var larrb = "⇤";
-var larrbfs = "⤟";
-var larr = "←";
-var Larr = "↞";
-var lArr = "⇐";
-var larrfs = "⤝";
-var larrhk = "↩";
-var larrlp = "↫";
-var larrpl = "⤹";
-var larrsim = "⥳";
-var larrtl = "↢";
-var latail = "⤙";
-var lAtail = "⤛";
-var lat = "⪫";
-var late = "⪭";
-var lates = "⪭︀";
-var lbarr = "⤌";
-var lBarr = "⤎";
-var lbbrk = "❲";
-var lbrace = "{";
-var lbrack = "[";
-var lbrke = "⦋";
-var lbrksld = "⦏";
-var lbrkslu = "⦍";
-var Lcaron = "Ľ";
-var lcaron = "ľ";
-var Lcedil = "Ļ";
-var lcedil = "ļ";
-var lceil = "⌈";
-var lcub = "{";
-var Lcy = "Л";
-var lcy = "л";
-var ldca = "⤶";
-var ldquo = "“";
-var ldquor = "„";
-var ldrdhar = "⥧";
-var ldrushar = "⥋";
-var ldsh = "↲";
-var le = "≤";
-var lE = "≦";
-var LeftAngleBracket = "⟨";
-var LeftArrowBar = "⇤";
-var leftarrow = "←";
-var LeftArrow = "←";
-var Leftarrow = "⇐";
-var LeftArrowRightArrow = "⇆";
-var leftarrowtail = "↢";
-var LeftCeiling = "⌈";
-var LeftDoubleBracket = "⟦";
-var LeftDownTeeVector = "⥡";
-var LeftDownVectorBar = "⥙";
-var LeftDownVector = "⇃";
-var LeftFloor = "⌊";
-var leftharpoondown = "↽";
-var leftharpoonup = "↼";
-var leftleftarrows = "⇇";
-var leftrightarrow = "↔";
-var LeftRightArrow = "↔";
-var Leftrightarrow = "⇔";
-var leftrightarrows = "⇆";
-var leftrightharpoons = "⇋";
-var leftrightsquigarrow = "↭";
-var LeftRightVector = "⥎";
-var LeftTeeArrow = "↤";
-var LeftTee = "⊣";
-var LeftTeeVector = "⥚";
-var leftthreetimes = "⋋";
-var LeftTriangleBar = "⧏";
-var LeftTriangle = "⊲";
-var LeftTriangleEqual = "⊴";
-var LeftUpDownVector = "⥑";
-var LeftUpTeeVector = "⥠";
-var LeftUpVectorBar = "⥘";
-var LeftUpVector = "↿";
-var LeftVectorBar = "⥒";
-var LeftVector = "↼";
-var lEg = "⪋";
-var leg = "⋚";
-var leq = "≤";
-var leqq = "≦";
-var leqslant = "⩽";
-var lescc = "⪨";
-var les = "⩽";
-var lesdot = "⩿";
-var lesdoto = "⪁";
-var lesdotor = "⪃";
-var lesg = "⋚︀";
-var lesges = "⪓";
-var lessapprox = "⪅";
-var lessdot = "⋖";
-var lesseqgtr = "⋚";
-var lesseqqgtr = "⪋";
-var LessEqualGreater = "⋚";
-var LessFullEqual = "≦";
-var LessGreater = "≶";
-var lessgtr = "≶";
-var LessLess = "⪡";
-var lesssim = "≲";
-var LessSlantEqual = "⩽";
-var LessTilde = "≲";
-var lfisht = "⥼";
-var lfloor = "⌊";
-var Lfr = "𝔏";
-var lfr = "𝔩";
-var lg = "≶";
-var lgE = "⪑";
-var lHar = "⥢";
-var lhard = "↽";
-var lharu = "↼";
-var lharul = "⥪";
-var lhblk = "▄";
-var LJcy = "Љ";
-var ljcy = "љ";
-var llarr = "⇇";
-var ll = "≪";
-var Ll = "⋘";
-var llcorner = "⌞";
-var Lleftarrow = "⇚";
-var llhard = "⥫";
-var lltri = "◺";
-var Lmidot = "Ŀ";
-var lmidot = "ŀ";
-var lmoustache = "⎰";
-var lmoust = "⎰";
-var lnap = "⪉";
-var lnapprox = "⪉";
-var lne = "⪇";
-var lnE = "≨";
-var lneq = "⪇";
-var lneqq = "≨";
-var lnsim = "⋦";
-var loang = "⟬";
-var loarr = "⇽";
-var lobrk = "⟦";
-var longleftarrow = "⟵";
-var LongLeftArrow = "⟵";
-var Longleftarrow = "⟸";
-var longleftrightarrow = "⟷";
-var LongLeftRightArrow = "⟷";
-var Longleftrightarrow = "⟺";
-var longmapsto = "⟼";
-var longrightarrow = "⟶";
-var LongRightArrow = "⟶";
-var Longrightarrow = "⟹";
-var looparrowleft = "↫";
-var looparrowright = "↬";
-var lopar = "⦅";
-var Lopf = "𝕃";
-var lopf = "𝕝";
-var loplus = "⨭";
-var lotimes = "⨴";
-var lowast = "∗";
-var lowbar = "_";
-var LowerLeftArrow = "↙";
-var LowerRightArrow = "↘";
-var loz = "◊";
-var lozenge = "◊";
-var lozf = "⧫";
-var lpar = "(";
-var lparlt = "⦓";
-var lrarr = "⇆";
-var lrcorner = "⌟";
-var lrhar = "⇋";
-var lrhard = "⥭";
-var lrm = "‎";
-var lrtri = "⊿";
-var lsaquo = "‹";
-var lscr = "𝓁";
-var Lscr = "ℒ";
-var lsh = "↰";
-var Lsh = "↰";
-var lsim = "≲";
-var lsime = "⪍";
-var lsimg = "⪏";
-var lsqb = "[";
-var lsquo = "‘";
-var lsquor = "‚";
-var Lstrok = "Ł";
-var lstrok = "ł";
-var ltcc = "⪦";
-var ltcir = "⩹";
-var lt = "<";
-var LT = "<";
-var Lt = "≪";
-var ltdot = "⋖";
-var lthree = "⋋";
-var ltimes = "⋉";
-var ltlarr = "⥶";
-var ltquest = "⩻";
-var ltri = "◃";
-var ltrie = "⊴";
-var ltrif = "◂";
-var ltrPar = "⦖";
-var lurdshar = "⥊";
-var luruhar = "⥦";
-var lvertneqq = "≨︀";
-var lvnE = "≨︀";
-var macr = "¯";
-var male = "♂";
-var malt = "✠";
-var maltese = "✠";
-var map = "↦";
-var mapsto = "↦";
-var mapstodown = "↧";
-var mapstoleft = "↤";
-var mapstoup = "↥";
-var marker = "▮";
-var mcomma = "⨩";
-var Mcy = "М";
-var mcy = "м";
-var mdash = "—";
-var mDDot = "∺";
-var measuredangle = "∡";
-var MediumSpace = " ";
-var Mellintrf = "ℳ";
-var Mfr = "𝔐";
-var mfr = "𝔪";
-var mho = "℧";
-var micro = "µ";
-var midast = "*";
-var midcir = "⫰";
-var mid = "∣";
-var middot = "·";
-var minusb = "⊟";
-var minus = "−";
-var minusd = "∸";
-var minusdu = "⨪";
-var MinusPlus = "∓";
-var mlcp = "⫛";
-var mldr = "…";
-var mnplus = "∓";
-var models = "⊧";
-var Mopf = "𝕄";
-var mopf = "𝕞";
-var mp = "∓";
-var mscr = "𝓂";
-var Mscr = "ℳ";
-var mstpos = "∾";
-var Mu = "Μ";
-var mu = "μ";
-var multimap = "⊸";
-var mumap = "⊸";
-var nabla = "∇";
-var Nacute = "Ń";
-var nacute = "ń";
-var nang = "∠⃒";
-var nap = "≉";
-var napE = "⩰̸";
-var napid = "≋̸";
-var napos = "ŉ";
-var napprox = "≉";
-var natural = "♮";
-var naturals = "ℕ";
-var natur = "♮";
-var nbsp = " ";
-var nbump = "≎̸";
-var nbumpe = "≏̸";
-var ncap = "⩃";
-var Ncaron = "Ň";
-var ncaron = "ň";
-var Ncedil = "Ņ";
-var ncedil = "ņ";
-var ncong = "≇";
-var ncongdot = "⩭̸";
-var ncup = "⩂";
-var Ncy = "Н";
-var ncy = "н";
-var ndash = "–";
-var nearhk = "⤤";
-var nearr = "↗";
-var neArr = "⇗";
-var nearrow = "↗";
-var ne = "≠";
-var nedot = "≐̸";
-var NegativeMediumSpace = "​";
-var NegativeThickSpace = "​";
-var NegativeThinSpace = "​";
-var NegativeVeryThinSpace = "​";
-var nequiv = "≢";
-var nesear = "⤨";
-var nesim = "≂̸";
-var NestedGreaterGreater = "≫";
-var NestedLessLess = "≪";
-var NewLine = "\n";
-var nexist = "∄";
-var nexists = "∄";
-var Nfr = "𝔑";
-var nfr = "𝔫";
-var ngE = "≧̸";
-var nge = "≱";
-var ngeq = "≱";
-var ngeqq = "≧̸";
-var ngeqslant = "⩾̸";
-var nges = "⩾̸";
-var nGg = "⋙̸";
-var ngsim = "≵";
-var nGt = "≫⃒";
-var ngt = "≯";
-var ngtr = "≯";
-var nGtv = "≫̸";
-var nharr = "↮";
-var nhArr = "⇎";
-var nhpar = "⫲";
-var ni = "∋";
-var nis = "⋼";
-var nisd = "⋺";
-var niv = "∋";
-var NJcy = "Њ";
-var njcy = "њ";
-var nlarr = "↚";
-var nlArr = "⇍";
-var nldr = "‥";
-var nlE = "≦̸";
-var nle = "≰";
-var nleftarrow = "↚";
-var nLeftarrow = "⇍";
-var nleftrightarrow = "↮";
-var nLeftrightarrow = "⇎";
-var nleq = "≰";
-var nleqq = "≦̸";
-var nleqslant = "⩽̸";
-var nles = "⩽̸";
-var nless = "≮";
-var nLl = "⋘̸";
-var nlsim = "≴";
-var nLt = "≪⃒";
-var nlt = "≮";
-var nltri = "⋪";
-var nltrie = "⋬";
-var nLtv = "≪̸";
-var nmid = "∤";
-var NoBreak = "⁠";
-var NonBreakingSpace = " ";
-var nopf = "𝕟";
-var Nopf = "ℕ";
-var Not = "⫬";
-var not = "¬";
-var NotCongruent = "≢";
-var NotCupCap = "≭";
-var NotDoubleVerticalBar = "∦";
-var NotElement = "∉";
-var NotEqual = "≠";
-var NotEqualTilde = "≂̸";
-var NotExists = "∄";
-var NotGreater = "≯";
-var NotGreaterEqual = "≱";
-var NotGreaterFullEqual = "≧̸";
-var NotGreaterGreater = "≫̸";
-var NotGreaterLess = "≹";
-var NotGreaterSlantEqual = "⩾̸";
-var NotGreaterTilde = "≵";
-var NotHumpDownHump = "≎̸";
-var NotHumpEqual = "≏̸";
-var notin = "∉";
-var notindot = "⋵̸";
-var notinE = "⋹̸";
-var notinva = "∉";
-var notinvb = "⋷";
-var notinvc = "⋶";
-var NotLeftTriangleBar = "⧏̸";
-var NotLeftTriangle = "⋪";
-var NotLeftTriangleEqual = "⋬";
-var NotLess = "≮";
-var NotLessEqual = "≰";
-var NotLessGreater = "≸";
-var NotLessLess = "≪̸";
-var NotLessSlantEqual = "⩽̸";
-var NotLessTilde = "≴";
-var NotNestedGreaterGreater = "⪢̸";
-var NotNestedLessLess = "⪡̸";
-var notni = "∌";
-var notniva = "∌";
-var notnivb = "⋾";
-var notnivc = "⋽";
-var NotPrecedes = "⊀";
-var NotPrecedesEqual = "⪯̸";
-var NotPrecedesSlantEqual = "⋠";
-var NotReverseElement = "∌";
-var NotRightTriangleBar = "⧐̸";
-var NotRightTriangle = "⋫";
-var NotRightTriangleEqual = "⋭";
-var NotSquareSubset = "⊏̸";
-var NotSquareSubsetEqual = "⋢";
-var NotSquareSuperset = "⊐̸";
-var NotSquareSupersetEqual = "⋣";
-var NotSubset = "⊂⃒";
-var NotSubsetEqual = "⊈";
-var NotSucceeds = "⊁";
-var NotSucceedsEqual = "⪰̸";
-var NotSucceedsSlantEqual = "⋡";
-var NotSucceedsTilde = "≿̸";
-var NotSuperset = "⊃⃒";
-var NotSupersetEqual = "⊉";
-var NotTilde = "≁";
-var NotTildeEqual = "≄";
-var NotTildeFullEqual = "≇";
-var NotTildeTilde = "≉";
-var NotVerticalBar = "∤";
-var nparallel = "∦";
-var npar = "∦";
-var nparsl = "⫽⃥";
-var npart = "∂̸";
-var npolint = "⨔";
-var npr = "⊀";
-var nprcue = "⋠";
-var nprec = "⊀";
-var npreceq = "⪯̸";
-var npre = "⪯̸";
-var nrarrc = "⤳̸";
-var nrarr = "↛";
-var nrArr = "⇏";
-var nrarrw = "↝̸";
-var nrightarrow = "↛";
-var nRightarrow = "⇏";
-var nrtri = "⋫";
-var nrtrie = "⋭";
-var nsc = "⊁";
-var nsccue = "⋡";
-var nsce = "⪰̸";
-var Nscr = "𝒩";
-var nscr = "𝓃";
-var nshortmid = "∤";
-var nshortparallel = "∦";
-var nsim = "≁";
-var nsime = "≄";
-var nsimeq = "≄";
-var nsmid = "∤";
-var nspar = "∦";
-var nsqsube = "⋢";
-var nsqsupe = "⋣";
-var nsub = "⊄";
-var nsubE = "⫅̸";
-var nsube = "⊈";
-var nsubset = "⊂⃒";
-var nsubseteq = "⊈";
-var nsubseteqq = "⫅̸";
-var nsucc = "⊁";
-var nsucceq = "⪰̸";
-var nsup = "⊅";
-var nsupE = "⫆̸";
-var nsupe = "⊉";
-var nsupset = "⊃⃒";
-var nsupseteq = "⊉";
-var nsupseteqq = "⫆̸";
-var ntgl = "≹";
-var Ntilde = "Ñ";
-var ntilde = "ñ";
-var ntlg = "≸";
-var ntriangleleft = "⋪";
-var ntrianglelefteq = "⋬";
-var ntriangleright = "⋫";
-var ntrianglerighteq = "⋭";
-var Nu = "Ν";
-var nu = "ν";
-var num = "#";
-var numero = "№";
-var numsp = " ";
-var nvap = "≍⃒";
-var nvdash = "⊬";
-var nvDash = "⊭";
-var nVdash = "⊮";
-var nVDash = "⊯";
-var nvge = "≥⃒";
-var nvgt = ">⃒";
-var nvHarr = "⤄";
-var nvinfin = "⧞";
-var nvlArr = "⤂";
-var nvle = "≤⃒";
-var nvlt = "<⃒";
-var nvltrie = "⊴⃒";
-var nvrArr = "⤃";
-var nvrtrie = "⊵⃒";
-var nvsim = "∼⃒";
-var nwarhk = "⤣";
-var nwarr = "↖";
-var nwArr = "⇖";
-var nwarrow = "↖";
-var nwnear = "⤧";
-var Oacute = "Ó";
-var oacute = "ó";
-var oast = "⊛";
-var Ocirc = "Ô";
-var ocirc = "ô";
-var ocir = "⊚";
-var Ocy = "О";
-var ocy = "о";
-var odash = "⊝";
-var Odblac = "Ő";
-var odblac = "ő";
-var odiv = "⨸";
-var odot = "⊙";
-var odsold = "⦼";
-var OElig = "Œ";
-var oelig = "œ";
-var ofcir = "⦿";
-var Ofr = "𝔒";
-var ofr = "𝔬";
-var ogon = "˛";
-var Ograve = "Ò";
-var ograve = "ò";
-var ogt = "⧁";
-var ohbar = "⦵";
-var ohm = "Ω";
-var oint = "∮";
-var olarr = "↺";
-var olcir = "⦾";
-var olcross = "⦻";
-var oline = "‾";
-var olt = "⧀";
-var Omacr = "Ō";
-var omacr = "ō";
-var Omega = "Ω";
-var omega = "ω";
-var Omicron = "Ο";
-var omicron = "ο";
-var omid = "⦶";
-var ominus = "⊖";
-var Oopf = "𝕆";
-var oopf = "𝕠";
-var opar = "⦷";
-var OpenCurlyDoubleQuote = "“";
-var OpenCurlyQuote = "‘";
-var operp = "⦹";
-var oplus = "⊕";
-var orarr = "↻";
-var Or = "⩔";
-var or = "∨";
-var ord = "⩝";
-var order = "ℴ";
-var orderof = "ℴ";
-var ordf = "ª";
-var ordm = "º";
-var origof = "⊶";
-var oror = "⩖";
-var orslope = "⩗";
-var orv = "⩛";
-var oS = "Ⓢ";
-var Oscr = "𝒪";
-var oscr = "ℴ";
-var Oslash = "Ø";
-var oslash = "ø";
-var osol = "⊘";
-var Otilde = "Õ";
-var otilde = "õ";
-var otimesas = "⨶";
-var Otimes = "⨷";
-var otimes = "⊗";
-var Ouml = "Ö";
-var ouml = "ö";
-var ovbar = "⌽";
-var OverBar = "‾";
-var OverBrace = "⏞";
-var OverBracket = "⎴";
-var OverParenthesis = "⏜";
-var para = "¶";
-var parallel = "∥";
-var par = "∥";
-var parsim = "⫳";
-var parsl = "⫽";
-var part = "∂";
-var PartialD = "∂";
-var Pcy = "П";
-var pcy = "п";
-var percnt = "%";
-var period = ".";
-var permil = "‰";
-var perp = "⊥";
-var pertenk = "‱";
-var Pfr = "𝔓";
-var pfr = "𝔭";
-var Phi = "Φ";
-var phi = "φ";
-var phiv = "ϕ";
-var phmmat = "ℳ";
-var phone = "☎";
-var Pi = "Π";
-var pi = "π";
-var pitchfork = "⋔";
-var piv = "ϖ";
-var planck = "ℏ";
-var planckh = "ℎ";
-var plankv = "ℏ";
-var plusacir = "⨣";
-var plusb = "⊞";
-var pluscir = "⨢";
-var plus = "+";
-var plusdo = "∔";
-var plusdu = "⨥";
-var pluse = "⩲";
-var PlusMinus = "±";
-var plusmn = "±";
-var plussim = "⨦";
-var plustwo = "⨧";
-var pm = "±";
-var Poincareplane = "ℌ";
-var pointint = "⨕";
-var popf = "𝕡";
-var Popf = "ℙ";
-var pound = "£";
-var prap = "⪷";
-var Pr = "⪻";
-var pr = "≺";
-var prcue = "≼";
-var precapprox = "⪷";
-var prec = "≺";
-var preccurlyeq = "≼";
-var Precedes = "≺";
-var PrecedesEqual = "⪯";
-var PrecedesSlantEqual = "≼";
-var PrecedesTilde = "≾";
-var preceq = "⪯";
-var precnapprox = "⪹";
-var precneqq = "⪵";
-var precnsim = "⋨";
-var pre = "⪯";
-var prE = "⪳";
-var precsim = "≾";
-var prime = "′";
-var Prime = "″";
-var primes = "ℙ";
-var prnap = "⪹";
-var prnE = "⪵";
-var prnsim = "⋨";
-var prod = "∏";
-var Product = "∏";
-var profalar = "⌮";
-var profline = "⌒";
-var profsurf = "⌓";
-var prop = "∝";
-var Proportional = "∝";
-var Proportion = "∷";
-var propto = "∝";
-var prsim = "≾";
-var prurel = "⊰";
-var Pscr = "𝒫";
-var pscr = "𝓅";
-var Psi = "Ψ";
-var psi = "ψ";
-var puncsp = " ";
-var Qfr = "𝔔";
-var qfr = "𝔮";
-var qint = "⨌";
-var qopf = "𝕢";
-var Qopf = "ℚ";
-var qprime = "⁗";
-var Qscr = "𝒬";
-var qscr = "𝓆";
-var quaternions = "ℍ";
-var quatint = "⨖";
-var quest = "?";
-var questeq = "≟";
-var quot = "\"";
-var QUOT = "\"";
-var rAarr = "⇛";
-var race = "∽̱";
-var Racute = "Ŕ";
-var racute = "ŕ";
-var radic = "√";
-var raemptyv = "⦳";
-var rang = "⟩";
-var Rang = "⟫";
-var rangd = "⦒";
-var range = "⦥";
-var rangle = "⟩";
-var raquo = "»";
-var rarrap = "⥵";
-var rarrb = "⇥";
-var rarrbfs = "⤠";
-var rarrc = "⤳";
-var rarr = "→";
-var Rarr = "↠";
-var rArr = "⇒";
-var rarrfs = "⤞";
-var rarrhk = "↪";
-var rarrlp = "↬";
-var rarrpl = "⥅";
-var rarrsim = "⥴";
-var Rarrtl = "⤖";
-var rarrtl = "↣";
-var rarrw = "↝";
-var ratail = "⤚";
-var rAtail = "⤜";
-var ratio = "∶";
-var rationals = "ℚ";
-var rbarr = "⤍";
-var rBarr = "⤏";
-var RBarr = "⤐";
-var rbbrk = "❳";
-var rbrace = "}";
-var rbrack = "]";
-var rbrke = "⦌";
-var rbrksld = "⦎";
-var rbrkslu = "⦐";
-var Rcaron = "Ř";
-var rcaron = "ř";
-var Rcedil = "Ŗ";
-var rcedil = "ŗ";
-var rceil = "⌉";
-var rcub = "}";
-var Rcy = "Р";
-var rcy = "р";
-var rdca = "⤷";
-var rdldhar = "⥩";
-var rdquo = "”";
-var rdquor = "”";
-var rdsh = "↳";
-var real = "ℜ";
-var realine = "ℛ";
-var realpart = "ℜ";
-var reals = "ℝ";
-var Re = "ℜ";
-var rect = "▭";
-var reg = "®";
-var REG = "®";
-var ReverseElement = "∋";
-var ReverseEquilibrium = "⇋";
-var ReverseUpEquilibrium = "⥯";
-var rfisht = "⥽";
-var rfloor = "⌋";
-var rfr = "𝔯";
-var Rfr = "ℜ";
-var rHar = "⥤";
-var rhard = "⇁";
-var rharu = "⇀";
-var rharul = "⥬";
-var Rho = "Ρ";
-var rho = "ρ";
-var rhov = "ϱ";
-var RightAngleBracket = "⟩";
-var RightArrowBar = "⇥";
-var rightarrow = "→";
-var RightArrow = "→";
-var Rightarrow = "⇒";
-var RightArrowLeftArrow = "⇄";
-var rightarrowtail = "↣";
-var RightCeiling = "⌉";
-var RightDoubleBracket = "⟧";
-var RightDownTeeVector = "⥝";
-var RightDownVectorBar = "⥕";
-var RightDownVector = "⇂";
-var RightFloor = "⌋";
-var rightharpoondown = "⇁";
-var rightharpoonup = "⇀";
-var rightleftarrows = "⇄";
-var rightleftharpoons = "⇌";
-var rightrightarrows = "⇉";
-var rightsquigarrow = "↝";
-var RightTeeArrow = "↦";
-var RightTee = "⊢";
-var RightTeeVector = "⥛";
-var rightthreetimes = "⋌";
-var RightTriangleBar = "⧐";
-var RightTriangle = "⊳";
-var RightTriangleEqual = "⊵";
-var RightUpDownVector = "⥏";
-var RightUpTeeVector = "⥜";
-var RightUpVectorBar = "⥔";
-var RightUpVector = "↾";
-var RightVectorBar = "⥓";
-var RightVector = "⇀";
-var ring = "˚";
-var risingdotseq = "≓";
-var rlarr = "⇄";
-var rlhar = "⇌";
-var rlm = "‏";
-var rmoustache = "⎱";
-var rmoust = "⎱";
-var rnmid = "⫮";
-var roang = "⟭";
-var roarr = "⇾";
-var robrk = "⟧";
-var ropar = "⦆";
-var ropf = "𝕣";
-var Ropf = "ℝ";
-var roplus = "⨮";
-var rotimes = "⨵";
-var RoundImplies = "⥰";
-var rpar = ")";
-var rpargt = "⦔";
-var rppolint = "⨒";
-var rrarr = "⇉";
-var Rrightarrow = "⇛";
-var rsaquo = "›";
-var rscr = "𝓇";
-var Rscr = "ℛ";
-var rsh = "↱";
-var Rsh = "↱";
-var rsqb = "]";
-var rsquo = "’";
-var rsquor = "’";
-var rthree = "⋌";
-var rtimes = "⋊";
-var rtri = "▹";
-var rtrie = "⊵";
-var rtrif = "▸";
-var rtriltri = "⧎";
-var RuleDelayed = "⧴";
-var ruluhar = "⥨";
-var rx = "℞";
-var Sacute = "Ś";
-var sacute = "ś";
-var sbquo = "‚";
-var scap = "⪸";
-var Scaron = "Š";
-var scaron = "š";
-var Sc = "⪼";
-var sc = "≻";
-var sccue = "≽";
-var sce = "⪰";
-var scE = "⪴";
-var Scedil = "Ş";
-var scedil = "ş";
-var Scirc = "Ŝ";
-var scirc = "ŝ";
-var scnap = "⪺";
-var scnE = "⪶";
-var scnsim = "⋩";
-var scpolint = "⨓";
-var scsim = "≿";
-var Scy = "С";
-var scy = "с";
-var sdotb = "⊡";
-var sdot = "⋅";
-var sdote = "⩦";
-var searhk = "⤥";
-var searr = "↘";
-var seArr = "⇘";
-var searrow = "↘";
-var sect = "§";
-var semi = ";";
-var seswar = "⤩";
-var setminus = "∖";
-var setmn = "∖";
-var sext = "✶";
-var Sfr = "𝔖";
-var sfr = "𝔰";
-var sfrown = "⌢";
-var sharp = "♯";
-var SHCHcy = "Щ";
-var shchcy = "щ";
-var SHcy = "Ш";
-var shcy = "ш";
-var ShortDownArrow = "↓";
-var ShortLeftArrow = "←";
-var shortmid = "∣";
-var shortparallel = "∥";
-var ShortRightArrow = "→";
-var ShortUpArrow = "↑";
-var shy = "­";
-var Sigma = "Σ";
-var sigma = "σ";
-var sigmaf = "ς";
-var sigmav = "ς";
-var sim = "∼";
-var simdot = "⩪";
-var sime = "≃";
-var simeq = "≃";
-var simg = "⪞";
-var simgE = "⪠";
-var siml = "⪝";
-var simlE = "⪟";
-var simne = "≆";
-var simplus = "⨤";
-var simrarr = "⥲";
-var slarr = "←";
-var SmallCircle = "∘";
-var smallsetminus = "∖";
-var smashp = "⨳";
-var smeparsl = "⧤";
-var smid = "∣";
-var smile = "⌣";
-var smt = "⪪";
-var smte = "⪬";
-var smtes = "⪬︀";
-var SOFTcy = "Ь";
-var softcy = "ь";
-var solbar = "⌿";
-var solb = "⧄";
-var sol = "/";
-var Sopf = "𝕊";
-var sopf = "𝕤";
-var spades = "♠";
-var spadesuit = "♠";
-var spar = "∥";
-var sqcap = "⊓";
-var sqcaps = "⊓︀";
-var sqcup = "⊔";
-var sqcups = "⊔︀";
-var Sqrt = "√";
-var sqsub = "⊏";
-var sqsube = "⊑";
-var sqsubset = "⊏";
-var sqsubseteq = "⊑";
-var sqsup = "⊐";
-var sqsupe = "⊒";
-var sqsupset = "⊐";
-var sqsupseteq = "⊒";
-var square = "□";
-var Square = "□";
-var SquareIntersection = "⊓";
-var SquareSubset = "⊏";
-var SquareSubsetEqual = "⊑";
-var SquareSuperset = "⊐";
-var SquareSupersetEqual = "⊒";
-var SquareUnion = "⊔";
-var squarf = "▪";
-var squ = "□";
-var squf = "▪";
-var srarr = "→";
-var Sscr = "𝒮";
-var sscr = "𝓈";
-var ssetmn = "∖";
-var ssmile = "⌣";
-var sstarf = "⋆";
-var Star = "⋆";
-var star = "☆";
-var starf = "★";
-var straightepsilon = "ϵ";
-var straightphi = "ϕ";
-var strns = "¯";
-var sub = "⊂";
-var Sub = "⋐";
-var subdot = "⪽";
-var subE = "⫅";
-var sube = "⊆";
-var subedot = "⫃";
-var submult = "⫁";
-var subnE = "⫋";
-var subne = "⊊";
-var subplus = "⪿";
-var subrarr = "⥹";
-var subset = "⊂";
-var Subset = "⋐";
-var subseteq = "⊆";
-var subseteqq = "⫅";
-var SubsetEqual = "⊆";
-var subsetneq = "⊊";
-var subsetneqq = "⫋";
-var subsim = "⫇";
-var subsub = "⫕";
-var subsup = "⫓";
-var succapprox = "⪸";
-var succ = "≻";
-var succcurlyeq = "≽";
-var Succeeds = "≻";
-var SucceedsEqual = "⪰";
-var SucceedsSlantEqual = "≽";
-var SucceedsTilde = "≿";
-var succeq = "⪰";
-var succnapprox = "⪺";
-var succneqq = "⪶";
-var succnsim = "⋩";
-var succsim = "≿";
-var SuchThat = "∋";
-var sum = "∑";
-var Sum = "∑";
-var sung = "♪";
-var sup1 = "¹";
-var sup2 = "²";
-var sup3 = "³";
-var sup = "⊃";
-var Sup = "⋑";
-var supdot = "⪾";
-var supdsub = "⫘";
-var supE = "⫆";
-var supe = "⊇";
-var supedot = "⫄";
-var Superset = "⊃";
-var SupersetEqual = "⊇";
-var suphsol = "⟉";
-var suphsub = "⫗";
-var suplarr = "⥻";
-var supmult = "⫂";
-var supnE = "⫌";
-var supne = "⊋";
-var supplus = "⫀";
-var supset = "⊃";
-var Supset = "⋑";
-var supseteq = "⊇";
-var supseteqq = "⫆";
-var supsetneq = "⊋";
-var supsetneqq = "⫌";
-var supsim = "⫈";
-var supsub = "⫔";
-var supsup = "⫖";
-var swarhk = "⤦";
-var swarr = "↙";
-var swArr = "⇙";
-var swarrow = "↙";
-var swnwar = "⤪";
-var szlig = "ß";
-var Tab = "\t";
-var target = "⌖";
-var Tau = "Τ";
-var tau = "τ";
-var tbrk = "⎴";
-var Tcaron = "Ť";
-var tcaron = "ť";
-var Tcedil = "Ţ";
-var tcedil = "ţ";
-var Tcy = "Т";
-var tcy = "т";
-var tdot = "⃛";
-var telrec = "⌕";
-var Tfr = "𝔗";
-var tfr = "𝔱";
-var there4 = "∴";
-var therefore = "∴";
-var Therefore = "∴";
-var Theta = "Θ";
-var theta = "θ";
-var thetasym = "ϑ";
-var thetav = "ϑ";
-var thickapprox = "≈";
-var thicksim = "∼";
-var ThickSpace = "  ";
-var ThinSpace = " ";
-var thinsp = " ";
-var thkap = "≈";
-var thksim = "∼";
-var THORN = "Þ";
-var thorn = "þ";
-var tilde = "˜";
-var Tilde = "∼";
-var TildeEqual = "≃";
-var TildeFullEqual = "≅";
-var TildeTilde = "≈";
-var timesbar = "⨱";
-var timesb = "⊠";
-var times = "×";
-var timesd = "⨰";
-var tint = "∭";
-var toea = "⤨";
-var topbot = "⌶";
-var topcir = "⫱";
-var top = "⊤";
-var Topf = "𝕋";
-var topf = "𝕥";
-var topfork = "⫚";
-var tosa = "⤩";
-var tprime = "‴";
-var trade = "™";
-var TRADE = "™";
-var triangle = "▵";
-var triangledown = "▿";
-var triangleleft = "◃";
-var trianglelefteq = "⊴";
-var triangleq = "≜";
-var triangleright = "▹";
-var trianglerighteq = "⊵";
-var tridot = "◬";
-var trie = "≜";
-var triminus = "⨺";
-var TripleDot = "⃛";
-var triplus = "⨹";
-var trisb = "⧍";
-var tritime = "⨻";
-var trpezium = "⏢";
-var Tscr = "𝒯";
-var tscr = "𝓉";
-var TScy = "Ц";
-var tscy = "ц";
-var TSHcy = "Ћ";
-var tshcy = "ћ";
-var Tstrok = "Ŧ";
-var tstrok = "ŧ";
-var twixt = "≬";
-var twoheadleftarrow = "↞";
-var twoheadrightarrow = "↠";
-var Uacute = "Ú";
-var uacute = "ú";
-var uarr = "↑";
-var Uarr = "↟";
-var uArr = "⇑";
-var Uarrocir = "⥉";
-var Ubrcy = "Ў";
-var ubrcy = "ў";
-var Ubreve = "Ŭ";
-var ubreve = "ŭ";
-var Ucirc = "Û";
-var ucirc = "û";
-var Ucy = "У";
-var ucy = "у";
-var udarr = "⇅";
-var Udblac = "Ű";
-var udblac = "ű";
-var udhar = "⥮";
-var ufisht = "⥾";
-var Ufr = "𝔘";
-var ufr = "𝔲";
-var Ugrave = "Ù";
-var ugrave = "ù";
-var uHar = "⥣";
-var uharl = "↿";
-var uharr = "↾";
-var uhblk = "▀";
-var ulcorn = "⌜";
-var ulcorner = "⌜";
-var ulcrop = "⌏";
-var ultri = "◸";
-var Umacr = "Ū";
-var umacr = "ū";
-var uml = "¨";
-var UnderBar = "_";
-var UnderBrace = "⏟";
-var UnderBracket = "⎵";
-var UnderParenthesis = "⏝";
-var Union = "⋃";
-var UnionPlus = "⊎";
-var Uogon = "Ų";
-var uogon = "ų";
-var Uopf = "𝕌";
-var uopf = "𝕦";
-var UpArrowBar = "⤒";
-var uparrow = "↑";
-var UpArrow = "↑";
-var Uparrow = "⇑";
-var UpArrowDownArrow = "⇅";
-var updownarrow = "↕";
-var UpDownArrow = "↕";
-var Updownarrow = "⇕";
-var UpEquilibrium = "⥮";
-var upharpoonleft = "↿";
-var upharpoonright = "↾";
-var uplus = "⊎";
-var UpperLeftArrow = "↖";
-var UpperRightArrow = "↗";
-var upsi = "υ";
-var Upsi = "ϒ";
-var upsih = "ϒ";
-var Upsilon = "Υ";
-var upsilon = "υ";
-var UpTeeArrow = "↥";
-var UpTee = "⊥";
-var upuparrows = "⇈";
-var urcorn = "⌝";
-var urcorner = "⌝";
-var urcrop = "⌎";
-var Uring = "Ů";
-var uring = "ů";
-var urtri = "◹";
-var Uscr = "𝒰";
-var uscr = "𝓊";
-var utdot = "⋰";
-var Utilde = "Ũ";
-var utilde = "ũ";
-var utri = "▵";
-var utrif = "▴";
-var uuarr = "⇈";
-var Uuml = "Ü";
-var uuml = "ü";
-var uwangle = "⦧";
-var vangrt = "⦜";
-var varepsilon = "ϵ";
-var varkappa = "ϰ";
-var varnothing = "∅";
-var varphi = "ϕ";
-var varpi = "ϖ";
-var varpropto = "∝";
-var varr = "↕";
-var vArr = "⇕";
-var varrho = "ϱ";
-var varsigma = "ς";
-var varsubsetneq = "⊊︀";
-var varsubsetneqq = "⫋︀";
-var varsupsetneq = "⊋︀";
-var varsupsetneqq = "⫌︀";
-var vartheta = "ϑ";
-var vartriangleleft = "⊲";
-var vartriangleright = "⊳";
-var vBar = "⫨";
-var Vbar = "⫫";
-var vBarv = "⫩";
-var Vcy = "В";
-var vcy = "в";
-var vdash = "⊢";
-var vDash = "⊨";
-var Vdash = "⊩";
-var VDash = "⊫";
-var Vdashl = "⫦";
-var veebar = "⊻";
-var vee = "∨";
-var Vee = "⋁";
-var veeeq = "≚";
-var vellip = "⋮";
-var verbar = "|";
-var Verbar = "‖";
-var vert = "|";
-var Vert = "‖";
-var VerticalBar = "∣";
-var VerticalLine = "|";
-var VerticalSeparator = "❘";
-var VerticalTilde = "≀";
-var VeryThinSpace = " ";
-var Vfr = "𝔙";
-var vfr = "𝔳";
-var vltri = "⊲";
-var vnsub = "⊂⃒";
-var vnsup = "⊃⃒";
-var Vopf = "𝕍";
-var vopf = "𝕧";
-var vprop = "∝";
-var vrtri = "⊳";
-var Vscr = "𝒱";
-var vscr = "𝓋";
-var vsubnE = "⫋︀";
-var vsubne = "⊊︀";
-var vsupnE = "⫌︀";
-var vsupne = "⊋︀";
-var Vvdash = "⊪";
-var vzigzag = "⦚";
-var Wcirc = "Ŵ";
-var wcirc = "ŵ";
-var wedbar = "⩟";
-var wedge = "∧";
-var Wedge = "⋀";
-var wedgeq = "≙";
-var weierp = "℘";
-var Wfr = "𝔚";
-var wfr = "𝔴";
-var Wopf = "𝕎";
-var wopf = "𝕨";
-var wp = "℘";
-var wr = "≀";
-var wreath = "≀";
-var Wscr = "𝒲";
-var wscr = "𝓌";
-var xcap = "⋂";
-var xcirc = "◯";
-var xcup = "⋃";
-var xdtri = "▽";
-var Xfr = "𝔛";
-var xfr = "𝔵";
-var xharr = "⟷";
-var xhArr = "⟺";
-var Xi = "Ξ";
-var xi = "ξ";
-var xlarr = "⟵";
-var xlArr = "⟸";
-var xmap = "⟼";
-var xnis = "⋻";
-var xodot = "⨀";
-var Xopf = "𝕏";
-var xopf = "𝕩";
-var xoplus = "⨁";
-var xotime = "⨂";
-var xrarr = "⟶";
-var xrArr = "⟹";
-var Xscr = "𝒳";
-var xscr = "𝓍";
-var xsqcup = "⨆";
-var xuplus = "⨄";
-var xutri = "△";
-var xvee = "⋁";
-var xwedge = "⋀";
-var Yacute = "Ý";
-var yacute = "ý";
-var YAcy = "Я";
-var yacy = "я";
-var Ycirc = "Ŷ";
-var ycirc = "ŷ";
-var Ycy = "Ы";
-var ycy = "ы";
-var yen = "¥";
-var Yfr = "𝔜";
-var yfr = "𝔶";
-var YIcy = "Ї";
-var yicy = "ї";
-var Yopf = "𝕐";
-var yopf = "𝕪";
-var Yscr = "𝒴";
-var yscr = "𝓎";
-var YUcy = "Ю";
-var yucy = "ю";
-var yuml = "ÿ";
-var Yuml = "Ÿ";
-var Zacute = "Ź";
-var zacute = "ź";
-var Zcaron = "Ž";
-var zcaron = "ž";
-var Zcy = "З";
-var zcy = "з";
-var Zdot = "Ż";
-var zdot = "ż";
-var zeetrf = "ℨ";
-var ZeroWidthSpace = "​";
-var Zeta = "Ζ";
-var zeta = "ζ";
-var zfr = "𝔷";
-var Zfr = "ℨ";
-var ZHcy = "Ж";
-var zhcy = "ж";
-var zigrarr = "⇝";
-var zopf = "𝕫";
-var Zopf = "ℤ";
-var Zscr = "𝒵";
-var zscr = "𝓏";
-var zwj = "‍";
-var zwnj = "‌";
-var entities = {
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	"in": "∈",
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	"Map": "⤅",
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj
-};
-
-var entities$1 = {
-	__proto__: null,
-	Aacute: Aacute,
-	aacute: aacute,
-	Abreve: Abreve,
-	abreve: abreve,
-	ac: ac,
-	acd: acd,
-	acE: acE,
-	Acirc: Acirc,
-	acirc: acirc,
-	acute: acute,
-	Acy: Acy,
-	acy: acy,
-	AElig: AElig,
-	aelig: aelig,
-	af: af,
-	Afr: Afr,
-	afr: afr,
-	Agrave: Agrave,
-	agrave: agrave,
-	alefsym: alefsym,
-	aleph: aleph,
-	Alpha: Alpha,
-	alpha: alpha,
-	Amacr: Amacr,
-	amacr: amacr,
-	amalg: amalg,
-	amp: amp,
-	AMP: AMP,
-	andand: andand,
-	And: And,
-	and: and,
-	andd: andd,
-	andslope: andslope,
-	andv: andv,
-	ang: ang,
-	ange: ange,
-	angle: angle,
-	angmsdaa: angmsdaa,
-	angmsdab: angmsdab,
-	angmsdac: angmsdac,
-	angmsdad: angmsdad,
-	angmsdae: angmsdae,
-	angmsdaf: angmsdaf,
-	angmsdag: angmsdag,
-	angmsdah: angmsdah,
-	angmsd: angmsd,
-	angrt: angrt,
-	angrtvb: angrtvb,
-	angrtvbd: angrtvbd,
-	angsph: angsph,
-	angst: angst,
-	angzarr: angzarr,
-	Aogon: Aogon,
-	aogon: aogon,
-	Aopf: Aopf,
-	aopf: aopf,
-	apacir: apacir,
-	ap: ap,
-	apE: apE,
-	ape: ape,
-	apid: apid,
-	apos: apos,
-	ApplyFunction: ApplyFunction,
-	approx: approx,
-	approxeq: approxeq,
-	Aring: Aring,
-	aring: aring,
-	Ascr: Ascr,
-	ascr: ascr,
-	Assign: Assign,
-	ast: ast,
-	asymp: asymp,
-	asympeq: asympeq,
-	Atilde: Atilde,
-	atilde: atilde,
-	Auml: Auml,
-	auml: auml,
-	awconint: awconint,
-	awint: awint,
-	backcong: backcong,
-	backepsilon: backepsilon,
-	backprime: backprime,
-	backsim: backsim,
-	backsimeq: backsimeq,
-	Backslash: Backslash,
-	Barv: Barv,
-	barvee: barvee,
-	barwed: barwed,
-	Barwed: Barwed,
-	barwedge: barwedge,
-	bbrk: bbrk,
-	bbrktbrk: bbrktbrk,
-	bcong: bcong,
-	Bcy: Bcy,
-	bcy: bcy,
-	bdquo: bdquo,
-	becaus: becaus,
-	because: because,
-	Because: Because,
-	bemptyv: bemptyv,
-	bepsi: bepsi,
-	bernou: bernou,
-	Bernoullis: Bernoullis,
-	Beta: Beta,
-	beta: beta,
-	beth: beth,
-	between: between,
-	Bfr: Bfr,
-	bfr: bfr,
-	bigcap: bigcap,
-	bigcirc: bigcirc,
-	bigcup: bigcup,
-	bigodot: bigodot,
-	bigoplus: bigoplus,
-	bigotimes: bigotimes,
-	bigsqcup: bigsqcup,
-	bigstar: bigstar,
-	bigtriangledown: bigtriangledown,
-	bigtriangleup: bigtriangleup,
-	biguplus: biguplus,
-	bigvee: bigvee,
-	bigwedge: bigwedge,
-	bkarow: bkarow,
-	blacklozenge: blacklozenge,
-	blacksquare: blacksquare,
-	blacktriangle: blacktriangle,
-	blacktriangledown: blacktriangledown,
-	blacktriangleleft: blacktriangleleft,
-	blacktriangleright: blacktriangleright,
-	blank: blank,
-	blk12: blk12,
-	blk14: blk14,
-	blk34: blk34,
-	block: block,
-	bne: bne,
-	bnequiv: bnequiv,
-	bNot: bNot,
-	bnot: bnot,
-	Bopf: Bopf,
-	bopf: bopf,
-	bot: bot,
-	bottom: bottom,
-	bowtie: bowtie,
-	boxbox: boxbox,
-	boxdl: boxdl,
-	boxdL: boxdL,
-	boxDl: boxDl,
-	boxDL: boxDL,
-	boxdr: boxdr,
-	boxdR: boxdR,
-	boxDr: boxDr,
-	boxDR: boxDR,
-	boxh: boxh,
-	boxH: boxH,
-	boxhd: boxhd,
-	boxHd: boxHd,
-	boxhD: boxhD,
-	boxHD: boxHD,
-	boxhu: boxhu,
-	boxHu: boxHu,
-	boxhU: boxhU,
-	boxHU: boxHU,
-	boxminus: boxminus,
-	boxplus: boxplus,
-	boxtimes: boxtimes,
-	boxul: boxul,
-	boxuL: boxuL,
-	boxUl: boxUl,
-	boxUL: boxUL,
-	boxur: boxur,
-	boxuR: boxuR,
-	boxUr: boxUr,
-	boxUR: boxUR,
-	boxv: boxv,
-	boxV: boxV,
-	boxvh: boxvh,
-	boxvH: boxvH,
-	boxVh: boxVh,
-	boxVH: boxVH,
-	boxvl: boxvl,
-	boxvL: boxvL,
-	boxVl: boxVl,
-	boxVL: boxVL,
-	boxvr: boxvr,
-	boxvR: boxvR,
-	boxVr: boxVr,
-	boxVR: boxVR,
-	bprime: bprime,
-	breve: breve,
-	Breve: Breve,
-	brvbar: brvbar,
-	bscr: bscr,
-	Bscr: Bscr,
-	bsemi: bsemi,
-	bsim: bsim,
-	bsime: bsime,
-	bsolb: bsolb,
-	bsol: bsol,
-	bsolhsub: bsolhsub,
-	bull: bull,
-	bullet: bullet,
-	bump: bump,
-	bumpE: bumpE,
-	bumpe: bumpe,
-	Bumpeq: Bumpeq,
-	bumpeq: bumpeq,
-	Cacute: Cacute,
-	cacute: cacute,
-	capand: capand,
-	capbrcup: capbrcup,
-	capcap: capcap,
-	cap: cap,
-	Cap: Cap,
-	capcup: capcup,
-	capdot: capdot,
-	CapitalDifferentialD: CapitalDifferentialD,
-	caps: caps,
-	caret: caret,
-	caron: caron,
-	Cayleys: Cayleys,
-	ccaps: ccaps,
-	Ccaron: Ccaron,
-	ccaron: ccaron,
-	Ccedil: Ccedil,
-	ccedil: ccedil,
-	Ccirc: Ccirc,
-	ccirc: ccirc,
-	Cconint: Cconint,
-	ccups: ccups,
-	ccupssm: ccupssm,
-	Cdot: Cdot,
-	cdot: cdot,
-	cedil: cedil,
-	Cedilla: Cedilla,
-	cemptyv: cemptyv,
-	cent: cent,
-	centerdot: centerdot,
-	CenterDot: CenterDot,
-	cfr: cfr,
-	Cfr: Cfr,
-	CHcy: CHcy,
-	chcy: chcy,
-	check: check,
-	checkmark: checkmark,
-	Chi: Chi,
-	chi: chi,
-	circ: circ,
-	circeq: circeq,
-	circlearrowleft: circlearrowleft,
-	circlearrowright: circlearrowright,
-	circledast: circledast,
-	circledcirc: circledcirc,
-	circleddash: circleddash,
-	CircleDot: CircleDot,
-	circledR: circledR,
-	circledS: circledS,
-	CircleMinus: CircleMinus,
-	CirclePlus: CirclePlus,
-	CircleTimes: CircleTimes,
-	cir: cir,
-	cirE: cirE,
-	cire: cire,
-	cirfnint: cirfnint,
-	cirmid: cirmid,
-	cirscir: cirscir,
-	ClockwiseContourIntegral: ClockwiseContourIntegral,
-	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-	CloseCurlyQuote: CloseCurlyQuote,
-	clubs: clubs,
-	clubsuit: clubsuit,
-	colon: colon,
-	Colon: Colon,
-	Colone: Colone,
-	colone: colone,
-	coloneq: coloneq,
-	comma: comma,
-	commat: commat,
-	comp: comp,
-	compfn: compfn,
-	complement: complement,
-	complexes: complexes,
-	cong: cong,
-	congdot: congdot,
-	Congruent: Congruent,
-	conint: conint,
-	Conint: Conint,
-	ContourIntegral: ContourIntegral,
-	copf: copf,
-	Copf: Copf,
-	coprod: coprod,
-	Coproduct: Coproduct,
-	copy: copy,
-	COPY: COPY,
-	copysr: copysr,
-	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-	crarr: crarr,
-	cross: cross,
-	Cross: Cross,
-	Cscr: Cscr,
-	cscr: cscr,
-	csub: csub,
-	csube: csube,
-	csup: csup,
-	csupe: csupe,
-	ctdot: ctdot,
-	cudarrl: cudarrl,
-	cudarrr: cudarrr,
-	cuepr: cuepr,
-	cuesc: cuesc,
-	cularr: cularr,
-	cularrp: cularrp,
-	cupbrcap: cupbrcap,
-	cupcap: cupcap,
-	CupCap: CupCap,
-	cup: cup,
-	Cup: Cup,
-	cupcup: cupcup,
-	cupdot: cupdot,
-	cupor: cupor,
-	cups: cups,
-	curarr: curarr,
-	curarrm: curarrm,
-	curlyeqprec: curlyeqprec,
-	curlyeqsucc: curlyeqsucc,
-	curlyvee: curlyvee,
-	curlywedge: curlywedge,
-	curren: curren,
-	curvearrowleft: curvearrowleft,
-	curvearrowright: curvearrowright,
-	cuvee: cuvee,
-	cuwed: cuwed,
-	cwconint: cwconint,
-	cwint: cwint,
-	cylcty: cylcty,
-	dagger: dagger,
-	Dagger: Dagger,
-	daleth: daleth,
-	darr: darr,
-	Darr: Darr,
-	dArr: dArr,
-	dash: dash,
-	Dashv: Dashv,
-	dashv: dashv,
-	dbkarow: dbkarow,
-	dblac: dblac,
-	Dcaron: Dcaron,
-	dcaron: dcaron,
-	Dcy: Dcy,
-	dcy: dcy,
-	ddagger: ddagger,
-	ddarr: ddarr,
-	DD: DD,
-	dd: dd,
-	DDotrahd: DDotrahd,
-	ddotseq: ddotseq,
-	deg: deg,
-	Del: Del,
-	Delta: Delta,
-	delta: delta,
-	demptyv: demptyv,
-	dfisht: dfisht,
-	Dfr: Dfr,
-	dfr: dfr,
-	dHar: dHar,
-	dharl: dharl,
-	dharr: dharr,
-	DiacriticalAcute: DiacriticalAcute,
-	DiacriticalDot: DiacriticalDot,
-	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-	DiacriticalGrave: DiacriticalGrave,
-	DiacriticalTilde: DiacriticalTilde,
-	diam: diam,
-	diamond: diamond,
-	Diamond: Diamond,
-	diamondsuit: diamondsuit,
-	diams: diams,
-	die: die,
-	DifferentialD: DifferentialD,
-	digamma: digamma,
-	disin: disin,
-	div: div,
-	divide: divide,
-	divideontimes: divideontimes,
-	divonx: divonx,
-	DJcy: DJcy,
-	djcy: djcy,
-	dlcorn: dlcorn,
-	dlcrop: dlcrop,
-	dollar: dollar,
-	Dopf: Dopf,
-	dopf: dopf,
-	Dot: Dot,
-	dot: dot,
-	DotDot: DotDot,
-	doteq: doteq,
-	doteqdot: doteqdot,
-	DotEqual: DotEqual,
-	dotminus: dotminus,
-	dotplus: dotplus,
-	dotsquare: dotsquare,
-	doublebarwedge: doublebarwedge,
-	DoubleContourIntegral: DoubleContourIntegral,
-	DoubleDot: DoubleDot,
-	DoubleDownArrow: DoubleDownArrow,
-	DoubleLeftArrow: DoubleLeftArrow,
-	DoubleLeftRightArrow: DoubleLeftRightArrow,
-	DoubleLeftTee: DoubleLeftTee,
-	DoubleLongLeftArrow: DoubleLongLeftArrow,
-	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-	DoubleLongRightArrow: DoubleLongRightArrow,
-	DoubleRightArrow: DoubleRightArrow,
-	DoubleRightTee: DoubleRightTee,
-	DoubleUpArrow: DoubleUpArrow,
-	DoubleUpDownArrow: DoubleUpDownArrow,
-	DoubleVerticalBar: DoubleVerticalBar,
-	DownArrowBar: DownArrowBar,
-	downarrow: downarrow,
-	DownArrow: DownArrow,
-	Downarrow: Downarrow,
-	DownArrowUpArrow: DownArrowUpArrow,
-	DownBreve: DownBreve,
-	downdownarrows: downdownarrows,
-	downharpoonleft: downharpoonleft,
-	downharpoonright: downharpoonright,
-	DownLeftRightVector: DownLeftRightVector,
-	DownLeftTeeVector: DownLeftTeeVector,
-	DownLeftVectorBar: DownLeftVectorBar,
-	DownLeftVector: DownLeftVector,
-	DownRightTeeVector: DownRightTeeVector,
-	DownRightVectorBar: DownRightVectorBar,
-	DownRightVector: DownRightVector,
-	DownTeeArrow: DownTeeArrow,
-	DownTee: DownTee,
-	drbkarow: drbkarow,
-	drcorn: drcorn,
-	drcrop: drcrop,
-	Dscr: Dscr,
-	dscr: dscr,
-	DScy: DScy,
-	dscy: dscy,
-	dsol: dsol,
-	Dstrok: Dstrok,
-	dstrok: dstrok,
-	dtdot: dtdot,
-	dtri: dtri,
-	dtrif: dtrif,
-	duarr: duarr,
-	duhar: duhar,
-	dwangle: dwangle,
-	DZcy: DZcy,
-	dzcy: dzcy,
-	dzigrarr: dzigrarr,
-	Eacute: Eacute,
-	eacute: eacute,
-	easter: easter,
-	Ecaron: Ecaron,
-	ecaron: ecaron,
-	Ecirc: Ecirc,
-	ecirc: ecirc,
-	ecir: ecir,
-	ecolon: ecolon,
-	Ecy: Ecy,
-	ecy: ecy,
-	eDDot: eDDot,
-	Edot: Edot,
-	edot: edot,
-	eDot: eDot,
-	ee: ee,
-	efDot: efDot,
-	Efr: Efr,
-	efr: efr,
-	eg: eg,
-	Egrave: Egrave,
-	egrave: egrave,
-	egs: egs,
-	egsdot: egsdot,
-	el: el,
-	Element: Element,
-	elinters: elinters,
-	ell: ell,
-	els: els,
-	elsdot: elsdot,
-	Emacr: Emacr,
-	emacr: emacr,
-	empty: empty,
-	emptyset: emptyset,
-	EmptySmallSquare: EmptySmallSquare,
-	emptyv: emptyv,
-	EmptyVerySmallSquare: EmptyVerySmallSquare,
-	emsp13: emsp13,
-	emsp14: emsp14,
-	emsp: emsp,
-	ENG: ENG,
-	eng: eng,
-	ensp: ensp,
-	Eogon: Eogon,
-	eogon: eogon,
-	Eopf: Eopf,
-	eopf: eopf,
-	epar: epar,
-	eparsl: eparsl,
-	eplus: eplus,
-	epsi: epsi,
-	Epsilon: Epsilon,
-	epsilon: epsilon,
-	epsiv: epsiv,
-	eqcirc: eqcirc,
-	eqcolon: eqcolon,
-	eqsim: eqsim,
-	eqslantgtr: eqslantgtr,
-	eqslantless: eqslantless,
-	Equal: Equal,
-	equals: equals,
-	EqualTilde: EqualTilde,
-	equest: equest,
-	Equilibrium: Equilibrium,
-	equiv: equiv,
-	equivDD: equivDD,
-	eqvparsl: eqvparsl,
-	erarr: erarr,
-	erDot: erDot,
-	escr: escr,
-	Escr: Escr,
-	esdot: esdot,
-	Esim: Esim,
-	esim: esim,
-	Eta: Eta,
-	eta: eta,
-	ETH: ETH,
-	eth: eth,
-	Euml: Euml,
-	euml: euml,
-	euro: euro,
-	excl: excl,
-	exist: exist,
-	Exists: Exists,
-	expectation: expectation,
-	exponentiale: exponentiale,
-	ExponentialE: ExponentialE,
-	fallingdotseq: fallingdotseq,
-	Fcy: Fcy,
-	fcy: fcy,
-	female: female,
-	ffilig: ffilig,
-	fflig: fflig,
-	ffllig: ffllig,
-	Ffr: Ffr,
-	ffr: ffr,
-	filig: filig,
-	FilledSmallSquare: FilledSmallSquare,
-	FilledVerySmallSquare: FilledVerySmallSquare,
-	fjlig: fjlig,
-	flat: flat,
-	fllig: fllig,
-	fltns: fltns,
-	fnof: fnof,
-	Fopf: Fopf,
-	fopf: fopf,
-	forall: forall,
-	ForAll: ForAll,
-	fork: fork,
-	forkv: forkv,
-	Fouriertrf: Fouriertrf,
-	fpartint: fpartint,
-	frac12: frac12,
-	frac13: frac13,
-	frac14: frac14,
-	frac15: frac15,
-	frac16: frac16,
-	frac18: frac18,
-	frac23: frac23,
-	frac25: frac25,
-	frac34: frac34,
-	frac35: frac35,
-	frac38: frac38,
-	frac45: frac45,
-	frac56: frac56,
-	frac58: frac58,
-	frac78: frac78,
-	frasl: frasl,
-	frown: frown,
-	fscr: fscr,
-	Fscr: Fscr,
-	gacute: gacute,
-	Gamma: Gamma,
-	gamma: gamma,
-	Gammad: Gammad,
-	gammad: gammad,
-	gap: gap,
-	Gbreve: Gbreve,
-	gbreve: gbreve,
-	Gcedil: Gcedil,
-	Gcirc: Gcirc,
-	gcirc: gcirc,
-	Gcy: Gcy,
-	gcy: gcy,
-	Gdot: Gdot,
-	gdot: gdot,
-	ge: ge,
-	gE: gE,
-	gEl: gEl,
-	gel: gel,
-	geq: geq,
-	geqq: geqq,
-	geqslant: geqslant,
-	gescc: gescc,
-	ges: ges,
-	gesdot: gesdot,
-	gesdoto: gesdoto,
-	gesdotol: gesdotol,
-	gesl: gesl,
-	gesles: gesles,
-	Gfr: Gfr,
-	gfr: gfr,
-	gg: gg,
-	Gg: Gg,
-	ggg: ggg,
-	gimel: gimel,
-	GJcy: GJcy,
-	gjcy: gjcy,
-	gla: gla,
-	gl: gl,
-	glE: glE,
-	glj: glj,
-	gnap: gnap,
-	gnapprox: gnapprox,
-	gne: gne,
-	gnE: gnE,
-	gneq: gneq,
-	gneqq: gneqq,
-	gnsim: gnsim,
-	Gopf: Gopf,
-	gopf: gopf,
-	grave: grave,
-	GreaterEqual: GreaterEqual,
-	GreaterEqualLess: GreaterEqualLess,
-	GreaterFullEqual: GreaterFullEqual,
-	GreaterGreater: GreaterGreater,
-	GreaterLess: GreaterLess,
-	GreaterSlantEqual: GreaterSlantEqual,
-	GreaterTilde: GreaterTilde,
-	Gscr: Gscr,
-	gscr: gscr,
-	gsim: gsim,
-	gsime: gsime,
-	gsiml: gsiml,
-	gtcc: gtcc,
-	gtcir: gtcir,
-	gt: gt,
-	GT: GT,
-	Gt: Gt,
-	gtdot: gtdot,
-	gtlPar: gtlPar,
-	gtquest: gtquest,
-	gtrapprox: gtrapprox,
-	gtrarr: gtrarr,
-	gtrdot: gtrdot,
-	gtreqless: gtreqless,
-	gtreqqless: gtreqqless,
-	gtrless: gtrless,
-	gtrsim: gtrsim,
-	gvertneqq: gvertneqq,
-	gvnE: gvnE,
-	Hacek: Hacek,
-	hairsp: hairsp,
-	half: half,
-	hamilt: hamilt,
-	HARDcy: HARDcy,
-	hardcy: hardcy,
-	harrcir: harrcir,
-	harr: harr,
-	hArr: hArr,
-	harrw: harrw,
-	Hat: Hat,
-	hbar: hbar,
-	Hcirc: Hcirc,
-	hcirc: hcirc,
-	hearts: hearts,
-	heartsuit: heartsuit,
-	hellip: hellip,
-	hercon: hercon,
-	hfr: hfr,
-	Hfr: Hfr,
-	HilbertSpace: HilbertSpace,
-	hksearow: hksearow,
-	hkswarow: hkswarow,
-	hoarr: hoarr,
-	homtht: homtht,
-	hookleftarrow: hookleftarrow,
-	hookrightarrow: hookrightarrow,
-	hopf: hopf,
-	Hopf: Hopf,
-	horbar: horbar,
-	HorizontalLine: HorizontalLine,
-	hscr: hscr,
-	Hscr: Hscr,
-	hslash: hslash,
-	Hstrok: Hstrok,
-	hstrok: hstrok,
-	HumpDownHump: HumpDownHump,
-	HumpEqual: HumpEqual,
-	hybull: hybull,
-	hyphen: hyphen,
-	Iacute: Iacute,
-	iacute: iacute,
-	ic: ic,
-	Icirc: Icirc,
-	icirc: icirc,
-	Icy: Icy,
-	icy: icy,
-	Idot: Idot,
-	IEcy: IEcy,
-	iecy: iecy,
-	iexcl: iexcl,
-	iff: iff,
-	ifr: ifr,
-	Ifr: Ifr,
-	Igrave: Igrave,
-	igrave: igrave,
-	ii: ii,
-	iiiint: iiiint,
-	iiint: iiint,
-	iinfin: iinfin,
-	iiota: iiota,
-	IJlig: IJlig,
-	ijlig: ijlig,
-	Imacr: Imacr,
-	imacr: imacr,
-	image: image,
-	ImaginaryI: ImaginaryI,
-	imagline: imagline,
-	imagpart: imagpart,
-	imath: imath,
-	Im: Im,
-	imof: imof,
-	imped: imped,
-	Implies: Implies,
-	incare: incare,
-	infin: infin,
-	infintie: infintie,
-	inodot: inodot,
-	intcal: intcal,
-	int: int,
-	Int: Int,
-	integers: integers,
-	Integral: Integral,
-	intercal: intercal,
-	Intersection: Intersection,
-	intlarhk: intlarhk,
-	intprod: intprod,
-	InvisibleComma: InvisibleComma,
-	InvisibleTimes: InvisibleTimes,
-	IOcy: IOcy,
-	iocy: iocy,
-	Iogon: Iogon,
-	iogon: iogon,
-	Iopf: Iopf,
-	iopf: iopf,
-	Iota: Iota,
-	iota: iota,
-	iprod: iprod,
-	iquest: iquest,
-	iscr: iscr,
-	Iscr: Iscr,
-	isin: isin,
-	isindot: isindot,
-	isinE: isinE,
-	isins: isins,
-	isinsv: isinsv,
-	isinv: isinv,
-	it: it,
-	Itilde: Itilde,
-	itilde: itilde,
-	Iukcy: Iukcy,
-	iukcy: iukcy,
-	Iuml: Iuml,
-	iuml: iuml,
-	Jcirc: Jcirc,
-	jcirc: jcirc,
-	Jcy: Jcy,
-	jcy: jcy,
-	Jfr: Jfr,
-	jfr: jfr,
-	jmath: jmath,
-	Jopf: Jopf,
-	jopf: jopf,
-	Jscr: Jscr,
-	jscr: jscr,
-	Jsercy: Jsercy,
-	jsercy: jsercy,
-	Jukcy: Jukcy,
-	jukcy: jukcy,
-	Kappa: Kappa,
-	kappa: kappa,
-	kappav: kappav,
-	Kcedil: Kcedil,
-	kcedil: kcedil,
-	Kcy: Kcy,
-	kcy: kcy,
-	Kfr: Kfr,
-	kfr: kfr,
-	kgreen: kgreen,
-	KHcy: KHcy,
-	khcy: khcy,
-	KJcy: KJcy,
-	kjcy: kjcy,
-	Kopf: Kopf,
-	kopf: kopf,
-	Kscr: Kscr,
-	kscr: kscr,
-	lAarr: lAarr,
-	Lacute: Lacute,
-	lacute: lacute,
-	laemptyv: laemptyv,
-	lagran: lagran,
-	Lambda: Lambda,
-	lambda: lambda,
-	lang: lang,
-	Lang: Lang,
-	langd: langd,
-	langle: langle,
-	lap: lap,
-	Laplacetrf: Laplacetrf,
-	laquo: laquo,
-	larrb: larrb,
-	larrbfs: larrbfs,
-	larr: larr,
-	Larr: Larr,
-	lArr: lArr,
-	larrfs: larrfs,
-	larrhk: larrhk,
-	larrlp: larrlp,
-	larrpl: larrpl,
-	larrsim: larrsim,
-	larrtl: larrtl,
-	latail: latail,
-	lAtail: lAtail,
-	lat: lat,
-	late: late,
-	lates: lates,
-	lbarr: lbarr,
-	lBarr: lBarr,
-	lbbrk: lbbrk,
-	lbrace: lbrace,
-	lbrack: lbrack,
-	lbrke: lbrke,
-	lbrksld: lbrksld,
-	lbrkslu: lbrkslu,
-	Lcaron: Lcaron,
-	lcaron: lcaron,
-	Lcedil: Lcedil,
-	lcedil: lcedil,
-	lceil: lceil,
-	lcub: lcub,
-	Lcy: Lcy,
-	lcy: lcy,
-	ldca: ldca,
-	ldquo: ldquo,
-	ldquor: ldquor,
-	ldrdhar: ldrdhar,
-	ldrushar: ldrushar,
-	ldsh: ldsh,
-	le: le,
-	lE: lE,
-	LeftAngleBracket: LeftAngleBracket,
-	LeftArrowBar: LeftArrowBar,
-	leftarrow: leftarrow,
-	LeftArrow: LeftArrow,
-	Leftarrow: Leftarrow,
-	LeftArrowRightArrow: LeftArrowRightArrow,
-	leftarrowtail: leftarrowtail,
-	LeftCeiling: LeftCeiling,
-	LeftDoubleBracket: LeftDoubleBracket,
-	LeftDownTeeVector: LeftDownTeeVector,
-	LeftDownVectorBar: LeftDownVectorBar,
-	LeftDownVector: LeftDownVector,
-	LeftFloor: LeftFloor,
-	leftharpoondown: leftharpoondown,
-	leftharpoonup: leftharpoonup,
-	leftleftarrows: leftleftarrows,
-	leftrightarrow: leftrightarrow,
-	LeftRightArrow: LeftRightArrow,
-	Leftrightarrow: Leftrightarrow,
-	leftrightarrows: leftrightarrows,
-	leftrightharpoons: leftrightharpoons,
-	leftrightsquigarrow: leftrightsquigarrow,
-	LeftRightVector: LeftRightVector,
-	LeftTeeArrow: LeftTeeArrow,
-	LeftTee: LeftTee,
-	LeftTeeVector: LeftTeeVector,
-	leftthreetimes: leftthreetimes,
-	LeftTriangleBar: LeftTriangleBar,
-	LeftTriangle: LeftTriangle,
-	LeftTriangleEqual: LeftTriangleEqual,
-	LeftUpDownVector: LeftUpDownVector,
-	LeftUpTeeVector: LeftUpTeeVector,
-	LeftUpVectorBar: LeftUpVectorBar,
-	LeftUpVector: LeftUpVector,
-	LeftVectorBar: LeftVectorBar,
-	LeftVector: LeftVector,
-	lEg: lEg,
-	leg: leg,
-	leq: leq,
-	leqq: leqq,
-	leqslant: leqslant,
-	lescc: lescc,
-	les: les,
-	lesdot: lesdot,
-	lesdoto: lesdoto,
-	lesdotor: lesdotor,
-	lesg: lesg,
-	lesges: lesges,
-	lessapprox: lessapprox,
-	lessdot: lessdot,
-	lesseqgtr: lesseqgtr,
-	lesseqqgtr: lesseqqgtr,
-	LessEqualGreater: LessEqualGreater,
-	LessFullEqual: LessFullEqual,
-	LessGreater: LessGreater,
-	lessgtr: lessgtr,
-	LessLess: LessLess,
-	lesssim: lesssim,
-	LessSlantEqual: LessSlantEqual,
-	LessTilde: LessTilde,
-	lfisht: lfisht,
-	lfloor: lfloor,
-	Lfr: Lfr,
-	lfr: lfr,
-	lg: lg,
-	lgE: lgE,
-	lHar: lHar,
-	lhard: lhard,
-	lharu: lharu,
-	lharul: lharul,
-	lhblk: lhblk,
-	LJcy: LJcy,
-	ljcy: ljcy,
-	llarr: llarr,
-	ll: ll,
-	Ll: Ll,
-	llcorner: llcorner,
-	Lleftarrow: Lleftarrow,
-	llhard: llhard,
-	lltri: lltri,
-	Lmidot: Lmidot,
-	lmidot: lmidot,
-	lmoustache: lmoustache,
-	lmoust: lmoust,
-	lnap: lnap,
-	lnapprox: lnapprox,
-	lne: lne,
-	lnE: lnE,
-	lneq: lneq,
-	lneqq: lneqq,
-	lnsim: lnsim,
-	loang: loang,
-	loarr: loarr,
-	lobrk: lobrk,
-	longleftarrow: longleftarrow,
-	LongLeftArrow: LongLeftArrow,
-	Longleftarrow: Longleftarrow,
-	longleftrightarrow: longleftrightarrow,
-	LongLeftRightArrow: LongLeftRightArrow,
-	Longleftrightarrow: Longleftrightarrow,
-	longmapsto: longmapsto,
-	longrightarrow: longrightarrow,
-	LongRightArrow: LongRightArrow,
-	Longrightarrow: Longrightarrow,
-	looparrowleft: looparrowleft,
-	looparrowright: looparrowright,
-	lopar: lopar,
-	Lopf: Lopf,
-	lopf: lopf,
-	loplus: loplus,
-	lotimes: lotimes,
-	lowast: lowast,
-	lowbar: lowbar,
-	LowerLeftArrow: LowerLeftArrow,
-	LowerRightArrow: LowerRightArrow,
-	loz: loz,
-	lozenge: lozenge,
-	lozf: lozf,
-	lpar: lpar,
-	lparlt: lparlt,
-	lrarr: lrarr,
-	lrcorner: lrcorner,
-	lrhar: lrhar,
-	lrhard: lrhard,
-	lrm: lrm,
-	lrtri: lrtri,
-	lsaquo: lsaquo,
-	lscr: lscr,
-	Lscr: Lscr,
-	lsh: lsh,
-	Lsh: Lsh,
-	lsim: lsim,
-	lsime: lsime,
-	lsimg: lsimg,
-	lsqb: lsqb,
-	lsquo: lsquo,
-	lsquor: lsquor,
-	Lstrok: Lstrok,
-	lstrok: lstrok,
-	ltcc: ltcc,
-	ltcir: ltcir,
-	lt: lt,
-	LT: LT,
-	Lt: Lt,
-	ltdot: ltdot,
-	lthree: lthree,
-	ltimes: ltimes,
-	ltlarr: ltlarr,
-	ltquest: ltquest,
-	ltri: ltri,
-	ltrie: ltrie,
-	ltrif: ltrif,
-	ltrPar: ltrPar,
-	lurdshar: lurdshar,
-	luruhar: luruhar,
-	lvertneqq: lvertneqq,
-	lvnE: lvnE,
-	macr: macr,
-	male: male,
-	malt: malt,
-	maltese: maltese,
-	map: map,
-	mapsto: mapsto,
-	mapstodown: mapstodown,
-	mapstoleft: mapstoleft,
-	mapstoup: mapstoup,
-	marker: marker,
-	mcomma: mcomma,
-	Mcy: Mcy,
-	mcy: mcy,
-	mdash: mdash,
-	mDDot: mDDot,
-	measuredangle: measuredangle,
-	MediumSpace: MediumSpace,
-	Mellintrf: Mellintrf,
-	Mfr: Mfr,
-	mfr: mfr,
-	mho: mho,
-	micro: micro,
-	midast: midast,
-	midcir: midcir,
-	mid: mid,
-	middot: middot,
-	minusb: minusb,
-	minus: minus,
-	minusd: minusd,
-	minusdu: minusdu,
-	MinusPlus: MinusPlus,
-	mlcp: mlcp,
-	mldr: mldr,
-	mnplus: mnplus,
-	models: models,
-	Mopf: Mopf,
-	mopf: mopf,
-	mp: mp,
-	mscr: mscr,
-	Mscr: Mscr,
-	mstpos: mstpos,
-	Mu: Mu,
-	mu: mu,
-	multimap: multimap,
-	mumap: mumap,
-	nabla: nabla,
-	Nacute: Nacute,
-	nacute: nacute,
-	nang: nang,
-	nap: nap,
-	napE: napE,
-	napid: napid,
-	napos: napos,
-	napprox: napprox,
-	natural: natural,
-	naturals: naturals,
-	natur: natur,
-	nbsp: nbsp,
-	nbump: nbump,
-	nbumpe: nbumpe,
-	ncap: ncap,
-	Ncaron: Ncaron,
-	ncaron: ncaron,
-	Ncedil: Ncedil,
-	ncedil: ncedil,
-	ncong: ncong,
-	ncongdot: ncongdot,
-	ncup: ncup,
-	Ncy: Ncy,
-	ncy: ncy,
-	ndash: ndash,
-	nearhk: nearhk,
-	nearr: nearr,
-	neArr: neArr,
-	nearrow: nearrow,
-	ne: ne,
-	nedot: nedot,
-	NegativeMediumSpace: NegativeMediumSpace,
-	NegativeThickSpace: NegativeThickSpace,
-	NegativeThinSpace: NegativeThinSpace,
-	NegativeVeryThinSpace: NegativeVeryThinSpace,
-	nequiv: nequiv,
-	nesear: nesear,
-	nesim: nesim,
-	NestedGreaterGreater: NestedGreaterGreater,
-	NestedLessLess: NestedLessLess,
-	NewLine: NewLine,
-	nexist: nexist,
-	nexists: nexists,
-	Nfr: Nfr,
-	nfr: nfr,
-	ngE: ngE,
-	nge: nge,
-	ngeq: ngeq,
-	ngeqq: ngeqq,
-	ngeqslant: ngeqslant,
-	nges: nges,
-	nGg: nGg,
-	ngsim: ngsim,
-	nGt: nGt,
-	ngt: ngt,
-	ngtr: ngtr,
-	nGtv: nGtv,
-	nharr: nharr,
-	nhArr: nhArr,
-	nhpar: nhpar,
-	ni: ni,
-	nis: nis,
-	nisd: nisd,
-	niv: niv,
-	NJcy: NJcy,
-	njcy: njcy,
-	nlarr: nlarr,
-	nlArr: nlArr,
-	nldr: nldr,
-	nlE: nlE,
-	nle: nle,
-	nleftarrow: nleftarrow,
-	nLeftarrow: nLeftarrow,
-	nleftrightarrow: nleftrightarrow,
-	nLeftrightarrow: nLeftrightarrow,
-	nleq: nleq,
-	nleqq: nleqq,
-	nleqslant: nleqslant,
-	nles: nles,
-	nless: nless,
-	nLl: nLl,
-	nlsim: nlsim,
-	nLt: nLt,
-	nlt: nlt,
-	nltri: nltri,
-	nltrie: nltrie,
-	nLtv: nLtv,
-	nmid: nmid,
-	NoBreak: NoBreak,
-	NonBreakingSpace: NonBreakingSpace,
-	nopf: nopf,
-	Nopf: Nopf,
-	Not: Not,
-	not: not,
-	NotCongruent: NotCongruent,
-	NotCupCap: NotCupCap,
-	NotDoubleVerticalBar: NotDoubleVerticalBar,
-	NotElement: NotElement,
-	NotEqual: NotEqual,
-	NotEqualTilde: NotEqualTilde,
-	NotExists: NotExists,
-	NotGreater: NotGreater,
-	NotGreaterEqual: NotGreaterEqual,
-	NotGreaterFullEqual: NotGreaterFullEqual,
-	NotGreaterGreater: NotGreaterGreater,
-	NotGreaterLess: NotGreaterLess,
-	NotGreaterSlantEqual: NotGreaterSlantEqual,
-	NotGreaterTilde: NotGreaterTilde,
-	NotHumpDownHump: NotHumpDownHump,
-	NotHumpEqual: NotHumpEqual,
-	notin: notin,
-	notindot: notindot,
-	notinE: notinE,
-	notinva: notinva,
-	notinvb: notinvb,
-	notinvc: notinvc,
-	NotLeftTriangleBar: NotLeftTriangleBar,
-	NotLeftTriangle: NotLeftTriangle,
-	NotLeftTriangleEqual: NotLeftTriangleEqual,
-	NotLess: NotLess,
-	NotLessEqual: NotLessEqual,
-	NotLessGreater: NotLessGreater,
-	NotLessLess: NotLessLess,
-	NotLessSlantEqual: NotLessSlantEqual,
-	NotLessTilde: NotLessTilde,
-	NotNestedGreaterGreater: NotNestedGreaterGreater,
-	NotNestedLessLess: NotNestedLessLess,
-	notni: notni,
-	notniva: notniva,
-	notnivb: notnivb,
-	notnivc: notnivc,
-	NotPrecedes: NotPrecedes,
-	NotPrecedesEqual: NotPrecedesEqual,
-	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-	NotReverseElement: NotReverseElement,
-	NotRightTriangleBar: NotRightTriangleBar,
-	NotRightTriangle: NotRightTriangle,
-	NotRightTriangleEqual: NotRightTriangleEqual,
-	NotSquareSubset: NotSquareSubset,
-	NotSquareSubsetEqual: NotSquareSubsetEqual,
-	NotSquareSuperset: NotSquareSuperset,
-	NotSquareSupersetEqual: NotSquareSupersetEqual,
-	NotSubset: NotSubset,
-	NotSubsetEqual: NotSubsetEqual,
-	NotSucceeds: NotSucceeds,
-	NotSucceedsEqual: NotSucceedsEqual,
-	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-	NotSucceedsTilde: NotSucceedsTilde,
-	NotSuperset: NotSuperset,
-	NotSupersetEqual: NotSupersetEqual,
-	NotTilde: NotTilde,
-	NotTildeEqual: NotTildeEqual,
-	NotTildeFullEqual: NotTildeFullEqual,
-	NotTildeTilde: NotTildeTilde,
-	NotVerticalBar: NotVerticalBar,
-	nparallel: nparallel,
-	npar: npar,
-	nparsl: nparsl,
-	npart: npart,
-	npolint: npolint,
-	npr: npr,
-	nprcue: nprcue,
-	nprec: nprec,
-	npreceq: npreceq,
-	npre: npre,
-	nrarrc: nrarrc,
-	nrarr: nrarr,
-	nrArr: nrArr,
-	nrarrw: nrarrw,
-	nrightarrow: nrightarrow,
-	nRightarrow: nRightarrow,
-	nrtri: nrtri,
-	nrtrie: nrtrie,
-	nsc: nsc,
-	nsccue: nsccue,
-	nsce: nsce,
-	Nscr: Nscr,
-	nscr: nscr,
-	nshortmid: nshortmid,
-	nshortparallel: nshortparallel,
-	nsim: nsim,
-	nsime: nsime,
-	nsimeq: nsimeq,
-	nsmid: nsmid,
-	nspar: nspar,
-	nsqsube: nsqsube,
-	nsqsupe: nsqsupe,
-	nsub: nsub,
-	nsubE: nsubE,
-	nsube: nsube,
-	nsubset: nsubset,
-	nsubseteq: nsubseteq,
-	nsubseteqq: nsubseteqq,
-	nsucc: nsucc,
-	nsucceq: nsucceq,
-	nsup: nsup,
-	nsupE: nsupE,
-	nsupe: nsupe,
-	nsupset: nsupset,
-	nsupseteq: nsupseteq,
-	nsupseteqq: nsupseteqq,
-	ntgl: ntgl,
-	Ntilde: Ntilde,
-	ntilde: ntilde,
-	ntlg: ntlg,
-	ntriangleleft: ntriangleleft,
-	ntrianglelefteq: ntrianglelefteq,
-	ntriangleright: ntriangleright,
-	ntrianglerighteq: ntrianglerighteq,
-	Nu: Nu,
-	nu: nu,
-	num: num,
-	numero: numero,
-	numsp: numsp,
-	nvap: nvap,
-	nvdash: nvdash,
-	nvDash: nvDash,
-	nVdash: nVdash,
-	nVDash: nVDash,
-	nvge: nvge,
-	nvgt: nvgt,
-	nvHarr: nvHarr,
-	nvinfin: nvinfin,
-	nvlArr: nvlArr,
-	nvle: nvle,
-	nvlt: nvlt,
-	nvltrie: nvltrie,
-	nvrArr: nvrArr,
-	nvrtrie: nvrtrie,
-	nvsim: nvsim,
-	nwarhk: nwarhk,
-	nwarr: nwarr,
-	nwArr: nwArr,
-	nwarrow: nwarrow,
-	nwnear: nwnear,
-	Oacute: Oacute,
-	oacute: oacute,
-	oast: oast,
-	Ocirc: Ocirc,
-	ocirc: ocirc,
-	ocir: ocir,
-	Ocy: Ocy,
-	ocy: ocy,
-	odash: odash,
-	Odblac: Odblac,
-	odblac: odblac,
-	odiv: odiv,
-	odot: odot,
-	odsold: odsold,
-	OElig: OElig,
-	oelig: oelig,
-	ofcir: ofcir,
-	Ofr: Ofr,
-	ofr: ofr,
-	ogon: ogon,
-	Ograve: Ograve,
-	ograve: ograve,
-	ogt: ogt,
-	ohbar: ohbar,
-	ohm: ohm,
-	oint: oint,
-	olarr: olarr,
-	olcir: olcir,
-	olcross: olcross,
-	oline: oline,
-	olt: olt,
-	Omacr: Omacr,
-	omacr: omacr,
-	Omega: Omega,
-	omega: omega,
-	Omicron: Omicron,
-	omicron: omicron,
-	omid: omid,
-	ominus: ominus,
-	Oopf: Oopf,
-	oopf: oopf,
-	opar: opar,
-	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-	OpenCurlyQuote: OpenCurlyQuote,
-	operp: operp,
-	oplus: oplus,
-	orarr: orarr,
-	Or: Or,
-	or: or,
-	ord: ord,
-	order: order,
-	orderof: orderof,
-	ordf: ordf,
-	ordm: ordm,
-	origof: origof,
-	oror: oror,
-	orslope: orslope,
-	orv: orv,
-	oS: oS,
-	Oscr: Oscr,
-	oscr: oscr,
-	Oslash: Oslash,
-	oslash: oslash,
-	osol: osol,
-	Otilde: Otilde,
-	otilde: otilde,
-	otimesas: otimesas,
-	Otimes: Otimes,
-	otimes: otimes,
-	Ouml: Ouml,
-	ouml: ouml,
-	ovbar: ovbar,
-	OverBar: OverBar,
-	OverBrace: OverBrace,
-	OverBracket: OverBracket,
-	OverParenthesis: OverParenthesis,
-	para: para,
-	parallel: parallel,
-	par: par,
-	parsim: parsim,
-	parsl: parsl,
-	part: part,
-	PartialD: PartialD,
-	Pcy: Pcy,
-	pcy: pcy,
-	percnt: percnt,
-	period: period,
-	permil: permil,
-	perp: perp,
-	pertenk: pertenk,
-	Pfr: Pfr,
-	pfr: pfr,
-	Phi: Phi,
-	phi: phi,
-	phiv: phiv,
-	phmmat: phmmat,
-	phone: phone,
-	Pi: Pi,
-	pi: pi,
-	pitchfork: pitchfork,
-	piv: piv,
-	planck: planck,
-	planckh: planckh,
-	plankv: plankv,
-	plusacir: plusacir,
-	plusb: plusb,
-	pluscir: pluscir,
-	plus: plus,
-	plusdo: plusdo,
-	plusdu: plusdu,
-	pluse: pluse,
-	PlusMinus: PlusMinus,
-	plusmn: plusmn,
-	plussim: plussim,
-	plustwo: plustwo,
-	pm: pm,
-	Poincareplane: Poincareplane,
-	pointint: pointint,
-	popf: popf,
-	Popf: Popf,
-	pound: pound,
-	prap: prap,
-	Pr: Pr,
-	pr: pr,
-	prcue: prcue,
-	precapprox: precapprox,
-	prec: prec,
-	preccurlyeq: preccurlyeq,
-	Precedes: Precedes,
-	PrecedesEqual: PrecedesEqual,
-	PrecedesSlantEqual: PrecedesSlantEqual,
-	PrecedesTilde: PrecedesTilde,
-	preceq: preceq,
-	precnapprox: precnapprox,
-	precneqq: precneqq,
-	precnsim: precnsim,
-	pre: pre,
-	prE: prE,
-	precsim: precsim,
-	prime: prime,
-	Prime: Prime,
-	primes: primes,
-	prnap: prnap,
-	prnE: prnE,
-	prnsim: prnsim,
-	prod: prod,
-	Product: Product,
-	profalar: profalar,
-	profline: profline,
-	profsurf: profsurf,
-	prop: prop,
-	Proportional: Proportional,
-	Proportion: Proportion,
-	propto: propto,
-	prsim: prsim,
-	prurel: prurel,
-	Pscr: Pscr,
-	pscr: pscr,
-	Psi: Psi,
-	psi: psi,
-	puncsp: puncsp,
-	Qfr: Qfr,
-	qfr: qfr,
-	qint: qint,
-	qopf: qopf,
-	Qopf: Qopf,
-	qprime: qprime,
-	Qscr: Qscr,
-	qscr: qscr,
-	quaternions: quaternions,
-	quatint: quatint,
-	quest: quest,
-	questeq: questeq,
-	quot: quot,
-	QUOT: QUOT,
-	rAarr: rAarr,
-	race: race,
-	Racute: Racute,
-	racute: racute,
-	radic: radic,
-	raemptyv: raemptyv,
-	rang: rang,
-	Rang: Rang,
-	rangd: rangd,
-	range: range,
-	rangle: rangle,
-	raquo: raquo,
-	rarrap: rarrap,
-	rarrb: rarrb,
-	rarrbfs: rarrbfs,
-	rarrc: rarrc,
-	rarr: rarr,
-	Rarr: Rarr,
-	rArr: rArr,
-	rarrfs: rarrfs,
-	rarrhk: rarrhk,
-	rarrlp: rarrlp,
-	rarrpl: rarrpl,
-	rarrsim: rarrsim,
-	Rarrtl: Rarrtl,
-	rarrtl: rarrtl,
-	rarrw: rarrw,
-	ratail: ratail,
-	rAtail: rAtail,
-	ratio: ratio,
-	rationals: rationals,
-	rbarr: rbarr,
-	rBarr: rBarr,
-	RBarr: RBarr,
-	rbbrk: rbbrk,
-	rbrace: rbrace,
-	rbrack: rbrack,
-	rbrke: rbrke,
-	rbrksld: rbrksld,
-	rbrkslu: rbrkslu,
-	Rcaron: Rcaron,
-	rcaron: rcaron,
-	Rcedil: Rcedil,
-	rcedil: rcedil,
-	rceil: rceil,
-	rcub: rcub,
-	Rcy: Rcy,
-	rcy: rcy,
-	rdca: rdca,
-	rdldhar: rdldhar,
-	rdquo: rdquo,
-	rdquor: rdquor,
-	rdsh: rdsh,
-	real: real,
-	realine: realine,
-	realpart: realpart,
-	reals: reals,
-	Re: Re,
-	rect: rect,
-	reg: reg,
-	REG: REG,
-	ReverseElement: ReverseElement,
-	ReverseEquilibrium: ReverseEquilibrium,
-	ReverseUpEquilibrium: ReverseUpEquilibrium,
-	rfisht: rfisht,
-	rfloor: rfloor,
-	rfr: rfr,
-	Rfr: Rfr,
-	rHar: rHar,
-	rhard: rhard,
-	rharu: rharu,
-	rharul: rharul,
-	Rho: Rho,
-	rho: rho,
-	rhov: rhov,
-	RightAngleBracket: RightAngleBracket,
-	RightArrowBar: RightArrowBar,
-	rightarrow: rightarrow,
-	RightArrow: RightArrow,
-	Rightarrow: Rightarrow,
-	RightArrowLeftArrow: RightArrowLeftArrow,
-	rightarrowtail: rightarrowtail,
-	RightCeiling: RightCeiling,
-	RightDoubleBracket: RightDoubleBracket,
-	RightDownTeeVector: RightDownTeeVector,
-	RightDownVectorBar: RightDownVectorBar,
-	RightDownVector: RightDownVector,
-	RightFloor: RightFloor,
-	rightharpoondown: rightharpoondown,
-	rightharpoonup: rightharpoonup,
-	rightleftarrows: rightleftarrows,
-	rightleftharpoons: rightleftharpoons,
-	rightrightarrows: rightrightarrows,
-	rightsquigarrow: rightsquigarrow,
-	RightTeeArrow: RightTeeArrow,
-	RightTee: RightTee,
-	RightTeeVector: RightTeeVector,
-	rightthreetimes: rightthreetimes,
-	RightTriangleBar: RightTriangleBar,
-	RightTriangle: RightTriangle,
-	RightTriangleEqual: RightTriangleEqual,
-	RightUpDownVector: RightUpDownVector,
-	RightUpTeeVector: RightUpTeeVector,
-	RightUpVectorBar: RightUpVectorBar,
-	RightUpVector: RightUpVector,
-	RightVectorBar: RightVectorBar,
-	RightVector: RightVector,
-	ring: ring,
-	risingdotseq: risingdotseq,
-	rlarr: rlarr,
-	rlhar: rlhar,
-	rlm: rlm,
-	rmoustache: rmoustache,
-	rmoust: rmoust,
-	rnmid: rnmid,
-	roang: roang,
-	roarr: roarr,
-	robrk: robrk,
-	ropar: ropar,
-	ropf: ropf,
-	Ropf: Ropf,
-	roplus: roplus,
-	rotimes: rotimes,
-	RoundImplies: RoundImplies,
-	rpar: rpar,
-	rpargt: rpargt,
-	rppolint: rppolint,
-	rrarr: rrarr,
-	Rrightarrow: Rrightarrow,
-	rsaquo: rsaquo,
-	rscr: rscr,
-	Rscr: Rscr,
-	rsh: rsh,
-	Rsh: Rsh,
-	rsqb: rsqb,
-	rsquo: rsquo,
-	rsquor: rsquor,
-	rthree: rthree,
-	rtimes: rtimes,
-	rtri: rtri,
-	rtrie: rtrie,
-	rtrif: rtrif,
-	rtriltri: rtriltri,
-	RuleDelayed: RuleDelayed,
-	ruluhar: ruluhar,
-	rx: rx,
-	Sacute: Sacute,
-	sacute: sacute,
-	sbquo: sbquo,
-	scap: scap,
-	Scaron: Scaron,
-	scaron: scaron,
-	Sc: Sc,
-	sc: sc,
-	sccue: sccue,
-	sce: sce,
-	scE: scE,
-	Scedil: Scedil,
-	scedil: scedil,
-	Scirc: Scirc,
-	scirc: scirc,
-	scnap: scnap,
-	scnE: scnE,
-	scnsim: scnsim,
-	scpolint: scpolint,
-	scsim: scsim,
-	Scy: Scy,
-	scy: scy,
-	sdotb: sdotb,
-	sdot: sdot,
-	sdote: sdote,
-	searhk: searhk,
-	searr: searr,
-	seArr: seArr,
-	searrow: searrow,
-	sect: sect,
-	semi: semi,
-	seswar: seswar,
-	setminus: setminus,
-	setmn: setmn,
-	sext: sext,
-	Sfr: Sfr,
-	sfr: sfr,
-	sfrown: sfrown,
-	sharp: sharp,
-	SHCHcy: SHCHcy,
-	shchcy: shchcy,
-	SHcy: SHcy,
-	shcy: shcy,
-	ShortDownArrow: ShortDownArrow,
-	ShortLeftArrow: ShortLeftArrow,
-	shortmid: shortmid,
-	shortparallel: shortparallel,
-	ShortRightArrow: ShortRightArrow,
-	ShortUpArrow: ShortUpArrow,
-	shy: shy,
-	Sigma: Sigma,
-	sigma: sigma,
-	sigmaf: sigmaf,
-	sigmav: sigmav,
-	sim: sim,
-	simdot: simdot,
-	sime: sime,
-	simeq: simeq,
-	simg: simg,
-	simgE: simgE,
-	siml: siml,
-	simlE: simlE,
-	simne: simne,
-	simplus: simplus,
-	simrarr: simrarr,
-	slarr: slarr,
-	SmallCircle: SmallCircle,
-	smallsetminus: smallsetminus,
-	smashp: smashp,
-	smeparsl: smeparsl,
-	smid: smid,
-	smile: smile,
-	smt: smt,
-	smte: smte,
-	smtes: smtes,
-	SOFTcy: SOFTcy,
-	softcy: softcy,
-	solbar: solbar,
-	solb: solb,
-	sol: sol,
-	Sopf: Sopf,
-	sopf: sopf,
-	spades: spades,
-	spadesuit: spadesuit,
-	spar: spar,
-	sqcap: sqcap,
-	sqcaps: sqcaps,
-	sqcup: sqcup,
-	sqcups: sqcups,
-	Sqrt: Sqrt,
-	sqsub: sqsub,
-	sqsube: sqsube,
-	sqsubset: sqsubset,
-	sqsubseteq: sqsubseteq,
-	sqsup: sqsup,
-	sqsupe: sqsupe,
-	sqsupset: sqsupset,
-	sqsupseteq: sqsupseteq,
-	square: square,
-	Square: Square,
-	SquareIntersection: SquareIntersection,
-	SquareSubset: SquareSubset,
-	SquareSubsetEqual: SquareSubsetEqual,
-	SquareSuperset: SquareSuperset,
-	SquareSupersetEqual: SquareSupersetEqual,
-	SquareUnion: SquareUnion,
-	squarf: squarf,
-	squ: squ,
-	squf: squf,
-	srarr: srarr,
-	Sscr: Sscr,
-	sscr: sscr,
-	ssetmn: ssetmn,
-	ssmile: ssmile,
-	sstarf: sstarf,
-	Star: Star,
-	star: star,
-	starf: starf,
-	straightepsilon: straightepsilon,
-	straightphi: straightphi,
-	strns: strns,
-	sub: sub,
-	Sub: Sub,
-	subdot: subdot,
-	subE: subE,
-	sube: sube,
-	subedot: subedot,
-	submult: submult,
-	subnE: subnE,
-	subne: subne,
-	subplus: subplus,
-	subrarr: subrarr,
-	subset: subset,
-	Subset: Subset,
-	subseteq: subseteq,
-	subseteqq: subseteqq,
-	SubsetEqual: SubsetEqual,
-	subsetneq: subsetneq,
-	subsetneqq: subsetneqq,
-	subsim: subsim,
-	subsub: subsub,
-	subsup: subsup,
-	succapprox: succapprox,
-	succ: succ,
-	succcurlyeq: succcurlyeq,
-	Succeeds: Succeeds,
-	SucceedsEqual: SucceedsEqual,
-	SucceedsSlantEqual: SucceedsSlantEqual,
-	SucceedsTilde: SucceedsTilde,
-	succeq: succeq,
-	succnapprox: succnapprox,
-	succneqq: succneqq,
-	succnsim: succnsim,
-	succsim: succsim,
-	SuchThat: SuchThat,
-	sum: sum,
-	Sum: Sum,
-	sung: sung,
-	sup1: sup1,
-	sup2: sup2,
-	sup3: sup3,
-	sup: sup,
-	Sup: Sup,
-	supdot: supdot,
-	supdsub: supdsub,
-	supE: supE,
-	supe: supe,
-	supedot: supedot,
-	Superset: Superset,
-	SupersetEqual: SupersetEqual,
-	suphsol: suphsol,
-	suphsub: suphsub,
-	suplarr: suplarr,
-	supmult: supmult,
-	supnE: supnE,
-	supne: supne,
-	supplus: supplus,
-	supset: supset,
-	Supset: Supset,
-	supseteq: supseteq,
-	supseteqq: supseteqq,
-	supsetneq: supsetneq,
-	supsetneqq: supsetneqq,
-	supsim: supsim,
-	supsub: supsub,
-	supsup: supsup,
-	swarhk: swarhk,
-	swarr: swarr,
-	swArr: swArr,
-	swarrow: swarrow,
-	swnwar: swnwar,
-	szlig: szlig,
-	Tab: Tab,
-	target: target,
-	Tau: Tau,
-	tau: tau,
-	tbrk: tbrk,
-	Tcaron: Tcaron,
-	tcaron: tcaron,
-	Tcedil: Tcedil,
-	tcedil: tcedil,
-	Tcy: Tcy,
-	tcy: tcy,
-	tdot: tdot,
-	telrec: telrec,
-	Tfr: Tfr,
-	tfr: tfr,
-	there4: there4,
-	therefore: therefore,
-	Therefore: Therefore,
-	Theta: Theta,
-	theta: theta,
-	thetasym: thetasym,
-	thetav: thetav,
-	thickapprox: thickapprox,
-	thicksim: thicksim,
-	ThickSpace: ThickSpace,
-	ThinSpace: ThinSpace,
-	thinsp: thinsp,
-	thkap: thkap,
-	thksim: thksim,
-	THORN: THORN,
-	thorn: thorn,
-	tilde: tilde,
-	Tilde: Tilde,
-	TildeEqual: TildeEqual,
-	TildeFullEqual: TildeFullEqual,
-	TildeTilde: TildeTilde,
-	timesbar: timesbar,
-	timesb: timesb,
-	times: times,
-	timesd: timesd,
-	tint: tint,
-	toea: toea,
-	topbot: topbot,
-	topcir: topcir,
-	top: top,
-	Topf: Topf,
-	topf: topf,
-	topfork: topfork,
-	tosa: tosa,
-	tprime: tprime,
-	trade: trade,
-	TRADE: TRADE,
-	triangle: triangle,
-	triangledown: triangledown,
-	triangleleft: triangleleft,
-	trianglelefteq: trianglelefteq,
-	triangleq: triangleq,
-	triangleright: triangleright,
-	trianglerighteq: trianglerighteq,
-	tridot: tridot,
-	trie: trie,
-	triminus: triminus,
-	TripleDot: TripleDot,
-	triplus: triplus,
-	trisb: trisb,
-	tritime: tritime,
-	trpezium: trpezium,
-	Tscr: Tscr,
-	tscr: tscr,
-	TScy: TScy,
-	tscy: tscy,
-	TSHcy: TSHcy,
-	tshcy: tshcy,
-	Tstrok: Tstrok,
-	tstrok: tstrok,
-	twixt: twixt,
-	twoheadleftarrow: twoheadleftarrow,
-	twoheadrightarrow: twoheadrightarrow,
-	Uacute: Uacute,
-	uacute: uacute,
-	uarr: uarr,
-	Uarr: Uarr,
-	uArr: uArr,
-	Uarrocir: Uarrocir,
-	Ubrcy: Ubrcy,
-	ubrcy: ubrcy,
-	Ubreve: Ubreve,
-	ubreve: ubreve,
-	Ucirc: Ucirc,
-	ucirc: ucirc,
-	Ucy: Ucy,
-	ucy: ucy,
-	udarr: udarr,
-	Udblac: Udblac,
-	udblac: udblac,
-	udhar: udhar,
-	ufisht: ufisht,
-	Ufr: Ufr,
-	ufr: ufr,
-	Ugrave: Ugrave,
-	ugrave: ugrave,
-	uHar: uHar,
-	uharl: uharl,
-	uharr: uharr,
-	uhblk: uhblk,
-	ulcorn: ulcorn,
-	ulcorner: ulcorner,
-	ulcrop: ulcrop,
-	ultri: ultri,
-	Umacr: Umacr,
-	umacr: umacr,
-	uml: uml,
-	UnderBar: UnderBar,
-	UnderBrace: UnderBrace,
-	UnderBracket: UnderBracket,
-	UnderParenthesis: UnderParenthesis,
-	Union: Union,
-	UnionPlus: UnionPlus,
-	Uogon: Uogon,
-	uogon: uogon,
-	Uopf: Uopf,
-	uopf: uopf,
-	UpArrowBar: UpArrowBar,
-	uparrow: uparrow,
-	UpArrow: UpArrow,
-	Uparrow: Uparrow,
-	UpArrowDownArrow: UpArrowDownArrow,
-	updownarrow: updownarrow,
-	UpDownArrow: UpDownArrow,
-	Updownarrow: Updownarrow,
-	UpEquilibrium: UpEquilibrium,
-	upharpoonleft: upharpoonleft,
-	upharpoonright: upharpoonright,
-	uplus: uplus,
-	UpperLeftArrow: UpperLeftArrow,
-	UpperRightArrow: UpperRightArrow,
-	upsi: upsi,
-	Upsi: Upsi,
-	upsih: upsih,
-	Upsilon: Upsilon,
-	upsilon: upsilon,
-	UpTeeArrow: UpTeeArrow,
-	UpTee: UpTee,
-	upuparrows: upuparrows,
-	urcorn: urcorn,
-	urcorner: urcorner,
-	urcrop: urcrop,
-	Uring: Uring,
-	uring: uring,
-	urtri: urtri,
-	Uscr: Uscr,
-	uscr: uscr,
-	utdot: utdot,
-	Utilde: Utilde,
-	utilde: utilde,
-	utri: utri,
-	utrif: utrif,
-	uuarr: uuarr,
-	Uuml: Uuml,
-	uuml: uuml,
-	uwangle: uwangle,
-	vangrt: vangrt,
-	varepsilon: varepsilon,
-	varkappa: varkappa,
-	varnothing: varnothing,
-	varphi: varphi,
-	varpi: varpi,
-	varpropto: varpropto,
-	varr: varr,
-	vArr: vArr,
-	varrho: varrho,
-	varsigma: varsigma,
-	varsubsetneq: varsubsetneq,
-	varsubsetneqq: varsubsetneqq,
-	varsupsetneq: varsupsetneq,
-	varsupsetneqq: varsupsetneqq,
-	vartheta: vartheta,
-	vartriangleleft: vartriangleleft,
-	vartriangleright: vartriangleright,
-	vBar: vBar,
-	Vbar: Vbar,
-	vBarv: vBarv,
-	Vcy: Vcy,
-	vcy: vcy,
-	vdash: vdash,
-	vDash: vDash,
-	Vdash: Vdash,
-	VDash: VDash,
-	Vdashl: Vdashl,
-	veebar: veebar,
-	vee: vee,
-	Vee: Vee,
-	veeeq: veeeq,
-	vellip: vellip,
-	verbar: verbar,
-	Verbar: Verbar,
-	vert: vert,
-	Vert: Vert,
-	VerticalBar: VerticalBar,
-	VerticalLine: VerticalLine,
-	VerticalSeparator: VerticalSeparator,
-	VerticalTilde: VerticalTilde,
-	VeryThinSpace: VeryThinSpace,
-	Vfr: Vfr,
-	vfr: vfr,
-	vltri: vltri,
-	vnsub: vnsub,
-	vnsup: vnsup,
-	Vopf: Vopf,
-	vopf: vopf,
-	vprop: vprop,
-	vrtri: vrtri,
-	Vscr: Vscr,
-	vscr: vscr,
-	vsubnE: vsubnE,
-	vsubne: vsubne,
-	vsupnE: vsupnE,
-	vsupne: vsupne,
-	Vvdash: Vvdash,
-	vzigzag: vzigzag,
-	Wcirc: Wcirc,
-	wcirc: wcirc,
-	wedbar: wedbar,
-	wedge: wedge,
-	Wedge: Wedge,
-	wedgeq: wedgeq,
-	weierp: weierp,
-	Wfr: Wfr,
-	wfr: wfr,
-	Wopf: Wopf,
-	wopf: wopf,
-	wp: wp,
-	wr: wr,
-	wreath: wreath,
-	Wscr: Wscr,
-	wscr: wscr,
-	xcap: xcap,
-	xcirc: xcirc,
-	xcup: xcup,
-	xdtri: xdtri,
-	Xfr: Xfr,
-	xfr: xfr,
-	xharr: xharr,
-	xhArr: xhArr,
-	Xi: Xi,
-	xi: xi,
-	xlarr: xlarr,
-	xlArr: xlArr,
-	xmap: xmap,
-	xnis: xnis,
-	xodot: xodot,
-	Xopf: Xopf,
-	xopf: xopf,
-	xoplus: xoplus,
-	xotime: xotime,
-	xrarr: xrarr,
-	xrArr: xrArr,
-	Xscr: Xscr,
-	xscr: xscr,
-	xsqcup: xsqcup,
-	xuplus: xuplus,
-	xutri: xutri,
-	xvee: xvee,
-	xwedge: xwedge,
-	Yacute: Yacute,
-	yacute: yacute,
-	YAcy: YAcy,
-	yacy: yacy,
-	Ycirc: Ycirc,
-	ycirc: ycirc,
-	Ycy: Ycy,
-	ycy: ycy,
-	yen: yen,
-	Yfr: Yfr,
-	yfr: yfr,
-	YIcy: YIcy,
-	yicy: yicy,
-	Yopf: Yopf,
-	yopf: yopf,
-	Yscr: Yscr,
-	yscr: yscr,
-	YUcy: YUcy,
-	yucy: yucy,
-	yuml: yuml,
-	Yuml: Yuml,
-	Zacute: Zacute,
-	zacute: zacute,
-	Zcaron: Zcaron,
-	zcaron: zcaron,
-	Zcy: Zcy,
-	zcy: zcy,
-	Zdot: Zdot,
-	zdot: zdot,
-	zeetrf: zeetrf,
-	ZeroWidthSpace: ZeroWidthSpace,
-	Zeta: Zeta,
-	zeta: zeta,
-	zfr: zfr,
-	Zfr: Zfr,
-	ZHcy: ZHcy,
-	zhcy: zhcy,
-	zigrarr: zigrarr,
-	zopf: zopf,
-	Zopf: Zopf,
-	Zscr: Zscr,
-	zscr: zscr,
-	zwj: zwj,
-	zwnj: zwnj,
-	'default': entities
-};
-
-var Aacute$1 = "Á";
-var aacute$1 = "á";
-var Acirc$1 = "Â";
-var acirc$1 = "â";
-var acute$1 = "´";
-var AElig$1 = "Æ";
-var aelig$1 = "æ";
-var Agrave$1 = "À";
-var agrave$1 = "à";
-var amp$1 = "&";
-var AMP$1 = "&";
-var Aring$1 = "Å";
-var aring$1 = "å";
-var Atilde$1 = "Ã";
-var atilde$1 = "ã";
-var Auml$1 = "Ä";
-var auml$1 = "ä";
-var brvbar$1 = "¦";
-var Ccedil$1 = "Ç";
-var ccedil$1 = "ç";
-var cedil$1 = "¸";
-var cent$1 = "¢";
-var copy$1 = "©";
-var COPY$1 = "©";
-var curren$1 = "¤";
-var deg$1 = "°";
-var divide$1 = "÷";
-var Eacute$1 = "É";
-var eacute$1 = "é";
-var Ecirc$1 = "Ê";
-var ecirc$1 = "ê";
-var Egrave$1 = "È";
-var egrave$1 = "è";
-var ETH$1 = "Ð";
-var eth$1 = "ð";
-var Euml$1 = "Ë";
-var euml$1 = "ë";
-var frac12$1 = "½";
-var frac14$1 = "¼";
-var frac34$1 = "¾";
-var gt$1 = ">";
-var GT$1 = ">";
-var Iacute$1 = "Í";
-var iacute$1 = "í";
-var Icirc$1 = "Î";
-var icirc$1 = "î";
-var iexcl$1 = "¡";
-var Igrave$1 = "Ì";
-var igrave$1 = "ì";
-var iquest$1 = "¿";
-var Iuml$1 = "Ï";
-var iuml$1 = "ï";
-var laquo$1 = "«";
-var lt$1 = "<";
-var LT$1 = "<";
-var macr$1 = "¯";
-var micro$1 = "µ";
-var middot$1 = "·";
-var nbsp$1 = " ";
-var not$1 = "¬";
-var Ntilde$1 = "Ñ";
-var ntilde$1 = "ñ";
-var Oacute$1 = "Ó";
-var oacute$1 = "ó";
-var Ocirc$1 = "Ô";
-var ocirc$1 = "ô";
-var Ograve$1 = "Ò";
-var ograve$1 = "ò";
-var ordf$1 = "ª";
-var ordm$1 = "º";
-var Oslash$1 = "Ø";
-var oslash$1 = "ø";
-var Otilde$1 = "Õ";
-var otilde$1 = "õ";
-var Ouml$1 = "Ö";
-var ouml$1 = "ö";
-var para$1 = "¶";
-var plusmn$1 = "±";
-var pound$1 = "£";
-var quot$1 = "\"";
-var QUOT$1 = "\"";
-var raquo$1 = "»";
-var reg$1 = "®";
-var REG$1 = "®";
-var sect$1 = "§";
-var shy$1 = "­";
-var sup1$1 = "¹";
-var sup2$1 = "²";
-var sup3$1 = "³";
-var szlig$1 = "ß";
-var THORN$1 = "Þ";
-var thorn$1 = "þ";
-var times$1 = "×";
-var Uacute$1 = "Ú";
-var uacute$1 = "ú";
-var Ucirc$1 = "Û";
-var ucirc$1 = "û";
-var Ugrave$1 = "Ù";
-var ugrave$1 = "ù";
-var uml$1 = "¨";
-var Uuml$1 = "Ü";
-var uuml$1 = "ü";
-var Yacute$1 = "Ý";
-var yacute$1 = "ý";
-var yen$1 = "¥";
-var yuml$1 = "ÿ";
-var legacy = {
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1
-};
-
-var legacy$1 = {
-	__proto__: null,
-	Aacute: Aacute$1,
-	aacute: aacute$1,
-	Acirc: Acirc$1,
-	acirc: acirc$1,
-	acute: acute$1,
-	AElig: AElig$1,
-	aelig: aelig$1,
-	Agrave: Agrave$1,
-	agrave: agrave$1,
-	amp: amp$1,
-	AMP: AMP$1,
-	Aring: Aring$1,
-	aring: aring$1,
-	Atilde: Atilde$1,
-	atilde: atilde$1,
-	Auml: Auml$1,
-	auml: auml$1,
-	brvbar: brvbar$1,
-	Ccedil: Ccedil$1,
-	ccedil: ccedil$1,
-	cedil: cedil$1,
-	cent: cent$1,
-	copy: copy$1,
-	COPY: COPY$1,
-	curren: curren$1,
-	deg: deg$1,
-	divide: divide$1,
-	Eacute: Eacute$1,
-	eacute: eacute$1,
-	Ecirc: Ecirc$1,
-	ecirc: ecirc$1,
-	Egrave: Egrave$1,
-	egrave: egrave$1,
-	ETH: ETH$1,
-	eth: eth$1,
-	Euml: Euml$1,
-	euml: euml$1,
-	frac12: frac12$1,
-	frac14: frac14$1,
-	frac34: frac34$1,
-	gt: gt$1,
-	GT: GT$1,
-	Iacute: Iacute$1,
-	iacute: iacute$1,
-	Icirc: Icirc$1,
-	icirc: icirc$1,
-	iexcl: iexcl$1,
-	Igrave: Igrave$1,
-	igrave: igrave$1,
-	iquest: iquest$1,
-	Iuml: Iuml$1,
-	iuml: iuml$1,
-	laquo: laquo$1,
-	lt: lt$1,
-	LT: LT$1,
-	macr: macr$1,
-	micro: micro$1,
-	middot: middot$1,
-	nbsp: nbsp$1,
-	not: not$1,
-	Ntilde: Ntilde$1,
-	ntilde: ntilde$1,
-	Oacute: Oacute$1,
-	oacute: oacute$1,
-	Ocirc: Ocirc$1,
-	ocirc: ocirc$1,
-	Ograve: Ograve$1,
-	ograve: ograve$1,
-	ordf: ordf$1,
-	ordm: ordm$1,
-	Oslash: Oslash$1,
-	oslash: oslash$1,
-	Otilde: Otilde$1,
-	otilde: otilde$1,
-	Ouml: Ouml$1,
-	ouml: ouml$1,
-	para: para$1,
-	plusmn: plusmn$1,
-	pound: pound$1,
-	quot: quot$1,
-	QUOT: QUOT$1,
-	raquo: raquo$1,
-	reg: reg$1,
-	REG: REG$1,
-	sect: sect$1,
-	shy: shy$1,
-	sup1: sup1$1,
-	sup2: sup2$1,
-	sup3: sup3$1,
-	szlig: szlig$1,
-	THORN: THORN$1,
-	thorn: thorn$1,
-	times: times$1,
-	Uacute: Uacute$1,
-	uacute: uacute$1,
-	Ucirc: Ucirc$1,
-	ucirc: ucirc$1,
-	Ugrave: Ugrave$1,
-	ugrave: ugrave$1,
-	uml: uml$1,
-	Uuml: Uuml$1,
-	uuml: uuml$1,
-	Yacute: Yacute$1,
-	yacute: yacute$1,
-	yen: yen$1,
-	yuml: yuml$1,
-	'default': legacy
-};
-
-var amp$2 = "&";
-var apos$1 = "'";
-var gt$2 = ">";
-var lt$2 = "<";
-var quot$2 = "\"";
-var xml = {
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2
-};
-
-var xml$1 = {
-	__proto__: null,
-	amp: amp$2,
-	apos: apos$1,
-	gt: gt$2,
-	lt: lt$2,
-	quot: quot$2,
-	'default': xml
-};
-
-var decode = {
-	"0": 65533,
-	"128": 8364,
-	"130": 8218,
-	"131": 402,
-	"132": 8222,
-	"133": 8230,
-	"134": 8224,
-	"135": 8225,
-	"136": 710,
-	"137": 8240,
-	"138": 352,
-	"139": 8249,
-	"140": 338,
-	"142": 381,
-	"145": 8216,
-	"146": 8217,
-	"147": 8220,
-	"148": 8221,
-	"149": 8226,
-	"150": 8211,
-	"151": 8212,
-	"152": 732,
-	"153": 8482,
-	"154": 353,
-	"155": 8250,
-	"156": 339,
-	"158": 382,
-	"159": 376
-};
-
-var decode$1 = {
-	__proto__: null,
-	'default': decode
-};
-
-var require$$0 = getCjsExportFromNamespace(decode$1);
-
-var decode_codepoint = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var decode_json_1 = __importDefault(require$$0);
-// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
-function decodeCodePoint(codePoint) {
-    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
-        return "\uFFFD";
-    }
-    if (codePoint in decode_json_1.default) {
-        codePoint = decode_json_1.default[codePoint];
-    }
-    var output = "";
-    if (codePoint > 0xffff) {
-        codePoint -= 0x10000;
-        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
-        codePoint = 0xdc00 | (codePoint & 0x3ff);
-    }
-    output += String.fromCharCode(codePoint);
-    return output;
-}
-exports.default = decodeCodePoint;
-});
-
-var require$$1 = getCjsExportFromNamespace(entities$1);
-
-var require$$1$1 = getCjsExportFromNamespace(legacy$1);
-
-var require$$0$1 = getCjsExportFromNamespace(xml$1);
-
-var decode$2 = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
-var entities_json_1 = __importDefault(require$$1);
-var legacy_json_1 = __importDefault(require$$1$1);
-var xml_json_1 = __importDefault(require$$0$1);
-var decode_codepoint_1 = __importDefault(decode_codepoint);
-exports.decodeXML = getStrictDecoder(xml_json_1.default);
-exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
-function getStrictDecoder(map) {
-    var keys = Object.keys(map).join("|");
-    var replace = getReplacer(map);
-    keys += "|#[xX][\\da-fA-F]+|#\\d+";
-    var re = new RegExp("&(?:" + keys + ");", "g");
-    return function (str) { return String(str).replace(re, replace); };
-}
-var sorter = function (a, b) { return (a < b ? 1 : -1); };
-exports.decodeHTML = (function () {
-    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
-    var keys = Object.keys(entities_json_1.default).sort(sorter);
-    for (var i = 0, j = 0; i < keys.length; i++) {
-        if (legacy[j] === keys[i]) {
-            keys[i] += ";?";
-            j++;
-        }
-        else {
-            keys[i] += ";";
-        }
-    }
-    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
-    var replace = getReplacer(entities_json_1.default);
-    function replacer(str) {
-        if (str.substr(-1) !== ";")
-            str += ";";
-        return replace(str);
-    }
-    //TODO consider creating a merged map
-    return function (str) { return String(str).replace(re, replacer); };
-})();
-function getReplacer(map) {
-    return function replace(str) {
-        if (str.charAt(1) === "#") {
-            var secondChar = str.charAt(2);
-            if (secondChar === "X" || secondChar === "x") {
-                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
-            }
-            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
-        }
-        return map[str.slice(1, -1)];
-    };
-}
-});
-
-var encode = createCommonjsModule(function (module, exports) {
-var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.escape = exports.encodeHTML = exports.encodeXML = void 0;
-var xml_json_1 = __importDefault(require$$0$1);
-var inverseXML = getInverseObj(xml_json_1.default);
-var xmlReplacer = getInverseReplacer(inverseXML);
-exports.encodeXML = getInverse(inverseXML, xmlReplacer);
-var entities_json_1 = __importDefault(require$$1);
-var inverseHTML = getInverseObj(entities_json_1.default);
-var htmlReplacer = getInverseReplacer(inverseHTML);
-exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
-function getInverseObj(obj) {
-    return Object.keys(obj)
-        .sort()
-        .reduce(function (inverse, name) {
-        inverse[obj[name]] = "&" + name + ";";
-        return inverse;
-    }, {});
-}
-function getInverseReplacer(inverse) {
-    var single = [];
-    var multiple = [];
-    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
-        var k = _a[_i];
-        if (k.length === 1) {
-            // Add value to single array
-            single.push("\\" + k);
-        }
-        else {
-            // Add value to multiple array
-            multiple.push(k);
-        }
-    }
-    // Add ranges to single characters.
-    single.sort();
-    for (var start = 0; start < single.length - 1; start++) {
-        // Find the end of a run of characters
-        var end = start;
-        while (end < single.length - 1 &&
-            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
-            end += 1;
-        }
-        var count = 1 + end - start;
-        // We want to replace at least three characters
-        if (count < 3)
-            continue;
-        single.splice(start, count, single[start] + "-" + single[end]);
-    }
-    multiple.unshift("[" + single.join("") + "]");
-    return new RegExp(multiple.join("|"), "g");
-}
-var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
-function singleCharReplacer(c) {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";";
-}
-function getInverse(inverse, re) {
-    return function (data) {
-        return data
-            .replace(re, function (name) { return inverse[name]; })
-            .replace(reNonASCII, singleCharReplacer);
-    };
-}
-var reXmlChars = getInverseReplacer(inverseXML);
-function escape(data) {
-    return data
-        .replace(reXmlChars, singleCharReplacer)
-        .replace(reNonASCII, singleCharReplacer);
-}
-exports.escape = escape;
-});
-
-var lib$1 = createCommonjsModule(function (module, exports) {
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.encode = exports.decodeStrict = exports.decode = void 0;
-
-
-/**
- * Decodes a string with entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decode(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data);
-}
-exports.decode = decode;
-/**
- * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
- *
- * @param data String to decode.
- * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function decodeStrict(data, level) {
-    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data);
-}
-exports.decodeStrict = decodeStrict;
-/**
- * Encodes a string with entities.
- *
- * @param data String to encode.
- * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
- */
-function encode$1(data, level) {
-    return (!level || level <= 0 ? encode.encodeXML : encode.encodeHTML)(data);
-}
-exports.encode = encode$1;
-var encode_2 = encode;
-Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
-Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
-// Legacy aliases
-Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-var decode_2 = decode$2;
-Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-// Legacy aliases
-Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-});
-
-var elementNames = {
-	altglyph: "altGlyph",
-	altglyphdef: "altGlyphDef",
-	altglyphitem: "altGlyphItem",
-	animatecolor: "animateColor",
-	animatemotion: "animateMotion",
-	animatetransform: "animateTransform",
-	clippath: "clipPath",
-	feblend: "feBlend",
-	fecolormatrix: "feColorMatrix",
-	fecomponenttransfer: "feComponentTransfer",
-	fecomposite: "feComposite",
-	feconvolvematrix: "feConvolveMatrix",
-	fediffuselighting: "feDiffuseLighting",
-	fedisplacementmap: "feDisplacementMap",
-	fedistantlight: "feDistantLight",
-	fedropshadow: "feDropShadow",
-	feflood: "feFlood",
-	fefunca: "feFuncA",
-	fefuncb: "feFuncB",
-	fefuncg: "feFuncG",
-	fefuncr: "feFuncR",
-	fegaussianblur: "feGaussianBlur",
-	feimage: "feImage",
-	femerge: "feMerge",
-	femergenode: "feMergeNode",
-	femorphology: "feMorphology",
-	feoffset: "feOffset",
-	fepointlight: "fePointLight",
-	fespecularlighting: "feSpecularLighting",
-	fespotlight: "feSpotLight",
-	fetile: "feTile",
-	feturbulence: "feTurbulence",
-	foreignobject: "foreignObject",
-	glyphref: "glyphRef",
-	lineargradient: "linearGradient",
-	radialgradient: "radialGradient",
-	textpath: "textPath"
-};
-var attributeNames = {
-	definitionurl: "definitionURL",
-	attributename: "attributeName",
-	attributetype: "attributeType",
-	basefrequency: "baseFrequency",
-	baseprofile: "baseProfile",
-	calcmode: "calcMode",
-	clippathunits: "clipPathUnits",
-	diffuseconstant: "diffuseConstant",
-	edgemode: "edgeMode",
-	filterunits: "filterUnits",
-	glyphref: "glyphRef",
-	gradienttransform: "gradientTransform",
-	gradientunits: "gradientUnits",
-	kernelmatrix: "kernelMatrix",
-	kernelunitlength: "kernelUnitLength",
-	keypoints: "keyPoints",
-	keysplines: "keySplines",
-	keytimes: "keyTimes",
-	lengthadjust: "lengthAdjust",
-	limitingconeangle: "limitingConeAngle",
-	markerheight: "markerHeight",
-	markerunits: "markerUnits",
-	markerwidth: "markerWidth",
-	maskcontentunits: "maskContentUnits",
-	maskunits: "maskUnits",
-	numoctaves: "numOctaves",
-	pathlength: "pathLength",
-	patterncontentunits: "patternContentUnits",
-	patterntransform: "patternTransform",
-	patternunits: "patternUnits",
-	pointsatx: "pointsAtX",
-	pointsaty: "pointsAtY",
-	pointsatz: "pointsAtZ",
-	preservealpha: "preserveAlpha",
-	preserveaspectratio: "preserveAspectRatio",
-	primitiveunits: "primitiveUnits",
-	refx: "refX",
-	refy: "refY",
-	repeatcount: "repeatCount",
-	repeatdur: "repeatDur",
-	requiredextensions: "requiredExtensions",
-	requiredfeatures: "requiredFeatures",
-	specularconstant: "specularConstant",
-	specularexponent: "specularExponent",
-	spreadmethod: "spreadMethod",
-	startoffset: "startOffset",
-	stddeviation: "stdDeviation",
-	stitchtiles: "stitchTiles",
-	surfacescale: "surfaceScale",
-	systemlanguage: "systemLanguage",
-	tablevalues: "tableValues",
-	targetx: "targetX",
-	targety: "targetY",
-	textlength: "textLength",
-	viewbox: "viewBox",
-	viewtarget: "viewTarget",
-	xchannelselector: "xChannelSelector",
-	ychannelselector: "yChannelSelector",
-	zoomandpan: "zoomAndPan"
-};
-var foreignNames = {
-	elementNames: elementNames,
-	attributeNames: attributeNames
-};
-
-var foreignNames$1 = {
-	__proto__: null,
-	elementNames: elementNames,
-	attributeNames: attributeNames,
-	'default': foreignNames
-};
-
-var foreignNames$2 = getCjsExportFromNamespace(foreignNames$1);
-
-var domSerializer = createCommonjsModule(function (module) {
-/*
-  Module dependencies
-*/
-
-
-
-/* mixed-case SVG and MathML tags & attributes
-   recognized by the HTML parser, see
-   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
-*/
-
-foreignNames$2.elementNames.__proto__ = null; /* use as a simple dictionary */
-foreignNames$2.attributeNames.__proto__ = null;
-
-var unencodedElements = {
-  __proto__: null,
-  style: true,
-  script: true,
-  xmp: true,
-  iframe: true,
-  noembed: true,
-  noframes: true,
-  plaintext: true,
-  noscript: true
-};
-
-/*
-  Format attributes
-*/
-function formatAttrs(attributes, opts) {
-  if (!attributes) return;
-
-  var output = '';
-  var value;
-
-  // Loop through the attributes
-  for (var key in attributes) {
-    value = attributes[key];
-    if (output) {
-      output += ' ';
-    }
-
-    if (opts.xmlMode === 'foreign') {
-      /* fix up mixed-case attribute names */
-      key = foreignNames$2.attributeNames[key] || key;
-    }
-    output += key;
-    if ((value !== null && value !== '') || opts.xmlMode) {
-      output +=
-        '="' +
-        (opts.decodeEntities
-          ? lib$1.encodeXML(value)
-          : value.replace(/\"/g, '&quot;')) +
-        '"';
-    }
-  }
-
-  return output;
-}
-
-/*
-  Self-enclosing tags (stolen from node-htmlparser)
-*/
-var singleTag = {
-  __proto__: null,
-  area: true,
-  base: true,
-  basefont: true,
-  br: true,
-  col: true,
-  command: true,
-  embed: true,
-  frame: true,
-  hr: true,
-  img: true,
-  input: true,
-  isindex: true,
-  keygen: true,
-  link: true,
-  meta: true,
-  param: true,
-  source: true,
-  track: true,
-  wbr: true
-};
-
-var render = (module.exports = function(dom, opts) {
-  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];
-  opts = opts || {};
-
-  var output = '';
-
-  for (var i = 0; i < dom.length; i++) {
-    var elem = dom[i];
-
-    if (elem.type === 'root') output += render(elem.children, opts);
-    else if (lib.isTag(elem)) output += renderTag(elem, opts);
-    else if (elem.type === lib.Directive)
-      output += renderDirective(elem);
-    else if (elem.type === lib.Comment) output += renderComment(elem);
-    else if (elem.type === lib.CDATA) output += renderCdata(elem);
-    else output += renderText(elem, opts);
-  }
-
-  return output;
-});
-
-var foreignModeIntegrationPoints = [
-  'mi',
-  'mo',
-  'mn',
-  'ms',
-  'mtext',
-  'annotation-xml',
-  'foreignObject',
-  'desc',
-  'title'
-];
-
-function renderTag(elem, opts) {
-  // Handle SVG / MathML in HTML
-  if (opts.xmlMode === 'foreign') {
-    /* fix up mixed-case element names */
-    elem.name = foreignNames$2.elementNames[elem.name] || elem.name;
-    /* exit foreign mode at integration points */
-    if (
-      elem.parent &&
-      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0
-    )
-      opts = Object.assign({}, opts, { xmlMode: false });
-  }
-  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {
-    opts = Object.assign({}, opts, { xmlMode: 'foreign' });
-  }
-
-  var tag = '<' + elem.name;
-  var attribs = formatAttrs(elem.attribs, opts);
-
-  if (attribs) {
-    tag += ' ' + attribs;
-  }
-
-  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {
-    tag += '/>';
-  } else {
-    tag += '>';
-    if (elem.children) {
-      tag += render(elem.children, opts);
-    }
-
-    if (!singleTag[elem.name] || opts.xmlMode) {
-      tag += '</' + elem.name + '>';
-    }
-  }
-
-  return tag;
-}
-
-function renderDirective(elem) {
-  return '<' + elem.data + '>';
-}
-
-function renderText(elem, opts) {
-  var data = elem.data || '';
-
-  // if entities weren't decoded, no need to encode them back
-  if (
-    opts.decodeEntities &&
-    !(elem.parent && elem.parent.name in unencodedElements)
-  ) {
-    data = lib$1.encodeXML(data);
-  }
-
-  return data;
-}
-
-function renderCdata(elem) {
-  return '<![CDATA[' + elem.children[0].data + ']]>';
-}
-
-function renderComment(elem) {
-  return '<!--' + elem.data + '-->';
-}
-});
-
-var isTag = domelementtype.isTag;
-
-var stringify = {
-	getInnerHTML: getInnerHTML,
-	getOuterHTML: domSerializer,
-	getText: getText
-};
-
-function getInnerHTML(elem, opts){
-	return elem.children ? elem.children.map(function(elem){
-		return domSerializer(elem, opts);
-	}).join("") : "";
-}
-
-function getText(elem){
-	if(Array.isArray(elem)) return elem.map(getText).join("");
-	if(isTag(elem) || elem.type === domelementtype.CDATA) return getText(elem.children);
-	if(elem.type === domelementtype.Text) return elem.data;
-	return "";
-}
-
-var traversal = createCommonjsModule(function (module, exports) {
-var getChildren = exports.getChildren = function(elem){
-	return elem.children;
-};
-
-var getParent = exports.getParent = function(elem){
-	return elem.parent;
-};
-
-exports.getSiblings = function(elem){
-	var parent = getParent(elem);
-	return parent ? getChildren(parent) : [elem];
-};
-
-exports.getAttributeValue = function(elem, name){
-	return elem.attribs && elem.attribs[name];
-};
-
-exports.hasAttrib = function(elem, name){
-	return !!elem.attribs && hasOwnProperty.call(elem.attribs, name);
-};
-
-exports.getName = function(elem){
-	return elem.name;
-};
-});
-
-var removeElement = function(elem){
-	if(elem.prev) elem.prev.next = elem.next;
-	if(elem.next) elem.next.prev = elem.prev;
-
-	if(elem.parent){
-		var childs = elem.parent.children;
-		childs.splice(childs.lastIndexOf(elem), 1);
-	}
-};
-
-var replaceElement = function(elem, replacement){
-	var prev = replacement.prev = elem.prev;
-	if(prev){
-		prev.next = replacement;
-	}
-
-	var next = replacement.next = elem.next;
-	if(next){
-		next.prev = replacement;
-	}
-
-	var parent = replacement.parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs[childs.lastIndexOf(elem)] = replacement;
-	}
-};
-
-var appendChild = function(elem, child){
-	child.parent = elem;
-
-	if(elem.children.push(child) !== 1){
-		var sibling = elem.children[elem.children.length - 2];
-		sibling.next = child;
-		child.prev = sibling;
-		child.next = null;
-	}
-};
-
-var append = function(elem, next){
-	var parent = elem.parent,
-		currNext = elem.next;
-
-	next.next = currNext;
-	next.prev = elem;
-	elem.next = next;
-	next.parent = parent;
-
-	if(currNext){
-		currNext.prev = next;
-		if(parent){
-			var childs = parent.children;
-			childs.splice(childs.lastIndexOf(currNext), 0, next);
-		}
-	} else if(parent){
-		parent.children.push(next);
-	}
-};
-
-var prepend = function(elem, prev){
-	var parent = elem.parent;
-	if(parent){
-		var childs = parent.children;
-		childs.splice(childs.lastIndexOf(elem), 0, prev);
-	}
-
-	if(elem.prev){
-		elem.prev.next = prev;
-	}
-	
-	prev.parent = parent;
-	prev.prev = elem.prev;
-	prev.next = elem;
-	elem.prev = prev;
-};
-
-var manipulation = {
-	removeElement: removeElement,
-	replaceElement: replaceElement,
-	appendChild: appendChild,
-	append: append,
-	prepend: prepend
-};
-
-var isTag$1 = domelementtype.isTag;
-
-var querying = {
-	filter: filter,
-	find: find,
-	findOneChild: findOneChild,
-	findOne: findOne,
-	existsOne: existsOne,
-	findAll: findAll
-};
-
-function filter(test, element, recurse, limit){
-	if(!Array.isArray(element)) element = [element];
-
-	if(typeof limit !== "number" || !isFinite(limit)){
-		limit = Infinity;
-	}
-	return find(test, element, recurse !== false, limit);
-}
-
-function find(test, elems, recurse, limit){
-	var result = [], childs;
-
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(test(elems[i])){
-			result.push(elems[i]);
-			if(--limit <= 0) break;
-		}
-
-		childs = elems[i].children;
-		if(recurse && childs && childs.length > 0){
-			childs = find(test, childs, recurse, limit);
-			result = result.concat(childs);
-			limit -= childs.length;
-			if(limit <= 0) break;
-		}
-	}
-
-	return result;
-}
-
-function findOneChild(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(test(elems[i])) return elems[i];
-	}
-
-	return null;
-}
-
-function findOne(test, elems){
-	var elem = null;
-
-	for(var i = 0, l = elems.length; i < l && !elem; i++){
-		if(!isTag$1(elems[i])){
-			continue;
-		} else if(test(elems[i])){
-			elem = elems[i];
-		} else if(elems[i].children.length > 0){
-			elem = findOne(test, elems[i].children);
-		}
-	}
-
-	return elem;
-}
-
-function existsOne(test, elems){
-	for(var i = 0, l = elems.length; i < l; i++){
-		if(
-			isTag$1(elems[i]) && (
-				test(elems[i]) || (
-					elems[i].children.length > 0 &&
-					existsOne(test, elems[i].children)
-				)
-			)
-		){
-			return true;
-		}
-	}
-
-	return false;
-}
-
-function findAll(test, elems){
-	var result = [];
-	for(var i = 0, j = elems.length; i < j; i++){
-		if(!isTag$1(elems[i])) continue;
-		if(test(elems[i])) result.push(elems[i]);
-
-		if(elems[i].children.length > 0){
-			result = result.concat(findAll(test, elems[i].children));
-		}
-	}
-	return result;
-}
-
-var legacy$2 = createCommonjsModule(function (module, exports) {
-var isTag = exports.isTag = domelementtype.isTag;
-
-exports.testElement = function(options, element){
-	for(var key in options){
-		if(!options.hasOwnProperty(key));
-		else if(key === "tag_name"){
-			if(!isTag(element) || !options.tag_name(element.name)){
-				return false;
-			}
-		} else if(key === "tag_type"){
-			if(!options.tag_type(element.type)) return false;
-		} else if(key === "tag_contains"){
-			if(isTag(element) || !options.tag_contains(element.data)){
-				return false;
-			}
-		} else if(!element.attribs || !options[key](element.attribs[key])){
-			return false;
-		}
-	}
-	return true;
-};
-
-var Checks = {
-	tag_name: function(name){
-		if(typeof name === "function"){
-			return function(elem){ return isTag(elem) && name(elem.name); };
-		} else if(name === "*"){
-			return isTag;
-		} else {
-			return function(elem){ return isTag(elem) && elem.name === name; };
-		}
-	},
-	tag_type: function(type){
-		if(typeof type === "function"){
-			return function(elem){ return type(elem.type); };
-		} else {
-			return function(elem){ return elem.type === type; };
-		}
-	},
-	tag_contains: function(data){
-		if(typeof data === "function"){
-			return function(elem){ return !isTag(elem) && data(elem.data); };
-		} else {
-			return function(elem){ return !isTag(elem) && elem.data === data; };
-		}
-	}
-};
-
-function getAttribCheck(attrib, value){
-	if(typeof value === "function"){
-		return function(elem){ return elem.attribs && value(elem.attribs[attrib]); };
-	} else {
-		return function(elem){ return elem.attribs && elem.attribs[attrib] === value; };
-	}
-}
-
-function combineFuncs(a, b){
-	return function(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-exports.getElements = function(options, element, recurse, limit){
-	var funcs = Object.keys(options).map(function(key){
-		var value = options[key];
-		return key in Checks ? Checks[key](value) : getAttribCheck(key, value);
-	});
-
-	return funcs.length === 0 ? [] : this.filter(
-		funcs.reduce(combineFuncs),
-		element, recurse, limit
-	);
-};
-
-exports.getElementById = function(id, element, recurse){
-	if(!Array.isArray(element)) element = [element];
-	return this.findOne(getAttribCheck("id", id), element, recurse !== false);
-};
-
-exports.getElementsByTagName = function(name, element, recurse, limit){
-	return this.filter(Checks.tag_name(name), element, recurse, limit);
-};
-
-exports.getElementsByTagType = function(type, element, recurse, limit){
-	return this.filter(Checks.tag_type(type), element, recurse, limit);
-};
-});
-
-var helpers = createCommonjsModule(function (module, exports) {
-// removeSubsets
-// Given an array of nodes, remove any member that is contained by another.
-exports.removeSubsets = function(nodes) {
-	var idx = nodes.length, node, ancestor, replace;
-
-	// Check if each node (or one of its ancestors) is already contained in the
-	// array.
-	while (--idx > -1) {
-		node = ancestor = nodes[idx];
-
-		// Temporarily remove the node under consideration
-		nodes[idx] = null;
-		replace = true;
-
-		while (ancestor) {
-			if (nodes.indexOf(ancestor) > -1) {
-				replace = false;
-				nodes.splice(idx, 1);
-				break;
-			}
-			ancestor = ancestor.parent;
-		}
-
-		// If the node has been found to be unique, re-insert it.
-		if (replace) {
-			nodes[idx] = node;
-		}
-	}
-
-	return nodes;
-};
-
-// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition
-var POSITION = {
-	DISCONNECTED: 1,
-	PRECEDING: 2,
-	FOLLOWING: 4,
-	CONTAINS: 8,
-	CONTAINED_BY: 16
-};
-
-// Compare the position of one node against another node in any other document.
-// The return value is a bitmask with the following values:
-//
-// document order:
-// > There is an ordering, document order, defined on all the nodes in the
-// > document corresponding to the order in which the first character of the
-// > XML representation of each node occurs in the XML representation of the
-// > document after expansion of general entities. Thus, the document element
-// > node will be the first node. Element nodes occur before their children.
-// > Thus, document order orders element nodes in order of the occurrence of
-// > their start-tag in the XML (after expansion of entities). The attribute
-// > nodes of an element occur after the element and before its children. The
-// > relative order of attribute nodes is implementation-dependent./
-// Source:
-// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
-//
-// @argument {Node} nodaA The first node to use in the comparison
-// @argument {Node} nodeB The second node to use in the comparison
-//
-// @return {Number} A bitmask describing the input nodes' relative position.
-//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
-//         a description of these values.
-var comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {
-	var aParents = [];
-	var bParents = [];
-	var current, sharedParent, siblings, aSibling, bSibling, idx;
-
-	if (nodeA === nodeB) {
-		return 0;
-	}
-
-	current = nodeA;
-	while (current) {
-		aParents.unshift(current);
-		current = current.parent;
-	}
-	current = nodeB;
-	while (current) {
-		bParents.unshift(current);
-		current = current.parent;
-	}
-
-	idx = 0;
-	while (aParents[idx] === bParents[idx]) {
-		idx++;
-	}
-
-	if (idx === 0) {
-		return POSITION.DISCONNECTED;
-	}
-
-	sharedParent = aParents[idx - 1];
-	siblings = sharedParent.children;
-	aSibling = aParents[idx];
-	bSibling = bParents[idx];
-
-	if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
-		if (sharedParent === nodeB) {
-			return POSITION.FOLLOWING | POSITION.CONTAINED_BY;
-		}
-		return POSITION.FOLLOWING;
-	} else {
-		if (sharedParent === nodeA) {
-			return POSITION.PRECEDING | POSITION.CONTAINS;
-		}
-		return POSITION.PRECEDING;
-	}
-};
-
-// Sort an array of nodes based on their relative position in the document and
-// remove any duplicate nodes. If the array contains nodes that do not belong
-// to the same document, sort order is unspecified.
-//
-// @argument {Array} nodes Array of DOM nodes
-//
-// @returns {Array} collection of unique nodes, sorted in document order
-exports.uniqueSort = function(nodes) {
-	var idx = nodes.length, node, position;
-
-	nodes = nodes.slice();
-
-	while (--idx > -1) {
-		node = nodes[idx];
-		position = nodes.indexOf(node);
-		if (position > -1 && position < idx) {
-			nodes.splice(idx, 1);
-		}
-	}
-	nodes.sort(function(a, b) {
-		var relative = comparePos(a, b);
-		if (relative & POSITION.PRECEDING) {
-			return -1;
-		} else if (relative & POSITION.FOLLOWING) {
-			return 1;
-		}
-		return 0;
-	});
-
-	return nodes;
-};
-});
-
-var domutils = createCommonjsModule(function (module) {
-var DomUtils = module.exports;
-
-[
-	stringify,
-	traversal,
-	manipulation,
-	querying,
-	legacy$2,
-	helpers
-].forEach(function(ext){
-	Object.keys(ext).forEach(function(key){
-		DomUtils[key] = ext[key].bind(DomUtils);
-	});
-});
-});
-
-var parse_1 = parse;
-
-//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
-
-//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
-var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
-
-/*
-	parses a nth-check formula, returns an array of two numbers
-*/
-function parse(formula){
-	formula = formula.trim().toLowerCase();
-
-	if(formula === "even"){
-		return [2, 0];
-	} else if(formula === "odd"){
-		return [2, 1];
-	} else {
-		var parsed = formula.match(re_nthElement);
-
-		if(!parsed){
-			throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')");
-		}
-
-		var a;
-
-		if(parsed[1]){
-			a = parseInt(parsed[1], 10);
-			if(isNaN(a)){
-				if(parsed[1].charAt(0) === "-") a = -1;
-				else a = 1;
-			}
-		} else a = 0;
-
-		return [
-			a,
-			parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0
-		];
-	}
-}
-
-var boolbase = {
-	trueFunc: function trueFunc(){
-		return true;
-	},
-	falseFunc: function falseFunc(){
-		return false;
-	}
-};
-
-var compile_1 = compile;
-
-var trueFunc  = boolbase.trueFunc,
-    falseFunc = boolbase.falseFunc;
-
-/*
-	returns a function that checks if an elements index matches the given rule
-	highly optimized to return the fastest solution
-*/
-function compile(parsed){
-	var a = parsed[0],
-	    b = parsed[1] - 1;
-
-	//when b <= 0, a*n won't be possible for any matches when a < 0
-	//besides, the specification says that no element is matched when a and b are 0
-	if(b < 0 && a <= 0) return falseFunc;
-
-	//when a is in the range -1..1, it matches any element (so only b is checked)
-	if(a ===-1) return function(pos){ return pos <= b; };
-	if(a === 0) return function(pos){ return pos === b; };
-	//when b <= 0 and a === 1, they match any element
-	if(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };
-
-	//when a > 0, modulo can be used to check if there is a match
-	var bMod = b % a;
-	if(bMod < 0) bMod += a;
-
-	if(a > 1){
-		return function(pos){
-			return pos >= b && pos % a === bMod;
-		};
-	}
-
-	a *= -1; //make `a` positive
-
-	return function(pos){
-		return pos <= b && pos % a === bMod;
-	};
-}
-
-var nthCheck = function nthCheck(formula){
-	return compile_1(parse_1(formula));
-};
-
-var parse_1$1 = parse_1;
-var compile_1$1 = compile_1;
-nthCheck.parse = parse_1$1;
-nthCheck.compile = compile_1$1;
-
-var hasAttrib = domutils.hasAttrib,
-    getAttributeValue = domutils.getAttributeValue,
-    falseFunc$1 = boolbase.falseFunc;
-
-//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469
-var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
-
-/*
-	attribute selectors
-*/
-
-var attributeRules = {
-	__proto__: null,
-	equals: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function equalsIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function equals(elem){
-			return getAttributeValue(elem, name) === value && next(elem);
-		};
-	},
-	hyphen: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function hyphenIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null &&
-						(attr.length === len || attr.charAt(len) === "-") &&
-						attr.substr(0, len).toLowerCase() === value &&
-						next(elem);
-			};
-		}
-
-		return function hyphen(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null &&
-					attr.substr(0, len) === value &&
-					(attr.length === len || attr.charAt(len) === "-") &&
-					next(elem);
-		};
-	},
-	element: function(next, data){
-		var name = data.name,
-		    value = data.value;
-
-		if(/\s/.test(value)){
-			return falseFunc$1;
-		}
-
-		value = value.replace(reChars, "\\$&");
-
-		var pattern = "(?:^|\\s)" + value + "(?:$|\\s)",
-		    flags = data.ignoreCase ? "i" : "",
-		    regex = new RegExp(pattern, flags);
-
-		return function element(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && regex.test(attr) && next(elem);
-		};
-	},
-	exists: function(next, data){
-		var name = data.name;
-		return function exists(elem){
-			return hasAttrib(elem, name) && next(elem);
-		};
-	},
-	start: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len = value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-		
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function startIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function start(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(0, len) === value && next(elem);
-		};
-	},
-	end: function(next, data){
-		var name  = data.name,
-		    value = data.value,
-		    len   = -value.length;
-
-		if(len === 0){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function endIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(len).toLowerCase() === value && next(elem);
-			};
-		}
-
-		return function end(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.substr(len) === value && next(elem);
-		};
-	},
-	any: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return falseFunc$1;
-		}
-
-		if(data.ignoreCase){
-			var regex = new RegExp(value.replace(reChars, "\\$&"), "i");
-
-			return function anyIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && regex.test(attr) && next(elem);
-			};
-		}
-
-		return function any(elem){
-			var attr = getAttributeValue(elem, name);
-			return attr != null && attr.indexOf(value) >= 0 && next(elem);
-		};
-	},
-	not: function(next, data){
-		var name  = data.name,
-		    value = data.value;
-
-		if(value === ""){
-			return function notEmpty(elem){
-				return !!getAttributeValue(elem, name) && next(elem);
-			};
-		} else if(data.ignoreCase){
-			value = value.toLowerCase();
-
-			return function notIC(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.toLowerCase() !== value && next(elem);
-			};
-		}
-
-		return function not(elem){
-			return getAttributeValue(elem, name) !== value && next(elem);
-		};
-	}
-};
-
-var attributes = {
-	compile: function(next, data, options){
-		if(options && options.strict && (
-			data.ignoreCase || data.action === "not"
-		)) throw SyntaxError("Unsupported attribute selector");
-		return attributeRules[data.action](next, data);
-	},
-	rules: attributeRules
-};
-
-/*
-	pseudo selectors
-
-	---
-
-	they are available in two forms:
-	* filters called when the selector
-	  is compiled and return a function
-	  that needs to return next()
-	* pseudos get called on execution
-	  they need to return a boolean
-*/
-
-var isTag$2       = domutils.isTag,
-    getText$1     = domutils.getText,
-    getParent   = domutils.getParent,
-    getChildren = domutils.getChildren,
-    getSiblings = domutils.getSiblings,
-    hasAttrib$1   = domutils.hasAttrib,
-    getName     = domutils.getName,
-    getAttribute= domutils.getAttributeValue,
-    checkAttrib = attributes.rules.equals,
-    trueFunc$1    = boolbase.trueFunc,
-    falseFunc$2   = boolbase.falseFunc;
-
-//helper methods
-function getFirstElement(elems){
-	for(var i = 0; elems && i < elems.length; i++){
-		if(isTag$2(elems[i])) return elems[i];
-	}
-}
-
-function getAttribFunc(name, value){
-	var data = {name: name, value: value};
-	return function attribFunc(next){
-		return checkAttrib(next, data);
-	};
-}
-
-function getChildFunc(next){
-	return function(elem){
-		return !!getParent(elem) && next(elem);
-	};
-}
-
-var filters = {
-	contains: function(next, text){
-		return function contains(elem){
-			return next(elem) && getText$1(elem).indexOf(text) >= 0;
-		};
-	},
-	icontains: function(next, text){
-		var itext = text.toLowerCase();
-		return function icontains(elem){
-			return next(elem) &&
-				getText$1(elem).toLowerCase().indexOf(itext) >= 0;
-		};
-	},
-
-	//location specific methods
-	"nth-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0, pos = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-child": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastChild(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					else pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-	"nth-last-of-type": function(next, rule){
-		var func = nthCheck(rule);
-
-		if(func === falseFunc$2) return func;
-		if(func === trueFunc$1)  return getChildFunc(next);
-
-		return function nthLastOfType(elem){
-			var siblings = getSiblings(elem);
-
-			for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(getName(siblings[i]) === getName(elem)) pos++;
-				}
-			}
-
-			return func(pos) && next(elem);
-		};
-	},
-
-    //TODO determine the actual root element
-    root: function(next){
-        return function(elem){
-            return !getParent(elem) && next(elem);
-        };
-    },
-
-    scope: function(next, rule, options, context){
-        if(!context || context.length === 0){
-            //equivalent to :root
-            return filters.root(next);
-        }
-
-        if(context.length === 1){
-            //NOTE: can't be unpacked, as :has uses this for side-effects
-            return function(elem){
-                return context[0] === elem && next(elem);
-            };
-        }
-
-        return function(elem){
-            return context.indexOf(elem) >= 0 && next(elem);
-        };
-    },
-
-	//jQuery extensions (others follow as pseudos)
-	checkbox: getAttribFunc("type", "checkbox"),
-	file: getAttribFunc("type", "file"),
-	password: getAttribFunc("type", "password"),
-	radio: getAttribFunc("type", "radio"),
-	reset: getAttribFunc("type", "reset"),
-	image: getAttribFunc("type", "image"),
-	submit: getAttribFunc("type", "submit")
-};
-
-//while filters are precompiled, pseudos get called when they are needed
-var pseudos = {
-	empty: function(elem){
-		return !getChildren(elem).some(function(elem){
-			return isTag$2(elem) || elem.type === "text";
-		});
-	},
-
-	"first-child": function(elem){
-		return getFirstElement(getSiblings(elem)) === elem;
-	},
-	"last-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length - 1; i >= 0; i--){
-			if(siblings[i] === elem) return true;
-			if(isTag$2(siblings[i])) break;
-		}
-
-		return false;
-	},
-	"first-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"last-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = siblings.length-1; i >= 0; i--){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) return true;
-				if(getName(siblings[i]) === getName(elem)) break;
-			}
-		}
-
-		return false;
-	},
-	"only-of-type": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0, j = siblings.length; i < j; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem) continue;
-				if(getName(siblings[i]) === getName(elem)) return false;
-			}
-		}
-
-		return true;
-	},
-	"only-child": function(elem){
-		var siblings = getSiblings(elem);
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i]) && siblings[i] !== elem) return false;
-		}
-
-		return true;
-	},
-
-	//:matches(a, area, link)[href]
-	link: function(elem){
-		return hasAttrib$1(elem, "href");
-	},
-	visited: falseFunc$2, //seems to be a valid implementation
-	//TODO: :any-link once the name is finalized (as an alias of :link)
-
-	//forms
-	//to consider: :target
-
-	//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)
-	selected: function(elem){
-		if(hasAttrib$1(elem, "selected")) return true;
-		else if(getName(elem) !== "option") return false;
-
-		//the first <option> in a <select> is also selected
-		var parent = getParent(elem);
-
-		if(
-			!parent ||
-			getName(parent) !== "select" ||
-			hasAttrib$1(parent, "multiple")
-		) return false;
-
-		var siblings = getChildren(parent),
-			sawElem  = false;
-
-		for(var i = 0; i < siblings.length; i++){
-			if(isTag$2(siblings[i])){
-				if(siblings[i] === elem){
-					sawElem = true;
-				} else if(!sawElem){
-					return false;
-				} else if(hasAttrib$1(siblings[i], "selected")){
-					return false;
-				}
-			}
-		}
-
-		return sawElem;
-	},
-	//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
-	//:matches(
-	//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],
-	//  optgroup[disabled] > option),
-	// fieldset[disabled] * //TODO not child of first <legend>
-	//)
-	disabled: function(elem){
-		return hasAttrib$1(elem, "disabled");
-	},
-	enabled: function(elem){
-		return !hasAttrib$1(elem, "disabled");
-	},
-	//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)
-	checked: function(elem){
-		return hasAttrib$1(elem, "checked") || pseudos.selected(elem);
-	},
-	//:matches(input, select, textarea)[required]
-	required: function(elem){
-		return hasAttrib$1(elem, "required");
-	},
-	//:matches(input, select, textarea):not([required])
-	optional: function(elem){
-		return !hasAttrib$1(elem, "required");
-	},
-
-	//jQuery extensions
-
-	//:not(:empty)
-	parent: function(elem){
-		return !pseudos.empty(elem);
-	},
-	//:matches(h1, h2, h3, h4, h5, h6)
-	header: function(elem){
-		var name = getName(elem);
-		return name === "h1" ||
-		       name === "h2" ||
-		       name === "h3" ||
-		       name === "h4" ||
-		       name === "h5" ||
-		       name === "h6";
-	},
-
-	//:matches(button, input[type=button])
-	button: function(elem){
-		var name = getName(elem);
-		return name === "button" ||
-		       name === "input" &&
-		       getAttribute(elem, "type") === "button";
-	},
-	//:matches(input, textarea, select, button)
-	input: function(elem){
-		var name = getName(elem);
-		return name === "input" ||
-		       name === "textarea" ||
-		       name === "select" ||
-		       name === "button";
-	},
-	//input:matches(:not([type!='']), [type='text' i])
-	text: function(elem){
-		var attr;
-		return getName(elem) === "input" && (
-			!(attr = getAttribute(elem, "type")) ||
-			attr.toLowerCase() === "text"
-		);
-	}
-};
-
-function verifyArgs(func, name, subselect){
-	if(subselect === null){
-		if(func.length > 1 && name !== "scope"){
-			throw new SyntaxError("pseudo-selector :" + name + " requires an argument");
-		}
-	} else {
-		if(func.length === 1){
-			throw new SyntaxError("pseudo-selector :" + name + " doesn't have any arguments");
-		}
-	}
-}
-
-//FIXME this feels hacky
-var re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;
-
-var pseudos_1 = {
-	compile: function(next, data, options, context){
-		var name = data.name,
-			subselect = data.data;
-
-		if(options && options.strict && !re_CSS3.test(name)){
-			throw SyntaxError(":" + name + " isn't part of CSS3");
-		}
-
-		if(typeof filters[name] === "function"){
-			verifyArgs(filters[name], name,  subselect);
-			return filters[name](next, subselect, options, context);
-		} else if(typeof pseudos[name] === "function"){
-			var func = pseudos[name];
-			verifyArgs(func, name, subselect);
-
-			if(next === trueFunc$1) return func;
-
-			return function pseudoArgs(elem){
-				return func(elem, subselect) && next(elem);
-			};
-		} else {
-			throw new SyntaxError("unmatched pseudo-class :" + name);
-		}
-	},
-	filters: filters,
-	pseudos: pseudos
-};
-
-var cssWhat = parse$1;
-
-var re_name = /^(?:\\.|[\w\-\u00b0-\uFFFF])+/,
-    re_escape = /\\([\da-f]{1,6}\s?|(\s)|.)/ig,
-    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
-    re_attr = /^\s*((?:\\.|[\w\u00b0-\uFFFF\-])+)\s*(?:(\S?)=\s*(?:(['"])([^]*?)\3|(#?(?:\\.|[\w\u00b0-\uFFFF\-])*)|)|)\s*(i)?\]/;
-
-var actionTypes = {
-	__proto__: null,
-	"undefined": "exists",
-	"":  "equals",
-	"~": "element",
-	"^": "start",
-	"$": "end",
-	"*": "any",
-	"!": "not",
-	"|": "hyphen"
-};
-
-var simpleSelectors = {
-	__proto__: null,
-	">": "child",
-	"<": "parent",
-	"~": "sibling",
-	"+": "adjacent"
-};
-
-var attribSelectors = {
-	__proto__: null,
-	"#": ["id", "equals"],
-	".": ["class", "element"]
-};
-
-//pseudos, whose data-property is parsed as well
-var unpackPseudos = {
-	__proto__: null,
-	"has": true,
-	"not": true,
-	"matches": true
-};
-
-var stripQuotesFromPseudos = {
-	__proto__: null,
-	"contains": true,
-	"icontains": true
-};
-
-var quotes = {
-	__proto__: null,
-	"\"": true,
-	"'": true
-};
-
-//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
-function funescape( _, escaped, escapedWhitespace ) {
-	var high = "0x" + escaped - 0x10000;
-	// NaN means non-codepoint
-	// Support: Firefox
-	// Workaround erroneous numeric interpretation of +"0x"
-	return high !== high || escapedWhitespace ?
-		escaped :
-		// BMP codepoint
-		high < 0 ?
-			String.fromCharCode( high + 0x10000 ) :
-			// Supplemental Plane codepoint (surrogate pair)
-			String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-}
-
-function unescapeCSS(str){
-	return str.replace(re_escape, funescape);
-}
-
-function isWhitespace(c){
-	return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
-}
-
-function parse$1(selector, options){
-	var subselects = [];
-
-	selector = parseSelector(subselects, selector + "", options);
-
-	if(selector !== ""){
-		throw new SyntaxError("Unmatched selector: " + selector);
-	}
-
-	return subselects;
-}
-
-function parseSelector(subselects, selector, options){
-	var tokens = [],
-		sawWS = false,
-		data, firstChar, name, quot;
-
-	function getName(){
-		var sub = selector.match(re_name)[0];
-		selector = selector.substr(sub.length);
-		return unescapeCSS(sub);
-	}
-
-	function stripWhitespace(start){
-		while(isWhitespace(selector.charAt(start))) start++;
-		selector = selector.substr(start);
-	}
-
-	function isEscaped(pos) {
-		var slashCount = 0;
-
-		while (selector.charAt(--pos) === "\\") slashCount++;
-		return (slashCount & 1) === 1;
-	}
-
-	stripWhitespace(0);
-
-	while(selector !== ""){
-		firstChar = selector.charAt(0);
-
-		if(isWhitespace(firstChar)){
-			sawWS = true;
-			stripWhitespace(1);
-		} else if(firstChar in simpleSelectors){
-			tokens.push({type: simpleSelectors[firstChar]});
-			sawWS = false;
-
-			stripWhitespace(1);
-		} else if(firstChar === ","){
-			if(tokens.length === 0){
-				throw new SyntaxError("empty sub-selector");
-			}
-			subselects.push(tokens);
-			tokens = [];
-			sawWS = false;
-			stripWhitespace(1);
-		} else {
-			if(sawWS){
-				if(tokens.length > 0){
-					tokens.push({type: "descendant"});
-				}
-				sawWS = false;
-			}
-
-			if(firstChar === "*"){
-				selector = selector.substr(1);
-				tokens.push({type: "universal"});
-			} else if(firstChar in attribSelectors){
-				selector = selector.substr(1);
-				tokens.push({
-					type: "attribute",
-					name: attribSelectors[firstChar][0],
-					action: attribSelectors[firstChar][1],
-					value: getName(),
-					ignoreCase: false
-				});
-			} else if(firstChar === "["){
-				selector = selector.substr(1);
-				data = selector.match(re_attr);
-				if(!data){
-					throw new SyntaxError("Malformed attribute selector: " + selector);
-				}
-				selector = selector.substr(data[0].length);
-				name = unescapeCSS(data[1]);
-
-				if(
-					!options || (
-						"lowerCaseAttributeNames" in options ?
-							options.lowerCaseAttributeNames :
-							!options.xmlMode
-					)
-				){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({
-					type: "attribute",
-					name: name,
-					action: actionTypes[data[2]],
-					value: unescapeCSS(data[4] || data[5] || ""),
-					ignoreCase: !!data[6]
-				});
-
-			} else if(firstChar === ":"){
-				if(selector.charAt(1) === ":"){
-					selector = selector.substr(2);
-					tokens.push({type: "pseudo-element", name: getName().toLowerCase()});
-					continue;
-				}
-
-				selector = selector.substr(1);
-
-				name = getName().toLowerCase();
-				data = null;
-
-				if(selector.charAt(0) === "("){
-					if(name in unpackPseudos){
-						quot = selector.charAt(1);
-						var quoted = quot in quotes;
-
-						selector = selector.substr(quoted + 1);
-
-						data = [];
-						selector = parseSelector(data, selector, options);
-
-						if(quoted){
-							if(selector.charAt(0) !== quot){
-								throw new SyntaxError("unmatched quotes in :" + name);
-							} else {
-								selector = selector.substr(1);
-							}
-						}
-
-						if(selector.charAt(0) !== ")"){
-							throw new SyntaxError("missing closing parenthesis in :" + name + " " + selector);
-						}
-
-						selector = selector.substr(1);
-					} else {
-						var pos = 1, counter = 1;
-
-						for(; counter > 0 && pos < selector.length; pos++){
-							if(selector.charAt(pos) === "(" && !isEscaped(pos)) counter++;
-							else if(selector.charAt(pos) === ")" && !isEscaped(pos)) counter--;
-						}
-
-						if(counter){
-							throw new SyntaxError("parenthesis not matched");
-						}
-
-						data = selector.substr(1, pos - 2);
-						selector = selector.substr(pos);
-
-						if(name in stripQuotesFromPseudos){
-							quot = data.charAt(0);
-
-							if(quot === data.slice(-1) && quot in quotes){
-								data = data.slice(1, -1);
-							}
-
-							data = unescapeCSS(data);
-						}
-					}
-				}
-
-				tokens.push({type: "pseudo", name: name, data: data});
-			} else if(re_name.test(selector)){
-				name = getName();
-
-				if(!options || ("lowerCaseTags" in options ? options.lowerCaseTags : !options.xmlMode)){
-					name = name.toLowerCase();
-				}
-
-				tokens.push({type: "tag", name: name});
-			} else {
-				if(tokens.length && tokens[tokens.length - 1].type === "descendant"){
-					tokens.pop();
-				}
-				addToken(subselects, tokens);
-				return selector;
-			}
-		}
-	}
-
-	addToken(subselects, tokens);
-
-	return selector;
-}
-
-function addToken(subselects, tokens){
-	if(subselects.length > 0 && tokens.length === 0){
-		throw new SyntaxError("empty sub-selector");
-	}
-
-	subselects.push(tokens);
-}
-
-var isTag$3       = domutils.isTag,
-    getParent$1   = domutils.getParent,
-    getChildren$1 = domutils.getChildren,
-    getSiblings$1 = domutils.getSiblings,
-    getName$1     = domutils.getName;
-
-/*
-	all available rules
-*/
-var general = {
-	__proto__: null,
-
-	attribute: attributes.compile,
-	pseudo: pseudos_1.compile,
-
-	//tags
-	tag: function(next, data){
-		var name = data.name;
-		return function tag(elem){
-			return getName$1(elem) === name && next(elem);
-		};
-	},
-
-	//traversal
-	descendant: function(next, rule, options, context, acceptSelf){
-		return function descendant(elem){
-
-			if (acceptSelf && next(elem)) return true;
-
-			var found = false;
-
-			while(!found && (elem = getParent$1(elem))){
-				found = next(elem);
-			}
-
-			return found;
-		};
-	},
-	parent: function(next, data, options){
-		if(options && options.strict) throw SyntaxError("Parent selector isn't part of CSS3");
-
-		return function parent(elem){
-			return getChildren$1(elem).some(test);
-		};
-
-		function test(elem){
-			return isTag$3(elem) && next(elem);
-		}
-	},
-	child: function(next){
-		return function child(elem){
-			var parent = getParent$1(elem);
-			return !!parent && next(parent);
-		};
-	},
-	sibling: function(next){
-		return function sibling(elem){
-			var siblings = getSiblings$1(elem);
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					if(next(siblings[i])) return true;
-				}
-			}
-
-			return false;
-		};
-	},
-	adjacent: function(next){
-		return function adjacent(elem){
-			var siblings = getSiblings$1(elem),
-			    lastElement;
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$3(siblings[i])){
-					if(siblings[i] === elem) break;
-					lastElement = siblings[i];
-				}
-			}
-
-			return !!lastElement && next(lastElement);
-		};
-	},
-	universal: function(next){
-		return next;
-	}
-};
-
-var universal = 50;
-var tag = 30;
-var attribute = 1;
-var pseudo = 0;
-var descendant = -1;
-var child = -1;
-var parent = -1;
-var sibling = -1;
-var adjacent = -1;
-var procedure = {
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent
-};
-
-var procedure$1 = {
-	__proto__: null,
-	universal: universal,
-	tag: tag,
-	attribute: attribute,
-	pseudo: pseudo,
-	descendant: descendant,
-	child: child,
-	parent: parent,
-	sibling: sibling,
-	adjacent: adjacent,
-	'default': procedure
-};
-
-var procedure$2 = getCjsExportFromNamespace(procedure$1);
-
-var sort = sortByProcedure;
-
-/*
-	sort the parts of the passed selector,
-	as there is potential for optimization
-	(some types of selectors are faster than others)
-*/
-
-
-
-var attributes$1 = {
-	__proto__: null,
-	exists: 10,
-	equals: 8,
-	not: 7,
-	start: 6,
-	end: 6,
-	any: 5,
-	hyphen: 4,
-	element: 4
-};
-
-function sortByProcedure(arr){
-	var procs = arr.map(getProcedure);
-	for(var i = 1; i < arr.length; i++){
-		var procNew = procs[i];
-
-		if(procNew < 0) continue;
-
-		for(var j = i - 1; j >= 0 && procNew < procs[j]; j--){
-			var token = arr[j + 1];
-			arr[j + 1] = arr[j];
-			arr[j] = token;
-			procs[j + 1] = procs[j];
-			procs[j] = procNew;
-		}
-	}
-}
-
-function getProcedure(token){
-	var proc = procedure$2[token.type];
-
-	if(proc === procedure$2.attribute){
-		proc = attributes$1[token.action];
-
-		if(proc === attributes$1.equals && token.name === "id"){
-			//prefer ID selectors (eg. #ID)
-			proc = 9;
-		}
-
-		if(token.ignoreCase){
-			//ignoreCase adds some overhead, prefer "normal" token
-			//this is a binary operation, to ensure it's still an int
-			proc >>= 1;
-		}
-	} else if(proc === procedure$2.pseudo){
-		if(!token.data){
-			proc = 3;
-		} else if(token.name === "has" || token.name === "contains"){
-			proc = 0; //expensive in any case
-		} else if(token.name === "matches" || token.name === "not"){
-			proc = 0;
-			for(var i = 0; i < token.data.length; i++){
-				//TODO better handling of complex selectors
-				if(token.data[i].length !== 1) continue;
-				var cur = getProcedure(token.data[i][0]);
-				//avoid executing :has or :contains
-				if(cur === 0){
-					proc = 0;
-					break;
-				}
-				if(cur > proc) proc = cur;
-			}
-			if(token.data.length > 1 && proc > 0) proc -= 1;
-		} else {
-			proc = 1;
-		}
-	}
-	return proc;
-}
-
-/*
-	compiles a selector to an executable function
-*/
-
-var compile_1$2 = compile$1;
-var compileUnsafe_1 = compileUnsafe;
-var compileToken_1 = compileToken;
-
-var isTag$4       = domutils.isTag,
-    trueFunc$2    = boolbase.trueFunc,
-    falseFunc$3   = boolbase.falseFunc;
-
-function compile$1(selector, options, context){
-	var next = compileUnsafe(selector, options, context);
-	return wrap(next);
-}
-
-function wrap(next){
-	return function base(elem){
-		return isTag$4(elem) && next(elem);
-	};
-}
-
-function compileUnsafe(selector, options, context){
-	var token = cssWhat(selector, options);
-	return compileToken(token, options, context);
-}
-
-function includesScopePseudo(t){
-    return t.type === "pseudo" && (
-        t.name === "scope" || (
-            Array.isArray(t.data) &&
-            t.data.some(function(data){
-                return data.some(includesScopePseudo);
-            })
-        )
-    );
-}
-
-var DESCENDANT_TOKEN = {type: "descendant"},
-    SCOPE_TOKEN = {type: "pseudo", name: "scope"},
-    PLACEHOLDER_ELEMENT = {},
-    getParent$2 = domutils.getParent;
-
-//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
-//http://www.w3.org/TR/selectors4/#absolutizing
-function absolutize(token, context){
-    //TODO better check if context is document
-    var hasContext = !!context && !!context.length && context.every(function(e){
-        return e === PLACEHOLDER_ELEMENT || !!getParent$2(e);
-    });
-
-
-    token.forEach(function(t){
-        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant"); else if(hasContext && !includesScopePseudo(t)){
-            t.unshift(DESCENDANT_TOKEN);
-        } else {
-            return;
-        }
-
-        t.unshift(SCOPE_TOKEN);
-    });
-}
-
-function compileToken(token, options, context){
-    token = token.filter(function(t){ return t.length > 0; });
-
-	token.forEach(sort);
-
-	var isArrayContext = Array.isArray(context);
-
-    context = (options && options.context) || context;
-
-    if(context && !isArrayContext) context = [context];
-
-    absolutize(token, context);
-
-	return token
-		.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })
-		.reduce(reduceRules, falseFunc$3);
-}
-
-function isTraversal(t){
-	return procedure$2[t.type] < 0;
-}
-
-function compileRules(rules, options, context, isArrayContext){
-	var acceptSelf = (isArrayContext && rules[0].name === "scope" && rules[1].type === "descendant");
-	return rules.reduce(function(func, rule, index){
-		if(func === falseFunc$3) return func;
-		return general[rule.type](func, rule, options, context, acceptSelf && index === 1);
-	}, options && options.rootFunc || trueFunc$2);
-}
-
-function reduceRules(a, b){
-	if(b === falseFunc$3 || a === trueFunc$2){
-		return a;
-	}
-	if(a === falseFunc$3 || b === trueFunc$2){
-		return b;
-	}
-
-	return function combine(elem){
-		return a(elem) || b(elem);
-	};
-}
-
-//:not, :has and :matches have to compile selectors
-//doing this in lib/pseudos.js would lead to circular dependencies,
-//so we add them here
-
-var filters$1     = pseudos_1.filters,
-    existsOne$1   = domutils.existsOne,
-    isTag$4       = domutils.isTag,
-    getChildren$2 = domutils.getChildren;
-
-
-function containsTraversal(t){
-	return t.some(isTraversal);
-}
-
-filters$1.not = function(next, token, options, context){
-	var opts = {
-	    	xmlMode: !!(options && options.xmlMode),
-	    	strict: !!(options && options.strict)
-	    };
-
-	if(opts.strict){
-		if(token.length > 1 || token.some(containsTraversal)){
-			throw new SyntaxError("complex selectors in :not aren't allowed in strict mode");
-		}
-	}
-
-    var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return next;
-	if(func === trueFunc$2)  return falseFunc$3;
-
-	return function(elem){
-		return !func(elem) && next(elem);
-	};
-};
-
-filters$1.has = function(next, token, options){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict)
-	};
-
-    //FIXME: Uses an array as a pointer to the current element (side effects)
-    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;
-
-	var func = compileToken(token, opts, context);
-
-	if(func === falseFunc$3) return falseFunc$3;
-	if(func === trueFunc$2)  return function(elem){
-			return getChildren$2(elem).some(isTag$4) && next(elem);
-		};
-
-	func = wrap(func);
-
-    if(context){
-        return function has(elem){
-		return next(elem) && (
-                (context[0] = elem), existsOne$1(func, getChildren$2(elem))
-            );
-	};
-    }
-
-    return function has(elem){
-		return next(elem) && existsOne$1(func, getChildren$2(elem));
-	};
-};
-
-filters$1.matches = function(next, token, options, context){
-	var opts = {
-		xmlMode: !!(options && options.xmlMode),
-		strict: !!(options && options.strict),
-		rootFunc: next
-	};
-
-	return compileToken(token, opts, context);
-};
-compile_1$2.compileUnsafe = compileUnsafe_1;
-compile_1$2.compileToken = compileToken_1;
-
-var cssSelect = CSSselect;
-
-var findOne$1       = domutils.findOne,
-    findAll$1       = domutils.findAll,
-    getChildren$3   = domutils.getChildren,
-    removeSubsets = domutils.removeSubsets,
-    falseFunc$4     = boolbase.falseFunc,
-    compileUnsafe$1 = compile_1$2.compileUnsafe,
-    compileToken$1  = compile_1$2.compileToken;
-
-function getSelectorFunc(searchFunc){
-	return function select(query, elems, options){
-        if(typeof query !== "function") query = compileUnsafe$1(query, options, elems);
-        if(!Array.isArray(elems)) elems = getChildren$3(elems);
-		else elems = removeSubsets(elems);
-		return searchFunc(query, elems);
-	};
-}
-
-var selectAll = getSelectorFunc(function selectAll(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? [] : findAll$1(query, elems);
-});
-
-var selectOne = getSelectorFunc(function selectOne(query, elems){
-	return (query === falseFunc$4 || !elems || elems.length === 0) ? null : findOne$1(query, elems);
-});
-
-function is(elem, query, options){
-	return (typeof query === "function" ? query : compile_1$2(query, options))(elem);
-}
-
-/*
-	the exported interface
-*/
-function CSSselect(query, elems, options){
-	return selectAll(query, elems, options);
-}
-
-CSSselect.compile = compile_1$2;
-CSSselect.filters = pseudos_1.filters;
-CSSselect.pseudos = pseudos_1.pseudos;
-
-CSSselect.selectAll = selectAll;
-CSSselect.selectOne = selectOne;
-
-CSSselect.is = is;
-
-//legacy methods (might be removed)
-CSSselect.parse = compile_1$2;
-CSSselect.iterate = selectAll;
-
-//hooks
-CSSselect._compileUnsafe = compileUnsafe$1;
-CSSselect._compileToken = compileToken$1;
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
-const PARSE5_OPTS = {
-  treeAdapter
-};
-/**
- * Parse HTML into a mutable, serializable DOM Document.
- * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
- * @param {String} html   HTML to parse into a Document instance
- */
-
-function createDocument(html) {
-  const document = parse5.parse(html, PARSE5_OPTS);
-  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
-
-  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
-
-  document.$$Node = scratch.constructor;
-  const elementProto = Object.getPrototypeOf(scratch);
-  defineProperties(elementProto, ElementExtensions);
-  elementProto.ownerDocument = document;
-  return document;
-}
-/**
- * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-
-function serializeDocument(document) {
-  return parse5.serialize(document, PARSE5_OPTS);
-}
-/**
- * Methods and descriptors to mix into Element.prototype
- */
-
-const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
-  nodeName: {
-    get() {
-      return this.tagName.toUpperCase();
-    }
-
-  },
-  id: reflectedProperty('id'),
-  className: reflectedProperty('class'),
-
-  insertBefore(child, referenceNode) {
-    if (!referenceNode) return this.appendChild(child);
-    treeAdapter.insertBefore(this, child, referenceNode);
-    return child;
-  },
-
-  appendChild(child) {
-    treeAdapter.appendChild(this, child);
-    return child;
-  },
-
-  removeChild(child) {
-    treeAdapter.detachNode(child);
-  },
-
-  remove() {
-    treeAdapter.detachNode(this);
-  },
-
-  textContent: {
-    get() {
-      return getText$2(this);
-    },
-
-    set(text) {
-      this.children = [];
-      treeAdapter.insertText(this, text);
-    }
-
-  },
-
-  setAttribute(name, value) {
-    if (this.attribs == null) this.attribs = {};
-    if (value == null) value = '';
-    this.attribs[name] = value;
-  },
-
-  removeAttribute(name) {
-    if (this.attribs != null) {
-      delete this.attribs[name];
-    }
-  },
-
-  getAttribute(name) {
-    return this.attribs != null && this.attribs[name];
-  },
-
-  hasAttribute(name) {
-    return this.attribs != null && this.attribs[name] != null;
-  },
-
-  getAttributeNode(name) {
-    const value = this.getAttribute(name);
-    if (value != null) return {
-      specified: true,
-      value
-    };
-  }
-
-};
-/**
- * Methods and descriptors to mix into the global document instance
- * @private
- */
-
-const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
-  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
-  // TODO: verify if these are needed for css-select
-  nodeType: {
-    get() {
-      return 9;
-    }
-
-  },
-  contentType: {
-    get() {
-      return 'text/html';
-    }
-
-  },
-  nodeName: {
-    get() {
-      return '#document';
-    }
-
-  },
-  documentElement: {
-    get() {
-      // Find the first <html> element within the document
-      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
-    }
-
-  },
-  compatMode: {
-    get() {
-      const compatMode = {
-        'no-quirks': 'CSS1Compat',
-        quirks: 'BackCompat',
-        'limited-quirks': 'CSS1Compat'
-      };
-      return compatMode[treeAdapter.getDocumentMode(this)];
-    }
-
-  },
-  body: {
-    get() {
-      return this.querySelector('body');
-    }
-
-  },
-
-  createElement(name) {
-    return treeAdapter.createElement(name, null, []);
-  },
-
-  createTextNode(text) {
-    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
-    const Node = this.$$Node;
-    return new Node({
-      type: 'text',
-      data: text,
-      parent: null,
-      prev: null,
-      next: null
-    });
-  },
-
-  querySelector(sel) {
-    return cssSelect.selectOne(sel, this.documentElement);
-  },
-
-  querySelectorAll(sel) {
-    if (sel === ':root') {
-      return this;
-    }
-
-    return cssSelect(sel, this.documentElement);
-  }
-
-};
-/**
- * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
- * @private
- */
-
-function defineProperties(obj, properties) {
-  for (const i in properties) {
-    const value = properties[i];
-    Object.defineProperty(obj, i, typeof value === 'function' ? {
-      value
-    } : value);
-  }
-}
-/**
- * Create a property descriptor defining a getter/setter pair alias for a named attribute.
- * @private
- */
-
-
-function reflectedProperty(attributeName) {
-  return {
-    get() {
-      return this.getAttribute(attributeName);
-    },
-
-    set(value) {
-      this.setAttribute(attributeName, value);
-    }
-
-  };
-}
-/**
- * Helper to get the text content of a node
- * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
- * @private
- */
-
-
-function getText$2(node) {
-  if (Array.isArray(node)) return node.map(getText$2).join('');
-  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText$2(node.children);
-  if (treeAdapter.isTextNode(node)) return node.data;
-  return '';
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * Parse a textual CSS Stylesheet into a Stylesheet instance.
- * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
- * @see https://github.com/reworkcss/css
- * @private
- * @param {String} stylesheet
- * @returns {css.Stylesheet} ast
- */
-
-function parseStylesheet(stylesheet) {
-  return css.parse(stylesheet);
-}
-/**
- * Serialize a ReworkCSS Stylesheet to a String of CSS.
- * @private
- * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
- * @param {Object} options              Options to pass to `css.stringify()`
- * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
- */
-
-function serializeStylesheet(ast, options) {
-  return css.stringify(ast, options);
-}
-/**
- * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
- * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
- * @private
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- * @returns {(rule) => void} nonDestructiveIterator
- */
-
-function markOnly(predicate) {
-  return rule => {
-    const sel = rule.selectors;
-
-    if (predicate(rule) === false) {
-      rule.$$remove = true;
-    }
-
-    rule.$$markedSelectors = rule.selectors;
-
-    if (rule._other) {
-      rule._other.$$markedSelectors = rule._other.selectors;
-    }
-
-    rule.selectors = sel;
-  };
-}
-/**
- * Apply filtered selectors to a rule from a previous markOnly run.
- * @private
- * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
-*/
-
-function applyMarkedSelectors(rule) {
-  if (rule.$$markedSelectors) {
-    rule.selectors = rule.$$markedSelectors;
-  }
-
-  if (rule._other) {
-    applyMarkedSelectors(rule._other);
-  }
-}
-/**
- * Recursively walk all rules in a stylesheet.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- */
-
-function walkStyleRules(node, iterator) {
-  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-  node.rules = node.rules.filter(rule => {
-    if (rule.rules) {
-      walkStyleRules(rule, iterator);
-    }
-
-    rule._other = undefined;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-}
-/**
- * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {css.Rule} node2      A second tree identical to `node`
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
- */
-
-function walkStyleRulesWithReverseMirror(node, node2, iterator) {
-  if (node2 === null) return walkStyleRules(node, iterator);
-  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
-  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
-    const rule2 = rules2[index];
-
-    if (rule.rules) {
-      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
-    }
-
-    rule._other = rule2;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
-// This is just a quicker version of generating the compliment of the set returned from a filter operation.
-
-function splitFilter(a, b, predicate) {
-  const aOut = [];
-  const bOut = [];
-
-  for (let index = 0; index < a.length; index++) {
-    if (predicate(a[index], index, a, b)) {
-      aOut.push(a[index]);
-    } else {
-      bOut.push(a[index]);
-    }
-  }
-
-  return [aOut, bOut];
-} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
-
-
-function filterSelectors(predicate) {
-  if (this._other) {
-    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
-    this.selectors = a;
-    this._other.selectors = b;
-  } else {
-    this.selectors = this.selectors.filter(predicate);
-  }
-}
-
-const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
-const defaultLogger = {
-  trace(msg) {
-    console.trace(msg);
-  },
-
-  debug(msg) {
-    console.debug(msg);
-  },
-
-  warn(msg) {
-    console.warn(chalk.yellow(msg));
-  },
-
-  error(msg) {
-    console.error(chalk.bold.red(msg));
-  },
-
-  info(msg) {
-    console.info(chalk.bold.blue(msg));
-  },
-
-  silent() {}
-
-};
-function createLogger(logLevel) {
-  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
-  return LOG_LEVELS.reduce((logger, type, index) => {
-    if (index >= logLevelIdx) {
-      logger[type] = defaultLogger[type];
-    } else {
-      logger[type] = defaultLogger.silent;
-    }
-
-    return logger;
-  }, {});
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * The mechanism to use for lazy-loading stylesheets.
- * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
- *
- * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
- * - **"body":** Move all external stylesheet links to the end of the document.
- * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. <kbd>JS</kbd>
- * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>
- * - **"swap-high":** Use `<link rel="alternate stylesheet preload">` and swap to `rel="stylesheet"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>
- * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>
- * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
- * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy
- * @public
- */
-
-/**
- * Controls which keyframes rules are inlined.
- *
- * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
- * - **"all":** Inline all keyframes rules.
- * - **"none":** Remove all keyframes rules.
- * @typedef {('critical'|'all'|'none')} KeyframeStrategy
- * @private
- * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
- */
-
-/**
- * Controls log level of the plugin. Specifies the level the logger should use. A logger will
- * not produce output for any log level beneath the specified level. Available levels and order
- * are:
- *
- * - **"info"** _(default)_
- * - **"warn"**
- * - **"error"**
- * - **"trace"**
- * - **"debug"**
- * - **"silent"**
- * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
- * @public
- */
-
-/**
- * Custom logger interface:
- * @typedef {object} Logger
- * @public
- * @property {function(String)} trace - Prints a trace message
- * @property {function(String)} debug - Prints a debug message
- * @property {function(String)} info - Prints an information message
- * @property {function(String)} warn - Prints a warning message
- * @property {function(String)} error - Prints an error message
- */
-
-/**
- * All optional. Pass them to `new Critters({ ... })`.
- * @public
- * @typedef Options
- * @property {String} path     Base path location of the CSS files _(default: `''`)_
- * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
- * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
- * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
- * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
- * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
- * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
- * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
- * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
- * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
- * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
- * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
- * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
- *  - Values:
- *  - `true` to inline critical font-face rules and preload the fonts
- *  - `false` to don't inline any font-face rules and don't preload fonts
- * @property {String} keyframes     Controls which keyframes rules are inlined.
- *  - Values:
- *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
- *  - `"all"` inline all keyframes rules
- *  - `"none"` remove all keyframes rules
- * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
- * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
- * @property {object} logger        Provide a custom logger interface {@link Logger logger}
- */
-
-class Critters {
-  /** @private */
-  constructor(options) {
-    this.options = Object.assign({
-      logLevel: 'info',
-      path: '',
-      publicPath: '',
-      reduceInlineStyles: true,
-      pruneSource: false,
-      additionalStylesheets: []
-    }, options || {});
-    this.urlFilter = this.options.filter;
-
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-
-    this.logger = this.options.logger || createLogger(this.options.logLevel);
-  }
-  /**
-   * Read the contents of a file from the specified filesystem or disk
-   */
-
-
-  readFile(filename) {
-    const fs = this.fs;
-    return new Promise((resolve, reject) => {
-      const callback = (err, data) => {
-        if (err) reject(err);else resolve(data);
-      };
-
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  }
-  /**
-   * Apply critical CSS processing to the html
-   */
-
-
-  async process(html) {
-    const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
-
-    const document = createDocument(html);
-
-    if (this.options.additionalStylesheets.length > 0) {
-      this.embedAdditionalStylesheet(document);
-    } // `external:false` skips processing of external sheets
-
-
-    if (this.options.external !== false) {
-      const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
-      await Promise.all(externalSheets.map(link => this.embedLinkedStylesheet(link, document)));
-    } // go through all the style tags in the document and reduce them to only critical CSS
-
-
-    const styles = this.getAffectedStyleTags(document);
-    await Promise.all(styles.map(style => this.processStyle(style, document)));
-
-    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
-      await this.mergeStylesheets(document);
-    } // serialize the document back to HTML and we're done
-
-
-    const output = serializeDocument(document);
-    const end = process.hrtime.bigint();
-    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
-    return output;
-  }
-  /**
-   * Get the style tags that need processing
-   */
-
-
-  getAffectedStyleTags(document) {
-    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
-
-    if (this.options.reduceInlineStyles === false) {
-      return styles.filter(style => style.$$external);
-    }
-
-    return styles;
-  }
-
-  async mergeStylesheets(document) {
-    const styles = this.getAffectedStyleTags(document);
-
-    if (styles.length === 0) {
-      this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
-      return;
-    }
-
-    const first = styles[0];
-    let sheet = first.textContent;
-
-    for (let i = 1; i < styles.length; i++) {
-      const node = styles[i];
-      sheet += node.textContent;
-      node.remove();
-    }
-
-    first.textContent = sheet;
-  }
-  /**
-   * Given href, find the corresponding CSS asset
-   */
-
-
-  async getCssAsset(href) {
-    const outputPath = this.options.path;
-    const publicPath = this.options.publicPath; // CHECK - the output path
-    // path on disk (with output.publicPath removed)
-
-    let normalizedPath = href.replace(/^\//, '');
-    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-    if (normalizedPath.indexOf(pathPrefix) === 0) {
-      normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
-    }
-
-    const filename = path.resolve(outputPath, normalizedPath);
-    let sheet;
-
-    try {
-      sheet = await this.readFile(filename);
-    } catch (e) {
-      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
-    }
-
-    return sheet;
-  }
-
-  checkInlineThreshold(link, style, sheet) {
-    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
-      const href = style.$$name;
-      style.$$reduce = false;
-      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
-      link.remove();
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
-   */
-
-
-  async embedAdditionalStylesheet(document) {
-    const styleSheetsIncluded = [];
-    const sources = await Promise.all(this.options.additionalStylesheets.map(cssFile => {
-      if (styleSheetsIncluded.includes(cssFile)) {
-        return;
-      }
-
-      styleSheetsIncluded.push(cssFile);
-      const style = document.createElement('style');
-      style.$$external = true;
-      return this.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
-    }));
-    sources.forEach(([sheet, style]) => {
-      if (!sheet) return;
-      style.textContent = sheet;
-      document.head.appendChild(style);
-    });
-  }
-  /**
-   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-   */
-
-
-  async embedLinkedStylesheet(link, document) {
-    const href = link.getAttribute('href');
-    const media = link.getAttribute('media');
-    const preloadMode = this.options.preload; // skip filtered resources, or network resources if no filter is provided
-
-    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
-      return Promise.resolve();
-    } // the reduced critical CSS gets injected into a new <style> tag
-
-
-    const style = document.createElement('style');
-    style.$$external = true;
-    const sheet = await this.getCssAsset(href, style);
-
-    if (!sheet) {
-      return;
-    }
-
-    style.textContent = sheet;
-    style.$$name = href;
-    style.$$links = [link];
-    link.parentNode.insertBefore(style, link);
-
-    if (this.checkInlineThreshold(link, style, sheet)) {
-      return;
-    } // CSS loader is only injected for the first sheet, then this becomes an empty string
-
-
-    let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-    const lazy = preloadMode === 'js-lazy';
-
-    if (lazy) {
-      cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
-    } // Allow disabling any mutation of the stylesheet link:
-
-
-    if (preloadMode === false) return;
-    let noscriptFallback = false;
-
-    if (preloadMode === 'body') {
-      document.body.appendChild(link);
-    } else {
-      link.setAttribute('rel', 'preload');
-      link.setAttribute('as', 'style');
-
-      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-        const script = document.createElement('script');
-        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
-
-        script.textContent = js;
-        link.parentNode.insertBefore(script, link.nextSibling);
-        style.$$links.push(script);
-        cssLoaderPreamble = '';
-        noscriptFallback = true;
-      } else if (preloadMode === 'media') {
-        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-        link.setAttribute('rel', 'stylesheet');
-        link.removeAttribute('as');
-        link.setAttribute('media', 'print');
-        link.setAttribute('onload', `this.media='${media || 'all'}'`);
-        noscriptFallback = true;
-      } else if (preloadMode === 'swap-high') {
-        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
-        link.setAttribute('rel', 'alternate stylesheet preload');
-        link.setAttribute('title', 'styles');
-        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
-        noscriptFallback = true;
-      } else if (preloadMode === 'swap') {
-        link.setAttribute('onload', "this.rel='stylesheet'");
-        noscriptFallback = true;
-      } else {
-        const bodyLink = document.createElement('link');
-        bodyLink.setAttribute('rel', 'stylesheet');
-        if (media) bodyLink.setAttribute('media', media);
-        bodyLink.setAttribute('href', href);
-        document.body.appendChild(bodyLink);
-        style.$$links.push(bodyLink);
-      }
-    }
-
-    if (this.options.noscriptFallback !== false && noscriptFallback) {
-      const noscript = document.createElement('noscript');
-      const noscriptLink = document.createElement('link');
-      noscriptLink.setAttribute('rel', 'stylesheet');
-      noscriptLink.setAttribute('href', href);
-      if (media) noscriptLink.setAttribute('media', media);
-      noscript.appendChild(noscriptLink);
-      link.parentNode.insertBefore(noscript, link.nextSibling);
-      style.$$links.push(noscript);
-    }
-  }
-  /**
-   * Prune the source CSS files
-   */
-
-
-  pruneSource(style, before, sheetInverse) {
-    // if external stylesheet would be below minimum size, just inline everything
-    const minSize = this.options.minimumExternalSize;
-    const name = style.$$name;
-
-    if (minSize && sheetInverse.length < minSize) {
-      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
-      style.textContent = before; // remove any associated external resources/loaders:
-
-      if (style.$$links) {
-        for (const link of style.$$links) {
-          const parent = link.parentNode;
-          if (parent) parent.removeChild(link);
-        }
-      }
-
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-
-
-  async processStyle(style, document) {
-    if (style.$$reduce === false) return;
-    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-    const options = this.options; // const document = style.ownerDocument;
-
-    const head = document.querySelector('head');
-    let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-    if (keyframesMode === true) keyframesMode = 'all';
-    if (keyframesMode === false) keyframesMode = 'none';
-    let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
-
-    const before = sheet; // Skip empty stylesheets
-
-    if (!sheet) return;
-    const ast = parseStylesheet(sheet);
-    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-    let criticalFonts = '';
-    const failedSelectors = [];
-    const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-    // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-    walkStyleRules(ast, markOnly(rule => {
-      if (rule.type === 'rule') {
-        // Filter the selector list down to only those match
-        rule.filterSelectors(sel => {
-          // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-          // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-          if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
-            return true;
-          }
-
-          sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
-          if (!sel) return false;
-
-          try {
-            return document.querySelector(sel) != null;
-          } catch (e) {
-            failedSelectors.push(sel + ' -> ' + e.message);
-            return false;
-          }
-        }); // If there are no matched selectors, remove the rule:
-
-        if (rule.selectors.length === 0) {
-          return false;
-        }
-
-        if (rule.declarations) {
-          for (let i = 0; i < rule.declarations.length; i++) {
-            const decl = rule.declarations[i]; // detect used fonts
-
-            if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-              criticalFonts += ' ' + decl.value;
-            } // detect used keyframes
-
-
-            if (decl.property === 'animation' || decl.property === 'animation-name') {
-              // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-              const names = decl.value.split(/\s+/);
-
-              for (let j = 0; j < names.length; j++) {
-                const name = names[j].trim();
-                if (name) criticalKeyframeNames.push(name);
-              }
-            }
-          }
-        }
-      } // keep font rules, they're handled in the second pass:
-
-
-      if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-      const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
-      return !rules || rules.length !== 0;
-    }));
-
-    if (failedSelectors.length !== 0) {
-      this.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
-    }
-
-    const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
-    const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
-    const preloadedFonts = []; // Second pass, using data picked up from the first
-
-    walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
-      // remove any rules marked in the first pass
-      if (rule.$$remove === true) return false;
-      applyMarkedSelectors(rule); // prune @keyframes rules
-
-      if (rule.type === 'keyframes') {
-        if (keyframesMode === 'none') return false;
-        if (keyframesMode === 'all') return true;
-        return criticalKeyframeNames.indexOf(rule.name) !== -1;
-      } // prune @font-face rules
-
-
-      if (rule.type === 'font-face') {
-        let family, src;
-
-        for (let i = 0; i < rule.declarations.length; i++) {
-          const decl = rule.declarations[i];
-
-          if (decl.property === 'src') {
-            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-          } else if (decl.property === 'font-family') {
-            family = decl.value;
-          }
-        }
-
-        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-          preloadedFonts.push(src);
-          const preload = document.createElement('link');
-          preload.setAttribute('rel', 'preload');
-          preload.setAttribute('as', 'font');
-          preload.setAttribute('crossorigin', 'anonymous');
-          preload.setAttribute('href', src.trim());
-          head.appendChild(preload);
-        } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-
-        if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
-          return false;
-        }
-      }
-    });
-    sheet = serializeStylesheet(ast, {
-      compress: this.options.compress !== false
-    }).trim(); // If all rules were removed, get rid of the style element entirely
-
-    if (sheet.trim().length === 0) {
-      if (style.parentNode) {
-        style.remove();
-      }
-
-      return;
-    }
-
-    let afterText = '';
-    let styleInlinedCompletely = false;
-
-    if (options.pruneSource) {
-      const sheetInverse = serializeStylesheet(astInverse, {
-        compress: this.options.compress !== false
-      });
-      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
-
-      if (styleInlinedCompletely) {
-        const _percent = sheetInverse.length / before.length * 100;
-
-        afterText = `, reducing non-inlined size ${_percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
-      }
-    } // replace the inline stylesheet with its critical'd counterpart
-
-
-    if (!styleInlinedCompletely) {
-      style.textContent = sheet;
-    } // output stats
-
-
-    const percent = sheet.length / before.length * 100 | 0;
-    this.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
-  }
-
-}
-
-export default Critters;
-//# sourceMappingURL=critters.modern.js.map
Index: trip-planner-front/node_modules/critters/dist/critters.modern.js.map
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.modern.js.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"critters.modern.js","sources":["../node_modules/domelementtype/index.js","../node_modules/dom-serializer/node_modules/domelementtype/lib/index.js","../node_modules/entities/lib/decode_codepoint.js","../node_modules/entities/lib/decode.js","../node_modules/entities/lib/encode.js","../node_modules/entities/lib/index.js","../node_modules/dom-serializer/index.js","../node_modules/css-select/node_modules/domutils/lib/stringify.js","../node_modules/css-select/node_modules/domutils/lib/traversal.js","../node_modules/css-select/node_modules/domutils/lib/manipulation.js","../node_modules/css-select/node_modules/domutils/lib/querying.js","../node_modules/css-select/node_modules/domutils/lib/legacy.js","../node_modules/css-select/node_modules/domutils/lib/helpers.js","../node_modules/css-select/node_modules/domutils/index.js","../node_modules/nth-check/parse.js","../node_modules/boolbase/index.js","../node_modules/nth-check/compile.js","../node_modules/nth-check/index.js","../node_modules/css-select/lib/attributes.js","../node_modules/css-select/lib/pseudos.js","../node_modules/css-what/index.js","../node_modules/css-select/lib/general.js","../node_modules/css-select/lib/sort.js","../node_modules/css-select/lib/compile.js","../node_modules/css-select/index.js","../src/dom.js","../src/css.js","../src/util.js","../src/index.js"],"sourcesContent":["//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\tDoctype: \"doctype\",\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === \"tag\" /* Tag */ ||\n        elem.type === \"script\" /* Script */ ||\n        elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    var output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var keys = Object.keys(map).join(\"|\");\n    var replace = getReplacer(map);\n    keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n    var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n    return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    //TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        return map[str.slice(1, -1)];\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escape = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nfunction singleCharReplacer(c) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return \"&#x\" + c.codePointAt(0).toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n    return data\n        .replace(reXmlChars, singleCharReplacer)\n        .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\n// Legacy aliases\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","/*\n  Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n   recognized by the HTML parser, see\n   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n  __proto__: null,\n  style: true,\n  script: true,\n  xmp: true,\n  iframe: true,\n  noembed: true,\n  noframes: true,\n  plaintext: true,\n  noscript: true\n};\n\n/*\n  Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n  if (!attributes) return;\n\n  var output = '';\n  var value;\n\n  // Loop through the attributes\n  for (var key in attributes) {\n    value = attributes[key];\n    if (output) {\n      output += ' ';\n    }\n\n    if (opts.xmlMode === 'foreign') {\n      /* fix up mixed-case attribute names */\n      key = foreignNames.attributeNames[key] || key;\n    }\n    output += key;\n    if ((value !== null && value !== '') || opts.xmlMode) {\n      output +=\n        '=\"' +\n        (opts.decodeEntities\n          ? entities.encodeXML(value)\n          : value.replace(/\\\"/g, '&quot;')) +\n        '\"';\n    }\n  }\n\n  return output;\n}\n\n/*\n  Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n  __proto__: null,\n  area: true,\n  base: true,\n  basefont: true,\n  br: true,\n  col: true,\n  command: true,\n  embed: true,\n  frame: true,\n  hr: true,\n  img: true,\n  input: true,\n  isindex: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n  opts = opts || {};\n\n  var output = '';\n\n  for (var i = 0; i < dom.length; i++) {\n    var elem = dom[i];\n\n    if (elem.type === 'root') output += render(elem.children, opts);\n    else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n    else if (elem.type === ElementType.Directive)\n      output += renderDirective(elem);\n    else if (elem.type === ElementType.Comment) output += renderComment(elem);\n    else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n    else output += renderText(elem, opts);\n  }\n\n  return output;\n});\n\nvar foreignModeIntegrationPoints = [\n  'mi',\n  'mo',\n  'mn',\n  'ms',\n  'mtext',\n  'annotation-xml',\n  'foreignObject',\n  'desc',\n  'title'\n];\n\nfunction renderTag(elem, opts) {\n  // Handle SVG / MathML in HTML\n  if (opts.xmlMode === 'foreign') {\n    /* fix up mixed-case element names */\n    elem.name = foreignNames.elementNames[elem.name] || elem.name;\n    /* exit foreign mode at integration points */\n    if (\n      elem.parent &&\n      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n    )\n      opts = Object.assign({}, opts, { xmlMode: false });\n  }\n  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n    opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n  }\n\n  var tag = '<' + elem.name;\n  var attribs = formatAttrs(elem.attribs, opts);\n\n  if (attribs) {\n    tag += ' ' + attribs;\n  }\n\n  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n    tag += '/>';\n  } else {\n    tag += '>';\n    if (elem.children) {\n      tag += render(elem.children, opts);\n    }\n\n    if (!singleTag[elem.name] || opts.xmlMode) {\n      tag += '</' + elem.name + '>';\n    }\n  }\n\n  return tag;\n}\n\nfunction renderDirective(elem) {\n  return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n  var data = elem.data || '';\n\n  // if entities weren't decoded, no need to encode them back\n  if (\n    opts.decodeEntities &&\n    !(elem.parent && elem.parent.name in unencodedElements)\n  ) {\n    data = entities.encodeXML(data);\n  }\n\n  return data;\n}\n\nfunction renderCdata(elem) {\n  return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n  return '<!--' + elem.data + '-->';\n}\n","var ElementType = require(\"domelementtype\"),\n    getOuterHTML = require(\"dom-serializer\"),\n    isTag = ElementType.isTag;\n\nmodule.exports = {\n\tgetInnerHTML: getInnerHTML,\n\tgetOuterHTML: getOuterHTML,\n\tgetText: getText\n};\n\nfunction getInnerHTML(elem, opts){\n\treturn elem.children ? elem.children.map(function(elem){\n\t\treturn getOuterHTML(elem, opts);\n\t}).join(\"\") : \"\";\n}\n\nfunction getText(elem){\n\tif(Array.isArray(elem)) return elem.map(getText).join(\"\");\n\tif(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);\n\tif(elem.type === ElementType.Text) return elem.data;\n\treturn \"\";\n}\n","var getChildren = exports.getChildren = function(elem){\n\treturn elem.children;\n};\n\nvar getParent = exports.getParent = function(elem){\n\treturn elem.parent;\n};\n\nexports.getSiblings = function(elem){\n\tvar parent = getParent(elem);\n\treturn parent ? getChildren(parent) : [elem];\n};\n\nexports.getAttributeValue = function(elem, name){\n\treturn elem.attribs && elem.attribs[name];\n};\n\nexports.hasAttrib = function(elem, name){\n\treturn !!elem.attribs && hasOwnProperty.call(elem.attribs, name);\n};\n\nexports.getName = function(elem){\n\treturn elem.name;\n};\n","exports.removeElement = function(elem){\n\tif(elem.prev) elem.prev.next = elem.next;\n\tif(elem.next) elem.next.prev = elem.prev;\n\n\tif(elem.parent){\n\t\tvar childs = elem.parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 1);\n\t}\n};\n\nexports.replaceElement = function(elem, replacement){\n\tvar prev = replacement.prev = elem.prev;\n\tif(prev){\n\t\tprev.next = replacement;\n\t}\n\n\tvar next = replacement.next = elem.next;\n\tif(next){\n\t\tnext.prev = replacement;\n\t}\n\n\tvar parent = replacement.parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds[childs.lastIndexOf(elem)] = replacement;\n\t}\n};\n\nexports.appendChild = function(elem, child){\n\tchild.parent = elem;\n\n\tif(elem.children.push(child) !== 1){\n\t\tvar sibling = elem.children[elem.children.length - 2];\n\t\tsibling.next = child;\n\t\tchild.prev = sibling;\n\t\tchild.next = null;\n\t}\n};\n\nexports.append = function(elem, next){\n\tvar parent = elem.parent,\n\t\tcurrNext = elem.next;\n\n\tnext.next = currNext;\n\tnext.prev = elem;\n\telem.next = next;\n\tnext.parent = parent;\n\n\tif(currNext){\n\t\tcurrNext.prev = next;\n\t\tif(parent){\n\t\t\tvar childs = parent.children;\n\t\t\tchilds.splice(childs.lastIndexOf(currNext), 0, next);\n\t\t}\n\t} else if(parent){\n\t\tparent.children.push(next);\n\t}\n};\n\nexports.prepend = function(elem, prev){\n\tvar parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 0, prev);\n\t}\n\n\tif(elem.prev){\n\t\telem.prev.next = prev;\n\t}\n\t\n\tprev.parent = parent;\n\tprev.prev = elem.prev;\n\tprev.next = elem;\n\telem.prev = prev;\n};\n\n\n","var isTag = require(\"domelementtype\").isTag;\n\nmodule.exports = {\n\tfilter: filter,\n\tfind: find,\n\tfindOneChild: findOneChild,\n\tfindOne: findOne,\n\texistsOne: existsOne,\n\tfindAll: findAll\n};\n\nfunction filter(test, element, recurse, limit){\n\tif(!Array.isArray(element)) element = [element];\n\n\tif(typeof limit !== \"number\" || !isFinite(limit)){\n\t\tlimit = Infinity;\n\t}\n\treturn find(test, element, recurse !== false, limit);\n}\n\nfunction find(test, elems, recurse, limit){\n\tvar result = [], childs;\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(test(elems[i])){\n\t\t\tresult.push(elems[i]);\n\t\t\tif(--limit <= 0) break;\n\t\t}\n\n\t\tchilds = elems[i].children;\n\t\tif(recurse && childs && childs.length > 0){\n\t\t\tchilds = find(test, childs, recurse, limit);\n\t\t\tresult = result.concat(childs);\n\t\t\tlimit -= childs.length;\n\t\t\tif(limit <= 0) break;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findOneChild(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(test(elems[i])) return elems[i];\n\t}\n\n\treturn null;\n}\n\nfunction findOne(test, elems){\n\tvar elem = null;\n\n\tfor(var i = 0, l = elems.length; i < l && !elem; i++){\n\t\tif(!isTag(elems[i])){\n\t\t\tcontinue;\n\t\t} else if(test(elems[i])){\n\t\t\telem = elems[i];\n\t\t} else if(elems[i].children.length > 0){\n\t\t\telem = findOne(test, elems[i].children);\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction existsOne(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(\n\t\t\tisTag(elems[i]) && (\n\t\t\t\ttest(elems[i]) || (\n\t\t\t\t\telems[i].children.length > 0 &&\n\t\t\t\t\texistsOne(test, elems[i].children)\n\t\t\t\t)\n\t\t\t)\n\t\t){\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction findAll(test, elems){\n\tvar result = [];\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\n\t\tif(elems[i].children.length > 0){\n\t\t\tresult = result.concat(findAll(test, elems[i].children));\n\t\t}\n\t}\n\treturn result;\n}\n","var ElementType = require(\"domelementtype\");\nvar isTag = exports.isTag = ElementType.isTag;\n\nexports.testElement = function(options, element){\n\tfor(var key in options){\n\t\tif(!options.hasOwnProperty(key));\n\t\telse if(key === \"tag_name\"){\n\t\t\tif(!isTag(element) || !options.tag_name(element.name)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(key === \"tag_type\"){\n\t\t\tif(!options.tag_type(element.type)) return false;\n\t\t} else if(key === \"tag_contains\"){\n\t\t\tif(isTag(element) || !options.tag_contains(element.data)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(!element.attribs || !options[key](element.attribs[key])){\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\nvar Checks = {\n\ttag_name: function(name){\n\t\tif(typeof name === \"function\"){\n\t\t\treturn function(elem){ return isTag(elem) && name(elem.name); };\n\t\t} else if(name === \"*\"){\n\t\t\treturn isTag;\n\t\t} else {\n\t\t\treturn function(elem){ return isTag(elem) && elem.name === name; };\n\t\t}\n\t},\n\ttag_type: function(type){\n\t\tif(typeof type === \"function\"){\n\t\t\treturn function(elem){ return type(elem.type); };\n\t\t} else {\n\t\t\treturn function(elem){ return elem.type === type; };\n\t\t}\n\t},\n\ttag_contains: function(data){\n\t\tif(typeof data === \"function\"){\n\t\t\treturn function(elem){ return !isTag(elem) && data(elem.data); };\n\t\t} else {\n\t\t\treturn function(elem){ return !isTag(elem) && elem.data === data; };\n\t\t}\n\t}\n};\n\nfunction getAttribCheck(attrib, value){\n\tif(typeof value === \"function\"){\n\t\treturn function(elem){ return elem.attribs && value(elem.attribs[attrib]); };\n\t} else {\n\t\treturn function(elem){ return elem.attribs && elem.attribs[attrib] === value; };\n\t}\n}\n\nfunction combineFuncs(a, b){\n\treturn function(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\nexports.getElements = function(options, element, recurse, limit){\n\tvar funcs = Object.keys(options).map(function(key){\n\t\tvar value = options[key];\n\t\treturn key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n\t});\n\n\treturn funcs.length === 0 ? [] : this.filter(\n\t\tfuncs.reduce(combineFuncs),\n\t\telement, recurse, limit\n\t);\n};\n\nexports.getElementById = function(id, element, recurse){\n\tif(!Array.isArray(element)) element = [element];\n\treturn this.findOne(getAttribCheck(\"id\", id), element, recurse !== false);\n};\n\nexports.getElementsByTagName = function(name, element, recurse, limit){\n\treturn this.filter(Checks.tag_name(name), element, recurse, limit);\n};\n\nexports.getElementsByTagType = function(type, element, recurse, limit){\n\treturn this.filter(Checks.tag_type(type), element, recurse, limit);\n};\n","// removeSubsets\n// Given an array of nodes, remove any member that is contained by another.\nexports.removeSubsets = function(nodes) {\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile (--idx > -1) {\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile (ancestor) {\n\t\t\tif (nodes.indexOf(ancestor) > -1) {\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = ancestor.parent;\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif (replace) {\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n};\n\n// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition\nvar POSITION = {\n\tDISCONNECTED: 1,\n\tPRECEDING: 2,\n\tFOLLOWING: 4,\n\tCONTAINS: 8,\n\tCONTAINED_BY: 16\n};\n\n// Compare the position of one node against another node in any other document.\n// The return value is a bitmask with the following values:\n//\n// document order:\n// > There is an ordering, document order, defined on all the nodes in the\n// > document corresponding to the order in which the first character of the\n// > XML representation of each node occurs in the XML representation of the\n// > document after expansion of general entities. Thus, the document element\n// > node will be the first node. Element nodes occur before their children.\n// > Thus, document order orders element nodes in order of the occurrence of\n// > their start-tag in the XML (after expansion of entities). The attribute\n// > nodes of an element occur after the element and before its children. The\n// > relative order of attribute nodes is implementation-dependent./\n// Source:\n// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n//\n// @argument {Node} nodaA The first node to use in the comparison\n// @argument {Node} nodeB The second node to use in the comparison\n//\n// @return {Number} A bitmask describing the input nodes' relative position.\n//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n//         a description of these values.\nvar comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {\n\tvar aParents = [];\n\tvar bParents = [];\n\tvar current, sharedParent, siblings, aSibling, bSibling, idx;\n\n\tif (nodeA === nodeB) {\n\t\treturn 0;\n\t}\n\n\tcurrent = nodeA;\n\twhile (current) {\n\t\taParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\tcurrent = nodeB;\n\twhile (current) {\n\t\tbParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\n\tidx = 0;\n\twhile (aParents[idx] === bParents[idx]) {\n\t\tidx++;\n\t}\n\n\tif (idx === 0) {\n\t\treturn POSITION.DISCONNECTED;\n\t}\n\n\tsharedParent = aParents[idx - 1];\n\tsiblings = sharedParent.children;\n\taSibling = aParents[idx];\n\tbSibling = bParents[idx];\n\n\tif (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n\t\tif (sharedParent === nodeB) {\n\t\t\treturn POSITION.FOLLOWING | POSITION.CONTAINED_BY;\n\t\t}\n\t\treturn POSITION.FOLLOWING;\n\t} else {\n\t\tif (sharedParent === nodeA) {\n\t\t\treturn POSITION.PRECEDING | POSITION.CONTAINS;\n\t\t}\n\t\treturn POSITION.PRECEDING;\n\t}\n};\n\n// Sort an array of nodes based on their relative position in the document and\n// remove any duplicate nodes. If the array contains nodes that do not belong\n// to the same document, sort order is unspecified.\n//\n// @argument {Array} nodes Array of DOM nodes\n//\n// @returns {Array} collection of unique nodes, sorted in document order\nexports.uniqueSort = function(nodes) {\n\tvar idx = nodes.length, node, position;\n\n\tnodes = nodes.slice();\n\n\twhile (--idx > -1) {\n\t\tnode = nodes[idx];\n\t\tposition = nodes.indexOf(node);\n\t\tif (position > -1 && position < idx) {\n\t\t\tnodes.splice(idx, 1);\n\t\t}\n\t}\n\tnodes.sort(function(a, b) {\n\t\tvar relative = comparePos(a, b);\n\t\tif (relative & POSITION.PRECEDING) {\n\t\t\treturn -1;\n\t\t} else if (relative & POSITION.FOLLOWING) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\treturn nodes;\n};\n","var DomUtils = module.exports;\n\n[\n\trequire(\"./lib/stringify\"),\n\trequire(\"./lib/traversal\"),\n\trequire(\"./lib/manipulation\"),\n\trequire(\"./lib/querying\"),\n\trequire(\"./lib/legacy\"),\n\trequire(\"./lib/helpers\")\n].forEach(function(ext){\n\tObject.keys(ext).forEach(function(key){\n\t\tDomUtils[key] = ext[key].bind(DomUtils);\n\t});\n});\n","module.exports = parse;\n\n//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\n\n//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\nvar re_nthElement = /^([+\\-]?\\d*n)?\\s*(?:([+\\-]?)\\s*(\\d+))?$/;\n\n/*\n\tparses a nth-check formula, returns an array of two numbers\n*/\nfunction parse(formula){\n\tformula = formula.trim().toLowerCase();\n\n\tif(formula === \"even\"){\n\t\treturn [2, 0];\n\t} else if(formula === \"odd\"){\n\t\treturn [2, 1];\n\t} else {\n\t\tvar parsed = formula.match(re_nthElement);\n\n\t\tif(!parsed){\n\t\t\tthrow new SyntaxError(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n\t\t}\n\n\t\tvar a;\n\n\t\tif(parsed[1]){\n\t\t\ta = parseInt(parsed[1], 10);\n\t\t\tif(isNaN(a)){\n\t\t\t\tif(parsed[1].charAt(0) === \"-\") a = -1;\n\t\t\t\telse a = 1;\n\t\t\t}\n\t\t} else a = 0;\n\n\t\treturn [\n\t\t\ta,\n\t\t\tparsed[3] ? parseInt((parsed[2] || \"\") + parsed[3], 10) : 0\n\t\t];\n\t}\n}\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","module.exports = compile;\n\nvar BaseFuncs = require(\"boolbase\"),\n    trueFunc  = BaseFuncs.trueFunc,\n    falseFunc = BaseFuncs.falseFunc;\n\n/*\n\treturns a function that checks if an elements index matches the given rule\n\thighly optimized to return the fastest solution\n*/\nfunction compile(parsed){\n\tvar a = parsed[0],\n\t    b = parsed[1] - 1;\n\n\t//when b <= 0, a*n won't be possible for any matches when a < 0\n\t//besides, the specification says that no element is matched when a and b are 0\n\tif(b < 0 && a <= 0) return falseFunc;\n\n\t//when a is in the range -1..1, it matches any element (so only b is checked)\n\tif(a ===-1) return function(pos){ return pos <= b; };\n\tif(a === 0) return function(pos){ return pos === b; };\n\t//when b <= 0 and a === 1, they match any element\n\tif(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };\n\n\t//when a > 0, modulo can be used to check if there is a match\n\tvar bMod = b % a;\n\tif(bMod < 0) bMod += a;\n\n\tif(a > 1){\n\t\treturn function(pos){\n\t\t\treturn pos >= b && pos % a === bMod;\n\t\t};\n\t}\n\n\ta *= -1; //make `a` positive\n\n\treturn function(pos){\n\t\treturn pos <= b && pos % a === bMod;\n\t};\n}","var parse = require(\"./parse.js\"),\n    compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","var DomUtils  = require(\"domutils\"),\n    hasAttrib = DomUtils.hasAttrib,\n    getAttributeValue = DomUtils.getAttributeValue,\n    falseFunc = require(\"boolbase\").falseFunc;\n\n//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\n\n/*\n\tattribute selectors\n*/\n\nvar attributeRules = {\n\t__proto__: null,\n\tequals: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function equalsIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function equals(elem){\n\t\t\treturn getAttributeValue(elem, name) === value && next(elem);\n\t\t};\n\t},\n\thyphen: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function hyphenIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null &&\n\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\tattr.substr(0, len).toLowerCase() === value &&\n\t\t\t\t\t\tnext(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function hyphen(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null &&\n\t\t\t\t\tattr.substr(0, len) === value &&\n\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\tnext(elem);\n\t\t};\n\t},\n\telement: function(next, data){\n\t\tvar name = data.name,\n\t\t    value = data.value;\n\n\t\tif(/\\s/.test(value)){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tvalue = value.replace(reChars, \"\\\\$&\");\n\n\t\tvar pattern = \"(?:^|\\\\s)\" + value + \"(?:$|\\\\s)\",\n\t\t    flags = data.ignoreCase ? \"i\" : \"\",\n\t\t    regex = new RegExp(pattern, flags);\n\n\t\treturn function element(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t};\n\t},\n\texists: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function exists(elem){\n\t\t\treturn hasAttrib(elem, name) && next(elem);\n\t\t};\n\t},\n\tstart: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\t\t\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function startIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function start(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(0, len) === value && next(elem);\n\t\t};\n\t},\n\tend: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len   = -value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function endIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function end(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(len) === value && next(elem);\n\t\t};\n\t},\n\tany: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvar regex = new RegExp(value.replace(reChars, \"\\\\$&\"), \"i\");\n\n\t\t\treturn function anyIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function any(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.indexOf(value) >= 0 && next(elem);\n\t\t};\n\t},\n\tnot: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn function notEmpty(elem){\n\t\t\t\treturn !!getAttributeValue(elem, name) && next(elem);\n\t\t\t};\n\t\t} else if(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function notIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() !== value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function not(elem){\n\t\t\treturn getAttributeValue(elem, name) !== value && next(elem);\n\t\t};\n\t}\n};\n\nmodule.exports = {\n\tcompile: function(next, data, options){\n\t\tif(options && options.strict && (\n\t\t\tdata.ignoreCase || data.action === \"not\"\n\t\t)) throw SyntaxError(\"Unsupported attribute selector\");\n\t\treturn attributeRules[data.action](next, data);\n\t},\n\trules: attributeRules\n};\n","/*\n\tpseudo selectors\n\n\t---\n\n\tthey are available in two forms:\n\t* filters called when the selector\n\t  is compiled and return a function\n\t  that needs to return next()\n\t* pseudos get called on execution\n\t  they need to return a boolean\n*/\n\nvar DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getText     = DomUtils.getText,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    hasAttrib   = DomUtils.hasAttrib,\n    getName     = DomUtils.getName,\n    getAttribute= DomUtils.getAttributeValue,\n    getNCheck   = require(\"nth-check\"),\n    checkAttrib = require(\"./attributes.js\").rules.equals,\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc;\n\n//helper methods\nfunction getFirstElement(elems){\n\tfor(var i = 0; elems && i < elems.length; i++){\n\t\tif(isTag(elems[i])) return elems[i];\n\t}\n}\n\nfunction getAttribFunc(name, value){\n\tvar data = {name: name, value: value};\n\treturn function attribFunc(next){\n\t\treturn checkAttrib(next, data);\n\t};\n}\n\nfunction getChildFunc(next){\n\treturn function(elem){\n\t\treturn !!getParent(elem) && next(elem);\n\t};\n}\n\nvar filters = {\n\tcontains: function(next, text){\n\t\treturn function contains(elem){\n\t\t\treturn next(elem) && getText(elem).indexOf(text) >= 0;\n\t\t};\n\t},\n\ticontains: function(next, text){\n\t\tvar itext = text.toLowerCase();\n\t\treturn function icontains(elem){\n\t\t\treturn next(elem) &&\n\t\t\t\tgetText(elem).toLowerCase().indexOf(itext) >= 0;\n\t\t};\n\t},\n\n\t//location specific methods\n\t\"nth-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0, pos = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\n    //TODO determine the actual root element\n    root: function(next){\n        return function(elem){\n            return !getParent(elem) && next(elem);\n        };\n    },\n\n    scope: function(next, rule, options, context){\n        if(!context || context.length === 0){\n            //equivalent to :root\n            return filters.root(next);\n        }\n\n        if(context.length === 1){\n            //NOTE: can't be unpacked, as :has uses this for side-effects\n            return function(elem){\n                return context[0] === elem && next(elem);\n            };\n        }\n\n        return function(elem){\n            return context.indexOf(elem) >= 0 && next(elem);\n        };\n    },\n\n\t//jQuery extensions (others follow as pseudos)\n\tcheckbox: getAttribFunc(\"type\", \"checkbox\"),\n\tfile: getAttribFunc(\"type\", \"file\"),\n\tpassword: getAttribFunc(\"type\", \"password\"),\n\tradio: getAttribFunc(\"type\", \"radio\"),\n\treset: getAttribFunc(\"type\", \"reset\"),\n\timage: getAttribFunc(\"type\", \"image\"),\n\tsubmit: getAttribFunc(\"type\", \"submit\")\n};\n\n//while filters are precompiled, pseudos get called when they are needed\nvar pseudos = {\n\tempty: function(elem){\n\t\treturn !getChildren(elem).some(function(elem){\n\t\t\treturn isTag(elem) || elem.type === \"text\";\n\t\t});\n\t},\n\n\t\"first-child\": function(elem){\n\t\treturn getFirstElement(getSiblings(elem)) === elem;\n\t},\n\t\"last-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\tif(siblings[i] === elem) return true;\n\t\t\tif(isTag(siblings[i])) break;\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"first-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"last-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length-1; i >= 0; i--){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"only-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0, j = siblings.length; i < j; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) continue;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) return false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\t\"only-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i]) && siblings[i] !== elem) return false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t//:matches(a, area, link)[href]\n\tlink: function(elem){\n\t\treturn hasAttrib(elem, \"href\");\n\t},\n\tvisited: falseFunc, //seems to be a valid implementation\n\t//TODO: :any-link once the name is finalized (as an alias of :link)\n\n\t//forms\n\t//to consider: :target\n\n\t//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)\n\tselected: function(elem){\n\t\tif(hasAttrib(elem, \"selected\")) return true;\n\t\telse if(getName(elem) !== \"option\") return false;\n\n\t\t//the first <option> in a <select> is also selected\n\t\tvar parent = getParent(elem);\n\n\t\tif(\n\t\t\t!parent ||\n\t\t\tgetName(parent) !== \"select\" ||\n\t\t\thasAttrib(parent, \"multiple\")\n\t\t) return false;\n\n\t\tvar siblings = getChildren(parent),\n\t\t\tsawElem  = false;\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem){\n\t\t\t\t\tsawElem = true;\n\t\t\t\t} else if(!sawElem){\n\t\t\t\t\treturn false;\n\t\t\t\t} else if(hasAttrib(siblings[i], \"selected\")){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sawElem;\n\t},\n\t//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n\t//:matches(\n\t//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],\n\t//  optgroup[disabled] > option),\n\t// fieldset[disabled] * //TODO not child of first <legend>\n\t//)\n\tdisabled: function(elem){\n\t\treturn hasAttrib(elem, \"disabled\");\n\t},\n\tenabled: function(elem){\n\t\treturn !hasAttrib(elem, \"disabled\");\n\t},\n\t//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)\n\tchecked: function(elem){\n\t\treturn hasAttrib(elem, \"checked\") || pseudos.selected(elem);\n\t},\n\t//:matches(input, select, textarea)[required]\n\trequired: function(elem){\n\t\treturn hasAttrib(elem, \"required\");\n\t},\n\t//:matches(input, select, textarea):not([required])\n\toptional: function(elem){\n\t\treturn !hasAttrib(elem, \"required\");\n\t},\n\n\t//jQuery extensions\n\n\t//:not(:empty)\n\tparent: function(elem){\n\t\treturn !pseudos.empty(elem);\n\t},\n\t//:matches(h1, h2, h3, h4, h5, h6)\n\theader: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"h1\" ||\n\t\t       name === \"h2\" ||\n\t\t       name === \"h3\" ||\n\t\t       name === \"h4\" ||\n\t\t       name === \"h5\" ||\n\t\t       name === \"h6\";\n\t},\n\n\t//:matches(button, input[type=button])\n\tbutton: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"button\" ||\n\t\t       name === \"input\" &&\n\t\t       getAttribute(elem, \"type\") === \"button\";\n\t},\n\t//:matches(input, textarea, select, button)\n\tinput: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"input\" ||\n\t\t       name === \"textarea\" ||\n\t\t       name === \"select\" ||\n\t\t       name === \"button\";\n\t},\n\t//input:matches(:not([type!='']), [type='text' i])\n\ttext: function(elem){\n\t\tvar attr;\n\t\treturn getName(elem) === \"input\" && (\n\t\t\t!(attr = getAttribute(elem, \"type\")) ||\n\t\t\tattr.toLowerCase() === \"text\"\n\t\t);\n\t}\n};\n\nfunction verifyArgs(func, name, subselect){\n\tif(subselect === null){\n\t\tif(func.length > 1 && name !== \"scope\"){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" requires an argument\");\n\t\t}\n\t} else {\n\t\tif(func.length === 1){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" doesn't have any arguments\");\n\t\t}\n\t}\n}\n\n//FIXME this feels hacky\nvar re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;\n\nmodule.exports = {\n\tcompile: function(next, data, options, context){\n\t\tvar name = data.name,\n\t\t\tsubselect = data.data;\n\n\t\tif(options && options.strict && !re_CSS3.test(name)){\n\t\t\tthrow SyntaxError(\":\" + name + \" isn't part of CSS3\");\n\t\t}\n\n\t\tif(typeof filters[name] === \"function\"){\n\t\t\tverifyArgs(filters[name], name,  subselect);\n\t\t\treturn filters[name](next, subselect, options, context);\n\t\t} else if(typeof pseudos[name] === \"function\"){\n\t\t\tvar func = pseudos[name];\n\t\t\tverifyArgs(func, name, subselect);\n\n\t\t\tif(next === trueFunc) return func;\n\n\t\t\treturn function pseudoArgs(elem){\n\t\t\t\treturn func(elem, subselect) && next(elem);\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new SyntaxError(\"unmatched pseudo-class :\" + name);\n\t\t}\n\t},\n\tfilters: filters,\n\tpseudos: pseudos\n};\n","\"use strict\";\n\nmodule.exports = parse;\n\nvar re_name = /^(?:\\\\.|[\\w\\-\\u00b0-\\uFFFF])+/,\n    re_escape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/ig,\n    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87\n    re_attr = /^\\s*((?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])+)\\s*(?:(\\S?)=\\s*(?:(['\"])([^]*?)\\3|(#?(?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])*)|)|)\\s*(i)?\\]/;\n\nvar actionTypes = {\n\t__proto__: null,\n\t\"undefined\": \"exists\",\n\t\"\":  \"equals\",\n\t\"~\": \"element\",\n\t\"^\": \"start\",\n\t\"$\": \"end\",\n\t\"*\": \"any\",\n\t\"!\": \"not\",\n\t\"|\": \"hyphen\"\n};\n\nvar simpleSelectors = {\n\t__proto__: null,\n\t\">\": \"child\",\n\t\"<\": \"parent\",\n\t\"~\": \"sibling\",\n\t\"+\": \"adjacent\"\n};\n\nvar attribSelectors = {\n\t__proto__: null,\n\t\"#\": [\"id\", \"equals\"],\n\t\".\": [\"class\", \"element\"]\n};\n\n//pseudos, whose data-property is parsed as well\nvar unpackPseudos = {\n\t__proto__: null,\n\t\"has\": true,\n\t\"not\": true,\n\t\"matches\": true\n};\n\nvar stripQuotesFromPseudos = {\n\t__proto__: null,\n\t\"contains\": true,\n\t\"icontains\": true\n};\n\nvar quotes = {\n\t__proto__: null,\n\t\"\\\"\": true,\n\t\"'\": true\n};\n\n//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139\nfunction funescape( _, escaped, escapedWhitespace ) {\n\tvar high = \"0x\" + escaped - 0x10000;\n\t// NaN means non-codepoint\n\t// Support: Firefox\n\t// Workaround erroneous numeric interpretation of +\"0x\"\n\treturn high !== high || escapedWhitespace ?\n\t\tescaped :\n\t\t// BMP codepoint\n\t\thigh < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n}\n\nfunction unescapeCSS(str){\n\treturn str.replace(re_escape, funescape);\n}\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n\nfunction parse(selector, options){\n\tvar subselects = [];\n\n\tselector = parseSelector(subselects, selector + \"\", options);\n\n\tif(selector !== \"\"){\n\t\tthrow new SyntaxError(\"Unmatched selector: \" + selector);\n\t}\n\n\treturn subselects;\n}\n\nfunction parseSelector(subselects, selector, options){\n\tvar tokens = [],\n\t\tsawWS = false,\n\t\tdata, firstChar, name, quot;\n\n\tfunction getName(){\n\t\tvar sub = selector.match(re_name)[0];\n\t\tselector = selector.substr(sub.length);\n\t\treturn unescapeCSS(sub);\n\t}\n\n\tfunction stripWhitespace(start){\n\t\twhile(isWhitespace(selector.charAt(start))) start++;\n\t\tselector = selector.substr(start);\n\t}\n\n\tfunction isEscaped(pos) {\n\t\tvar slashCount = 0;\n\n\t\twhile (selector.charAt(--pos) === \"\\\\\") slashCount++;\n\t\treturn (slashCount & 1) === 1;\n\t}\n\n\tstripWhitespace(0);\n\n\twhile(selector !== \"\"){\n\t\tfirstChar = selector.charAt(0);\n\n\t\tif(isWhitespace(firstChar)){\n\t\t\tsawWS = true;\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar in simpleSelectors){\n\t\t\ttokens.push({type: simpleSelectors[firstChar]});\n\t\t\tsawWS = false;\n\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar === \",\"){\n\t\t\tif(tokens.length === 0){\n\t\t\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t\t\t}\n\t\t\tsubselects.push(tokens);\n\t\t\ttokens = [];\n\t\t\tsawWS = false;\n\t\t\tstripWhitespace(1);\n\t\t} else {\n\t\t\tif(sawWS){\n\t\t\t\tif(tokens.length > 0){\n\t\t\t\t\ttokens.push({type: \"descendant\"});\n\t\t\t\t}\n\t\t\t\tsawWS = false;\n\t\t\t}\n\n\t\t\tif(firstChar === \"*\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({type: \"universal\"});\n\t\t\t} else if(firstChar in attribSelectors){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: attribSelectors[firstChar][0],\n\t\t\t\t\taction: attribSelectors[firstChar][1],\n\t\t\t\t\tvalue: getName(),\n\t\t\t\t\tignoreCase: false\n\t\t\t\t});\n\t\t\t} else if(firstChar === \"[\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\tdata = selector.match(re_attr);\n\t\t\t\tif(!data){\n\t\t\t\t\tthrow new SyntaxError(\"Malformed attribute selector: \" + selector);\n\t\t\t\t}\n\t\t\t\tselector = selector.substr(data[0].length);\n\t\t\t\tname = unescapeCSS(data[1]);\n\n\t\t\t\tif(\n\t\t\t\t\t!options || (\n\t\t\t\t\t\t\"lowerCaseAttributeNames\" in options ?\n\t\t\t\t\t\t\toptions.lowerCaseAttributeNames :\n\t\t\t\t\t\t\t!options.xmlMode\n\t\t\t\t\t)\n\t\t\t\t){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: name,\n\t\t\t\t\taction: actionTypes[data[2]],\n\t\t\t\t\tvalue: unescapeCSS(data[4] || data[5] || \"\"),\n\t\t\t\t\tignoreCase: !!data[6]\n\t\t\t\t});\n\n\t\t\t} else if(firstChar === \":\"){\n\t\t\t\tif(selector.charAt(1) === \":\"){\n\t\t\t\t\tselector = selector.substr(2);\n\t\t\t\t\ttokens.push({type: \"pseudo-element\", name: getName().toLowerCase()});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.substr(1);\n\n\t\t\t\tname = getName().toLowerCase();\n\t\t\t\tdata = null;\n\n\t\t\t\tif(selector.charAt(0) === \"(\"){\n\t\t\t\t\tif(name in unpackPseudos){\n\t\t\t\t\t\tquot = selector.charAt(1);\n\t\t\t\t\t\tvar quoted = quot in quotes;\n\n\t\t\t\t\t\tselector = selector.substr(quoted + 1);\n\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tselector = parseSelector(data, selector, options);\n\n\t\t\t\t\t\tif(quoted){\n\t\t\t\t\t\t\tif(selector.charAt(0) !== quot){\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\"unmatched quotes in :\" + name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(selector.charAt(0) !== \")\"){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"missing closing parenthesis in :\" + name + \" \" + selector);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar pos = 1, counter = 1;\n\n\t\t\t\t\t\tfor(; counter > 0 && pos < selector.length; pos++){\n\t\t\t\t\t\t\tif(selector.charAt(pos) === \"(\" && !isEscaped(pos)) counter++;\n\t\t\t\t\t\t\telse if(selector.charAt(pos) === \")\" && !isEscaped(pos)) counter--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"parenthesis not matched\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = selector.substr(1, pos - 2);\n\t\t\t\t\t\tselector = selector.substr(pos);\n\n\t\t\t\t\t\tif(name in stripQuotesFromPseudos){\n\t\t\t\t\t\t\tquot = data.charAt(0);\n\n\t\t\t\t\t\t\tif(quot === data.slice(-1) && quot in quotes){\n\t\t\t\t\t\t\t\tdata = data.slice(1, -1);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdata = unescapeCSS(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"pseudo\", name: name, data: data});\n\t\t\t} else if(re_name.test(selector)){\n\t\t\t\tname = getName();\n\n\t\t\t\tif(!options || (\"lowerCaseTags\" in options ? options.lowerCaseTags : !options.xmlMode)){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"tag\", name: name});\n\t\t\t} else {\n\t\t\t\tif(tokens.length && tokens[tokens.length - 1].type === \"descendant\"){\n\t\t\t\t\ttokens.pop();\n\t\t\t\t}\n\t\t\t\taddToken(subselects, tokens);\n\t\t\t\treturn selector;\n\t\t\t}\n\t\t}\n\t}\n\n\taddToken(subselects, tokens);\n\n\treturn selector;\n}\n\nfunction addToken(subselects, tokens){\n\tif(subselects.length > 0 && tokens.length === 0){\n\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t}\n\n\tsubselects.push(tokens);\n}\n","var DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    getName     = DomUtils.getName;\n\n/*\n\tall available rules\n*/\nmodule.exports = {\n\t__proto__: null,\n\n\tattribute: require(\"./attributes.js\").compile,\n\tpseudo: require(\"./pseudos.js\").compile,\n\n\t//tags\n\ttag: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function tag(elem){\n\t\t\treturn getName(elem) === name && next(elem);\n\t\t};\n\t},\n\n\t//traversal\n\tdescendant: function(next, rule, options, context, acceptSelf){\n\t\treturn function descendant(elem){\n\n\t\t\tif (acceptSelf && next(elem)) return true;\n\n\t\t\tvar found = false;\n\n\t\t\twhile(!found && (elem = getParent(elem))){\n\t\t\t\tfound = next(elem);\n\t\t\t}\n\n\t\t\treturn found;\n\t\t};\n\t},\n\tparent: function(next, data, options){\n\t\tif(options && options.strict) throw SyntaxError(\"Parent selector isn't part of CSS3\");\n\n\t\treturn function parent(elem){\n\t\t\treturn getChildren(elem).some(test);\n\t\t};\n\n\t\tfunction test(elem){\n\t\t\treturn isTag(elem) && next(elem);\n\t\t}\n\t},\n\tchild: function(next){\n\t\treturn function child(elem){\n\t\t\tvar parent = getParent(elem);\n\t\t\treturn !!parent && next(parent);\n\t\t};\n\t},\n\tsibling: function(next){\n\t\treturn function sibling(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(next(siblings[i])) return true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\t},\n\tadjacent: function(next){\n\t\treturn function adjacent(elem){\n\t\t\tvar siblings = getSiblings(elem),\n\t\t\t    lastElement;\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tlastElement = siblings[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !!lastElement && next(lastElement);\n\t\t};\n\t},\n\tuniversal: function(next){\n\t\treturn next;\n\t}\n};","module.exports = sortByProcedure;\n\n/*\n\tsort the parts of the passed selector,\n\tas there is potential for optimization\n\t(some types of selectors are faster than others)\n*/\n\nvar procedure = require(\"./procedure.json\");\n\nvar attributes = {\n\t__proto__: null,\n\texists: 10,\n\tequals: 8,\n\tnot: 7,\n\tstart: 6,\n\tend: 6,\n\tany: 5,\n\thyphen: 4,\n\telement: 4\n};\n\nfunction sortByProcedure(arr){\n\tvar procs = arr.map(getProcedure);\n\tfor(var i = 1; i < arr.length; i++){\n\t\tvar procNew = procs[i];\n\n\t\tif(procNew < 0) continue;\n\n\t\tfor(var j = i - 1; j >= 0 && procNew < procs[j]; j--){\n\t\t\tvar token = arr[j + 1];\n\t\t\tarr[j + 1] = arr[j];\n\t\t\tarr[j] = token;\n\t\t\tprocs[j + 1] = procs[j];\n\t\t\tprocs[j] = procNew;\n\t\t}\n\t}\n}\n\nfunction getProcedure(token){\n\tvar proc = procedure[token.type];\n\n\tif(proc === procedure.attribute){\n\t\tproc = attributes[token.action];\n\n\t\tif(proc === attributes.equals && token.name === \"id\"){\n\t\t\t//prefer ID selectors (eg. #ID)\n\t\t\tproc = 9;\n\t\t}\n\n\t\tif(token.ignoreCase){\n\t\t\t//ignoreCase adds some overhead, prefer \"normal\" token\n\t\t\t//this is a binary operation, to ensure it's still an int\n\t\t\tproc >>= 1;\n\t\t}\n\t} else if(proc === procedure.pseudo){\n\t\tif(!token.data){\n\t\t\tproc = 3;\n\t\t} else if(token.name === \"has\" || token.name === \"contains\"){\n\t\t\tproc = 0; //expensive in any case\n\t\t} else if(token.name === \"matches\" || token.name === \"not\"){\n\t\t\tproc = 0;\n\t\t\tfor(var i = 0; i < token.data.length; i++){\n\t\t\t\t//TODO better handling of complex selectors\n\t\t\t\tif(token.data[i].length !== 1) continue;\n\t\t\t\tvar cur = getProcedure(token.data[i][0]);\n\t\t\t\t//avoid executing :has or :contains\n\t\t\t\tif(cur === 0){\n\t\t\t\t\tproc = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(cur > proc) proc = cur;\n\t\t\t}\n\t\t\tif(token.data.length > 1 && proc > 0) proc -= 1;\n\t\t} else {\n\t\t\tproc = 1;\n\t\t}\n\t}\n\treturn proc;\n}\n","/*\n\tcompiles a selector to an executable function\n*/\n\nmodule.exports = compile;\nmodule.exports.compileUnsafe = compileUnsafe;\nmodule.exports.compileToken = compileToken;\n\nvar parse       = require(\"css-what\"),\n    DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    Rules       = require(\"./general.js\"),\n    sortRules   = require(\"./sort.js\"),\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc,\n    procedure   = require(\"./procedure.json\");\n\nfunction compile(selector, options, context){\n\tvar next = compileUnsafe(selector, options, context);\n\treturn wrap(next);\n}\n\nfunction wrap(next){\n\treturn function base(elem){\n\t\treturn isTag(elem) && next(elem);\n\t};\n}\n\nfunction compileUnsafe(selector, options, context){\n\tvar token = parse(selector, options);\n\treturn compileToken(token, options, context);\n}\n\nfunction includesScopePseudo(t){\n    return t.type === \"pseudo\" && (\n        t.name === \"scope\" || (\n            Array.isArray(t.data) &&\n            t.data.some(function(data){\n                return data.some(includesScopePseudo);\n            })\n        )\n    );\n}\n\nvar DESCENDANT_TOKEN = {type: \"descendant\"},\n    SCOPE_TOKEN = {type: \"pseudo\", name: \"scope\"},\n    PLACEHOLDER_ELEMENT = {},\n    getParent = DomUtils.getParent;\n\n//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n//http://www.w3.org/TR/selectors4/#absolutizing\nfunction absolutize(token, context){\n    //TODO better check if context is document\n    var hasContext = !!context && !!context.length && context.every(function(e){\n        return e === PLACEHOLDER_ELEMENT || !!getParent(e);\n    });\n\n\n    token.forEach(function(t){\n        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== \"descendant\"){\n            //don't return in else branch\n        } else if(hasContext && !includesScopePseudo(t)){\n            t.unshift(DESCENDANT_TOKEN);\n        } else {\n            return;\n        }\n\n        t.unshift(SCOPE_TOKEN);\n    });\n}\n\nfunction compileToken(token, options, context){\n    token = token.filter(function(t){ return t.length > 0; });\n\n\ttoken.forEach(sortRules);\n\n\tvar isArrayContext = Array.isArray(context);\n\n    context = (options && options.context) || context;\n\n    if(context && !isArrayContext) context = [context];\n\n    absolutize(token, context);\n\n\treturn token\n\t\t.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })\n\t\t.reduce(reduceRules, falseFunc);\n}\n\nfunction isTraversal(t){\n\treturn procedure[t.type] < 0;\n}\n\nfunction compileRules(rules, options, context, isArrayContext){\n\tvar acceptSelf = (isArrayContext && rules[0].name === \"scope\" && rules[1].type === \"descendant\");\n\treturn rules.reduce(function(func, rule, index){\n\t\tif(func === falseFunc) return func;\n\t\treturn Rules[rule.type](func, rule, options, context, acceptSelf && index === 1);\n\t}, options && options.rootFunc || trueFunc);\n}\n\nfunction reduceRules(a, b){\n\tif(b === falseFunc || a === trueFunc){\n\t\treturn a;\n\t}\n\tif(a === falseFunc || b === trueFunc){\n\t\treturn b;\n\t}\n\n\treturn function combine(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\n//:not, :has and :matches have to compile selectors\n//doing this in lib/pseudos.js would lead to circular dependencies,\n//so we add them here\n\nvar Pseudos     = require(\"./pseudos.js\"),\n    filters     = Pseudos.filters,\n    existsOne   = DomUtils.existsOne,\n    isTag       = DomUtils.isTag,\n    getChildren = DomUtils.getChildren;\n\n\nfunction containsTraversal(t){\n\treturn t.some(isTraversal);\n}\n\nfilters.not = function(next, token, options, context){\n\tvar opts = {\n\t    \txmlMode: !!(options && options.xmlMode),\n\t    \tstrict: !!(options && options.strict)\n\t    };\n\n\tif(opts.strict){\n\t\tif(token.length > 1 || token.some(containsTraversal)){\n\t\t\tthrow new SyntaxError(\"complex selectors in :not aren't allowed in strict mode\");\n\t\t}\n\t}\n\n    var func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return next;\n\tif(func === trueFunc)  return falseFunc;\n\n\treturn function(elem){\n\t\treturn !func(elem) && next(elem);\n\t};\n};\n\nfilters.has = function(next, token, options){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict)\n\t};\n\n    //FIXME: Uses an array as a pointer to the current element (side effects)\n    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;\n\n\tvar func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return falseFunc;\n\tif(func === trueFunc)  return function(elem){\n\t\t\treturn getChildren(elem).some(isTag) && next(elem);\n\t\t};\n\n\tfunc = wrap(func);\n\n    if(context){\n        return function has(elem){\n\t\treturn next(elem) && (\n                (context[0] = elem), existsOne(func, getChildren(elem))\n            );\n\t};\n    }\n\n    return function has(elem){\n\t\treturn next(elem) && existsOne(func, getChildren(elem));\n\t};\n};\n\nfilters.matches = function(next, token, options, context){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict),\n\t\trootFunc: next\n\t};\n\n\treturn compileToken(token, opts, context);\n};\n","\"use strict\";\n\nmodule.exports = CSSselect;\n\nvar Pseudos       = require(\"./lib/pseudos.js\"),\n    DomUtils      = require(\"domutils\"),\n    findOne       = DomUtils.findOne,\n    findAll       = DomUtils.findAll,\n    getChildren   = DomUtils.getChildren,\n    removeSubsets = DomUtils.removeSubsets,\n    falseFunc     = require(\"boolbase\").falseFunc,\n    compile       = require(\"./lib/compile.js\"),\n    compileUnsafe = compile.compileUnsafe,\n    compileToken  = compile.compileToken;\n\nfunction getSelectorFunc(searchFunc){\n\treturn function select(query, elems, options){\n        if(typeof query !== \"function\") query = compileUnsafe(query, options, elems);\n        if(!Array.isArray(elems)) elems = getChildren(elems);\n\t\telse elems = removeSubsets(elems);\n\t\treturn searchFunc(query, elems);\n\t};\n}\n\nvar selectAll = getSelectorFunc(function selectAll(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? [] : findAll(query, elems);\n});\n\nvar selectOne = getSelectorFunc(function selectOne(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? null : findOne(query, elems);\n});\n\nfunction is(elem, query, options){\n\treturn (typeof query === \"function\" ? query : compile(query, options))(elem);\n}\n\n/*\n\tthe exported interface\n*/\nfunction CSSselect(query, elems, options){\n\treturn selectAll(query, elems, options);\n}\n\nCSSselect.compile = compile;\nCSSselect.filters = Pseudos.filters;\nCSSselect.pseudos = Pseudos.pseudos;\n\nCSSselect.selectAll = selectAll;\nCSSselect.selectOne = selectOne;\n\nCSSselect.is = is;\n\n//legacy methods (might be removed)\nCSSselect.parse = compile;\nCSSselect.iterate = selectAll;\n\n//hooks\nCSSselect._compileUnsafe = compileUnsafe;\nCSSselect._compileToken = compileToken;\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport parse5 from 'parse5';\nimport select from 'css-select';\n\n// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere\nconst treeAdapter = require('parse5-htmlparser2-tree-adapter');\n\nconst PARSE5_OPTS = {\n  treeAdapter\n};\n\n/**\n * Parse HTML into a mutable, serializable DOM Document.\n * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.\n * @param {String} html   HTML to parse into a Document instance\n */\nexport function createDocument(html) {\n  const document = parse5.parse(html, PARSE5_OPTS);\n\n  defineProperties(document, DocumentExtensions);\n\n  // Extend Element.prototype with DOM manipulation methods.\n  const scratch = document.createElement('div');\n  // Get a reference to the base Node class - used by createTextNode()\n  document.$$Node = scratch.constructor;\n  const elementProto = Object.getPrototypeOf(scratch);\n  defineProperties(elementProto, ElementExtensions);\n  elementProto.ownerDocument = document;\n\n  return document;\n}\n\n/**\n * Serialize a Document to an HTML String\n * @param {Document} document   A Document, such as one created via `createDocument()`\n */\nexport function serializeDocument(document) {\n  return parse5.serialize(document, PARSE5_OPTS);\n}\n\n/**\n * Methods and descriptors to mix into Element.prototype\n */\nconst ElementExtensions = {\n  /** @extends htmlparser2.Element.prototype */\n\n  nodeName: {\n    get() {\n      return this.tagName.toUpperCase();\n    }\n  },\n\n  id: reflectedProperty('id'),\n\n  className: reflectedProperty('class'),\n\n  insertBefore(child, referenceNode) {\n    if (!referenceNode) return this.appendChild(child);\n    treeAdapter.insertBefore(this, child, referenceNode);\n    return child;\n  },\n\n  appendChild(child) {\n    treeAdapter.appendChild(this, child);\n    return child;\n  },\n\n  removeChild(child) {\n    treeAdapter.detachNode(child);\n  },\n\n  remove() {\n    treeAdapter.detachNode(this);\n  },\n\n  textContent: {\n    get() {\n      return getText(this);\n    },\n\n    set(text) {\n      this.children = [];\n      treeAdapter.insertText(this, text);\n    }\n  },\n\n  setAttribute(name, value) {\n    if (this.attribs == null) this.attribs = {};\n    if (value == null) value = '';\n    this.attribs[name] = value;\n  },\n\n  removeAttribute(name) {\n    if (this.attribs != null) {\n      delete this.attribs[name];\n    }\n  },\n\n  getAttribute(name) {\n    return this.attribs != null && this.attribs[name];\n  },\n\n  hasAttribute(name) {\n    return this.attribs != null && this.attribs[name] != null;\n  },\n\n  getAttributeNode(name) {\n    const value = this.getAttribute(name);\n    if (value != null) return { specified: true, value };\n  }\n};\n\n/**\n * Methods and descriptors to mix into the global document instance\n * @private\n */\nconst DocumentExtensions = {\n  /** @extends htmlparser2.Document.prototype */\n\n  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.\n  // TODO: verify if these are needed for css-select\n  nodeType: {\n    get() {\n      return 9;\n    }\n  },\n\n  contentType: {\n    get() {\n      return 'text/html';\n    }\n  },\n\n  nodeName: {\n    get() {\n      return '#document';\n    }\n  },\n\n  documentElement: {\n    get() {\n      // Find the first <html> element within the document\n      return this.childNodes.filter(\n        (child) => String(child.tagName).toLowerCase() === 'html'\n      );\n    }\n  },\n\n  compatMode: {\n    get() {\n      const compatMode = {\n        'no-quirks': 'CSS1Compat',\n        quirks: 'BackCompat',\n        'limited-quirks': 'CSS1Compat'\n      };\n      return compatMode[treeAdapter.getDocumentMode(this)];\n    }\n  },\n\n  body: {\n    get() {\n      return this.querySelector('body');\n    }\n  },\n\n  createElement(name) {\n    return treeAdapter.createElement(name, null, []);\n  },\n\n  createTextNode(text) {\n    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM\n    const Node = this.$$Node;\n    return new Node({\n      type: 'text',\n      data: text,\n      parent: null,\n      prev: null,\n      next: null\n    });\n  },\n\n  querySelector(sel) {\n    return select.selectOne(sel, this.documentElement);\n  },\n\n  querySelectorAll(sel) {\n    if (sel === ':root') {\n      return this;\n    }\n    return select(sel, this.documentElement);\n  }\n};\n\n/**\n * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.\n * @private\n */\nfunction defineProperties(obj, properties) {\n  for (const i in properties) {\n    const value = properties[i];\n    Object.defineProperty(\n      obj,\n      i,\n      typeof value === 'function' ? { value } : value\n    );\n  }\n}\n\n/**\n * Create a property descriptor defining a getter/setter pair alias for a named attribute.\n * @private\n */\nfunction reflectedProperty(attributeName) {\n  return {\n    get() {\n      return this.getAttribute(attributeName);\n    },\n    set(value) {\n      this.setAttribute(attributeName, value);\n    }\n  };\n}\n\n/**\n * Helper to get the text content of a node\n * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21\n * @private\n */\nfunction getText(node) {\n  if (Array.isArray(node)) return node.map(getText).join('');\n  if (treeAdapter.isElementNode(node))\n    return node.name === 'br' ? '\\n' : getText(node.children);\n  if (treeAdapter.isTextNode(node)) return node.data;\n  return '';\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport css from 'css';\n\n/**\n * Parse a textual CSS Stylesheet into a Stylesheet instance.\n * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.\n * @see https://github.com/reworkcss/css\n * @private\n * @param {String} stylesheet\n * @returns {css.Stylesheet} ast\n */\nexport function parseStylesheet (stylesheet) {\n  return css.parse(stylesheet);\n}\n\n/**\n * Serialize a ReworkCSS Stylesheet to a String of CSS.\n * @private\n * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`\n * @param {Object} options              Options to pass to `css.stringify()`\n * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)\n */\nexport function serializeStylesheet (ast, options) {\n  return css.stringify(ast, options);\n}\n\n/**\n * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.\n * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).\n * @private\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n * @returns {(rule) => void} nonDestructiveIterator\n */\nexport function markOnly (predicate) {\n  return rule => {\n    const sel = rule.selectors;\n    if (predicate(rule) === false) {\n      rule.$$remove = true;\n    }\n    rule.$$markedSelectors = rule.selectors;\n    if (rule._other) {\n      rule._other.$$markedSelectors = rule._other.selectors;\n    }\n    rule.selectors = sel;\n  };\n}\n\n/**\n * Apply filtered selectors to a rule from a previous markOnly run.\n * @private\n * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).\n*/\nexport function applyMarkedSelectors (rule) {\n  if (rule.$$markedSelectors) {\n    rule.selectors = rule.$$markedSelectors;\n  }\n  if (rule._other) {\n    applyMarkedSelectors(rule._other);\n  }\n}\n\n/**\n * Recursively walk all rules in a stylesheet.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n */\nexport function walkStyleRules (node, iterator) {\n  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);\n\n  node.rules = node.rules.filter(rule => {\n    if (rule.rules) {\n      walkStyleRules(rule, iterator);\n    }\n    rule._other = undefined;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n/**\n * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {css.Rule} node2      A second tree identical to `node`\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.\n */\nexport function walkStyleRulesWithReverseMirror (node, node2, iterator) {\n  if (node2 === null) return walkStyleRules(node, iterator);\n\n  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);\n\n  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {\n    const rule2 = rules2[index];\n    if (rule.rules) {\n      walkStyleRulesWithReverseMirror(rule, rule2, iterator);\n    }\n    rule._other = rule2;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n// Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.\n// This is just a quicker version of generating the compliment of the set returned from a filter operation.\nfunction splitFilter (a, b, predicate) {\n  const aOut = [];\n  const bOut = [];\n  for (let index = 0; index < a.length; index++) {\n    if (predicate(a[index], index, a, b)) {\n      aOut.push(a[index]);\n    } else {\n      bOut.push(a[index]);\n    }\n  }\n  return [aOut, bOut];\n}\n\n// can be invoked on a style rule to subset its selectors (with reverse mirroring)\nfunction filterSelectors (predicate) {\n  if (this._other) {\n    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);\n    this.selectors = a;\n    this._other.selectors = b;\n  } else {\n    this.selectors = this.selectors.filter(predicate);\n  }\n}\n","import chalk from 'chalk';\n\nconst LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];\n\nexport const defaultLogger = {\n  trace(msg) {\n    console.trace(msg);\n  },\n\n  debug(msg) {\n    console.debug(msg);\n  },\n\n  warn(msg) {\n    console.warn(chalk.yellow(msg));\n  },\n\n  error(msg) {\n    console.error(chalk.bold.red(msg));\n  },\n\n  info(msg) {\n    console.info(chalk.bold.blue(msg));\n  },\n\n  silent() {}\n};\n\nexport function createLogger(logLevel) {\n  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);\n\n  return LOG_LEVELS.reduce((logger, type, index) => {\n    if (index >= logLevelIdx) {\n      logger[type] = defaultLogger[type];\n    } else {\n      logger[type] = defaultLogger.silent;\n    }\n    return logger;\n  }, {});\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { createDocument, serializeDocument } from './dom';\nimport {\n  parseStylesheet,\n  serializeStylesheet,\n  walkStyleRules,\n  walkStyleRulesWithReverseMirror,\n  markOnly,\n  applyMarkedSelectors\n} from './css';\nimport { createLogger } from './util';\n\n/**\n * The mechanism to use for lazy-loading stylesheets.\n * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).\n *\n * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.\n * - **\"body\":** Move all external stylesheet links to the end of the document.\n * - **\"media\":** Load stylesheets asynchronously by adding `media=\"not x\"` and removing once loaded. <kbd>JS</kbd>\n * - **\"swap\":** Convert stylesheet links to preloads that swap to `rel=\"stylesheet\"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>\n * - **\"swap-high\":** Use `<link rel=\"alternate stylesheet preload\">` and swap to `rel=\"stylesheet\"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>\n * - **\"js\":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>\n * - **\"js-lazy\":** Like `\"js\"`, but the stylesheet is disabled until fully loaded.\n * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy\n * @public\n */\n\n/**\n * Controls which keyframes rules are inlined.\n *\n * - **\"critical\":** _(default)_ inline keyframes rules that are used by the critical CSS.\n * - **\"all\":** Inline all keyframes rules.\n * - **\"none\":** Remove all keyframes rules.\n * @typedef {('critical'|'all'|'none')} KeyframeStrategy\n * @private\n * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_\n */\n\n/**\n * Controls log level of the plugin. Specifies the level the logger should use. A logger will\n * not produce output for any log level beneath the specified level. Available levels and order\n * are:\n *\n * - **\"info\"** _(default)_\n * - **\"warn\"**\n * - **\"error\"**\n * - **\"trace\"**\n * - **\"debug\"**\n * - **\"silent\"**\n * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel\n * @public\n */\n\n/**\n * Custom logger interface:\n * @typedef {object} Logger\n * @public\n * @property {function(String)} trace - Prints a trace message\n * @property {function(String)} debug - Prints a debug message\n * @property {function(String)} info - Prints an information message\n * @property {function(String)} warn - Prints a warning message\n * @property {function(String)} error - Prints an error message\n */\n\n/**\n * All optional. Pass them to `new Critters({ ... })`.\n * @public\n * @typedef Options\n * @property {String} path     Base path location of the CSS files _(default: `''`)_\n * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_\n * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_\n * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_\n * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_\n * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_\n * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_\n * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.\n * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use\n * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies\n * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_\n * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_\n * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`\n *  - Values:\n *  - `true` to inline critical font-face rules and preload the fonts\n *  - `false` to don't inline any font-face rules and don't preload fonts\n * @property {String} keyframes     Controls which keyframes rules are inlined.\n *  - Values:\n *  - `\"critical\"`: _(default)_ inline keyframes rules used by the critical CSS\n *  - `\"all\"` inline all keyframes rules\n *  - `\"none\"` remove all keyframes rules\n * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_\n * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `\"info\"`)_\n * @property {object} logger        Provide a custom logger interface {@link Logger logger}\n */\n\nexport default class Critters {\n  /** @private */\n  constructor(options) {\n    this.options = Object.assign(\n      {\n        logLevel: 'info',\n        path: '',\n        publicPath: '',\n        reduceInlineStyles: true,\n        pruneSource: false,\n        additionalStylesheets: []\n      },\n      options || {}\n    );\n\n    this.urlFilter = this.options.filter;\n    if (this.urlFilter instanceof RegExp) {\n      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);\n    }\n\n    this.logger = this.options.logger || createLogger(this.options.logLevel);\n  }\n\n  /**\n   * Read the contents of a file from the specified filesystem or disk\n   */\n  readFile(filename) {\n    const fs = this.fs;\n    return new Promise((resolve, reject) => {\n      const callback = (err, data) => {\n        if (err) reject(err);\n        else resolve(data);\n      };\n      if (fs && fs.readFile) {\n        fs.readFile(filename, callback);\n      } else {\n        require('fs').readFile(filename, 'utf8', callback);\n      }\n    });\n  }\n\n  /**\n   * Apply critical CSS processing to the html\n   */\n  async process(html) {\n    const start = process.hrtime.bigint();\n\n    // Parse the generated HTML in a DOM we can mutate\n    const document = createDocument(html);\n\n    if (this.options.additionalStylesheets.length > 0) {\n      this.embedAdditionalStylesheet(document);\n    }\n\n    // `external:false` skips processing of external sheets\n    if (this.options.external !== false) {\n      const externalSheets = [].slice.call(\n        document.querySelectorAll('link[rel=\"stylesheet\"]')\n      );\n\n      await Promise.all(\n        externalSheets.map((link) => this.embedLinkedStylesheet(link, document))\n      );\n    }\n\n    // go through all the style tags in the document and reduce them to only critical CSS\n    const styles = this.getAffectedStyleTags(document);\n\n    await Promise.all(\n      styles.map((style) => this.processStyle(style, document))\n    );\n\n    if (this.options.mergeStylesheets !== false && styles.length !== 0) {\n      await this.mergeStylesheets(document);\n    }\n\n    // serialize the document back to HTML and we're done\n    const output = serializeDocument(document);\n    const end = process.hrtime.bigint();\n    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);\n    return output;\n  }\n\n  /**\n   * Get the style tags that need processing\n   */\n  getAffectedStyleTags(document) {\n    const styles = [].slice.call(document.querySelectorAll('style'));\n\n    // `inline:false` skips processing of inline stylesheets\n    if (this.options.reduceInlineStyles === false) {\n      return styles.filter((style) => style.$$external);\n    }\n    return styles;\n  }\n\n  async mergeStylesheets(document) {\n    const styles = this.getAffectedStyleTags(document);\n    if (styles.length === 0) {\n      this.logger.warn(\n        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'\n      );\n      return;\n    }\n    const first = styles[0];\n    let sheet = first.textContent;\n\n    for (let i = 1; i < styles.length; i++) {\n      const node = styles[i];\n      sheet += node.textContent;\n      node.remove();\n    }\n\n    first.textContent = sheet;\n  }\n\n  /**\n   * Given href, find the corresponding CSS asset\n   */\n  async getCssAsset(href) {\n    const outputPath = this.options.path;\n    const publicPath = this.options.publicPath;\n\n    // CHECK - the output path\n    // path on disk (with output.publicPath removed)\n    let normalizedPath = href.replace(/^\\//, '');\n    const pathPrefix = (publicPath || '').replace(/(^\\/|\\/$)/g, '') + '/';\n    if (normalizedPath.indexOf(pathPrefix) === 0) {\n      normalizedPath = normalizedPath\n        .substring(pathPrefix.length)\n        .replace(/^\\//, '');\n    }\n    const filename = path.resolve(outputPath, normalizedPath);\n\n    let sheet;\n\n    try {\n      sheet = await this.readFile(filename);\n    } catch (e) {\n      this.logger.warn(`Unable to locate stylesheet: ${filename}`);\n    }\n\n    return sheet;\n  }\n\n  checkInlineThreshold(link, style, sheet) {\n    if (\n      this.options.inlineThreshold &&\n      sheet.length < this.options.inlineThreshold\n    ) {\n      const href = style.$$name;\n      style.$$reduce = false;\n      this.logger.info(\n        `\\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\\u001b[39m`\n      );\n      link.remove();\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)\n   */\n  async embedAdditionalStylesheet(document) {\n    const styleSheetsIncluded = [];\n\n    const sources = await Promise.all(\n      this.options.additionalStylesheets.map((cssFile) => {\n        if (styleSheetsIncluded.includes(cssFile)) {\n          return;\n        }\n        styleSheetsIncluded.push(cssFile);\n        const style = document.createElement('style');\n        style.$$external = true;\n        return this.getCssAsset(cssFile, style).then((sheet) => [sheet, style]);\n      })\n    );\n\n    sources.forEach(([sheet, style]) => {\n      if (!sheet) return;\n      style.textContent = sheet;\n      document.head.appendChild(style);\n    });\n  }\n\n  /**\n   * Inline the target stylesheet referred to by a <link rel=\"stylesheet\"> (assuming it passes `options.filter`)\n   */\n  async embedLinkedStylesheet(link, document) {\n    const href = link.getAttribute('href');\n    const media = link.getAttribute('media');\n\n    const preloadMode = this.options.preload;\n\n    // skip filtered resources, or network resources if no filter is provided\n    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\\.css$/)) {\n      return Promise.resolve();\n    }\n\n    // the reduced critical CSS gets injected into a new <style> tag\n    const style = document.createElement('style');\n    style.$$external = true;\n    const sheet = await this.getCssAsset(href, style);\n\n    if (!sheet) {\n      return;\n    }\n\n    style.textContent = sheet;\n    style.$$name = href;\n    style.$$links = [link];\n    link.parentNode.insertBefore(style, link);\n\n    if (this.checkInlineThreshold(link, style, sheet)) {\n      return;\n    }\n\n    // CSS loader is only injected for the first sheet, then this becomes an empty string\n    let cssLoaderPreamble =\n      \"function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}\";\n    const lazy = preloadMode === 'js-lazy';\n    if (lazy) {\n      cssLoaderPreamble = cssLoaderPreamble.replace(\n        'l.href',\n        \"l.media='print';l.onload=function(){l.media=m};l.href\"\n      );\n    }\n\n    // Allow disabling any mutation of the stylesheet link:\n    if (preloadMode === false) return;\n\n    let noscriptFallback = false;\n\n    if (preloadMode === 'body') {\n      document.body.appendChild(link);\n    } else {\n      link.setAttribute('rel', 'preload');\n      link.setAttribute('as', 'style');\n      if (preloadMode === 'js' || preloadMode === 'js-lazy') {\n        const script = document.createElement('script');\n        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${\n          lazy ? ',' + JSON.stringify(media || 'all') : ''\n        })`;\n        // script.appendChild(document.createTextNode(js));\n        script.textContent = js;\n        link.parentNode.insertBefore(script, link.nextSibling);\n        style.$$links.push(script);\n        cssLoaderPreamble = '';\n        noscriptFallback = true;\n      } else if (preloadMode === 'media') {\n        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26\n        link.setAttribute('rel', 'stylesheet');\n        link.removeAttribute('as');\n        link.setAttribute('media', 'print');\n        link.setAttribute('onload', `this.media='${media || 'all'}'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap-high') {\n        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html\n        link.setAttribute('rel', 'alternate stylesheet preload');\n        link.setAttribute('title', 'styles');\n        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap') {\n        link.setAttribute('onload', \"this.rel='stylesheet'\");\n        noscriptFallback = true;\n      } else {\n        const bodyLink = document.createElement('link');\n        bodyLink.setAttribute('rel', 'stylesheet');\n        if (media) bodyLink.setAttribute('media', media);\n        bodyLink.setAttribute('href', href);\n        document.body.appendChild(bodyLink);\n        style.$$links.push(bodyLink);\n      }\n    }\n\n    if (this.options.noscriptFallback !== false && noscriptFallback) {\n      const noscript = document.createElement('noscript');\n      const noscriptLink = document.createElement('link');\n      noscriptLink.setAttribute('rel', 'stylesheet');\n      noscriptLink.setAttribute('href', href);\n      if (media) noscriptLink.setAttribute('media', media);\n      noscript.appendChild(noscriptLink);\n      link.parentNode.insertBefore(noscript, link.nextSibling);\n      style.$$links.push(noscript);\n    }\n  }\n\n  /**\n   * Prune the source CSS files\n   */\n  pruneSource(style, before, sheetInverse) {\n    // if external stylesheet would be below minimum size, just inline everything\n    const minSize = this.options.minimumExternalSize;\n    const name = style.$$name;\n    if (minSize && sheetInverse.length < minSize) {\n      this.logger.info(\n        `\\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\\u001b[39m`\n      );\n      style.textContent = before;\n      // remove any associated external resources/loaders:\n      if (style.$$links) {\n        for (const link of style.$$links) {\n          const parent = link.parentNode;\n          if (parent) parent.removeChild(link);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.\n   */\n  async processStyle(style, document) {\n    if (style.$$reduce === false) return;\n\n    const name = style.$$name ? style.$$name.replace(/^\\//, '') : 'inline CSS';\n    const options = this.options;\n    // const document = style.ownerDocument;\n    const head = document.querySelector('head');\n    let keyframesMode = options.keyframes || 'critical';\n    // we also accept a boolean value for options.keyframes\n    if (keyframesMode === true) keyframesMode = 'all';\n    if (keyframesMode === false) keyframesMode = 'none';\n\n    let sheet = style.textContent;\n\n    // store a reference to the previous serialized stylesheet for reporting stats\n    const before = sheet;\n\n    // Skip empty stylesheets\n    if (!sheet) return;\n\n    const ast = parseStylesheet(sheet);\n    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;\n\n    // a string to search for font names (very loose)\n    let criticalFonts = '';\n\n    const failedSelectors = [];\n\n    const criticalKeyframeNames = [];\n\n    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.\n    // This first pass is also used to collect font and keyframe usage used in the second pass.\n    walkStyleRules(\n      ast,\n      markOnly((rule) => {\n        if (rule.type === 'rule') {\n          // Filter the selector list down to only those match\n          rule.filterSelectors((sel) => {\n            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.\n            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.\n            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {\n              return true;\n            }\n            sel = sel\n              .replace(/(?<!\\\\)::?[a-z-]+(?![a-z-(])/gi, '')\n              .replace(/::?not\\(\\s*\\)/g, '')\n              .trim();\n            if (!sel) return false;\n\n            try {\n              return document.querySelector(sel) != null;\n            } catch (e) {\n              failedSelectors.push(sel + ' -> ' + e.message);\n              return false;\n            }\n          });\n          // If there are no matched selectors, remove the rule:\n          if (rule.selectors.length === 0) {\n            return false;\n          }\n\n          if (rule.declarations) {\n            for (let i = 0; i < rule.declarations.length; i++) {\n              const decl = rule.declarations[i];\n\n              // detect used fonts\n              if (decl.property && decl.property.match(/\\bfont(-family)?\\b/i)) {\n                criticalFonts += ' ' + decl.value;\n              }\n\n              // detect used keyframes\n              if (\n                decl.property === 'animation' ||\n                decl.property === 'animation-name'\n              ) {\n                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.\n                const names = decl.value.split(/\\s+/);\n                for (let j = 0; j < names.length; j++) {\n                  const name = names[j].trim();\n                  if (name) criticalKeyframeNames.push(name);\n                }\n              }\n            }\n          }\n        }\n\n        // keep font rules, they're handled in the second pass:\n        if (rule.type === 'font-face') return;\n\n        // If there are no remaining rules, remove the whole rule:\n        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);\n        return !rules || rules.length !== 0;\n      })\n    );\n\n    if (failedSelectors.length !== 0) {\n      this.logger.warn(\n        `${\n          failedSelectors.length\n        } rules skipped due to selector errors:\\n  ${failedSelectors.join(\n          '\\n  '\n        )}`\n      );\n    }\n\n    const shouldPreloadFonts =\n      options.fonts === true || options.preloadFonts === true;\n    const shouldInlineFonts =\n      options.fonts !== false && options.inlineFonts === true;\n\n    const preloadedFonts = [];\n    // Second pass, using data picked up from the first\n    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {\n      // remove any rules marked in the first pass\n      if (rule.$$remove === true) return false;\n\n      applyMarkedSelectors(rule);\n\n      // prune @keyframes rules\n      if (rule.type === 'keyframes') {\n        if (keyframesMode === 'none') return false;\n        if (keyframesMode === 'all') return true;\n        return criticalKeyframeNames.indexOf(rule.name) !== -1;\n      }\n\n      // prune @font-face rules\n      if (rule.type === 'font-face') {\n        let family, src;\n        for (let i = 0; i < rule.declarations.length; i++) {\n          const decl = rule.declarations[i];\n          if (decl.property === 'src') {\n            // @todo parse this properly and generate multiple preloads with type=\"font/woff2\" etc\n            src = (decl.value.match(/url\\s*\\(\\s*(['\"]?)(.+?)\\1\\s*\\)/) || [])[2];\n          } else if (decl.property === 'font-family') {\n            family = decl.value;\n          }\n        }\n\n        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {\n          preloadedFonts.push(src);\n          const preload = document.createElement('link');\n          preload.setAttribute('rel', 'preload');\n          preload.setAttribute('as', 'font');\n          preload.setAttribute('crossorigin', 'anonymous');\n          preload.setAttribute('href', src.trim());\n          head.appendChild(preload);\n        }\n\n        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:\n        if (\n          !family ||\n          !src ||\n          criticalFonts.indexOf(family) === -1 ||\n          !shouldInlineFonts\n        ) {\n          return false;\n        }\n      }\n    });\n\n    sheet = serializeStylesheet(ast, {\n      compress: this.options.compress !== false\n    }).trim();\n\n    // If all rules were removed, get rid of the style element entirely\n    if (sheet.trim().length === 0) {\n      if (style.parentNode) {\n        style.remove();\n      }\n      return;\n    }\n\n    let afterText = '';\n    let styleInlinedCompletely = false;\n    if (options.pruneSource) {\n      const sheetInverse = serializeStylesheet(astInverse, {\n        compress: this.options.compress !== false\n      });\n\n      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);\n\n      if (styleInlinedCompletely) {\n        const percent = (sheetInverse.length / before.length) * 100;\n        afterText = `, reducing non-inlined size ${\n          percent | 0\n        }% to ${prettyBytes(sheetInverse.length)}`;\n      }\n    }\n\n    // replace the inline stylesheet with its critical'd counterpart\n    if (!styleInlinedCompletely) {\n      style.textContent = sheet;\n    }\n\n    // output stats\n    const percent = ((sheet.length / before.length) * 100) | 0;\n    this.logger.info(\n      '\\u001b[32mInlined ' +\n        prettyBytes(sheet.length) +\n        ' (' +\n        percent +\n        '% of original ' +\n        prettyBytes(before.length) +\n        ') of ' +\n        name +\n        afterText +\n        '.\\u001b[39m'\n    );\n  }\n}\n"],"names":["this","require$$0","require$$1","require$$2","require$$3","decode_1","encode","encode_1","foreignNames","entities","ElementType","getOuterHTML","isTag","require$$4","require$$5","BaseFuncs","compile","parse","DomUtils","falseFunc","getText","hasAttrib","trueFunc","getNCheck","getParent","getChildren","getSiblings","getName","attributes","procedure","sortRules","Rules","filters","Pseudos","existsOne","findOne","findAll","compileUnsafe","compileToken","treeAdapter","require","PARSE5_OPTS","createDocument","html","document","parse5","defineProperties","DocumentExtensions","scratch","createElement","$$Node","constructor","elementProto","Object","getPrototypeOf","ElementExtensions","ownerDocument","serializeDocument","serialize","nodeName","get","tagName","toUpperCase","id","reflectedProperty","className","insertBefore","child","referenceNode","appendChild","removeChild","detachNode","remove","textContent","set","text","children","insertText","setAttribute","name","value","attribs","removeAttribute","getAttribute","hasAttribute","getAttributeNode","specified","nodeType","contentType","documentElement","childNodes","filter","String","toLowerCase","compatMode","quirks","getDocumentMode","body","querySelector","createTextNode","Node","type","data","parent","prev","next","sel","select","selectOne","querySelectorAll","obj","properties","i","defineProperty","attributeName","node","Array","isArray","map","join","isElementNode","isTextNode","parseStylesheet","stylesheet","css","serializeStylesheet","ast","options","stringify","markOnly","predicate","rule","selectors","$$remove","$$markedSelectors","_other","applyMarkedSelectors","walkStyleRules","iterator","rules","undefined","filterSelectors","walkStyleRulesWithReverseMirror","node2","splitFilter","index","rules2","rule2","a","b","aOut","bOut","length","push","LOG_LEVELS","defaultLogger","trace","msg","console","debug","warn","chalk","yellow","error","bold","red","info","blue","silent","createLogger","logLevel","logLevelIdx","indexOf","reduce","logger","Critters","assign","path","publicPath","reduceInlineStyles","pruneSource","additionalStylesheets","urlFilter","RegExp","test","bind","readFile","filename","fs","Promise","resolve","reject","callback","err","process","start","hrtime","bigint","embedAdditionalStylesheet","external","externalSheets","slice","call","all","link","embedLinkedStylesheet","styles","getAffectedStyleTags","style","processStyle","mergeStylesheets","output","end","parseFloat","$$external","first","sheet","getCssAsset","href","outputPath","normalizedPath","replace","pathPrefix","substring","e","checkInlineThreshold","inlineThreshold","$$name","$$reduce","styleSheetsIncluded","sources","cssFile","includes","then","forEach","head","media","preloadMode","preload","match","$$links","parentNode","cssLoaderPreamble","lazy","noscriptFallback","script","js","JSON","nextSibling","bodyLink","noscript","noscriptLink","before","sheetInverse","minSize","minimumExternalSize","keyframesMode","keyframes","astInverse","criticalFonts","failedSelectors","criticalKeyframeNames","trim","message","declarations","decl","property","names","split","j","shouldPreloadFonts","fonts","preloadFonts","shouldInlineFonts","inlineFonts","preloadedFonts","family","src","compress","afterText","styleInlinedCompletely","percent","prettyBytes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,kBAAc,GAAG;AACjB,CAAC,IAAI,EAAE,MAAM;AACb,CAAC,SAAS,EAAE,WAAW;AACvB,CAAC,OAAO,EAAE,SAAS;AACnB,CAAC,MAAM,EAAE,QAAQ;AACjB,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,GAAG,EAAE,KAAK;AACX,CAAC,KAAK,EAAE,OAAO;AACf,CAAC,OAAO,EAAE,SAAS;AACnB;AACA,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;AACtB,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAChF,EAAE;AACF,CAAC;;;ACdD,AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,CAAC,IAAI,EAAE;AACrB,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,KAAK;AAC/B,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ;AAC9B,QAAQ,IAAI,CAAC,IAAI,KAAK,OAAO,cAAc;AAC3C,CAAC;AACD,aAAa,GAAG,KAAK,CAAC;AACtB;AACA,YAAY,GAAG,MAAM,YAAY;AACjC,iBAAiB,GAAG,WAAW,iBAAiB;AAChD,eAAe,GAAG,SAAS,eAAe;AAC1C,cAAc,GAAG,QAAQ,cAAc;AACvC,aAAa,GAAG,OAAO,aAAa;AACpC,WAAW,GAAG,KAAK,WAAW;AAC9B,aAAa,GAAG,OAAO,aAAa;AACpC,eAAe,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
Index: trip-planner-front/node_modules/critters/dist/critters.umd.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.umd.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,10295 +1,0 @@
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('path'), require('pretty-bytes'), require('parse5'), require('css'), require('chalk')) :
-	typeof define === 'function' && define.amd ? define(['path', 'pretty-bytes', 'parse5', 'css', 'chalk'], factory) :
-	(global = global || self, global.critters = factory(global.path, global.prettyBytes, global.parse5, global.css, global.chalk));
-}(this, (function (path, prettyBytes, parse5, css, chalk) {
-	path = path && Object.prototype.hasOwnProperty.call(path, 'default') ? path['default'] : path;
-	prettyBytes = prettyBytes && Object.prototype.hasOwnProperty.call(prettyBytes, 'default') ? prettyBytes['default'] : prettyBytes;
-	parse5 = parse5 && Object.prototype.hasOwnProperty.call(parse5, 'default') ? parse5['default'] : parse5;
-	css = css && Object.prototype.hasOwnProperty.call(css, 'default') ? css['default'] : css;
-	chalk = chalk && Object.prototype.hasOwnProperty.call(chalk, 'default') ? chalk['default'] : chalk;
-
-	var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-	function createCommonjsModule(fn, basedir, module) {
-		return module = {
-		  path: basedir,
-		  exports: {},
-		  require: function (path, base) {
-	      return commonjsRequire();
-	    }
-		}, fn(module, module.exports), module.exports;
-	}
-
-	function getCjsExportFromNamespace (n) {
-		return n && n['default'] || n;
-	}
-
-	function commonjsRequire () {
-		throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
-	}
-
-	//Types of elements found in the DOM
-	var domelementtype = {
-		Text: "text", //Text
-		Directive: "directive", //<? ... ?>
-		Comment: "comment", //<!-- ... -->
-		Script: "script", //<script> tags
-		Style: "style", //<style> tags
-		Tag: "tag", //Any tag
-		CDATA: "cdata", //<![CDATA[ ... ]]>
-		Doctype: "doctype",
-
-		isTag: function(elem){
-			return elem.type === "tag" || elem.type === "script" || elem.type === "style";
-		}
-	};
-
-	var lib = createCommonjsModule(function (module, exports) {
-	Object.defineProperty(exports, "__esModule", { value: true });
-	/**
-	 * Tests whether an element is a tag or not.
-	 *
-	 * @param elem Element to test
-	 */
-	function isTag(elem) {
-	    return (elem.type === "tag" /* Tag */ ||
-	        elem.type === "script" /* Script */ ||
-	        elem.type === "style" /* Style */);
-	}
-	exports.isTag = isTag;
-	// Exports for backwards compatibility
-	exports.Text = "text" /* Text */; //Text
-	exports.Directive = "directive" /* Directive */; //<? ... ?>
-	exports.Comment = "comment" /* Comment */; //<!-- ... -->
-	exports.Script = "script" /* Script */; //<script> tags
-	exports.Style = "style" /* Style */; //<style> tags
-	exports.Tag = "tag" /* Tag */; //Any tag
-	exports.CDATA = "cdata" /* CDATA */; //<![CDATA[ ... ]]>
-	exports.Doctype = "doctype" /* Doctype */;
-	});
-
-	var Aacute = "Á";
-	var aacute = "á";
-	var Abreve = "Ă";
-	var abreve = "ă";
-	var ac = "∾";
-	var acd = "∿";
-	var acE = "∾̳";
-	var Acirc = "Â";
-	var acirc = "â";
-	var acute = "´";
-	var Acy = "А";
-	var acy = "а";
-	var AElig = "Æ";
-	var aelig = "æ";
-	var af = "⁡";
-	var Afr = "𝔄";
-	var afr = "𝔞";
-	var Agrave = "À";
-	var agrave = "à";
-	var alefsym = "ℵ";
-	var aleph = "ℵ";
-	var Alpha = "Α";
-	var alpha = "α";
-	var Amacr = "Ā";
-	var amacr = "ā";
-	var amalg = "⨿";
-	var amp = "&";
-	var AMP = "&";
-	var andand = "⩕";
-	var And = "⩓";
-	var and = "∧";
-	var andd = "⩜";
-	var andslope = "⩘";
-	var andv = "⩚";
-	var ang = "∠";
-	var ange = "⦤";
-	var angle = "∠";
-	var angmsdaa = "⦨";
-	var angmsdab = "⦩";
-	var angmsdac = "⦪";
-	var angmsdad = "⦫";
-	var angmsdae = "⦬";
-	var angmsdaf = "⦭";
-	var angmsdag = "⦮";
-	var angmsdah = "⦯";
-	var angmsd = "∡";
-	var angrt = "∟";
-	var angrtvb = "⊾";
-	var angrtvbd = "⦝";
-	var angsph = "∢";
-	var angst = "Å";
-	var angzarr = "⍼";
-	var Aogon = "Ą";
-	var aogon = "ą";
-	var Aopf = "𝔸";
-	var aopf = "𝕒";
-	var apacir = "⩯";
-	var ap = "≈";
-	var apE = "⩰";
-	var ape = "≊";
-	var apid = "≋";
-	var apos = "'";
-	var ApplyFunction = "⁡";
-	var approx = "≈";
-	var approxeq = "≊";
-	var Aring = "Å";
-	var aring = "å";
-	var Ascr = "𝒜";
-	var ascr = "𝒶";
-	var Assign = "≔";
-	var ast = "*";
-	var asymp = "≈";
-	var asympeq = "≍";
-	var Atilde = "Ã";
-	var atilde = "ã";
-	var Auml = "Ä";
-	var auml = "ä";
-	var awconint = "∳";
-	var awint = "⨑";
-	var backcong = "≌";
-	var backepsilon = "϶";
-	var backprime = "‵";
-	var backsim = "∽";
-	var backsimeq = "⋍";
-	var Backslash = "∖";
-	var Barv = "⫧";
-	var barvee = "⊽";
-	var barwed = "⌅";
-	var Barwed = "⌆";
-	var barwedge = "⌅";
-	var bbrk = "⎵";
-	var bbrktbrk = "⎶";
-	var bcong = "≌";
-	var Bcy = "Б";
-	var bcy = "б";
-	var bdquo = "„";
-	var becaus = "∵";
-	var because = "∵";
-	var Because = "∵";
-	var bemptyv = "⦰";
-	var bepsi = "϶";
-	var bernou = "ℬ";
-	var Bernoullis = "ℬ";
-	var Beta = "Β";
-	var beta = "β";
-	var beth = "ℶ";
-	var between = "≬";
-	var Bfr = "𝔅";
-	var bfr = "𝔟";
-	var bigcap = "⋂";
-	var bigcirc = "◯";
-	var bigcup = "⋃";
-	var bigodot = "⨀";
-	var bigoplus = "⨁";
-	var bigotimes = "⨂";
-	var bigsqcup = "⨆";
-	var bigstar = "★";
-	var bigtriangledown = "▽";
-	var bigtriangleup = "△";
-	var biguplus = "⨄";
-	var bigvee = "⋁";
-	var bigwedge = "⋀";
-	var bkarow = "⤍";
-	var blacklozenge = "⧫";
-	var blacksquare = "▪";
-	var blacktriangle = "▴";
-	var blacktriangledown = "▾";
-	var blacktriangleleft = "◂";
-	var blacktriangleright = "▸";
-	var blank = "␣";
-	var blk12 = "▒";
-	var blk14 = "░";
-	var blk34 = "▓";
-	var block = "█";
-	var bne = "=⃥";
-	var bnequiv = "≡⃥";
-	var bNot = "⫭";
-	var bnot = "⌐";
-	var Bopf = "𝔹";
-	var bopf = "𝕓";
-	var bot = "⊥";
-	var bottom = "⊥";
-	var bowtie = "⋈";
-	var boxbox = "⧉";
-	var boxdl = "┐";
-	var boxdL = "╕";
-	var boxDl = "╖";
-	var boxDL = "╗";
-	var boxdr = "┌";
-	var boxdR = "╒";
-	var boxDr = "╓";
-	var boxDR = "╔";
-	var boxh = "─";
-	var boxH = "═";
-	var boxhd = "┬";
-	var boxHd = "╤";
-	var boxhD = "╥";
-	var boxHD = "╦";
-	var boxhu = "┴";
-	var boxHu = "╧";
-	var boxhU = "╨";
-	var boxHU = "╩";
-	var boxminus = "⊟";
-	var boxplus = "⊞";
-	var boxtimes = "⊠";
-	var boxul = "┘";
-	var boxuL = "╛";
-	var boxUl = "╜";
-	var boxUL = "╝";
-	var boxur = "└";
-	var boxuR = "╘";
-	var boxUr = "╙";
-	var boxUR = "╚";
-	var boxv = "│";
-	var boxV = "║";
-	var boxvh = "┼";
-	var boxvH = "╪";
-	var boxVh = "╫";
-	var boxVH = "╬";
-	var boxvl = "┤";
-	var boxvL = "╡";
-	var boxVl = "╢";
-	var boxVL = "╣";
-	var boxvr = "├";
-	var boxvR = "╞";
-	var boxVr = "╟";
-	var boxVR = "╠";
-	var bprime = "‵";
-	var breve = "˘";
-	var Breve = "˘";
-	var brvbar = "¦";
-	var bscr = "𝒷";
-	var Bscr = "ℬ";
-	var bsemi = "⁏";
-	var bsim = "∽";
-	var bsime = "⋍";
-	var bsolb = "⧅";
-	var bsol = "\\";
-	var bsolhsub = "⟈";
-	var bull = "•";
-	var bullet = "•";
-	var bump = "≎";
-	var bumpE = "⪮";
-	var bumpe = "≏";
-	var Bumpeq = "≎";
-	var bumpeq = "≏";
-	var Cacute = "Ć";
-	var cacute = "ć";
-	var capand = "⩄";
-	var capbrcup = "⩉";
-	var capcap = "⩋";
-	var cap = "∩";
-	var Cap = "⋒";
-	var capcup = "⩇";
-	var capdot = "⩀";
-	var CapitalDifferentialD = "ⅅ";
-	var caps = "∩︀";
-	var caret = "⁁";
-	var caron = "ˇ";
-	var Cayleys = "ℭ";
-	var ccaps = "⩍";
-	var Ccaron = "Č";
-	var ccaron = "č";
-	var Ccedil = "Ç";
-	var ccedil = "ç";
-	var Ccirc = "Ĉ";
-	var ccirc = "ĉ";
-	var Cconint = "∰";
-	var ccups = "⩌";
-	var ccupssm = "⩐";
-	var Cdot = "Ċ";
-	var cdot = "ċ";
-	var cedil = "¸";
-	var Cedilla = "¸";
-	var cemptyv = "⦲";
-	var cent = "¢";
-	var centerdot = "·";
-	var CenterDot = "·";
-	var cfr = "𝔠";
-	var Cfr = "ℭ";
-	var CHcy = "Ч";
-	var chcy = "ч";
-	var check = "✓";
-	var checkmark = "✓";
-	var Chi = "Χ";
-	var chi = "χ";
-	var circ = "ˆ";
-	var circeq = "≗";
-	var circlearrowleft = "↺";
-	var circlearrowright = "↻";
-	var circledast = "⊛";
-	var circledcirc = "⊚";
-	var circleddash = "⊝";
-	var CircleDot = "⊙";
-	var circledR = "®";
-	var circledS = "Ⓢ";
-	var CircleMinus = "⊖";
-	var CirclePlus = "⊕";
-	var CircleTimes = "⊗";
-	var cir = "○";
-	var cirE = "⧃";
-	var cire = "≗";
-	var cirfnint = "⨐";
-	var cirmid = "⫯";
-	var cirscir = "⧂";
-	var ClockwiseContourIntegral = "∲";
-	var CloseCurlyDoubleQuote = "”";
-	var CloseCurlyQuote = "’";
-	var clubs = "♣";
-	var clubsuit = "♣";
-	var colon = ":";
-	var Colon = "∷";
-	var Colone = "⩴";
-	var colone = "≔";
-	var coloneq = "≔";
-	var comma = ",";
-	var commat = "@";
-	var comp = "∁";
-	var compfn = "∘";
-	var complement = "∁";
-	var complexes = "ℂ";
-	var cong = "≅";
-	var congdot = "⩭";
-	var Congruent = "≡";
-	var conint = "∮";
-	var Conint = "∯";
-	var ContourIntegral = "∮";
-	var copf = "𝕔";
-	var Copf = "ℂ";
-	var coprod = "∐";
-	var Coproduct = "∐";
-	var copy = "©";
-	var COPY = "©";
-	var copysr = "℗";
-	var CounterClockwiseContourIntegral = "∳";
-	var crarr = "↵";
-	var cross = "✗";
-	var Cross = "⨯";
-	var Cscr = "𝒞";
-	var cscr = "𝒸";
-	var csub = "⫏";
-	var csube = "⫑";
-	var csup = "⫐";
-	var csupe = "⫒";
-	var ctdot = "⋯";
-	var cudarrl = "⤸";
-	var cudarrr = "⤵";
-	var cuepr = "⋞";
-	var cuesc = "⋟";
-	var cularr = "↶";
-	var cularrp = "⤽";
-	var cupbrcap = "⩈";
-	var cupcap = "⩆";
-	var CupCap = "≍";
-	var cup = "∪";
-	var Cup = "⋓";
-	var cupcup = "⩊";
-	var cupdot = "⊍";
-	var cupor = "⩅";
-	var cups = "∪︀";
-	var curarr = "↷";
-	var curarrm = "⤼";
-	var curlyeqprec = "⋞";
-	var curlyeqsucc = "⋟";
-	var curlyvee = "⋎";
-	var curlywedge = "⋏";
-	var curren = "¤";
-	var curvearrowleft = "↶";
-	var curvearrowright = "↷";
-	var cuvee = "⋎";
-	var cuwed = "⋏";
-	var cwconint = "∲";
-	var cwint = "∱";
-	var cylcty = "⌭";
-	var dagger = "†";
-	var Dagger = "‡";
-	var daleth = "ℸ";
-	var darr = "↓";
-	var Darr = "↡";
-	var dArr = "⇓";
-	var dash = "‐";
-	var Dashv = "⫤";
-	var dashv = "⊣";
-	var dbkarow = "⤏";
-	var dblac = "˝";
-	var Dcaron = "Ď";
-	var dcaron = "ď";
-	var Dcy = "Д";
-	var dcy = "д";
-	var ddagger = "‡";
-	var ddarr = "⇊";
-	var DD = "ⅅ";
-	var dd = "ⅆ";
-	var DDotrahd = "⤑";
-	var ddotseq = "⩷";
-	var deg = "°";
-	var Del = "∇";
-	var Delta = "Δ";
-	var delta = "δ";
-	var demptyv = "⦱";
-	var dfisht = "⥿";
-	var Dfr = "𝔇";
-	var dfr = "𝔡";
-	var dHar = "⥥";
-	var dharl = "⇃";
-	var dharr = "⇂";
-	var DiacriticalAcute = "´";
-	var DiacriticalDot = "˙";
-	var DiacriticalDoubleAcute = "˝";
-	var DiacriticalGrave = "`";
-	var DiacriticalTilde = "˜";
-	var diam = "⋄";
-	var diamond = "⋄";
-	var Diamond = "⋄";
-	var diamondsuit = "♦";
-	var diams = "♦";
-	var die = "¨";
-	var DifferentialD = "ⅆ";
-	var digamma = "ϝ";
-	var disin = "⋲";
-	var div = "÷";
-	var divide = "÷";
-	var divideontimes = "⋇";
-	var divonx = "⋇";
-	var DJcy = "Ђ";
-	var djcy = "ђ";
-	var dlcorn = "⌞";
-	var dlcrop = "⌍";
-	var dollar = "$";
-	var Dopf = "𝔻";
-	var dopf = "𝕕";
-	var Dot = "¨";
-	var dot = "˙";
-	var DotDot = "⃜";
-	var doteq = "≐";
-	var doteqdot = "≑";
-	var DotEqual = "≐";
-	var dotminus = "∸";
-	var dotplus = "∔";
-	var dotsquare = "⊡";
-	var doublebarwedge = "⌆";
-	var DoubleContourIntegral = "∯";
-	var DoubleDot = "¨";
-	var DoubleDownArrow = "⇓";
-	var DoubleLeftArrow = "⇐";
-	var DoubleLeftRightArrow = "⇔";
-	var DoubleLeftTee = "⫤";
-	var DoubleLongLeftArrow = "⟸";
-	var DoubleLongLeftRightArrow = "⟺";
-	var DoubleLongRightArrow = "⟹";
-	var DoubleRightArrow = "⇒";
-	var DoubleRightTee = "⊨";
-	var DoubleUpArrow = "⇑";
-	var DoubleUpDownArrow = "⇕";
-	var DoubleVerticalBar = "∥";
-	var DownArrowBar = "⤓";
-	var downarrow = "↓";
-	var DownArrow = "↓";
-	var Downarrow = "⇓";
-	var DownArrowUpArrow = "⇵";
-	var DownBreve = "̑";
-	var downdownarrows = "⇊";
-	var downharpoonleft = "⇃";
-	var downharpoonright = "⇂";
-	var DownLeftRightVector = "⥐";
-	var DownLeftTeeVector = "⥞";
-	var DownLeftVectorBar = "⥖";
-	var DownLeftVector = "↽";
-	var DownRightTeeVector = "⥟";
-	var DownRightVectorBar = "⥗";
-	var DownRightVector = "⇁";
-	var DownTeeArrow = "↧";
-	var DownTee = "⊤";
-	var drbkarow = "⤐";
-	var drcorn = "⌟";
-	var drcrop = "⌌";
-	var Dscr = "𝒟";
-	var dscr = "𝒹";
-	var DScy = "Ѕ";
-	var dscy = "ѕ";
-	var dsol = "⧶";
-	var Dstrok = "Đ";
-	var dstrok = "đ";
-	var dtdot = "⋱";
-	var dtri = "▿";
-	var dtrif = "▾";
-	var duarr = "⇵";
-	var duhar = "⥯";
-	var dwangle = "⦦";
-	var DZcy = "Џ";
-	var dzcy = "џ";
-	var dzigrarr = "⟿";
-	var Eacute = "É";
-	var eacute = "é";
-	var easter = "⩮";
-	var Ecaron = "Ě";
-	var ecaron = "ě";
-	var Ecirc = "Ê";
-	var ecirc = "ê";
-	var ecir = "≖";
-	var ecolon = "≕";
-	var Ecy = "Э";
-	var ecy = "э";
-	var eDDot = "⩷";
-	var Edot = "Ė";
-	var edot = "ė";
-	var eDot = "≑";
-	var ee = "ⅇ";
-	var efDot = "≒";
-	var Efr = "𝔈";
-	var efr = "𝔢";
-	var eg = "⪚";
-	var Egrave = "È";
-	var egrave = "è";
-	var egs = "⪖";
-	var egsdot = "⪘";
-	var el = "⪙";
-	var Element = "∈";
-	var elinters = "⏧";
-	var ell = "ℓ";
-	var els = "⪕";
-	var elsdot = "⪗";
-	var Emacr = "Ē";
-	var emacr = "ē";
-	var empty = "∅";
-	var emptyset = "∅";
-	var EmptySmallSquare = "◻";
-	var emptyv = "∅";
-	var EmptyVerySmallSquare = "▫";
-	var emsp13 = " ";
-	var emsp14 = " ";
-	var emsp = " ";
-	var ENG = "Ŋ";
-	var eng = "ŋ";
-	var ensp = " ";
-	var Eogon = "Ę";
-	var eogon = "ę";
-	var Eopf = "𝔼";
-	var eopf = "𝕖";
-	var epar = "⋕";
-	var eparsl = "⧣";
-	var eplus = "⩱";
-	var epsi = "ε";
-	var Epsilon = "Ε";
-	var epsilon = "ε";
-	var epsiv = "ϵ";
-	var eqcirc = "≖";
-	var eqcolon = "≕";
-	var eqsim = "≂";
-	var eqslantgtr = "⪖";
-	var eqslantless = "⪕";
-	var Equal = "⩵";
-	var equals = "=";
-	var EqualTilde = "≂";
-	var equest = "≟";
-	var Equilibrium = "⇌";
-	var equiv = "≡";
-	var equivDD = "⩸";
-	var eqvparsl = "⧥";
-	var erarr = "⥱";
-	var erDot = "≓";
-	var escr = "ℯ";
-	var Escr = "ℰ";
-	var esdot = "≐";
-	var Esim = "⩳";
-	var esim = "≂";
-	var Eta = "Η";
-	var eta = "η";
-	var ETH = "Ð";
-	var eth = "ð";
-	var Euml = "Ë";
-	var euml = "ë";
-	var euro = "€";
-	var excl = "!";
-	var exist = "∃";
-	var Exists = "∃";
-	var expectation = "ℰ";
-	var exponentiale = "ⅇ";
-	var ExponentialE = "ⅇ";
-	var fallingdotseq = "≒";
-	var Fcy = "Ф";
-	var fcy = "ф";
-	var female = "♀";
-	var ffilig = "ﬃ";
-	var fflig = "ﬀ";
-	var ffllig = "ﬄ";
-	var Ffr = "𝔉";
-	var ffr = "𝔣";
-	var filig = "ﬁ";
-	var FilledSmallSquare = "◼";
-	var FilledVerySmallSquare = "▪";
-	var fjlig = "fj";
-	var flat = "♭";
-	var fllig = "ﬂ";
-	var fltns = "▱";
-	var fnof = "ƒ";
-	var Fopf = "𝔽";
-	var fopf = "𝕗";
-	var forall = "∀";
-	var ForAll = "∀";
-	var fork = "⋔";
-	var forkv = "⫙";
-	var Fouriertrf = "ℱ";
-	var fpartint = "⨍";
-	var frac12 = "½";
-	var frac13 = "⅓";
-	var frac14 = "¼";
-	var frac15 = "⅕";
-	var frac16 = "⅙";
-	var frac18 = "⅛";
-	var frac23 = "⅔";
-	var frac25 = "⅖";
-	var frac34 = "¾";
-	var frac35 = "⅗";
-	var frac38 = "⅜";
-	var frac45 = "⅘";
-	var frac56 = "⅚";
-	var frac58 = "⅝";
-	var frac78 = "⅞";
-	var frasl = "⁄";
-	var frown = "⌢";
-	var fscr = "𝒻";
-	var Fscr = "ℱ";
-	var gacute = "ǵ";
-	var Gamma = "Γ";
-	var gamma = "γ";
-	var Gammad = "Ϝ";
-	var gammad = "ϝ";
-	var gap = "⪆";
-	var Gbreve = "Ğ";
-	var gbreve = "ğ";
-	var Gcedil = "Ģ";
-	var Gcirc = "Ĝ";
-	var gcirc = "ĝ";
-	var Gcy = "Г";
-	var gcy = "г";
-	var Gdot = "Ġ";
-	var gdot = "ġ";
-	var ge = "≥";
-	var gE = "≧";
-	var gEl = "⪌";
-	var gel = "⋛";
-	var geq = "≥";
-	var geqq = "≧";
-	var geqslant = "⩾";
-	var gescc = "⪩";
-	var ges = "⩾";
-	var gesdot = "⪀";
-	var gesdoto = "⪂";
-	var gesdotol = "⪄";
-	var gesl = "⋛︀";
-	var gesles = "⪔";
-	var Gfr = "𝔊";
-	var gfr = "𝔤";
-	var gg = "≫";
-	var Gg = "⋙";
-	var ggg = "⋙";
-	var gimel = "ℷ";
-	var GJcy = "Ѓ";
-	var gjcy = "ѓ";
-	var gla = "⪥";
-	var gl = "≷";
-	var glE = "⪒";
-	var glj = "⪤";
-	var gnap = "⪊";
-	var gnapprox = "⪊";
-	var gne = "⪈";
-	var gnE = "≩";
-	var gneq = "⪈";
-	var gneqq = "≩";
-	var gnsim = "⋧";
-	var Gopf = "𝔾";
-	var gopf = "𝕘";
-	var grave = "`";
-	var GreaterEqual = "≥";
-	var GreaterEqualLess = "⋛";
-	var GreaterFullEqual = "≧";
-	var GreaterGreater = "⪢";
-	var GreaterLess = "≷";
-	var GreaterSlantEqual = "⩾";
-	var GreaterTilde = "≳";
-	var Gscr = "𝒢";
-	var gscr = "ℊ";
-	var gsim = "≳";
-	var gsime = "⪎";
-	var gsiml = "⪐";
-	var gtcc = "⪧";
-	var gtcir = "⩺";
-	var gt = ">";
-	var GT = ">";
-	var Gt = "≫";
-	var gtdot = "⋗";
-	var gtlPar = "⦕";
-	var gtquest = "⩼";
-	var gtrapprox = "⪆";
-	var gtrarr = "⥸";
-	var gtrdot = "⋗";
-	var gtreqless = "⋛";
-	var gtreqqless = "⪌";
-	var gtrless = "≷";
-	var gtrsim = "≳";
-	var gvertneqq = "≩︀";
-	var gvnE = "≩︀";
-	var Hacek = "ˇ";
-	var hairsp = " ";
-	var half = "½";
-	var hamilt = "ℋ";
-	var HARDcy = "Ъ";
-	var hardcy = "ъ";
-	var harrcir = "⥈";
-	var harr = "↔";
-	var hArr = "⇔";
-	var harrw = "↭";
-	var Hat = "^";
-	var hbar = "ℏ";
-	var Hcirc = "Ĥ";
-	var hcirc = "ĥ";
-	var hearts = "♥";
-	var heartsuit = "♥";
-	var hellip = "…";
-	var hercon = "⊹";
-	var hfr = "𝔥";
-	var Hfr = "ℌ";
-	var HilbertSpace = "ℋ";
-	var hksearow = "⤥";
-	var hkswarow = "⤦";
-	var hoarr = "⇿";
-	var homtht = "∻";
-	var hookleftarrow = "↩";
-	var hookrightarrow = "↪";
-	var hopf = "𝕙";
-	var Hopf = "ℍ";
-	var horbar = "―";
-	var HorizontalLine = "─";
-	var hscr = "𝒽";
-	var Hscr = "ℋ";
-	var hslash = "ℏ";
-	var Hstrok = "Ħ";
-	var hstrok = "ħ";
-	var HumpDownHump = "≎";
-	var HumpEqual = "≏";
-	var hybull = "⁃";
-	var hyphen = "‐";
-	var Iacute = "Í";
-	var iacute = "í";
-	var ic = "⁣";
-	var Icirc = "Î";
-	var icirc = "î";
-	var Icy = "И";
-	var icy = "и";
-	var Idot = "İ";
-	var IEcy = "Е";
-	var iecy = "е";
-	var iexcl = "¡";
-	var iff = "⇔";
-	var ifr = "𝔦";
-	var Ifr = "ℑ";
-	var Igrave = "Ì";
-	var igrave = "ì";
-	var ii = "ⅈ";
-	var iiiint = "⨌";
-	var iiint = "∭";
-	var iinfin = "⧜";
-	var iiota = "℩";
-	var IJlig = "Ĳ";
-	var ijlig = "ĳ";
-	var Imacr = "Ī";
-	var imacr = "ī";
-	var image = "ℑ";
-	var ImaginaryI = "ⅈ";
-	var imagline = "ℐ";
-	var imagpart = "ℑ";
-	var imath = "ı";
-	var Im = "ℑ";
-	var imof = "⊷";
-	var imped = "Ƶ";
-	var Implies = "⇒";
-	var incare = "℅";
-	var infin = "∞";
-	var infintie = "⧝";
-	var inodot = "ı";
-	var intcal = "⊺";
-	var int = "∫";
-	var Int = "∬";
-	var integers = "ℤ";
-	var Integral = "∫";
-	var intercal = "⊺";
-	var Intersection = "⋂";
-	var intlarhk = "⨗";
-	var intprod = "⨼";
-	var InvisibleComma = "⁣";
-	var InvisibleTimes = "⁢";
-	var IOcy = "Ё";
-	var iocy = "ё";
-	var Iogon = "Į";
-	var iogon = "į";
-	var Iopf = "𝕀";
-	var iopf = "𝕚";
-	var Iota = "Ι";
-	var iota = "ι";
-	var iprod = "⨼";
-	var iquest = "¿";
-	var iscr = "𝒾";
-	var Iscr = "ℐ";
-	var isin = "∈";
-	var isindot = "⋵";
-	var isinE = "⋹";
-	var isins = "⋴";
-	var isinsv = "⋳";
-	var isinv = "∈";
-	var it = "⁢";
-	var Itilde = "Ĩ";
-	var itilde = "ĩ";
-	var Iukcy = "І";
-	var iukcy = "і";
-	var Iuml = "Ï";
-	var iuml = "ï";
-	var Jcirc = "Ĵ";
-	var jcirc = "ĵ";
-	var Jcy = "Й";
-	var jcy = "й";
-	var Jfr = "𝔍";
-	var jfr = "𝔧";
-	var jmath = "ȷ";
-	var Jopf = "𝕁";
-	var jopf = "𝕛";
-	var Jscr = "𝒥";
-	var jscr = "𝒿";
-	var Jsercy = "Ј";
-	var jsercy = "ј";
-	var Jukcy = "Є";
-	var jukcy = "є";
-	var Kappa = "Κ";
-	var kappa = "κ";
-	var kappav = "ϰ";
-	var Kcedil = "Ķ";
-	var kcedil = "ķ";
-	var Kcy = "К";
-	var kcy = "к";
-	var Kfr = "𝔎";
-	var kfr = "𝔨";
-	var kgreen = "ĸ";
-	var KHcy = "Х";
-	var khcy = "х";
-	var KJcy = "Ќ";
-	var kjcy = "ќ";
-	var Kopf = "𝕂";
-	var kopf = "𝕜";
-	var Kscr = "𝒦";
-	var kscr = "𝓀";
-	var lAarr = "⇚";
-	var Lacute = "Ĺ";
-	var lacute = "ĺ";
-	var laemptyv = "⦴";
-	var lagran = "ℒ";
-	var Lambda = "Λ";
-	var lambda = "λ";
-	var lang = "⟨";
-	var Lang = "⟪";
-	var langd = "⦑";
-	var langle = "⟨";
-	var lap = "⪅";
-	var Laplacetrf = "ℒ";
-	var laquo = "«";
-	var larrb = "⇤";
-	var larrbfs = "⤟";
-	var larr = "←";
-	var Larr = "↞";
-	var lArr = "⇐";
-	var larrfs = "⤝";
-	var larrhk = "↩";
-	var larrlp = "↫";
-	var larrpl = "⤹";
-	var larrsim = "⥳";
-	var larrtl = "↢";
-	var latail = "⤙";
-	var lAtail = "⤛";
-	var lat = "⪫";
-	var late = "⪭";
-	var lates = "⪭︀";
-	var lbarr = "⤌";
-	var lBarr = "⤎";
-	var lbbrk = "❲";
-	var lbrace = "{";
-	var lbrack = "[";
-	var lbrke = "⦋";
-	var lbrksld = "⦏";
-	var lbrkslu = "⦍";
-	var Lcaron = "Ľ";
-	var lcaron = "ľ";
-	var Lcedil = "Ļ";
-	var lcedil = "ļ";
-	var lceil = "⌈";
-	var lcub = "{";
-	var Lcy = "Л";
-	var lcy = "л";
-	var ldca = "⤶";
-	var ldquo = "“";
-	var ldquor = "„";
-	var ldrdhar = "⥧";
-	var ldrushar = "⥋";
-	var ldsh = "↲";
-	var le = "≤";
-	var lE = "≦";
-	var LeftAngleBracket = "⟨";
-	var LeftArrowBar = "⇤";
-	var leftarrow = "←";
-	var LeftArrow = "←";
-	var Leftarrow = "⇐";
-	var LeftArrowRightArrow = "⇆";
-	var leftarrowtail = "↢";
-	var LeftCeiling = "⌈";
-	var LeftDoubleBracket = "⟦";
-	var LeftDownTeeVector = "⥡";
-	var LeftDownVectorBar = "⥙";
-	var LeftDownVector = "⇃";
-	var LeftFloor = "⌊";
-	var leftharpoondown = "↽";
-	var leftharpoonup = "↼";
-	var leftleftarrows = "⇇";
-	var leftrightarrow = "↔";
-	var LeftRightArrow = "↔";
-	var Leftrightarrow = "⇔";
-	var leftrightarrows = "⇆";
-	var leftrightharpoons = "⇋";
-	var leftrightsquigarrow = "↭";
-	var LeftRightVector = "⥎";
-	var LeftTeeArrow = "↤";
-	var LeftTee = "⊣";
-	var LeftTeeVector = "⥚";
-	var leftthreetimes = "⋋";
-	var LeftTriangleBar = "⧏";
-	var LeftTriangle = "⊲";
-	var LeftTriangleEqual = "⊴";
-	var LeftUpDownVector = "⥑";
-	var LeftUpTeeVector = "⥠";
-	var LeftUpVectorBar = "⥘";
-	var LeftUpVector = "↿";
-	var LeftVectorBar = "⥒";
-	var LeftVector = "↼";
-	var lEg = "⪋";
-	var leg = "⋚";
-	var leq = "≤";
-	var leqq = "≦";
-	var leqslant = "⩽";
-	var lescc = "⪨";
-	var les = "⩽";
-	var lesdot = "⩿";
-	var lesdoto = "⪁";
-	var lesdotor = "⪃";
-	var lesg = "⋚︀";
-	var lesges = "⪓";
-	var lessapprox = "⪅";
-	var lessdot = "⋖";
-	var lesseqgtr = "⋚";
-	var lesseqqgtr = "⪋";
-	var LessEqualGreater = "⋚";
-	var LessFullEqual = "≦";
-	var LessGreater = "≶";
-	var lessgtr = "≶";
-	var LessLess = "⪡";
-	var lesssim = "≲";
-	var LessSlantEqual = "⩽";
-	var LessTilde = "≲";
-	var lfisht = "⥼";
-	var lfloor = "⌊";
-	var Lfr = "𝔏";
-	var lfr = "𝔩";
-	var lg = "≶";
-	var lgE = "⪑";
-	var lHar = "⥢";
-	var lhard = "↽";
-	var lharu = "↼";
-	var lharul = "⥪";
-	var lhblk = "▄";
-	var LJcy = "Љ";
-	var ljcy = "љ";
-	var llarr = "⇇";
-	var ll = "≪";
-	var Ll = "⋘";
-	var llcorner = "⌞";
-	var Lleftarrow = "⇚";
-	var llhard = "⥫";
-	var lltri = "◺";
-	var Lmidot = "Ŀ";
-	var lmidot = "ŀ";
-	var lmoustache = "⎰";
-	var lmoust = "⎰";
-	var lnap = "⪉";
-	var lnapprox = "⪉";
-	var lne = "⪇";
-	var lnE = "≨";
-	var lneq = "⪇";
-	var lneqq = "≨";
-	var lnsim = "⋦";
-	var loang = "⟬";
-	var loarr = "⇽";
-	var lobrk = "⟦";
-	var longleftarrow = "⟵";
-	var LongLeftArrow = "⟵";
-	var Longleftarrow = "⟸";
-	var longleftrightarrow = "⟷";
-	var LongLeftRightArrow = "⟷";
-	var Longleftrightarrow = "⟺";
-	var longmapsto = "⟼";
-	var longrightarrow = "⟶";
-	var LongRightArrow = "⟶";
-	var Longrightarrow = "⟹";
-	var looparrowleft = "↫";
-	var looparrowright = "↬";
-	var lopar = "⦅";
-	var Lopf = "𝕃";
-	var lopf = "𝕝";
-	var loplus = "⨭";
-	var lotimes = "⨴";
-	var lowast = "∗";
-	var lowbar = "_";
-	var LowerLeftArrow = "↙";
-	var LowerRightArrow = "↘";
-	var loz = "◊";
-	var lozenge = "◊";
-	var lozf = "⧫";
-	var lpar = "(";
-	var lparlt = "⦓";
-	var lrarr = "⇆";
-	var lrcorner = "⌟";
-	var lrhar = "⇋";
-	var lrhard = "⥭";
-	var lrm = "‎";
-	var lrtri = "⊿";
-	var lsaquo = "‹";
-	var lscr = "𝓁";
-	var Lscr = "ℒ";
-	var lsh = "↰";
-	var Lsh = "↰";
-	var lsim = "≲";
-	var lsime = "⪍";
-	var lsimg = "⪏";
-	var lsqb = "[";
-	var lsquo = "‘";
-	var lsquor = "‚";
-	var Lstrok = "Ł";
-	var lstrok = "ł";
-	var ltcc = "⪦";
-	var ltcir = "⩹";
-	var lt = "<";
-	var LT = "<";
-	var Lt = "≪";
-	var ltdot = "⋖";
-	var lthree = "⋋";
-	var ltimes = "⋉";
-	var ltlarr = "⥶";
-	var ltquest = "⩻";
-	var ltri = "◃";
-	var ltrie = "⊴";
-	var ltrif = "◂";
-	var ltrPar = "⦖";
-	var lurdshar = "⥊";
-	var luruhar = "⥦";
-	var lvertneqq = "≨︀";
-	var lvnE = "≨︀";
-	var macr = "¯";
-	var male = "♂";
-	var malt = "✠";
-	var maltese = "✠";
-	var map = "↦";
-	var mapsto = "↦";
-	var mapstodown = "↧";
-	var mapstoleft = "↤";
-	var mapstoup = "↥";
-	var marker = "▮";
-	var mcomma = "⨩";
-	var Mcy = "М";
-	var mcy = "м";
-	var mdash = "—";
-	var mDDot = "∺";
-	var measuredangle = "∡";
-	var MediumSpace = " ";
-	var Mellintrf = "ℳ";
-	var Mfr = "𝔐";
-	var mfr = "𝔪";
-	var mho = "℧";
-	var micro = "µ";
-	var midast = "*";
-	var midcir = "⫰";
-	var mid = "∣";
-	var middot = "·";
-	var minusb = "⊟";
-	var minus = "−";
-	var minusd = "∸";
-	var minusdu = "⨪";
-	var MinusPlus = "∓";
-	var mlcp = "⫛";
-	var mldr = "…";
-	var mnplus = "∓";
-	var models = "⊧";
-	var Mopf = "𝕄";
-	var mopf = "𝕞";
-	var mp = "∓";
-	var mscr = "𝓂";
-	var Mscr = "ℳ";
-	var mstpos = "∾";
-	var Mu = "Μ";
-	var mu = "μ";
-	var multimap = "⊸";
-	var mumap = "⊸";
-	var nabla = "∇";
-	var Nacute = "Ń";
-	var nacute = "ń";
-	var nang = "∠⃒";
-	var nap = "≉";
-	var napE = "⩰̸";
-	var napid = "≋̸";
-	var napos = "ŉ";
-	var napprox = "≉";
-	var natural = "♮";
-	var naturals = "ℕ";
-	var natur = "♮";
-	var nbsp = " ";
-	var nbump = "≎̸";
-	var nbumpe = "≏̸";
-	var ncap = "⩃";
-	var Ncaron = "Ň";
-	var ncaron = "ň";
-	var Ncedil = "Ņ";
-	var ncedil = "ņ";
-	var ncong = "≇";
-	var ncongdot = "⩭̸";
-	var ncup = "⩂";
-	var Ncy = "Н";
-	var ncy = "н";
-	var ndash = "–";
-	var nearhk = "⤤";
-	var nearr = "↗";
-	var neArr = "⇗";
-	var nearrow = "↗";
-	var ne = "≠";
-	var nedot = "≐̸";
-	var NegativeMediumSpace = "​";
-	var NegativeThickSpace = "​";
-	var NegativeThinSpace = "​";
-	var NegativeVeryThinSpace = "​";
-	var nequiv = "≢";
-	var nesear = "⤨";
-	var nesim = "≂̸";
-	var NestedGreaterGreater = "≫";
-	var NestedLessLess = "≪";
-	var NewLine = "\n";
-	var nexist = "∄";
-	var nexists = "∄";
-	var Nfr = "𝔑";
-	var nfr = "𝔫";
-	var ngE = "≧̸";
-	var nge = "≱";
-	var ngeq = "≱";
-	var ngeqq = "≧̸";
-	var ngeqslant = "⩾̸";
-	var nges = "⩾̸";
-	var nGg = "⋙̸";
-	var ngsim = "≵";
-	var nGt = "≫⃒";
-	var ngt = "≯";
-	var ngtr = "≯";
-	var nGtv = "≫̸";
-	var nharr = "↮";
-	var nhArr = "⇎";
-	var nhpar = "⫲";
-	var ni = "∋";
-	var nis = "⋼";
-	var nisd = "⋺";
-	var niv = "∋";
-	var NJcy = "Њ";
-	var njcy = "њ";
-	var nlarr = "↚";
-	var nlArr = "⇍";
-	var nldr = "‥";
-	var nlE = "≦̸";
-	var nle = "≰";
-	var nleftarrow = "↚";
-	var nLeftarrow = "⇍";
-	var nleftrightarrow = "↮";
-	var nLeftrightarrow = "⇎";
-	var nleq = "≰";
-	var nleqq = "≦̸";
-	var nleqslant = "⩽̸";
-	var nles = "⩽̸";
-	var nless = "≮";
-	var nLl = "⋘̸";
-	var nlsim = "≴";
-	var nLt = "≪⃒";
-	var nlt = "≮";
-	var nltri = "⋪";
-	var nltrie = "⋬";
-	var nLtv = "≪̸";
-	var nmid = "∤";
-	var NoBreak = "⁠";
-	var NonBreakingSpace = " ";
-	var nopf = "𝕟";
-	var Nopf = "ℕ";
-	var Not = "⫬";
-	var not = "¬";
-	var NotCongruent = "≢";
-	var NotCupCap = "≭";
-	var NotDoubleVerticalBar = "∦";
-	var NotElement = "∉";
-	var NotEqual = "≠";
-	var NotEqualTilde = "≂̸";
-	var NotExists = "∄";
-	var NotGreater = "≯";
-	var NotGreaterEqual = "≱";
-	var NotGreaterFullEqual = "≧̸";
-	var NotGreaterGreater = "≫̸";
-	var NotGreaterLess = "≹";
-	var NotGreaterSlantEqual = "⩾̸";
-	var NotGreaterTilde = "≵";
-	var NotHumpDownHump = "≎̸";
-	var NotHumpEqual = "≏̸";
-	var notin = "∉";
-	var notindot = "⋵̸";
-	var notinE = "⋹̸";
-	var notinva = "∉";
-	var notinvb = "⋷";
-	var notinvc = "⋶";
-	var NotLeftTriangleBar = "⧏̸";
-	var NotLeftTriangle = "⋪";
-	var NotLeftTriangleEqual = "⋬";
-	var NotLess = "≮";
-	var NotLessEqual = "≰";
-	var NotLessGreater = "≸";
-	var NotLessLess = "≪̸";
-	var NotLessSlantEqual = "⩽̸";
-	var NotLessTilde = "≴";
-	var NotNestedGreaterGreater = "⪢̸";
-	var NotNestedLessLess = "⪡̸";
-	var notni = "∌";
-	var notniva = "∌";
-	var notnivb = "⋾";
-	var notnivc = "⋽";
-	var NotPrecedes = "⊀";
-	var NotPrecedesEqual = "⪯̸";
-	var NotPrecedesSlantEqual = "⋠";
-	var NotReverseElement = "∌";
-	var NotRightTriangleBar = "⧐̸";
-	var NotRightTriangle = "⋫";
-	var NotRightTriangleEqual = "⋭";
-	var NotSquareSubset = "⊏̸";
-	var NotSquareSubsetEqual = "⋢";
-	var NotSquareSuperset = "⊐̸";
-	var NotSquareSupersetEqual = "⋣";
-	var NotSubset = "⊂⃒";
-	var NotSubsetEqual = "⊈";
-	var NotSucceeds = "⊁";
-	var NotSucceedsEqual = "⪰̸";
-	var NotSucceedsSlantEqual = "⋡";
-	var NotSucceedsTilde = "≿̸";
-	var NotSuperset = "⊃⃒";
-	var NotSupersetEqual = "⊉";
-	var NotTilde = "≁";
-	var NotTildeEqual = "≄";
-	var NotTildeFullEqual = "≇";
-	var NotTildeTilde = "≉";
-	var NotVerticalBar = "∤";
-	var nparallel = "∦";
-	var npar = "∦";
-	var nparsl = "⫽⃥";
-	var npart = "∂̸";
-	var npolint = "⨔";
-	var npr = "⊀";
-	var nprcue = "⋠";
-	var nprec = "⊀";
-	var npreceq = "⪯̸";
-	var npre = "⪯̸";
-	var nrarrc = "⤳̸";
-	var nrarr = "↛";
-	var nrArr = "⇏";
-	var nrarrw = "↝̸";
-	var nrightarrow = "↛";
-	var nRightarrow = "⇏";
-	var nrtri = "⋫";
-	var nrtrie = "⋭";
-	var nsc = "⊁";
-	var nsccue = "⋡";
-	var nsce = "⪰̸";
-	var Nscr = "𝒩";
-	var nscr = "𝓃";
-	var nshortmid = "∤";
-	var nshortparallel = "∦";
-	var nsim = "≁";
-	var nsime = "≄";
-	var nsimeq = "≄";
-	var nsmid = "∤";
-	var nspar = "∦";
-	var nsqsube = "⋢";
-	var nsqsupe = "⋣";
-	var nsub = "⊄";
-	var nsubE = "⫅̸";
-	var nsube = "⊈";
-	var nsubset = "⊂⃒";
-	var nsubseteq = "⊈";
-	var nsubseteqq = "⫅̸";
-	var nsucc = "⊁";
-	var nsucceq = "⪰̸";
-	var nsup = "⊅";
-	var nsupE = "⫆̸";
-	var nsupe = "⊉";
-	var nsupset = "⊃⃒";
-	var nsupseteq = "⊉";
-	var nsupseteqq = "⫆̸";
-	var ntgl = "≹";
-	var Ntilde = "Ñ";
-	var ntilde = "ñ";
-	var ntlg = "≸";
-	var ntriangleleft = "⋪";
-	var ntrianglelefteq = "⋬";
-	var ntriangleright = "⋫";
-	var ntrianglerighteq = "⋭";
-	var Nu = "Ν";
-	var nu = "ν";
-	var num = "#";
-	var numero = "№";
-	var numsp = " ";
-	var nvap = "≍⃒";
-	var nvdash = "⊬";
-	var nvDash = "⊭";
-	var nVdash = "⊮";
-	var nVDash = "⊯";
-	var nvge = "≥⃒";
-	var nvgt = ">⃒";
-	var nvHarr = "⤄";
-	var nvinfin = "⧞";
-	var nvlArr = "⤂";
-	var nvle = "≤⃒";
-	var nvlt = "<⃒";
-	var nvltrie = "⊴⃒";
-	var nvrArr = "⤃";
-	var nvrtrie = "⊵⃒";
-	var nvsim = "∼⃒";
-	var nwarhk = "⤣";
-	var nwarr = "↖";
-	var nwArr = "⇖";
-	var nwarrow = "↖";
-	var nwnear = "⤧";
-	var Oacute = "Ó";
-	var oacute = "ó";
-	var oast = "⊛";
-	var Ocirc = "Ô";
-	var ocirc = "ô";
-	var ocir = "⊚";
-	var Ocy = "О";
-	var ocy = "о";
-	var odash = "⊝";
-	var Odblac = "Ő";
-	var odblac = "ő";
-	var odiv = "⨸";
-	var odot = "⊙";
-	var odsold = "⦼";
-	var OElig = "Œ";
-	var oelig = "œ";
-	var ofcir = "⦿";
-	var Ofr = "𝔒";
-	var ofr = "𝔬";
-	var ogon = "˛";
-	var Ograve = "Ò";
-	var ograve = "ò";
-	var ogt = "⧁";
-	var ohbar = "⦵";
-	var ohm = "Ω";
-	var oint = "∮";
-	var olarr = "↺";
-	var olcir = "⦾";
-	var olcross = "⦻";
-	var oline = "‾";
-	var olt = "⧀";
-	var Omacr = "Ō";
-	var omacr = "ō";
-	var Omega = "Ω";
-	var omega = "ω";
-	var Omicron = "Ο";
-	var omicron = "ο";
-	var omid = "⦶";
-	var ominus = "⊖";
-	var Oopf = "𝕆";
-	var oopf = "𝕠";
-	var opar = "⦷";
-	var OpenCurlyDoubleQuote = "“";
-	var OpenCurlyQuote = "‘";
-	var operp = "⦹";
-	var oplus = "⊕";
-	var orarr = "↻";
-	var Or = "⩔";
-	var or = "∨";
-	var ord = "⩝";
-	var order = "ℴ";
-	var orderof = "ℴ";
-	var ordf = "ª";
-	var ordm = "º";
-	var origof = "⊶";
-	var oror = "⩖";
-	var orslope = "⩗";
-	var orv = "⩛";
-	var oS = "Ⓢ";
-	var Oscr = "𝒪";
-	var oscr = "ℴ";
-	var Oslash = "Ø";
-	var oslash = "ø";
-	var osol = "⊘";
-	var Otilde = "Õ";
-	var otilde = "õ";
-	var otimesas = "⨶";
-	var Otimes = "⨷";
-	var otimes = "⊗";
-	var Ouml = "Ö";
-	var ouml = "ö";
-	var ovbar = "⌽";
-	var OverBar = "‾";
-	var OverBrace = "⏞";
-	var OverBracket = "⎴";
-	var OverParenthesis = "⏜";
-	var para = "¶";
-	var parallel = "∥";
-	var par = "∥";
-	var parsim = "⫳";
-	var parsl = "⫽";
-	var part = "∂";
-	var PartialD = "∂";
-	var Pcy = "П";
-	var pcy = "п";
-	var percnt = "%";
-	var period = ".";
-	var permil = "‰";
-	var perp = "⊥";
-	var pertenk = "‱";
-	var Pfr = "𝔓";
-	var pfr = "𝔭";
-	var Phi = "Φ";
-	var phi = "φ";
-	var phiv = "ϕ";
-	var phmmat = "ℳ";
-	var phone = "☎";
-	var Pi = "Π";
-	var pi = "π";
-	var pitchfork = "⋔";
-	var piv = "ϖ";
-	var planck = "ℏ";
-	var planckh = "ℎ";
-	var plankv = "ℏ";
-	var plusacir = "⨣";
-	var plusb = "⊞";
-	var pluscir = "⨢";
-	var plus = "+";
-	var plusdo = "∔";
-	var plusdu = "⨥";
-	var pluse = "⩲";
-	var PlusMinus = "±";
-	var plusmn = "±";
-	var plussim = "⨦";
-	var plustwo = "⨧";
-	var pm = "±";
-	var Poincareplane = "ℌ";
-	var pointint = "⨕";
-	var popf = "𝕡";
-	var Popf = "ℙ";
-	var pound = "£";
-	var prap = "⪷";
-	var Pr = "⪻";
-	var pr = "≺";
-	var prcue = "≼";
-	var precapprox = "⪷";
-	var prec = "≺";
-	var preccurlyeq = "≼";
-	var Precedes = "≺";
-	var PrecedesEqual = "⪯";
-	var PrecedesSlantEqual = "≼";
-	var PrecedesTilde = "≾";
-	var preceq = "⪯";
-	var precnapprox = "⪹";
-	var precneqq = "⪵";
-	var precnsim = "⋨";
-	var pre = "⪯";
-	var prE = "⪳";
-	var precsim = "≾";
-	var prime = "′";
-	var Prime = "″";
-	var primes = "ℙ";
-	var prnap = "⪹";
-	var prnE = "⪵";
-	var prnsim = "⋨";
-	var prod = "∏";
-	var Product = "∏";
-	var profalar = "⌮";
-	var profline = "⌒";
-	var profsurf = "⌓";
-	var prop = "∝";
-	var Proportional = "∝";
-	var Proportion = "∷";
-	var propto = "∝";
-	var prsim = "≾";
-	var prurel = "⊰";
-	var Pscr = "𝒫";
-	var pscr = "𝓅";
-	var Psi = "Ψ";
-	var psi = "ψ";
-	var puncsp = " ";
-	var Qfr = "𝔔";
-	var qfr = "𝔮";
-	var qint = "⨌";
-	var qopf = "𝕢";
-	var Qopf = "ℚ";
-	var qprime = "⁗";
-	var Qscr = "𝒬";
-	var qscr = "𝓆";
-	var quaternions = "ℍ";
-	var quatint = "⨖";
-	var quest = "?";
-	var questeq = "≟";
-	var quot = "\"";
-	var QUOT = "\"";
-	var rAarr = "⇛";
-	var race = "∽̱";
-	var Racute = "Ŕ";
-	var racute = "ŕ";
-	var radic = "√";
-	var raemptyv = "⦳";
-	var rang = "⟩";
-	var Rang = "⟫";
-	var rangd = "⦒";
-	var range = "⦥";
-	var rangle = "⟩";
-	var raquo = "»";
-	var rarrap = "⥵";
-	var rarrb = "⇥";
-	var rarrbfs = "⤠";
-	var rarrc = "⤳";
-	var rarr = "→";
-	var Rarr = "↠";
-	var rArr = "⇒";
-	var rarrfs = "⤞";
-	var rarrhk = "↪";
-	var rarrlp = "↬";
-	var rarrpl = "⥅";
-	var rarrsim = "⥴";
-	var Rarrtl = "⤖";
-	var rarrtl = "↣";
-	var rarrw = "↝";
-	var ratail = "⤚";
-	var rAtail = "⤜";
-	var ratio = "∶";
-	var rationals = "ℚ";
-	var rbarr = "⤍";
-	var rBarr = "⤏";
-	var RBarr = "⤐";
-	var rbbrk = "❳";
-	var rbrace = "}";
-	var rbrack = "]";
-	var rbrke = "⦌";
-	var rbrksld = "⦎";
-	var rbrkslu = "⦐";
-	var Rcaron = "Ř";
-	var rcaron = "ř";
-	var Rcedil = "Ŗ";
-	var rcedil = "ŗ";
-	var rceil = "⌉";
-	var rcub = "}";
-	var Rcy = "Р";
-	var rcy = "р";
-	var rdca = "⤷";
-	var rdldhar = "⥩";
-	var rdquo = "”";
-	var rdquor = "”";
-	var rdsh = "↳";
-	var real = "ℜ";
-	var realine = "ℛ";
-	var realpart = "ℜ";
-	var reals = "ℝ";
-	var Re = "ℜ";
-	var rect = "▭";
-	var reg = "®";
-	var REG = "®";
-	var ReverseElement = "∋";
-	var ReverseEquilibrium = "⇋";
-	var ReverseUpEquilibrium = "⥯";
-	var rfisht = "⥽";
-	var rfloor = "⌋";
-	var rfr = "𝔯";
-	var Rfr = "ℜ";
-	var rHar = "⥤";
-	var rhard = "⇁";
-	var rharu = "⇀";
-	var rharul = "⥬";
-	var Rho = "Ρ";
-	var rho = "ρ";
-	var rhov = "ϱ";
-	var RightAngleBracket = "⟩";
-	var RightArrowBar = "⇥";
-	var rightarrow = "→";
-	var RightArrow = "→";
-	var Rightarrow = "⇒";
-	var RightArrowLeftArrow = "⇄";
-	var rightarrowtail = "↣";
-	var RightCeiling = "⌉";
-	var RightDoubleBracket = "⟧";
-	var RightDownTeeVector = "⥝";
-	var RightDownVectorBar = "⥕";
-	var RightDownVector = "⇂";
-	var RightFloor = "⌋";
-	var rightharpoondown = "⇁";
-	var rightharpoonup = "⇀";
-	var rightleftarrows = "⇄";
-	var rightleftharpoons = "⇌";
-	var rightrightarrows = "⇉";
-	var rightsquigarrow = "↝";
-	var RightTeeArrow = "↦";
-	var RightTee = "⊢";
-	var RightTeeVector = "⥛";
-	var rightthreetimes = "⋌";
-	var RightTriangleBar = "⧐";
-	var RightTriangle = "⊳";
-	var RightTriangleEqual = "⊵";
-	var RightUpDownVector = "⥏";
-	var RightUpTeeVector = "⥜";
-	var RightUpVectorBar = "⥔";
-	var RightUpVector = "↾";
-	var RightVectorBar = "⥓";
-	var RightVector = "⇀";
-	var ring = "˚";
-	var risingdotseq = "≓";
-	var rlarr = "⇄";
-	var rlhar = "⇌";
-	var rlm = "‏";
-	var rmoustache = "⎱";
-	var rmoust = "⎱";
-	var rnmid = "⫮";
-	var roang = "⟭";
-	var roarr = "⇾";
-	var robrk = "⟧";
-	var ropar = "⦆";
-	var ropf = "𝕣";
-	var Ropf = "ℝ";
-	var roplus = "⨮";
-	var rotimes = "⨵";
-	var RoundImplies = "⥰";
-	var rpar = ")";
-	var rpargt = "⦔";
-	var rppolint = "⨒";
-	var rrarr = "⇉";
-	var Rrightarrow = "⇛";
-	var rsaquo = "›";
-	var rscr = "𝓇";
-	var Rscr = "ℛ";
-	var rsh = "↱";
-	var Rsh = "↱";
-	var rsqb = "]";
-	var rsquo = "’";
-	var rsquor = "’";
-	var rthree = "⋌";
-	var rtimes = "⋊";
-	var rtri = "▹";
-	var rtrie = "⊵";
-	var rtrif = "▸";
-	var rtriltri = "⧎";
-	var RuleDelayed = "⧴";
-	var ruluhar = "⥨";
-	var rx = "℞";
-	var Sacute = "Ś";
-	var sacute = "ś";
-	var sbquo = "‚";
-	var scap = "⪸";
-	var Scaron = "Š";
-	var scaron = "š";
-	var Sc = "⪼";
-	var sc = "≻";
-	var sccue = "≽";
-	var sce = "⪰";
-	var scE = "⪴";
-	var Scedil = "Ş";
-	var scedil = "ş";
-	var Scirc = "Ŝ";
-	var scirc = "ŝ";
-	var scnap = "⪺";
-	var scnE = "⪶";
-	var scnsim = "⋩";
-	var scpolint = "⨓";
-	var scsim = "≿";
-	var Scy = "С";
-	var scy = "с";
-	var sdotb = "⊡";
-	var sdot = "⋅";
-	var sdote = "⩦";
-	var searhk = "⤥";
-	var searr = "↘";
-	var seArr = "⇘";
-	var searrow = "↘";
-	var sect = "§";
-	var semi = ";";
-	var seswar = "⤩";
-	var setminus = "∖";
-	var setmn = "∖";
-	var sext = "✶";
-	var Sfr = "𝔖";
-	var sfr = "𝔰";
-	var sfrown = "⌢";
-	var sharp = "♯";
-	var SHCHcy = "Щ";
-	var shchcy = "щ";
-	var SHcy = "Ш";
-	var shcy = "ш";
-	var ShortDownArrow = "↓";
-	var ShortLeftArrow = "←";
-	var shortmid = "∣";
-	var shortparallel = "∥";
-	var ShortRightArrow = "→";
-	var ShortUpArrow = "↑";
-	var shy = "­";
-	var Sigma = "Σ";
-	var sigma = "σ";
-	var sigmaf = "ς";
-	var sigmav = "ς";
-	var sim = "∼";
-	var simdot = "⩪";
-	var sime = "≃";
-	var simeq = "≃";
-	var simg = "⪞";
-	var simgE = "⪠";
-	var siml = "⪝";
-	var simlE = "⪟";
-	var simne = "≆";
-	var simplus = "⨤";
-	var simrarr = "⥲";
-	var slarr = "←";
-	var SmallCircle = "∘";
-	var smallsetminus = "∖";
-	var smashp = "⨳";
-	var smeparsl = "⧤";
-	var smid = "∣";
-	var smile = "⌣";
-	var smt = "⪪";
-	var smte = "⪬";
-	var smtes = "⪬︀";
-	var SOFTcy = "Ь";
-	var softcy = "ь";
-	var solbar = "⌿";
-	var solb = "⧄";
-	var sol = "/";
-	var Sopf = "𝕊";
-	var sopf = "𝕤";
-	var spades = "♠";
-	var spadesuit = "♠";
-	var spar = "∥";
-	var sqcap = "⊓";
-	var sqcaps = "⊓︀";
-	var sqcup = "⊔";
-	var sqcups = "⊔︀";
-	var Sqrt = "√";
-	var sqsub = "⊏";
-	var sqsube = "⊑";
-	var sqsubset = "⊏";
-	var sqsubseteq = "⊑";
-	var sqsup = "⊐";
-	var sqsupe = "⊒";
-	var sqsupset = "⊐";
-	var sqsupseteq = "⊒";
-	var square = "□";
-	var Square = "□";
-	var SquareIntersection = "⊓";
-	var SquareSubset = "⊏";
-	var SquareSubsetEqual = "⊑";
-	var SquareSuperset = "⊐";
-	var SquareSupersetEqual = "⊒";
-	var SquareUnion = "⊔";
-	var squarf = "▪";
-	var squ = "□";
-	var squf = "▪";
-	var srarr = "→";
-	var Sscr = "𝒮";
-	var sscr = "𝓈";
-	var ssetmn = "∖";
-	var ssmile = "⌣";
-	var sstarf = "⋆";
-	var Star = "⋆";
-	var star = "☆";
-	var starf = "★";
-	var straightepsilon = "ϵ";
-	var straightphi = "ϕ";
-	var strns = "¯";
-	var sub = "⊂";
-	var Sub = "⋐";
-	var subdot = "⪽";
-	var subE = "⫅";
-	var sube = "⊆";
-	var subedot = "⫃";
-	var submult = "⫁";
-	var subnE = "⫋";
-	var subne = "⊊";
-	var subplus = "⪿";
-	var subrarr = "⥹";
-	var subset = "⊂";
-	var Subset = "⋐";
-	var subseteq = "⊆";
-	var subseteqq = "⫅";
-	var SubsetEqual = "⊆";
-	var subsetneq = "⊊";
-	var subsetneqq = "⫋";
-	var subsim = "⫇";
-	var subsub = "⫕";
-	var subsup = "⫓";
-	var succapprox = "⪸";
-	var succ = "≻";
-	var succcurlyeq = "≽";
-	var Succeeds = "≻";
-	var SucceedsEqual = "⪰";
-	var SucceedsSlantEqual = "≽";
-	var SucceedsTilde = "≿";
-	var succeq = "⪰";
-	var succnapprox = "⪺";
-	var succneqq = "⪶";
-	var succnsim = "⋩";
-	var succsim = "≿";
-	var SuchThat = "∋";
-	var sum = "∑";
-	var Sum = "∑";
-	var sung = "♪";
-	var sup1 = "¹";
-	var sup2 = "²";
-	var sup3 = "³";
-	var sup = "⊃";
-	var Sup = "⋑";
-	var supdot = "⪾";
-	var supdsub = "⫘";
-	var supE = "⫆";
-	var supe = "⊇";
-	var supedot = "⫄";
-	var Superset = "⊃";
-	var SupersetEqual = "⊇";
-	var suphsol = "⟉";
-	var suphsub = "⫗";
-	var suplarr = "⥻";
-	var supmult = "⫂";
-	var supnE = "⫌";
-	var supne = "⊋";
-	var supplus = "⫀";
-	var supset = "⊃";
-	var Supset = "⋑";
-	var supseteq = "⊇";
-	var supseteqq = "⫆";
-	var supsetneq = "⊋";
-	var supsetneqq = "⫌";
-	var supsim = "⫈";
-	var supsub = "⫔";
-	var supsup = "⫖";
-	var swarhk = "⤦";
-	var swarr = "↙";
-	var swArr = "⇙";
-	var swarrow = "↙";
-	var swnwar = "⤪";
-	var szlig = "ß";
-	var Tab = "\t";
-	var target = "⌖";
-	var Tau = "Τ";
-	var tau = "τ";
-	var tbrk = "⎴";
-	var Tcaron = "Ť";
-	var tcaron = "ť";
-	var Tcedil = "Ţ";
-	var tcedil = "ţ";
-	var Tcy = "Т";
-	var tcy = "т";
-	var tdot = "⃛";
-	var telrec = "⌕";
-	var Tfr = "𝔗";
-	var tfr = "𝔱";
-	var there4 = "∴";
-	var therefore = "∴";
-	var Therefore = "∴";
-	var Theta = "Θ";
-	var theta = "θ";
-	var thetasym = "ϑ";
-	var thetav = "ϑ";
-	var thickapprox = "≈";
-	var thicksim = "∼";
-	var ThickSpace = "  ";
-	var ThinSpace = " ";
-	var thinsp = " ";
-	var thkap = "≈";
-	var thksim = "∼";
-	var THORN = "Þ";
-	var thorn = "þ";
-	var tilde = "˜";
-	var Tilde = "∼";
-	var TildeEqual = "≃";
-	var TildeFullEqual = "≅";
-	var TildeTilde = "≈";
-	var timesbar = "⨱";
-	var timesb = "⊠";
-	var times = "×";
-	var timesd = "⨰";
-	var tint = "∭";
-	var toea = "⤨";
-	var topbot = "⌶";
-	var topcir = "⫱";
-	var top = "⊤";
-	var Topf = "𝕋";
-	var topf = "𝕥";
-	var topfork = "⫚";
-	var tosa = "⤩";
-	var tprime = "‴";
-	var trade = "™";
-	var TRADE = "™";
-	var triangle = "▵";
-	var triangledown = "▿";
-	var triangleleft = "◃";
-	var trianglelefteq = "⊴";
-	var triangleq = "≜";
-	var triangleright = "▹";
-	var trianglerighteq = "⊵";
-	var tridot = "◬";
-	var trie = "≜";
-	var triminus = "⨺";
-	var TripleDot = "⃛";
-	var triplus = "⨹";
-	var trisb = "⧍";
-	var tritime = "⨻";
-	var trpezium = "⏢";
-	var Tscr = "𝒯";
-	var tscr = "𝓉";
-	var TScy = "Ц";
-	var tscy = "ц";
-	var TSHcy = "Ћ";
-	var tshcy = "ћ";
-	var Tstrok = "Ŧ";
-	var tstrok = "ŧ";
-	var twixt = "≬";
-	var twoheadleftarrow = "↞";
-	var twoheadrightarrow = "↠";
-	var Uacute = "Ú";
-	var uacute = "ú";
-	var uarr = "↑";
-	var Uarr = "↟";
-	var uArr = "⇑";
-	var Uarrocir = "⥉";
-	var Ubrcy = "Ў";
-	var ubrcy = "ў";
-	var Ubreve = "Ŭ";
-	var ubreve = "ŭ";
-	var Ucirc = "Û";
-	var ucirc = "û";
-	var Ucy = "У";
-	var ucy = "у";
-	var udarr = "⇅";
-	var Udblac = "Ű";
-	var udblac = "ű";
-	var udhar = "⥮";
-	var ufisht = "⥾";
-	var Ufr = "𝔘";
-	var ufr = "𝔲";
-	var Ugrave = "Ù";
-	var ugrave = "ù";
-	var uHar = "⥣";
-	var uharl = "↿";
-	var uharr = "↾";
-	var uhblk = "▀";
-	var ulcorn = "⌜";
-	var ulcorner = "⌜";
-	var ulcrop = "⌏";
-	var ultri = "◸";
-	var Umacr = "Ū";
-	var umacr = "ū";
-	var uml = "¨";
-	var UnderBar = "_";
-	var UnderBrace = "⏟";
-	var UnderBracket = "⎵";
-	var UnderParenthesis = "⏝";
-	var Union = "⋃";
-	var UnionPlus = "⊎";
-	var Uogon = "Ų";
-	var uogon = "ų";
-	var Uopf = "𝕌";
-	var uopf = "𝕦";
-	var UpArrowBar = "⤒";
-	var uparrow = "↑";
-	var UpArrow = "↑";
-	var Uparrow = "⇑";
-	var UpArrowDownArrow = "⇅";
-	var updownarrow = "↕";
-	var UpDownArrow = "↕";
-	var Updownarrow = "⇕";
-	var UpEquilibrium = "⥮";
-	var upharpoonleft = "↿";
-	var upharpoonright = "↾";
-	var uplus = "⊎";
-	var UpperLeftArrow = "↖";
-	var UpperRightArrow = "↗";
-	var upsi = "υ";
-	var Upsi = "ϒ";
-	var upsih = "ϒ";
-	var Upsilon = "Υ";
-	var upsilon = "υ";
-	var UpTeeArrow = "↥";
-	var UpTee = "⊥";
-	var upuparrows = "⇈";
-	var urcorn = "⌝";
-	var urcorner = "⌝";
-	var urcrop = "⌎";
-	var Uring = "Ů";
-	var uring = "ů";
-	var urtri = "◹";
-	var Uscr = "𝒰";
-	var uscr = "𝓊";
-	var utdot = "⋰";
-	var Utilde = "Ũ";
-	var utilde = "ũ";
-	var utri = "▵";
-	var utrif = "▴";
-	var uuarr = "⇈";
-	var Uuml = "Ü";
-	var uuml = "ü";
-	var uwangle = "⦧";
-	var vangrt = "⦜";
-	var varepsilon = "ϵ";
-	var varkappa = "ϰ";
-	var varnothing = "∅";
-	var varphi = "ϕ";
-	var varpi = "ϖ";
-	var varpropto = "∝";
-	var varr = "↕";
-	var vArr = "⇕";
-	var varrho = "ϱ";
-	var varsigma = "ς";
-	var varsubsetneq = "⊊︀";
-	var varsubsetneqq = "⫋︀";
-	var varsupsetneq = "⊋︀";
-	var varsupsetneqq = "⫌︀";
-	var vartheta = "ϑ";
-	var vartriangleleft = "⊲";
-	var vartriangleright = "⊳";
-	var vBar = "⫨";
-	var Vbar = "⫫";
-	var vBarv = "⫩";
-	var Vcy = "В";
-	var vcy = "в";
-	var vdash = "⊢";
-	var vDash = "⊨";
-	var Vdash = "⊩";
-	var VDash = "⊫";
-	var Vdashl = "⫦";
-	var veebar = "⊻";
-	var vee = "∨";
-	var Vee = "⋁";
-	var veeeq = "≚";
-	var vellip = "⋮";
-	var verbar = "|";
-	var Verbar = "‖";
-	var vert = "|";
-	var Vert = "‖";
-	var VerticalBar = "∣";
-	var VerticalLine = "|";
-	var VerticalSeparator = "❘";
-	var VerticalTilde = "≀";
-	var VeryThinSpace = " ";
-	var Vfr = "𝔙";
-	var vfr = "𝔳";
-	var vltri = "⊲";
-	var vnsub = "⊂⃒";
-	var vnsup = "⊃⃒";
-	var Vopf = "𝕍";
-	var vopf = "𝕧";
-	var vprop = "∝";
-	var vrtri = "⊳";
-	var Vscr = "𝒱";
-	var vscr = "𝓋";
-	var vsubnE = "⫋︀";
-	var vsubne = "⊊︀";
-	var vsupnE = "⫌︀";
-	var vsupne = "⊋︀";
-	var Vvdash = "⊪";
-	var vzigzag = "⦚";
-	var Wcirc = "Ŵ";
-	var wcirc = "ŵ";
-	var wedbar = "⩟";
-	var wedge = "∧";
-	var Wedge = "⋀";
-	var wedgeq = "≙";
-	var weierp = "℘";
-	var Wfr = "𝔚";
-	var wfr = "𝔴";
-	var Wopf = "𝕎";
-	var wopf = "𝕨";
-	var wp = "℘";
-	var wr = "≀";
-	var wreath = "≀";
-	var Wscr = "𝒲";
-	var wscr = "𝓌";
-	var xcap = "⋂";
-	var xcirc = "◯";
-	var xcup = "⋃";
-	var xdtri = "▽";
-	var Xfr = "𝔛";
-	var xfr = "𝔵";
-	var xharr = "⟷";
-	var xhArr = "⟺";
-	var Xi = "Ξ";
-	var xi = "ξ";
-	var xlarr = "⟵";
-	var xlArr = "⟸";
-	var xmap = "⟼";
-	var xnis = "⋻";
-	var xodot = "⨀";
-	var Xopf = "𝕏";
-	var xopf = "𝕩";
-	var xoplus = "⨁";
-	var xotime = "⨂";
-	var xrarr = "⟶";
-	var xrArr = "⟹";
-	var Xscr = "𝒳";
-	var xscr = "𝓍";
-	var xsqcup = "⨆";
-	var xuplus = "⨄";
-	var xutri = "△";
-	var xvee = "⋁";
-	var xwedge = "⋀";
-	var Yacute = "Ý";
-	var yacute = "ý";
-	var YAcy = "Я";
-	var yacy = "я";
-	var Ycirc = "Ŷ";
-	var ycirc = "ŷ";
-	var Ycy = "Ы";
-	var ycy = "ы";
-	var yen = "¥";
-	var Yfr = "𝔜";
-	var yfr = "𝔶";
-	var YIcy = "Ї";
-	var yicy = "ї";
-	var Yopf = "𝕐";
-	var yopf = "𝕪";
-	var Yscr = "𝒴";
-	var yscr = "𝓎";
-	var YUcy = "Ю";
-	var yucy = "ю";
-	var yuml = "ÿ";
-	var Yuml = "Ÿ";
-	var Zacute = "Ź";
-	var zacute = "ź";
-	var Zcaron = "Ž";
-	var zcaron = "ž";
-	var Zcy = "З";
-	var zcy = "з";
-	var Zdot = "Ż";
-	var zdot = "ż";
-	var zeetrf = "ℨ";
-	var ZeroWidthSpace = "​";
-	var Zeta = "Ζ";
-	var zeta = "ζ";
-	var zfr = "𝔷";
-	var Zfr = "ℨ";
-	var ZHcy = "Ж";
-	var zhcy = "ж";
-	var zigrarr = "⇝";
-	var zopf = "𝕫";
-	var Zopf = "ℤ";
-	var Zscr = "𝒵";
-	var zscr = "𝓏";
-	var zwj = "‍";
-	var zwnj = "‌";
-	var entities = {
-		Aacute: Aacute,
-		aacute: aacute,
-		Abreve: Abreve,
-		abreve: abreve,
-		ac: ac,
-		acd: acd,
-		acE: acE,
-		Acirc: Acirc,
-		acirc: acirc,
-		acute: acute,
-		Acy: Acy,
-		acy: acy,
-		AElig: AElig,
-		aelig: aelig,
-		af: af,
-		Afr: Afr,
-		afr: afr,
-		Agrave: Agrave,
-		agrave: agrave,
-		alefsym: alefsym,
-		aleph: aleph,
-		Alpha: Alpha,
-		alpha: alpha,
-		Amacr: Amacr,
-		amacr: amacr,
-		amalg: amalg,
-		amp: amp,
-		AMP: AMP,
-		andand: andand,
-		And: And,
-		and: and,
-		andd: andd,
-		andslope: andslope,
-		andv: andv,
-		ang: ang,
-		ange: ange,
-		angle: angle,
-		angmsdaa: angmsdaa,
-		angmsdab: angmsdab,
-		angmsdac: angmsdac,
-		angmsdad: angmsdad,
-		angmsdae: angmsdae,
-		angmsdaf: angmsdaf,
-		angmsdag: angmsdag,
-		angmsdah: angmsdah,
-		angmsd: angmsd,
-		angrt: angrt,
-		angrtvb: angrtvb,
-		angrtvbd: angrtvbd,
-		angsph: angsph,
-		angst: angst,
-		angzarr: angzarr,
-		Aogon: Aogon,
-		aogon: aogon,
-		Aopf: Aopf,
-		aopf: aopf,
-		apacir: apacir,
-		ap: ap,
-		apE: apE,
-		ape: ape,
-		apid: apid,
-		apos: apos,
-		ApplyFunction: ApplyFunction,
-		approx: approx,
-		approxeq: approxeq,
-		Aring: Aring,
-		aring: aring,
-		Ascr: Ascr,
-		ascr: ascr,
-		Assign: Assign,
-		ast: ast,
-		asymp: asymp,
-		asympeq: asympeq,
-		Atilde: Atilde,
-		atilde: atilde,
-		Auml: Auml,
-		auml: auml,
-		awconint: awconint,
-		awint: awint,
-		backcong: backcong,
-		backepsilon: backepsilon,
-		backprime: backprime,
-		backsim: backsim,
-		backsimeq: backsimeq,
-		Backslash: Backslash,
-		Barv: Barv,
-		barvee: barvee,
-		barwed: barwed,
-		Barwed: Barwed,
-		barwedge: barwedge,
-		bbrk: bbrk,
-		bbrktbrk: bbrktbrk,
-		bcong: bcong,
-		Bcy: Bcy,
-		bcy: bcy,
-		bdquo: bdquo,
-		becaus: becaus,
-		because: because,
-		Because: Because,
-		bemptyv: bemptyv,
-		bepsi: bepsi,
-		bernou: bernou,
-		Bernoullis: Bernoullis,
-		Beta: Beta,
-		beta: beta,
-		beth: beth,
-		between: between,
-		Bfr: Bfr,
-		bfr: bfr,
-		bigcap: bigcap,
-		bigcirc: bigcirc,
-		bigcup: bigcup,
-		bigodot: bigodot,
-		bigoplus: bigoplus,
-		bigotimes: bigotimes,
-		bigsqcup: bigsqcup,
-		bigstar: bigstar,
-		bigtriangledown: bigtriangledown,
-		bigtriangleup: bigtriangleup,
-		biguplus: biguplus,
-		bigvee: bigvee,
-		bigwedge: bigwedge,
-		bkarow: bkarow,
-		blacklozenge: blacklozenge,
-		blacksquare: blacksquare,
-		blacktriangle: blacktriangle,
-		blacktriangledown: blacktriangledown,
-		blacktriangleleft: blacktriangleleft,
-		blacktriangleright: blacktriangleright,
-		blank: blank,
-		blk12: blk12,
-		blk14: blk14,
-		blk34: blk34,
-		block: block,
-		bne: bne,
-		bnequiv: bnequiv,
-		bNot: bNot,
-		bnot: bnot,
-		Bopf: Bopf,
-		bopf: bopf,
-		bot: bot,
-		bottom: bottom,
-		bowtie: bowtie,
-		boxbox: boxbox,
-		boxdl: boxdl,
-		boxdL: boxdL,
-		boxDl: boxDl,
-		boxDL: boxDL,
-		boxdr: boxdr,
-		boxdR: boxdR,
-		boxDr: boxDr,
-		boxDR: boxDR,
-		boxh: boxh,
-		boxH: boxH,
-		boxhd: boxhd,
-		boxHd: boxHd,
-		boxhD: boxhD,
-		boxHD: boxHD,
-		boxhu: boxhu,
-		boxHu: boxHu,
-		boxhU: boxhU,
-		boxHU: boxHU,
-		boxminus: boxminus,
-		boxplus: boxplus,
-		boxtimes: boxtimes,
-		boxul: boxul,
-		boxuL: boxuL,
-		boxUl: boxUl,
-		boxUL: boxUL,
-		boxur: boxur,
-		boxuR: boxuR,
-		boxUr: boxUr,
-		boxUR: boxUR,
-		boxv: boxv,
-		boxV: boxV,
-		boxvh: boxvh,
-		boxvH: boxvH,
-		boxVh: boxVh,
-		boxVH: boxVH,
-		boxvl: boxvl,
-		boxvL: boxvL,
-		boxVl: boxVl,
-		boxVL: boxVL,
-		boxvr: boxvr,
-		boxvR: boxvR,
-		boxVr: boxVr,
-		boxVR: boxVR,
-		bprime: bprime,
-		breve: breve,
-		Breve: Breve,
-		brvbar: brvbar,
-		bscr: bscr,
-		Bscr: Bscr,
-		bsemi: bsemi,
-		bsim: bsim,
-		bsime: bsime,
-		bsolb: bsolb,
-		bsol: bsol,
-		bsolhsub: bsolhsub,
-		bull: bull,
-		bullet: bullet,
-		bump: bump,
-		bumpE: bumpE,
-		bumpe: bumpe,
-		Bumpeq: Bumpeq,
-		bumpeq: bumpeq,
-		Cacute: Cacute,
-		cacute: cacute,
-		capand: capand,
-		capbrcup: capbrcup,
-		capcap: capcap,
-		cap: cap,
-		Cap: Cap,
-		capcup: capcup,
-		capdot: capdot,
-		CapitalDifferentialD: CapitalDifferentialD,
-		caps: caps,
-		caret: caret,
-		caron: caron,
-		Cayleys: Cayleys,
-		ccaps: ccaps,
-		Ccaron: Ccaron,
-		ccaron: ccaron,
-		Ccedil: Ccedil,
-		ccedil: ccedil,
-		Ccirc: Ccirc,
-		ccirc: ccirc,
-		Cconint: Cconint,
-		ccups: ccups,
-		ccupssm: ccupssm,
-		Cdot: Cdot,
-		cdot: cdot,
-		cedil: cedil,
-		Cedilla: Cedilla,
-		cemptyv: cemptyv,
-		cent: cent,
-		centerdot: centerdot,
-		CenterDot: CenterDot,
-		cfr: cfr,
-		Cfr: Cfr,
-		CHcy: CHcy,
-		chcy: chcy,
-		check: check,
-		checkmark: checkmark,
-		Chi: Chi,
-		chi: chi,
-		circ: circ,
-		circeq: circeq,
-		circlearrowleft: circlearrowleft,
-		circlearrowright: circlearrowright,
-		circledast: circledast,
-		circledcirc: circledcirc,
-		circleddash: circleddash,
-		CircleDot: CircleDot,
-		circledR: circledR,
-		circledS: circledS,
-		CircleMinus: CircleMinus,
-		CirclePlus: CirclePlus,
-		CircleTimes: CircleTimes,
-		cir: cir,
-		cirE: cirE,
-		cire: cire,
-		cirfnint: cirfnint,
-		cirmid: cirmid,
-		cirscir: cirscir,
-		ClockwiseContourIntegral: ClockwiseContourIntegral,
-		CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-		CloseCurlyQuote: CloseCurlyQuote,
-		clubs: clubs,
-		clubsuit: clubsuit,
-		colon: colon,
-		Colon: Colon,
-		Colone: Colone,
-		colone: colone,
-		coloneq: coloneq,
-		comma: comma,
-		commat: commat,
-		comp: comp,
-		compfn: compfn,
-		complement: complement,
-		complexes: complexes,
-		cong: cong,
-		congdot: congdot,
-		Congruent: Congruent,
-		conint: conint,
-		Conint: Conint,
-		ContourIntegral: ContourIntegral,
-		copf: copf,
-		Copf: Copf,
-		coprod: coprod,
-		Coproduct: Coproduct,
-		copy: copy,
-		COPY: COPY,
-		copysr: copysr,
-		CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-		crarr: crarr,
-		cross: cross,
-		Cross: Cross,
-		Cscr: Cscr,
-		cscr: cscr,
-		csub: csub,
-		csube: csube,
-		csup: csup,
-		csupe: csupe,
-		ctdot: ctdot,
-		cudarrl: cudarrl,
-		cudarrr: cudarrr,
-		cuepr: cuepr,
-		cuesc: cuesc,
-		cularr: cularr,
-		cularrp: cularrp,
-		cupbrcap: cupbrcap,
-		cupcap: cupcap,
-		CupCap: CupCap,
-		cup: cup,
-		Cup: Cup,
-		cupcup: cupcup,
-		cupdot: cupdot,
-		cupor: cupor,
-		cups: cups,
-		curarr: curarr,
-		curarrm: curarrm,
-		curlyeqprec: curlyeqprec,
-		curlyeqsucc: curlyeqsucc,
-		curlyvee: curlyvee,
-		curlywedge: curlywedge,
-		curren: curren,
-		curvearrowleft: curvearrowleft,
-		curvearrowright: curvearrowright,
-		cuvee: cuvee,
-		cuwed: cuwed,
-		cwconint: cwconint,
-		cwint: cwint,
-		cylcty: cylcty,
-		dagger: dagger,
-		Dagger: Dagger,
-		daleth: daleth,
-		darr: darr,
-		Darr: Darr,
-		dArr: dArr,
-		dash: dash,
-		Dashv: Dashv,
-		dashv: dashv,
-		dbkarow: dbkarow,
-		dblac: dblac,
-		Dcaron: Dcaron,
-		dcaron: dcaron,
-		Dcy: Dcy,
-		dcy: dcy,
-		ddagger: ddagger,
-		ddarr: ddarr,
-		DD: DD,
-		dd: dd,
-		DDotrahd: DDotrahd,
-		ddotseq: ddotseq,
-		deg: deg,
-		Del: Del,
-		Delta: Delta,
-		delta: delta,
-		demptyv: demptyv,
-		dfisht: dfisht,
-		Dfr: Dfr,
-		dfr: dfr,
-		dHar: dHar,
-		dharl: dharl,
-		dharr: dharr,
-		DiacriticalAcute: DiacriticalAcute,
-		DiacriticalDot: DiacriticalDot,
-		DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-		DiacriticalGrave: DiacriticalGrave,
-		DiacriticalTilde: DiacriticalTilde,
-		diam: diam,
-		diamond: diamond,
-		Diamond: Diamond,
-		diamondsuit: diamondsuit,
-		diams: diams,
-		die: die,
-		DifferentialD: DifferentialD,
-		digamma: digamma,
-		disin: disin,
-		div: div,
-		divide: divide,
-		divideontimes: divideontimes,
-		divonx: divonx,
-		DJcy: DJcy,
-		djcy: djcy,
-		dlcorn: dlcorn,
-		dlcrop: dlcrop,
-		dollar: dollar,
-		Dopf: Dopf,
-		dopf: dopf,
-		Dot: Dot,
-		dot: dot,
-		DotDot: DotDot,
-		doteq: doteq,
-		doteqdot: doteqdot,
-		DotEqual: DotEqual,
-		dotminus: dotminus,
-		dotplus: dotplus,
-		dotsquare: dotsquare,
-		doublebarwedge: doublebarwedge,
-		DoubleContourIntegral: DoubleContourIntegral,
-		DoubleDot: DoubleDot,
-		DoubleDownArrow: DoubleDownArrow,
-		DoubleLeftArrow: DoubleLeftArrow,
-		DoubleLeftRightArrow: DoubleLeftRightArrow,
-		DoubleLeftTee: DoubleLeftTee,
-		DoubleLongLeftArrow: DoubleLongLeftArrow,
-		DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-		DoubleLongRightArrow: DoubleLongRightArrow,
-		DoubleRightArrow: DoubleRightArrow,
-		DoubleRightTee: DoubleRightTee,
-		DoubleUpArrow: DoubleUpArrow,
-		DoubleUpDownArrow: DoubleUpDownArrow,
-		DoubleVerticalBar: DoubleVerticalBar,
-		DownArrowBar: DownArrowBar,
-		downarrow: downarrow,
-		DownArrow: DownArrow,
-		Downarrow: Downarrow,
-		DownArrowUpArrow: DownArrowUpArrow,
-		DownBreve: DownBreve,
-		downdownarrows: downdownarrows,
-		downharpoonleft: downharpoonleft,
-		downharpoonright: downharpoonright,
-		DownLeftRightVector: DownLeftRightVector,
-		DownLeftTeeVector: DownLeftTeeVector,
-		DownLeftVectorBar: DownLeftVectorBar,
-		DownLeftVector: DownLeftVector,
-		DownRightTeeVector: DownRightTeeVector,
-		DownRightVectorBar: DownRightVectorBar,
-		DownRightVector: DownRightVector,
-		DownTeeArrow: DownTeeArrow,
-		DownTee: DownTee,
-		drbkarow: drbkarow,
-		drcorn: drcorn,
-		drcrop: drcrop,
-		Dscr: Dscr,
-		dscr: dscr,
-		DScy: DScy,
-		dscy: dscy,
-		dsol: dsol,
-		Dstrok: Dstrok,
-		dstrok: dstrok,
-		dtdot: dtdot,
-		dtri: dtri,
-		dtrif: dtrif,
-		duarr: duarr,
-		duhar: duhar,
-		dwangle: dwangle,
-		DZcy: DZcy,
-		dzcy: dzcy,
-		dzigrarr: dzigrarr,
-		Eacute: Eacute,
-		eacute: eacute,
-		easter: easter,
-		Ecaron: Ecaron,
-		ecaron: ecaron,
-		Ecirc: Ecirc,
-		ecirc: ecirc,
-		ecir: ecir,
-		ecolon: ecolon,
-		Ecy: Ecy,
-		ecy: ecy,
-		eDDot: eDDot,
-		Edot: Edot,
-		edot: edot,
-		eDot: eDot,
-		ee: ee,
-		efDot: efDot,
-		Efr: Efr,
-		efr: efr,
-		eg: eg,
-		Egrave: Egrave,
-		egrave: egrave,
-		egs: egs,
-		egsdot: egsdot,
-		el: el,
-		Element: Element,
-		elinters: elinters,
-		ell: ell,
-		els: els,
-		elsdot: elsdot,
-		Emacr: Emacr,
-		emacr: emacr,
-		empty: empty,
-		emptyset: emptyset,
-		EmptySmallSquare: EmptySmallSquare,
-		emptyv: emptyv,
-		EmptyVerySmallSquare: EmptyVerySmallSquare,
-		emsp13: emsp13,
-		emsp14: emsp14,
-		emsp: emsp,
-		ENG: ENG,
-		eng: eng,
-		ensp: ensp,
-		Eogon: Eogon,
-		eogon: eogon,
-		Eopf: Eopf,
-		eopf: eopf,
-		epar: epar,
-		eparsl: eparsl,
-		eplus: eplus,
-		epsi: epsi,
-		Epsilon: Epsilon,
-		epsilon: epsilon,
-		epsiv: epsiv,
-		eqcirc: eqcirc,
-		eqcolon: eqcolon,
-		eqsim: eqsim,
-		eqslantgtr: eqslantgtr,
-		eqslantless: eqslantless,
-		Equal: Equal,
-		equals: equals,
-		EqualTilde: EqualTilde,
-		equest: equest,
-		Equilibrium: Equilibrium,
-		equiv: equiv,
-		equivDD: equivDD,
-		eqvparsl: eqvparsl,
-		erarr: erarr,
-		erDot: erDot,
-		escr: escr,
-		Escr: Escr,
-		esdot: esdot,
-		Esim: Esim,
-		esim: esim,
-		Eta: Eta,
-		eta: eta,
-		ETH: ETH,
-		eth: eth,
-		Euml: Euml,
-		euml: euml,
-		euro: euro,
-		excl: excl,
-		exist: exist,
-		Exists: Exists,
-		expectation: expectation,
-		exponentiale: exponentiale,
-		ExponentialE: ExponentialE,
-		fallingdotseq: fallingdotseq,
-		Fcy: Fcy,
-		fcy: fcy,
-		female: female,
-		ffilig: ffilig,
-		fflig: fflig,
-		ffllig: ffllig,
-		Ffr: Ffr,
-		ffr: ffr,
-		filig: filig,
-		FilledSmallSquare: FilledSmallSquare,
-		FilledVerySmallSquare: FilledVerySmallSquare,
-		fjlig: fjlig,
-		flat: flat,
-		fllig: fllig,
-		fltns: fltns,
-		fnof: fnof,
-		Fopf: Fopf,
-		fopf: fopf,
-		forall: forall,
-		ForAll: ForAll,
-		fork: fork,
-		forkv: forkv,
-		Fouriertrf: Fouriertrf,
-		fpartint: fpartint,
-		frac12: frac12,
-		frac13: frac13,
-		frac14: frac14,
-		frac15: frac15,
-		frac16: frac16,
-		frac18: frac18,
-		frac23: frac23,
-		frac25: frac25,
-		frac34: frac34,
-		frac35: frac35,
-		frac38: frac38,
-		frac45: frac45,
-		frac56: frac56,
-		frac58: frac58,
-		frac78: frac78,
-		frasl: frasl,
-		frown: frown,
-		fscr: fscr,
-		Fscr: Fscr,
-		gacute: gacute,
-		Gamma: Gamma,
-		gamma: gamma,
-		Gammad: Gammad,
-		gammad: gammad,
-		gap: gap,
-		Gbreve: Gbreve,
-		gbreve: gbreve,
-		Gcedil: Gcedil,
-		Gcirc: Gcirc,
-		gcirc: gcirc,
-		Gcy: Gcy,
-		gcy: gcy,
-		Gdot: Gdot,
-		gdot: gdot,
-		ge: ge,
-		gE: gE,
-		gEl: gEl,
-		gel: gel,
-		geq: geq,
-		geqq: geqq,
-		geqslant: geqslant,
-		gescc: gescc,
-		ges: ges,
-		gesdot: gesdot,
-		gesdoto: gesdoto,
-		gesdotol: gesdotol,
-		gesl: gesl,
-		gesles: gesles,
-		Gfr: Gfr,
-		gfr: gfr,
-		gg: gg,
-		Gg: Gg,
-		ggg: ggg,
-		gimel: gimel,
-		GJcy: GJcy,
-		gjcy: gjcy,
-		gla: gla,
-		gl: gl,
-		glE: glE,
-		glj: glj,
-		gnap: gnap,
-		gnapprox: gnapprox,
-		gne: gne,
-		gnE: gnE,
-		gneq: gneq,
-		gneqq: gneqq,
-		gnsim: gnsim,
-		Gopf: Gopf,
-		gopf: gopf,
-		grave: grave,
-		GreaterEqual: GreaterEqual,
-		GreaterEqualLess: GreaterEqualLess,
-		GreaterFullEqual: GreaterFullEqual,
-		GreaterGreater: GreaterGreater,
-		GreaterLess: GreaterLess,
-		GreaterSlantEqual: GreaterSlantEqual,
-		GreaterTilde: GreaterTilde,
-		Gscr: Gscr,
-		gscr: gscr,
-		gsim: gsim,
-		gsime: gsime,
-		gsiml: gsiml,
-		gtcc: gtcc,
-		gtcir: gtcir,
-		gt: gt,
-		GT: GT,
-		Gt: Gt,
-		gtdot: gtdot,
-		gtlPar: gtlPar,
-		gtquest: gtquest,
-		gtrapprox: gtrapprox,
-		gtrarr: gtrarr,
-		gtrdot: gtrdot,
-		gtreqless: gtreqless,
-		gtreqqless: gtreqqless,
-		gtrless: gtrless,
-		gtrsim: gtrsim,
-		gvertneqq: gvertneqq,
-		gvnE: gvnE,
-		Hacek: Hacek,
-		hairsp: hairsp,
-		half: half,
-		hamilt: hamilt,
-		HARDcy: HARDcy,
-		hardcy: hardcy,
-		harrcir: harrcir,
-		harr: harr,
-		hArr: hArr,
-		harrw: harrw,
-		Hat: Hat,
-		hbar: hbar,
-		Hcirc: Hcirc,
-		hcirc: hcirc,
-		hearts: hearts,
-		heartsuit: heartsuit,
-		hellip: hellip,
-		hercon: hercon,
-		hfr: hfr,
-		Hfr: Hfr,
-		HilbertSpace: HilbertSpace,
-		hksearow: hksearow,
-		hkswarow: hkswarow,
-		hoarr: hoarr,
-		homtht: homtht,
-		hookleftarrow: hookleftarrow,
-		hookrightarrow: hookrightarrow,
-		hopf: hopf,
-		Hopf: Hopf,
-		horbar: horbar,
-		HorizontalLine: HorizontalLine,
-		hscr: hscr,
-		Hscr: Hscr,
-		hslash: hslash,
-		Hstrok: Hstrok,
-		hstrok: hstrok,
-		HumpDownHump: HumpDownHump,
-		HumpEqual: HumpEqual,
-		hybull: hybull,
-		hyphen: hyphen,
-		Iacute: Iacute,
-		iacute: iacute,
-		ic: ic,
-		Icirc: Icirc,
-		icirc: icirc,
-		Icy: Icy,
-		icy: icy,
-		Idot: Idot,
-		IEcy: IEcy,
-		iecy: iecy,
-		iexcl: iexcl,
-		iff: iff,
-		ifr: ifr,
-		Ifr: Ifr,
-		Igrave: Igrave,
-		igrave: igrave,
-		ii: ii,
-		iiiint: iiiint,
-		iiint: iiint,
-		iinfin: iinfin,
-		iiota: iiota,
-		IJlig: IJlig,
-		ijlig: ijlig,
-		Imacr: Imacr,
-		imacr: imacr,
-		image: image,
-		ImaginaryI: ImaginaryI,
-		imagline: imagline,
-		imagpart: imagpart,
-		imath: imath,
-		Im: Im,
-		imof: imof,
-		imped: imped,
-		Implies: Implies,
-		incare: incare,
-		"in": "∈",
-		infin: infin,
-		infintie: infintie,
-		inodot: inodot,
-		intcal: intcal,
-		int: int,
-		Int: Int,
-		integers: integers,
-		Integral: Integral,
-		intercal: intercal,
-		Intersection: Intersection,
-		intlarhk: intlarhk,
-		intprod: intprod,
-		InvisibleComma: InvisibleComma,
-		InvisibleTimes: InvisibleTimes,
-		IOcy: IOcy,
-		iocy: iocy,
-		Iogon: Iogon,
-		iogon: iogon,
-		Iopf: Iopf,
-		iopf: iopf,
-		Iota: Iota,
-		iota: iota,
-		iprod: iprod,
-		iquest: iquest,
-		iscr: iscr,
-		Iscr: Iscr,
-		isin: isin,
-		isindot: isindot,
-		isinE: isinE,
-		isins: isins,
-		isinsv: isinsv,
-		isinv: isinv,
-		it: it,
-		Itilde: Itilde,
-		itilde: itilde,
-		Iukcy: Iukcy,
-		iukcy: iukcy,
-		Iuml: Iuml,
-		iuml: iuml,
-		Jcirc: Jcirc,
-		jcirc: jcirc,
-		Jcy: Jcy,
-		jcy: jcy,
-		Jfr: Jfr,
-		jfr: jfr,
-		jmath: jmath,
-		Jopf: Jopf,
-		jopf: jopf,
-		Jscr: Jscr,
-		jscr: jscr,
-		Jsercy: Jsercy,
-		jsercy: jsercy,
-		Jukcy: Jukcy,
-		jukcy: jukcy,
-		Kappa: Kappa,
-		kappa: kappa,
-		kappav: kappav,
-		Kcedil: Kcedil,
-		kcedil: kcedil,
-		Kcy: Kcy,
-		kcy: kcy,
-		Kfr: Kfr,
-		kfr: kfr,
-		kgreen: kgreen,
-		KHcy: KHcy,
-		khcy: khcy,
-		KJcy: KJcy,
-		kjcy: kjcy,
-		Kopf: Kopf,
-		kopf: kopf,
-		Kscr: Kscr,
-		kscr: kscr,
-		lAarr: lAarr,
-		Lacute: Lacute,
-		lacute: lacute,
-		laemptyv: laemptyv,
-		lagran: lagran,
-		Lambda: Lambda,
-		lambda: lambda,
-		lang: lang,
-		Lang: Lang,
-		langd: langd,
-		langle: langle,
-		lap: lap,
-		Laplacetrf: Laplacetrf,
-		laquo: laquo,
-		larrb: larrb,
-		larrbfs: larrbfs,
-		larr: larr,
-		Larr: Larr,
-		lArr: lArr,
-		larrfs: larrfs,
-		larrhk: larrhk,
-		larrlp: larrlp,
-		larrpl: larrpl,
-		larrsim: larrsim,
-		larrtl: larrtl,
-		latail: latail,
-		lAtail: lAtail,
-		lat: lat,
-		late: late,
-		lates: lates,
-		lbarr: lbarr,
-		lBarr: lBarr,
-		lbbrk: lbbrk,
-		lbrace: lbrace,
-		lbrack: lbrack,
-		lbrke: lbrke,
-		lbrksld: lbrksld,
-		lbrkslu: lbrkslu,
-		Lcaron: Lcaron,
-		lcaron: lcaron,
-		Lcedil: Lcedil,
-		lcedil: lcedil,
-		lceil: lceil,
-		lcub: lcub,
-		Lcy: Lcy,
-		lcy: lcy,
-		ldca: ldca,
-		ldquo: ldquo,
-		ldquor: ldquor,
-		ldrdhar: ldrdhar,
-		ldrushar: ldrushar,
-		ldsh: ldsh,
-		le: le,
-		lE: lE,
-		LeftAngleBracket: LeftAngleBracket,
-		LeftArrowBar: LeftArrowBar,
-		leftarrow: leftarrow,
-		LeftArrow: LeftArrow,
-		Leftarrow: Leftarrow,
-		LeftArrowRightArrow: LeftArrowRightArrow,
-		leftarrowtail: leftarrowtail,
-		LeftCeiling: LeftCeiling,
-		LeftDoubleBracket: LeftDoubleBracket,
-		LeftDownTeeVector: LeftDownTeeVector,
-		LeftDownVectorBar: LeftDownVectorBar,
-		LeftDownVector: LeftDownVector,
-		LeftFloor: LeftFloor,
-		leftharpoondown: leftharpoondown,
-		leftharpoonup: leftharpoonup,
-		leftleftarrows: leftleftarrows,
-		leftrightarrow: leftrightarrow,
-		LeftRightArrow: LeftRightArrow,
-		Leftrightarrow: Leftrightarrow,
-		leftrightarrows: leftrightarrows,
-		leftrightharpoons: leftrightharpoons,
-		leftrightsquigarrow: leftrightsquigarrow,
-		LeftRightVector: LeftRightVector,
-		LeftTeeArrow: LeftTeeArrow,
-		LeftTee: LeftTee,
-		LeftTeeVector: LeftTeeVector,
-		leftthreetimes: leftthreetimes,
-		LeftTriangleBar: LeftTriangleBar,
-		LeftTriangle: LeftTriangle,
-		LeftTriangleEqual: LeftTriangleEqual,
-		LeftUpDownVector: LeftUpDownVector,
-		LeftUpTeeVector: LeftUpTeeVector,
-		LeftUpVectorBar: LeftUpVectorBar,
-		LeftUpVector: LeftUpVector,
-		LeftVectorBar: LeftVectorBar,
-		LeftVector: LeftVector,
-		lEg: lEg,
-		leg: leg,
-		leq: leq,
-		leqq: leqq,
-		leqslant: leqslant,
-		lescc: lescc,
-		les: les,
-		lesdot: lesdot,
-		lesdoto: lesdoto,
-		lesdotor: lesdotor,
-		lesg: lesg,
-		lesges: lesges,
-		lessapprox: lessapprox,
-		lessdot: lessdot,
-		lesseqgtr: lesseqgtr,
-		lesseqqgtr: lesseqqgtr,
-		LessEqualGreater: LessEqualGreater,
-		LessFullEqual: LessFullEqual,
-		LessGreater: LessGreater,
-		lessgtr: lessgtr,
-		LessLess: LessLess,
-		lesssim: lesssim,
-		LessSlantEqual: LessSlantEqual,
-		LessTilde: LessTilde,
-		lfisht: lfisht,
-		lfloor: lfloor,
-		Lfr: Lfr,
-		lfr: lfr,
-		lg: lg,
-		lgE: lgE,
-		lHar: lHar,
-		lhard: lhard,
-		lharu: lharu,
-		lharul: lharul,
-		lhblk: lhblk,
-		LJcy: LJcy,
-		ljcy: ljcy,
-		llarr: llarr,
-		ll: ll,
-		Ll: Ll,
-		llcorner: llcorner,
-		Lleftarrow: Lleftarrow,
-		llhard: llhard,
-		lltri: lltri,
-		Lmidot: Lmidot,
-		lmidot: lmidot,
-		lmoustache: lmoustache,
-		lmoust: lmoust,
-		lnap: lnap,
-		lnapprox: lnapprox,
-		lne: lne,
-		lnE: lnE,
-		lneq: lneq,
-		lneqq: lneqq,
-		lnsim: lnsim,
-		loang: loang,
-		loarr: loarr,
-		lobrk: lobrk,
-		longleftarrow: longleftarrow,
-		LongLeftArrow: LongLeftArrow,
-		Longleftarrow: Longleftarrow,
-		longleftrightarrow: longleftrightarrow,
-		LongLeftRightArrow: LongLeftRightArrow,
-		Longleftrightarrow: Longleftrightarrow,
-		longmapsto: longmapsto,
-		longrightarrow: longrightarrow,
-		LongRightArrow: LongRightArrow,
-		Longrightarrow: Longrightarrow,
-		looparrowleft: looparrowleft,
-		looparrowright: looparrowright,
-		lopar: lopar,
-		Lopf: Lopf,
-		lopf: lopf,
-		loplus: loplus,
-		lotimes: lotimes,
-		lowast: lowast,
-		lowbar: lowbar,
-		LowerLeftArrow: LowerLeftArrow,
-		LowerRightArrow: LowerRightArrow,
-		loz: loz,
-		lozenge: lozenge,
-		lozf: lozf,
-		lpar: lpar,
-		lparlt: lparlt,
-		lrarr: lrarr,
-		lrcorner: lrcorner,
-		lrhar: lrhar,
-		lrhard: lrhard,
-		lrm: lrm,
-		lrtri: lrtri,
-		lsaquo: lsaquo,
-		lscr: lscr,
-		Lscr: Lscr,
-		lsh: lsh,
-		Lsh: Lsh,
-		lsim: lsim,
-		lsime: lsime,
-		lsimg: lsimg,
-		lsqb: lsqb,
-		lsquo: lsquo,
-		lsquor: lsquor,
-		Lstrok: Lstrok,
-		lstrok: lstrok,
-		ltcc: ltcc,
-		ltcir: ltcir,
-		lt: lt,
-		LT: LT,
-		Lt: Lt,
-		ltdot: ltdot,
-		lthree: lthree,
-		ltimes: ltimes,
-		ltlarr: ltlarr,
-		ltquest: ltquest,
-		ltri: ltri,
-		ltrie: ltrie,
-		ltrif: ltrif,
-		ltrPar: ltrPar,
-		lurdshar: lurdshar,
-		luruhar: luruhar,
-		lvertneqq: lvertneqq,
-		lvnE: lvnE,
-		macr: macr,
-		male: male,
-		malt: malt,
-		maltese: maltese,
-		"Map": "⤅",
-		map: map,
-		mapsto: mapsto,
-		mapstodown: mapstodown,
-		mapstoleft: mapstoleft,
-		mapstoup: mapstoup,
-		marker: marker,
-		mcomma: mcomma,
-		Mcy: Mcy,
-		mcy: mcy,
-		mdash: mdash,
-		mDDot: mDDot,
-		measuredangle: measuredangle,
-		MediumSpace: MediumSpace,
-		Mellintrf: Mellintrf,
-		Mfr: Mfr,
-		mfr: mfr,
-		mho: mho,
-		micro: micro,
-		midast: midast,
-		midcir: midcir,
-		mid: mid,
-		middot: middot,
-		minusb: minusb,
-		minus: minus,
-		minusd: minusd,
-		minusdu: minusdu,
-		MinusPlus: MinusPlus,
-		mlcp: mlcp,
-		mldr: mldr,
-		mnplus: mnplus,
-		models: models,
-		Mopf: Mopf,
-		mopf: mopf,
-		mp: mp,
-		mscr: mscr,
-		Mscr: Mscr,
-		mstpos: mstpos,
-		Mu: Mu,
-		mu: mu,
-		multimap: multimap,
-		mumap: mumap,
-		nabla: nabla,
-		Nacute: Nacute,
-		nacute: nacute,
-		nang: nang,
-		nap: nap,
-		napE: napE,
-		napid: napid,
-		napos: napos,
-		napprox: napprox,
-		natural: natural,
-		naturals: naturals,
-		natur: natur,
-		nbsp: nbsp,
-		nbump: nbump,
-		nbumpe: nbumpe,
-		ncap: ncap,
-		Ncaron: Ncaron,
-		ncaron: ncaron,
-		Ncedil: Ncedil,
-		ncedil: ncedil,
-		ncong: ncong,
-		ncongdot: ncongdot,
-		ncup: ncup,
-		Ncy: Ncy,
-		ncy: ncy,
-		ndash: ndash,
-		nearhk: nearhk,
-		nearr: nearr,
-		neArr: neArr,
-		nearrow: nearrow,
-		ne: ne,
-		nedot: nedot,
-		NegativeMediumSpace: NegativeMediumSpace,
-		NegativeThickSpace: NegativeThickSpace,
-		NegativeThinSpace: NegativeThinSpace,
-		NegativeVeryThinSpace: NegativeVeryThinSpace,
-		nequiv: nequiv,
-		nesear: nesear,
-		nesim: nesim,
-		NestedGreaterGreater: NestedGreaterGreater,
-		NestedLessLess: NestedLessLess,
-		NewLine: NewLine,
-		nexist: nexist,
-		nexists: nexists,
-		Nfr: Nfr,
-		nfr: nfr,
-		ngE: ngE,
-		nge: nge,
-		ngeq: ngeq,
-		ngeqq: ngeqq,
-		ngeqslant: ngeqslant,
-		nges: nges,
-		nGg: nGg,
-		ngsim: ngsim,
-		nGt: nGt,
-		ngt: ngt,
-		ngtr: ngtr,
-		nGtv: nGtv,
-		nharr: nharr,
-		nhArr: nhArr,
-		nhpar: nhpar,
-		ni: ni,
-		nis: nis,
-		nisd: nisd,
-		niv: niv,
-		NJcy: NJcy,
-		njcy: njcy,
-		nlarr: nlarr,
-		nlArr: nlArr,
-		nldr: nldr,
-		nlE: nlE,
-		nle: nle,
-		nleftarrow: nleftarrow,
-		nLeftarrow: nLeftarrow,
-		nleftrightarrow: nleftrightarrow,
-		nLeftrightarrow: nLeftrightarrow,
-		nleq: nleq,
-		nleqq: nleqq,
-		nleqslant: nleqslant,
-		nles: nles,
-		nless: nless,
-		nLl: nLl,
-		nlsim: nlsim,
-		nLt: nLt,
-		nlt: nlt,
-		nltri: nltri,
-		nltrie: nltrie,
-		nLtv: nLtv,
-		nmid: nmid,
-		NoBreak: NoBreak,
-		NonBreakingSpace: NonBreakingSpace,
-		nopf: nopf,
-		Nopf: Nopf,
-		Not: Not,
-		not: not,
-		NotCongruent: NotCongruent,
-		NotCupCap: NotCupCap,
-		NotDoubleVerticalBar: NotDoubleVerticalBar,
-		NotElement: NotElement,
-		NotEqual: NotEqual,
-		NotEqualTilde: NotEqualTilde,
-		NotExists: NotExists,
-		NotGreater: NotGreater,
-		NotGreaterEqual: NotGreaterEqual,
-		NotGreaterFullEqual: NotGreaterFullEqual,
-		NotGreaterGreater: NotGreaterGreater,
-		NotGreaterLess: NotGreaterLess,
-		NotGreaterSlantEqual: NotGreaterSlantEqual,
-		NotGreaterTilde: NotGreaterTilde,
-		NotHumpDownHump: NotHumpDownHump,
-		NotHumpEqual: NotHumpEqual,
-		notin: notin,
-		notindot: notindot,
-		notinE: notinE,
-		notinva: notinva,
-		notinvb: notinvb,
-		notinvc: notinvc,
-		NotLeftTriangleBar: NotLeftTriangleBar,
-		NotLeftTriangle: NotLeftTriangle,
-		NotLeftTriangleEqual: NotLeftTriangleEqual,
-		NotLess: NotLess,
-		NotLessEqual: NotLessEqual,
-		NotLessGreater: NotLessGreater,
-		NotLessLess: NotLessLess,
-		NotLessSlantEqual: NotLessSlantEqual,
-		NotLessTilde: NotLessTilde,
-		NotNestedGreaterGreater: NotNestedGreaterGreater,
-		NotNestedLessLess: NotNestedLessLess,
-		notni: notni,
-		notniva: notniva,
-		notnivb: notnivb,
-		notnivc: notnivc,
-		NotPrecedes: NotPrecedes,
-		NotPrecedesEqual: NotPrecedesEqual,
-		NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-		NotReverseElement: NotReverseElement,
-		NotRightTriangleBar: NotRightTriangleBar,
-		NotRightTriangle: NotRightTriangle,
-		NotRightTriangleEqual: NotRightTriangleEqual,
-		NotSquareSubset: NotSquareSubset,
-		NotSquareSubsetEqual: NotSquareSubsetEqual,
-		NotSquareSuperset: NotSquareSuperset,
-		NotSquareSupersetEqual: NotSquareSupersetEqual,
-		NotSubset: NotSubset,
-		NotSubsetEqual: NotSubsetEqual,
-		NotSucceeds: NotSucceeds,
-		NotSucceedsEqual: NotSucceedsEqual,
-		NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-		NotSucceedsTilde: NotSucceedsTilde,
-		NotSuperset: NotSuperset,
-		NotSupersetEqual: NotSupersetEqual,
-		NotTilde: NotTilde,
-		NotTildeEqual: NotTildeEqual,
-		NotTildeFullEqual: NotTildeFullEqual,
-		NotTildeTilde: NotTildeTilde,
-		NotVerticalBar: NotVerticalBar,
-		nparallel: nparallel,
-		npar: npar,
-		nparsl: nparsl,
-		npart: npart,
-		npolint: npolint,
-		npr: npr,
-		nprcue: nprcue,
-		nprec: nprec,
-		npreceq: npreceq,
-		npre: npre,
-		nrarrc: nrarrc,
-		nrarr: nrarr,
-		nrArr: nrArr,
-		nrarrw: nrarrw,
-		nrightarrow: nrightarrow,
-		nRightarrow: nRightarrow,
-		nrtri: nrtri,
-		nrtrie: nrtrie,
-		nsc: nsc,
-		nsccue: nsccue,
-		nsce: nsce,
-		Nscr: Nscr,
-		nscr: nscr,
-		nshortmid: nshortmid,
-		nshortparallel: nshortparallel,
-		nsim: nsim,
-		nsime: nsime,
-		nsimeq: nsimeq,
-		nsmid: nsmid,
-		nspar: nspar,
-		nsqsube: nsqsube,
-		nsqsupe: nsqsupe,
-		nsub: nsub,
-		nsubE: nsubE,
-		nsube: nsube,
-		nsubset: nsubset,
-		nsubseteq: nsubseteq,
-		nsubseteqq: nsubseteqq,
-		nsucc: nsucc,
-		nsucceq: nsucceq,
-		nsup: nsup,
-		nsupE: nsupE,
-		nsupe: nsupe,
-		nsupset: nsupset,
-		nsupseteq: nsupseteq,
-		nsupseteqq: nsupseteqq,
-		ntgl: ntgl,
-		Ntilde: Ntilde,
-		ntilde: ntilde,
-		ntlg: ntlg,
-		ntriangleleft: ntriangleleft,
-		ntrianglelefteq: ntrianglelefteq,
-		ntriangleright: ntriangleright,
-		ntrianglerighteq: ntrianglerighteq,
-		Nu: Nu,
-		nu: nu,
-		num: num,
-		numero: numero,
-		numsp: numsp,
-		nvap: nvap,
-		nvdash: nvdash,
-		nvDash: nvDash,
-		nVdash: nVdash,
-		nVDash: nVDash,
-		nvge: nvge,
-		nvgt: nvgt,
-		nvHarr: nvHarr,
-		nvinfin: nvinfin,
-		nvlArr: nvlArr,
-		nvle: nvle,
-		nvlt: nvlt,
-		nvltrie: nvltrie,
-		nvrArr: nvrArr,
-		nvrtrie: nvrtrie,
-		nvsim: nvsim,
-		nwarhk: nwarhk,
-		nwarr: nwarr,
-		nwArr: nwArr,
-		nwarrow: nwarrow,
-		nwnear: nwnear,
-		Oacute: Oacute,
-		oacute: oacute,
-		oast: oast,
-		Ocirc: Ocirc,
-		ocirc: ocirc,
-		ocir: ocir,
-		Ocy: Ocy,
-		ocy: ocy,
-		odash: odash,
-		Odblac: Odblac,
-		odblac: odblac,
-		odiv: odiv,
-		odot: odot,
-		odsold: odsold,
-		OElig: OElig,
-		oelig: oelig,
-		ofcir: ofcir,
-		Ofr: Ofr,
-		ofr: ofr,
-		ogon: ogon,
-		Ograve: Ograve,
-		ograve: ograve,
-		ogt: ogt,
-		ohbar: ohbar,
-		ohm: ohm,
-		oint: oint,
-		olarr: olarr,
-		olcir: olcir,
-		olcross: olcross,
-		oline: oline,
-		olt: olt,
-		Omacr: Omacr,
-		omacr: omacr,
-		Omega: Omega,
-		omega: omega,
-		Omicron: Omicron,
-		omicron: omicron,
-		omid: omid,
-		ominus: ominus,
-		Oopf: Oopf,
-		oopf: oopf,
-		opar: opar,
-		OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-		OpenCurlyQuote: OpenCurlyQuote,
-		operp: operp,
-		oplus: oplus,
-		orarr: orarr,
-		Or: Or,
-		or: or,
-		ord: ord,
-		order: order,
-		orderof: orderof,
-		ordf: ordf,
-		ordm: ordm,
-		origof: origof,
-		oror: oror,
-		orslope: orslope,
-		orv: orv,
-		oS: oS,
-		Oscr: Oscr,
-		oscr: oscr,
-		Oslash: Oslash,
-		oslash: oslash,
-		osol: osol,
-		Otilde: Otilde,
-		otilde: otilde,
-		otimesas: otimesas,
-		Otimes: Otimes,
-		otimes: otimes,
-		Ouml: Ouml,
-		ouml: ouml,
-		ovbar: ovbar,
-		OverBar: OverBar,
-		OverBrace: OverBrace,
-		OverBracket: OverBracket,
-		OverParenthesis: OverParenthesis,
-		para: para,
-		parallel: parallel,
-		par: par,
-		parsim: parsim,
-		parsl: parsl,
-		part: part,
-		PartialD: PartialD,
-		Pcy: Pcy,
-		pcy: pcy,
-		percnt: percnt,
-		period: period,
-		permil: permil,
-		perp: perp,
-		pertenk: pertenk,
-		Pfr: Pfr,
-		pfr: pfr,
-		Phi: Phi,
-		phi: phi,
-		phiv: phiv,
-		phmmat: phmmat,
-		phone: phone,
-		Pi: Pi,
-		pi: pi,
-		pitchfork: pitchfork,
-		piv: piv,
-		planck: planck,
-		planckh: planckh,
-		plankv: plankv,
-		plusacir: plusacir,
-		plusb: plusb,
-		pluscir: pluscir,
-		plus: plus,
-		plusdo: plusdo,
-		plusdu: plusdu,
-		pluse: pluse,
-		PlusMinus: PlusMinus,
-		plusmn: plusmn,
-		plussim: plussim,
-		plustwo: plustwo,
-		pm: pm,
-		Poincareplane: Poincareplane,
-		pointint: pointint,
-		popf: popf,
-		Popf: Popf,
-		pound: pound,
-		prap: prap,
-		Pr: Pr,
-		pr: pr,
-		prcue: prcue,
-		precapprox: precapprox,
-		prec: prec,
-		preccurlyeq: preccurlyeq,
-		Precedes: Precedes,
-		PrecedesEqual: PrecedesEqual,
-		PrecedesSlantEqual: PrecedesSlantEqual,
-		PrecedesTilde: PrecedesTilde,
-		preceq: preceq,
-		precnapprox: precnapprox,
-		precneqq: precneqq,
-		precnsim: precnsim,
-		pre: pre,
-		prE: prE,
-		precsim: precsim,
-		prime: prime,
-		Prime: Prime,
-		primes: primes,
-		prnap: prnap,
-		prnE: prnE,
-		prnsim: prnsim,
-		prod: prod,
-		Product: Product,
-		profalar: profalar,
-		profline: profline,
-		profsurf: profsurf,
-		prop: prop,
-		Proportional: Proportional,
-		Proportion: Proportion,
-		propto: propto,
-		prsim: prsim,
-		prurel: prurel,
-		Pscr: Pscr,
-		pscr: pscr,
-		Psi: Psi,
-		psi: psi,
-		puncsp: puncsp,
-		Qfr: Qfr,
-		qfr: qfr,
-		qint: qint,
-		qopf: qopf,
-		Qopf: Qopf,
-		qprime: qprime,
-		Qscr: Qscr,
-		qscr: qscr,
-		quaternions: quaternions,
-		quatint: quatint,
-		quest: quest,
-		questeq: questeq,
-		quot: quot,
-		QUOT: QUOT,
-		rAarr: rAarr,
-		race: race,
-		Racute: Racute,
-		racute: racute,
-		radic: radic,
-		raemptyv: raemptyv,
-		rang: rang,
-		Rang: Rang,
-		rangd: rangd,
-		range: range,
-		rangle: rangle,
-		raquo: raquo,
-		rarrap: rarrap,
-		rarrb: rarrb,
-		rarrbfs: rarrbfs,
-		rarrc: rarrc,
-		rarr: rarr,
-		Rarr: Rarr,
-		rArr: rArr,
-		rarrfs: rarrfs,
-		rarrhk: rarrhk,
-		rarrlp: rarrlp,
-		rarrpl: rarrpl,
-		rarrsim: rarrsim,
-		Rarrtl: Rarrtl,
-		rarrtl: rarrtl,
-		rarrw: rarrw,
-		ratail: ratail,
-		rAtail: rAtail,
-		ratio: ratio,
-		rationals: rationals,
-		rbarr: rbarr,
-		rBarr: rBarr,
-		RBarr: RBarr,
-		rbbrk: rbbrk,
-		rbrace: rbrace,
-		rbrack: rbrack,
-		rbrke: rbrke,
-		rbrksld: rbrksld,
-		rbrkslu: rbrkslu,
-		Rcaron: Rcaron,
-		rcaron: rcaron,
-		Rcedil: Rcedil,
-		rcedil: rcedil,
-		rceil: rceil,
-		rcub: rcub,
-		Rcy: Rcy,
-		rcy: rcy,
-		rdca: rdca,
-		rdldhar: rdldhar,
-		rdquo: rdquo,
-		rdquor: rdquor,
-		rdsh: rdsh,
-		real: real,
-		realine: realine,
-		realpart: realpart,
-		reals: reals,
-		Re: Re,
-		rect: rect,
-		reg: reg,
-		REG: REG,
-		ReverseElement: ReverseElement,
-		ReverseEquilibrium: ReverseEquilibrium,
-		ReverseUpEquilibrium: ReverseUpEquilibrium,
-		rfisht: rfisht,
-		rfloor: rfloor,
-		rfr: rfr,
-		Rfr: Rfr,
-		rHar: rHar,
-		rhard: rhard,
-		rharu: rharu,
-		rharul: rharul,
-		Rho: Rho,
-		rho: rho,
-		rhov: rhov,
-		RightAngleBracket: RightAngleBracket,
-		RightArrowBar: RightArrowBar,
-		rightarrow: rightarrow,
-		RightArrow: RightArrow,
-		Rightarrow: Rightarrow,
-		RightArrowLeftArrow: RightArrowLeftArrow,
-		rightarrowtail: rightarrowtail,
-		RightCeiling: RightCeiling,
-		RightDoubleBracket: RightDoubleBracket,
-		RightDownTeeVector: RightDownTeeVector,
-		RightDownVectorBar: RightDownVectorBar,
-		RightDownVector: RightDownVector,
-		RightFloor: RightFloor,
-		rightharpoondown: rightharpoondown,
-		rightharpoonup: rightharpoonup,
-		rightleftarrows: rightleftarrows,
-		rightleftharpoons: rightleftharpoons,
-		rightrightarrows: rightrightarrows,
-		rightsquigarrow: rightsquigarrow,
-		RightTeeArrow: RightTeeArrow,
-		RightTee: RightTee,
-		RightTeeVector: RightTeeVector,
-		rightthreetimes: rightthreetimes,
-		RightTriangleBar: RightTriangleBar,
-		RightTriangle: RightTriangle,
-		RightTriangleEqual: RightTriangleEqual,
-		RightUpDownVector: RightUpDownVector,
-		RightUpTeeVector: RightUpTeeVector,
-		RightUpVectorBar: RightUpVectorBar,
-		RightUpVector: RightUpVector,
-		RightVectorBar: RightVectorBar,
-		RightVector: RightVector,
-		ring: ring,
-		risingdotseq: risingdotseq,
-		rlarr: rlarr,
-		rlhar: rlhar,
-		rlm: rlm,
-		rmoustache: rmoustache,
-		rmoust: rmoust,
-		rnmid: rnmid,
-		roang: roang,
-		roarr: roarr,
-		robrk: robrk,
-		ropar: ropar,
-		ropf: ropf,
-		Ropf: Ropf,
-		roplus: roplus,
-		rotimes: rotimes,
-		RoundImplies: RoundImplies,
-		rpar: rpar,
-		rpargt: rpargt,
-		rppolint: rppolint,
-		rrarr: rrarr,
-		Rrightarrow: Rrightarrow,
-		rsaquo: rsaquo,
-		rscr: rscr,
-		Rscr: Rscr,
-		rsh: rsh,
-		Rsh: Rsh,
-		rsqb: rsqb,
-		rsquo: rsquo,
-		rsquor: rsquor,
-		rthree: rthree,
-		rtimes: rtimes,
-		rtri: rtri,
-		rtrie: rtrie,
-		rtrif: rtrif,
-		rtriltri: rtriltri,
-		RuleDelayed: RuleDelayed,
-		ruluhar: ruluhar,
-		rx: rx,
-		Sacute: Sacute,
-		sacute: sacute,
-		sbquo: sbquo,
-		scap: scap,
-		Scaron: Scaron,
-		scaron: scaron,
-		Sc: Sc,
-		sc: sc,
-		sccue: sccue,
-		sce: sce,
-		scE: scE,
-		Scedil: Scedil,
-		scedil: scedil,
-		Scirc: Scirc,
-		scirc: scirc,
-		scnap: scnap,
-		scnE: scnE,
-		scnsim: scnsim,
-		scpolint: scpolint,
-		scsim: scsim,
-		Scy: Scy,
-		scy: scy,
-		sdotb: sdotb,
-		sdot: sdot,
-		sdote: sdote,
-		searhk: searhk,
-		searr: searr,
-		seArr: seArr,
-		searrow: searrow,
-		sect: sect,
-		semi: semi,
-		seswar: seswar,
-		setminus: setminus,
-		setmn: setmn,
-		sext: sext,
-		Sfr: Sfr,
-		sfr: sfr,
-		sfrown: sfrown,
-		sharp: sharp,
-		SHCHcy: SHCHcy,
-		shchcy: shchcy,
-		SHcy: SHcy,
-		shcy: shcy,
-		ShortDownArrow: ShortDownArrow,
-		ShortLeftArrow: ShortLeftArrow,
-		shortmid: shortmid,
-		shortparallel: shortparallel,
-		ShortRightArrow: ShortRightArrow,
-		ShortUpArrow: ShortUpArrow,
-		shy: shy,
-		Sigma: Sigma,
-		sigma: sigma,
-		sigmaf: sigmaf,
-		sigmav: sigmav,
-		sim: sim,
-		simdot: simdot,
-		sime: sime,
-		simeq: simeq,
-		simg: simg,
-		simgE: simgE,
-		siml: siml,
-		simlE: simlE,
-		simne: simne,
-		simplus: simplus,
-		simrarr: simrarr,
-		slarr: slarr,
-		SmallCircle: SmallCircle,
-		smallsetminus: smallsetminus,
-		smashp: smashp,
-		smeparsl: smeparsl,
-		smid: smid,
-		smile: smile,
-		smt: smt,
-		smte: smte,
-		smtes: smtes,
-		SOFTcy: SOFTcy,
-		softcy: softcy,
-		solbar: solbar,
-		solb: solb,
-		sol: sol,
-		Sopf: Sopf,
-		sopf: sopf,
-		spades: spades,
-		spadesuit: spadesuit,
-		spar: spar,
-		sqcap: sqcap,
-		sqcaps: sqcaps,
-		sqcup: sqcup,
-		sqcups: sqcups,
-		Sqrt: Sqrt,
-		sqsub: sqsub,
-		sqsube: sqsube,
-		sqsubset: sqsubset,
-		sqsubseteq: sqsubseteq,
-		sqsup: sqsup,
-		sqsupe: sqsupe,
-		sqsupset: sqsupset,
-		sqsupseteq: sqsupseteq,
-		square: square,
-		Square: Square,
-		SquareIntersection: SquareIntersection,
-		SquareSubset: SquareSubset,
-		SquareSubsetEqual: SquareSubsetEqual,
-		SquareSuperset: SquareSuperset,
-		SquareSupersetEqual: SquareSupersetEqual,
-		SquareUnion: SquareUnion,
-		squarf: squarf,
-		squ: squ,
-		squf: squf,
-		srarr: srarr,
-		Sscr: Sscr,
-		sscr: sscr,
-		ssetmn: ssetmn,
-		ssmile: ssmile,
-		sstarf: sstarf,
-		Star: Star,
-		star: star,
-		starf: starf,
-		straightepsilon: straightepsilon,
-		straightphi: straightphi,
-		strns: strns,
-		sub: sub,
-		Sub: Sub,
-		subdot: subdot,
-		subE: subE,
-		sube: sube,
-		subedot: subedot,
-		submult: submult,
-		subnE: subnE,
-		subne: subne,
-		subplus: subplus,
-		subrarr: subrarr,
-		subset: subset,
-		Subset: Subset,
-		subseteq: subseteq,
-		subseteqq: subseteqq,
-		SubsetEqual: SubsetEqual,
-		subsetneq: subsetneq,
-		subsetneqq: subsetneqq,
-		subsim: subsim,
-		subsub: subsub,
-		subsup: subsup,
-		succapprox: succapprox,
-		succ: succ,
-		succcurlyeq: succcurlyeq,
-		Succeeds: Succeeds,
-		SucceedsEqual: SucceedsEqual,
-		SucceedsSlantEqual: SucceedsSlantEqual,
-		SucceedsTilde: SucceedsTilde,
-		succeq: succeq,
-		succnapprox: succnapprox,
-		succneqq: succneqq,
-		succnsim: succnsim,
-		succsim: succsim,
-		SuchThat: SuchThat,
-		sum: sum,
-		Sum: Sum,
-		sung: sung,
-		sup1: sup1,
-		sup2: sup2,
-		sup3: sup3,
-		sup: sup,
-		Sup: Sup,
-		supdot: supdot,
-		supdsub: supdsub,
-		supE: supE,
-		supe: supe,
-		supedot: supedot,
-		Superset: Superset,
-		SupersetEqual: SupersetEqual,
-		suphsol: suphsol,
-		suphsub: suphsub,
-		suplarr: suplarr,
-		supmult: supmult,
-		supnE: supnE,
-		supne: supne,
-		supplus: supplus,
-		supset: supset,
-		Supset: Supset,
-		supseteq: supseteq,
-		supseteqq: supseteqq,
-		supsetneq: supsetneq,
-		supsetneqq: supsetneqq,
-		supsim: supsim,
-		supsub: supsub,
-		supsup: supsup,
-		swarhk: swarhk,
-		swarr: swarr,
-		swArr: swArr,
-		swarrow: swarrow,
-		swnwar: swnwar,
-		szlig: szlig,
-		Tab: Tab,
-		target: target,
-		Tau: Tau,
-		tau: tau,
-		tbrk: tbrk,
-		Tcaron: Tcaron,
-		tcaron: tcaron,
-		Tcedil: Tcedil,
-		tcedil: tcedil,
-		Tcy: Tcy,
-		tcy: tcy,
-		tdot: tdot,
-		telrec: telrec,
-		Tfr: Tfr,
-		tfr: tfr,
-		there4: there4,
-		therefore: therefore,
-		Therefore: Therefore,
-		Theta: Theta,
-		theta: theta,
-		thetasym: thetasym,
-		thetav: thetav,
-		thickapprox: thickapprox,
-		thicksim: thicksim,
-		ThickSpace: ThickSpace,
-		ThinSpace: ThinSpace,
-		thinsp: thinsp,
-		thkap: thkap,
-		thksim: thksim,
-		THORN: THORN,
-		thorn: thorn,
-		tilde: tilde,
-		Tilde: Tilde,
-		TildeEqual: TildeEqual,
-		TildeFullEqual: TildeFullEqual,
-		TildeTilde: TildeTilde,
-		timesbar: timesbar,
-		timesb: timesb,
-		times: times,
-		timesd: timesd,
-		tint: tint,
-		toea: toea,
-		topbot: topbot,
-		topcir: topcir,
-		top: top,
-		Topf: Topf,
-		topf: topf,
-		topfork: topfork,
-		tosa: tosa,
-		tprime: tprime,
-		trade: trade,
-		TRADE: TRADE,
-		triangle: triangle,
-		triangledown: triangledown,
-		triangleleft: triangleleft,
-		trianglelefteq: trianglelefteq,
-		triangleq: triangleq,
-		triangleright: triangleright,
-		trianglerighteq: trianglerighteq,
-		tridot: tridot,
-		trie: trie,
-		triminus: triminus,
-		TripleDot: TripleDot,
-		triplus: triplus,
-		trisb: trisb,
-		tritime: tritime,
-		trpezium: trpezium,
-		Tscr: Tscr,
-		tscr: tscr,
-		TScy: TScy,
-		tscy: tscy,
-		TSHcy: TSHcy,
-		tshcy: tshcy,
-		Tstrok: Tstrok,
-		tstrok: tstrok,
-		twixt: twixt,
-		twoheadleftarrow: twoheadleftarrow,
-		twoheadrightarrow: twoheadrightarrow,
-		Uacute: Uacute,
-		uacute: uacute,
-		uarr: uarr,
-		Uarr: Uarr,
-		uArr: uArr,
-		Uarrocir: Uarrocir,
-		Ubrcy: Ubrcy,
-		ubrcy: ubrcy,
-		Ubreve: Ubreve,
-		ubreve: ubreve,
-		Ucirc: Ucirc,
-		ucirc: ucirc,
-		Ucy: Ucy,
-		ucy: ucy,
-		udarr: udarr,
-		Udblac: Udblac,
-		udblac: udblac,
-		udhar: udhar,
-		ufisht: ufisht,
-		Ufr: Ufr,
-		ufr: ufr,
-		Ugrave: Ugrave,
-		ugrave: ugrave,
-		uHar: uHar,
-		uharl: uharl,
-		uharr: uharr,
-		uhblk: uhblk,
-		ulcorn: ulcorn,
-		ulcorner: ulcorner,
-		ulcrop: ulcrop,
-		ultri: ultri,
-		Umacr: Umacr,
-		umacr: umacr,
-		uml: uml,
-		UnderBar: UnderBar,
-		UnderBrace: UnderBrace,
-		UnderBracket: UnderBracket,
-		UnderParenthesis: UnderParenthesis,
-		Union: Union,
-		UnionPlus: UnionPlus,
-		Uogon: Uogon,
-		uogon: uogon,
-		Uopf: Uopf,
-		uopf: uopf,
-		UpArrowBar: UpArrowBar,
-		uparrow: uparrow,
-		UpArrow: UpArrow,
-		Uparrow: Uparrow,
-		UpArrowDownArrow: UpArrowDownArrow,
-		updownarrow: updownarrow,
-		UpDownArrow: UpDownArrow,
-		Updownarrow: Updownarrow,
-		UpEquilibrium: UpEquilibrium,
-		upharpoonleft: upharpoonleft,
-		upharpoonright: upharpoonright,
-		uplus: uplus,
-		UpperLeftArrow: UpperLeftArrow,
-		UpperRightArrow: UpperRightArrow,
-		upsi: upsi,
-		Upsi: Upsi,
-		upsih: upsih,
-		Upsilon: Upsilon,
-		upsilon: upsilon,
-		UpTeeArrow: UpTeeArrow,
-		UpTee: UpTee,
-		upuparrows: upuparrows,
-		urcorn: urcorn,
-		urcorner: urcorner,
-		urcrop: urcrop,
-		Uring: Uring,
-		uring: uring,
-		urtri: urtri,
-		Uscr: Uscr,
-		uscr: uscr,
-		utdot: utdot,
-		Utilde: Utilde,
-		utilde: utilde,
-		utri: utri,
-		utrif: utrif,
-		uuarr: uuarr,
-		Uuml: Uuml,
-		uuml: uuml,
-		uwangle: uwangle,
-		vangrt: vangrt,
-		varepsilon: varepsilon,
-		varkappa: varkappa,
-		varnothing: varnothing,
-		varphi: varphi,
-		varpi: varpi,
-		varpropto: varpropto,
-		varr: varr,
-		vArr: vArr,
-		varrho: varrho,
-		varsigma: varsigma,
-		varsubsetneq: varsubsetneq,
-		varsubsetneqq: varsubsetneqq,
-		varsupsetneq: varsupsetneq,
-		varsupsetneqq: varsupsetneqq,
-		vartheta: vartheta,
-		vartriangleleft: vartriangleleft,
-		vartriangleright: vartriangleright,
-		vBar: vBar,
-		Vbar: Vbar,
-		vBarv: vBarv,
-		Vcy: Vcy,
-		vcy: vcy,
-		vdash: vdash,
-		vDash: vDash,
-		Vdash: Vdash,
-		VDash: VDash,
-		Vdashl: Vdashl,
-		veebar: veebar,
-		vee: vee,
-		Vee: Vee,
-		veeeq: veeeq,
-		vellip: vellip,
-		verbar: verbar,
-		Verbar: Verbar,
-		vert: vert,
-		Vert: Vert,
-		VerticalBar: VerticalBar,
-		VerticalLine: VerticalLine,
-		VerticalSeparator: VerticalSeparator,
-		VerticalTilde: VerticalTilde,
-		VeryThinSpace: VeryThinSpace,
-		Vfr: Vfr,
-		vfr: vfr,
-		vltri: vltri,
-		vnsub: vnsub,
-		vnsup: vnsup,
-		Vopf: Vopf,
-		vopf: vopf,
-		vprop: vprop,
-		vrtri: vrtri,
-		Vscr: Vscr,
-		vscr: vscr,
-		vsubnE: vsubnE,
-		vsubne: vsubne,
-		vsupnE: vsupnE,
-		vsupne: vsupne,
-		Vvdash: Vvdash,
-		vzigzag: vzigzag,
-		Wcirc: Wcirc,
-		wcirc: wcirc,
-		wedbar: wedbar,
-		wedge: wedge,
-		Wedge: Wedge,
-		wedgeq: wedgeq,
-		weierp: weierp,
-		Wfr: Wfr,
-		wfr: wfr,
-		Wopf: Wopf,
-		wopf: wopf,
-		wp: wp,
-		wr: wr,
-		wreath: wreath,
-		Wscr: Wscr,
-		wscr: wscr,
-		xcap: xcap,
-		xcirc: xcirc,
-		xcup: xcup,
-		xdtri: xdtri,
-		Xfr: Xfr,
-		xfr: xfr,
-		xharr: xharr,
-		xhArr: xhArr,
-		Xi: Xi,
-		xi: xi,
-		xlarr: xlarr,
-		xlArr: xlArr,
-		xmap: xmap,
-		xnis: xnis,
-		xodot: xodot,
-		Xopf: Xopf,
-		xopf: xopf,
-		xoplus: xoplus,
-		xotime: xotime,
-		xrarr: xrarr,
-		xrArr: xrArr,
-		Xscr: Xscr,
-		xscr: xscr,
-		xsqcup: xsqcup,
-		xuplus: xuplus,
-		xutri: xutri,
-		xvee: xvee,
-		xwedge: xwedge,
-		Yacute: Yacute,
-		yacute: yacute,
-		YAcy: YAcy,
-		yacy: yacy,
-		Ycirc: Ycirc,
-		ycirc: ycirc,
-		Ycy: Ycy,
-		ycy: ycy,
-		yen: yen,
-		Yfr: Yfr,
-		yfr: yfr,
-		YIcy: YIcy,
-		yicy: yicy,
-		Yopf: Yopf,
-		yopf: yopf,
-		Yscr: Yscr,
-		yscr: yscr,
-		YUcy: YUcy,
-		yucy: yucy,
-		yuml: yuml,
-		Yuml: Yuml,
-		Zacute: Zacute,
-		zacute: zacute,
-		Zcaron: Zcaron,
-		zcaron: zcaron,
-		Zcy: Zcy,
-		zcy: zcy,
-		Zdot: Zdot,
-		zdot: zdot,
-		zeetrf: zeetrf,
-		ZeroWidthSpace: ZeroWidthSpace,
-		Zeta: Zeta,
-		zeta: zeta,
-		zfr: zfr,
-		Zfr: Zfr,
-		ZHcy: ZHcy,
-		zhcy: zhcy,
-		zigrarr: zigrarr,
-		zopf: zopf,
-		Zopf: Zopf,
-		Zscr: Zscr,
-		zscr: zscr,
-		zwj: zwj,
-		zwnj: zwnj
-	};
-
-	var entities$1 = {
-		__proto__: null,
-		Aacute: Aacute,
-		aacute: aacute,
-		Abreve: Abreve,
-		abreve: abreve,
-		ac: ac,
-		acd: acd,
-		acE: acE,
-		Acirc: Acirc,
-		acirc: acirc,
-		acute: acute,
-		Acy: Acy,
-		acy: acy,
-		AElig: AElig,
-		aelig: aelig,
-		af: af,
-		Afr: Afr,
-		afr: afr,
-		Agrave: Agrave,
-		agrave: agrave,
-		alefsym: alefsym,
-		aleph: aleph,
-		Alpha: Alpha,
-		alpha: alpha,
-		Amacr: Amacr,
-		amacr: amacr,
-		amalg: amalg,
-		amp: amp,
-		AMP: AMP,
-		andand: andand,
-		And: And,
-		and: and,
-		andd: andd,
-		andslope: andslope,
-		andv: andv,
-		ang: ang,
-		ange: ange,
-		angle: angle,
-		angmsdaa: angmsdaa,
-		angmsdab: angmsdab,
-		angmsdac: angmsdac,
-		angmsdad: angmsdad,
-		angmsdae: angmsdae,
-		angmsdaf: angmsdaf,
-		angmsdag: angmsdag,
-		angmsdah: angmsdah,
-		angmsd: angmsd,
-		angrt: angrt,
-		angrtvb: angrtvb,
-		angrtvbd: angrtvbd,
-		angsph: angsph,
-		angst: angst,
-		angzarr: angzarr,
-		Aogon: Aogon,
-		aogon: aogon,
-		Aopf: Aopf,
-		aopf: aopf,
-		apacir: apacir,
-		ap: ap,
-		apE: apE,
-		ape: ape,
-		apid: apid,
-		apos: apos,
-		ApplyFunction: ApplyFunction,
-		approx: approx,
-		approxeq: approxeq,
-		Aring: Aring,
-		aring: aring,
-		Ascr: Ascr,
-		ascr: ascr,
-		Assign: Assign,
-		ast: ast,
-		asymp: asymp,
-		asympeq: asympeq,
-		Atilde: Atilde,
-		atilde: atilde,
-		Auml: Auml,
-		auml: auml,
-		awconint: awconint,
-		awint: awint,
-		backcong: backcong,
-		backepsilon: backepsilon,
-		backprime: backprime,
-		backsim: backsim,
-		backsimeq: backsimeq,
-		Backslash: Backslash,
-		Barv: Barv,
-		barvee: barvee,
-		barwed: barwed,
-		Barwed: Barwed,
-		barwedge: barwedge,
-		bbrk: bbrk,
-		bbrktbrk: bbrktbrk,
-		bcong: bcong,
-		Bcy: Bcy,
-		bcy: bcy,
-		bdquo: bdquo,
-		becaus: becaus,
-		because: because,
-		Because: Because,
-		bemptyv: bemptyv,
-		bepsi: bepsi,
-		bernou: bernou,
-		Bernoullis: Bernoullis,
-		Beta: Beta,
-		beta: beta,
-		beth: beth,
-		between: between,
-		Bfr: Bfr,
-		bfr: bfr,
-		bigcap: bigcap,
-		bigcirc: bigcirc,
-		bigcup: bigcup,
-		bigodot: bigodot,
-		bigoplus: bigoplus,
-		bigotimes: bigotimes,
-		bigsqcup: bigsqcup,
-		bigstar: bigstar,
-		bigtriangledown: bigtriangledown,
-		bigtriangleup: bigtriangleup,
-		biguplus: biguplus,
-		bigvee: bigvee,
-		bigwedge: bigwedge,
-		bkarow: bkarow,
-		blacklozenge: blacklozenge,
-		blacksquare: blacksquare,
-		blacktriangle: blacktriangle,
-		blacktriangledown: blacktriangledown,
-		blacktriangleleft: blacktriangleleft,
-		blacktriangleright: blacktriangleright,
-		blank: blank,
-		blk12: blk12,
-		blk14: blk14,
-		blk34: blk34,
-		block: block,
-		bne: bne,
-		bnequiv: bnequiv,
-		bNot: bNot,
-		bnot: bnot,
-		Bopf: Bopf,
-		bopf: bopf,
-		bot: bot,
-		bottom: bottom,
-		bowtie: bowtie,
-		boxbox: boxbox,
-		boxdl: boxdl,
-		boxdL: boxdL,
-		boxDl: boxDl,
-		boxDL: boxDL,
-		boxdr: boxdr,
-		boxdR: boxdR,
-		boxDr: boxDr,
-		boxDR: boxDR,
-		boxh: boxh,
-		boxH: boxH,
-		boxhd: boxhd,
-		boxHd: boxHd,
-		boxhD: boxhD,
-		boxHD: boxHD,
-		boxhu: boxhu,
-		boxHu: boxHu,
-		boxhU: boxhU,
-		boxHU: boxHU,
-		boxminus: boxminus,
-		boxplus: boxplus,
-		boxtimes: boxtimes,
-		boxul: boxul,
-		boxuL: boxuL,
-		boxUl: boxUl,
-		boxUL: boxUL,
-		boxur: boxur,
-		boxuR: boxuR,
-		boxUr: boxUr,
-		boxUR: boxUR,
-		boxv: boxv,
-		boxV: boxV,
-		boxvh: boxvh,
-		boxvH: boxvH,
-		boxVh: boxVh,
-		boxVH: boxVH,
-		boxvl: boxvl,
-		boxvL: boxvL,
-		boxVl: boxVl,
-		boxVL: boxVL,
-		boxvr: boxvr,
-		boxvR: boxvR,
-		boxVr: boxVr,
-		boxVR: boxVR,
-		bprime: bprime,
-		breve: breve,
-		Breve: Breve,
-		brvbar: brvbar,
-		bscr: bscr,
-		Bscr: Bscr,
-		bsemi: bsemi,
-		bsim: bsim,
-		bsime: bsime,
-		bsolb: bsolb,
-		bsol: bsol,
-		bsolhsub: bsolhsub,
-		bull: bull,
-		bullet: bullet,
-		bump: bump,
-		bumpE: bumpE,
-		bumpe: bumpe,
-		Bumpeq: Bumpeq,
-		bumpeq: bumpeq,
-		Cacute: Cacute,
-		cacute: cacute,
-		capand: capand,
-		capbrcup: capbrcup,
-		capcap: capcap,
-		cap: cap,
-		Cap: Cap,
-		capcup: capcup,
-		capdot: capdot,
-		CapitalDifferentialD: CapitalDifferentialD,
-		caps: caps,
-		caret: caret,
-		caron: caron,
-		Cayleys: Cayleys,
-		ccaps: ccaps,
-		Ccaron: Ccaron,
-		ccaron: ccaron,
-		Ccedil: Ccedil,
-		ccedil: ccedil,
-		Ccirc: Ccirc,
-		ccirc: ccirc,
-		Cconint: Cconint,
-		ccups: ccups,
-		ccupssm: ccupssm,
-		Cdot: Cdot,
-		cdot: cdot,
-		cedil: cedil,
-		Cedilla: Cedilla,
-		cemptyv: cemptyv,
-		cent: cent,
-		centerdot: centerdot,
-		CenterDot: CenterDot,
-		cfr: cfr,
-		Cfr: Cfr,
-		CHcy: CHcy,
-		chcy: chcy,
-		check: check,
-		checkmark: checkmark,
-		Chi: Chi,
-		chi: chi,
-		circ: circ,
-		circeq: circeq,
-		circlearrowleft: circlearrowleft,
-		circlearrowright: circlearrowright,
-		circledast: circledast,
-		circledcirc: circledcirc,
-		circleddash: circleddash,
-		CircleDot: CircleDot,
-		circledR: circledR,
-		circledS: circledS,
-		CircleMinus: CircleMinus,
-		CirclePlus: CirclePlus,
-		CircleTimes: CircleTimes,
-		cir: cir,
-		cirE: cirE,
-		cire: cire,
-		cirfnint: cirfnint,
-		cirmid: cirmid,
-		cirscir: cirscir,
-		ClockwiseContourIntegral: ClockwiseContourIntegral,
-		CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
-		CloseCurlyQuote: CloseCurlyQuote,
-		clubs: clubs,
-		clubsuit: clubsuit,
-		colon: colon,
-		Colon: Colon,
-		Colone: Colone,
-		colone: colone,
-		coloneq: coloneq,
-		comma: comma,
-		commat: commat,
-		comp: comp,
-		compfn: compfn,
-		complement: complement,
-		complexes: complexes,
-		cong: cong,
-		congdot: congdot,
-		Congruent: Congruent,
-		conint: conint,
-		Conint: Conint,
-		ContourIntegral: ContourIntegral,
-		copf: copf,
-		Copf: Copf,
-		coprod: coprod,
-		Coproduct: Coproduct,
-		copy: copy,
-		COPY: COPY,
-		copysr: copysr,
-		CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
-		crarr: crarr,
-		cross: cross,
-		Cross: Cross,
-		Cscr: Cscr,
-		cscr: cscr,
-		csub: csub,
-		csube: csube,
-		csup: csup,
-		csupe: csupe,
-		ctdot: ctdot,
-		cudarrl: cudarrl,
-		cudarrr: cudarrr,
-		cuepr: cuepr,
-		cuesc: cuesc,
-		cularr: cularr,
-		cularrp: cularrp,
-		cupbrcap: cupbrcap,
-		cupcap: cupcap,
-		CupCap: CupCap,
-		cup: cup,
-		Cup: Cup,
-		cupcup: cupcup,
-		cupdot: cupdot,
-		cupor: cupor,
-		cups: cups,
-		curarr: curarr,
-		curarrm: curarrm,
-		curlyeqprec: curlyeqprec,
-		curlyeqsucc: curlyeqsucc,
-		curlyvee: curlyvee,
-		curlywedge: curlywedge,
-		curren: curren,
-		curvearrowleft: curvearrowleft,
-		curvearrowright: curvearrowright,
-		cuvee: cuvee,
-		cuwed: cuwed,
-		cwconint: cwconint,
-		cwint: cwint,
-		cylcty: cylcty,
-		dagger: dagger,
-		Dagger: Dagger,
-		daleth: daleth,
-		darr: darr,
-		Darr: Darr,
-		dArr: dArr,
-		dash: dash,
-		Dashv: Dashv,
-		dashv: dashv,
-		dbkarow: dbkarow,
-		dblac: dblac,
-		Dcaron: Dcaron,
-		dcaron: dcaron,
-		Dcy: Dcy,
-		dcy: dcy,
-		ddagger: ddagger,
-		ddarr: ddarr,
-		DD: DD,
-		dd: dd,
-		DDotrahd: DDotrahd,
-		ddotseq: ddotseq,
-		deg: deg,
-		Del: Del,
-		Delta: Delta,
-		delta: delta,
-		demptyv: demptyv,
-		dfisht: dfisht,
-		Dfr: Dfr,
-		dfr: dfr,
-		dHar: dHar,
-		dharl: dharl,
-		dharr: dharr,
-		DiacriticalAcute: DiacriticalAcute,
-		DiacriticalDot: DiacriticalDot,
-		DiacriticalDoubleAcute: DiacriticalDoubleAcute,
-		DiacriticalGrave: DiacriticalGrave,
-		DiacriticalTilde: DiacriticalTilde,
-		diam: diam,
-		diamond: diamond,
-		Diamond: Diamond,
-		diamondsuit: diamondsuit,
-		diams: diams,
-		die: die,
-		DifferentialD: DifferentialD,
-		digamma: digamma,
-		disin: disin,
-		div: div,
-		divide: divide,
-		divideontimes: divideontimes,
-		divonx: divonx,
-		DJcy: DJcy,
-		djcy: djcy,
-		dlcorn: dlcorn,
-		dlcrop: dlcrop,
-		dollar: dollar,
-		Dopf: Dopf,
-		dopf: dopf,
-		Dot: Dot,
-		dot: dot,
-		DotDot: DotDot,
-		doteq: doteq,
-		doteqdot: doteqdot,
-		DotEqual: DotEqual,
-		dotminus: dotminus,
-		dotplus: dotplus,
-		dotsquare: dotsquare,
-		doublebarwedge: doublebarwedge,
-		DoubleContourIntegral: DoubleContourIntegral,
-		DoubleDot: DoubleDot,
-		DoubleDownArrow: DoubleDownArrow,
-		DoubleLeftArrow: DoubleLeftArrow,
-		DoubleLeftRightArrow: DoubleLeftRightArrow,
-		DoubleLeftTee: DoubleLeftTee,
-		DoubleLongLeftArrow: DoubleLongLeftArrow,
-		DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
-		DoubleLongRightArrow: DoubleLongRightArrow,
-		DoubleRightArrow: DoubleRightArrow,
-		DoubleRightTee: DoubleRightTee,
-		DoubleUpArrow: DoubleUpArrow,
-		DoubleUpDownArrow: DoubleUpDownArrow,
-		DoubleVerticalBar: DoubleVerticalBar,
-		DownArrowBar: DownArrowBar,
-		downarrow: downarrow,
-		DownArrow: DownArrow,
-		Downarrow: Downarrow,
-		DownArrowUpArrow: DownArrowUpArrow,
-		DownBreve: DownBreve,
-		downdownarrows: downdownarrows,
-		downharpoonleft: downharpoonleft,
-		downharpoonright: downharpoonright,
-		DownLeftRightVector: DownLeftRightVector,
-		DownLeftTeeVector: DownLeftTeeVector,
-		DownLeftVectorBar: DownLeftVectorBar,
-		DownLeftVector: DownLeftVector,
-		DownRightTeeVector: DownRightTeeVector,
-		DownRightVectorBar: DownRightVectorBar,
-		DownRightVector: DownRightVector,
-		DownTeeArrow: DownTeeArrow,
-		DownTee: DownTee,
-		drbkarow: drbkarow,
-		drcorn: drcorn,
-		drcrop: drcrop,
-		Dscr: Dscr,
-		dscr: dscr,
-		DScy: DScy,
-		dscy: dscy,
-		dsol: dsol,
-		Dstrok: Dstrok,
-		dstrok: dstrok,
-		dtdot: dtdot,
-		dtri: dtri,
-		dtrif: dtrif,
-		duarr: duarr,
-		duhar: duhar,
-		dwangle: dwangle,
-		DZcy: DZcy,
-		dzcy: dzcy,
-		dzigrarr: dzigrarr,
-		Eacute: Eacute,
-		eacute: eacute,
-		easter: easter,
-		Ecaron: Ecaron,
-		ecaron: ecaron,
-		Ecirc: Ecirc,
-		ecirc: ecirc,
-		ecir: ecir,
-		ecolon: ecolon,
-		Ecy: Ecy,
-		ecy: ecy,
-		eDDot: eDDot,
-		Edot: Edot,
-		edot: edot,
-		eDot: eDot,
-		ee: ee,
-		efDot: efDot,
-		Efr: Efr,
-		efr: efr,
-		eg: eg,
-		Egrave: Egrave,
-		egrave: egrave,
-		egs: egs,
-		egsdot: egsdot,
-		el: el,
-		Element: Element,
-		elinters: elinters,
-		ell: ell,
-		els: els,
-		elsdot: elsdot,
-		Emacr: Emacr,
-		emacr: emacr,
-		empty: empty,
-		emptyset: emptyset,
-		EmptySmallSquare: EmptySmallSquare,
-		emptyv: emptyv,
-		EmptyVerySmallSquare: EmptyVerySmallSquare,
-		emsp13: emsp13,
-		emsp14: emsp14,
-		emsp: emsp,
-		ENG: ENG,
-		eng: eng,
-		ensp: ensp,
-		Eogon: Eogon,
-		eogon: eogon,
-		Eopf: Eopf,
-		eopf: eopf,
-		epar: epar,
-		eparsl: eparsl,
-		eplus: eplus,
-		epsi: epsi,
-		Epsilon: Epsilon,
-		epsilon: epsilon,
-		epsiv: epsiv,
-		eqcirc: eqcirc,
-		eqcolon: eqcolon,
-		eqsim: eqsim,
-		eqslantgtr: eqslantgtr,
-		eqslantless: eqslantless,
-		Equal: Equal,
-		equals: equals,
-		EqualTilde: EqualTilde,
-		equest: equest,
-		Equilibrium: Equilibrium,
-		equiv: equiv,
-		equivDD: equivDD,
-		eqvparsl: eqvparsl,
-		erarr: erarr,
-		erDot: erDot,
-		escr: escr,
-		Escr: Escr,
-		esdot: esdot,
-		Esim: Esim,
-		esim: esim,
-		Eta: Eta,
-		eta: eta,
-		ETH: ETH,
-		eth: eth,
-		Euml: Euml,
-		euml: euml,
-		euro: euro,
-		excl: excl,
-		exist: exist,
-		Exists: Exists,
-		expectation: expectation,
-		exponentiale: exponentiale,
-		ExponentialE: ExponentialE,
-		fallingdotseq: fallingdotseq,
-		Fcy: Fcy,
-		fcy: fcy,
-		female: female,
-		ffilig: ffilig,
-		fflig: fflig,
-		ffllig: ffllig,
-		Ffr: Ffr,
-		ffr: ffr,
-		filig: filig,
-		FilledSmallSquare: FilledSmallSquare,
-		FilledVerySmallSquare: FilledVerySmallSquare,
-		fjlig: fjlig,
-		flat: flat,
-		fllig: fllig,
-		fltns: fltns,
-		fnof: fnof,
-		Fopf: Fopf,
-		fopf: fopf,
-		forall: forall,
-		ForAll: ForAll,
-		fork: fork,
-		forkv: forkv,
-		Fouriertrf: Fouriertrf,
-		fpartint: fpartint,
-		frac12: frac12,
-		frac13: frac13,
-		frac14: frac14,
-		frac15: frac15,
-		frac16: frac16,
-		frac18: frac18,
-		frac23: frac23,
-		frac25: frac25,
-		frac34: frac34,
-		frac35: frac35,
-		frac38: frac38,
-		frac45: frac45,
-		frac56: frac56,
-		frac58: frac58,
-		frac78: frac78,
-		frasl: frasl,
-		frown: frown,
-		fscr: fscr,
-		Fscr: Fscr,
-		gacute: gacute,
-		Gamma: Gamma,
-		gamma: gamma,
-		Gammad: Gammad,
-		gammad: gammad,
-		gap: gap,
-		Gbreve: Gbreve,
-		gbreve: gbreve,
-		Gcedil: Gcedil,
-		Gcirc: Gcirc,
-		gcirc: gcirc,
-		Gcy: Gcy,
-		gcy: gcy,
-		Gdot: Gdot,
-		gdot: gdot,
-		ge: ge,
-		gE: gE,
-		gEl: gEl,
-		gel: gel,
-		geq: geq,
-		geqq: geqq,
-		geqslant: geqslant,
-		gescc: gescc,
-		ges: ges,
-		gesdot: gesdot,
-		gesdoto: gesdoto,
-		gesdotol: gesdotol,
-		gesl: gesl,
-		gesles: gesles,
-		Gfr: Gfr,
-		gfr: gfr,
-		gg: gg,
-		Gg: Gg,
-		ggg: ggg,
-		gimel: gimel,
-		GJcy: GJcy,
-		gjcy: gjcy,
-		gla: gla,
-		gl: gl,
-		glE: glE,
-		glj: glj,
-		gnap: gnap,
-		gnapprox: gnapprox,
-		gne: gne,
-		gnE: gnE,
-		gneq: gneq,
-		gneqq: gneqq,
-		gnsim: gnsim,
-		Gopf: Gopf,
-		gopf: gopf,
-		grave: grave,
-		GreaterEqual: GreaterEqual,
-		GreaterEqualLess: GreaterEqualLess,
-		GreaterFullEqual: GreaterFullEqual,
-		GreaterGreater: GreaterGreater,
-		GreaterLess: GreaterLess,
-		GreaterSlantEqual: GreaterSlantEqual,
-		GreaterTilde: GreaterTilde,
-		Gscr: Gscr,
-		gscr: gscr,
-		gsim: gsim,
-		gsime: gsime,
-		gsiml: gsiml,
-		gtcc: gtcc,
-		gtcir: gtcir,
-		gt: gt,
-		GT: GT,
-		Gt: Gt,
-		gtdot: gtdot,
-		gtlPar: gtlPar,
-		gtquest: gtquest,
-		gtrapprox: gtrapprox,
-		gtrarr: gtrarr,
-		gtrdot: gtrdot,
-		gtreqless: gtreqless,
-		gtreqqless: gtreqqless,
-		gtrless: gtrless,
-		gtrsim: gtrsim,
-		gvertneqq: gvertneqq,
-		gvnE: gvnE,
-		Hacek: Hacek,
-		hairsp: hairsp,
-		half: half,
-		hamilt: hamilt,
-		HARDcy: HARDcy,
-		hardcy: hardcy,
-		harrcir: harrcir,
-		harr: harr,
-		hArr: hArr,
-		harrw: harrw,
-		Hat: Hat,
-		hbar: hbar,
-		Hcirc: Hcirc,
-		hcirc: hcirc,
-		hearts: hearts,
-		heartsuit: heartsuit,
-		hellip: hellip,
-		hercon: hercon,
-		hfr: hfr,
-		Hfr: Hfr,
-		HilbertSpace: HilbertSpace,
-		hksearow: hksearow,
-		hkswarow: hkswarow,
-		hoarr: hoarr,
-		homtht: homtht,
-		hookleftarrow: hookleftarrow,
-		hookrightarrow: hookrightarrow,
-		hopf: hopf,
-		Hopf: Hopf,
-		horbar: horbar,
-		HorizontalLine: HorizontalLine,
-		hscr: hscr,
-		Hscr: Hscr,
-		hslash: hslash,
-		Hstrok: Hstrok,
-		hstrok: hstrok,
-		HumpDownHump: HumpDownHump,
-		HumpEqual: HumpEqual,
-		hybull: hybull,
-		hyphen: hyphen,
-		Iacute: Iacute,
-		iacute: iacute,
-		ic: ic,
-		Icirc: Icirc,
-		icirc: icirc,
-		Icy: Icy,
-		icy: icy,
-		Idot: Idot,
-		IEcy: IEcy,
-		iecy: iecy,
-		iexcl: iexcl,
-		iff: iff,
-		ifr: ifr,
-		Ifr: Ifr,
-		Igrave: Igrave,
-		igrave: igrave,
-		ii: ii,
-		iiiint: iiiint,
-		iiint: iiint,
-		iinfin: iinfin,
-		iiota: iiota,
-		IJlig: IJlig,
-		ijlig: ijlig,
-		Imacr: Imacr,
-		imacr: imacr,
-		image: image,
-		ImaginaryI: ImaginaryI,
-		imagline: imagline,
-		imagpart: imagpart,
-		imath: imath,
-		Im: Im,
-		imof: imof,
-		imped: imped,
-		Implies: Implies,
-		incare: incare,
-		infin: infin,
-		infintie: infintie,
-		inodot: inodot,
-		intcal: intcal,
-		int: int,
-		Int: Int,
-		integers: integers,
-		Integral: Integral,
-		intercal: intercal,
-		Intersection: Intersection,
-		intlarhk: intlarhk,
-		intprod: intprod,
-		InvisibleComma: InvisibleComma,
-		InvisibleTimes: InvisibleTimes,
-		IOcy: IOcy,
-		iocy: iocy,
-		Iogon: Iogon,
-		iogon: iogon,
-		Iopf: Iopf,
-		iopf: iopf,
-		Iota: Iota,
-		iota: iota,
-		iprod: iprod,
-		iquest: iquest,
-		iscr: iscr,
-		Iscr: Iscr,
-		isin: isin,
-		isindot: isindot,
-		isinE: isinE,
-		isins: isins,
-		isinsv: isinsv,
-		isinv: isinv,
-		it: it,
-		Itilde: Itilde,
-		itilde: itilde,
-		Iukcy: Iukcy,
-		iukcy: iukcy,
-		Iuml: Iuml,
-		iuml: iuml,
-		Jcirc: Jcirc,
-		jcirc: jcirc,
-		Jcy: Jcy,
-		jcy: jcy,
-		Jfr: Jfr,
-		jfr: jfr,
-		jmath: jmath,
-		Jopf: Jopf,
-		jopf: jopf,
-		Jscr: Jscr,
-		jscr: jscr,
-		Jsercy: Jsercy,
-		jsercy: jsercy,
-		Jukcy: Jukcy,
-		jukcy: jukcy,
-		Kappa: Kappa,
-		kappa: kappa,
-		kappav: kappav,
-		Kcedil: Kcedil,
-		kcedil: kcedil,
-		Kcy: Kcy,
-		kcy: kcy,
-		Kfr: Kfr,
-		kfr: kfr,
-		kgreen: kgreen,
-		KHcy: KHcy,
-		khcy: khcy,
-		KJcy: KJcy,
-		kjcy: kjcy,
-		Kopf: Kopf,
-		kopf: kopf,
-		Kscr: Kscr,
-		kscr: kscr,
-		lAarr: lAarr,
-		Lacute: Lacute,
-		lacute: lacute,
-		laemptyv: laemptyv,
-		lagran: lagran,
-		Lambda: Lambda,
-		lambda: lambda,
-		lang: lang,
-		Lang: Lang,
-		langd: langd,
-		langle: langle,
-		lap: lap,
-		Laplacetrf: Laplacetrf,
-		laquo: laquo,
-		larrb: larrb,
-		larrbfs: larrbfs,
-		larr: larr,
-		Larr: Larr,
-		lArr: lArr,
-		larrfs: larrfs,
-		larrhk: larrhk,
-		larrlp: larrlp,
-		larrpl: larrpl,
-		larrsim: larrsim,
-		larrtl: larrtl,
-		latail: latail,
-		lAtail: lAtail,
-		lat: lat,
-		late: late,
-		lates: lates,
-		lbarr: lbarr,
-		lBarr: lBarr,
-		lbbrk: lbbrk,
-		lbrace: lbrace,
-		lbrack: lbrack,
-		lbrke: lbrke,
-		lbrksld: lbrksld,
-		lbrkslu: lbrkslu,
-		Lcaron: Lcaron,
-		lcaron: lcaron,
-		Lcedil: Lcedil,
-		lcedil: lcedil,
-		lceil: lceil,
-		lcub: lcub,
-		Lcy: Lcy,
-		lcy: lcy,
-		ldca: ldca,
-		ldquo: ldquo,
-		ldquor: ldquor,
-		ldrdhar: ldrdhar,
-		ldrushar: ldrushar,
-		ldsh: ldsh,
-		le: le,
-		lE: lE,
-		LeftAngleBracket: LeftAngleBracket,
-		LeftArrowBar: LeftArrowBar,
-		leftarrow: leftarrow,
-		LeftArrow: LeftArrow,
-		Leftarrow: Leftarrow,
-		LeftArrowRightArrow: LeftArrowRightArrow,
-		leftarrowtail: leftarrowtail,
-		LeftCeiling: LeftCeiling,
-		LeftDoubleBracket: LeftDoubleBracket,
-		LeftDownTeeVector: LeftDownTeeVector,
-		LeftDownVectorBar: LeftDownVectorBar,
-		LeftDownVector: LeftDownVector,
-		LeftFloor: LeftFloor,
-		leftharpoondown: leftharpoondown,
-		leftharpoonup: leftharpoonup,
-		leftleftarrows: leftleftarrows,
-		leftrightarrow: leftrightarrow,
-		LeftRightArrow: LeftRightArrow,
-		Leftrightarrow: Leftrightarrow,
-		leftrightarrows: leftrightarrows,
-		leftrightharpoons: leftrightharpoons,
-		leftrightsquigarrow: leftrightsquigarrow,
-		LeftRightVector: LeftRightVector,
-		LeftTeeArrow: LeftTeeArrow,
-		LeftTee: LeftTee,
-		LeftTeeVector: LeftTeeVector,
-		leftthreetimes: leftthreetimes,
-		LeftTriangleBar: LeftTriangleBar,
-		LeftTriangle: LeftTriangle,
-		LeftTriangleEqual: LeftTriangleEqual,
-		LeftUpDownVector: LeftUpDownVector,
-		LeftUpTeeVector: LeftUpTeeVector,
-		LeftUpVectorBar: LeftUpVectorBar,
-		LeftUpVector: LeftUpVector,
-		LeftVectorBar: LeftVectorBar,
-		LeftVector: LeftVector,
-		lEg: lEg,
-		leg: leg,
-		leq: leq,
-		leqq: leqq,
-		leqslant: leqslant,
-		lescc: lescc,
-		les: les,
-		lesdot: lesdot,
-		lesdoto: lesdoto,
-		lesdotor: lesdotor,
-		lesg: lesg,
-		lesges: lesges,
-		lessapprox: lessapprox,
-		lessdot: lessdot,
-		lesseqgtr: lesseqgtr,
-		lesseqqgtr: lesseqqgtr,
-		LessEqualGreater: LessEqualGreater,
-		LessFullEqual: LessFullEqual,
-		LessGreater: LessGreater,
-		lessgtr: lessgtr,
-		LessLess: LessLess,
-		lesssim: lesssim,
-		LessSlantEqual: LessSlantEqual,
-		LessTilde: LessTilde,
-		lfisht: lfisht,
-		lfloor: lfloor,
-		Lfr: Lfr,
-		lfr: lfr,
-		lg: lg,
-		lgE: lgE,
-		lHar: lHar,
-		lhard: lhard,
-		lharu: lharu,
-		lharul: lharul,
-		lhblk: lhblk,
-		LJcy: LJcy,
-		ljcy: ljcy,
-		llarr: llarr,
-		ll: ll,
-		Ll: Ll,
-		llcorner: llcorner,
-		Lleftarrow: Lleftarrow,
-		llhard: llhard,
-		lltri: lltri,
-		Lmidot: Lmidot,
-		lmidot: lmidot,
-		lmoustache: lmoustache,
-		lmoust: lmoust,
-		lnap: lnap,
-		lnapprox: lnapprox,
-		lne: lne,
-		lnE: lnE,
-		lneq: lneq,
-		lneqq: lneqq,
-		lnsim: lnsim,
-		loang: loang,
-		loarr: loarr,
-		lobrk: lobrk,
-		longleftarrow: longleftarrow,
-		LongLeftArrow: LongLeftArrow,
-		Longleftarrow: Longleftarrow,
-		longleftrightarrow: longleftrightarrow,
-		LongLeftRightArrow: LongLeftRightArrow,
-		Longleftrightarrow: Longleftrightarrow,
-		longmapsto: longmapsto,
-		longrightarrow: longrightarrow,
-		LongRightArrow: LongRightArrow,
-		Longrightarrow: Longrightarrow,
-		looparrowleft: looparrowleft,
-		looparrowright: looparrowright,
-		lopar: lopar,
-		Lopf: Lopf,
-		lopf: lopf,
-		loplus: loplus,
-		lotimes: lotimes,
-		lowast: lowast,
-		lowbar: lowbar,
-		LowerLeftArrow: LowerLeftArrow,
-		LowerRightArrow: LowerRightArrow,
-		loz: loz,
-		lozenge: lozenge,
-		lozf: lozf,
-		lpar: lpar,
-		lparlt: lparlt,
-		lrarr: lrarr,
-		lrcorner: lrcorner,
-		lrhar: lrhar,
-		lrhard: lrhard,
-		lrm: lrm,
-		lrtri: lrtri,
-		lsaquo: lsaquo,
-		lscr: lscr,
-		Lscr: Lscr,
-		lsh: lsh,
-		Lsh: Lsh,
-		lsim: lsim,
-		lsime: lsime,
-		lsimg: lsimg,
-		lsqb: lsqb,
-		lsquo: lsquo,
-		lsquor: lsquor,
-		Lstrok: Lstrok,
-		lstrok: lstrok,
-		ltcc: ltcc,
-		ltcir: ltcir,
-		lt: lt,
-		LT: LT,
-		Lt: Lt,
-		ltdot: ltdot,
-		lthree: lthree,
-		ltimes: ltimes,
-		ltlarr: ltlarr,
-		ltquest: ltquest,
-		ltri: ltri,
-		ltrie: ltrie,
-		ltrif: ltrif,
-		ltrPar: ltrPar,
-		lurdshar: lurdshar,
-		luruhar: luruhar,
-		lvertneqq: lvertneqq,
-		lvnE: lvnE,
-		macr: macr,
-		male: male,
-		malt: malt,
-		maltese: maltese,
-		map: map,
-		mapsto: mapsto,
-		mapstodown: mapstodown,
-		mapstoleft: mapstoleft,
-		mapstoup: mapstoup,
-		marker: marker,
-		mcomma: mcomma,
-		Mcy: Mcy,
-		mcy: mcy,
-		mdash: mdash,
-		mDDot: mDDot,
-		measuredangle: measuredangle,
-		MediumSpace: MediumSpace,
-		Mellintrf: Mellintrf,
-		Mfr: Mfr,
-		mfr: mfr,
-		mho: mho,
-		micro: micro,
-		midast: midast,
-		midcir: midcir,
-		mid: mid,
-		middot: middot,
-		minusb: minusb,
-		minus: minus,
-		minusd: minusd,
-		minusdu: minusdu,
-		MinusPlus: MinusPlus,
-		mlcp: mlcp,
-		mldr: mldr,
-		mnplus: mnplus,
-		models: models,
-		Mopf: Mopf,
-		mopf: mopf,
-		mp: mp,
-		mscr: mscr,
-		Mscr: Mscr,
-		mstpos: mstpos,
-		Mu: Mu,
-		mu: mu,
-		multimap: multimap,
-		mumap: mumap,
-		nabla: nabla,
-		Nacute: Nacute,
-		nacute: nacute,
-		nang: nang,
-		nap: nap,
-		napE: napE,
-		napid: napid,
-		napos: napos,
-		napprox: napprox,
-		natural: natural,
-		naturals: naturals,
-		natur: natur,
-		nbsp: nbsp,
-		nbump: nbump,
-		nbumpe: nbumpe,
-		ncap: ncap,
-		Ncaron: Ncaron,
-		ncaron: ncaron,
-		Ncedil: Ncedil,
-		ncedil: ncedil,
-		ncong: ncong,
-		ncongdot: ncongdot,
-		ncup: ncup,
-		Ncy: Ncy,
-		ncy: ncy,
-		ndash: ndash,
-		nearhk: nearhk,
-		nearr: nearr,
-		neArr: neArr,
-		nearrow: nearrow,
-		ne: ne,
-		nedot: nedot,
-		NegativeMediumSpace: NegativeMediumSpace,
-		NegativeThickSpace: NegativeThickSpace,
-		NegativeThinSpace: NegativeThinSpace,
-		NegativeVeryThinSpace: NegativeVeryThinSpace,
-		nequiv: nequiv,
-		nesear: nesear,
-		nesim: nesim,
-		NestedGreaterGreater: NestedGreaterGreater,
-		NestedLessLess: NestedLessLess,
-		NewLine: NewLine,
-		nexist: nexist,
-		nexists: nexists,
-		Nfr: Nfr,
-		nfr: nfr,
-		ngE: ngE,
-		nge: nge,
-		ngeq: ngeq,
-		ngeqq: ngeqq,
-		ngeqslant: ngeqslant,
-		nges: nges,
-		nGg: nGg,
-		ngsim: ngsim,
-		nGt: nGt,
-		ngt: ngt,
-		ngtr: ngtr,
-		nGtv: nGtv,
-		nharr: nharr,
-		nhArr: nhArr,
-		nhpar: nhpar,
-		ni: ni,
-		nis: nis,
-		nisd: nisd,
-		niv: niv,
-		NJcy: NJcy,
-		njcy: njcy,
-		nlarr: nlarr,
-		nlArr: nlArr,
-		nldr: nldr,
-		nlE: nlE,
-		nle: nle,
-		nleftarrow: nleftarrow,
-		nLeftarrow: nLeftarrow,
-		nleftrightarrow: nleftrightarrow,
-		nLeftrightarrow: nLeftrightarrow,
-		nleq: nleq,
-		nleqq: nleqq,
-		nleqslant: nleqslant,
-		nles: nles,
-		nless: nless,
-		nLl: nLl,
-		nlsim: nlsim,
-		nLt: nLt,
-		nlt: nlt,
-		nltri: nltri,
-		nltrie: nltrie,
-		nLtv: nLtv,
-		nmid: nmid,
-		NoBreak: NoBreak,
-		NonBreakingSpace: NonBreakingSpace,
-		nopf: nopf,
-		Nopf: Nopf,
-		Not: Not,
-		not: not,
-		NotCongruent: NotCongruent,
-		NotCupCap: NotCupCap,
-		NotDoubleVerticalBar: NotDoubleVerticalBar,
-		NotElement: NotElement,
-		NotEqual: NotEqual,
-		NotEqualTilde: NotEqualTilde,
-		NotExists: NotExists,
-		NotGreater: NotGreater,
-		NotGreaterEqual: NotGreaterEqual,
-		NotGreaterFullEqual: NotGreaterFullEqual,
-		NotGreaterGreater: NotGreaterGreater,
-		NotGreaterLess: NotGreaterLess,
-		NotGreaterSlantEqual: NotGreaterSlantEqual,
-		NotGreaterTilde: NotGreaterTilde,
-		NotHumpDownHump: NotHumpDownHump,
-		NotHumpEqual: NotHumpEqual,
-		notin: notin,
-		notindot: notindot,
-		notinE: notinE,
-		notinva: notinva,
-		notinvb: notinvb,
-		notinvc: notinvc,
-		NotLeftTriangleBar: NotLeftTriangleBar,
-		NotLeftTriangle: NotLeftTriangle,
-		NotLeftTriangleEqual: NotLeftTriangleEqual,
-		NotLess: NotLess,
-		NotLessEqual: NotLessEqual,
-		NotLessGreater: NotLessGreater,
-		NotLessLess: NotLessLess,
-		NotLessSlantEqual: NotLessSlantEqual,
-		NotLessTilde: NotLessTilde,
-		NotNestedGreaterGreater: NotNestedGreaterGreater,
-		NotNestedLessLess: NotNestedLessLess,
-		notni: notni,
-		notniva: notniva,
-		notnivb: notnivb,
-		notnivc: notnivc,
-		NotPrecedes: NotPrecedes,
-		NotPrecedesEqual: NotPrecedesEqual,
-		NotPrecedesSlantEqual: NotPrecedesSlantEqual,
-		NotReverseElement: NotReverseElement,
-		NotRightTriangleBar: NotRightTriangleBar,
-		NotRightTriangle: NotRightTriangle,
-		NotRightTriangleEqual: NotRightTriangleEqual,
-		NotSquareSubset: NotSquareSubset,
-		NotSquareSubsetEqual: NotSquareSubsetEqual,
-		NotSquareSuperset: NotSquareSuperset,
-		NotSquareSupersetEqual: NotSquareSupersetEqual,
-		NotSubset: NotSubset,
-		NotSubsetEqual: NotSubsetEqual,
-		NotSucceeds: NotSucceeds,
-		NotSucceedsEqual: NotSucceedsEqual,
-		NotSucceedsSlantEqual: NotSucceedsSlantEqual,
-		NotSucceedsTilde: NotSucceedsTilde,
-		NotSuperset: NotSuperset,
-		NotSupersetEqual: NotSupersetEqual,
-		NotTilde: NotTilde,
-		NotTildeEqual: NotTildeEqual,
-		NotTildeFullEqual: NotTildeFullEqual,
-		NotTildeTilde: NotTildeTilde,
-		NotVerticalBar: NotVerticalBar,
-		nparallel: nparallel,
-		npar: npar,
-		nparsl: nparsl,
-		npart: npart,
-		npolint: npolint,
-		npr: npr,
-		nprcue: nprcue,
-		nprec: nprec,
-		npreceq: npreceq,
-		npre: npre,
-		nrarrc: nrarrc,
-		nrarr: nrarr,
-		nrArr: nrArr,
-		nrarrw: nrarrw,
-		nrightarrow: nrightarrow,
-		nRightarrow: nRightarrow,
-		nrtri: nrtri,
-		nrtrie: nrtrie,
-		nsc: nsc,
-		nsccue: nsccue,
-		nsce: nsce,
-		Nscr: Nscr,
-		nscr: nscr,
-		nshortmid: nshortmid,
-		nshortparallel: nshortparallel,
-		nsim: nsim,
-		nsime: nsime,
-		nsimeq: nsimeq,
-		nsmid: nsmid,
-		nspar: nspar,
-		nsqsube: nsqsube,
-		nsqsupe: nsqsupe,
-		nsub: nsub,
-		nsubE: nsubE,
-		nsube: nsube,
-		nsubset: nsubset,
-		nsubseteq: nsubseteq,
-		nsubseteqq: nsubseteqq,
-		nsucc: nsucc,
-		nsucceq: nsucceq,
-		nsup: nsup,
-		nsupE: nsupE,
-		nsupe: nsupe,
-		nsupset: nsupset,
-		nsupseteq: nsupseteq,
-		nsupseteqq: nsupseteqq,
-		ntgl: ntgl,
-		Ntilde: Ntilde,
-		ntilde: ntilde,
-		ntlg: ntlg,
-		ntriangleleft: ntriangleleft,
-		ntrianglelefteq: ntrianglelefteq,
-		ntriangleright: ntriangleright,
-		ntrianglerighteq: ntrianglerighteq,
-		Nu: Nu,
-		nu: nu,
-		num: num,
-		numero: numero,
-		numsp: numsp,
-		nvap: nvap,
-		nvdash: nvdash,
-		nvDash: nvDash,
-		nVdash: nVdash,
-		nVDash: nVDash,
-		nvge: nvge,
-		nvgt: nvgt,
-		nvHarr: nvHarr,
-		nvinfin: nvinfin,
-		nvlArr: nvlArr,
-		nvle: nvle,
-		nvlt: nvlt,
-		nvltrie: nvltrie,
-		nvrArr: nvrArr,
-		nvrtrie: nvrtrie,
-		nvsim: nvsim,
-		nwarhk: nwarhk,
-		nwarr: nwarr,
-		nwArr: nwArr,
-		nwarrow: nwarrow,
-		nwnear: nwnear,
-		Oacute: Oacute,
-		oacute: oacute,
-		oast: oast,
-		Ocirc: Ocirc,
-		ocirc: ocirc,
-		ocir: ocir,
-		Ocy: Ocy,
-		ocy: ocy,
-		odash: odash,
-		Odblac: Odblac,
-		odblac: odblac,
-		odiv: odiv,
-		odot: odot,
-		odsold: odsold,
-		OElig: OElig,
-		oelig: oelig,
-		ofcir: ofcir,
-		Ofr: Ofr,
-		ofr: ofr,
-		ogon: ogon,
-		Ograve: Ograve,
-		ograve: ograve,
-		ogt: ogt,
-		ohbar: ohbar,
-		ohm: ohm,
-		oint: oint,
-		olarr: olarr,
-		olcir: olcir,
-		olcross: olcross,
-		oline: oline,
-		olt: olt,
-		Omacr: Omacr,
-		omacr: omacr,
-		Omega: Omega,
-		omega: omega,
-		Omicron: Omicron,
-		omicron: omicron,
-		omid: omid,
-		ominus: ominus,
-		Oopf: Oopf,
-		oopf: oopf,
-		opar: opar,
-		OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
-		OpenCurlyQuote: OpenCurlyQuote,
-		operp: operp,
-		oplus: oplus,
-		orarr: orarr,
-		Or: Or,
-		or: or,
-		ord: ord,
-		order: order,
-		orderof: orderof,
-		ordf: ordf,
-		ordm: ordm,
-		origof: origof,
-		oror: oror,
-		orslope: orslope,
-		orv: orv,
-		oS: oS,
-		Oscr: Oscr,
-		oscr: oscr,
-		Oslash: Oslash,
-		oslash: oslash,
-		osol: osol,
-		Otilde: Otilde,
-		otilde: otilde,
-		otimesas: otimesas,
-		Otimes: Otimes,
-		otimes: otimes,
-		Ouml: Ouml,
-		ouml: ouml,
-		ovbar: ovbar,
-		OverBar: OverBar,
-		OverBrace: OverBrace,
-		OverBracket: OverBracket,
-		OverParenthesis: OverParenthesis,
-		para: para,
-		parallel: parallel,
-		par: par,
-		parsim: parsim,
-		parsl: parsl,
-		part: part,
-		PartialD: PartialD,
-		Pcy: Pcy,
-		pcy: pcy,
-		percnt: percnt,
-		period: period,
-		permil: permil,
-		perp: perp,
-		pertenk: pertenk,
-		Pfr: Pfr,
-		pfr: pfr,
-		Phi: Phi,
-		phi: phi,
-		phiv: phiv,
-		phmmat: phmmat,
-		phone: phone,
-		Pi: Pi,
-		pi: pi,
-		pitchfork: pitchfork,
-		piv: piv,
-		planck: planck,
-		planckh: planckh,
-		plankv: plankv,
-		plusacir: plusacir,
-		plusb: plusb,
-		pluscir: pluscir,
-		plus: plus,
-		plusdo: plusdo,
-		plusdu: plusdu,
-		pluse: pluse,
-		PlusMinus: PlusMinus,
-		plusmn: plusmn,
-		plussim: plussim,
-		plustwo: plustwo,
-		pm: pm,
-		Poincareplane: Poincareplane,
-		pointint: pointint,
-		popf: popf,
-		Popf: Popf,
-		pound: pound,
-		prap: prap,
-		Pr: Pr,
-		pr: pr,
-		prcue: prcue,
-		precapprox: precapprox,
-		prec: prec,
-		preccurlyeq: preccurlyeq,
-		Precedes: Precedes,
-		PrecedesEqual: PrecedesEqual,
-		PrecedesSlantEqual: PrecedesSlantEqual,
-		PrecedesTilde: PrecedesTilde,
-		preceq: preceq,
-		precnapprox: precnapprox,
-		precneqq: precneqq,
-		precnsim: precnsim,
-		pre: pre,
-		prE: prE,
-		precsim: precsim,
-		prime: prime,
-		Prime: Prime,
-		primes: primes,
-		prnap: prnap,
-		prnE: prnE,
-		prnsim: prnsim,
-		prod: prod,
-		Product: Product,
-		profalar: profalar,
-		profline: profline,
-		profsurf: profsurf,
-		prop: prop,
-		Proportional: Proportional,
-		Proportion: Proportion,
-		propto: propto,
-		prsim: prsim,
-		prurel: prurel,
-		Pscr: Pscr,
-		pscr: pscr,
-		Psi: Psi,
-		psi: psi,
-		puncsp: puncsp,
-		Qfr: Qfr,
-		qfr: qfr,
-		qint: qint,
-		qopf: qopf,
-		Qopf: Qopf,
-		qprime: qprime,
-		Qscr: Qscr,
-		qscr: qscr,
-		quaternions: quaternions,
-		quatint: quatint,
-		quest: quest,
-		questeq: questeq,
-		quot: quot,
-		QUOT: QUOT,
-		rAarr: rAarr,
-		race: race,
-		Racute: Racute,
-		racute: racute,
-		radic: radic,
-		raemptyv: raemptyv,
-		rang: rang,
-		Rang: Rang,
-		rangd: rangd,
-		range: range,
-		rangle: rangle,
-		raquo: raquo,
-		rarrap: rarrap,
-		rarrb: rarrb,
-		rarrbfs: rarrbfs,
-		rarrc: rarrc,
-		rarr: rarr,
-		Rarr: Rarr,
-		rArr: rArr,
-		rarrfs: rarrfs,
-		rarrhk: rarrhk,
-		rarrlp: rarrlp,
-		rarrpl: rarrpl,
-		rarrsim: rarrsim,
-		Rarrtl: Rarrtl,
-		rarrtl: rarrtl,
-		rarrw: rarrw,
-		ratail: ratail,
-		rAtail: rAtail,
-		ratio: ratio,
-		rationals: rationals,
-		rbarr: rbarr,
-		rBarr: rBarr,
-		RBarr: RBarr,
-		rbbrk: rbbrk,
-		rbrace: rbrace,
-		rbrack: rbrack,
-		rbrke: rbrke,
-		rbrksld: rbrksld,
-		rbrkslu: rbrkslu,
-		Rcaron: Rcaron,
-		rcaron: rcaron,
-		Rcedil: Rcedil,
-		rcedil: rcedil,
-		rceil: rceil,
-		rcub: rcub,
-		Rcy: Rcy,
-		rcy: rcy,
-		rdca: rdca,
-		rdldhar: rdldhar,
-		rdquo: rdquo,
-		rdquor: rdquor,
-		rdsh: rdsh,
-		real: real,
-		realine: realine,
-		realpart: realpart,
-		reals: reals,
-		Re: Re,
-		rect: rect,
-		reg: reg,
-		REG: REG,
-		ReverseElement: ReverseElement,
-		ReverseEquilibrium: ReverseEquilibrium,
-		ReverseUpEquilibrium: ReverseUpEquilibrium,
-		rfisht: rfisht,
-		rfloor: rfloor,
-		rfr: rfr,
-		Rfr: Rfr,
-		rHar: rHar,
-		rhard: rhard,
-		rharu: rharu,
-		rharul: rharul,
-		Rho: Rho,
-		rho: rho,
-		rhov: rhov,
-		RightAngleBracket: RightAngleBracket,
-		RightArrowBar: RightArrowBar,
-		rightarrow: rightarrow,
-		RightArrow: RightArrow,
-		Rightarrow: Rightarrow,
-		RightArrowLeftArrow: RightArrowLeftArrow,
-		rightarrowtail: rightarrowtail,
-		RightCeiling: RightCeiling,
-		RightDoubleBracket: RightDoubleBracket,
-		RightDownTeeVector: RightDownTeeVector,
-		RightDownVectorBar: RightDownVectorBar,
-		RightDownVector: RightDownVector,
-		RightFloor: RightFloor,
-		rightharpoondown: rightharpoondown,
-		rightharpoonup: rightharpoonup,
-		rightleftarrows: rightleftarrows,
-		rightleftharpoons: rightleftharpoons,
-		rightrightarrows: rightrightarrows,
-		rightsquigarrow: rightsquigarrow,
-		RightTeeArrow: RightTeeArrow,
-		RightTee: RightTee,
-		RightTeeVector: RightTeeVector,
-		rightthreetimes: rightthreetimes,
-		RightTriangleBar: RightTriangleBar,
-		RightTriangle: RightTriangle,
-		RightTriangleEqual: RightTriangleEqual,
-		RightUpDownVector: RightUpDownVector,
-		RightUpTeeVector: RightUpTeeVector,
-		RightUpVectorBar: RightUpVectorBar,
-		RightUpVector: RightUpVector,
-		RightVectorBar: RightVectorBar,
-		RightVector: RightVector,
-		ring: ring,
-		risingdotseq: risingdotseq,
-		rlarr: rlarr,
-		rlhar: rlhar,
-		rlm: rlm,
-		rmoustache: rmoustache,
-		rmoust: rmoust,
-		rnmid: rnmid,
-		roang: roang,
-		roarr: roarr,
-		robrk: robrk,
-		ropar: ropar,
-		ropf: ropf,
-		Ropf: Ropf,
-		roplus: roplus,
-		rotimes: rotimes,
-		RoundImplies: RoundImplies,
-		rpar: rpar,
-		rpargt: rpargt,
-		rppolint: rppolint,
-		rrarr: rrarr,
-		Rrightarrow: Rrightarrow,
-		rsaquo: rsaquo,
-		rscr: rscr,
-		Rscr: Rscr,
-		rsh: rsh,
-		Rsh: Rsh,
-		rsqb: rsqb,
-		rsquo: rsquo,
-		rsquor: rsquor,
-		rthree: rthree,
-		rtimes: rtimes,
-		rtri: rtri,
-		rtrie: rtrie,
-		rtrif: rtrif,
-		rtriltri: rtriltri,
-		RuleDelayed: RuleDelayed,
-		ruluhar: ruluhar,
-		rx: rx,
-		Sacute: Sacute,
-		sacute: sacute,
-		sbquo: sbquo,
-		scap: scap,
-		Scaron: Scaron,
-		scaron: scaron,
-		Sc: Sc,
-		sc: sc,
-		sccue: sccue,
-		sce: sce,
-		scE: scE,
-		Scedil: Scedil,
-		scedil: scedil,
-		Scirc: Scirc,
-		scirc: scirc,
-		scnap: scnap,
-		scnE: scnE,
-		scnsim: scnsim,
-		scpolint: scpolint,
-		scsim: scsim,
-		Scy: Scy,
-		scy: scy,
-		sdotb: sdotb,
-		sdot: sdot,
-		sdote: sdote,
-		searhk: searhk,
-		searr: searr,
-		seArr: seArr,
-		searrow: searrow,
-		sect: sect,
-		semi: semi,
-		seswar: seswar,
-		setminus: setminus,
-		setmn: setmn,
-		sext: sext,
-		Sfr: Sfr,
-		sfr: sfr,
-		sfrown: sfrown,
-		sharp: sharp,
-		SHCHcy: SHCHcy,
-		shchcy: shchcy,
-		SHcy: SHcy,
-		shcy: shcy,
-		ShortDownArrow: ShortDownArrow,
-		ShortLeftArrow: ShortLeftArrow,
-		shortmid: shortmid,
-		shortparallel: shortparallel,
-		ShortRightArrow: ShortRightArrow,
-		ShortUpArrow: ShortUpArrow,
-		shy: shy,
-		Sigma: Sigma,
-		sigma: sigma,
-		sigmaf: sigmaf,
-		sigmav: sigmav,
-		sim: sim,
-		simdot: simdot,
-		sime: sime,
-		simeq: simeq,
-		simg: simg,
-		simgE: simgE,
-		siml: siml,
-		simlE: simlE,
-		simne: simne,
-		simplus: simplus,
-		simrarr: simrarr,
-		slarr: slarr,
-		SmallCircle: SmallCircle,
-		smallsetminus: smallsetminus,
-		smashp: smashp,
-		smeparsl: smeparsl,
-		smid: smid,
-		smile: smile,
-		smt: smt,
-		smte: smte,
-		smtes: smtes,
-		SOFTcy: SOFTcy,
-		softcy: softcy,
-		solbar: solbar,
-		solb: solb,
-		sol: sol,
-		Sopf: Sopf,
-		sopf: sopf,
-		spades: spades,
-		spadesuit: spadesuit,
-		spar: spar,
-		sqcap: sqcap,
-		sqcaps: sqcaps,
-		sqcup: sqcup,
-		sqcups: sqcups,
-		Sqrt: Sqrt,
-		sqsub: sqsub,
-		sqsube: sqsube,
-		sqsubset: sqsubset,
-		sqsubseteq: sqsubseteq,
-		sqsup: sqsup,
-		sqsupe: sqsupe,
-		sqsupset: sqsupset,
-		sqsupseteq: sqsupseteq,
-		square: square,
-		Square: Square,
-		SquareIntersection: SquareIntersection,
-		SquareSubset: SquareSubset,
-		SquareSubsetEqual: SquareSubsetEqual,
-		SquareSuperset: SquareSuperset,
-		SquareSupersetEqual: SquareSupersetEqual,
-		SquareUnion: SquareUnion,
-		squarf: squarf,
-		squ: squ,
-		squf: squf,
-		srarr: srarr,
-		Sscr: Sscr,
-		sscr: sscr,
-		ssetmn: ssetmn,
-		ssmile: ssmile,
-		sstarf: sstarf,
-		Star: Star,
-		star: star,
-		starf: starf,
-		straightepsilon: straightepsilon,
-		straightphi: straightphi,
-		strns: strns,
-		sub: sub,
-		Sub: Sub,
-		subdot: subdot,
-		subE: subE,
-		sube: sube,
-		subedot: subedot,
-		submult: submult,
-		subnE: subnE,
-		subne: subne,
-		subplus: subplus,
-		subrarr: subrarr,
-		subset: subset,
-		Subset: Subset,
-		subseteq: subseteq,
-		subseteqq: subseteqq,
-		SubsetEqual: SubsetEqual,
-		subsetneq: subsetneq,
-		subsetneqq: subsetneqq,
-		subsim: subsim,
-		subsub: subsub,
-		subsup: subsup,
-		succapprox: succapprox,
-		succ: succ,
-		succcurlyeq: succcurlyeq,
-		Succeeds: Succeeds,
-		SucceedsEqual: SucceedsEqual,
-		SucceedsSlantEqual: SucceedsSlantEqual,
-		SucceedsTilde: SucceedsTilde,
-		succeq: succeq,
-		succnapprox: succnapprox,
-		succneqq: succneqq,
-		succnsim: succnsim,
-		succsim: succsim,
-		SuchThat: SuchThat,
-		sum: sum,
-		Sum: Sum,
-		sung: sung,
-		sup1: sup1,
-		sup2: sup2,
-		sup3: sup3,
-		sup: sup,
-		Sup: Sup,
-		supdot: supdot,
-		supdsub: supdsub,
-		supE: supE,
-		supe: supe,
-		supedot: supedot,
-		Superset: Superset,
-		SupersetEqual: SupersetEqual,
-		suphsol: suphsol,
-		suphsub: suphsub,
-		suplarr: suplarr,
-		supmult: supmult,
-		supnE: supnE,
-		supne: supne,
-		supplus: supplus,
-		supset: supset,
-		Supset: Supset,
-		supseteq: supseteq,
-		supseteqq: supseteqq,
-		supsetneq: supsetneq,
-		supsetneqq: supsetneqq,
-		supsim: supsim,
-		supsub: supsub,
-		supsup: supsup,
-		swarhk: swarhk,
-		swarr: swarr,
-		swArr: swArr,
-		swarrow: swarrow,
-		swnwar: swnwar,
-		szlig: szlig,
-		Tab: Tab,
-		target: target,
-		Tau: Tau,
-		tau: tau,
-		tbrk: tbrk,
-		Tcaron: Tcaron,
-		tcaron: tcaron,
-		Tcedil: Tcedil,
-		tcedil: tcedil,
-		Tcy: Tcy,
-		tcy: tcy,
-		tdot: tdot,
-		telrec: telrec,
-		Tfr: Tfr,
-		tfr: tfr,
-		there4: there4,
-		therefore: therefore,
-		Therefore: Therefore,
-		Theta: Theta,
-		theta: theta,
-		thetasym: thetasym,
-		thetav: thetav,
-		thickapprox: thickapprox,
-		thicksim: thicksim,
-		ThickSpace: ThickSpace,
-		ThinSpace: ThinSpace,
-		thinsp: thinsp,
-		thkap: thkap,
-		thksim: thksim,
-		THORN: THORN,
-		thorn: thorn,
-		tilde: tilde,
-		Tilde: Tilde,
-		TildeEqual: TildeEqual,
-		TildeFullEqual: TildeFullEqual,
-		TildeTilde: TildeTilde,
-		timesbar: timesbar,
-		timesb: timesb,
-		times: times,
-		timesd: timesd,
-		tint: tint,
-		toea: toea,
-		topbot: topbot,
-		topcir: topcir,
-		top: top,
-		Topf: Topf,
-		topf: topf,
-		topfork: topfork,
-		tosa: tosa,
-		tprime: tprime,
-		trade: trade,
-		TRADE: TRADE,
-		triangle: triangle,
-		triangledown: triangledown,
-		triangleleft: triangleleft,
-		trianglelefteq: trianglelefteq,
-		triangleq: triangleq,
-		triangleright: triangleright,
-		trianglerighteq: trianglerighteq,
-		tridot: tridot,
-		trie: trie,
-		triminus: triminus,
-		TripleDot: TripleDot,
-		triplus: triplus,
-		trisb: trisb,
-		tritime: tritime,
-		trpezium: trpezium,
-		Tscr: Tscr,
-		tscr: tscr,
-		TScy: TScy,
-		tscy: tscy,
-		TSHcy: TSHcy,
-		tshcy: tshcy,
-		Tstrok: Tstrok,
-		tstrok: tstrok,
-		twixt: twixt,
-		twoheadleftarrow: twoheadleftarrow,
-		twoheadrightarrow: twoheadrightarrow,
-		Uacute: Uacute,
-		uacute: uacute,
-		uarr: uarr,
-		Uarr: Uarr,
-		uArr: uArr,
-		Uarrocir: Uarrocir,
-		Ubrcy: Ubrcy,
-		ubrcy: ubrcy,
-		Ubreve: Ubreve,
-		ubreve: ubreve,
-		Ucirc: Ucirc,
-		ucirc: ucirc,
-		Ucy: Ucy,
-		ucy: ucy,
-		udarr: udarr,
-		Udblac: Udblac,
-		udblac: udblac,
-		udhar: udhar,
-		ufisht: ufisht,
-		Ufr: Ufr,
-		ufr: ufr,
-		Ugrave: Ugrave,
-		ugrave: ugrave,
-		uHar: uHar,
-		uharl: uharl,
-		uharr: uharr,
-		uhblk: uhblk,
-		ulcorn: ulcorn,
-		ulcorner: ulcorner,
-		ulcrop: ulcrop,
-		ultri: ultri,
-		Umacr: Umacr,
-		umacr: umacr,
-		uml: uml,
-		UnderBar: UnderBar,
-		UnderBrace: UnderBrace,
-		UnderBracket: UnderBracket,
-		UnderParenthesis: UnderParenthesis,
-		Union: Union,
-		UnionPlus: UnionPlus,
-		Uogon: Uogon,
-		uogon: uogon,
-		Uopf: Uopf,
-		uopf: uopf,
-		UpArrowBar: UpArrowBar,
-		uparrow: uparrow,
-		UpArrow: UpArrow,
-		Uparrow: Uparrow,
-		UpArrowDownArrow: UpArrowDownArrow,
-		updownarrow: updownarrow,
-		UpDownArrow: UpDownArrow,
-		Updownarrow: Updownarrow,
-		UpEquilibrium: UpEquilibrium,
-		upharpoonleft: upharpoonleft,
-		upharpoonright: upharpoonright,
-		uplus: uplus,
-		UpperLeftArrow: UpperLeftArrow,
-		UpperRightArrow: UpperRightArrow,
-		upsi: upsi,
-		Upsi: Upsi,
-		upsih: upsih,
-		Upsilon: Upsilon,
-		upsilon: upsilon,
-		UpTeeArrow: UpTeeArrow,
-		UpTee: UpTee,
-		upuparrows: upuparrows,
-		urcorn: urcorn,
-		urcorner: urcorner,
-		urcrop: urcrop,
-		Uring: Uring,
-		uring: uring,
-		urtri: urtri,
-		Uscr: Uscr,
-		uscr: uscr,
-		utdot: utdot,
-		Utilde: Utilde,
-		utilde: utilde,
-		utri: utri,
-		utrif: utrif,
-		uuarr: uuarr,
-		Uuml: Uuml,
-		uuml: uuml,
-		uwangle: uwangle,
-		vangrt: vangrt,
-		varepsilon: varepsilon,
-		varkappa: varkappa,
-		varnothing: varnothing,
-		varphi: varphi,
-		varpi: varpi,
-		varpropto: varpropto,
-		varr: varr,
-		vArr: vArr,
-		varrho: varrho,
-		varsigma: varsigma,
-		varsubsetneq: varsubsetneq,
-		varsubsetneqq: varsubsetneqq,
-		varsupsetneq: varsupsetneq,
-		varsupsetneqq: varsupsetneqq,
-		vartheta: vartheta,
-		vartriangleleft: vartriangleleft,
-		vartriangleright: vartriangleright,
-		vBar: vBar,
-		Vbar: Vbar,
-		vBarv: vBarv,
-		Vcy: Vcy,
-		vcy: vcy,
-		vdash: vdash,
-		vDash: vDash,
-		Vdash: Vdash,
-		VDash: VDash,
-		Vdashl: Vdashl,
-		veebar: veebar,
-		vee: vee,
-		Vee: Vee,
-		veeeq: veeeq,
-		vellip: vellip,
-		verbar: verbar,
-		Verbar: Verbar,
-		vert: vert,
-		Vert: Vert,
-		VerticalBar: VerticalBar,
-		VerticalLine: VerticalLine,
-		VerticalSeparator: VerticalSeparator,
-		VerticalTilde: VerticalTilde,
-		VeryThinSpace: VeryThinSpace,
-		Vfr: Vfr,
-		vfr: vfr,
-		vltri: vltri,
-		vnsub: vnsub,
-		vnsup: vnsup,
-		Vopf: Vopf,
-		vopf: vopf,
-		vprop: vprop,
-		vrtri: vrtri,
-		Vscr: Vscr,
-		vscr: vscr,
-		vsubnE: vsubnE,
-		vsubne: vsubne,
-		vsupnE: vsupnE,
-		vsupne: vsupne,
-		Vvdash: Vvdash,
-		vzigzag: vzigzag,
-		Wcirc: Wcirc,
-		wcirc: wcirc,
-		wedbar: wedbar,
-		wedge: wedge,
-		Wedge: Wedge,
-		wedgeq: wedgeq,
-		weierp: weierp,
-		Wfr: Wfr,
-		wfr: wfr,
-		Wopf: Wopf,
-		wopf: wopf,
-		wp: wp,
-		wr: wr,
-		wreath: wreath,
-		Wscr: Wscr,
-		wscr: wscr,
-		xcap: xcap,
-		xcirc: xcirc,
-		xcup: xcup,
-		xdtri: xdtri,
-		Xfr: Xfr,
-		xfr: xfr,
-		xharr: xharr,
-		xhArr: xhArr,
-		Xi: Xi,
-		xi: xi,
-		xlarr: xlarr,
-		xlArr: xlArr,
-		xmap: xmap,
-		xnis: xnis,
-		xodot: xodot,
-		Xopf: Xopf,
-		xopf: xopf,
-		xoplus: xoplus,
-		xotime: xotime,
-		xrarr: xrarr,
-		xrArr: xrArr,
-		Xscr: Xscr,
-		xscr: xscr,
-		xsqcup: xsqcup,
-		xuplus: xuplus,
-		xutri: xutri,
-		xvee: xvee,
-		xwedge: xwedge,
-		Yacute: Yacute,
-		yacute: yacute,
-		YAcy: YAcy,
-		yacy: yacy,
-		Ycirc: Ycirc,
-		ycirc: ycirc,
-		Ycy: Ycy,
-		ycy: ycy,
-		yen: yen,
-		Yfr: Yfr,
-		yfr: yfr,
-		YIcy: YIcy,
-		yicy: yicy,
-		Yopf: Yopf,
-		yopf: yopf,
-		Yscr: Yscr,
-		yscr: yscr,
-		YUcy: YUcy,
-		yucy: yucy,
-		yuml: yuml,
-		Yuml: Yuml,
-		Zacute: Zacute,
-		zacute: zacute,
-		Zcaron: Zcaron,
-		zcaron: zcaron,
-		Zcy: Zcy,
-		zcy: zcy,
-		Zdot: Zdot,
-		zdot: zdot,
-		zeetrf: zeetrf,
-		ZeroWidthSpace: ZeroWidthSpace,
-		Zeta: Zeta,
-		zeta: zeta,
-		zfr: zfr,
-		Zfr: Zfr,
-		ZHcy: ZHcy,
-		zhcy: zhcy,
-		zigrarr: zigrarr,
-		zopf: zopf,
-		Zopf: Zopf,
-		Zscr: Zscr,
-		zscr: zscr,
-		zwj: zwj,
-		zwnj: zwnj,
-		'default': entities
-	};
-
-	var Aacute$1 = "Á";
-	var aacute$1 = "á";
-	var Acirc$1 = "Â";
-	var acirc$1 = "â";
-	var acute$1 = "´";
-	var AElig$1 = "Æ";
-	var aelig$1 = "æ";
-	var Agrave$1 = "À";
-	var agrave$1 = "à";
-	var amp$1 = "&";
-	var AMP$1 = "&";
-	var Aring$1 = "Å";
-	var aring$1 = "å";
-	var Atilde$1 = "Ã";
-	var atilde$1 = "ã";
-	var Auml$1 = "Ä";
-	var auml$1 = "ä";
-	var brvbar$1 = "¦";
-	var Ccedil$1 = "Ç";
-	var ccedil$1 = "ç";
-	var cedil$1 = "¸";
-	var cent$1 = "¢";
-	var copy$1 = "©";
-	var COPY$1 = "©";
-	var curren$1 = "¤";
-	var deg$1 = "°";
-	var divide$1 = "÷";
-	var Eacute$1 = "É";
-	var eacute$1 = "é";
-	var Ecirc$1 = "Ê";
-	var ecirc$1 = "ê";
-	var Egrave$1 = "È";
-	var egrave$1 = "è";
-	var ETH$1 = "Ð";
-	var eth$1 = "ð";
-	var Euml$1 = "Ë";
-	var euml$1 = "ë";
-	var frac12$1 = "½";
-	var frac14$1 = "¼";
-	var frac34$1 = "¾";
-	var gt$1 = ">";
-	var GT$1 = ">";
-	var Iacute$1 = "Í";
-	var iacute$1 = "í";
-	var Icirc$1 = "Î";
-	var icirc$1 = "î";
-	var iexcl$1 = "¡";
-	var Igrave$1 = "Ì";
-	var igrave$1 = "ì";
-	var iquest$1 = "¿";
-	var Iuml$1 = "Ï";
-	var iuml$1 = "ï";
-	var laquo$1 = "«";
-	var lt$1 = "<";
-	var LT$1 = "<";
-	var macr$1 = "¯";
-	var micro$1 = "µ";
-	var middot$1 = "·";
-	var nbsp$1 = " ";
-	var not$1 = "¬";
-	var Ntilde$1 = "Ñ";
-	var ntilde$1 = "ñ";
-	var Oacute$1 = "Ó";
-	var oacute$1 = "ó";
-	var Ocirc$1 = "Ô";
-	var ocirc$1 = "ô";
-	var Ograve$1 = "Ò";
-	var ograve$1 = "ò";
-	var ordf$1 = "ª";
-	var ordm$1 = "º";
-	var Oslash$1 = "Ø";
-	var oslash$1 = "ø";
-	var Otilde$1 = "Õ";
-	var otilde$1 = "õ";
-	var Ouml$1 = "Ö";
-	var ouml$1 = "ö";
-	var para$1 = "¶";
-	var plusmn$1 = "±";
-	var pound$1 = "£";
-	var quot$1 = "\"";
-	var QUOT$1 = "\"";
-	var raquo$1 = "»";
-	var reg$1 = "®";
-	var REG$1 = "®";
-	var sect$1 = "§";
-	var shy$1 = "­";
-	var sup1$1 = "¹";
-	var sup2$1 = "²";
-	var sup3$1 = "³";
-	var szlig$1 = "ß";
-	var THORN$1 = "Þ";
-	var thorn$1 = "þ";
-	var times$1 = "×";
-	var Uacute$1 = "Ú";
-	var uacute$1 = "ú";
-	var Ucirc$1 = "Û";
-	var ucirc$1 = "û";
-	var Ugrave$1 = "Ù";
-	var ugrave$1 = "ù";
-	var uml$1 = "¨";
-	var Uuml$1 = "Ü";
-	var uuml$1 = "ü";
-	var Yacute$1 = "Ý";
-	var yacute$1 = "ý";
-	var yen$1 = "¥";
-	var yuml$1 = "ÿ";
-	var legacy = {
-		Aacute: Aacute$1,
-		aacute: aacute$1,
-		Acirc: Acirc$1,
-		acirc: acirc$1,
-		acute: acute$1,
-		AElig: AElig$1,
-		aelig: aelig$1,
-		Agrave: Agrave$1,
-		agrave: agrave$1,
-		amp: amp$1,
-		AMP: AMP$1,
-		Aring: Aring$1,
-		aring: aring$1,
-		Atilde: Atilde$1,
-		atilde: atilde$1,
-		Auml: Auml$1,
-		auml: auml$1,
-		brvbar: brvbar$1,
-		Ccedil: Ccedil$1,
-		ccedil: ccedil$1,
-		cedil: cedil$1,
-		cent: cent$1,
-		copy: copy$1,
-		COPY: COPY$1,
-		curren: curren$1,
-		deg: deg$1,
-		divide: divide$1,
-		Eacute: Eacute$1,
-		eacute: eacute$1,
-		Ecirc: Ecirc$1,
-		ecirc: ecirc$1,
-		Egrave: Egrave$1,
-		egrave: egrave$1,
-		ETH: ETH$1,
-		eth: eth$1,
-		Euml: Euml$1,
-		euml: euml$1,
-		frac12: frac12$1,
-		frac14: frac14$1,
-		frac34: frac34$1,
-		gt: gt$1,
-		GT: GT$1,
-		Iacute: Iacute$1,
-		iacute: iacute$1,
-		Icirc: Icirc$1,
-		icirc: icirc$1,
-		iexcl: iexcl$1,
-		Igrave: Igrave$1,
-		igrave: igrave$1,
-		iquest: iquest$1,
-		Iuml: Iuml$1,
-		iuml: iuml$1,
-		laquo: laquo$1,
-		lt: lt$1,
-		LT: LT$1,
-		macr: macr$1,
-		micro: micro$1,
-		middot: middot$1,
-		nbsp: nbsp$1,
-		not: not$1,
-		Ntilde: Ntilde$1,
-		ntilde: ntilde$1,
-		Oacute: Oacute$1,
-		oacute: oacute$1,
-		Ocirc: Ocirc$1,
-		ocirc: ocirc$1,
-		Ograve: Ograve$1,
-		ograve: ograve$1,
-		ordf: ordf$1,
-		ordm: ordm$1,
-		Oslash: Oslash$1,
-		oslash: oslash$1,
-		Otilde: Otilde$1,
-		otilde: otilde$1,
-		Ouml: Ouml$1,
-		ouml: ouml$1,
-		para: para$1,
-		plusmn: plusmn$1,
-		pound: pound$1,
-		quot: quot$1,
-		QUOT: QUOT$1,
-		raquo: raquo$1,
-		reg: reg$1,
-		REG: REG$1,
-		sect: sect$1,
-		shy: shy$1,
-		sup1: sup1$1,
-		sup2: sup2$1,
-		sup3: sup3$1,
-		szlig: szlig$1,
-		THORN: THORN$1,
-		thorn: thorn$1,
-		times: times$1,
-		Uacute: Uacute$1,
-		uacute: uacute$1,
-		Ucirc: Ucirc$1,
-		ucirc: ucirc$1,
-		Ugrave: Ugrave$1,
-		ugrave: ugrave$1,
-		uml: uml$1,
-		Uuml: Uuml$1,
-		uuml: uuml$1,
-		Yacute: Yacute$1,
-		yacute: yacute$1,
-		yen: yen$1,
-		yuml: yuml$1
-	};
-
-	var legacy$1 = {
-		__proto__: null,
-		Aacute: Aacute$1,
-		aacute: aacute$1,
-		Acirc: Acirc$1,
-		acirc: acirc$1,
-		acute: acute$1,
-		AElig: AElig$1,
-		aelig: aelig$1,
-		Agrave: Agrave$1,
-		agrave: agrave$1,
-		amp: amp$1,
-		AMP: AMP$1,
-		Aring: Aring$1,
-		aring: aring$1,
-		Atilde: Atilde$1,
-		atilde: atilde$1,
-		Auml: Auml$1,
-		auml: auml$1,
-		brvbar: brvbar$1,
-		Ccedil: Ccedil$1,
-		ccedil: ccedil$1,
-		cedil: cedil$1,
-		cent: cent$1,
-		copy: copy$1,
-		COPY: COPY$1,
-		curren: curren$1,
-		deg: deg$1,
-		divide: divide$1,
-		Eacute: Eacute$1,
-		eacute: eacute$1,
-		Ecirc: Ecirc$1,
-		ecirc: ecirc$1,
-		Egrave: Egrave$1,
-		egrave: egrave$1,
-		ETH: ETH$1,
-		eth: eth$1,
-		Euml: Euml$1,
-		euml: euml$1,
-		frac12: frac12$1,
-		frac14: frac14$1,
-		frac34: frac34$1,
-		gt: gt$1,
-		GT: GT$1,
-		Iacute: Iacute$1,
-		iacute: iacute$1,
-		Icirc: Icirc$1,
-		icirc: icirc$1,
-		iexcl: iexcl$1,
-		Igrave: Igrave$1,
-		igrave: igrave$1,
-		iquest: iquest$1,
-		Iuml: Iuml$1,
-		iuml: iuml$1,
-		laquo: laquo$1,
-		lt: lt$1,
-		LT: LT$1,
-		macr: macr$1,
-		micro: micro$1,
-		middot: middot$1,
-		nbsp: nbsp$1,
-		not: not$1,
-		Ntilde: Ntilde$1,
-		ntilde: ntilde$1,
-		Oacute: Oacute$1,
-		oacute: oacute$1,
-		Ocirc: Ocirc$1,
-		ocirc: ocirc$1,
-		Ograve: Ograve$1,
-		ograve: ograve$1,
-		ordf: ordf$1,
-		ordm: ordm$1,
-		Oslash: Oslash$1,
-		oslash: oslash$1,
-		Otilde: Otilde$1,
-		otilde: otilde$1,
-		Ouml: Ouml$1,
-		ouml: ouml$1,
-		para: para$1,
-		plusmn: plusmn$1,
-		pound: pound$1,
-		quot: quot$1,
-		QUOT: QUOT$1,
-		raquo: raquo$1,
-		reg: reg$1,
-		REG: REG$1,
-		sect: sect$1,
-		shy: shy$1,
-		sup1: sup1$1,
-		sup2: sup2$1,
-		sup3: sup3$1,
-		szlig: szlig$1,
-		THORN: THORN$1,
-		thorn: thorn$1,
-		times: times$1,
-		Uacute: Uacute$1,
-		uacute: uacute$1,
-		Ucirc: Ucirc$1,
-		ucirc: ucirc$1,
-		Ugrave: Ugrave$1,
-		ugrave: ugrave$1,
-		uml: uml$1,
-		Uuml: Uuml$1,
-		uuml: uuml$1,
-		Yacute: Yacute$1,
-		yacute: yacute$1,
-		yen: yen$1,
-		yuml: yuml$1,
-		'default': legacy
-	};
-
-	var amp$2 = "&";
-	var apos$1 = "'";
-	var gt$2 = ">";
-	var lt$2 = "<";
-	var quot$2 = "\"";
-	var xml = {
-		amp: amp$2,
-		apos: apos$1,
-		gt: gt$2,
-		lt: lt$2,
-		quot: quot$2
-	};
-
-	var xml$1 = {
-		__proto__: null,
-		amp: amp$2,
-		apos: apos$1,
-		gt: gt$2,
-		lt: lt$2,
-		quot: quot$2,
-		'default': xml
-	};
-
-	var decode = {
-		"0": 65533,
-		"128": 8364,
-		"130": 8218,
-		"131": 402,
-		"132": 8222,
-		"133": 8230,
-		"134": 8224,
-		"135": 8225,
-		"136": 710,
-		"137": 8240,
-		"138": 352,
-		"139": 8249,
-		"140": 338,
-		"142": 381,
-		"145": 8216,
-		"146": 8217,
-		"147": 8220,
-		"148": 8221,
-		"149": 8226,
-		"150": 8211,
-		"151": 8212,
-		"152": 732,
-		"153": 8482,
-		"154": 353,
-		"155": 8250,
-		"156": 339,
-		"158": 382,
-		"159": 376
-	};
-
-	var decode$1 = {
-		__proto__: null,
-		'default': decode
-	};
-
-	var require$$0 = getCjsExportFromNamespace(decode$1);
-
-	var decode_codepoint = createCommonjsModule(function (module, exports) {
-	var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(exports, "__esModule", { value: true });
-	var decode_json_1 = __importDefault(require$$0);
-	// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
-	function decodeCodePoint(codePoint) {
-	    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
-	        return "\uFFFD";
-	    }
-	    if (codePoint in decode_json_1.default) {
-	        codePoint = decode_json_1.default[codePoint];
-	    }
-	    var output = "";
-	    if (codePoint > 0xffff) {
-	        codePoint -= 0x10000;
-	        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
-	        codePoint = 0xdc00 | (codePoint & 0x3ff);
-	    }
-	    output += String.fromCharCode(codePoint);
-	    return output;
-	}
-	exports.default = decodeCodePoint;
-	});
-
-	var require$$1 = getCjsExportFromNamespace(entities$1);
-
-	var require$$1$1 = getCjsExportFromNamespace(legacy$1);
-
-	var require$$0$1 = getCjsExportFromNamespace(xml$1);
-
-	var decode$2 = createCommonjsModule(function (module, exports) {
-	var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(exports, "__esModule", { value: true });
-	exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
-	var entities_json_1 = __importDefault(require$$1);
-	var legacy_json_1 = __importDefault(require$$1$1);
-	var xml_json_1 = __importDefault(require$$0$1);
-	var decode_codepoint_1 = __importDefault(decode_codepoint);
-	exports.decodeXML = getStrictDecoder(xml_json_1.default);
-	exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
-	function getStrictDecoder(map) {
-	    var keys = Object.keys(map).join("|");
-	    var replace = getReplacer(map);
-	    keys += "|#[xX][\\da-fA-F]+|#\\d+";
-	    var re = new RegExp("&(?:" + keys + ");", "g");
-	    return function (str) { return String(str).replace(re, replace); };
-	}
-	var sorter = function (a, b) { return (a < b ? 1 : -1); };
-	exports.decodeHTML = (function () {
-	    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
-	    var keys = Object.keys(entities_json_1.default).sort(sorter);
-	    for (var i = 0, j = 0; i < keys.length; i++) {
-	        if (legacy[j] === keys[i]) {
-	            keys[i] += ";?";
-	            j++;
-	        }
-	        else {
-	            keys[i] += ";";
-	        }
-	    }
-	    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
-	    var replace = getReplacer(entities_json_1.default);
-	    function replacer(str) {
-	        if (str.substr(-1) !== ";")
-	            str += ";";
-	        return replace(str);
-	    }
-	    //TODO consider creating a merged map
-	    return function (str) { return String(str).replace(re, replacer); };
-	})();
-	function getReplacer(map) {
-	    return function replace(str) {
-	        if (str.charAt(1) === "#") {
-	            var secondChar = str.charAt(2);
-	            if (secondChar === "X" || secondChar === "x") {
-	                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
-	            }
-	            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
-	        }
-	        return map[str.slice(1, -1)];
-	    };
-	}
-	});
-
-	var encode = createCommonjsModule(function (module, exports) {
-	var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
-	    return (mod && mod.__esModule) ? mod : { "default": mod };
-	};
-	Object.defineProperty(exports, "__esModule", { value: true });
-	exports.escape = exports.encodeHTML = exports.encodeXML = void 0;
-	var xml_json_1 = __importDefault(require$$0$1);
-	var inverseXML = getInverseObj(xml_json_1.default);
-	var xmlReplacer = getInverseReplacer(inverseXML);
-	exports.encodeXML = getInverse(inverseXML, xmlReplacer);
-	var entities_json_1 = __importDefault(require$$1);
-	var inverseHTML = getInverseObj(entities_json_1.default);
-	var htmlReplacer = getInverseReplacer(inverseHTML);
-	exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
-	function getInverseObj(obj) {
-	    return Object.keys(obj)
-	        .sort()
-	        .reduce(function (inverse, name) {
-	        inverse[obj[name]] = "&" + name + ";";
-	        return inverse;
-	    }, {});
-	}
-	function getInverseReplacer(inverse) {
-	    var single = [];
-	    var multiple = [];
-	    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
-	        var k = _a[_i];
-	        if (k.length === 1) {
-	            // Add value to single array
-	            single.push("\\" + k);
-	        }
-	        else {
-	            // Add value to multiple array
-	            multiple.push(k);
-	        }
-	    }
-	    // Add ranges to single characters.
-	    single.sort();
-	    for (var start = 0; start < single.length - 1; start++) {
-	        // Find the end of a run of characters
-	        var end = start;
-	        while (end < single.length - 1 &&
-	            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
-	            end += 1;
-	        }
-	        var count = 1 + end - start;
-	        // We want to replace at least three characters
-	        if (count < 3)
-	            continue;
-	        single.splice(start, count, single[start] + "-" + single[end]);
-	    }
-	    multiple.unshift("[" + single.join("") + "]");
-	    return new RegExp(multiple.join("|"), "g");
-	}
-	var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
-	function singleCharReplacer(c) {
-	    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-	    return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";";
-	}
-	function getInverse(inverse, re) {
-	    return function (data) {
-	        return data
-	            .replace(re, function (name) { return inverse[name]; })
-	            .replace(reNonASCII, singleCharReplacer);
-	    };
-	}
-	var reXmlChars = getInverseReplacer(inverseXML);
-	function escape(data) {
-	    return data
-	        .replace(reXmlChars, singleCharReplacer)
-	        .replace(reNonASCII, singleCharReplacer);
-	}
-	exports.escape = escape;
-	});
-
-	var lib$1 = createCommonjsModule(function (module, exports) {
-	Object.defineProperty(exports, "__esModule", { value: true });
-	exports.encode = exports.decodeStrict = exports.decode = void 0;
-
-
-	/**
-	 * Decodes a string with entities.
-	 *
-	 * @param data String to decode.
-	 * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
-	 */
-	function decode(data, level) {
-	    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data);
-	}
-	exports.decode = decode;
-	/**
-	 * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
-	 *
-	 * @param data String to decode.
-	 * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
-	 */
-	function decodeStrict(data, level) {
-	    return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data);
-	}
-	exports.decodeStrict = decodeStrict;
-	/**
-	 * Encodes a string with entities.
-	 *
-	 * @param data String to encode.
-	 * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
-	 */
-	function encode$1(data, level) {
-	    return (!level || level <= 0 ? encode.encodeXML : encode.encodeHTML)(data);
-	}
-	exports.encode = encode$1;
-	var encode_2 = encode;
-	Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
-	Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-	Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
-	// Legacy aliases
-	Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-	Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
-	var decode_2 = decode$2;
-	Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-	Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-	Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-	// Legacy aliases
-	Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-	Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
-	Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-	Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
-	Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
-	});
-
-	var elementNames = {
-		altglyph: "altGlyph",
-		altglyphdef: "altGlyphDef",
-		altglyphitem: "altGlyphItem",
-		animatecolor: "animateColor",
-		animatemotion: "animateMotion",
-		animatetransform: "animateTransform",
-		clippath: "clipPath",
-		feblend: "feBlend",
-		fecolormatrix: "feColorMatrix",
-		fecomponenttransfer: "feComponentTransfer",
-		fecomposite: "feComposite",
-		feconvolvematrix: "feConvolveMatrix",
-		fediffuselighting: "feDiffuseLighting",
-		fedisplacementmap: "feDisplacementMap",
-		fedistantlight: "feDistantLight",
-		fedropshadow: "feDropShadow",
-		feflood: "feFlood",
-		fefunca: "feFuncA",
-		fefuncb: "feFuncB",
-		fefuncg: "feFuncG",
-		fefuncr: "feFuncR",
-		fegaussianblur: "feGaussianBlur",
-		feimage: "feImage",
-		femerge: "feMerge",
-		femergenode: "feMergeNode",
-		femorphology: "feMorphology",
-		feoffset: "feOffset",
-		fepointlight: "fePointLight",
-		fespecularlighting: "feSpecularLighting",
-		fespotlight: "feSpotLight",
-		fetile: "feTile",
-		feturbulence: "feTurbulence",
-		foreignobject: "foreignObject",
-		glyphref: "glyphRef",
-		lineargradient: "linearGradient",
-		radialgradient: "radialGradient",
-		textpath: "textPath"
-	};
-	var attributeNames = {
-		definitionurl: "definitionURL",
-		attributename: "attributeName",
-		attributetype: "attributeType",
-		basefrequency: "baseFrequency",
-		baseprofile: "baseProfile",
-		calcmode: "calcMode",
-		clippathunits: "clipPathUnits",
-		diffuseconstant: "diffuseConstant",
-		edgemode: "edgeMode",
-		filterunits: "filterUnits",
-		glyphref: "glyphRef",
-		gradienttransform: "gradientTransform",
-		gradientunits: "gradientUnits",
-		kernelmatrix: "kernelMatrix",
-		kernelunitlength: "kernelUnitLength",
-		keypoints: "keyPoints",
-		keysplines: "keySplines",
-		keytimes: "keyTimes",
-		lengthadjust: "lengthAdjust",
-		limitingconeangle: "limitingConeAngle",
-		markerheight: "markerHeight",
-		markerunits: "markerUnits",
-		markerwidth: "markerWidth",
-		maskcontentunits: "maskContentUnits",
-		maskunits: "maskUnits",
-		numoctaves: "numOctaves",
-		pathlength: "pathLength",
-		patterncontentunits: "patternContentUnits",
-		patterntransform: "patternTransform",
-		patternunits: "patternUnits",
-		pointsatx: "pointsAtX",
-		pointsaty: "pointsAtY",
-		pointsatz: "pointsAtZ",
-		preservealpha: "preserveAlpha",
-		preserveaspectratio: "preserveAspectRatio",
-		primitiveunits: "primitiveUnits",
-		refx: "refX",
-		refy: "refY",
-		repeatcount: "repeatCount",
-		repeatdur: "repeatDur",
-		requiredextensions: "requiredExtensions",
-		requiredfeatures: "requiredFeatures",
-		specularconstant: "specularConstant",
-		specularexponent: "specularExponent",
-		spreadmethod: "spreadMethod",
-		startoffset: "startOffset",
-		stddeviation: "stdDeviation",
-		stitchtiles: "stitchTiles",
-		surfacescale: "surfaceScale",
-		systemlanguage: "systemLanguage",
-		tablevalues: "tableValues",
-		targetx: "targetX",
-		targety: "targetY",
-		textlength: "textLength",
-		viewbox: "viewBox",
-		viewtarget: "viewTarget",
-		xchannelselector: "xChannelSelector",
-		ychannelselector: "yChannelSelector",
-		zoomandpan: "zoomAndPan"
-	};
-	var foreignNames = {
-		elementNames: elementNames,
-		attributeNames: attributeNames
-	};
-
-	var foreignNames$1 = {
-		__proto__: null,
-		elementNames: elementNames,
-		attributeNames: attributeNames,
-		'default': foreignNames
-	};
-
-	var foreignNames$2 = getCjsExportFromNamespace(foreignNames$1);
-
-	var domSerializer = createCommonjsModule(function (module) {
-	/*
-	  Module dependencies
-	*/
-
-
-
-	/* mixed-case SVG and MathML tags & attributes
-	   recognized by the HTML parser, see
-	   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
-	*/
-
-	foreignNames$2.elementNames.__proto__ = null; /* use as a simple dictionary */
-	foreignNames$2.attributeNames.__proto__ = null;
-
-	var unencodedElements = {
-	  __proto__: null,
-	  style: true,
-	  script: true,
-	  xmp: true,
-	  iframe: true,
-	  noembed: true,
-	  noframes: true,
-	  plaintext: true,
-	  noscript: true
-	};
-
-	/*
-	  Format attributes
-	*/
-	function formatAttrs(attributes, opts) {
-	  if (!attributes) return;
-
-	  var output = '';
-	  var value;
-
-	  // Loop through the attributes
-	  for (var key in attributes) {
-	    value = attributes[key];
-	    if (output) {
-	      output += ' ';
-	    }
-
-	    if (opts.xmlMode === 'foreign') {
-	      /* fix up mixed-case attribute names */
-	      key = foreignNames$2.attributeNames[key] || key;
-	    }
-	    output += key;
-	    if ((value !== null && value !== '') || opts.xmlMode) {
-	      output +=
-	        '="' +
-	        (opts.decodeEntities
-	          ? lib$1.encodeXML(value)
-	          : value.replace(/\"/g, '&quot;')) +
-	        '"';
-	    }
-	  }
-
-	  return output;
-	}
-
-	/*
-	  Self-enclosing tags (stolen from node-htmlparser)
-	*/
-	var singleTag = {
-	  __proto__: null,
-	  area: true,
-	  base: true,
-	  basefont: true,
-	  br: true,
-	  col: true,
-	  command: true,
-	  embed: true,
-	  frame: true,
-	  hr: true,
-	  img: true,
-	  input: true,
-	  isindex: true,
-	  keygen: true,
-	  link: true,
-	  meta: true,
-	  param: true,
-	  source: true,
-	  track: true,
-	  wbr: true
-	};
-
-	var render = (module.exports = function(dom, opts) {
-	  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];
-	  opts = opts || {};
-
-	  var output = '';
-
-	  for (var i = 0; i < dom.length; i++) {
-	    var elem = dom[i];
-
-	    if (elem.type === 'root') output += render(elem.children, opts);
-	    else if (lib.isTag(elem)) output += renderTag(elem, opts);
-	    else if (elem.type === lib.Directive)
-	      output += renderDirective(elem);
-	    else if (elem.type === lib.Comment) output += renderComment(elem);
-	    else if (elem.type === lib.CDATA) output += renderCdata(elem);
-	    else output += renderText(elem, opts);
-	  }
-
-	  return output;
-	});
-
-	var foreignModeIntegrationPoints = [
-	  'mi',
-	  'mo',
-	  'mn',
-	  'ms',
-	  'mtext',
-	  'annotation-xml',
-	  'foreignObject',
-	  'desc',
-	  'title'
-	];
-
-	function renderTag(elem, opts) {
-	  // Handle SVG / MathML in HTML
-	  if (opts.xmlMode === 'foreign') {
-	    /* fix up mixed-case element names */
-	    elem.name = foreignNames$2.elementNames[elem.name] || elem.name;
-	    /* exit foreign mode at integration points */
-	    if (
-	      elem.parent &&
-	      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0
-	    )
-	      opts = Object.assign({}, opts, { xmlMode: false });
-	  }
-	  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {
-	    opts = Object.assign({}, opts, { xmlMode: 'foreign' });
-	  }
-
-	  var tag = '<' + elem.name;
-	  var attribs = formatAttrs(elem.attribs, opts);
-
-	  if (attribs) {
-	    tag += ' ' + attribs;
-	  }
-
-	  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {
-	    tag += '/>';
-	  } else {
-	    tag += '>';
-	    if (elem.children) {
-	      tag += render(elem.children, opts);
-	    }
-
-	    if (!singleTag[elem.name] || opts.xmlMode) {
-	      tag += '</' + elem.name + '>';
-	    }
-	  }
-
-	  return tag;
-	}
-
-	function renderDirective(elem) {
-	  return '<' + elem.data + '>';
-	}
-
-	function renderText(elem, opts) {
-	  var data = elem.data || '';
-
-	  // if entities weren't decoded, no need to encode them back
-	  if (
-	    opts.decodeEntities &&
-	    !(elem.parent && elem.parent.name in unencodedElements)
-	  ) {
-	    data = lib$1.encodeXML(data);
-	  }
-
-	  return data;
-	}
-
-	function renderCdata(elem) {
-	  return '<![CDATA[' + elem.children[0].data + ']]>';
-	}
-
-	function renderComment(elem) {
-	  return '<!--' + elem.data + '-->';
-	}
-	});
-
-	var isTag = domelementtype.isTag;
-
-	var stringify = {
-		getInnerHTML: getInnerHTML,
-		getOuterHTML: domSerializer,
-		getText: getText
-	};
-
-	function getInnerHTML(elem, opts){
-		return elem.children ? elem.children.map(function(elem){
-			return domSerializer(elem, opts);
-		}).join("") : "";
-	}
-
-	function getText(elem){
-		if(Array.isArray(elem)) return elem.map(getText).join("");
-		if(isTag(elem) || elem.type === domelementtype.CDATA) return getText(elem.children);
-		if(elem.type === domelementtype.Text) return elem.data;
-		return "";
-	}
-
-	var traversal = createCommonjsModule(function (module, exports) {
-	var getChildren = exports.getChildren = function(elem){
-		return elem.children;
-	};
-
-	var getParent = exports.getParent = function(elem){
-		return elem.parent;
-	};
-
-	exports.getSiblings = function(elem){
-		var parent = getParent(elem);
-		return parent ? getChildren(parent) : [elem];
-	};
-
-	exports.getAttributeValue = function(elem, name){
-		return elem.attribs && elem.attribs[name];
-	};
-
-	exports.hasAttrib = function(elem, name){
-		return !!elem.attribs && hasOwnProperty.call(elem.attribs, name);
-	};
-
-	exports.getName = function(elem){
-		return elem.name;
-	};
-	});
-
-	var removeElement = function(elem){
-		if(elem.prev) elem.prev.next = elem.next;
-		if(elem.next) elem.next.prev = elem.prev;
-
-		if(elem.parent){
-			var childs = elem.parent.children;
-			childs.splice(childs.lastIndexOf(elem), 1);
-		}
-	};
-
-	var replaceElement = function(elem, replacement){
-		var prev = replacement.prev = elem.prev;
-		if(prev){
-			prev.next = replacement;
-		}
-
-		var next = replacement.next = elem.next;
-		if(next){
-			next.prev = replacement;
-		}
-
-		var parent = replacement.parent = elem.parent;
-		if(parent){
-			var childs = parent.children;
-			childs[childs.lastIndexOf(elem)] = replacement;
-		}
-	};
-
-	var appendChild = function(elem, child){
-		child.parent = elem;
-
-		if(elem.children.push(child) !== 1){
-			var sibling = elem.children[elem.children.length - 2];
-			sibling.next = child;
-			child.prev = sibling;
-			child.next = null;
-		}
-	};
-
-	var append = function(elem, next){
-		var parent = elem.parent,
-			currNext = elem.next;
-
-		next.next = currNext;
-		next.prev = elem;
-		elem.next = next;
-		next.parent = parent;
-
-		if(currNext){
-			currNext.prev = next;
-			if(parent){
-				var childs = parent.children;
-				childs.splice(childs.lastIndexOf(currNext), 0, next);
-			}
-		} else if(parent){
-			parent.children.push(next);
-		}
-	};
-
-	var prepend = function(elem, prev){
-		var parent = elem.parent;
-		if(parent){
-			var childs = parent.children;
-			childs.splice(childs.lastIndexOf(elem), 0, prev);
-		}
-
-		if(elem.prev){
-			elem.prev.next = prev;
-		}
-		
-		prev.parent = parent;
-		prev.prev = elem.prev;
-		prev.next = elem;
-		elem.prev = prev;
-	};
-
-	var manipulation = {
-		removeElement: removeElement,
-		replaceElement: replaceElement,
-		appendChild: appendChild,
-		append: append,
-		prepend: prepend
-	};
-
-	var isTag$1 = domelementtype.isTag;
-
-	var querying = {
-		filter: filter,
-		find: find,
-		findOneChild: findOneChild,
-		findOne: findOne,
-		existsOne: existsOne,
-		findAll: findAll
-	};
-
-	function filter(test, element, recurse, limit){
-		if(!Array.isArray(element)) element = [element];
-
-		if(typeof limit !== "number" || !isFinite(limit)){
-			limit = Infinity;
-		}
-		return find(test, element, recurse !== false, limit);
-	}
-
-	function find(test, elems, recurse, limit){
-		var result = [], childs;
-
-		for(var i = 0, j = elems.length; i < j; i++){
-			if(test(elems[i])){
-				result.push(elems[i]);
-				if(--limit <= 0) break;
-			}
-
-			childs = elems[i].children;
-			if(recurse && childs && childs.length > 0){
-				childs = find(test, childs, recurse, limit);
-				result = result.concat(childs);
-				limit -= childs.length;
-				if(limit <= 0) break;
-			}
-		}
-
-		return result;
-	}
-
-	function findOneChild(test, elems){
-		for(var i = 0, l = elems.length; i < l; i++){
-			if(test(elems[i])) return elems[i];
-		}
-
-		return null;
-	}
-
-	function findOne(test, elems){
-		var elem = null;
-
-		for(var i = 0, l = elems.length; i < l && !elem; i++){
-			if(!isTag$1(elems[i])){
-				continue;
-			} else if(test(elems[i])){
-				elem = elems[i];
-			} else if(elems[i].children.length > 0){
-				elem = findOne(test, elems[i].children);
-			}
-		}
-
-		return elem;
-	}
-
-	function existsOne(test, elems){
-		for(var i = 0, l = elems.length; i < l; i++){
-			if(
-				isTag$1(elems[i]) && (
-					test(elems[i]) || (
-						elems[i].children.length > 0 &&
-						existsOne(test, elems[i].children)
-					)
-				)
-			){
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	function findAll(test, elems){
-		var result = [];
-		for(var i = 0, j = elems.length; i < j; i++){
-			if(!isTag$1(elems[i])) continue;
-			if(test(elems[i])) result.push(elems[i]);
-
-			if(elems[i].children.length > 0){
-				result = result.concat(findAll(test, elems[i].children));
-			}
-		}
-		return result;
-	}
-
-	var legacy$2 = createCommonjsModule(function (module, exports) {
-	var isTag = exports.isTag = domelementtype.isTag;
-
-	exports.testElement = function(options, element){
-		for(var key in options){
-			if(!options.hasOwnProperty(key));
-			else if(key === "tag_name"){
-				if(!isTag(element) || !options.tag_name(element.name)){
-					return false;
-				}
-			} else if(key === "tag_type"){
-				if(!options.tag_type(element.type)) return false;
-			} else if(key === "tag_contains"){
-				if(isTag(element) || !options.tag_contains(element.data)){
-					return false;
-				}
-			} else if(!element.attribs || !options[key](element.attribs[key])){
-				return false;
-			}
-		}
-		return true;
-	};
-
-	var Checks = {
-		tag_name: function(name){
-			if(typeof name === "function"){
-				return function(elem){ return isTag(elem) && name(elem.name); };
-			} else if(name === "*"){
-				return isTag;
-			} else {
-				return function(elem){ return isTag(elem) && elem.name === name; };
-			}
-		},
-		tag_type: function(type){
-			if(typeof type === "function"){
-				return function(elem){ return type(elem.type); };
-			} else {
-				return function(elem){ return elem.type === type; };
-			}
-		},
-		tag_contains: function(data){
-			if(typeof data === "function"){
-				return function(elem){ return !isTag(elem) && data(elem.data); };
-			} else {
-				return function(elem){ return !isTag(elem) && elem.data === data; };
-			}
-		}
-	};
-
-	function getAttribCheck(attrib, value){
-		if(typeof value === "function"){
-			return function(elem){ return elem.attribs && value(elem.attribs[attrib]); };
-		} else {
-			return function(elem){ return elem.attribs && elem.attribs[attrib] === value; };
-		}
-	}
-
-	function combineFuncs(a, b){
-		return function(elem){
-			return a(elem) || b(elem);
-		};
-	}
-
-	exports.getElements = function(options, element, recurse, limit){
-		var funcs = Object.keys(options).map(function(key){
-			var value = options[key];
-			return key in Checks ? Checks[key](value) : getAttribCheck(key, value);
-		});
-
-		return funcs.length === 0 ? [] : this.filter(
-			funcs.reduce(combineFuncs),
-			element, recurse, limit
-		);
-	};
-
-	exports.getElementById = function(id, element, recurse){
-		if(!Array.isArray(element)) element = [element];
-		return this.findOne(getAttribCheck("id", id), element, recurse !== false);
-	};
-
-	exports.getElementsByTagName = function(name, element, recurse, limit){
-		return this.filter(Checks.tag_name(name), element, recurse, limit);
-	};
-
-	exports.getElementsByTagType = function(type, element, recurse, limit){
-		return this.filter(Checks.tag_type(type), element, recurse, limit);
-	};
-	});
-
-	var helpers = createCommonjsModule(function (module, exports) {
-	// removeSubsets
-	// Given an array of nodes, remove any member that is contained by another.
-	exports.removeSubsets = function(nodes) {
-		var idx = nodes.length, node, ancestor, replace;
-
-		// Check if each node (or one of its ancestors) is already contained in the
-		// array.
-		while (--idx > -1) {
-			node = ancestor = nodes[idx];
-
-			// Temporarily remove the node under consideration
-			nodes[idx] = null;
-			replace = true;
-
-			while (ancestor) {
-				if (nodes.indexOf(ancestor) > -1) {
-					replace = false;
-					nodes.splice(idx, 1);
-					break;
-				}
-				ancestor = ancestor.parent;
-			}
-
-			// If the node has been found to be unique, re-insert it.
-			if (replace) {
-				nodes[idx] = node;
-			}
-		}
-
-		return nodes;
-	};
-
-	// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition
-	var POSITION = {
-		DISCONNECTED: 1,
-		PRECEDING: 2,
-		FOLLOWING: 4,
-		CONTAINS: 8,
-		CONTAINED_BY: 16
-	};
-
-	// Compare the position of one node against another node in any other document.
-	// The return value is a bitmask with the following values:
-	//
-	// document order:
-	// > There is an ordering, document order, defined on all the nodes in the
-	// > document corresponding to the order in which the first character of the
-	// > XML representation of each node occurs in the XML representation of the
-	// > document after expansion of general entities. Thus, the document element
-	// > node will be the first node. Element nodes occur before their children.
-	// > Thus, document order orders element nodes in order of the occurrence of
-	// > their start-tag in the XML (after expansion of entities). The attribute
-	// > nodes of an element occur after the element and before its children. The
-	// > relative order of attribute nodes is implementation-dependent./
-	// Source:
-	// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
-	//
-	// @argument {Node} nodaA The first node to use in the comparison
-	// @argument {Node} nodeB The second node to use in the comparison
-	//
-	// @return {Number} A bitmask describing the input nodes' relative position.
-	//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
-	//         a description of these values.
-	var comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {
-		var aParents = [];
-		var bParents = [];
-		var current, sharedParent, siblings, aSibling, bSibling, idx;
-
-		if (nodeA === nodeB) {
-			return 0;
-		}
-
-		current = nodeA;
-		while (current) {
-			aParents.unshift(current);
-			current = current.parent;
-		}
-		current = nodeB;
-		while (current) {
-			bParents.unshift(current);
-			current = current.parent;
-		}
-
-		idx = 0;
-		while (aParents[idx] === bParents[idx]) {
-			idx++;
-		}
-
-		if (idx === 0) {
-			return POSITION.DISCONNECTED;
-		}
-
-		sharedParent = aParents[idx - 1];
-		siblings = sharedParent.children;
-		aSibling = aParents[idx];
-		bSibling = bParents[idx];
-
-		if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
-			if (sharedParent === nodeB) {
-				return POSITION.FOLLOWING | POSITION.CONTAINED_BY;
-			}
-			return POSITION.FOLLOWING;
-		} else {
-			if (sharedParent === nodeA) {
-				return POSITION.PRECEDING | POSITION.CONTAINS;
-			}
-			return POSITION.PRECEDING;
-		}
-	};
-
-	// Sort an array of nodes based on their relative position in the document and
-	// remove any duplicate nodes. If the array contains nodes that do not belong
-	// to the same document, sort order is unspecified.
-	//
-	// @argument {Array} nodes Array of DOM nodes
-	//
-	// @returns {Array} collection of unique nodes, sorted in document order
-	exports.uniqueSort = function(nodes) {
-		var idx = nodes.length, node, position;
-
-		nodes = nodes.slice();
-
-		while (--idx > -1) {
-			node = nodes[idx];
-			position = nodes.indexOf(node);
-			if (position > -1 && position < idx) {
-				nodes.splice(idx, 1);
-			}
-		}
-		nodes.sort(function(a, b) {
-			var relative = comparePos(a, b);
-			if (relative & POSITION.PRECEDING) {
-				return -1;
-			} else if (relative & POSITION.FOLLOWING) {
-				return 1;
-			}
-			return 0;
-		});
-
-		return nodes;
-	};
-	});
-
-	var domutils = createCommonjsModule(function (module) {
-	var DomUtils = module.exports;
-
-	[
-		stringify,
-		traversal,
-		manipulation,
-		querying,
-		legacy$2,
-		helpers
-	].forEach(function(ext){
-		Object.keys(ext).forEach(function(key){
-			DomUtils[key] = ext[key].bind(DomUtils);
-		});
-	});
-	});
-
-	var parse_1 = parse;
-
-	//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
-
-	//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
-	var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
-
-	/*
-		parses a nth-check formula, returns an array of two numbers
-	*/
-	function parse(formula){
-		formula = formula.trim().toLowerCase();
-
-		if(formula === "even"){
-			return [2, 0];
-		} else if(formula === "odd"){
-			return [2, 1];
-		} else {
-			var parsed = formula.match(re_nthElement);
-
-			if(!parsed){
-				throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')");
-			}
-
-			var a;
-
-			if(parsed[1]){
-				a = parseInt(parsed[1], 10);
-				if(isNaN(a)){
-					if(parsed[1].charAt(0) === "-") a = -1;
-					else a = 1;
-				}
-			} else a = 0;
-
-			return [
-				a,
-				parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0
-			];
-		}
-	}
-
-	var boolbase = {
-		trueFunc: function trueFunc(){
-			return true;
-		},
-		falseFunc: function falseFunc(){
-			return false;
-		}
-	};
-
-	var compile_1 = compile;
-
-	var trueFunc  = boolbase.trueFunc,
-	    falseFunc = boolbase.falseFunc;
-
-	/*
-		returns a function that checks if an elements index matches the given rule
-		highly optimized to return the fastest solution
-	*/
-	function compile(parsed){
-		var a = parsed[0],
-		    b = parsed[1] - 1;
-
-		//when b <= 0, a*n won't be possible for any matches when a < 0
-		//besides, the specification says that no element is matched when a and b are 0
-		if(b < 0 && a <= 0) return falseFunc;
-
-		//when a is in the range -1..1, it matches any element (so only b is checked)
-		if(a ===-1) return function(pos){ return pos <= b; };
-		if(a === 0) return function(pos){ return pos === b; };
-		//when b <= 0 and a === 1, they match any element
-		if(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };
-
-		//when a > 0, modulo can be used to check if there is a match
-		var bMod = b % a;
-		if(bMod < 0) bMod += a;
-
-		if(a > 1){
-			return function(pos){
-				return pos >= b && pos % a === bMod;
-			};
-		}
-
-		a *= -1; //make `a` positive
-
-		return function(pos){
-			return pos <= b && pos % a === bMod;
-		};
-	}
-
-	var nthCheck = function nthCheck(formula){
-		return compile_1(parse_1(formula));
-	};
-
-	var parse_1$1 = parse_1;
-	var compile_1$1 = compile_1;
-	nthCheck.parse = parse_1$1;
-	nthCheck.compile = compile_1$1;
-
-	var hasAttrib = domutils.hasAttrib,
-	    getAttributeValue = domutils.getAttributeValue,
-	    falseFunc$1 = boolbase.falseFunc;
-
-	//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469
-	var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
-
-	/*
-		attribute selectors
-	*/
-
-	var attributeRules = {
-		__proto__: null,
-		equals: function(next, data){
-			var name  = data.name,
-			    value = data.value;
-
-			if(data.ignoreCase){
-				value = value.toLowerCase();
-
-				return function equalsIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null && attr.toLowerCase() === value && next(elem);
-				};
-			}
-
-			return function equals(elem){
-				return getAttributeValue(elem, name) === value && next(elem);
-			};
-		},
-		hyphen: function(next, data){
-			var name  = data.name,
-			    value = data.value,
-			    len = value.length;
-
-			if(data.ignoreCase){
-				value = value.toLowerCase();
-
-				return function hyphenIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null &&
-							(attr.length === len || attr.charAt(len) === "-") &&
-							attr.substr(0, len).toLowerCase() === value &&
-							next(elem);
-				};
-			}
-
-			return function hyphen(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null &&
-						attr.substr(0, len) === value &&
-						(attr.length === len || attr.charAt(len) === "-") &&
-						next(elem);
-			};
-		},
-		element: function(next, data){
-			var name = data.name,
-			    value = data.value;
-
-			if(/\s/.test(value)){
-				return falseFunc$1;
-			}
-
-			value = value.replace(reChars, "\\$&");
-
-			var pattern = "(?:^|\\s)" + value + "(?:$|\\s)",
-			    flags = data.ignoreCase ? "i" : "",
-			    regex = new RegExp(pattern, flags);
-
-			return function element(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && regex.test(attr) && next(elem);
-			};
-		},
-		exists: function(next, data){
-			var name = data.name;
-			return function exists(elem){
-				return hasAttrib(elem, name) && next(elem);
-			};
-		},
-		start: function(next, data){
-			var name  = data.name,
-			    value = data.value,
-			    len = value.length;
-
-			if(len === 0){
-				return falseFunc$1;
-			}
-			
-			if(data.ignoreCase){
-				value = value.toLowerCase();
-
-				return function startIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);
-				};
-			}
-
-			return function start(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(0, len) === value && next(elem);
-			};
-		},
-		end: function(next, data){
-			var name  = data.name,
-			    value = data.value,
-			    len   = -value.length;
-
-			if(len === 0){
-				return falseFunc$1;
-			}
-
-			if(data.ignoreCase){
-				value = value.toLowerCase();
-
-				return function endIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null && attr.substr(len).toLowerCase() === value && next(elem);
-				};
-			}
-
-			return function end(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.substr(len) === value && next(elem);
-			};
-		},
-		any: function(next, data){
-			var name  = data.name,
-			    value = data.value;
-
-			if(value === ""){
-				return falseFunc$1;
-			}
-
-			if(data.ignoreCase){
-				var regex = new RegExp(value.replace(reChars, "\\$&"), "i");
-
-				return function anyIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null && regex.test(attr) && next(elem);
-				};
-			}
-
-			return function any(elem){
-				var attr = getAttributeValue(elem, name);
-				return attr != null && attr.indexOf(value) >= 0 && next(elem);
-			};
-		},
-		not: function(next, data){
-			var name  = data.name,
-			    value = data.value;
-
-			if(value === ""){
-				return function notEmpty(elem){
-					return !!getAttributeValue(elem, name) && next(elem);
-				};
-			} else if(data.ignoreCase){
-				value = value.toLowerCase();
-
-				return function notIC(elem){
-					var attr = getAttributeValue(elem, name);
-					return attr != null && attr.toLowerCase() !== value && next(elem);
-				};
-			}
-
-			return function not(elem){
-				return getAttributeValue(elem, name) !== value && next(elem);
-			};
-		}
-	};
-
-	var attributes = {
-		compile: function(next, data, options){
-			if(options && options.strict && (
-				data.ignoreCase || data.action === "not"
-			)) throw SyntaxError("Unsupported attribute selector");
-			return attributeRules[data.action](next, data);
-		},
-		rules: attributeRules
-	};
-
-	/*
-		pseudo selectors
-
-		---
-
-		they are available in two forms:
-		* filters called when the selector
-		  is compiled and return a function
-		  that needs to return next()
-		* pseudos get called on execution
-		  they need to return a boolean
-	*/
-
-	var isTag$2       = domutils.isTag,
-	    getText$1     = domutils.getText,
-	    getParent   = domutils.getParent,
-	    getChildren = domutils.getChildren,
-	    getSiblings = domutils.getSiblings,
-	    hasAttrib$1   = domutils.hasAttrib,
-	    getName     = domutils.getName,
-	    getAttribute= domutils.getAttributeValue,
-	    checkAttrib = attributes.rules.equals,
-	    trueFunc$1    = boolbase.trueFunc,
-	    falseFunc$2   = boolbase.falseFunc;
-
-	//helper methods
-	function getFirstElement(elems){
-		for(var i = 0; elems && i < elems.length; i++){
-			if(isTag$2(elems[i])) return elems[i];
-		}
-	}
-
-	function getAttribFunc(name, value){
-		var data = {name: name, value: value};
-		return function attribFunc(next){
-			return checkAttrib(next, data);
-		};
-	}
-
-	function getChildFunc(next){
-		return function(elem){
-			return !!getParent(elem) && next(elem);
-		};
-	}
-
-	var filters = {
-		contains: function(next, text){
-			return function contains(elem){
-				return next(elem) && getText$1(elem).indexOf(text) >= 0;
-			};
-		},
-		icontains: function(next, text){
-			var itext = text.toLowerCase();
-			return function icontains(elem){
-				return next(elem) &&
-					getText$1(elem).toLowerCase().indexOf(itext) >= 0;
-			};
-		},
-
-		//location specific methods
-		"nth-child": function(next, rule){
-			var func = nthCheck(rule);
-
-			if(func === falseFunc$2) return func;
-			if(func === trueFunc$1)  return getChildFunc(next);
-
-			return function nthChild(elem){
-				var siblings = getSiblings(elem);
-
-				for(var i = 0, pos = 0; i < siblings.length; i++){
-					if(isTag$2(siblings[i])){
-						if(siblings[i] === elem) break;
-						else pos++;
-					}
-				}
-
-				return func(pos) && next(elem);
-			};
-		},
-		"nth-last-child": function(next, rule){
-			var func = nthCheck(rule);
-
-			if(func === falseFunc$2) return func;
-			if(func === trueFunc$1)  return getChildFunc(next);
-
-			return function nthLastChild(elem){
-				var siblings = getSiblings(elem);
-
-				for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-					if(isTag$2(siblings[i])){
-						if(siblings[i] === elem) break;
-						else pos++;
-					}
-				}
-
-				return func(pos) && next(elem);
-			};
-		},
-		"nth-of-type": function(next, rule){
-			var func = nthCheck(rule);
-
-			if(func === falseFunc$2) return func;
-			if(func === trueFunc$1)  return getChildFunc(next);
-
-			return function nthOfType(elem){
-				var siblings = getSiblings(elem);
-
-				for(var pos = 0, i = 0; i < siblings.length; i++){
-					if(isTag$2(siblings[i])){
-						if(siblings[i] === elem) break;
-						if(getName(siblings[i]) === getName(elem)) pos++;
-					}
-				}
-
-				return func(pos) && next(elem);
-			};
-		},
-		"nth-last-of-type": function(next, rule){
-			var func = nthCheck(rule);
-
-			if(func === falseFunc$2) return func;
-			if(func === trueFunc$1)  return getChildFunc(next);
-
-			return function nthLastOfType(elem){
-				var siblings = getSiblings(elem);
-
-				for(var pos = 0, i = siblings.length - 1; i >= 0; i--){
-					if(isTag$2(siblings[i])){
-						if(siblings[i] === elem) break;
-						if(getName(siblings[i]) === getName(elem)) pos++;
-					}
-				}
-
-				return func(pos) && next(elem);
-			};
-		},
-
-	    //TODO determine the actual root element
-	    root: function(next){
-	        return function(elem){
-	            return !getParent(elem) && next(elem);
-	        };
-	    },
-
-	    scope: function(next, rule, options, context){
-	        if(!context || context.length === 0){
-	            //equivalent to :root
-	            return filters.root(next);
-	        }
-
-	        if(context.length === 1){
-	            //NOTE: can't be unpacked, as :has uses this for side-effects
-	            return function(elem){
-	                return context[0] === elem && next(elem);
-	            };
-	        }
-
-	        return function(elem){
-	            return context.indexOf(elem) >= 0 && next(elem);
-	        };
-	    },
-
-		//jQuery extensions (others follow as pseudos)
-		checkbox: getAttribFunc("type", "checkbox"),
-		file: getAttribFunc("type", "file"),
-		password: getAttribFunc("type", "password"),
-		radio: getAttribFunc("type", "radio"),
-		reset: getAttribFunc("type", "reset"),
-		image: getAttribFunc("type", "image"),
-		submit: getAttribFunc("type", "submit")
-	};
-
-	//while filters are precompiled, pseudos get called when they are needed
-	var pseudos = {
-		empty: function(elem){
-			return !getChildren(elem).some(function(elem){
-				return isTag$2(elem) || elem.type === "text";
-			});
-		},
-
-		"first-child": function(elem){
-			return getFirstElement(getSiblings(elem)) === elem;
-		},
-		"last-child": function(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = siblings.length - 1; i >= 0; i--){
-				if(siblings[i] === elem) return true;
-				if(isTag$2(siblings[i])) break;
-			}
-
-			return false;
-		},
-		"first-of-type": function(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) return true;
-					if(getName(siblings[i]) === getName(elem)) break;
-				}
-			}
-
-			return false;
-		},
-		"last-of-type": function(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = siblings.length-1; i >= 0; i--){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) return true;
-					if(getName(siblings[i]) === getName(elem)) break;
-				}
-			}
-
-			return false;
-		},
-		"only-of-type": function(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0, j = siblings.length; i < j; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem) continue;
-					if(getName(siblings[i]) === getName(elem)) return false;
-				}
-			}
-
-			return true;
-		},
-		"only-child": function(elem){
-			var siblings = getSiblings(elem);
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i]) && siblings[i] !== elem) return false;
-			}
-
-			return true;
-		},
-
-		//:matches(a, area, link)[href]
-		link: function(elem){
-			return hasAttrib$1(elem, "href");
-		},
-		visited: falseFunc$2, //seems to be a valid implementation
-		//TODO: :any-link once the name is finalized (as an alias of :link)
-
-		//forms
-		//to consider: :target
-
-		//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)
-		selected: function(elem){
-			if(hasAttrib$1(elem, "selected")) return true;
-			else if(getName(elem) !== "option") return false;
-
-			//the first <option> in a <select> is also selected
-			var parent = getParent(elem);
-
-			if(
-				!parent ||
-				getName(parent) !== "select" ||
-				hasAttrib$1(parent, "multiple")
-			) return false;
-
-			var siblings = getChildren(parent),
-				sawElem  = false;
-
-			for(var i = 0; i < siblings.length; i++){
-				if(isTag$2(siblings[i])){
-					if(siblings[i] === elem){
-						sawElem = true;
-					} else if(!sawElem){
-						return false;
-					} else if(hasAttrib$1(siblings[i], "selected")){
-						return false;
-					}
-				}
-			}
-
-			return sawElem;
-		},
-		//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
-		//:matches(
-		//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],
-		//  optgroup[disabled] > option),
-		// fieldset[disabled] * //TODO not child of first <legend>
-		//)
-		disabled: function(elem){
-			return hasAttrib$1(elem, "disabled");
-		},
-		enabled: function(elem){
-			return !hasAttrib$1(elem, "disabled");
-		},
-		//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)
-		checked: function(elem){
-			return hasAttrib$1(elem, "checked") || pseudos.selected(elem);
-		},
-		//:matches(input, select, textarea)[required]
-		required: function(elem){
-			return hasAttrib$1(elem, "required");
-		},
-		//:matches(input, select, textarea):not([required])
-		optional: function(elem){
-			return !hasAttrib$1(elem, "required");
-		},
-
-		//jQuery extensions
-
-		//:not(:empty)
-		parent: function(elem){
-			return !pseudos.empty(elem);
-		},
-		//:matches(h1, h2, h3, h4, h5, h6)
-		header: function(elem){
-			var name = getName(elem);
-			return name === "h1" ||
-			       name === "h2" ||
-			       name === "h3" ||
-			       name === "h4" ||
-			       name === "h5" ||
-			       name === "h6";
-		},
-
-		//:matches(button, input[type=button])
-		button: function(elem){
-			var name = getName(elem);
-			return name === "button" ||
-			       name === "input" &&
-			       getAttribute(elem, "type") === "button";
-		},
-		//:matches(input, textarea, select, button)
-		input: function(elem){
-			var name = getName(elem);
-			return name === "input" ||
-			       name === "textarea" ||
-			       name === "select" ||
-			       name === "button";
-		},
-		//input:matches(:not([type!='']), [type='text' i])
-		text: function(elem){
-			var attr;
-			return getName(elem) === "input" && (
-				!(attr = getAttribute(elem, "type")) ||
-				attr.toLowerCase() === "text"
-			);
-		}
-	};
-
-	function verifyArgs(func, name, subselect){
-		if(subselect === null){
-			if(func.length > 1 && name !== "scope"){
-				throw new SyntaxError("pseudo-selector :" + name + " requires an argument");
-			}
-		} else {
-			if(func.length === 1){
-				throw new SyntaxError("pseudo-selector :" + name + " doesn't have any arguments");
-			}
-		}
-	}
-
-	//FIXME this feels hacky
-	var re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;
-
-	var pseudos_1 = {
-		compile: function(next, data, options, context){
-			var name = data.name,
-				subselect = data.data;
-
-			if(options && options.strict && !re_CSS3.test(name)){
-				throw SyntaxError(":" + name + " isn't part of CSS3");
-			}
-
-			if(typeof filters[name] === "function"){
-				verifyArgs(filters[name], name,  subselect);
-				return filters[name](next, subselect, options, context);
-			} else if(typeof pseudos[name] === "function"){
-				var func = pseudos[name];
-				verifyArgs(func, name, subselect);
-
-				if(next === trueFunc$1) return func;
-
-				return function pseudoArgs(elem){
-					return func(elem, subselect) && next(elem);
-				};
-			} else {
-				throw new SyntaxError("unmatched pseudo-class :" + name);
-			}
-		},
-		filters: filters,
-		pseudos: pseudos
-	};
-
-	var cssWhat = parse$1;
-
-	var re_name = /^(?:\\.|[\w\-\u00b0-\uFFFF])+/,
-	    re_escape = /\\([\da-f]{1,6}\s?|(\s)|.)/ig,
-	    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
-	    re_attr = /^\s*((?:\\.|[\w\u00b0-\uFFFF\-])+)\s*(?:(\S?)=\s*(?:(['"])([^]*?)\3|(#?(?:\\.|[\w\u00b0-\uFFFF\-])*)|)|)\s*(i)?\]/;
-
-	var actionTypes = {
-		__proto__: null,
-		"undefined": "exists",
-		"":  "equals",
-		"~": "element",
-		"^": "start",
-		"$": "end",
-		"*": "any",
-		"!": "not",
-		"|": "hyphen"
-	};
-
-	var simpleSelectors = {
-		__proto__: null,
-		">": "child",
-		"<": "parent",
-		"~": "sibling",
-		"+": "adjacent"
-	};
-
-	var attribSelectors = {
-		__proto__: null,
-		"#": ["id", "equals"],
-		".": ["class", "element"]
-	};
-
-	//pseudos, whose data-property is parsed as well
-	var unpackPseudos = {
-		__proto__: null,
-		"has": true,
-		"not": true,
-		"matches": true
-	};
-
-	var stripQuotesFromPseudos = {
-		__proto__: null,
-		"contains": true,
-		"icontains": true
-	};
-
-	var quotes = {
-		__proto__: null,
-		"\"": true,
-		"'": true
-	};
-
-	//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139
-	function funescape( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			// BMP codepoint
-			high < 0 ?
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	}
-
-	function unescapeCSS(str){
-		return str.replace(re_escape, funescape);
-	}
-
-	function isWhitespace(c){
-		return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
-	}
-
-	function parse$1(selector, options){
-		var subselects = [];
-
-		selector = parseSelector(subselects, selector + "", options);
-
-		if(selector !== ""){
-			throw new SyntaxError("Unmatched selector: " + selector);
-		}
-
-		return subselects;
-	}
-
-	function parseSelector(subselects, selector, options){
-		var tokens = [],
-			sawWS = false,
-			data, firstChar, name, quot;
-
-		function getName(){
-			var sub = selector.match(re_name)[0];
-			selector = selector.substr(sub.length);
-			return unescapeCSS(sub);
-		}
-
-		function stripWhitespace(start){
-			while(isWhitespace(selector.charAt(start))) start++;
-			selector = selector.substr(start);
-		}
-
-		function isEscaped(pos) {
-			var slashCount = 0;
-
-			while (selector.charAt(--pos) === "\\") slashCount++;
-			return (slashCount & 1) === 1;
-		}
-
-		stripWhitespace(0);
-
-		while(selector !== ""){
-			firstChar = selector.charAt(0);
-
-			if(isWhitespace(firstChar)){
-				sawWS = true;
-				stripWhitespace(1);
-			} else if(firstChar in simpleSelectors){
-				tokens.push({type: simpleSelectors[firstChar]});
-				sawWS = false;
-
-				stripWhitespace(1);
-			} else if(firstChar === ","){
-				if(tokens.length === 0){
-					throw new SyntaxError("empty sub-selector");
-				}
-				subselects.push(tokens);
-				tokens = [];
-				sawWS = false;
-				stripWhitespace(1);
-			} else {
-				if(sawWS){
-					if(tokens.length > 0){
-						tokens.push({type: "descendant"});
-					}
-					sawWS = false;
-				}
-
-				if(firstChar === "*"){
-					selector = selector.substr(1);
-					tokens.push({type: "universal"});
-				} else if(firstChar in attribSelectors){
-					selector = selector.substr(1);
-					tokens.push({
-						type: "attribute",
-						name: attribSelectors[firstChar][0],
-						action: attribSelectors[firstChar][1],
-						value: getName(),
-						ignoreCase: false
-					});
-				} else if(firstChar === "["){
-					selector = selector.substr(1);
-					data = selector.match(re_attr);
-					if(!data){
-						throw new SyntaxError("Malformed attribute selector: " + selector);
-					}
-					selector = selector.substr(data[0].length);
-					name = unescapeCSS(data[1]);
-
-					if(
-						!options || (
-							"lowerCaseAttributeNames" in options ?
-								options.lowerCaseAttributeNames :
-								!options.xmlMode
-						)
-					){
-						name = name.toLowerCase();
-					}
-
-					tokens.push({
-						type: "attribute",
-						name: name,
-						action: actionTypes[data[2]],
-						value: unescapeCSS(data[4] || data[5] || ""),
-						ignoreCase: !!data[6]
-					});
-
-				} else if(firstChar === ":"){
-					if(selector.charAt(1) === ":"){
-						selector = selector.substr(2);
-						tokens.push({type: "pseudo-element", name: getName().toLowerCase()});
-						continue;
-					}
-
-					selector = selector.substr(1);
-
-					name = getName().toLowerCase();
-					data = null;
-
-					if(selector.charAt(0) === "("){
-						if(name in unpackPseudos){
-							quot = selector.charAt(1);
-							var quoted = quot in quotes;
-
-							selector = selector.substr(quoted + 1);
-
-							data = [];
-							selector = parseSelector(data, selector, options);
-
-							if(quoted){
-								if(selector.charAt(0) !== quot){
-									throw new SyntaxError("unmatched quotes in :" + name);
-								} else {
-									selector = selector.substr(1);
-								}
-							}
-
-							if(selector.charAt(0) !== ")"){
-								throw new SyntaxError("missing closing parenthesis in :" + name + " " + selector);
-							}
-
-							selector = selector.substr(1);
-						} else {
-							var pos = 1, counter = 1;
-
-							for(; counter > 0 && pos < selector.length; pos++){
-								if(selector.charAt(pos) === "(" && !isEscaped(pos)) counter++;
-								else if(selector.charAt(pos) === ")" && !isEscaped(pos)) counter--;
-							}
-
-							if(counter){
-								throw new SyntaxError("parenthesis not matched");
-							}
-
-							data = selector.substr(1, pos - 2);
-							selector = selector.substr(pos);
-
-							if(name in stripQuotesFromPseudos){
-								quot = data.charAt(0);
-
-								if(quot === data.slice(-1) && quot in quotes){
-									data = data.slice(1, -1);
-								}
-
-								data = unescapeCSS(data);
-							}
-						}
-					}
-
-					tokens.push({type: "pseudo", name: name, data: data});
-				} else if(re_name.test(selector)){
-					name = getName();
-
-					if(!options || ("lowerCaseTags" in options ? options.lowerCaseTags : !options.xmlMode)){
-						name = name.toLowerCase();
-					}
-
-					tokens.push({type: "tag", name: name});
-				} else {
-					if(tokens.length && tokens[tokens.length - 1].type === "descendant"){
-						tokens.pop();
-					}
-					addToken(subselects, tokens);
-					return selector;
-				}
-			}
-		}
-
-		addToken(subselects, tokens);
-
-		return selector;
-	}
-
-	function addToken(subselects, tokens){
-		if(subselects.length > 0 && tokens.length === 0){
-			throw new SyntaxError("empty sub-selector");
-		}
-
-		subselects.push(tokens);
-	}
-
-	var isTag$3       = domutils.isTag,
-	    getParent$1   = domutils.getParent,
-	    getChildren$1 = domutils.getChildren,
-	    getSiblings$1 = domutils.getSiblings,
-	    getName$1     = domutils.getName;
-
-	/*
-		all available rules
-	*/
-	var general = {
-		__proto__: null,
-
-		attribute: attributes.compile,
-		pseudo: pseudos_1.compile,
-
-		//tags
-		tag: function(next, data){
-			var name = data.name;
-			return function tag(elem){
-				return getName$1(elem) === name && next(elem);
-			};
-		},
-
-		//traversal
-		descendant: function(next, rule, options, context, acceptSelf){
-			return function descendant(elem){
-
-				if (acceptSelf && next(elem)) return true;
-
-				var found = false;
-
-				while(!found && (elem = getParent$1(elem))){
-					found = next(elem);
-				}
-
-				return found;
-			};
-		},
-		parent: function(next, data, options){
-			if(options && options.strict) throw SyntaxError("Parent selector isn't part of CSS3");
-
-			return function parent(elem){
-				return getChildren$1(elem).some(test);
-			};
-
-			function test(elem){
-				return isTag$3(elem) && next(elem);
-			}
-		},
-		child: function(next){
-			return function child(elem){
-				var parent = getParent$1(elem);
-				return !!parent && next(parent);
-			};
-		},
-		sibling: function(next){
-			return function sibling(elem){
-				var siblings = getSiblings$1(elem);
-
-				for(var i = 0; i < siblings.length; i++){
-					if(isTag$3(siblings[i])){
-						if(siblings[i] === elem) break;
-						if(next(siblings[i])) return true;
-					}
-				}
-
-				return false;
-			};
-		},
-		adjacent: function(next){
-			return function adjacent(elem){
-				var siblings = getSiblings$1(elem),
-				    lastElement;
-
-				for(var i = 0; i < siblings.length; i++){
-					if(isTag$3(siblings[i])){
-						if(siblings[i] === elem) break;
-						lastElement = siblings[i];
-					}
-				}
-
-				return !!lastElement && next(lastElement);
-			};
-		},
-		universal: function(next){
-			return next;
-		}
-	};
-
-	var universal = 50;
-	var tag = 30;
-	var attribute = 1;
-	var pseudo = 0;
-	var descendant = -1;
-	var child = -1;
-	var parent = -1;
-	var sibling = -1;
-	var adjacent = -1;
-	var procedure = {
-		universal: universal,
-		tag: tag,
-		attribute: attribute,
-		pseudo: pseudo,
-		descendant: descendant,
-		child: child,
-		parent: parent,
-		sibling: sibling,
-		adjacent: adjacent
-	};
-
-	var procedure$1 = {
-		__proto__: null,
-		universal: universal,
-		tag: tag,
-		attribute: attribute,
-		pseudo: pseudo,
-		descendant: descendant,
-		child: child,
-		parent: parent,
-		sibling: sibling,
-		adjacent: adjacent,
-		'default': procedure
-	};
-
-	var procedure$2 = getCjsExportFromNamespace(procedure$1);
-
-	var sort = sortByProcedure;
-
-	/*
-		sort the parts of the passed selector,
-		as there is potential for optimization
-		(some types of selectors are faster than others)
-	*/
-
-
-
-	var attributes$1 = {
-		__proto__: null,
-		exists: 10,
-		equals: 8,
-		not: 7,
-		start: 6,
-		end: 6,
-		any: 5,
-		hyphen: 4,
-		element: 4
-	};
-
-	function sortByProcedure(arr){
-		var procs = arr.map(getProcedure);
-		for(var i = 1; i < arr.length; i++){
-			var procNew = procs[i];
-
-			if(procNew < 0) continue;
-
-			for(var j = i - 1; j >= 0 && procNew < procs[j]; j--){
-				var token = arr[j + 1];
-				arr[j + 1] = arr[j];
-				arr[j] = token;
-				procs[j + 1] = procs[j];
-				procs[j] = procNew;
-			}
-		}
-	}
-
-	function getProcedure(token){
-		var proc = procedure$2[token.type];
-
-		if(proc === procedure$2.attribute){
-			proc = attributes$1[token.action];
-
-			if(proc === attributes$1.equals && token.name === "id"){
-				//prefer ID selectors (eg. #ID)
-				proc = 9;
-			}
-
-			if(token.ignoreCase){
-				//ignoreCase adds some overhead, prefer "normal" token
-				//this is a binary operation, to ensure it's still an int
-				proc >>= 1;
-			}
-		} else if(proc === procedure$2.pseudo){
-			if(!token.data){
-				proc = 3;
-			} else if(token.name === "has" || token.name === "contains"){
-				proc = 0; //expensive in any case
-			} else if(token.name === "matches" || token.name === "not"){
-				proc = 0;
-				for(var i = 0; i < token.data.length; i++){
-					//TODO better handling of complex selectors
-					if(token.data[i].length !== 1) continue;
-					var cur = getProcedure(token.data[i][0]);
-					//avoid executing :has or :contains
-					if(cur === 0){
-						proc = 0;
-						break;
-					}
-					if(cur > proc) proc = cur;
-				}
-				if(token.data.length > 1 && proc > 0) proc -= 1;
-			} else {
-				proc = 1;
-			}
-		}
-		return proc;
-	}
-
-	/*
-		compiles a selector to an executable function
-	*/
-
-	var compile_1$2 = compile$1;
-	var compileUnsafe_1 = compileUnsafe;
-	var compileToken_1 = compileToken;
-
-	var isTag$4       = domutils.isTag,
-	    trueFunc$2    = boolbase.trueFunc,
-	    falseFunc$3   = boolbase.falseFunc;
-
-	function compile$1(selector, options, context){
-		var next = compileUnsafe(selector, options, context);
-		return wrap(next);
-	}
-
-	function wrap(next){
-		return function base(elem){
-			return isTag$4(elem) && next(elem);
-		};
-	}
-
-	function compileUnsafe(selector, options, context){
-		var token = cssWhat(selector, options);
-		return compileToken(token, options, context);
-	}
-
-	function includesScopePseudo(t){
-	    return t.type === "pseudo" && (
-	        t.name === "scope" || (
-	            Array.isArray(t.data) &&
-	            t.data.some(function(data){
-	                return data.some(includesScopePseudo);
-	            })
-	        )
-	    );
-	}
-
-	var DESCENDANT_TOKEN = {type: "descendant"},
-	    SCOPE_TOKEN = {type: "pseudo", name: "scope"},
-	    PLACEHOLDER_ELEMENT = {},
-	    getParent$2 = domutils.getParent;
-
-	//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
-	//http://www.w3.org/TR/selectors4/#absolutizing
-	function absolutize(token, context){
-	    //TODO better check if context is document
-	    var hasContext = !!context && !!context.length && context.every(function(e){
-	        return e === PLACEHOLDER_ELEMENT || !!getParent$2(e);
-	    });
-
-
-	    token.forEach(function(t){
-	        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== "descendant"); else if(hasContext && !includesScopePseudo(t)){
-	            t.unshift(DESCENDANT_TOKEN);
-	        } else {
-	            return;
-	        }
-
-	        t.unshift(SCOPE_TOKEN);
-	    });
-	}
-
-	function compileToken(token, options, context){
-	    token = token.filter(function(t){ return t.length > 0; });
-
-		token.forEach(sort);
-
-		var isArrayContext = Array.isArray(context);
-
-	    context = (options && options.context) || context;
-
-	    if(context && !isArrayContext) context = [context];
-
-	    absolutize(token, context);
-
-		return token
-			.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })
-			.reduce(reduceRules, falseFunc$3);
-	}
-
-	function isTraversal(t){
-		return procedure$2[t.type] < 0;
-	}
-
-	function compileRules(rules, options, context, isArrayContext){
-		var acceptSelf = (isArrayContext && rules[0].name === "scope" && rules[1].type === "descendant");
-		return rules.reduce(function(func, rule, index){
-			if(func === falseFunc$3) return func;
-			return general[rule.type](func, rule, options, context, acceptSelf && index === 1);
-		}, options && options.rootFunc || trueFunc$2);
-	}
-
-	function reduceRules(a, b){
-		if(b === falseFunc$3 || a === trueFunc$2){
-			return a;
-		}
-		if(a === falseFunc$3 || b === trueFunc$2){
-			return b;
-		}
-
-		return function combine(elem){
-			return a(elem) || b(elem);
-		};
-	}
-
-	//:not, :has and :matches have to compile selectors
-	//doing this in lib/pseudos.js would lead to circular dependencies,
-	//so we add them here
-
-	var filters$1     = pseudos_1.filters,
-	    existsOne$1   = domutils.existsOne,
-	    isTag$4       = domutils.isTag,
-	    getChildren$2 = domutils.getChildren;
-
-
-	function containsTraversal(t){
-		return t.some(isTraversal);
-	}
-
-	filters$1.not = function(next, token, options, context){
-		var opts = {
-		    	xmlMode: !!(options && options.xmlMode),
-		    	strict: !!(options && options.strict)
-		    };
-
-		if(opts.strict){
-			if(token.length > 1 || token.some(containsTraversal)){
-				throw new SyntaxError("complex selectors in :not aren't allowed in strict mode");
-			}
-		}
-
-	    var func = compileToken(token, opts, context);
-
-		if(func === falseFunc$3) return next;
-		if(func === trueFunc$2)  return falseFunc$3;
-
-		return function(elem){
-			return !func(elem) && next(elem);
-		};
-	};
-
-	filters$1.has = function(next, token, options){
-		var opts = {
-			xmlMode: !!(options && options.xmlMode),
-			strict: !!(options && options.strict)
-		};
-
-	    //FIXME: Uses an array as a pointer to the current element (side effects)
-	    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;
-
-		var func = compileToken(token, opts, context);
-
-		if(func === falseFunc$3) return falseFunc$3;
-		if(func === trueFunc$2)  return function(elem){
-				return getChildren$2(elem).some(isTag$4) && next(elem);
-			};
-
-		func = wrap(func);
-
-	    if(context){
-	        return function has(elem){
-			return next(elem) && (
-	                (context[0] = elem), existsOne$1(func, getChildren$2(elem))
-	            );
-		};
-	    }
-
-	    return function has(elem){
-			return next(elem) && existsOne$1(func, getChildren$2(elem));
-		};
-	};
-
-	filters$1.matches = function(next, token, options, context){
-		var opts = {
-			xmlMode: !!(options && options.xmlMode),
-			strict: !!(options && options.strict),
-			rootFunc: next
-		};
-
-		return compileToken(token, opts, context);
-	};
-	compile_1$2.compileUnsafe = compileUnsafe_1;
-	compile_1$2.compileToken = compileToken_1;
-
-	var cssSelect = CSSselect;
-
-	var findOne$1       = domutils.findOne,
-	    findAll$1       = domutils.findAll,
-	    getChildren$3   = domutils.getChildren,
-	    removeSubsets = domutils.removeSubsets,
-	    falseFunc$4     = boolbase.falseFunc,
-	    compileUnsafe$1 = compile_1$2.compileUnsafe,
-	    compileToken$1  = compile_1$2.compileToken;
-
-	function getSelectorFunc(searchFunc){
-		return function select(query, elems, options){
-	        if(typeof query !== "function") query = compileUnsafe$1(query, options, elems);
-	        if(!Array.isArray(elems)) elems = getChildren$3(elems);
-			else elems = removeSubsets(elems);
-			return searchFunc(query, elems);
-		};
-	}
-
-	var selectAll = getSelectorFunc(function selectAll(query, elems){
-		return (query === falseFunc$4 || !elems || elems.length === 0) ? [] : findAll$1(query, elems);
-	});
-
-	var selectOne = getSelectorFunc(function selectOne(query, elems){
-		return (query === falseFunc$4 || !elems || elems.length === 0) ? null : findOne$1(query, elems);
-	});
-
-	function is(elem, query, options){
-		return (typeof query === "function" ? query : compile_1$2(query, options))(elem);
-	}
-
-	/*
-		the exported interface
-	*/
-	function CSSselect(query, elems, options){
-		return selectAll(query, elems, options);
-	}
-
-	CSSselect.compile = compile_1$2;
-	CSSselect.filters = pseudos_1.filters;
-	CSSselect.pseudos = pseudos_1.pseudos;
-
-	CSSselect.selectAll = selectAll;
-	CSSselect.selectOne = selectOne;
-
-	CSSselect.is = is;
-
-	//legacy methods (might be removed)
-	CSSselect.parse = compile_1$2;
-	CSSselect.iterate = selectAll;
-
-	//hooks
-	CSSselect._compileUnsafe = compileUnsafe$1;
-	CSSselect._compileToken = compileToken$1;
-
-	/**
-	 * Copyright 2018 Google LLC
-	 *
-	 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
-	 * use this file except in compliance with the License. You may obtain a copy of
-	 * the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-	 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-	 * License for the specific language governing permissions and limitations under
-	 * the License.
-	 */
-
-	const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
-	const PARSE5_OPTS = {
-	  treeAdapter
-	};
-	/**
-	 * Parse HTML into a mutable, serializable DOM Document.
-	 * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
-	 * @param {String} html   HTML to parse into a Document instance
-	 */
-
-	function createDocument(html) {
-	  const document = parse5.parse(html, PARSE5_OPTS);
-	  defineProperties(document, DocumentExtensions); // Extend Element.prototype with DOM manipulation methods.
-
-	  const scratch = document.createElement('div'); // Get a reference to the base Node class - used by createTextNode()
-
-	  document.$$Node = scratch.constructor;
-	  const elementProto = Object.getPrototypeOf(scratch);
-	  defineProperties(elementProto, ElementExtensions);
-	  elementProto.ownerDocument = document;
-	  return document;
-	}
-	/**
-	 * Serialize a Document to an HTML String
-	 * @param {Document} document   A Document, such as one created via `createDocument()`
-	 */
-
-	function serializeDocument(document) {
-	  return parse5.serialize(document, PARSE5_OPTS);
-	}
-	/**
-	 * Methods and descriptors to mix into Element.prototype
-	 */
-
-	const ElementExtensions = {
-	  /** @extends htmlparser2.Element.prototype */
-	  nodeName: {
-	    get() {
-	      return this.tagName.toUpperCase();
-	    }
-
-	  },
-	  id: reflectedProperty('id'),
-	  className: reflectedProperty('class'),
-
-	  insertBefore(child, referenceNode) {
-	    if (!referenceNode) return this.appendChild(child);
-	    treeAdapter.insertBefore(this, child, referenceNode);
-	    return child;
-	  },
-
-	  appendChild(child) {
-	    treeAdapter.appendChild(this, child);
-	    return child;
-	  },
-
-	  removeChild(child) {
-	    treeAdapter.detachNode(child);
-	  },
-
-	  remove() {
-	    treeAdapter.detachNode(this);
-	  },
-
-	  textContent: {
-	    get() {
-	      return getText$2(this);
-	    },
-
-	    set(text) {
-	      this.children = [];
-	      treeAdapter.insertText(this, text);
-	    }
-
-	  },
-
-	  setAttribute(name, value) {
-	    if (this.attribs == null) this.attribs = {};
-	    if (value == null) value = '';
-	    this.attribs[name] = value;
-	  },
-
-	  removeAttribute(name) {
-	    if (this.attribs != null) {
-	      delete this.attribs[name];
-	    }
-	  },
-
-	  getAttribute(name) {
-	    return this.attribs != null && this.attribs[name];
-	  },
-
-	  hasAttribute(name) {
-	    return this.attribs != null && this.attribs[name] != null;
-	  },
-
-	  getAttributeNode(name) {
-	    const value = this.getAttribute(name);
-	    if (value != null) return {
-	      specified: true,
-	      value
-	    };
-	  }
-
-	};
-	/**
-	 * Methods and descriptors to mix into the global document instance
-	 * @private
-	 */
-
-	const DocumentExtensions = {
-	  /** @extends htmlparser2.Document.prototype */
-	  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
-	  // TODO: verify if these are needed for css-select
-	  nodeType: {
-	    get() {
-	      return 9;
-	    }
-
-	  },
-	  contentType: {
-	    get() {
-	      return 'text/html';
-	    }
-
-	  },
-	  nodeName: {
-	    get() {
-	      return '#document';
-	    }
-
-	  },
-	  documentElement: {
-	    get() {
-	      // Find the first <html> element within the document
-	      return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html');
-	    }
-
-	  },
-	  compatMode: {
-	    get() {
-	      const compatMode = {
-	        'no-quirks': 'CSS1Compat',
-	        quirks: 'BackCompat',
-	        'limited-quirks': 'CSS1Compat'
-	      };
-	      return compatMode[treeAdapter.getDocumentMode(this)];
-	    }
-
-	  },
-	  body: {
-	    get() {
-	      return this.querySelector('body');
-	    }
-
-	  },
-
-	  createElement(name) {
-	    return treeAdapter.createElement(name, null, []);
-	  },
-
-	  createTextNode(text) {
-	    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
-	    const Node = this.$$Node;
-	    return new Node({
-	      type: 'text',
-	      data: text,
-	      parent: null,
-	      prev: null,
-	      next: null
-	    });
-	  },
-
-	  querySelector(sel) {
-	    return cssSelect.selectOne(sel, this.documentElement);
-	  },
-
-	  querySelectorAll(sel) {
-	    if (sel === ':root') {
-	      return this;
-	    }
-
-	    return cssSelect(sel, this.documentElement);
-	  }
-
-	};
-	/**
-	 * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
-	 * @private
-	 */
-
-	function defineProperties(obj, properties) {
-	  for (const i in properties) {
-	    const value = properties[i];
-	    Object.defineProperty(obj, i, typeof value === 'function' ? {
-	      value
-	    } : value);
-	  }
-	}
-	/**
-	 * Create a property descriptor defining a getter/setter pair alias for a named attribute.
-	 * @private
-	 */
-
-
-	function reflectedProperty(attributeName) {
-	  return {
-	    get() {
-	      return this.getAttribute(attributeName);
-	    },
-
-	    set(value) {
-	      this.setAttribute(attributeName, value);
-	    }
-
-	  };
-	}
-	/**
-	 * Helper to get the text content of a node
-	 * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21
-	 * @private
-	 */
-
-
-	function getText$2(node) {
-	  if (Array.isArray(node)) return node.map(getText$2).join('');
-	  if (treeAdapter.isElementNode(node)) return node.name === 'br' ? '\n' : getText$2(node.children);
-	  if (treeAdapter.isTextNode(node)) return node.data;
-	  return '';
-	}
-
-	/**
-	 * Copyright 2018 Google LLC
-	 *
-	 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
-	 * use this file except in compliance with the License. You may obtain a copy of
-	 * the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-	 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-	 * License for the specific language governing permissions and limitations under
-	 * the License.
-	 */
-	/**
-	 * Parse a textual CSS Stylesheet into a Stylesheet instance.
-	 * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
-	 * @see https://github.com/reworkcss/css
-	 * @private
-	 * @param {String} stylesheet
-	 * @returns {css.Stylesheet} ast
-	 */
-
-	function parseStylesheet(stylesheet) {
-	  return css.parse(stylesheet);
-	}
-	/**
-	 * Serialize a ReworkCSS Stylesheet to a String of CSS.
-	 * @private
-	 * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
-	 * @param {Object} options              Options to pass to `css.stringify()`
-	 * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
-	 */
-
-	function serializeStylesheet(ast, options) {
-	  return css.stringify(ast, options);
-	}
-	/**
-	 * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
-	 * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
-	 * @private
-	 * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
-	 * @returns {(rule) => void} nonDestructiveIterator
-	 */
-
-	function markOnly(predicate) {
-	  return rule => {
-	    const sel = rule.selectors;
-
-	    if (predicate(rule) === false) {
-	      rule.$$remove = true;
-	    }
-
-	    rule.$$markedSelectors = rule.selectors;
-
-	    if (rule._other) {
-	      rule._other.$$markedSelectors = rule._other.selectors;
-	    }
-
-	    rule.selectors = sel;
-	  };
-	}
-	/**
-	 * Apply filtered selectors to a rule from a previous markOnly run.
-	 * @private
-	 * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
-	*/
-
-	function applyMarkedSelectors(rule) {
-	  if (rule.$$markedSelectors) {
-	    rule.selectors = rule.$$markedSelectors;
-	  }
-
-	  if (rule._other) {
-	    applyMarkedSelectors(rule._other);
-	  }
-	}
-	/**
-	 * Recursively walk all rules in a stylesheet.
-	 * @private
-	 * @param {css.Rule} node       A Stylesheet or Rule to descend into.
-	 * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
-	 */
-
-	function walkStyleRules(node, iterator) {
-	  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-	  node.rules = node.rules.filter(rule => {
-	    if (rule.rules) {
-	      walkStyleRules(rule, iterator);
-	    }
-
-	    rule._other = undefined;
-	    rule.filterSelectors = filterSelectors;
-	    return iterator(rule) !== false;
-	  });
-	}
-	/**
-	 * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
-	 * @private
-	 * @param {css.Rule} node       A Stylesheet or Rule to descend into.
-	 * @param {css.Rule} node2      A second tree identical to `node`
-	 * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
-	 */
-
-	function walkStyleRulesWithReverseMirror(node, node2, iterator) {
-	  if (node2 === null) return walkStyleRules(node, iterator);
-	  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
-	  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
-	    const rule2 = rules2[index];
-
-	    if (rule.rules) {
-	      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
-	    }
-
-	    rule._other = rule2;
-	    rule.filterSelectors = filterSelectors;
-	    return iterator(rule) !== false;
-	  });
-	} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
-	// This is just a quicker version of generating the compliment of the set returned from a filter operation.
-
-	function splitFilter(a, b, predicate) {
-	  const aOut = [];
-	  const bOut = [];
-
-	  for (let index = 0; index < a.length; index++) {
-	    if (predicate(a[index], index, a, b)) {
-	      aOut.push(a[index]);
-	    } else {
-	      bOut.push(a[index]);
-	    }
-	  }
-
-	  return [aOut, bOut];
-	} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
-
-
-	function filterSelectors(predicate) {
-	  if (this._other) {
-	    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
-	    this.selectors = a;
-	    this._other.selectors = b;
-	  } else {
-	    this.selectors = this.selectors.filter(predicate);
-	  }
-	}
-
-	const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];
-	const defaultLogger = {
-	  trace(msg) {
-	    console.trace(msg);
-	  },
-
-	  debug(msg) {
-	    console.debug(msg);
-	  },
-
-	  warn(msg) {
-	    console.warn(chalk.yellow(msg));
-	  },
-
-	  error(msg) {
-	    console.error(chalk.bold.red(msg));
-	  },
-
-	  info(msg) {
-	    console.info(chalk.bold.blue(msg));
-	  },
-
-	  silent() {}
-
-	};
-	function createLogger(logLevel) {
-	  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);
-	  return LOG_LEVELS.reduce((logger, type, index) => {
-	    if (index >= logLevelIdx) {
-	      logger[type] = defaultLogger[type];
-	    } else {
-	      logger[type] = defaultLogger.silent;
-	    }
-
-	    return logger;
-	  }, {});
-	}
-
-	/**
-	 * Copyright 2018 Google LLC
-	 *
-	 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
-	 * use this file except in compliance with the License. You may obtain a copy of
-	 * the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-	 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-	 * License for the specific language governing permissions and limitations under
-	 * the License.
-	 */
-	/**
-	 * The mechanism to use for lazy-loading stylesheets.
-	 * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
-	 *
-	 * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
-	 * - **"body":** Move all external stylesheet links to the end of the document.
-	 * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. <kbd>JS</kbd>
-	 * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>
-	 * - **"swap-high":** Use `<link rel="alternate stylesheet preload">` and swap to `rel="stylesheet"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>
-	 * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>
-	 * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
-	 * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy
-	 * @public
-	 */
-
-	/**
-	 * Controls which keyframes rules are inlined.
-	 *
-	 * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
-	 * - **"all":** Inline all keyframes rules.
-	 * - **"none":** Remove all keyframes rules.
-	 * @typedef {('critical'|'all'|'none')} KeyframeStrategy
-	 * @private
-	 * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
-	 */
-
-	/**
-	 * Controls log level of the plugin. Specifies the level the logger should use. A logger will
-	 * not produce output for any log level beneath the specified level. Available levels and order
-	 * are:
-	 *
-	 * - **"info"** _(default)_
-	 * - **"warn"**
-	 * - **"error"**
-	 * - **"trace"**
-	 * - **"debug"**
-	 * - **"silent"**
-	 * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
-	 * @public
-	 */
-
-	/**
-	 * Custom logger interface:
-	 * @typedef {object} Logger
-	 * @public
-	 * @property {function(String)} trace - Prints a trace message
-	 * @property {function(String)} debug - Prints a debug message
-	 * @property {function(String)} info - Prints an information message
-	 * @property {function(String)} warn - Prints a warning message
-	 * @property {function(String)} error - Prints an error message
-	 */
-
-	/**
-	 * All optional. Pass them to `new Critters({ ... })`.
-	 * @public
-	 * @typedef Options
-	 * @property {String} path     Base path location of the CSS files _(default: `''`)_
-	 * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_
-	 * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
-	 * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
-	 * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
-	 * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
-	 * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
-	 * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
-	 * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
-	 * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
-	 * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
-	 * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
-	 * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
-	 *  - Values:
-	 *  - `true` to inline critical font-face rules and preload the fonts
-	 *  - `false` to don't inline any font-face rules and don't preload fonts
-	 * @property {String} keyframes     Controls which keyframes rules are inlined.
-	 *  - Values:
-	 *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
-	 *  - `"all"` inline all keyframes rules
-	 *  - `"none"` remove all keyframes rules
-	 * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
-	 * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
-	 * @property {object} logger        Provide a custom logger interface {@link Logger logger}
-	 */
-
-	function _catch(body, recover) {
-	  try {
-	    var result = body();
-	  } catch (e) {
-	    return recover(e);
-	  }
-
-	  if (result && result.then) {
-	    return result.then(void 0, recover);
-	  }
-
-	  return result;
-	}
-
-	class Critters {
-	  /** @private */
-	  constructor(options) {
-	    this.options = Object.assign({
-	      logLevel: 'info',
-	      path: '',
-	      publicPath: '',
-	      reduceInlineStyles: true,
-	      pruneSource: false,
-	      additionalStylesheets: []
-	    }, options || {});
-	    this.urlFilter = this.options.filter;
-
-	    if (this.urlFilter instanceof RegExp) {
-	      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-	    }
-
-	    this.logger = this.options.logger || createLogger(this.options.logLevel);
-	  }
-	  /**
-	   * Read the contents of a file from the specified filesystem or disk
-	   */
-
-
-	  readFile(filename) {
-	    const fs = this.fs;
-	    return new Promise((resolve, reject) => {
-	      const callback = (err, data) => {
-	        if (err) reject(err);else resolve(data);
-	      };
-
-	      if (fs && fs.readFile) {
-	        fs.readFile(filename, callback);
-	      } else {
-	        require('fs').readFile(filename, 'utf8', callback);
-	      }
-	    });
-	  }
-	  /**
-	   * Apply critical CSS processing to the html
-	   */
-
-
-	  process(html) {
-	    try {
-	      const _this = this;
-
-	      function _temp4() {
-	        // go through all the style tags in the document and reduce them to only critical CSS
-	        const styles = _this.getAffectedStyleTags(document);
-
-	        return Promise.resolve(Promise.all(styles.map(style => _this.processStyle(style, document)))).then(function () {
-	          function _temp2() {
-	            // serialize the document back to HTML and we're done
-	            const output = serializeDocument(document);
-	            const end = process.hrtime.bigint();
-
-	            _this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);
-
-	            return output;
-	          }
-
-	          const _temp = function () {
-	            if (_this.options.mergeStylesheets !== false && styles.length !== 0) {
-	              return Promise.resolve(_this.mergeStylesheets(document)).then(function () {});
-	            }
-	          }();
-
-	          return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
-	        });
-	      }
-
-	      const start = process.hrtime.bigint(); // Parse the generated HTML in a DOM we can mutate
-
-	      const document = createDocument(html);
-
-	      if (_this.options.additionalStylesheets.length > 0) {
-	        _this.embedAdditionalStylesheet(document);
-	      } // `external:false` skips processing of external sheets
-
-
-	      const _temp3 = function () {
-	        if (_this.options.external !== false) {
-	          const externalSheets = [].slice.call(document.querySelectorAll('link[rel="stylesheet"]'));
-	          return Promise.resolve(Promise.all(externalSheets.map(link => _this.embedLinkedStylesheet(link, document)))).then(function () {});
-	        }
-	      }();
-
-	      return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-	  /**
-	   * Get the style tags that need processing
-	   */
-
-
-	  getAffectedStyleTags(document) {
-	    const styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
-
-	    if (this.options.reduceInlineStyles === false) {
-	      return styles.filter(style => style.$$external);
-	    }
-
-	    return styles;
-	  }
-
-	  mergeStylesheets(document) {
-	    try {
-	      const _this2 = this;
-
-	      const styles = _this2.getAffectedStyleTags(document);
-
-	      if (styles.length === 0) {
-	        _this2.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
-
-	        return Promise.resolve();
-	      }
-
-	      const first = styles[0];
-	      let sheet = first.textContent;
-
-	      for (let i = 1; i < styles.length; i++) {
-	        const node = styles[i];
-	        sheet += node.textContent;
-	        node.remove();
-	      }
-
-	      first.textContent = sheet;
-	      return Promise.resolve();
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-	  /**
-	   * Given href, find the corresponding CSS asset
-	   */
-
-
-	  getCssAsset(href) {
-	    try {
-	      const _this3 = this;
-
-	      const outputPath = _this3.options.path;
-	      const publicPath = _this3.options.publicPath; // CHECK - the output path
-	      // path on disk (with output.publicPath removed)
-
-	      let normalizedPath = href.replace(/^\//, '');
-	      const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-	      if (normalizedPath.indexOf(pathPrefix) === 0) {
-	        normalizedPath = normalizedPath.substring(pathPrefix.length).replace(/^\//, '');
-	      }
-
-	      const filename = path.resolve(outputPath, normalizedPath);
-	      let sheet;
-
-	      const _temp5 = _catch(function () {
-	        return Promise.resolve(_this3.readFile(filename)).then(function (_this3$readFile) {
-	          sheet = _this3$readFile;
-	        });
-	      }, function () {
-	        _this3.logger.warn(`Unable to locate stylesheet: ${filename}`);
-	      });
-
-	      return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {
-	        return sheet;
-	      }) : sheet);
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-
-	  checkInlineThreshold(link, style, sheet) {
-	    if (this.options.inlineThreshold && sheet.length < this.options.inlineThreshold) {
-	      const href = style.$$name;
-	      style.$$reduce = false;
-	      this.logger.info(`\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`);
-	      link.remove();
-	      return true;
-	    }
-
-	    return false;
-	  }
-	  /**
-	   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
-	   */
-
-
-	  embedAdditionalStylesheet(document) {
-	    try {
-	      const _this4 = this;
-
-	      const styleSheetsIncluded = [];
-	      return Promise.resolve(Promise.all(_this4.options.additionalStylesheets.map(cssFile => {
-	        if (styleSheetsIncluded.includes(cssFile)) {
-	          return;
-	        }
-
-	        styleSheetsIncluded.push(cssFile);
-	        const style = document.createElement('style');
-	        style.$$external = true;
-	        return _this4.getCssAsset(cssFile, style).then(sheet => [sheet, style]);
-	      }))).then(function (sources) {
-	        sources.forEach(([sheet, style]) => {
-	          if (!sheet) return;
-	          style.textContent = sheet;
-	          document.head.appendChild(style);
-	        });
-	      });
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-	  /**
-	   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-	   */
-
-
-	  embedLinkedStylesheet(link, document) {
-	    try {
-	      const _this5 = this;
-
-	      const href = link.getAttribute('href');
-	      const media = link.getAttribute('media');
-	      const preloadMode = _this5.options.preload; // skip filtered resources, or network resources if no filter is provided
-
-	      if (_this5.urlFilter ? _this5.urlFilter(href) : !(href || '').match(/\.css$/)) {
-	        return Promise.resolve();
-	      } // the reduced critical CSS gets injected into a new <style> tag
-
-
-	      const style = document.createElement('style');
-	      style.$$external = true;
-	      return Promise.resolve(_this5.getCssAsset(href, style)).then(function (sheet) {
-	        if (!sheet) {
-	          return;
-	        }
-
-	        style.textContent = sheet;
-	        style.$$name = href;
-	        style.$$links = [link];
-	        link.parentNode.insertBefore(style, link);
-
-	        if (_this5.checkInlineThreshold(link, style, sheet)) {
-	          return;
-	        } // CSS loader is only injected for the first sheet, then this becomes an empty string
-
-
-	        let cssLoaderPreamble = "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-	        const lazy = preloadMode === 'js-lazy';
-
-	        if (lazy) {
-	          cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='print';l.onload=function(){l.media=m};l.href");
-	        } // Allow disabling any mutation of the stylesheet link:
-
-
-	        if (preloadMode === false) return;
-	        let noscriptFallback = false;
-
-	        if (preloadMode === 'body') {
-	          document.body.appendChild(link);
-	        } else {
-	          link.setAttribute('rel', 'preload');
-	          link.setAttribute('as', 'style');
-
-	          if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-	            const script = document.createElement('script');
-	            const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${lazy ? ',' + JSON.stringify(media || 'all') : ''})`; // script.appendChild(document.createTextNode(js));
-
-	            script.textContent = js;
-	            link.parentNode.insertBefore(script, link.nextSibling);
-	            style.$$links.push(script);
-	            cssLoaderPreamble = '';
-	            noscriptFallback = true;
-	          } else if (preloadMode === 'media') {
-	            // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-	            link.setAttribute('rel', 'stylesheet');
-	            link.removeAttribute('as');
-	            link.setAttribute('media', 'print');
-	            link.setAttribute('onload', `this.media='${media || 'all'}'`);
-	            noscriptFallback = true;
-	          } else if (preloadMode === 'swap-high') {
-	            // @see http://filamentgroup.github.io/loadCSS/test/new-high.html
-	            link.setAttribute('rel', 'alternate stylesheet preload');
-	            link.setAttribute('title', 'styles');
-	            link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);
-	            noscriptFallback = true;
-	          } else if (preloadMode === 'swap') {
-	            link.setAttribute('onload', "this.rel='stylesheet'");
-	            noscriptFallback = true;
-	          } else {
-	            const bodyLink = document.createElement('link');
-	            bodyLink.setAttribute('rel', 'stylesheet');
-	            if (media) bodyLink.setAttribute('media', media);
-	            bodyLink.setAttribute('href', href);
-	            document.body.appendChild(bodyLink);
-	            style.$$links.push(bodyLink);
-	          }
-	        }
-
-	        if (_this5.options.noscriptFallback !== false && noscriptFallback) {
-	          const noscript = document.createElement('noscript');
-	          const noscriptLink = document.createElement('link');
-	          noscriptLink.setAttribute('rel', 'stylesheet');
-	          noscriptLink.setAttribute('href', href);
-	          if (media) noscriptLink.setAttribute('media', media);
-	          noscript.appendChild(noscriptLink);
-	          link.parentNode.insertBefore(noscript, link.nextSibling);
-	          style.$$links.push(noscript);
-	        }
-	      });
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-	  /**
-	   * Prune the source CSS files
-	   */
-
-
-	  pruneSource(style, before, sheetInverse) {
-	    // if external stylesheet would be below minimum size, just inline everything
-	    const minSize = this.options.minimumExternalSize;
-	    const name = style.$$name;
-
-	    if (minSize && sheetInverse.length < minSize) {
-	      this.logger.info(`\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`);
-	      style.textContent = before; // remove any associated external resources/loaders:
-
-	      if (style.$$links) {
-	        for (const link of style.$$links) {
-	          const parent = link.parentNode;
-	          if (parent) parent.removeChild(link);
-	        }
-	      }
-
-	      return true;
-	    }
-
-	    return false;
-	  }
-	  /**
-	   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-	   */
-
-
-	  processStyle(style, document) {
-	    try {
-	      const _this6 = this;
-
-	      if (style.$$reduce === false) return Promise.resolve();
-	      const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-	      const options = _this6.options; // const document = style.ownerDocument;
-
-	      const head = document.querySelector('head');
-	      let keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-	      if (keyframesMode === true) keyframesMode = 'all';
-	      if (keyframesMode === false) keyframesMode = 'none';
-	      let sheet = style.textContent; // store a reference to the previous serialized stylesheet for reporting stats
-
-	      const before = sheet; // Skip empty stylesheets
-
-	      if (!sheet) return Promise.resolve();
-	      const ast = parseStylesheet(sheet);
-	      const astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-	      let criticalFonts = '';
-	      const failedSelectors = [];
-	      const criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-	      // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-	      walkStyleRules(ast, markOnly(rule => {
-	        if (rule.type === 'rule') {
-	          // Filter the selector list down to only those match
-	          rule.filterSelectors(sel => {
-	            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-	            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-	            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {
-	              return true;
-	            }
-
-	            sel = sel.replace(/(?<!\\)::?[a-z-]+(?![a-z-(])/gi, '').replace(/::?not\(\s*\)/g, '').trim();
-	            if (!sel) return false;
-
-	            try {
-	              return document.querySelector(sel) != null;
-	            } catch (e) {
-	              failedSelectors.push(sel + ' -> ' + e.message);
-	              return false;
-	            }
-	          }); // If there are no matched selectors, remove the rule:
-
-	          if (rule.selectors.length === 0) {
-	            return false;
-	          }
-
-	          if (rule.declarations) {
-	            for (let i = 0; i < rule.declarations.length; i++) {
-	              const decl = rule.declarations[i]; // detect used fonts
-
-	              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-	                criticalFonts += ' ' + decl.value;
-	              } // detect used keyframes
-
-
-	              if (decl.property === 'animation' || decl.property === 'animation-name') {
-	                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-	                const names = decl.value.split(/\s+/);
-
-	                for (let j = 0; j < names.length; j++) {
-	                  const name = names[j].trim();
-	                  if (name) criticalKeyframeNames.push(name);
-	                }
-	              }
-	            }
-	          }
-	        } // keep font rules, they're handled in the second pass:
-
-
-	        if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-	        const rules = rule.rules && rule.rules.filter(rule => !rule.$$remove);
-	        return !rules || rules.length !== 0;
-	      }));
-
-	      if (failedSelectors.length !== 0) {
-	        _this6.logger.warn(`${failedSelectors.length} rules skipped due to selector errors:\n  ${failedSelectors.join('\n  ')}`);
-	      }
-
-	      const shouldPreloadFonts = options.fonts === true || options.preloadFonts === true;
-	      const shouldInlineFonts = options.fonts !== false && options.inlineFonts === true;
-	      const preloadedFonts = []; // Second pass, using data picked up from the first
-
-	      walkStyleRulesWithReverseMirror(ast, astInverse, rule => {
-	        // remove any rules marked in the first pass
-	        if (rule.$$remove === true) return false;
-	        applyMarkedSelectors(rule); // prune @keyframes rules
-
-	        if (rule.type === 'keyframes') {
-	          if (keyframesMode === 'none') return false;
-	          if (keyframesMode === 'all') return true;
-	          return criticalKeyframeNames.indexOf(rule.name) !== -1;
-	        } // prune @font-face rules
-
-
-	        if (rule.type === 'font-face') {
-	          let family, src;
-
-	          for (let i = 0; i < rule.declarations.length; i++) {
-	            const decl = rule.declarations[i];
-
-	            if (decl.property === 'src') {
-	              // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-	              src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-	            } else if (decl.property === 'font-family') {
-	              family = decl.value;
-	            }
-	          }
-
-	          if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-	            preloadedFonts.push(src);
-	            const preload = document.createElement('link');
-	            preload.setAttribute('rel', 'preload');
-	            preload.setAttribute('as', 'font');
-	            preload.setAttribute('crossorigin', 'anonymous');
-	            preload.setAttribute('href', src.trim());
-	            head.appendChild(preload);
-	          } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-
-	          if (!family || !src || criticalFonts.indexOf(family) === -1 || !shouldInlineFonts) {
-	            return false;
-	          }
-	        }
-	      });
-	      sheet = serializeStylesheet(ast, {
-	        compress: _this6.options.compress !== false
-	      }).trim(); // If all rules were removed, get rid of the style element entirely
-
-	      if (sheet.trim().length === 0) {
-	        if (style.parentNode) {
-	          style.remove();
-	        }
-
-	        return Promise.resolve();
-	      }
-
-	      let afterText = '';
-	      let styleInlinedCompletely = false;
-
-	      if (options.pruneSource) {
-	        const sheetInverse = serializeStylesheet(astInverse, {
-	          compress: _this6.options.compress !== false
-	        });
-	        styleInlinedCompletely = _this6.pruneSource(style, before, sheetInverse);
-
-	        if (styleInlinedCompletely) {
-	          const percent = sheetInverse.length / before.length * 100;
-	          afterText = `, reducing non-inlined size ${percent | 0}% to ${prettyBytes(sheetInverse.length)}`;
-	        }
-	      } // replace the inline stylesheet with its critical'd counterpart
-
-
-	      if (!styleInlinedCompletely) {
-	        style.textContent = sheet;
-	      } // output stats
-
-
-	      const percent = sheet.length / before.length * 100 | 0;
-
-	      _this6.logger.info('\u001b[32mInlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + afterText + '.\u001b[39m');
-
-	      return Promise.resolve();
-	    } catch (e) {
-	      return Promise.reject(e);
-	    }
-	  }
-
-	}
-
-	return Critters;
-
-})));
-//# sourceMappingURL=critters.umd.js.map
Index: trip-planner-front/node_modules/critters/dist/critters.umd.js.map
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters.umd.js.map	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"file":"critters.umd.js","sources":["../node_modules/domelementtype/index.js","../node_modules/dom-serializer/node_modules/domelementtype/lib/index.js","../node_modules/entities/lib/decode_codepoint.js","../node_modules/entities/lib/decode.js","../node_modules/entities/lib/encode.js","../node_modules/entities/lib/index.js","../node_modules/dom-serializer/index.js","../node_modules/css-select/node_modules/domutils/lib/stringify.js","../node_modules/css-select/node_modules/domutils/lib/traversal.js","../node_modules/css-select/node_modules/domutils/lib/manipulation.js","../node_modules/css-select/node_modules/domutils/lib/querying.js","../node_modules/css-select/node_modules/domutils/lib/legacy.js","../node_modules/css-select/node_modules/domutils/lib/helpers.js","../node_modules/css-select/node_modules/domutils/index.js","../node_modules/nth-check/parse.js","../node_modules/boolbase/index.js","../node_modules/nth-check/compile.js","../node_modules/nth-check/index.js","../node_modules/css-select/lib/attributes.js","../node_modules/css-select/lib/pseudos.js","../node_modules/css-what/index.js","../node_modules/css-select/lib/general.js","../node_modules/css-select/lib/sort.js","../node_modules/css-select/lib/compile.js","../node_modules/css-select/index.js","../src/dom.js","../src/css.js","../src/util.js","../src/index.js"],"sourcesContent":["//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\tDoctype: \"doctype\",\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nfunction isTag(elem) {\n    return (elem.type === \"tag\" /* Tag */ ||\n        elem.type === \"script\" /* Script */ ||\n        elem.type === \"style\" /* Style */);\n}\nexports.isTag = isTag;\n// Exports for backwards compatibility\nexports.Text = \"text\" /* Text */; //Text\nexports.Directive = \"directive\" /* Directive */; //<? ... ?>\nexports.Comment = \"comment\" /* Comment */; //<!-- ... -->\nexports.Script = \"script\" /* Script */; //<script> tags\nexports.Style = \"style\" /* Style */; //<style> tags\nexports.Tag = \"tag\" /* Tag */; //Any tag\nexports.CDATA = \"cdata\" /* CDATA */; //<![CDATA[ ... ]]>\nexports.Doctype = \"doctype\" /* Doctype */;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar decode_json_1 = __importDefault(require(\"./maps/decode.json\"));\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint) {\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return \"\\uFFFD\";\n    }\n    if (codePoint in decode_json_1.default) {\n        codePoint = decode_json_1.default[codePoint];\n    }\n    var output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n}\nexports.default = decodeCodePoint;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar legacy_json_1 = __importDefault(require(\"./maps/legacy.json\"));\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar decode_codepoint_1 = __importDefault(require(\"./decode_codepoint\"));\nexports.decodeXML = getStrictDecoder(xml_json_1.default);\nexports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\nfunction getStrictDecoder(map) {\n    var keys = Object.keys(map).join(\"|\");\n    var replace = getReplacer(map);\n    keys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n    var re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n    return function (str) { return String(str).replace(re, replace); };\n}\nvar sorter = function (a, b) { return (a < b ? 1 : -1); };\nexports.decodeHTML = (function () {\n    var legacy = Object.keys(legacy_json_1.default).sort(sorter);\n    var keys = Object.keys(entities_json_1.default).sort(sorter);\n    for (var i = 0, j = 0; i < keys.length; i++) {\n        if (legacy[j] === keys[i]) {\n            keys[i] += \";?\";\n            j++;\n        }\n        else {\n            keys[i] += \";\";\n        }\n    }\n    var re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\");\n    var replace = getReplacer(entities_json_1.default);\n    function replacer(str) {\n        if (str.substr(-1) !== \";\")\n            str += \";\";\n        return replace(str);\n    }\n    //TODO consider creating a merged map\n    return function (str) { return String(str).replace(re, replacer); };\n})();\nfunction getReplacer(map) {\n    return function replace(str) {\n        if (str.charAt(1) === \"#\") {\n            var secondChar = str.charAt(2);\n            if (secondChar === \"X\" || secondChar === \"x\") {\n                return decode_codepoint_1.default(parseInt(str.substr(3), 16));\n            }\n            return decode_codepoint_1.default(parseInt(str.substr(2), 10));\n        }\n        return map[str.slice(1, -1)];\n    };\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escape = exports.encodeHTML = exports.encodeXML = void 0;\nvar xml_json_1 = __importDefault(require(\"./maps/xml.json\"));\nvar inverseXML = getInverseObj(xml_json_1.default);\nvar xmlReplacer = getInverseReplacer(inverseXML);\nexports.encodeXML = getInverse(inverseXML, xmlReplacer);\nvar entities_json_1 = __importDefault(require(\"./maps/entities.json\"));\nvar inverseHTML = getInverseObj(entities_json_1.default);\nvar htmlReplacer = getInverseReplacer(inverseHTML);\nexports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\nfunction getInverseObj(obj) {\n    return Object.keys(obj)\n        .sort()\n        .reduce(function (inverse, name) {\n        inverse[obj[name]] = \"&\" + name + \";\";\n        return inverse;\n    }, {});\n}\nfunction getInverseReplacer(inverse) {\n    var single = [];\n    var multiple = [];\n    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {\n        var k = _a[_i];\n        if (k.length === 1) {\n            // Add value to single array\n            single.push(\"\\\\\" + k);\n        }\n        else {\n            // Add value to multiple array\n            multiple.push(k);\n        }\n    }\n    // Add ranges to single characters.\n    single.sort();\n    for (var start = 0; start < single.length - 1; start++) {\n        // Find the end of a run of characters\n        var end = start;\n        while (end < single.length - 1 &&\n            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {\n            end += 1;\n        }\n        var count = 1 + end - start;\n        // We want to replace at least three characters\n        if (count < 3)\n            continue;\n        single.splice(start, count, single[start] + \"-\" + single[end]);\n    }\n    multiple.unshift(\"[\" + single.join(\"\") + \"]\");\n    return new RegExp(multiple.join(\"|\"), \"g\");\n}\nvar reNonASCII = /(?:[\\x80-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/g;\nfunction singleCharReplacer(c) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return \"&#x\" + c.codePointAt(0).toString(16).toUpperCase() + \";\";\n}\nfunction getInverse(inverse, re) {\n    return function (data) {\n        return data\n            .replace(re, function (name) { return inverse[name]; })\n            .replace(reNonASCII, singleCharReplacer);\n    };\n}\nvar reXmlChars = getInverseReplacer(inverseXML);\nfunction escape(data) {\n    return data\n        .replace(reXmlChars, singleCharReplacer)\n        .replace(reNonASCII, singleCharReplacer);\n}\nexports.escape = escape;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.encode = exports.decodeStrict = exports.decode = void 0;\nvar decode_1 = require(\"./decode\");\nvar encode_1 = require(\"./encode\");\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decode(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n}\nexports.decode = decode;\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction decodeStrict(data, level) {\n    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n}\nexports.decodeStrict = decodeStrict;\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.\n */\nfunction encode(data, level) {\n    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n}\nexports.encode = encode;\nvar encode_2 = require(\"./encode\");\nObject.defineProperty(exports, \"encodeXML\", { enumerable: true, get: function () { return encode_2.encodeXML; } });\nObject.defineProperty(exports, \"encodeHTML\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"escape\", { enumerable: true, get: function () { return encode_2.escape; } });\n// Legacy aliases\nObject.defineProperty(exports, \"encodeHTML4\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nObject.defineProperty(exports, \"encodeHTML5\", { enumerable: true, get: function () { return encode_2.encodeHTML; } });\nvar decode_2 = require(\"./decode\");\nObject.defineProperty(exports, \"decodeXML\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\nObject.defineProperty(exports, \"decodeHTML\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTMLStrict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\n// Legacy aliases\nObject.defineProperty(exports, \"decodeHTML4\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML5\", { enumerable: true, get: function () { return decode_2.decodeHTML; } });\nObject.defineProperty(exports, \"decodeHTML4Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeHTML5Strict\", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });\nObject.defineProperty(exports, \"decodeXMLStrict\", { enumerable: true, get: function () { return decode_2.decodeXML; } });\n","/*\n  Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/* mixed-case SVG and MathML tags & attributes\n   recognized by the HTML parser, see\n   https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n*/\nvar foreignNames = require('./foreignNames.json');\nforeignNames.elementNames.__proto__ = null; /* use as a simple dictionary */\nforeignNames.attributeNames.__proto__ = null;\n\nvar unencodedElements = {\n  __proto__: null,\n  style: true,\n  script: true,\n  xmp: true,\n  iframe: true,\n  noembed: true,\n  noframes: true,\n  plaintext: true,\n  noscript: true\n};\n\n/*\n  Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n  if (!attributes) return;\n\n  var output = '';\n  var value;\n\n  // Loop through the attributes\n  for (var key in attributes) {\n    value = attributes[key];\n    if (output) {\n      output += ' ';\n    }\n\n    if (opts.xmlMode === 'foreign') {\n      /* fix up mixed-case attribute names */\n      key = foreignNames.attributeNames[key] || key;\n    }\n    output += key;\n    if ((value !== null && value !== '') || opts.xmlMode) {\n      output +=\n        '=\"' +\n        (opts.decodeEntities\n          ? entities.encodeXML(value)\n          : value.replace(/\\\"/g, '&quot;')) +\n        '\"';\n    }\n  }\n\n  return output;\n}\n\n/*\n  Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n  __proto__: null,\n  area: true,\n  base: true,\n  basefont: true,\n  br: true,\n  col: true,\n  command: true,\n  embed: true,\n  frame: true,\n  hr: true,\n  img: true,\n  input: true,\n  isindex: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true\n};\n\nvar render = (module.exports = function(dom, opts) {\n  if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n  opts = opts || {};\n\n  var output = '';\n\n  for (var i = 0; i < dom.length; i++) {\n    var elem = dom[i];\n\n    if (elem.type === 'root') output += render(elem.children, opts);\n    else if (ElementType.isTag(elem)) output += renderTag(elem, opts);\n    else if (elem.type === ElementType.Directive)\n      output += renderDirective(elem);\n    else if (elem.type === ElementType.Comment) output += renderComment(elem);\n    else if (elem.type === ElementType.CDATA) output += renderCdata(elem);\n    else output += renderText(elem, opts);\n  }\n\n  return output;\n});\n\nvar foreignModeIntegrationPoints = [\n  'mi',\n  'mo',\n  'mn',\n  'ms',\n  'mtext',\n  'annotation-xml',\n  'foreignObject',\n  'desc',\n  'title'\n];\n\nfunction renderTag(elem, opts) {\n  // Handle SVG / MathML in HTML\n  if (opts.xmlMode === 'foreign') {\n    /* fix up mixed-case element names */\n    elem.name = foreignNames.elementNames[elem.name] || elem.name;\n    /* exit foreign mode at integration points */\n    if (\n      elem.parent &&\n      foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0\n    )\n      opts = Object.assign({}, opts, { xmlMode: false });\n  }\n  if (!opts.xmlMode && ['svg', 'math'].indexOf(elem.name) >= 0) {\n    opts = Object.assign({}, opts, { xmlMode: 'foreign' });\n  }\n\n  var tag = '<' + elem.name;\n  var attribs = formatAttrs(elem.attribs, opts);\n\n  if (attribs) {\n    tag += ' ' + attribs;\n  }\n\n  if (opts.xmlMode && (!elem.children || elem.children.length === 0)) {\n    tag += '/>';\n  } else {\n    tag += '>';\n    if (elem.children) {\n      tag += render(elem.children, opts);\n    }\n\n    if (!singleTag[elem.name] || opts.xmlMode) {\n      tag += '</' + elem.name + '>';\n    }\n  }\n\n  return tag;\n}\n\nfunction renderDirective(elem) {\n  return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n  var data = elem.data || '';\n\n  // if entities weren't decoded, no need to encode them back\n  if (\n    opts.decodeEntities &&\n    !(elem.parent && elem.parent.name in unencodedElements)\n  ) {\n    data = entities.encodeXML(data);\n  }\n\n  return data;\n}\n\nfunction renderCdata(elem) {\n  return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n  return '<!--' + elem.data + '-->';\n}\n","var ElementType = require(\"domelementtype\"),\n    getOuterHTML = require(\"dom-serializer\"),\n    isTag = ElementType.isTag;\n\nmodule.exports = {\n\tgetInnerHTML: getInnerHTML,\n\tgetOuterHTML: getOuterHTML,\n\tgetText: getText\n};\n\nfunction getInnerHTML(elem, opts){\n\treturn elem.children ? elem.children.map(function(elem){\n\t\treturn getOuterHTML(elem, opts);\n\t}).join(\"\") : \"\";\n}\n\nfunction getText(elem){\n\tif(Array.isArray(elem)) return elem.map(getText).join(\"\");\n\tif(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);\n\tif(elem.type === ElementType.Text) return elem.data;\n\treturn \"\";\n}\n","var getChildren = exports.getChildren = function(elem){\n\treturn elem.children;\n};\n\nvar getParent = exports.getParent = function(elem){\n\treturn elem.parent;\n};\n\nexports.getSiblings = function(elem){\n\tvar parent = getParent(elem);\n\treturn parent ? getChildren(parent) : [elem];\n};\n\nexports.getAttributeValue = function(elem, name){\n\treturn elem.attribs && elem.attribs[name];\n};\n\nexports.hasAttrib = function(elem, name){\n\treturn !!elem.attribs && hasOwnProperty.call(elem.attribs, name);\n};\n\nexports.getName = function(elem){\n\treturn elem.name;\n};\n","exports.removeElement = function(elem){\n\tif(elem.prev) elem.prev.next = elem.next;\n\tif(elem.next) elem.next.prev = elem.prev;\n\n\tif(elem.parent){\n\t\tvar childs = elem.parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 1);\n\t}\n};\n\nexports.replaceElement = function(elem, replacement){\n\tvar prev = replacement.prev = elem.prev;\n\tif(prev){\n\t\tprev.next = replacement;\n\t}\n\n\tvar next = replacement.next = elem.next;\n\tif(next){\n\t\tnext.prev = replacement;\n\t}\n\n\tvar parent = replacement.parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds[childs.lastIndexOf(elem)] = replacement;\n\t}\n};\n\nexports.appendChild = function(elem, child){\n\tchild.parent = elem;\n\n\tif(elem.children.push(child) !== 1){\n\t\tvar sibling = elem.children[elem.children.length - 2];\n\t\tsibling.next = child;\n\t\tchild.prev = sibling;\n\t\tchild.next = null;\n\t}\n};\n\nexports.append = function(elem, next){\n\tvar parent = elem.parent,\n\t\tcurrNext = elem.next;\n\n\tnext.next = currNext;\n\tnext.prev = elem;\n\telem.next = next;\n\tnext.parent = parent;\n\n\tif(currNext){\n\t\tcurrNext.prev = next;\n\t\tif(parent){\n\t\t\tvar childs = parent.children;\n\t\t\tchilds.splice(childs.lastIndexOf(currNext), 0, next);\n\t\t}\n\t} else if(parent){\n\t\tparent.children.push(next);\n\t}\n};\n\nexports.prepend = function(elem, prev){\n\tvar parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 0, prev);\n\t}\n\n\tif(elem.prev){\n\t\telem.prev.next = prev;\n\t}\n\t\n\tprev.parent = parent;\n\tprev.prev = elem.prev;\n\tprev.next = elem;\n\telem.prev = prev;\n};\n\n\n","var isTag = require(\"domelementtype\").isTag;\n\nmodule.exports = {\n\tfilter: filter,\n\tfind: find,\n\tfindOneChild: findOneChild,\n\tfindOne: findOne,\n\texistsOne: existsOne,\n\tfindAll: findAll\n};\n\nfunction filter(test, element, recurse, limit){\n\tif(!Array.isArray(element)) element = [element];\n\n\tif(typeof limit !== \"number\" || !isFinite(limit)){\n\t\tlimit = Infinity;\n\t}\n\treturn find(test, element, recurse !== false, limit);\n}\n\nfunction find(test, elems, recurse, limit){\n\tvar result = [], childs;\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(test(elems[i])){\n\t\t\tresult.push(elems[i]);\n\t\t\tif(--limit <= 0) break;\n\t\t}\n\n\t\tchilds = elems[i].children;\n\t\tif(recurse && childs && childs.length > 0){\n\t\t\tchilds = find(test, childs, recurse, limit);\n\t\t\tresult = result.concat(childs);\n\t\t\tlimit -= childs.length;\n\t\t\tif(limit <= 0) break;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findOneChild(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(test(elems[i])) return elems[i];\n\t}\n\n\treturn null;\n}\n\nfunction findOne(test, elems){\n\tvar elem = null;\n\n\tfor(var i = 0, l = elems.length; i < l && !elem; i++){\n\t\tif(!isTag(elems[i])){\n\t\t\tcontinue;\n\t\t} else if(test(elems[i])){\n\t\t\telem = elems[i];\n\t\t} else if(elems[i].children.length > 0){\n\t\t\telem = findOne(test, elems[i].children);\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction existsOne(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(\n\t\t\tisTag(elems[i]) && (\n\t\t\t\ttest(elems[i]) || (\n\t\t\t\t\telems[i].children.length > 0 &&\n\t\t\t\t\texistsOne(test, elems[i].children)\n\t\t\t\t)\n\t\t\t)\n\t\t){\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction findAll(test, elems){\n\tvar result = [];\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\n\t\tif(elems[i].children.length > 0){\n\t\t\tresult = result.concat(findAll(test, elems[i].children));\n\t\t}\n\t}\n\treturn result;\n}\n","var ElementType = require(\"domelementtype\");\nvar isTag = exports.isTag = ElementType.isTag;\n\nexports.testElement = function(options, element){\n\tfor(var key in options){\n\t\tif(!options.hasOwnProperty(key));\n\t\telse if(key === \"tag_name\"){\n\t\t\tif(!isTag(element) || !options.tag_name(element.name)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(key === \"tag_type\"){\n\t\t\tif(!options.tag_type(element.type)) return false;\n\t\t} else if(key === \"tag_contains\"){\n\t\t\tif(isTag(element) || !options.tag_contains(element.data)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(!element.attribs || !options[key](element.attribs[key])){\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\nvar Checks = {\n\ttag_name: function(name){\n\t\tif(typeof name === \"function\"){\n\t\t\treturn function(elem){ return isTag(elem) && name(elem.name); };\n\t\t} else if(name === \"*\"){\n\t\t\treturn isTag;\n\t\t} else {\n\t\t\treturn function(elem){ return isTag(elem) && elem.name === name; };\n\t\t}\n\t},\n\ttag_type: function(type){\n\t\tif(typeof type === \"function\"){\n\t\t\treturn function(elem){ return type(elem.type); };\n\t\t} else {\n\t\t\treturn function(elem){ return elem.type === type; };\n\t\t}\n\t},\n\ttag_contains: function(data){\n\t\tif(typeof data === \"function\"){\n\t\t\treturn function(elem){ return !isTag(elem) && data(elem.data); };\n\t\t} else {\n\t\t\treturn function(elem){ return !isTag(elem) && elem.data === data; };\n\t\t}\n\t}\n};\n\nfunction getAttribCheck(attrib, value){\n\tif(typeof value === \"function\"){\n\t\treturn function(elem){ return elem.attribs && value(elem.attribs[attrib]); };\n\t} else {\n\t\treturn function(elem){ return elem.attribs && elem.attribs[attrib] === value; };\n\t}\n}\n\nfunction combineFuncs(a, b){\n\treturn function(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\nexports.getElements = function(options, element, recurse, limit){\n\tvar funcs = Object.keys(options).map(function(key){\n\t\tvar value = options[key];\n\t\treturn key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n\t});\n\n\treturn funcs.length === 0 ? [] : this.filter(\n\t\tfuncs.reduce(combineFuncs),\n\t\telement, recurse, limit\n\t);\n};\n\nexports.getElementById = function(id, element, recurse){\n\tif(!Array.isArray(element)) element = [element];\n\treturn this.findOne(getAttribCheck(\"id\", id), element, recurse !== false);\n};\n\nexports.getElementsByTagName = function(name, element, recurse, limit){\n\treturn this.filter(Checks.tag_name(name), element, recurse, limit);\n};\n\nexports.getElementsByTagType = function(type, element, recurse, limit){\n\treturn this.filter(Checks.tag_type(type), element, recurse, limit);\n};\n","// removeSubsets\n// Given an array of nodes, remove any member that is contained by another.\nexports.removeSubsets = function(nodes) {\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile (--idx > -1) {\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile (ancestor) {\n\t\t\tif (nodes.indexOf(ancestor) > -1) {\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = ancestor.parent;\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif (replace) {\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n};\n\n// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition\nvar POSITION = {\n\tDISCONNECTED: 1,\n\tPRECEDING: 2,\n\tFOLLOWING: 4,\n\tCONTAINS: 8,\n\tCONTAINED_BY: 16\n};\n\n// Compare the position of one node against another node in any other document.\n// The return value is a bitmask with the following values:\n//\n// document order:\n// > There is an ordering, document order, defined on all the nodes in the\n// > document corresponding to the order in which the first character of the\n// > XML representation of each node occurs in the XML representation of the\n// > document after expansion of general entities. Thus, the document element\n// > node will be the first node. Element nodes occur before their children.\n// > Thus, document order orders element nodes in order of the occurrence of\n// > their start-tag in the XML (after expansion of entities). The attribute\n// > nodes of an element occur after the element and before its children. The\n// > relative order of attribute nodes is implementation-dependent./\n// Source:\n// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n//\n// @argument {Node} nodaA The first node to use in the comparison\n// @argument {Node} nodeB The second node to use in the comparison\n//\n// @return {Number} A bitmask describing the input nodes' relative position.\n//         See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n//         a description of these values.\nvar comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {\n\tvar aParents = [];\n\tvar bParents = [];\n\tvar current, sharedParent, siblings, aSibling, bSibling, idx;\n\n\tif (nodeA === nodeB) {\n\t\treturn 0;\n\t}\n\n\tcurrent = nodeA;\n\twhile (current) {\n\t\taParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\tcurrent = nodeB;\n\twhile (current) {\n\t\tbParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\n\tidx = 0;\n\twhile (aParents[idx] === bParents[idx]) {\n\t\tidx++;\n\t}\n\n\tif (idx === 0) {\n\t\treturn POSITION.DISCONNECTED;\n\t}\n\n\tsharedParent = aParents[idx - 1];\n\tsiblings = sharedParent.children;\n\taSibling = aParents[idx];\n\tbSibling = bParents[idx];\n\n\tif (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n\t\tif (sharedParent === nodeB) {\n\t\t\treturn POSITION.FOLLOWING | POSITION.CONTAINED_BY;\n\t\t}\n\t\treturn POSITION.FOLLOWING;\n\t} else {\n\t\tif (sharedParent === nodeA) {\n\t\t\treturn POSITION.PRECEDING | POSITION.CONTAINS;\n\t\t}\n\t\treturn POSITION.PRECEDING;\n\t}\n};\n\n// Sort an array of nodes based on their relative position in the document and\n// remove any duplicate nodes. If the array contains nodes that do not belong\n// to the same document, sort order is unspecified.\n//\n// @argument {Array} nodes Array of DOM nodes\n//\n// @returns {Array} collection of unique nodes, sorted in document order\nexports.uniqueSort = function(nodes) {\n\tvar idx = nodes.length, node, position;\n\n\tnodes = nodes.slice();\n\n\twhile (--idx > -1) {\n\t\tnode = nodes[idx];\n\t\tposition = nodes.indexOf(node);\n\t\tif (position > -1 && position < idx) {\n\t\t\tnodes.splice(idx, 1);\n\t\t}\n\t}\n\tnodes.sort(function(a, b) {\n\t\tvar relative = comparePos(a, b);\n\t\tif (relative & POSITION.PRECEDING) {\n\t\t\treturn -1;\n\t\t} else if (relative & POSITION.FOLLOWING) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\treturn nodes;\n};\n","var DomUtils = module.exports;\n\n[\n\trequire(\"./lib/stringify\"),\n\trequire(\"./lib/traversal\"),\n\trequire(\"./lib/manipulation\"),\n\trequire(\"./lib/querying\"),\n\trequire(\"./lib/legacy\"),\n\trequire(\"./lib/helpers\")\n].forEach(function(ext){\n\tObject.keys(ext).forEach(function(key){\n\t\tDomUtils[key] = ext[key].bind(DomUtils);\n\t});\n});\n","module.exports = parse;\n\n//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\n\n//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\nvar re_nthElement = /^([+\\-]?\\d*n)?\\s*(?:([+\\-]?)\\s*(\\d+))?$/;\n\n/*\n\tparses a nth-check formula, returns an array of two numbers\n*/\nfunction parse(formula){\n\tformula = formula.trim().toLowerCase();\n\n\tif(formula === \"even\"){\n\t\treturn [2, 0];\n\t} else if(formula === \"odd\"){\n\t\treturn [2, 1];\n\t} else {\n\t\tvar parsed = formula.match(re_nthElement);\n\n\t\tif(!parsed){\n\t\t\tthrow new SyntaxError(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n\t\t}\n\n\t\tvar a;\n\n\t\tif(parsed[1]){\n\t\t\ta = parseInt(parsed[1], 10);\n\t\t\tif(isNaN(a)){\n\t\t\t\tif(parsed[1].charAt(0) === \"-\") a = -1;\n\t\t\t\telse a = 1;\n\t\t\t}\n\t\t} else a = 0;\n\n\t\treturn [\n\t\t\ta,\n\t\t\tparsed[3] ? parseInt((parsed[2] || \"\") + parsed[3], 10) : 0\n\t\t];\n\t}\n}\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","module.exports = compile;\n\nvar BaseFuncs = require(\"boolbase\"),\n    trueFunc  = BaseFuncs.trueFunc,\n    falseFunc = BaseFuncs.falseFunc;\n\n/*\n\treturns a function that checks if an elements index matches the given rule\n\thighly optimized to return the fastest solution\n*/\nfunction compile(parsed){\n\tvar a = parsed[0],\n\t    b = parsed[1] - 1;\n\n\t//when b <= 0, a*n won't be possible for any matches when a < 0\n\t//besides, the specification says that no element is matched when a and b are 0\n\tif(b < 0 && a <= 0) return falseFunc;\n\n\t//when a is in the range -1..1, it matches any element (so only b is checked)\n\tif(a ===-1) return function(pos){ return pos <= b; };\n\tif(a === 0) return function(pos){ return pos === b; };\n\t//when b <= 0 and a === 1, they match any element\n\tif(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };\n\n\t//when a > 0, modulo can be used to check if there is a match\n\tvar bMod = b % a;\n\tif(bMod < 0) bMod += a;\n\n\tif(a > 1){\n\t\treturn function(pos){\n\t\t\treturn pos >= b && pos % a === bMod;\n\t\t};\n\t}\n\n\ta *= -1; //make `a` positive\n\n\treturn function(pos){\n\t\treturn pos <= b && pos % a === bMod;\n\t};\n}","var parse = require(\"./parse.js\"),\n    compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","var DomUtils  = require(\"domutils\"),\n    hasAttrib = DomUtils.hasAttrib,\n    getAttributeValue = DomUtils.getAttributeValue,\n    falseFunc = require(\"boolbase\").falseFunc;\n\n//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\n\n/*\n\tattribute selectors\n*/\n\nvar attributeRules = {\n\t__proto__: null,\n\tequals: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function equalsIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function equals(elem){\n\t\t\treturn getAttributeValue(elem, name) === value && next(elem);\n\t\t};\n\t},\n\thyphen: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function hyphenIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null &&\n\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\tattr.substr(0, len).toLowerCase() === value &&\n\t\t\t\t\t\tnext(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function hyphen(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null &&\n\t\t\t\t\tattr.substr(0, len) === value &&\n\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\tnext(elem);\n\t\t};\n\t},\n\telement: function(next, data){\n\t\tvar name = data.name,\n\t\t    value = data.value;\n\n\t\tif(/\\s/.test(value)){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tvalue = value.replace(reChars, \"\\\\$&\");\n\n\t\tvar pattern = \"(?:^|\\\\s)\" + value + \"(?:$|\\\\s)\",\n\t\t    flags = data.ignoreCase ? \"i\" : \"\",\n\t\t    regex = new RegExp(pattern, flags);\n\n\t\treturn function element(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t};\n\t},\n\texists: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function exists(elem){\n\t\t\treturn hasAttrib(elem, name) && next(elem);\n\t\t};\n\t},\n\tstart: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len = value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\t\t\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function startIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function start(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(0, len) === value && next(elem);\n\t\t};\n\t},\n\tend: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value,\n\t\t    len   = -value.length;\n\n\t\tif(len === 0){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function endIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(len).toLowerCase() === value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function end(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.substr(len) === value && next(elem);\n\t\t};\n\t},\n\tany: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn falseFunc;\n\t\t}\n\n\t\tif(data.ignoreCase){\n\t\t\tvar regex = new RegExp(value.replace(reChars, \"\\\\$&\"), \"i\");\n\n\t\t\treturn function anyIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function any(elem){\n\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\treturn attr != null && attr.indexOf(value) >= 0 && next(elem);\n\t\t};\n\t},\n\tnot: function(next, data){\n\t\tvar name  = data.name,\n\t\t    value = data.value;\n\n\t\tif(value === \"\"){\n\t\t\treturn function notEmpty(elem){\n\t\t\t\treturn !!getAttributeValue(elem, name) && next(elem);\n\t\t\t};\n\t\t} else if(data.ignoreCase){\n\t\t\tvalue = value.toLowerCase();\n\n\t\t\treturn function notIC(elem){\n\t\t\t\tvar attr = getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.toLowerCase() !== value && next(elem);\n\t\t\t};\n\t\t}\n\n\t\treturn function not(elem){\n\t\t\treturn getAttributeValue(elem, name) !== value && next(elem);\n\t\t};\n\t}\n};\n\nmodule.exports = {\n\tcompile: function(next, data, options){\n\t\tif(options && options.strict && (\n\t\t\tdata.ignoreCase || data.action === \"not\"\n\t\t)) throw SyntaxError(\"Unsupported attribute selector\");\n\t\treturn attributeRules[data.action](next, data);\n\t},\n\trules: attributeRules\n};\n","/*\n\tpseudo selectors\n\n\t---\n\n\tthey are available in two forms:\n\t* filters called when the selector\n\t  is compiled and return a function\n\t  that needs to return next()\n\t* pseudos get called on execution\n\t  they need to return a boolean\n*/\n\nvar DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getText     = DomUtils.getText,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    hasAttrib   = DomUtils.hasAttrib,\n    getName     = DomUtils.getName,\n    getAttribute= DomUtils.getAttributeValue,\n    getNCheck   = require(\"nth-check\"),\n    checkAttrib = require(\"./attributes.js\").rules.equals,\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc;\n\n//helper methods\nfunction getFirstElement(elems){\n\tfor(var i = 0; elems && i < elems.length; i++){\n\t\tif(isTag(elems[i])) return elems[i];\n\t}\n}\n\nfunction getAttribFunc(name, value){\n\tvar data = {name: name, value: value};\n\treturn function attribFunc(next){\n\t\treturn checkAttrib(next, data);\n\t};\n}\n\nfunction getChildFunc(next){\n\treturn function(elem){\n\t\treturn !!getParent(elem) && next(elem);\n\t};\n}\n\nvar filters = {\n\tcontains: function(next, text){\n\t\treturn function contains(elem){\n\t\t\treturn next(elem) && getText(elem).indexOf(text) >= 0;\n\t\t};\n\t},\n\ticontains: function(next, text){\n\t\tvar itext = text.toLowerCase();\n\t\treturn function icontains(elem){\n\t\t\treturn next(elem) &&\n\t\t\t\tgetText(elem).toLowerCase().indexOf(itext) >= 0;\n\t\t};\n\t},\n\n\t//location specific methods\n\t\"nth-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0, pos = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-child\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastChild(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\telse pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\t\"nth-last-of-type\": function(next, rule){\n\t\tvar func = getNCheck(rule);\n\n\t\tif(func === falseFunc) return func;\n\t\tif(func === trueFunc)  return getChildFunc(next);\n\n\t\treturn function nthLastOfType(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(getName(siblings[i]) === getName(elem)) pos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn func(pos) && next(elem);\n\t\t};\n\t},\n\n    //TODO determine the actual root element\n    root: function(next){\n        return function(elem){\n            return !getParent(elem) && next(elem);\n        };\n    },\n\n    scope: function(next, rule, options, context){\n        if(!context || context.length === 0){\n            //equivalent to :root\n            return filters.root(next);\n        }\n\n        if(context.length === 1){\n            //NOTE: can't be unpacked, as :has uses this for side-effects\n            return function(elem){\n                return context[0] === elem && next(elem);\n            };\n        }\n\n        return function(elem){\n            return context.indexOf(elem) >= 0 && next(elem);\n        };\n    },\n\n\t//jQuery extensions (others follow as pseudos)\n\tcheckbox: getAttribFunc(\"type\", \"checkbox\"),\n\tfile: getAttribFunc(\"type\", \"file\"),\n\tpassword: getAttribFunc(\"type\", \"password\"),\n\tradio: getAttribFunc(\"type\", \"radio\"),\n\treset: getAttribFunc(\"type\", \"reset\"),\n\timage: getAttribFunc(\"type\", \"image\"),\n\tsubmit: getAttribFunc(\"type\", \"submit\")\n};\n\n//while filters are precompiled, pseudos get called when they are needed\nvar pseudos = {\n\tempty: function(elem){\n\t\treturn !getChildren(elem).some(function(elem){\n\t\t\treturn isTag(elem) || elem.type === \"text\";\n\t\t});\n\t},\n\n\t\"first-child\": function(elem){\n\t\treturn getFirstElement(getSiblings(elem)) === elem;\n\t},\n\t\"last-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\tif(siblings[i] === elem) return true;\n\t\t\tif(isTag(siblings[i])) break;\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"first-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"last-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = siblings.length-1; i >= 0; i--){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) break;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\"only-of-type\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0, j = siblings.length; i < j; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem) continue;\n\t\t\t\tif(getName(siblings[i]) === getName(elem)) return false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\t\"only-child\": function(elem){\n\t\tvar siblings = getSiblings(elem);\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i]) && siblings[i] !== elem) return false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t//:matches(a, area, link)[href]\n\tlink: function(elem){\n\t\treturn hasAttrib(elem, \"href\");\n\t},\n\tvisited: falseFunc, //seems to be a valid implementation\n\t//TODO: :any-link once the name is finalized (as an alias of :link)\n\n\t//forms\n\t//to consider: :target\n\n\t//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)\n\tselected: function(elem){\n\t\tif(hasAttrib(elem, \"selected\")) return true;\n\t\telse if(getName(elem) !== \"option\") return false;\n\n\t\t//the first <option> in a <select> is also selected\n\t\tvar parent = getParent(elem);\n\n\t\tif(\n\t\t\t!parent ||\n\t\t\tgetName(parent) !== \"select\" ||\n\t\t\thasAttrib(parent, \"multiple\")\n\t\t) return false;\n\n\t\tvar siblings = getChildren(parent),\n\t\t\tsawElem  = false;\n\n\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\tif(isTag(siblings[i])){\n\t\t\t\tif(siblings[i] === elem){\n\t\t\t\t\tsawElem = true;\n\t\t\t\t} else if(!sawElem){\n\t\t\t\t\treturn false;\n\t\t\t\t} else if(hasAttrib(siblings[i], \"selected\")){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sawElem;\n\t},\n\t//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n\t//:matches(\n\t//  :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],\n\t//  optgroup[disabled] > option),\n\t// fieldset[disabled] * //TODO not child of first <legend>\n\t//)\n\tdisabled: function(elem){\n\t\treturn hasAttrib(elem, \"disabled\");\n\t},\n\tenabled: function(elem){\n\t\treturn !hasAttrib(elem, \"disabled\");\n\t},\n\t//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)\n\tchecked: function(elem){\n\t\treturn hasAttrib(elem, \"checked\") || pseudos.selected(elem);\n\t},\n\t//:matches(input, select, textarea)[required]\n\trequired: function(elem){\n\t\treturn hasAttrib(elem, \"required\");\n\t},\n\t//:matches(input, select, textarea):not([required])\n\toptional: function(elem){\n\t\treturn !hasAttrib(elem, \"required\");\n\t},\n\n\t//jQuery extensions\n\n\t//:not(:empty)\n\tparent: function(elem){\n\t\treturn !pseudos.empty(elem);\n\t},\n\t//:matches(h1, h2, h3, h4, h5, h6)\n\theader: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"h1\" ||\n\t\t       name === \"h2\" ||\n\t\t       name === \"h3\" ||\n\t\t       name === \"h4\" ||\n\t\t       name === \"h5\" ||\n\t\t       name === \"h6\";\n\t},\n\n\t//:matches(button, input[type=button])\n\tbutton: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"button\" ||\n\t\t       name === \"input\" &&\n\t\t       getAttribute(elem, \"type\") === \"button\";\n\t},\n\t//:matches(input, textarea, select, button)\n\tinput: function(elem){\n\t\tvar name = getName(elem);\n\t\treturn name === \"input\" ||\n\t\t       name === \"textarea\" ||\n\t\t       name === \"select\" ||\n\t\t       name === \"button\";\n\t},\n\t//input:matches(:not([type!='']), [type='text' i])\n\ttext: function(elem){\n\t\tvar attr;\n\t\treturn getName(elem) === \"input\" && (\n\t\t\t!(attr = getAttribute(elem, \"type\")) ||\n\t\t\tattr.toLowerCase() === \"text\"\n\t\t);\n\t}\n};\n\nfunction verifyArgs(func, name, subselect){\n\tif(subselect === null){\n\t\tif(func.length > 1 && name !== \"scope\"){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" requires an argument\");\n\t\t}\n\t} else {\n\t\tif(func.length === 1){\n\t\t\tthrow new SyntaxError(\"pseudo-selector :\" + name + \" doesn't have any arguments\");\n\t\t}\n\t}\n}\n\n//FIXME this feels hacky\nvar re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;\n\nmodule.exports = {\n\tcompile: function(next, data, options, context){\n\t\tvar name = data.name,\n\t\t\tsubselect = data.data;\n\n\t\tif(options && options.strict && !re_CSS3.test(name)){\n\t\t\tthrow SyntaxError(\":\" + name + \" isn't part of CSS3\");\n\t\t}\n\n\t\tif(typeof filters[name] === \"function\"){\n\t\t\tverifyArgs(filters[name], name,  subselect);\n\t\t\treturn filters[name](next, subselect, options, context);\n\t\t} else if(typeof pseudos[name] === \"function\"){\n\t\t\tvar func = pseudos[name];\n\t\t\tverifyArgs(func, name, subselect);\n\n\t\t\tif(next === trueFunc) return func;\n\n\t\t\treturn function pseudoArgs(elem){\n\t\t\t\treturn func(elem, subselect) && next(elem);\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new SyntaxError(\"unmatched pseudo-class :\" + name);\n\t\t}\n\t},\n\tfilters: filters,\n\tpseudos: pseudos\n};\n","\"use strict\";\n\nmodule.exports = parse;\n\nvar re_name = /^(?:\\\\.|[\\w\\-\\u00b0-\\uFFFF])+/,\n    re_escape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/ig,\n    //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87\n    re_attr = /^\\s*((?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])+)\\s*(?:(\\S?)=\\s*(?:(['\"])([^]*?)\\3|(#?(?:\\\\.|[\\w\\u00b0-\\uFFFF\\-])*)|)|)\\s*(i)?\\]/;\n\nvar actionTypes = {\n\t__proto__: null,\n\t\"undefined\": \"exists\",\n\t\"\":  \"equals\",\n\t\"~\": \"element\",\n\t\"^\": \"start\",\n\t\"$\": \"end\",\n\t\"*\": \"any\",\n\t\"!\": \"not\",\n\t\"|\": \"hyphen\"\n};\n\nvar simpleSelectors = {\n\t__proto__: null,\n\t\">\": \"child\",\n\t\"<\": \"parent\",\n\t\"~\": \"sibling\",\n\t\"+\": \"adjacent\"\n};\n\nvar attribSelectors = {\n\t__proto__: null,\n\t\"#\": [\"id\", \"equals\"],\n\t\".\": [\"class\", \"element\"]\n};\n\n//pseudos, whose data-property is parsed as well\nvar unpackPseudos = {\n\t__proto__: null,\n\t\"has\": true,\n\t\"not\": true,\n\t\"matches\": true\n};\n\nvar stripQuotesFromPseudos = {\n\t__proto__: null,\n\t\"contains\": true,\n\t\"icontains\": true\n};\n\nvar quotes = {\n\t__proto__: null,\n\t\"\\\"\": true,\n\t\"'\": true\n};\n\n//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139\nfunction funescape( _, escaped, escapedWhitespace ) {\n\tvar high = \"0x\" + escaped - 0x10000;\n\t// NaN means non-codepoint\n\t// Support: Firefox\n\t// Workaround erroneous numeric interpretation of +\"0x\"\n\treturn high !== high || escapedWhitespace ?\n\t\tescaped :\n\t\t// BMP codepoint\n\t\thigh < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n}\n\nfunction unescapeCSS(str){\n\treturn str.replace(re_escape, funescape);\n}\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n\nfunction parse(selector, options){\n\tvar subselects = [];\n\n\tselector = parseSelector(subselects, selector + \"\", options);\n\n\tif(selector !== \"\"){\n\t\tthrow new SyntaxError(\"Unmatched selector: \" + selector);\n\t}\n\n\treturn subselects;\n}\n\nfunction parseSelector(subselects, selector, options){\n\tvar tokens = [],\n\t\tsawWS = false,\n\t\tdata, firstChar, name, quot;\n\n\tfunction getName(){\n\t\tvar sub = selector.match(re_name)[0];\n\t\tselector = selector.substr(sub.length);\n\t\treturn unescapeCSS(sub);\n\t}\n\n\tfunction stripWhitespace(start){\n\t\twhile(isWhitespace(selector.charAt(start))) start++;\n\t\tselector = selector.substr(start);\n\t}\n\n\tfunction isEscaped(pos) {\n\t\tvar slashCount = 0;\n\n\t\twhile (selector.charAt(--pos) === \"\\\\\") slashCount++;\n\t\treturn (slashCount & 1) === 1;\n\t}\n\n\tstripWhitespace(0);\n\n\twhile(selector !== \"\"){\n\t\tfirstChar = selector.charAt(0);\n\n\t\tif(isWhitespace(firstChar)){\n\t\t\tsawWS = true;\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar in simpleSelectors){\n\t\t\ttokens.push({type: simpleSelectors[firstChar]});\n\t\t\tsawWS = false;\n\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar === \",\"){\n\t\t\tif(tokens.length === 0){\n\t\t\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t\t\t}\n\t\t\tsubselects.push(tokens);\n\t\t\ttokens = [];\n\t\t\tsawWS = false;\n\t\t\tstripWhitespace(1);\n\t\t} else {\n\t\t\tif(sawWS){\n\t\t\t\tif(tokens.length > 0){\n\t\t\t\t\ttokens.push({type: \"descendant\"});\n\t\t\t\t}\n\t\t\t\tsawWS = false;\n\t\t\t}\n\n\t\t\tif(firstChar === \"*\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({type: \"universal\"});\n\t\t\t} else if(firstChar in attribSelectors){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: attribSelectors[firstChar][0],\n\t\t\t\t\taction: attribSelectors[firstChar][1],\n\t\t\t\t\tvalue: getName(),\n\t\t\t\t\tignoreCase: false\n\t\t\t\t});\n\t\t\t} else if(firstChar === \"[\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\tdata = selector.match(re_attr);\n\t\t\t\tif(!data){\n\t\t\t\t\tthrow new SyntaxError(\"Malformed attribute selector: \" + selector);\n\t\t\t\t}\n\t\t\t\tselector = selector.substr(data[0].length);\n\t\t\t\tname = unescapeCSS(data[1]);\n\n\t\t\t\tif(\n\t\t\t\t\t!options || (\n\t\t\t\t\t\t\"lowerCaseAttributeNames\" in options ?\n\t\t\t\t\t\t\toptions.lowerCaseAttributeNames :\n\t\t\t\t\t\t\t!options.xmlMode\n\t\t\t\t\t)\n\t\t\t\t){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: name,\n\t\t\t\t\taction: actionTypes[data[2]],\n\t\t\t\t\tvalue: unescapeCSS(data[4] || data[5] || \"\"),\n\t\t\t\t\tignoreCase: !!data[6]\n\t\t\t\t});\n\n\t\t\t} else if(firstChar === \":\"){\n\t\t\t\tif(selector.charAt(1) === \":\"){\n\t\t\t\t\tselector = selector.substr(2);\n\t\t\t\t\ttokens.push({type: \"pseudo-element\", name: getName().toLowerCase()});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.substr(1);\n\n\t\t\t\tname = getName().toLowerCase();\n\t\t\t\tdata = null;\n\n\t\t\t\tif(selector.charAt(0) === \"(\"){\n\t\t\t\t\tif(name in unpackPseudos){\n\t\t\t\t\t\tquot = selector.charAt(1);\n\t\t\t\t\t\tvar quoted = quot in quotes;\n\n\t\t\t\t\t\tselector = selector.substr(quoted + 1);\n\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tselector = parseSelector(data, selector, options);\n\n\t\t\t\t\t\tif(quoted){\n\t\t\t\t\t\t\tif(selector.charAt(0) !== quot){\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\"unmatched quotes in :\" + name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(selector.charAt(0) !== \")\"){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"missing closing parenthesis in :\" + name + \" \" + selector);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar pos = 1, counter = 1;\n\n\t\t\t\t\t\tfor(; counter > 0 && pos < selector.length; pos++){\n\t\t\t\t\t\t\tif(selector.charAt(pos) === \"(\" && !isEscaped(pos)) counter++;\n\t\t\t\t\t\t\telse if(selector.charAt(pos) === \")\" && !isEscaped(pos)) counter--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"parenthesis not matched\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = selector.substr(1, pos - 2);\n\t\t\t\t\t\tselector = selector.substr(pos);\n\n\t\t\t\t\t\tif(name in stripQuotesFromPseudos){\n\t\t\t\t\t\t\tquot = data.charAt(0);\n\n\t\t\t\t\t\t\tif(quot === data.slice(-1) && quot in quotes){\n\t\t\t\t\t\t\t\tdata = data.slice(1, -1);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdata = unescapeCSS(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"pseudo\", name: name, data: data});\n\t\t\t} else if(re_name.test(selector)){\n\t\t\t\tname = getName();\n\n\t\t\t\tif(!options || (\"lowerCaseTags\" in options ? options.lowerCaseTags : !options.xmlMode)){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"tag\", name: name});\n\t\t\t} else {\n\t\t\t\tif(tokens.length && tokens[tokens.length - 1].type === \"descendant\"){\n\t\t\t\t\ttokens.pop();\n\t\t\t\t}\n\t\t\t\taddToken(subselects, tokens);\n\t\t\t\treturn selector;\n\t\t\t}\n\t\t}\n\t}\n\n\taddToken(subselects, tokens);\n\n\treturn selector;\n}\n\nfunction addToken(subselects, tokens){\n\tif(subselects.length > 0 && tokens.length === 0){\n\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t}\n\n\tsubselects.push(tokens);\n}\n","var DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    getParent   = DomUtils.getParent,\n    getChildren = DomUtils.getChildren,\n    getSiblings = DomUtils.getSiblings,\n    getName     = DomUtils.getName;\n\n/*\n\tall available rules\n*/\nmodule.exports = {\n\t__proto__: null,\n\n\tattribute: require(\"./attributes.js\").compile,\n\tpseudo: require(\"./pseudos.js\").compile,\n\n\t//tags\n\ttag: function(next, data){\n\t\tvar name = data.name;\n\t\treturn function tag(elem){\n\t\t\treturn getName(elem) === name && next(elem);\n\t\t};\n\t},\n\n\t//traversal\n\tdescendant: function(next, rule, options, context, acceptSelf){\n\t\treturn function descendant(elem){\n\n\t\t\tif (acceptSelf && next(elem)) return true;\n\n\t\t\tvar found = false;\n\n\t\t\twhile(!found && (elem = getParent(elem))){\n\t\t\t\tfound = next(elem);\n\t\t\t}\n\n\t\t\treturn found;\n\t\t};\n\t},\n\tparent: function(next, data, options){\n\t\tif(options && options.strict) throw SyntaxError(\"Parent selector isn't part of CSS3\");\n\n\t\treturn function parent(elem){\n\t\t\treturn getChildren(elem).some(test);\n\t\t};\n\n\t\tfunction test(elem){\n\t\t\treturn isTag(elem) && next(elem);\n\t\t}\n\t},\n\tchild: function(next){\n\t\treturn function child(elem){\n\t\t\tvar parent = getParent(elem);\n\t\t\treturn !!parent && next(parent);\n\t\t};\n\t},\n\tsibling: function(next){\n\t\treturn function sibling(elem){\n\t\t\tvar siblings = getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tif(next(siblings[i])) return true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\t},\n\tadjacent: function(next){\n\t\treturn function adjacent(elem){\n\t\t\tvar siblings = getSiblings(elem),\n\t\t\t    lastElement;\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\tlastElement = siblings[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !!lastElement && next(lastElement);\n\t\t};\n\t},\n\tuniversal: function(next){\n\t\treturn next;\n\t}\n};","module.exports = sortByProcedure;\n\n/*\n\tsort the parts of the passed selector,\n\tas there is potential for optimization\n\t(some types of selectors are faster than others)\n*/\n\nvar procedure = require(\"./procedure.json\");\n\nvar attributes = {\n\t__proto__: null,\n\texists: 10,\n\tequals: 8,\n\tnot: 7,\n\tstart: 6,\n\tend: 6,\n\tany: 5,\n\thyphen: 4,\n\telement: 4\n};\n\nfunction sortByProcedure(arr){\n\tvar procs = arr.map(getProcedure);\n\tfor(var i = 1; i < arr.length; i++){\n\t\tvar procNew = procs[i];\n\n\t\tif(procNew < 0) continue;\n\n\t\tfor(var j = i - 1; j >= 0 && procNew < procs[j]; j--){\n\t\t\tvar token = arr[j + 1];\n\t\t\tarr[j + 1] = arr[j];\n\t\t\tarr[j] = token;\n\t\t\tprocs[j + 1] = procs[j];\n\t\t\tprocs[j] = procNew;\n\t\t}\n\t}\n}\n\nfunction getProcedure(token){\n\tvar proc = procedure[token.type];\n\n\tif(proc === procedure.attribute){\n\t\tproc = attributes[token.action];\n\n\t\tif(proc === attributes.equals && token.name === \"id\"){\n\t\t\t//prefer ID selectors (eg. #ID)\n\t\t\tproc = 9;\n\t\t}\n\n\t\tif(token.ignoreCase){\n\t\t\t//ignoreCase adds some overhead, prefer \"normal\" token\n\t\t\t//this is a binary operation, to ensure it's still an int\n\t\t\tproc >>= 1;\n\t\t}\n\t} else if(proc === procedure.pseudo){\n\t\tif(!token.data){\n\t\t\tproc = 3;\n\t\t} else if(token.name === \"has\" || token.name === \"contains\"){\n\t\t\tproc = 0; //expensive in any case\n\t\t} else if(token.name === \"matches\" || token.name === \"not\"){\n\t\t\tproc = 0;\n\t\t\tfor(var i = 0; i < token.data.length; i++){\n\t\t\t\t//TODO better handling of complex selectors\n\t\t\t\tif(token.data[i].length !== 1) continue;\n\t\t\t\tvar cur = getProcedure(token.data[i][0]);\n\t\t\t\t//avoid executing :has or :contains\n\t\t\t\tif(cur === 0){\n\t\t\t\t\tproc = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(cur > proc) proc = cur;\n\t\t\t}\n\t\t\tif(token.data.length > 1 && proc > 0) proc -= 1;\n\t\t} else {\n\t\t\tproc = 1;\n\t\t}\n\t}\n\treturn proc;\n}\n","/*\n\tcompiles a selector to an executable function\n*/\n\nmodule.exports = compile;\nmodule.exports.compileUnsafe = compileUnsafe;\nmodule.exports.compileToken = compileToken;\n\nvar parse       = require(\"css-what\"),\n    DomUtils    = require(\"domutils\"),\n    isTag       = DomUtils.isTag,\n    Rules       = require(\"./general.js\"),\n    sortRules   = require(\"./sort.js\"),\n    BaseFuncs   = require(\"boolbase\"),\n    trueFunc    = BaseFuncs.trueFunc,\n    falseFunc   = BaseFuncs.falseFunc,\n    procedure   = require(\"./procedure.json\");\n\nfunction compile(selector, options, context){\n\tvar next = compileUnsafe(selector, options, context);\n\treturn wrap(next);\n}\n\nfunction wrap(next){\n\treturn function base(elem){\n\t\treturn isTag(elem) && next(elem);\n\t};\n}\n\nfunction compileUnsafe(selector, options, context){\n\tvar token = parse(selector, options);\n\treturn compileToken(token, options, context);\n}\n\nfunction includesScopePseudo(t){\n    return t.type === \"pseudo\" && (\n        t.name === \"scope\" || (\n            Array.isArray(t.data) &&\n            t.data.some(function(data){\n                return data.some(includesScopePseudo);\n            })\n        )\n    );\n}\n\nvar DESCENDANT_TOKEN = {type: \"descendant\"},\n    SCOPE_TOKEN = {type: \"pseudo\", name: \"scope\"},\n    PLACEHOLDER_ELEMENT = {},\n    getParent = DomUtils.getParent;\n\n//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n//http://www.w3.org/TR/selectors4/#absolutizing\nfunction absolutize(token, context){\n    //TODO better check if context is document\n    var hasContext = !!context && !!context.length && context.every(function(e){\n        return e === PLACEHOLDER_ELEMENT || !!getParent(e);\n    });\n\n\n    token.forEach(function(t){\n        if(t.length > 0 && isTraversal(t[0]) && t[0].type !== \"descendant\"){\n            //don't return in else branch\n        } else if(hasContext && !includesScopePseudo(t)){\n            t.unshift(DESCENDANT_TOKEN);\n        } else {\n            return;\n        }\n\n        t.unshift(SCOPE_TOKEN);\n    });\n}\n\nfunction compileToken(token, options, context){\n    token = token.filter(function(t){ return t.length > 0; });\n\n\ttoken.forEach(sortRules);\n\n\tvar isArrayContext = Array.isArray(context);\n\n    context = (options && options.context) || context;\n\n    if(context && !isArrayContext) context = [context];\n\n    absolutize(token, context);\n\n\treturn token\n\t\t.map(function(rules){ return compileRules(rules, options, context, isArrayContext); })\n\t\t.reduce(reduceRules, falseFunc);\n}\n\nfunction isTraversal(t){\n\treturn procedure[t.type] < 0;\n}\n\nfunction compileRules(rules, options, context, isArrayContext){\n\tvar acceptSelf = (isArrayContext && rules[0].name === \"scope\" && rules[1].type === \"descendant\");\n\treturn rules.reduce(function(func, rule, index){\n\t\tif(func === falseFunc) return func;\n\t\treturn Rules[rule.type](func, rule, options, context, acceptSelf && index === 1);\n\t}, options && options.rootFunc || trueFunc);\n}\n\nfunction reduceRules(a, b){\n\tif(b === falseFunc || a === trueFunc){\n\t\treturn a;\n\t}\n\tif(a === falseFunc || b === trueFunc){\n\t\treturn b;\n\t}\n\n\treturn function combine(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\n//:not, :has and :matches have to compile selectors\n//doing this in lib/pseudos.js would lead to circular dependencies,\n//so we add them here\n\nvar Pseudos     = require(\"./pseudos.js\"),\n    filters     = Pseudos.filters,\n    existsOne   = DomUtils.existsOne,\n    isTag       = DomUtils.isTag,\n    getChildren = DomUtils.getChildren;\n\n\nfunction containsTraversal(t){\n\treturn t.some(isTraversal);\n}\n\nfilters.not = function(next, token, options, context){\n\tvar opts = {\n\t    \txmlMode: !!(options && options.xmlMode),\n\t    \tstrict: !!(options && options.strict)\n\t    };\n\n\tif(opts.strict){\n\t\tif(token.length > 1 || token.some(containsTraversal)){\n\t\t\tthrow new SyntaxError(\"complex selectors in :not aren't allowed in strict mode\");\n\t\t}\n\t}\n\n    var func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return next;\n\tif(func === trueFunc)  return falseFunc;\n\n\treturn function(elem){\n\t\treturn !func(elem) && next(elem);\n\t};\n};\n\nfilters.has = function(next, token, options){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict)\n\t};\n\n    //FIXME: Uses an array as a pointer to the current element (side effects)\n    var context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;\n\n\tvar func = compileToken(token, opts, context);\n\n\tif(func === falseFunc) return falseFunc;\n\tif(func === trueFunc)  return function(elem){\n\t\t\treturn getChildren(elem).some(isTag) && next(elem);\n\t\t};\n\n\tfunc = wrap(func);\n\n    if(context){\n        return function has(elem){\n\t\treturn next(elem) && (\n                (context[0] = elem), existsOne(func, getChildren(elem))\n            );\n\t};\n    }\n\n    return function has(elem){\n\t\treturn next(elem) && existsOne(func, getChildren(elem));\n\t};\n};\n\nfilters.matches = function(next, token, options, context){\n\tvar opts = {\n\t\txmlMode: !!(options && options.xmlMode),\n\t\tstrict: !!(options && options.strict),\n\t\trootFunc: next\n\t};\n\n\treturn compileToken(token, opts, context);\n};\n","\"use strict\";\n\nmodule.exports = CSSselect;\n\nvar Pseudos       = require(\"./lib/pseudos.js\"),\n    DomUtils      = require(\"domutils\"),\n    findOne       = DomUtils.findOne,\n    findAll       = DomUtils.findAll,\n    getChildren   = DomUtils.getChildren,\n    removeSubsets = DomUtils.removeSubsets,\n    falseFunc     = require(\"boolbase\").falseFunc,\n    compile       = require(\"./lib/compile.js\"),\n    compileUnsafe = compile.compileUnsafe,\n    compileToken  = compile.compileToken;\n\nfunction getSelectorFunc(searchFunc){\n\treturn function select(query, elems, options){\n        if(typeof query !== \"function\") query = compileUnsafe(query, options, elems);\n        if(!Array.isArray(elems)) elems = getChildren(elems);\n\t\telse elems = removeSubsets(elems);\n\t\treturn searchFunc(query, elems);\n\t};\n}\n\nvar selectAll = getSelectorFunc(function selectAll(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? [] : findAll(query, elems);\n});\n\nvar selectOne = getSelectorFunc(function selectOne(query, elems){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? null : findOne(query, elems);\n});\n\nfunction is(elem, query, options){\n\treturn (typeof query === \"function\" ? query : compile(query, options))(elem);\n}\n\n/*\n\tthe exported interface\n*/\nfunction CSSselect(query, elems, options){\n\treturn selectAll(query, elems, options);\n}\n\nCSSselect.compile = compile;\nCSSselect.filters = Pseudos.filters;\nCSSselect.pseudos = Pseudos.pseudos;\n\nCSSselect.selectAll = selectAll;\nCSSselect.selectOne = selectOne;\n\nCSSselect.is = is;\n\n//legacy methods (might be removed)\nCSSselect.parse = compile;\nCSSselect.iterate = selectAll;\n\n//hooks\nCSSselect._compileUnsafe = compileUnsafe;\nCSSselect._compileToken = compileToken;\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport parse5 from 'parse5';\nimport select from 'css-select';\n\n// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere\nconst treeAdapter = require('parse5-htmlparser2-tree-adapter');\n\nconst PARSE5_OPTS = {\n  treeAdapter\n};\n\n/**\n * Parse HTML into a mutable, serializable DOM Document.\n * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.\n * @param {String} html   HTML to parse into a Document instance\n */\nexport function createDocument(html) {\n  const document = parse5.parse(html, PARSE5_OPTS);\n\n  defineProperties(document, DocumentExtensions);\n\n  // Extend Element.prototype with DOM manipulation methods.\n  const scratch = document.createElement('div');\n  // Get a reference to the base Node class - used by createTextNode()\n  document.$$Node = scratch.constructor;\n  const elementProto = Object.getPrototypeOf(scratch);\n  defineProperties(elementProto, ElementExtensions);\n  elementProto.ownerDocument = document;\n\n  return document;\n}\n\n/**\n * Serialize a Document to an HTML String\n * @param {Document} document   A Document, such as one created via `createDocument()`\n */\nexport function serializeDocument(document) {\n  return parse5.serialize(document, PARSE5_OPTS);\n}\n\n/**\n * Methods and descriptors to mix into Element.prototype\n */\nconst ElementExtensions = {\n  /** @extends htmlparser2.Element.prototype */\n\n  nodeName: {\n    get() {\n      return this.tagName.toUpperCase();\n    }\n  },\n\n  id: reflectedProperty('id'),\n\n  className: reflectedProperty('class'),\n\n  insertBefore(child, referenceNode) {\n    if (!referenceNode) return this.appendChild(child);\n    treeAdapter.insertBefore(this, child, referenceNode);\n    return child;\n  },\n\n  appendChild(child) {\n    treeAdapter.appendChild(this, child);\n    return child;\n  },\n\n  removeChild(child) {\n    treeAdapter.detachNode(child);\n  },\n\n  remove() {\n    treeAdapter.detachNode(this);\n  },\n\n  textContent: {\n    get() {\n      return getText(this);\n    },\n\n    set(text) {\n      this.children = [];\n      treeAdapter.insertText(this, text);\n    }\n  },\n\n  setAttribute(name, value) {\n    if (this.attribs == null) this.attribs = {};\n    if (value == null) value = '';\n    this.attribs[name] = value;\n  },\n\n  removeAttribute(name) {\n    if (this.attribs != null) {\n      delete this.attribs[name];\n    }\n  },\n\n  getAttribute(name) {\n    return this.attribs != null && this.attribs[name];\n  },\n\n  hasAttribute(name) {\n    return this.attribs != null && this.attribs[name] != null;\n  },\n\n  getAttributeNode(name) {\n    const value = this.getAttribute(name);\n    if (value != null) return { specified: true, value };\n  }\n};\n\n/**\n * Methods and descriptors to mix into the global document instance\n * @private\n */\nconst DocumentExtensions = {\n  /** @extends htmlparser2.Document.prototype */\n\n  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.\n  // TODO: verify if these are needed for css-select\n  nodeType: {\n    get() {\n      return 9;\n    }\n  },\n\n  contentType: {\n    get() {\n      return 'text/html';\n    }\n  },\n\n  nodeName: {\n    get() {\n      return '#document';\n    }\n  },\n\n  documentElement: {\n    get() {\n      // Find the first <html> element within the document\n      return this.childNodes.filter(\n        (child) => String(child.tagName).toLowerCase() === 'html'\n      );\n    }\n  },\n\n  compatMode: {\n    get() {\n      const compatMode = {\n        'no-quirks': 'CSS1Compat',\n        quirks: 'BackCompat',\n        'limited-quirks': 'CSS1Compat'\n      };\n      return compatMode[treeAdapter.getDocumentMode(this)];\n    }\n  },\n\n  body: {\n    get() {\n      return this.querySelector('body');\n    }\n  },\n\n  createElement(name) {\n    return treeAdapter.createElement(name, null, []);\n  },\n\n  createTextNode(text) {\n    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM\n    const Node = this.$$Node;\n    return new Node({\n      type: 'text',\n      data: text,\n      parent: null,\n      prev: null,\n      next: null\n    });\n  },\n\n  querySelector(sel) {\n    return select.selectOne(sel, this.documentElement);\n  },\n\n  querySelectorAll(sel) {\n    if (sel === ':root') {\n      return this;\n    }\n    return select(sel, this.documentElement);\n  }\n};\n\n/**\n * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.\n * @private\n */\nfunction defineProperties(obj, properties) {\n  for (const i in properties) {\n    const value = properties[i];\n    Object.defineProperty(\n      obj,\n      i,\n      typeof value === 'function' ? { value } : value\n    );\n  }\n}\n\n/**\n * Create a property descriptor defining a getter/setter pair alias for a named attribute.\n * @private\n */\nfunction reflectedProperty(attributeName) {\n  return {\n    get() {\n      return this.getAttribute(attributeName);\n    },\n    set(value) {\n      this.setAttribute(attributeName, value);\n    }\n  };\n}\n\n/**\n * Helper to get the text content of a node\n * https://github.com/fb55/domutils/blob/master/src/stringify.ts#L21\n * @private\n */\nfunction getText(node) {\n  if (Array.isArray(node)) return node.map(getText).join('');\n  if (treeAdapter.isElementNode(node))\n    return node.name === 'br' ? '\\n' : getText(node.children);\n  if (treeAdapter.isTextNode(node)) return node.data;\n  return '';\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport css from 'css';\n\n/**\n * Parse a textual CSS Stylesheet into a Stylesheet instance.\n * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.\n * @see https://github.com/reworkcss/css\n * @private\n * @param {String} stylesheet\n * @returns {css.Stylesheet} ast\n */\nexport function parseStylesheet (stylesheet) {\n  return css.parse(stylesheet);\n}\n\n/**\n * Serialize a ReworkCSS Stylesheet to a String of CSS.\n * @private\n * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`\n * @param {Object} options              Options to pass to `css.stringify()`\n * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)\n */\nexport function serializeStylesheet (ast, options) {\n  return css.stringify(ast, options);\n}\n\n/**\n * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.\n * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).\n * @private\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n * @returns {(rule) => void} nonDestructiveIterator\n */\nexport function markOnly (predicate) {\n  return rule => {\n    const sel = rule.selectors;\n    if (predicate(rule) === false) {\n      rule.$$remove = true;\n    }\n    rule.$$markedSelectors = rule.selectors;\n    if (rule._other) {\n      rule._other.$$markedSelectors = rule._other.selectors;\n    }\n    rule.selectors = sel;\n  };\n}\n\n/**\n * Apply filtered selectors to a rule from a previous markOnly run.\n * @private\n * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).\n*/\nexport function applyMarkedSelectors (rule) {\n  if (rule.$$markedSelectors) {\n    rule.selectors = rule.$$markedSelectors;\n  }\n  if (rule._other) {\n    applyMarkedSelectors(rule._other);\n  }\n}\n\n/**\n * Recursively walk all rules in a stylesheet.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.\n */\nexport function walkStyleRules (node, iterator) {\n  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);\n\n  node.rules = node.rules.filter(rule => {\n    if (rule.rules) {\n      walkStyleRules(rule, iterator);\n    }\n    rule._other = undefined;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n/**\n * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.\n * @private\n * @param {css.Rule} node       A Stylesheet or Rule to descend into.\n * @param {css.Rule} node2      A second tree identical to `node`\n * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.\n */\nexport function walkStyleRulesWithReverseMirror (node, node2, iterator) {\n  if (node2 === null) return walkStyleRules(node, iterator);\n\n  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);\n\n  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {\n    const rule2 = rules2[index];\n    if (rule.rules) {\n      walkStyleRulesWithReverseMirror(rule, rule2, iterator);\n    }\n    rule._other = rule2;\n    rule.filterSelectors = filterSelectors;\n    return iterator(rule) !== false;\n  });\n}\n\n// Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.\n// This is just a quicker version of generating the compliment of the set returned from a filter operation.\nfunction splitFilter (a, b, predicate) {\n  const aOut = [];\n  const bOut = [];\n  for (let index = 0; index < a.length; index++) {\n    if (predicate(a[index], index, a, b)) {\n      aOut.push(a[index]);\n    } else {\n      bOut.push(a[index]);\n    }\n  }\n  return [aOut, bOut];\n}\n\n// can be invoked on a style rule to subset its selectors (with reverse mirroring)\nfunction filterSelectors (predicate) {\n  if (this._other) {\n    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);\n    this.selectors = a;\n    this._other.selectors = b;\n  } else {\n    this.selectors = this.selectors.filter(predicate);\n  }\n}\n","import chalk from 'chalk';\n\nconst LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'silent'];\n\nexport const defaultLogger = {\n  trace(msg) {\n    console.trace(msg);\n  },\n\n  debug(msg) {\n    console.debug(msg);\n  },\n\n  warn(msg) {\n    console.warn(chalk.yellow(msg));\n  },\n\n  error(msg) {\n    console.error(chalk.bold.red(msg));\n  },\n\n  info(msg) {\n    console.info(chalk.bold.blue(msg));\n  },\n\n  silent() {}\n};\n\nexport function createLogger(logLevel) {\n  const logLevelIdx = LOG_LEVELS.indexOf(logLevel);\n\n  return LOG_LEVELS.reduce((logger, type, index) => {\n    if (index >= logLevelIdx) {\n      logger[type] = defaultLogger[type];\n    } else {\n      logger[type] = defaultLogger.silent;\n    }\n    return logger;\n  }, {});\n}\n","/**\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { createDocument, serializeDocument } from './dom';\nimport {\n  parseStylesheet,\n  serializeStylesheet,\n  walkStyleRules,\n  walkStyleRulesWithReverseMirror,\n  markOnly,\n  applyMarkedSelectors\n} from './css';\nimport { createLogger } from './util';\n\n/**\n * The mechanism to use for lazy-loading stylesheets.\n * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).\n *\n * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.\n * - **\"body\":** Move all external stylesheet links to the end of the document.\n * - **\"media\":** Load stylesheets asynchronously by adding `media=\"not x\"` and removing once loaded. <kbd>JS</kbd>\n * - **\"swap\":** Convert stylesheet links to preloads that swap to `rel=\"stylesheet\"` once loaded ([details](https://www.filamentgroup.com/lab/load-css-simpler/#the-code)). <kbd>JS</kbd>\n * - **\"swap-high\":** Use `<link rel=\"alternate stylesheet preload\">` and swap to `rel=\"stylesheet\"` once loaded ([details](http://filamentgroup.github.io/loadCSS/test/new-high.html)). <kbd>JS</kbd>\n * - **\"js\":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. <kbd>JS</kbd>\n * - **\"js-lazy\":** Like `\"js\"`, but the stylesheet is disabled until fully loaded.\n * @typedef {(default|'body'|'media'|'swap'|'swap-high'|'js'|'js-lazy')} PreloadStrategy\n * @public\n */\n\n/**\n * Controls which keyframes rules are inlined.\n *\n * - **\"critical\":** _(default)_ inline keyframes rules that are used by the critical CSS.\n * - **\"all\":** Inline all keyframes rules.\n * - **\"none\":** Remove all keyframes rules.\n * @typedef {('critical'|'all'|'none')} KeyframeStrategy\n * @private\n * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_\n */\n\n/**\n * Controls log level of the plugin. Specifies the level the logger should use. A logger will\n * not produce output for any log level beneath the specified level. Available levels and order\n * are:\n *\n * - **\"info\"** _(default)_\n * - **\"warn\"**\n * - **\"error\"**\n * - **\"trace\"**\n * - **\"debug\"**\n * - **\"silent\"**\n * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel\n * @public\n */\n\n/**\n * Custom logger interface:\n * @typedef {object} Logger\n * @public\n * @property {function(String)} trace - Prints a trace message\n * @property {function(String)} debug - Prints a debug message\n * @property {function(String)} info - Prints an information message\n * @property {function(String)} warn - Prints a warning message\n * @property {function(String)} error - Prints an error message\n */\n\n/**\n * All optional. Pass them to `new Critters({ ... })`.\n * @public\n * @typedef Options\n * @property {String} path     Base path location of the CSS files _(default: `''`)_\n * @property {String} publicPath     Public path of the CSS resources. This prefix is removed from the href _(default: `''`)_\n * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_\n * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_\n * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_\n * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_\n * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_\n * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.\n * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use\n * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies\n * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_\n * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_\n * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`\n *  - Values:\n *  - `true` to inline critical font-face rules and preload the fonts\n *  - `false` to don't inline any font-face rules and don't preload fonts\n * @property {String} keyframes     Controls which keyframes rules are inlined.\n *  - Values:\n *  - `\"critical\"`: _(default)_ inline keyframes rules used by the critical CSS\n *  - `\"all\"` inline all keyframes rules\n *  - `\"none\"` remove all keyframes rules\n * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_\n * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `\"info\"`)_\n * @property {object} logger        Provide a custom logger interface {@link Logger logger}\n */\n\nexport default class Critters {\n  /** @private */\n  constructor(options) {\n    this.options = Object.assign(\n      {\n        logLevel: 'info',\n        path: '',\n        publicPath: '',\n        reduceInlineStyles: true,\n        pruneSource: false,\n        additionalStylesheets: []\n      },\n      options || {}\n    );\n\n    this.urlFilter = this.options.filter;\n    if (this.urlFilter instanceof RegExp) {\n      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);\n    }\n\n    this.logger = this.options.logger || createLogger(this.options.logLevel);\n  }\n\n  /**\n   * Read the contents of a file from the specified filesystem or disk\n   */\n  readFile(filename) {\n    const fs = this.fs;\n    return new Promise((resolve, reject) => {\n      const callback = (err, data) => {\n        if (err) reject(err);\n        else resolve(data);\n      };\n      if (fs && fs.readFile) {\n        fs.readFile(filename, callback);\n      } else {\n        require('fs').readFile(filename, 'utf8', callback);\n      }\n    });\n  }\n\n  /**\n   * Apply critical CSS processing to the html\n   */\n  async process(html) {\n    const start = process.hrtime.bigint();\n\n    // Parse the generated HTML in a DOM we can mutate\n    const document = createDocument(html);\n\n    if (this.options.additionalStylesheets.length > 0) {\n      this.embedAdditionalStylesheet(document);\n    }\n\n    // `external:false` skips processing of external sheets\n    if (this.options.external !== false) {\n      const externalSheets = [].slice.call(\n        document.querySelectorAll('link[rel=\"stylesheet\"]')\n      );\n\n      await Promise.all(\n        externalSheets.map((link) => this.embedLinkedStylesheet(link, document))\n      );\n    }\n\n    // go through all the style tags in the document and reduce them to only critical CSS\n    const styles = this.getAffectedStyleTags(document);\n\n    await Promise.all(\n      styles.map((style) => this.processStyle(style, document))\n    );\n\n    if (this.options.mergeStylesheets !== false && styles.length !== 0) {\n      await this.mergeStylesheets(document);\n    }\n\n    // serialize the document back to HTML and we're done\n    const output = serializeDocument(document);\n    const end = process.hrtime.bigint();\n    this.logger.info('Time ' + parseFloat(end - start) / 1000000.0);\n    return output;\n  }\n\n  /**\n   * Get the style tags that need processing\n   */\n  getAffectedStyleTags(document) {\n    const styles = [].slice.call(document.querySelectorAll('style'));\n\n    // `inline:false` skips processing of inline stylesheets\n    if (this.options.reduceInlineStyles === false) {\n      return styles.filter((style) => style.$$external);\n    }\n    return styles;\n  }\n\n  async mergeStylesheets(document) {\n    const styles = this.getAffectedStyleTags(document);\n    if (styles.length === 0) {\n      this.logger.warn(\n        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'\n      );\n      return;\n    }\n    const first = styles[0];\n    let sheet = first.textContent;\n\n    for (let i = 1; i < styles.length; i++) {\n      const node = styles[i];\n      sheet += node.textContent;\n      node.remove();\n    }\n\n    first.textContent = sheet;\n  }\n\n  /**\n   * Given href, find the corresponding CSS asset\n   */\n  async getCssAsset(href) {\n    const outputPath = this.options.path;\n    const publicPath = this.options.publicPath;\n\n    // CHECK - the output path\n    // path on disk (with output.publicPath removed)\n    let normalizedPath = href.replace(/^\\//, '');\n    const pathPrefix = (publicPath || '').replace(/(^\\/|\\/$)/g, '') + '/';\n    if (normalizedPath.indexOf(pathPrefix) === 0) {\n      normalizedPath = normalizedPath\n        .substring(pathPrefix.length)\n        .replace(/^\\//, '');\n    }\n    const filename = path.resolve(outputPath, normalizedPath);\n\n    let sheet;\n\n    try {\n      sheet = await this.readFile(filename);\n    } catch (e) {\n      this.logger.warn(`Unable to locate stylesheet: ${filename}`);\n    }\n\n    return sheet;\n  }\n\n  checkInlineThreshold(link, style, sheet) {\n    if (\n      this.options.inlineThreshold &&\n      sheet.length < this.options.inlineThreshold\n    ) {\n      const href = style.$$name;\n      style.$$reduce = false;\n      this.logger.info(\n        `\\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\\u001b[39m`\n      );\n      link.remove();\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)\n   */\n  async embedAdditionalStylesheet(document) {\n    const styleSheetsIncluded = [];\n\n    const sources = await Promise.all(\n      this.options.additionalStylesheets.map((cssFile) => {\n        if (styleSheetsIncluded.includes(cssFile)) {\n          return;\n        }\n        styleSheetsIncluded.push(cssFile);\n        const style = document.createElement('style');\n        style.$$external = true;\n        return this.getCssAsset(cssFile, style).then((sheet) => [sheet, style]);\n      })\n    );\n\n    sources.forEach(([sheet, style]) => {\n      if (!sheet) return;\n      style.textContent = sheet;\n      document.head.appendChild(style);\n    });\n  }\n\n  /**\n   * Inline the target stylesheet referred to by a <link rel=\"stylesheet\"> (assuming it passes `options.filter`)\n   */\n  async embedLinkedStylesheet(link, document) {\n    const href = link.getAttribute('href');\n    const media = link.getAttribute('media');\n\n    const preloadMode = this.options.preload;\n\n    // skip filtered resources, or network resources if no filter is provided\n    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\\.css$/)) {\n      return Promise.resolve();\n    }\n\n    // the reduced critical CSS gets injected into a new <style> tag\n    const style = document.createElement('style');\n    style.$$external = true;\n    const sheet = await this.getCssAsset(href, style);\n\n    if (!sheet) {\n      return;\n    }\n\n    style.textContent = sheet;\n    style.$$name = href;\n    style.$$links = [link];\n    link.parentNode.insertBefore(style, link);\n\n    if (this.checkInlineThreshold(link, style, sheet)) {\n      return;\n    }\n\n    // CSS loader is only injected for the first sheet, then this becomes an empty string\n    let cssLoaderPreamble =\n      \"function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}\";\n    const lazy = preloadMode === 'js-lazy';\n    if (lazy) {\n      cssLoaderPreamble = cssLoaderPreamble.replace(\n        'l.href',\n        \"l.media='print';l.onload=function(){l.media=m};l.href\"\n      );\n    }\n\n    // Allow disabling any mutation of the stylesheet link:\n    if (preloadMode === false) return;\n\n    let noscriptFallback = false;\n\n    if (preloadMode === 'body') {\n      document.body.appendChild(link);\n    } else {\n      link.setAttribute('rel', 'preload');\n      link.setAttribute('as', 'style');\n      if (preloadMode === 'js' || preloadMode === 'js-lazy') {\n        const script = document.createElement('script');\n        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${\n          lazy ? ',' + JSON.stringify(media || 'all') : ''\n        })`;\n        // script.appendChild(document.createTextNode(js));\n        script.textContent = js;\n        link.parentNode.insertBefore(script, link.nextSibling);\n        style.$$links.push(script);\n        cssLoaderPreamble = '';\n        noscriptFallback = true;\n      } else if (preloadMode === 'media') {\n        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26\n        link.setAttribute('rel', 'stylesheet');\n        link.removeAttribute('as');\n        link.setAttribute('media', 'print');\n        link.setAttribute('onload', `this.media='${media || 'all'}'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap-high') {\n        // @see http://filamentgroup.github.io/loadCSS/test/new-high.html\n        link.setAttribute('rel', 'alternate stylesheet preload');\n        link.setAttribute('title', 'styles');\n        link.setAttribute('onload', `this.title='';this.rel='stylesheet'`);\n        noscriptFallback = true;\n      } else if (preloadMode === 'swap') {\n        link.setAttribute('onload', \"this.rel='stylesheet'\");\n        noscriptFallback = true;\n      } else {\n        const bodyLink = document.createElement('link');\n        bodyLink.setAttribute('rel', 'stylesheet');\n        if (media) bodyLink.setAttribute('media', media);\n        bodyLink.setAttribute('href', href);\n        document.body.appendChild(bodyLink);\n        style.$$links.push(bodyLink);\n      }\n    }\n\n    if (this.options.noscriptFallback !== false && noscriptFallback) {\n      const noscript = document.createElement('noscript');\n      const noscriptLink = document.createElement('link');\n      noscriptLink.setAttribute('rel', 'stylesheet');\n      noscriptLink.setAttribute('href', href);\n      if (media) noscriptLink.setAttribute('media', media);\n      noscript.appendChild(noscriptLink);\n      link.parentNode.insertBefore(noscript, link.nextSibling);\n      style.$$links.push(noscript);\n    }\n  }\n\n  /**\n   * Prune the source CSS files\n   */\n  pruneSource(style, before, sheetInverse) {\n    // if external stylesheet would be below minimum size, just inline everything\n    const minSize = this.options.minimumExternalSize;\n    const name = style.$$name;\n    if (minSize && sheetInverse.length < minSize) {\n      this.logger.info(\n        `\\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\\u001b[39m`\n      );\n      style.textContent = before;\n      // remove any associated external resources/loaders:\n      if (style.$$links) {\n        for (const link of style.$$links) {\n          const parent = link.parentNode;\n          if (parent) parent.removeChild(link);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.\n   */\n  async processStyle(style, document) {\n    if (style.$$reduce === false) return;\n\n    const name = style.$$name ? style.$$name.replace(/^\\//, '') : 'inline CSS';\n    const options = this.options;\n    // const document = style.ownerDocument;\n    const head = document.querySelector('head');\n    let keyframesMode = options.keyframes || 'critical';\n    // we also accept a boolean value for options.keyframes\n    if (keyframesMode === true) keyframesMode = 'all';\n    if (keyframesMode === false) keyframesMode = 'none';\n\n    let sheet = style.textContent;\n\n    // store a reference to the previous serialized stylesheet for reporting stats\n    const before = sheet;\n\n    // Skip empty stylesheets\n    if (!sheet) return;\n\n    const ast = parseStylesheet(sheet);\n    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;\n\n    // a string to search for font names (very loose)\n    let criticalFonts = '';\n\n    const failedSelectors = [];\n\n    const criticalKeyframeNames = [];\n\n    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.\n    // This first pass is also used to collect font and keyframe usage used in the second pass.\n    walkStyleRules(\n      ast,\n      markOnly((rule) => {\n        if (rule.type === 'rule') {\n          // Filter the selector list down to only those match\n          rule.filterSelectors((sel) => {\n            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.\n            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.\n            if (sel === ':root' || sel.match(/^::?(before|after)$/)) {\n              return true;\n            }\n            sel = sel\n              .replace(/(?<!\\\\)::?[a-z-]+(?![a-z-(])/gi, '')\n              .replace(/::?not\\(\\s*\\)/g, '')\n              .trim();\n            if (!sel) return false;\n\n            try {\n              return document.querySelector(sel) != null;\n            } catch (e) {\n              failedSelectors.push(sel + ' -> ' + e.message);\n              return false;\n            }\n          });\n          // If there are no matched selectors, remove the rule:\n          if (rule.selectors.length === 0) {\n            return false;\n          }\n\n          if (rule.declarations) {\n            for (let i = 0; i < rule.declarations.length; i++) {\n              const decl = rule.declarations[i];\n\n              // detect used fonts\n              if (decl.property && decl.property.match(/\\bfont(-family)?\\b/i)) {\n                criticalFonts += ' ' + decl.value;\n              }\n\n              // detect used keyframes\n              if (\n                decl.property === 'animation' ||\n                decl.property === 'animation-name'\n              ) {\n                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.\n                const names = decl.value.split(/\\s+/);\n                for (let j = 0; j < names.length; j++) {\n                  const name = names[j].trim();\n                  if (name) criticalKeyframeNames.push(name);\n                }\n              }\n            }\n          }\n        }\n\n        // keep font rules, they're handled in the second pass:\n        if (rule.type === 'font-face') return;\n\n        // If there are no remaining rules, remove the whole rule:\n        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);\n        return !rules || rules.length !== 0;\n      })\n    );\n\n    if (failedSelectors.length !== 0) {\n      this.logger.warn(\n        `${\n          failedSelectors.length\n        } rules skipped due to selector errors:\\n  ${failedSelectors.join(\n          '\\n  '\n        )}`\n      );\n    }\n\n    const shouldPreloadFonts =\n      options.fonts === true || options.preloadFonts === true;\n    const shouldInlineFonts =\n      options.fonts !== false && options.inlineFonts === true;\n\n    const preloadedFonts = [];\n    // Second pass, using data picked up from the first\n    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {\n      // remove any rules marked in the first pass\n      if (rule.$$remove === true) return false;\n\n      applyMarkedSelectors(rule);\n\n      // prune @keyframes rules\n      if (rule.type === 'keyframes') {\n        if (keyframesMode === 'none') return false;\n        if (keyframesMode === 'all') return true;\n        return criticalKeyframeNames.indexOf(rule.name) !== -1;\n      }\n\n      // prune @font-face rules\n      if (rule.type === 'font-face') {\n        let family, src;\n        for (let i = 0; i < rule.declarations.length; i++) {\n          const decl = rule.declarations[i];\n          if (decl.property === 'src') {\n            // @todo parse this properly and generate multiple preloads with type=\"font/woff2\" etc\n            src = (decl.value.match(/url\\s*\\(\\s*(['\"]?)(.+?)\\1\\s*\\)/) || [])[2];\n          } else if (decl.property === 'font-family') {\n            family = decl.value;\n          }\n        }\n\n        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {\n          preloadedFonts.push(src);\n          const preload = document.createElement('link');\n          preload.setAttribute('rel', 'preload');\n          preload.setAttribute('as', 'font');\n          preload.setAttribute('crossorigin', 'anonymous');\n          preload.setAttribute('href', src.trim());\n          head.appendChild(preload);\n        }\n\n        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:\n        if (\n          !family ||\n          !src ||\n          criticalFonts.indexOf(family) === -1 ||\n          !shouldInlineFonts\n        ) {\n          return false;\n        }\n      }\n    });\n\n    sheet = serializeStylesheet(ast, {\n      compress: this.options.compress !== false\n    }).trim();\n\n    // If all rules were removed, get rid of the style element entirely\n    if (sheet.trim().length === 0) {\n      if (style.parentNode) {\n        style.remove();\n      }\n      return;\n    }\n\n    let afterText = '';\n    let styleInlinedCompletely = false;\n    if (options.pruneSource) {\n      const sheetInverse = serializeStylesheet(astInverse, {\n        compress: this.options.compress !== false\n      });\n\n      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);\n\n      if (styleInlinedCompletely) {\n        const percent = (sheetInverse.length / before.length) * 100;\n        afterText = `, reducing non-inlined size ${\n          percent | 0\n        }% to ${prettyBytes(sheetInverse.length)}`;\n      }\n    }\n\n    // replace the inline stylesheet with its critical'd counterpart\n    if (!styleInlinedCompletely) {\n      style.textContent = sheet;\n    }\n\n    // output stats\n    const percent = ((sheet.length / before.length) * 100) | 0;\n    this.logger.info(\n      '\\u001b[32mInlined ' +\n        prettyBytes(sheet.length) +\n        ' (' +\n        percent +\n        '% of original ' +\n        prettyBytes(before.length) +\n        ') of ' +\n        name +\n        afterText +\n        '.\\u001b[39m'\n    );\n  }\n}\n"],"names":["this","require$$0","require$$1","require$$2","require$$3","decode_1","encode","encode_1","foreignNames","entities","ElementType","getOuterHTML","isTag","require$$4","require$$5","BaseFuncs","compile","parse","DomUtils","falseFunc","getText","hasAttrib","trueFunc","getNCheck","getParent","getChildren","getSiblings","getName","attributes","procedure","sortRules","Rules","filters","Pseudos","existsOne","findOne","findAll","compileUnsafe","compileToken","treeAdapter","require","PARSE5_OPTS","createDocument","html","document","parse5","defineProperties","DocumentExtensions","scratch","createElement","$$Node","constructor","elementProto","Object","getPrototypeOf","ElementExtensions","ownerDocument","serializeDocument","serialize","nodeName","get","tagName","toUpperCase","id","reflectedProperty","className","insertBefore","child","referenceNode","appendChild","removeChild","detachNode","remove","textContent","set","text","children","insertText","setAttribute","name","value","attribs","removeAttribute","getAttribute","hasAttribute","getAttributeNode","specified","nodeType","contentType","documentElement","childNodes","filter","String","toLowerCase","compatMode","quirks","getDocumentMode","body","querySelector","createTextNode","Node","type","data","parent","prev","next","sel","select","selectOne","querySelectorAll","obj","properties","i","defineProperty","attributeName","node","Array","isArray","map","join","isElementNode","isTextNode","parseStylesheet","stylesheet","css","serializeStylesheet","ast","options","stringify","markOnly","predicate","rule","selectors","$$remove","$$markedSelectors","_other","applyMarkedSelectors","walkStyleRules","iterator","rules","undefined","filterSelectors","walkStyleRulesWithReverseMirror","node2","splitFilter","index","rules2","rule2","a","b","aOut","bOut","length","push","LOG_LEVELS","defaultLogger","trace","msg","console","debug","warn","chalk","yellow","error","bold","red","info","blue","silent","createLogger","logLevel","logLevelIdx","indexOf","reduce","logger","recover","result","e","then","Critters","assign","path","publicPath","reduceInlineStyles","pruneSource","additionalStylesheets","urlFilter","RegExp","test","bind","readFile","filename","fs","Promise","resolve","reject","callback","err","process","styles","getAffectedStyleTags","all","style","processStyle","output","end","hrtime","bigint","parseFloat","start","mergeStylesheets","embedAdditionalStylesheet","external","externalSheets","slice","call","link","embedLinkedStylesheet","$$external","first","sheet","getCssAsset","href","outputPath","normalizedPath","replace","pathPrefix","substring","checkInlineThreshold","inlineThreshold","$$name","$$reduce","styleSheetsIncluded","cssFile","includes","sources","forEach","head","media","preloadMode","preload","match","$$links","parentNode","cssLoaderPreamble","lazy","noscriptFallback","script","js","JSON","nextSibling","bodyLink","noscript","noscriptLink","before","sheetInverse","minSize","minimumExternalSize","keyframesMode","keyframes","astInverse","criticalFonts","failedSelectors","criticalKeyframeNames","trim","message","declarations","decl","property","names","split","j","shouldPreloadFonts","fonts","preloadFonts","shouldInlineFonts","inlineFonts","preloadedFonts","family","src","compress","afterText","styleInlinedCompletely","percent","prettyBytes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CACA,kBAAc,GAAG;CACjB,CAAC,IAAI,EAAE,MAAM;CACb,CAAC,SAAS,EAAE,WAAW;CACvB,CAAC,OAAO,EAAE,SAAS;CACnB,CAAC,MAAM,EAAE,QAAQ;CACjB,CAAC,KAAK,EAAE,OAAO;CACf,CAAC,GAAG,EAAE,KAAK;CACX,CAAC,KAAK,EAAE,OAAO;CACf,CAAC,OAAO,EAAE,SAAS;AACnB;CACA,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;CACtB,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;CAChF,EAAE;CACF,CAAC;;;ACdD,CACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;CAC9D;CACA;CACA;CACA;CACA;CACA,SAAS,KAAK,CAAC,IAAI,EAAE;CACrB,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,KAAK;CAC/B,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ;CAC9B,QAAQ,IAAI,CAAC,IAAI,KAAK,OAAO,cAAc;CAC3C,CAAC;CACD,aAAa,GAAG,KAAK,CAAC;CACtB;CACA,YAAY,GAAG,MAAM,YAAY;CACjC,iBAAiB,GAAG,WAAW,iBAAiB;CAChD,eAAe,GAAG,SAAS,eAAe;CAC1C,cAAc,GAAG,QAAQ,cAAc;CACvC,aAAa,GAAG,OAAO,aAAa;CACpC,WAAW,GAAG,KAAK,WAAW;CAC9B,aAAa,GAAG,OAAO,aAAa;CACpC,eAAe,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
Index: trip-planner-front/node_modules/critters/dist/critters_original.js
===================================================================
--- trip-planner-front/node_modules/critters/dist/critters_original.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,1786 +1,0 @@
-function _interopDefault(ex) {
-  return ex && typeof ex === 'object' && 'default' in ex ? ex.default : ex;
-}
-
-var path = _interopDefault(require('path'));
-var prettyBytes = _interopDefault(require('pretty-bytes'));
-var sources = _interopDefault(require('webpack-sources'));
-var postcss = _interopDefault(require('postcss'));
-var cssnano = _interopDefault(require('cssnano'));
-var log = _interopDefault(require('webpack-log'));
-var minimatch = _interopDefault(require('minimatch'));
-var jsdom = require('jsdom');
-var css = _interopDefault(require('css'));
-
-function _unsupportedIterableToArray(o, minLen) {
-  if (!o) return;
-  if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
-  var n = Object.prototype.toString.call(o).slice(8, -1);
-  if (n === 'Object' && o.constructor) n = o.constructor.name;
-  if (n === 'Map' || n === 'Set') return Array.from(o);
-  if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
-    return _arrayLikeToArray(o, minLen);
-}
-
-function _arrayLikeToArray(arr, len) {
-  if (len == null || len > arr.length) len = arr.length;
-
-  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
-
-  return arr2;
-}
-
-function _createForOfIteratorHelperLoose(o, allowArrayLike) {
-  var it;
-
-  if (typeof Symbol === 'undefined' || o[Symbol.iterator] == null) {
-    if (
-      Array.isArray(o) ||
-      (it = _unsupportedIterableToArray(o)) ||
-      (allowArrayLike && o && typeof o.length === 'number')
-    ) {
-      if (it) o = it;
-      var i = 0;
-      return function () {
-        if (i >= o.length)
-          return {
-            done: true,
-          };
-        return {
-          done: false,
-          value: o[i++],
-        };
-      };
-    }
-
-    throw new TypeError(
-      'Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'
-    );
-  }
-
-  it = o[Symbol.iterator]();
-  return it.next.bind(it);
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * Parse HTML into a mutable, serializable DOM Document, provided by JSDOM.
- * @private
- * @param {String} html   HTML to parse into a Document instance
- */
-
-function createDocument(html) {
-  var jsdom$1 = new jsdom.JSDOM(html, {
-    contentType: 'text/html',
-  });
-  var window = jsdom$1.window;
-  var document = window.document;
-  document.$jsdom = jsdom$1;
-  return document;
-}
-/**
- * Serialize a Document to an HTML String
- * @private
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-
-function serializeDocument(document) {
-  return document.$jsdom.serialize();
-}
-/** Like node.textContent, except it works */
-
-function setNodeText(node, text) {
-  while (node.lastChild) {
-    node.removeChild(node.lastChild);
-  }
-
-  node.appendChild(node.ownerDocument.createTextNode(text));
-}
-
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/**
- * Parse a textual CSS Stylesheet into a Stylesheet instance.
- * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
- * @see https://github.com/reworkcss/css
- * @private
- * @param {String} stylesheet
- * @returns {css.Stylesheet} ast
- */
-
-function parseStylesheet(stylesheet) {
-  return css.parse(stylesheet);
-}
-/**
- * Serialize a ReworkCSS Stylesheet to a String of CSS.
- * @private
- * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
- * @param {Object} options              Options to pass to `css.stringify()`
- * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
- */
-
-function serializeStylesheet(ast, options) {
-  return css.stringify(ast, options);
-}
-/**
- * Converts a walkStyleRules() iterator to mark nodes with `.$$remove=true` instead of actually removing them.
- * This means they can be removed in a second pass, allowing the first pass to be nondestructive (eg: to preserve mirrored sheets).
- * @private
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- * @returns {(rule) => void} nonDestructiveIterator
- */
-
-function markOnly(predicate) {
-  return function (rule) {
-    var sel = rule.selectors;
-
-    if (predicate(rule) === false) {
-      rule.$$remove = true;
-    }
-
-    rule.$$markedSelectors = rule.selectors;
-
-    if (rule._other) {
-      rule._other.$$markedSelectors = rule._other.selectors;
-    }
-
-    rule.selectors = sel;
-  };
-}
-/**
- * Apply filtered selectors to a rule from a previous markOnly run.
- * @private
- * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
- */
-
-function applyMarkedSelectors(rule) {
-  if (rule.$$markedSelectors) {
-    rule.selectors = rule.$$markedSelectors;
-  }
-
-  if (rule._other) {
-    applyMarkedSelectors(rule._other);
-  }
-}
-/**
- * Recursively walk all rules in a stylesheet.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
- */
-
-function walkStyleRules(node, iterator) {
-  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-  node.rules = node.rules.filter(function (rule) {
-    if (rule.rules) {
-      walkStyleRules(rule, iterator);
-    }
-
-    rule._other = undefined;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-}
-/**
- * Recursively walk all rules in two identical stylesheets, filtering nodes into one or the other based on a predicate.
- * @private
- * @param {css.Rule} node       A Stylesheet or Rule to descend into.
- * @param {css.Rule} node2      A second tree identical to `node`
- * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
- */
-
-function walkStyleRulesWithReverseMirror(node, node2, iterator) {
-  if (node2 === null) return walkStyleRules(node, iterator);
-  if (node.stylesheet)
-    return walkStyleRulesWithReverseMirror(
-      node.stylesheet,
-      node2.stylesheet,
-      iterator
-    );
-
-  var _splitFilter = splitFilter(node.rules, node2.rules, function (
-    rule,
-    index,
-    rules,
-    rules2
-  ) {
-    var rule2 = rules2[index];
-
-    if (rule.rules) {
-      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
-    }
-
-    rule._other = rule2;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
-
-  node.rules = _splitFilter[0];
-  node2.rules = _splitFilter[1];
-} // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
-// This is just a quicker version of generating the compliment of the set returned from a filter operation.
-
-function splitFilter(a, b, predicate) {
-  var aOut = [];
-  var bOut = [];
-
-  for (var index = 0; index < a.length; index++) {
-    if (predicate(a[index], index, a, b)) {
-      aOut.push(a[index]);
-    } else {
-      bOut.push(a[index]);
-    }
-  }
-
-  return [aOut, bOut];
-} // can be invoked on a style rule to subset its selectors (with reverse mirroring)
-
-function filterSelectors(predicate) {
-  if (this._other) {
-    var _splitFilter2 = splitFilter(
-      this.selectors,
-      this._other.selectors,
-      predicate
-    );
-    var a = _splitFilter2[0];
-    var b = _splitFilter2[1];
-
-    this.selectors = a;
-    this._other.selectors = b;
-  } else {
-    this.selectors = this.selectors.filter(predicate);
-  }
-}
-
-function tap(inst, hook, pluginName, async, callback) {
-  if (inst.hooks) {
-    var camel = hook.replace(/-([a-z])/g, function (s, i) {
-      return i.toUpperCase();
-    });
-    inst.hooks[camel][async ? 'tapAsync' : 'tap'](pluginName, callback);
-  } else {
-    inst.plugin(hook, callback);
-  }
-}
-
-function _catch(body, recover) {
-  try {
-    var result = body();
-  } catch (e) {
-    return recover(e);
-  }
-
-  if (result && result.then) {
-    return result.then(void 0, recover);
-  }
-
-  return result;
-}
-
-var Critters = /* #__PURE__ */ (function () {
-  function Critters(options) {
-    this.options = Object.assign(
-      {
-        logLevel: 'info',
-        externalStylesheets: [],
-        path: '',
-        publicPath: '',
-        preload: 'media',
-        reduceInlineStyles: false, // compress: false,
-      },
-      options || {}
-    );
-    this.options.pruneSource = this.options.pruneSource !== false;
-    this.urlFilter = this.options.filter;
-
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-
-    this.logger = {
-      warn: console.log,
-      info: console.log,
-    };
-  }
-  /**
-   * Read the contents of a file from Webpack's input filesystem
-   */
-
-  var _proto = Critters.prototype;
-
-  _proto.readFile = function readFile(filename) {
-    var fs = this.fs; // || compilation.outputFileSystem;
-
-    return new Promise(function (resolve, reject) {
-      var callback = function callback(err, data) {
-        if (err) reject(err);
-        else resolve(data);
-      };
-
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  };
-
-  _proto.process = (function (_process) {
-    function process(_x) {
-      return _process.apply(this, arguments);
-    }
-
-    process.toString = function () {
-      return _process.toString();
-    };
-
-    return process;
-  })(function (html) {
-    try {
-      var _temp5 = function _temp5() {
-        // console.log('2 ', serializeDocument(document));
-        // go through all the style tags in the document and reduce them to only critical CSS
-        var styles = _this2.getAffectedStyleTags(document);
-
-        return Promise.resolve(
-          Promise.all(
-            styles.map(function (style) {
-              return _this2.processStyle(style, document);
-            })
-          )
-        ).then(function () {
-          function _temp2() {
-            // serialize the document back to HTML and we're done
-            var output = serializeDocument(document);
-            // var end = process.hrtime.bigint();
-            // console.log('Time ' + parseFloat(end - start) / 1000000.0);
-            console.timeEnd('critters');
-
-            return output;
-          }
-
-          var _temp = (function () {
-            if (
-              _this2.options.mergeStylesheets !== false &&
-              styles.length !== 0
-            ) {
-              return Promise.resolve(
-                _this2.mergeStylesheets(document)
-              ).then(function () {});
-            }
-          })();
-
-          return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
-        });
-      };
-
-      var _this2 = this;
-
-      var outputPath = _this2.options.path;
-      var publicPath = _this2.options.publicPath;
-      // var start = process.hrtime.bigint();
-      console.time('critters');
-      // Parse the generated HTML in a DOM we can mutate
-
-      var document = createDocument(html); // if (this.options.additionalStylesheets) {
-      //   const styleSheetsIncluded = [];
-      //   (this.options.additionalStylesheets || []).forEach((cssFile) => {
-      //     if (styleSheetsIncluded.includes(cssFile)) {
-      //       return;
-      //     }
-      //     styleSheetsIncluded.push(cssFile);
-      //     const webpackCssAssets = Object.keys(
-      //       compilation.assets
-      //     ).filter((file) => minimatch(file, cssFile));
-      //     webpackCssAssets.map((asset) => {
-      //       const tag = document.createElement('style');
-      //       tag.innerHTML = compilation.assets[asset].source();
-      //       document.head.appendChild(tag);
-      //     });
-      //   });
-      // }
-      // `external:false` skips processing of external sheets
-      // console.log('1 ', serializeDocument(document));
-
-      var _temp6 = (function () {
-        if (_this2.options.external !== false) {
-          var externalSheets = [].slice.call(
-            document.querySelectorAll('link[rel="stylesheet"]')
-          );
-          return Promise.resolve(
-            Promise.all(
-              externalSheets.map(function (link) {
-                return _this2.embedLinkedStylesheet(
-                  link,
-                  outputPath,
-                  publicPath
-                );
-              })
-            )
-          ).then(function () {});
-        }
-      })();
-
-      return Promise.resolve(
-        _temp6 && _temp6.then ? _temp6.then(_temp5) : _temp5(_temp6)
-      );
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  });
-
-  _proto.getAffectedStyleTags = function getAffectedStyleTags(document) {
-    var styles = [].slice.call(document.querySelectorAll('style')); // `inline:false` skips processing of inline stylesheets
-
-    if (this.options.reduceInlineStyles === false) {
-      return styles.filter(function (style) {
-        return style.$$external;
-      });
-    }
-
-    return styles;
-  };
-
-  _proto.mergeStylesheets = function mergeStylesheets(document) {
-    try {
-      var _temp9 = function _temp9() {
-        setNodeText(first, sheet);
-      };
-
-      var _this4 = this;
-
-      var styles = _this4.getAffectedStyleTags(document);
-
-      if (styles.length === 0) {
-        // this.logger.warn('Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge');
-        return Promise.resolve();
-      }
-
-      var first = styles[0];
-      var sheet = first.textContent;
-
-      for (var i = 1; i < styles.length; i++) {
-        var node = styles[i];
-        sheet += node.textContent;
-        node.remove();
-      }
-
-      var _temp10 = (function () {
-        if (_this4.options.compress !== false) {
-          var before = sheet;
-          // var processor = postcss([cssnano()]);
-          return Promise.resolve(
-            // processor.process(before, {
-            //   from: undefined,
-            // })
-            before
-          ).then(function (result) {
-            // @todo sourcemap support (elsewhere first)
-            sheet = result.css;
-          });
-        }
-      })();
-
-      return Promise.resolve(_temp9(_temp10));
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-
-  _proto.embedLinkedStylesheet = function embedLinkedStylesheet(
-    link,
-    outputPath,
-    publicPath
-  ) {
-    try {
-      var _temp14 = function _temp14(_result2) {
-        if (_exit2) return _result2;
-        // CSS loader is only injected for the first sheet, then this becomes an empty string
-        var cssLoaderPreamble =
-          "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-        var lazy = preloadMode === 'js-lazy';
-
-        if (lazy) {
-          cssLoaderPreamble = cssLoaderPreamble.replace(
-            'l.href',
-            "l.media='print';l.onload=function(){l.media=m};l.href"
-          );
-        } // console.log('sheet ', sheet);
-        // the reduced critical CSS gets injected into a new <style> tag
-
-        console.log('here1');
-        var style = document.createElement('style');
-        style.$$external = true;
-        style.appendChild(document.createTextNode(sheet)); // style.innerHTML = sheet;
-
-        link.parentNode.insertBefore(style, link);
-        console.log('here2');
-
-        if (
-          _this6.options.inlineThreshold &&
-          sheet.length < _this6.options.inlineThreshold
-        ) {
-          style.$$reduce = false;
-
-          _this6.logger.info(
-            '\x1B[32mInlined all of ' +
-              href +
-              ' (' +
-              sheet.length +
-              ' was below the threshold of ' +
-              _this6.options.inlineThreshold +
-              ')\x1B[39m'
-          ); // if (asset) {
-          //   delete compilation.assets[relativePath];
-          // } else {
-          //   this.logger.warn(
-          //     `  > ${href} was not found in assets. the resource may still be emitted but will be unreferenced.`
-          //   );
-          // }
-
-          link.parentNode.removeChild(link);
-          return;
-        } // drop references to webpack asset locations onto the tag, used for later reporting and in-place asset updates
-
-        style.$$name = href;
-        style.$$asset = asset;
-        style.$$assetName = relativePath; // style.$$assets = compilation.assets;
-
-        style.$$links = [link]; // Allow disabling any mutation of the stylesheet link:
-
-        if (preloadMode === false) return;
-        var noscriptFallback = false;
-
-        if (preloadMode === 'body') {
-          document.body.appendChild(link);
-        } else {
-          link.setAttribute('rel', 'preload');
-          link.setAttribute('as', 'style');
-
-          if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-            var script = document.createElement('script');
-            var js =
-              cssLoaderPreamble +
-              '$loadcss(' +
-              JSON.stringify(href) +
-              (lazy ? ',' + JSON.stringify(media || 'all') : '') +
-              ')';
-            script.appendChild(document.createTextNode(js));
-            link.parentNode.insertBefore(script, link.nextSibling);
-            style.$$links.push(script);
-            cssLoaderPreamble = '';
-            noscriptFallback = true;
-          } else if (preloadMode === 'media') {
-            // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-            link.setAttribute('rel', 'stylesheet');
-            link.removeAttribute('as');
-            link.setAttribute('media', 'print');
-            link.setAttribute(
-              'onload',
-              "this.media='" + (media || 'all') + "'"
-            );
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap') {
-            link.setAttribute('onload', "this.rel='stylesheet'");
-            noscriptFallback = true;
-          } else {
-            var bodyLink = document.createElement('link');
-            bodyLink.setAttribute('rel', 'stylesheet');
-            if (media) bodyLink.setAttribute('media', media);
-            bodyLink.setAttribute('href', href);
-            document.body.appendChild(bodyLink);
-            style.$$links.push(bodyLink);
-          }
-        }
-
-        if (_this6.options.noscriptFallback !== false && noscriptFallback) {
-          var noscript = document.createElement('noscript');
-          var noscriptLink = document.createElement('link');
-          noscriptLink.setAttribute('rel', 'stylesheet');
-          noscriptLink.setAttribute('href', href);
-          if (media) noscriptLink.setAttribute('media', media);
-          noscript.appendChild(noscriptLink);
-          link.parentNode.insertBefore(noscript, link.nextSibling);
-          style.$$links.push(noscript);
-        }
-      };
-
-      var _exit2;
-
-      var _this6 = this;
-
-      var href = link.getAttribute('href');
-      var media = link.getAttribute('media');
-      var document = link.ownerDocument;
-      var preloadMode = _this6.options.preload; // skip filtered resources, or network resources if no filter is provided
-      // if (this.urlFilter ? this.urlFilter(href) : href.match(/^(https?:)?\/\//)) {
-
-      if (
-        _this6.urlFilter
-          ? _this6.urlFilter(href)
-          : !(href || '').match(/\.css$/)
-      ) {
-        return Promise.resolve();
-      } // CHECK - the output path
-      // path on disk (with output.publicPath removed)
-
-      var normalizedPath = href.replace(/^\//, '');
-      var pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-      if (normalizedPath.indexOf(pathPrefix) === 0) {
-        normalizedPath = normalizedPath
-          .substring(pathPrefix.length)
-          .replace(/^\//, '');
-      }
-
-      var filename = path.resolve(outputPath, normalizedPath); // try to find a matching asset by filename in webpack's output (not yet written to disk)
-
-      var relativePath = path
-        .relative(outputPath, filename)
-        .replace(/^\.\//, '');
-      var asset = ''; // compilation.assets[relativePath];
-
-      console.log('filename ', filename); // Attempt to read from assets, falling back to a disk read
-
-      var sheet = asset && asset.source();
-
-      var _temp15 = (function () {
-        if (!sheet) {
-          var _temp16 = _catch(
-            function () {
-              return Promise.resolve(_this6.readFile(filename)).then(function (
-                _this5$readFile
-              ) {
-                sheet = _this5$readFile;
-              }); // this.logger.warn(
-              //   `Stylesheet "${relativePath}" not found in assets, but a file was located on disk.${
-              //     this.options.pruneSource
-              //       ? ' This means pruneSource will not be applied.'
-              //       : ''
-              //   }`
-              // );
-            },
-            function (e) {
-              console.log(e); // this.logger.warn(`Unable to locate stylesheet: ${relativePath}`);
-
-              _exit2 = 1;
-            }
-          );
-
-          if (_temp16 && _temp16.then) return _temp16.then(function () {});
-        }
-      })();
-
-      return Promise.resolve(
-        _temp15 && _temp15.then ? _temp15.then(_temp14) : _temp14(_temp15)
-      );
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-
-  _proto.processStyle = function processStyle(style, document) {
-    try {
-      var _this8 = this;
-
-      if (style.$$reduce === false) return Promise.resolve();
-      var name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-      var options = _this8.options; // const document = style.ownerDocument;
-
-      var head = document.querySelector('head');
-      var keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-      if (keyframesMode === true) keyframesMode = 'all';
-      if (keyframesMode === false) keyframesMode = 'none'; // basically `.textContent`
-
-      var sheet =
-        style.childNodes.length > 0 &&
-        [].map
-          .call(style.childNodes, function (node) {
-            return node.nodeValue;
-          })
-          .join('\n'); // store a reference to the previous serialized stylesheet for reporting stats
-
-      var before = sheet; // Skip empty stylesheets
-
-      if (!sheet) return Promise.resolve();
-      var ast = parseStylesheet(sheet);
-      var astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-      var criticalFonts = '';
-      var failedSelectors = [];
-      var criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-      // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-      walkStyleRules(
-        ast,
-        markOnly(function (rule) {
-          if (rule.type === 'rule') {
-            // Filter the selector list down to only those match
-            rule.filterSelectors(function (sel) {
-              // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-              // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-              if (sel !== ':root') {
-                sel = sel
-                  .replace(/(?:>\s*)?::?[a-z-]+\s*(\{|$)/gi, '$1')
-                  .trim();
-              }
-
-              if (!sel) return false;
-
-              try {
-                return document.querySelector(sel) != null;
-              } catch (e) {
-                failedSelectors.push(sel + ' -> ' + e.message);
-                return false;
-              }
-            }); // If there are no matched selectors, remove the rule:
-
-            if (rule.selectors.length === 0) {
-              return false;
-            }
-
-            if (rule.declarations) {
-              for (var i = 0; i < rule.declarations.length; i++) {
-                var decl = rule.declarations[i]; // detect used fonts
-
-                if (
-                  decl.property &&
-                  decl.property.match(/\bfont(-family)?\b/i)
-                ) {
-                  criticalFonts += ' ' + decl.value;
-                } // detect used keyframes
-
-                if (
-                  decl.property === 'animation' ||
-                  decl.property === 'animation-name'
-                ) {
-                  // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                  var names = decl.value.split(/\s+/);
-
-                  for (var j = 0; j < names.length; j++) {
-                    var _name = names[j].trim();
-
-                    if (_name) criticalKeyframeNames.push(_name);
-                  }
-                }
-              }
-            }
-          } // keep font rules, they're handled in the second pass:
-
-          if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-          var rules =
-            rule.rules &&
-            rule.rules.filter(function (rule) {
-              return !rule.$$remove;
-            });
-          return !rules || rules.length !== 0;
-        })
-      );
-
-      if (failedSelectors.length !== 0) {
-        _this8.logger.warn(
-          failedSelectors.length +
-            ' rules skipped due to selector errors:\n  ' +
-            failedSelectors.join('\n  ')
-        );
-      }
-
-      var shouldPreloadFonts =
-        options.fonts === true || options.preloadFonts === true;
-      var shouldInlineFonts =
-        options.fonts !== false && options.inlineFonts === true;
-      var preloadedFonts = []; // Second pass, using data picked up from the first
-
-      walkStyleRulesWithReverseMirror(ast, astInverse, function (rule) {
-        // remove any rules marked in the first pass
-        if (rule.$$remove === true) return false;
-        applyMarkedSelectors(rule); // prune @keyframes rules
-
-        if (rule.type === 'keyframes') {
-          if (keyframesMode === 'none') return false;
-          if (keyframesMode === 'all') return true;
-          return criticalKeyframeNames.indexOf(rule.name) !== -1;
-        } // prune @font-face rules
-
-        if (rule.type === 'font-face') {
-          var family, src;
-
-          for (var i = 0; i < rule.declarations.length; i++) {
-            var decl = rule.declarations[i];
-
-            if (decl.property === 'src') {
-              // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-              src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) ||
-                [])[2];
-            } else if (decl.property === 'font-family') {
-              family = decl.value;
-            }
-          }
-
-          if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-            preloadedFonts.push(src);
-            var preload = document.createElement('link');
-            preload.setAttribute('rel', 'preload');
-            preload.setAttribute('as', 'font');
-            preload.setAttribute('crossorigin', 'anonymous');
-            preload.setAttribute('href', src.trim());
-            head.appendChild(preload);
-          } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-          if (
-            !family ||
-            !src ||
-            criticalFonts.indexOf(family) === -1 ||
-            !shouldInlineFonts
-          ) {
-            return false;
-          }
-        }
-      });
-      sheet = serializeStylesheet(ast, {
-        compress: _this8.options.compress !== false,
-      }).trim(); // If all rules were removed, get rid of the style element entirely
-
-      if (sheet.trim().length === 0) {
-        if (style.parentNode) {
-          style.parentNode.removeChild(style);
-        }
-
-        return Promise.resolve();
-      }
-
-      var afterText = '';
-
-      if (options.pruneSource) {
-        var sheetInverse = serializeStylesheet(astInverse, {
-          compress: _this8.options.compress !== false,
-        }); // const asset = style.$$asset;
-        // if (asset) {
-        // if external stylesheet would be below minimum size, just inline everything
-
-        var minSize = _this8.options.minimumExternalSize;
-
-        if (minSize && sheetInverse.length < minSize) {
-          _this8.logger.info(
-            '\x1B[32mInlined all of ' +
-              name +
-              ' (non-critical external stylesheet would have been ' +
-              sheetInverse.length +
-              'b, which was below the threshold of ' +
-              minSize +
-              ')\x1B[39m'
-          );
-
-          setNodeText(style, before); // remove any associated external resources/loaders:
-
-          if (style.$$links) {
-            for (
-              var _iterator = _createForOfIteratorHelperLoose(style.$$links),
-                _step;
-              !(_step = _iterator()).done;
-
-            ) {
-              var link = _step.value;
-              var parent = link.parentNode;
-              if (parent) parent.removeChild(link);
-            }
-          } // delete the webpack asset:
-
-          delete style.$$assets[style.$$assetName];
-          return Promise.resolve();
-        }
-
-        var percent = (sheetInverse.length / before.length) * 100;
-        afterText =
-          ', reducing non-inlined size ' +
-          (percent | 0) +
-          '% to ' +
-          prettyBytes(sheetInverse.length); // style.$$assets[style.$$assetName] = new sources.LineToLineMappedSource(
-        //   sheetInverse,
-        //   style.$$assetName,
-        //   before
-        // );
-        // } else {
-        // this.logger.warn(
-        //   'pruneSource is enabled, but a style (' +
-        //     name +
-        //     ') has no corresponding Webpack asset.'
-        // );
-        // }
-        // }
-        // replace the inline stylesheet with its critical'd counterpart
-
-        setNodeText(style, sheet); // output stats
-        // const percent = ((sheet.length / before.length) * 100) | 0;
-        // this.logger.info(
-        //   '\u001b[32mInlined ' +
-        //     prettyBytes(sheet.length) +
-        //     ' (' +
-        //     percent +
-        //     '% of original ' +
-        //     prettyBytes(before.length) +
-        //     ') of ' +
-        //     name +
-        //     afterText +
-        //     '.\u001b[39m'
-        // );
-      }
-
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-
-  return Critters;
-})(); // Original code picks 1 html and during prune removes CSS files from assets. What if theres another dependency
-
-function _catch$1(body, recover) {
-  try {
-    var result = body();
-  } catch (e) {
-    return recover(e);
-  }
-
-  if (result && result.then) {
-    return result.then(void 0, recover);
-  }
-
-  return result;
-}
-
-var PLUGIN_NAME = 'critters-webpack-plugin';
-/**
- * The mechanism to use for lazy-loading stylesheets.
- * _[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
- *
- * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
- * - **"body":** Move all external stylesheet links to the end of the document.
- * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
- * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
- * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
- * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
- * @typedef {(default|'body'|'media'|'swap'|'js'|'js-lazy')} PreloadStrategy
- * @public
- */
-
-/**
- * Controls which keyframes rules are inlined.
- *
- * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
- * - **"all":** Inline all keyframes rules.
- * - **"none":** Remove all keyframes rules.
- * @typedef {('critical'|'all'|'none')} KeyframeStrategy
- * @private
- * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
- */
-
-/**
- * Controls log level of the plugin. Specifies the level the logger should use. A logger will
- * not produce output for any log level beneath the specified level. Available levels and order
- * are:
- *
- * - **"info"** _(default)_
- * - **"warn"**
- * - **"error"**
- * - **"trace"**
- * - **"debug"**
- * - **"silent"**
- * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
- * @public
- */
-
-/**
- * All optional. Pass them to `new Critters({ ... })`.
- * @public
- * @typedef Options
- * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
- * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
- * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
- * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `true`)_
- * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
- * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
- * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
- * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
- * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
- * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
- * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
- *  - Values:
- *  - `true` to inline critical font-face rules and preload the fonts
- *  - `false` to don't inline any font-face rules and don't preload fonts
- * @property {String} keyframes     Controls which keyframes rules are inlined.
- *  - Values:
- *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
- *  - `"all"` inline all keyframes rules
- *  - `"none"` remove all keyframes rules
- * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
- * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
- */
-
-/**
- * Create a Critters plugin instance with the given options.
- * @public
- * @param {Options} options Options to control how Critters inlines CSS.
- * @example
- * // webpack.config.js
- * module.exports = {
- *   plugins: [
- *     new Critters({
- *       // Outputs: <link rel="preload" onload="this.rel='stylesheet'">
- *       preload: 'swap',
- *
- *       // Don't inline critical font-face rules, but preload the font URLs:
- *       preloadFonts: true
- *     })
- *   ]
- * }
- */
-
-var Critters$1 = /* #__PURE__ */ (function () {
-  /** @private */
-  function Critters(options) {
-    this.options = Object.assign(
-      {
-        logLevel: 'info',
-        externalStylesheets: [],
-      },
-      options || {}
-    );
-    this.options.pruneSource = this.options.pruneSource !== false;
-    this.urlFilter = this.options.filter;
-
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-
-    this.logger = log({
-      name: 'Critters',
-      unique: true,
-      level: this.options.logLevel,
-    });
-  }
-  /**
-   * Invoked by Webpack during plugin initialization
-   */
-
-  var _proto = Critters.prototype;
-
-  _proto.apply = function apply(compiler) {
-    var _this = this;
-
-    // hook into the compiler to get a Compilation instance...
-    tap(compiler, 'compilation', PLUGIN_NAME, false, function (compilation) {
-      // ... which is how we get an "after" hook into html-webpack-plugin's HTML generation.
-      if (
-        compilation.hooks &&
-        compilation.hooks.htmlWebpackPluginAfterHtmlProcessing
-      ) {
-        tap(
-          compilation,
-          'html-webpack-plugin-after-html-processing',
-          PLUGIN_NAME,
-          true,
-          function (htmlPluginData, callback) {
-            _this
-              .process(compiler, compilation, htmlPluginData.html)
-              .then(function (html) {
-                callback(null, {
-                  html: html,
-                });
-              })
-              .catch(callback);
-          }
-        );
-      } else {
-        // If html-webpack-plugin isn't used, process the first HTML asset as an optimize step
-        tap(compilation, 'optimize-assets', PLUGIN_NAME, true, function (
-          assets,
-          callback
-        ) {
-          var htmlAssetName;
-
-          for (var name in assets) {
-            if (name.match(/\.html$/)) {
-              htmlAssetName = name;
-              break;
-            }
-          }
-
-          if (!htmlAssetName) {
-            return callback(Error('Could not find HTML asset.'));
-          }
-
-          var html = assets[htmlAssetName].source();
-          if (!html) return callback(Error('Empty HTML asset.'));
-
-          _this
-            .process(compiler, compilation, String(html))
-            .then(function (html) {
-              assets[htmlAssetName] = new sources.RawSource(html);
-              callback();
-            })
-            .catch(callback);
-        });
-      }
-    });
-  };
-  /**
-   * Read the contents of a file from Webpack's input filesystem
-   */
-
-  _proto.readFile = function readFile(compilation, filename) {
-    var fs = this.fs || compilation.outputFileSystem;
-    return new Promise(function (resolve, reject) {
-      var callback = function callback(err, data) {
-        if (err) reject(err);
-        else resolve(data);
-      };
-
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  };
-  /**
-   * Apply critical CSS processing to html-webpack-plugin
-   */
-
-  _proto.process = function process(compiler, compilation, html) {
-    try {
-      var _temp5 = function _temp5() {
-        // go through all the style tags in the document and reduce them to only critical CSS
-        var styles = [].slice.call(document.querySelectorAll('style'));
-        return Promise.resolve(
-          Promise.all(
-            styles.map(function (style) {
-              return _this3.processStyle(style, document);
-            })
-          )
-        ).then(function () {
-          function _temp2() {
-            // serialize the document back to HTML and we're done
-            return serializeDocument(document);
-          }
-
-          var _temp = (function () {
-            if (
-              _this3.options.mergeStylesheets !== false &&
-              styles.length !== 0
-            ) {
-              return Promise.resolve(
-                _this3.mergeStylesheets(document)
-              ).then(function () {});
-            }
-          })();
-
-          return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
-        });
-      };
-
-      var _this3 = this;
-
-      var outputPath = compiler.options.output.path;
-      var publicPath = compiler.options.output.publicPath; // Parse the generated HTML in a DOM we can mutate
-
-      var document = createDocument(html);
-
-      if (_this3.options.additionalStylesheets) {
-        var styleSheetsIncluded = [];
-        (_this3.options.additionalStylesheets || []).forEach(function (
-          cssFile
-        ) {
-          if (styleSheetsIncluded.includes(cssFile)) {
-            return;
-          }
-
-          styleSheetsIncluded.push(cssFile);
-          var webpackCssAssets = Object.keys(compilation.assets).filter(
-            function (file) {
-              return minimatch(file, cssFile);
-            }
-          );
-          webpackCssAssets.map(function (asset) {
-            var tag = document.createElement('style');
-            tag.innerHTML = compilation.assets[asset].source();
-            document.head.appendChild(tag);
-          });
-        });
-      } // `external:false` skips processing of external sheets
-
-      var _temp6 = (function () {
-        if (_this3.options.external !== false) {
-          var externalSheets = [].slice.call(
-            document.querySelectorAll('link[rel="stylesheet"]')
-          );
-          return Promise.resolve(
-            Promise.all(
-              externalSheets.map(function (link) {
-                return _this3.embedLinkedStylesheet(
-                  link,
-                  compilation,
-                  outputPath,
-                  publicPath
-                );
-              })
-            )
-          ).then(function () {});
-        }
-      })();
-
-      return Promise.resolve(
-        _temp6 && _temp6.then ? _temp6.then(_temp5) : _temp5(_temp6)
-      );
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-
-  _proto.mergeStylesheets = function mergeStylesheets(document) {
-    try {
-      var _temp9 = function _temp9() {
-        setNodeText(first, sheet);
-      };
-
-      var _this5 = this;
-
-      var styles = [].slice.call(document.querySelectorAll('style'));
-
-      if (styles.length === 0) {
-        _this5.logger.warn(
-          'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'
-        );
-
-        return Promise.resolve();
-      }
-
-      var first = styles[0];
-      var sheet = first.textContent;
-
-      for (var i = 1; i < styles.length; i++) {
-        var node = styles[i];
-        sheet += node.textContent;
-        node.remove();
-      }
-
-      var _temp10 = (function () {
-        if (_this5.options.compress !== false) {
-          var before = sheet;
-          var processor = postcss([cssnano()]);
-          return Promise.resolve(
-            processor.process(before, {
-              from: undefined,
-            })
-          ).then(function (result) {
-            // @todo sourcemap support (elsewhere first)
-            sheet = result.css;
-          });
-        }
-      })();
-
-      return Promise.resolve(
-        _temp10 && _temp10.then ? _temp10.then(_temp9) : _temp9(_temp10)
-      );
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-  /**
-   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-   */
-
-  _proto.embedLinkedStylesheet = function embedLinkedStylesheet(
-    link,
-    compilation,
-    outputPath,
-    publicPath
-  ) {
-    try {
-      var _temp14 = function _temp14(_result2) {
-        if (_exit2) return _result2;
-        // CSS loader is only injected for the first sheet, then this becomes an empty string
-        var cssLoaderPreamble =
-          "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-        var lazy = preloadMode === 'js-lazy';
-
-        if (lazy) {
-          cssLoaderPreamble = cssLoaderPreamble.replace(
-            'l.href',
-            "l.media='print';l.onload=function(){l.media=m};l.href"
-          );
-        } // the reduced critical CSS gets injected into a new <style> tag
-
-        var style = document.createElement('style');
-        style.appendChild(document.createTextNode(sheet));
-        link.parentNode.insertBefore(style, link);
-
-        if (
-          _this7.options.inlineThreshold &&
-          sheet.length < _this7.options.inlineThreshold
-        ) {
-          style.$$reduce = false;
-
-          _this7.logger.info(
-            '\x1B[32mInlined all of ' +
-              href +
-              ' (' +
-              sheet.length +
-              ' was below the threshold of ' +
-              _this7.options.inlineThreshold +
-              ')\x1B[39m'
-          );
-
-          if (asset) {
-            delete compilation.assets[relativePath];
-          } else {
-            _this7.logger.warn(
-              '  > ' +
-                href +
-                ' was not found in assets. the resource may still be emitted but will be unreferenced.'
-            );
-          }
-
-          link.parentNode.removeChild(link);
-          return;
-        } // drop references to webpack asset locations onto the tag, used for later reporting and in-place asset updates
-
-        style.$$name = href;
-        style.$$asset = asset;
-        style.$$assetName = relativePath;
-        style.$$assets = compilation.assets;
-        style.$$links = [link]; // Allow disabling any mutation of the stylesheet link:
-
-        if (preloadMode === false) return;
-        var noscriptFallback = false;
-
-        if (preloadMode === 'body') {
-          document.body.appendChild(link);
-        } else {
-          link.setAttribute('rel', 'preload');
-          link.setAttribute('as', 'style');
-
-          if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-            var script = document.createElement('script');
-            var js =
-              cssLoaderPreamble +
-              '$loadcss(' +
-              JSON.stringify(href) +
-              (lazy ? ',' + JSON.stringify(media || 'all') : '') +
-              ')';
-            script.appendChild(document.createTextNode(js));
-            link.parentNode.insertBefore(script, link.nextSibling);
-            style.$$links.push(script);
-            cssLoaderPreamble = '';
-            noscriptFallback = true;
-          } else if (preloadMode === 'media') {
-            // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-            link.setAttribute('rel', 'stylesheet');
-            link.removeAttribute('as');
-            link.setAttribute('media', 'print');
-            link.setAttribute(
-              'onload',
-              "this.media='" + (media || 'all') + "'"
-            );
-            noscriptFallback = true;
-          } else if (preloadMode === 'swap') {
-            link.setAttribute('onload', "this.rel='stylesheet'");
-            noscriptFallback = true;
-          } else {
-            var bodyLink = document.createElement('link');
-            bodyLink.setAttribute('rel', 'stylesheet');
-            if (media) bodyLink.setAttribute('media', media);
-            bodyLink.setAttribute('href', href);
-            document.body.appendChild(bodyLink);
-            style.$$links.push(bodyLink);
-          }
-        }
-
-        if (_this7.options.noscriptFallback !== false && noscriptFallback) {
-          var noscript = document.createElement('noscript');
-          var noscriptLink = document.createElement('link');
-          noscriptLink.setAttribute('rel', 'stylesheet');
-          noscriptLink.setAttribute('href', href);
-          if (media) noscriptLink.setAttribute('media', media);
-          noscript.appendChild(noscriptLink);
-          link.parentNode.insertBefore(noscript, link.nextSibling);
-          style.$$links.push(noscript);
-        }
-      };
-
-      var _exit2;
-
-      var _this7 = this;
-
-      var href = link.getAttribute('href');
-      var media = link.getAttribute('media');
-      var document = link.ownerDocument;
-      var preloadMode = _this7.options.preload; // skip filtered resources, or network resources if no filter is provided
-
-      if (
-        _this7.urlFilter
-          ? _this7.urlFilter(href)
-          : href.match(/^(https?:)?\/\//)
-      ) {
-        return Promise.resolve();
-      } // path on disk (with output.publicPath removed)
-
-      var normalizedPath = href.replace(/^\//, '');
-      var pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-
-      if (normalizedPath.indexOf(pathPrefix) === 0) {
-        normalizedPath = normalizedPath
-          .substring(pathPrefix.length)
-          .replace(/^\//, '');
-      }
-
-      var filename = path.resolve(outputPath, normalizedPath); // try to find a matching asset by filename in webpack's output (not yet written to disk)
-
-      var relativePath = path
-        .relative(outputPath, filename)
-        .replace(/^\.\//, '');
-      var asset = compilation.assets[relativePath]; // Attempt to read from assets, falling back to a disk read
-
-      var sheet = asset && asset.source();
-
-      var _temp15 = (function () {
-        if (!sheet) {
-          var _temp16 = _catch$1(
-            function () {
-              return Promise.resolve(
-                _this7.readFile(compilation, filename)
-              ).then(function (_this6$readFile) {
-                sheet = _this6$readFile;
-
-                _this7.logger.warn(
-                  'Stylesheet "' +
-                    relativePath +
-                    '" not found in assets, but a file was located on disk.' +
-                    (_this7.options.pruneSource
-                      ? ' This means pruneSource will not be applied.'
-                      : '')
-                );
-              });
-            },
-            function () {
-              _this7.logger.warn(
-                'Unable to locate stylesheet: ' + relativePath
-              );
-
-              _exit2 = 1;
-            }
-          );
-
-          if (_temp16 && _temp16.then) return _temp16.then(function () {});
-        }
-      })();
-
-      return Promise.resolve(
-        _temp15 && _temp15.then ? _temp15.then(_temp14) : _temp14(_temp15)
-      );
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-
-  _proto.processStyle = function processStyle(style) {
-    try {
-      var _this9 = this;
-
-      if (style.$$reduce === false) return Promise.resolve();
-      var name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-      var options = _this9.options;
-      var document = style.ownerDocument;
-      var head = document.querySelector('head');
-      var keyframesMode = options.keyframes || 'critical'; // we also accept a boolean value for options.keyframes
-
-      if (keyframesMode === true) keyframesMode = 'all';
-      if (keyframesMode === false) keyframesMode = 'none'; // basically `.textContent`
-
-      var sheet =
-        style.childNodes.length > 0 &&
-        [].map
-          .call(style.childNodes, function (node) {
-            return node.nodeValue;
-          })
-          .join('\n'); // store a reference to the previous serialized stylesheet for reporting stats
-
-      var before = sheet; // Skip empty stylesheets
-
-      if (!sheet) return Promise.resolve();
-      var ast = parseStylesheet(sheet);
-      var astInverse = options.pruneSource ? parseStylesheet(sheet) : null; // a string to search for font names (very loose)
-
-      var criticalFonts = '';
-      var failedSelectors = [];
-      var criticalKeyframeNames = []; // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-      // This first pass is also used to collect font and keyframe usage used in the second pass.
-
-      walkStyleRules(
-        ast,
-        markOnly(function (rule) {
-          if (rule.type === 'rule') {
-            // Filter the selector list down to only those match
-            rule.filterSelectors(function (sel) {
-              // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-              // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-              if (sel !== ':root') {
-                sel = sel
-                  .replace(/(?:>\s*)?::?[a-z-]+\s*(\{|$)/gi, '$1')
-                  .trim();
-              }
-
-              if (!sel) return false;
-
-              try {
-                return document.querySelector(sel) != null;
-              } catch (e) {
-                failedSelectors.push(sel + ' -> ' + e.message);
-                return false;
-              }
-            }); // If there are no matched selectors, remove the rule:
-
-            if (rule.selectors.length === 0) {
-              return false;
-            }
-
-            if (rule.declarations) {
-              for (var i = 0; i < rule.declarations.length; i++) {
-                var decl = rule.declarations[i]; // detect used fonts
-
-                if (
-                  decl.property &&
-                  decl.property.match(/\bfont(-family)?\b/i)
-                ) {
-                  criticalFonts += ' ' + decl.value;
-                } // detect used keyframes
-
-                if (
-                  decl.property === 'animation' ||
-                  decl.property === 'animation-name'
-                ) {
-                  // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                  var names = decl.value.split(/\s+/);
-
-                  for (var j = 0; j < names.length; j++) {
-                    var _name = names[j].trim();
-
-                    if (_name) criticalKeyframeNames.push(_name);
-                  }
-                }
-              }
-            }
-          } // keep font rules, they're handled in the second pass:
-
-          if (rule.type === 'font-face') return; // If there are no remaining rules, remove the whole rule:
-
-          var rules =
-            rule.rules &&
-            rule.rules.filter(function (rule) {
-              return !rule.$$remove;
-            });
-          return !rules || rules.length !== 0;
-        })
-      );
-
-      if (failedSelectors.length !== 0) {
-        _this9.logger.warn(
-          failedSelectors.length +
-            ' rules skipped due to selector errors:\n  ' +
-            failedSelectors.join('\n  ')
-        );
-      }
-
-      var shouldPreloadFonts =
-        options.fonts === true || options.preloadFonts === true;
-      var shouldInlineFonts =
-        options.fonts !== false && options.inlineFonts === true;
-      var preloadedFonts = []; // Second pass, using data picked up from the first
-
-      walkStyleRulesWithReverseMirror(ast, astInverse, function (rule) {
-        // remove any rules marked in the first pass
-        if (rule.$$remove === true) return false;
-        applyMarkedSelectors(rule); // prune @keyframes rules
-
-        if (rule.type === 'keyframes') {
-          if (keyframesMode === 'none') return false;
-          if (keyframesMode === 'all') return true;
-          return criticalKeyframeNames.indexOf(rule.name) !== -1;
-        } // prune @font-face rules
-
-        if (rule.type === 'font-face') {
-          var family, src;
-
-          for (var i = 0; i < rule.declarations.length; i++) {
-            var decl = rule.declarations[i];
-
-            if (decl.property === 'src') {
-              // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-              src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) ||
-                [])[2];
-            } else if (decl.property === 'font-family') {
-              family = decl.value;
-            }
-          }
-
-          if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-            preloadedFonts.push(src);
-            var preload = document.createElement('link');
-            preload.setAttribute('rel', 'preload');
-            preload.setAttribute('as', 'font');
-            preload.setAttribute('crossorigin', 'anonymous');
-            preload.setAttribute('href', src.trim());
-            head.appendChild(preload);
-          } // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-
-          if (
-            !family ||
-            !src ||
-            criticalFonts.indexOf(family) === -1 ||
-            !shouldInlineFonts
-          ) {
-            return false;
-          }
-        }
-      });
-      sheet = serializeStylesheet(ast, {
-        compress: _this9.options.compress !== false,
-      }).trim(); // If all rules were removed, get rid of the style element entirely
-
-      if (sheet.trim().length === 0) {
-        if (style.parentNode) {
-          style.parentNode.removeChild(style);
-        }
-
-        return Promise.resolve();
-      }
-
-      var afterText = '';
-
-      if (options.pruneSource) {
-        var sheetInverse = serializeStylesheet(astInverse, {
-          compress: _this9.options.compress !== false,
-        });
-        var asset = style.$$asset;
-
-        if (asset) {
-          // if external stylesheet would be below minimum size, just inline everything
-          var minSize = _this9.options.minimumExternalSize;
-
-          if (minSize && sheetInverse.length < minSize) {
-            _this9.logger.info(
-              '\x1B[32mInlined all of ' +
-                name +
-                ' (non-critical external stylesheet would have been ' +
-                sheetInverse.length +
-                'b, which was below the threshold of ' +
-                minSize +
-                ')\x1B[39m'
-            );
-
-            setNodeText(style, before); // remove any associated external resources/loaders:
-
-            if (style.$$links) {
-              for (
-                var _iterator = _createForOfIteratorHelperLoose(style.$$links),
-                  _step;
-                !(_step = _iterator()).done;
-
-              ) {
-                var link = _step.value;
-                var parent = link.parentNode;
-                if (parent) parent.removeChild(link);
-              }
-            } // delete the webpack asset:
-
-            delete style.$$assets[style.$$assetName];
-            return Promise.resolve();
-          }
-
-          var _percent = (sheetInverse.length / before.length) * 100;
-
-          afterText =
-            ', reducing non-inlined size ' +
-            (_percent | 0) +
-            '% to ' +
-            prettyBytes(sheetInverse.length);
-          style.$$assets[
-            style.$$assetName
-          ] = new sources.LineToLineMappedSource(
-            sheetInverse,
-            style.$$assetName,
-            before
-          );
-        } else {
-          _this9.logger.warn(
-            'pruneSource is enabled, but a style (' +
-              name +
-              ') has no corresponding Webpack asset.'
-          );
-        }
-      } // replace the inline stylesheet with its critical'd counterpart
-
-      setNodeText(style, sheet); // output stats
-
-      var percent = ((sheet.length / before.length) * 100) | 0;
-
-      _this9.logger.info(
-        '\x1B[32mInlined ' +
-          prettyBytes(sheet.length) +
-          ' (' +
-          percent +
-          '% of original ' +
-          prettyBytes(before.length) +
-          ') of ' +
-          name +
-          afterText +
-          '.\x1B[39m'
-      );
-
-      return Promise.resolve();
-    } catch (e) {
-      return Promise.reject(e);
-    }
-  };
-
-  return Critters;
-})();
-
-exports.core = Critters;
-exports.default = Critters$1;
-// # sourceMappingURL=critters.js.map
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/LICENSE
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/LICENSE	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/LICENSE	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+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.
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/README.md
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/README.md	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/README.md	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,21 @@
+# picocolors
+
+The tiniest and the fastest library for terminal output formatting with ANSI colors.
+
+```javascript
+import pc from "picocolors"
+
+console.log(
+  pc.green(`How are ${pc.italic(`you`)} doing?`)
+)
+```
+
+- **No dependencies.**
+- **14 times** smaller and **2 times** faster than chalk.
+- Used by popular tools like PostCSS, SVGO, Stylelint, and Browserslist.
+- Node.js v6+ & browsers support. Support for both CJS and ESM projects.
+- TypeScript type declarations included.
+- [`NO_COLOR`](https://no-color.org/) friendly.
+
+## Docs
+Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub.
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/package.json
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/package.json	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/package.json	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,59 @@
+{
+  "_from": "picocolors@^1.0.0",
+  "_id": "picocolors@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+  "_location": "/critters/picocolors",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "picocolors@^1.0.0",
+    "name": "picocolors",
+    "escapedName": "picocolors",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/critters/postcss"
+  ],
+  "_resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+  "_shasum": "cb5bdc74ff3f51892236eaf79d68bc44564ab81c",
+  "_spec": "picocolors@^1.0.0",
+  "_where": "C:\\Users\\DELL\\Desktop\\bachelor-thesis\\trip-planner-front\\node_modules\\critters\\node_modules\\postcss",
+  "author": {
+    "name": "Alexey Raspopov"
+  },
+  "browser": {
+    "./picocolors.js": "./picocolors.browser.js"
+  },
+  "bugs": {
+    "url": "https://github.com/alexeyraspopov/picocolors/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors",
+  "files": [
+    "picocolors.*",
+    "types.ts"
+  ],
+  "homepage": "https://github.com/alexeyraspopov/picocolors#readme",
+  "keywords": [
+    "terminal",
+    "colors",
+    "formatting",
+    "cli",
+    "console"
+  ],
+  "license": "ISC",
+  "main": "./picocolors.js",
+  "name": "picocolors",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/alexeyraspopov/picocolors.git"
+  },
+  "sideEffects": false,
+  "types": "./picocolors.d.ts",
+  "version": "1.0.0"
+}
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.browser.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.browser.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.browser.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,4 @@
+var x=String;
+var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x}};
+module.exports=create();
+module.exports.createColors = create;
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,5 @@
+import { Colors } from "./types"
+
+declare const picocolors: Colors & { createColors: (enabled?: boolean) => Colors }
+
+export = picocolors
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/picocolors.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,58 @@
+let tty = require("tty")
+
+let isColorSupported =
+	!("NO_COLOR" in process.env || process.argv.includes("--no-color")) &&
+	("FORCE_COLOR" in process.env ||
+		process.argv.includes("--color") ||
+		process.platform === "win32" ||
+		(tty.isatty(1) && process.env.TERM !== "dumb") ||
+		"CI" in process.env)
+
+let formatter =
+	(open, close, replace = open) =>
+	input => {
+		let string = "" + input
+		let index = string.indexOf(close, open.length)
+		return ~index
+			? open + replaceClose(string, close, replace, index) + close
+			: open + string + close
+	}
+
+let replaceClose = (string, close, replace, index) => {
+	let start = string.substring(0, index) + replace
+	let end = string.substring(index + close.length)
+	let nextIndex = end.indexOf(close)
+	return ~nextIndex ? start + replaceClose(end, close, replace, nextIndex) : start + end
+}
+
+let createColors = (enabled = isColorSupported) => ({
+	isColorSupported: enabled,
+	reset: enabled ? s => `\x1b[0m${s}\x1b[0m` : String,
+	bold: enabled ? formatter("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m") : String,
+	dim: enabled ? formatter("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m") : String,
+	italic: enabled ? formatter("\x1b[3m", "\x1b[23m") : String,
+	underline: enabled ? formatter("\x1b[4m", "\x1b[24m") : String,
+	inverse: enabled ? formatter("\x1b[7m", "\x1b[27m") : String,
+	hidden: enabled ? formatter("\x1b[8m", "\x1b[28m") : String,
+	strikethrough: enabled ? formatter("\x1b[9m", "\x1b[29m") : String,
+	black: enabled ? formatter("\x1b[30m", "\x1b[39m") : String,
+	red: enabled ? formatter("\x1b[31m", "\x1b[39m") : String,
+	green: enabled ? formatter("\x1b[32m", "\x1b[39m") : String,
+	yellow: enabled ? formatter("\x1b[33m", "\x1b[39m") : String,
+	blue: enabled ? formatter("\x1b[34m", "\x1b[39m") : String,
+	magenta: enabled ? formatter("\x1b[35m", "\x1b[39m") : String,
+	cyan: enabled ? formatter("\x1b[36m", "\x1b[39m") : String,
+	white: enabled ? formatter("\x1b[37m", "\x1b[39m") : String,
+	gray: enabled ? formatter("\x1b[90m", "\x1b[39m") : String,
+	bgBlack: enabled ? formatter("\x1b[40m", "\x1b[49m") : String,
+	bgRed: enabled ? formatter("\x1b[41m", "\x1b[49m") : String,
+	bgGreen: enabled ? formatter("\x1b[42m", "\x1b[49m") : String,
+	bgYellow: enabled ? formatter("\x1b[43m", "\x1b[49m") : String,
+	bgBlue: enabled ? formatter("\x1b[44m", "\x1b[49m") : String,
+	bgMagenta: enabled ? formatter("\x1b[45m", "\x1b[49m") : String,
+	bgCyan: enabled ? formatter("\x1b[46m", "\x1b[49m") : String,
+	bgWhite: enabled ? formatter("\x1b[47m", "\x1b[49m") : String,
+})
+
+module.exports = createColors()
+module.exports.createColors = createColors
Index: trip-planner-front/node_modules/critters/node_modules/picocolors/types.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/picocolors/types.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/picocolors/types.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,30 @@
+export type Formatter = (input: string | number | null | undefined) => string
+
+export interface Colors {
+	isColorSupported: boolean
+	reset: Formatter
+	bold: Formatter
+	dim: Formatter
+	italic: Formatter
+	underline: Formatter
+	inverse: Formatter
+	hidden: Formatter
+	strikethrough: Formatter
+	black: Formatter
+	red: Formatter
+	green: Formatter
+	yellow: Formatter
+	blue: Formatter
+	magenta: Formatter
+	cyan: Formatter
+	white: Formatter
+	gray: Formatter
+	bgBlack: Formatter
+	bgRed: Formatter
+	bgGreen: Formatter
+	bgYellow: Formatter
+	bgBlue: Formatter
+	bgMagenta: Formatter
+	bgCyan: Formatter
+	bgWhite: Formatter
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/LICENSE
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/LICENSE	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/LICENSE	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2013 Andrey Sitnik <andrey@sitnik.ru>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: trip-planner-front/node_modules/critters/node_modules/postcss/README.md
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/README.md	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/README.md	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,44 @@
+# PostCSS [![Gitter][chat-img]][chat]
+
+<img align="right" width="95" height="95"
+     alt="Philosopher’s stone, logo of PostCSS"
+     src="https://postcss.org/logo.svg">
+
+[chat-img]: https://img.shields.io/badge/Gitter-Join_the_PostCSS_chat-brightgreen.svg
+[chat]:     https://gitter.im/postcss/postcss
+
+PostCSS is a tool for transforming styles with JS plugins.
+These plugins can lint your CSS, support variables and mixins,
+transpile future CSS syntax, inline images, and more.
+
+PostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba,
+and JetBrains. The [Autoprefixer] PostCSS plugin is one of the most popular
+CSS processors.
+
+PostCSS takes a CSS file and provides an API to analyze and modify its rules
+(by transforming them into an [Abstract Syntax Tree]).
+This API can then be used by [plugins] to do a lot of useful things,
+e.g., to find errors automatically, or to insert vendor prefixes.
+
+**Support / Discussion:** [Gitter](https://gitter.im/postcss/postcss)<br>
+**Twitter account:**      [@postcss](https://twitter.com/postcss)<br>
+**VK.com page:**          [postcss](https://vk.com/postcss)<br>
+**中文翻译**:              [`docs/README-cn.md`](./docs/README-cn.md)
+
+For PostCSS commercial support (consulting, improving the front-end culture
+of your company, PostCSS plugins), contact [Evil Martians]
+at <postcss@evilmartians.com>.
+
+[Abstract Syntax Tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree
+[Evil Martians]:        https://evilmartians.com/?utm_source=postcss
+[Autoprefixer]:         https://github.com/postcss/autoprefixer
+[plugins]:              https://github.com/postcss/postcss#plugins
+
+<a href="https://evilmartians.com/?utm_source=postcss">
+  <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
+       alt="Sponsored by Evil Martians" width="236" height="54">
+</a>
+
+
+## Docs
+Read **[full docs](https://github.com/postcss/postcss#readme)** on GitHub.
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,106 @@
+import Container, { ContainerProps } from './container.js'
+
+interface AtRuleRaws {
+  /**
+   * The space symbols before the node. It also stores `*`
+   * and `_` symbols before the declaration (IE hack).
+   */
+  before?: string
+
+  /**
+   * The space symbols after the last child of the node to the end of the node.
+   */
+  after?: string
+
+  /**
+   * The space between the at-rule name and its parameters.
+   */
+  afterName?: string
+
+  /**
+   * The symbols between the last parameter and `{` for rules.
+   */
+  between?: string
+
+  /**
+   * Contains `true` if the last child has an (optional) semicolon.
+   */
+  semicolon?: boolean
+
+  /**
+   * The rule’s selector with comments.
+   */
+  params?: {
+    value: string
+    raw: string
+  }
+}
+
+export interface AtRuleProps extends ContainerProps {
+  /** Name of the at-rule. */
+  name: string
+  /** Parameters following the name of the at-rule. */
+  params?: string | number
+  /** Information used to generate byte-to-byte equal node string as it was in the origin input. */
+  raws?: AtRuleRaws
+}
+
+/**
+ * Represents an at-rule.
+ *
+ * ```js
+ * Once (root, { AtRule }) {
+ *   let media = new AtRule({ name: 'media', params: 'print' })
+ *   media.append(…)
+ *   root.append(media)
+ * }
+ * ```
+ *
+ * If it’s followed in the CSS by a {} block, this node will have
+ * a nodes property representing its children.
+ *
+ * ```js
+ * const root = postcss.parse('@charset "UTF-8"; @media print {}')
+ *
+ * const charset = root.first
+ * charset.type  //=> 'atrule'
+ * charset.nodes //=> undefined
+ *
+ * const media = root.last
+ * media.nodes   //=> []
+ * ```
+ */
+export default class AtRule extends Container {
+  type: 'atrule'
+  parent: Container | undefined
+  raws: AtRuleRaws
+
+  /**
+   * The at-rule’s name immediately follows the `@`.
+   *
+   * ```js
+   * const root  = postcss.parse('@media print {}')
+   * media.name //=> 'media'
+   * const media = root.first
+   * ```
+   */
+  name: string
+
+  /**
+   * The at-rule’s parameters, the values that follow the at-rule’s name
+   * but precede any {} block.
+   *
+   * ```js
+   * const root  = postcss.parse('@media print, screen {}')
+   * const media = root.first
+   * media.params //=> 'print, screen'
+   * ```
+   */
+  params: string
+
+  constructor(defaults?: AtRuleProps)
+  assign(overrides: object | AtRuleProps): this
+  clone(overrides?: Partial<AtRuleProps>): this
+  cloneBefore(overrides?: Partial<AtRuleProps>): this
+  cloneAfter(overrides?: Partial<AtRuleProps>): this
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/at-rule.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,25 @@
+'use strict'
+
+let Container = require('./container')
+
+class AtRule extends Container {
+  constructor(defaults) {
+    super(defaults)
+    this.type = 'atrule'
+  }
+
+  append(...children) {
+    if (!this.proxyOf.nodes) this.nodes = []
+    return super.append(...children)
+  }
+
+  prepend(...children) {
+    if (!this.proxyOf.nodes) this.nodes = []
+    return super.prepend(...children)
+  }
+}
+
+module.exports = AtRule
+AtRule.default = AtRule
+
+Container.registerAtRule(AtRule)
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,56 @@
+import Container from './container.js'
+import Node, { NodeProps } from './node.js'
+
+interface CommentRaws {
+  /**
+   * The space symbols before the node.
+   */
+  before?: string
+
+  /**
+   * The space symbols between `/*` and the comment’s text.
+   */
+  left?: string
+
+  /**
+   * The space symbols between the comment’s text.
+   */
+  right?: string
+}
+
+export interface CommentProps extends NodeProps {
+  /** Content of the comment. */
+  text: string
+  /** Information used to generate byte-to-byte equal node string as it was in the origin input. */
+  raws?: CommentRaws
+}
+
+/**
+ * Represents a comment between declarations or statements (rule and at-rules).
+ *
+ * ```js
+ * Once (root, { Comment }) {
+ *   let note = new Comment({ text: 'Note: …' })
+ *   root.append(note)
+ * }
+ * ```
+ *
+ * Comments inside selectors, at-rule parameters, or declaration values
+ * will be stored in the `raws` properties explained above.
+ */
+export default class Comment extends Node {
+  type: 'comment'
+  parent: Container | undefined
+  raws: CommentRaws
+
+  /**
+   * The comment's text.
+   */
+  text: string
+
+  constructor(defaults?: CommentProps)
+  assign(overrides: object | CommentProps): this
+  clone(overrides?: Partial<CommentProps>): this
+  cloneBefore(overrides?: Partial<CommentProps>): this
+  cloneAfter(overrides?: Partial<CommentProps>): this
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/comment.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,13 @@
+'use strict'
+
+let Node = require('./node')
+
+class Comment extends Node {
+  constructor(defaults) {
+    super(defaults)
+    this.type = 'comment'
+  }
+}
+
+module.exports = Comment
+Comment.default = Comment
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,442 @@
+import Node, { ChildNode, NodeProps, ChildProps } from './node.js'
+import Declaration from './declaration.js'
+import Comment from './comment.js'
+import AtRule from './at-rule.js'
+import Rule from './rule.js'
+
+interface ValueOptions {
+  /**
+   * An array of property names.
+   */
+  props?: string[]
+
+  /**
+   * String that’s used to narrow down values and speed up the regexp search.
+   */
+  fast?: string
+}
+
+export interface ContainerProps extends NodeProps {
+  nodes?: (ChildNode | ChildProps)[]
+}
+
+/**
+ * The `Root`, `AtRule`, and `Rule` container nodes
+ * inherit some common methods to help work with their children.
+ *
+ * Note that all containers can store any content. If you write a rule inside
+ * a rule, PostCSS will parse it.
+ */
+export default abstract class Container<
+  Child extends Node = ChildNode
+> extends Node {
+  /**
+   * An array containing the container’s children.
+   *
+   * ```js
+   * const root = postcss.parse('a { color: black }')
+   * root.nodes.length           //=> 1
+   * root.nodes[0].selector      //=> 'a'
+   * root.nodes[0].nodes[0].prop //=> 'color'
+   * ```
+   */
+  nodes: Child[]
+
+  /**
+   * The container’s first child.
+   *
+   * ```js
+   * rule.first === rules.nodes[0]
+   * ```
+   */
+  get first(): Child | undefined
+
+  /**
+   * The container’s last child.
+   *
+   * ```js
+   * rule.last === rule.nodes[rule.nodes.length - 1]
+   * ```
+   */
+  get last(): Child | undefined
+
+  /**
+   * Iterates through the container’s immediate children,
+   * calling `callback` for each child.
+   *
+   * Returning `false` in the callback will break iteration.
+   *
+   * This method only iterates through the container’s immediate children.
+   * If you need to recursively iterate through all the container’s descendant
+   * nodes, use `Container#walk`.
+   *
+   * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe
+   * if you are mutating the array of child nodes during iteration.
+   * PostCSS will adjust the current index to match the mutations.
+   *
+   * ```js
+   * const root = postcss.parse('a { color: black; z-index: 1 }')
+   * const rule = root.first
+   *
+   * for (const decl of rule.nodes) {
+   *   decl.cloneBefore({ prop: '-webkit-' + decl.prop })
+   *   // Cycle will be infinite, because cloneBefore moves the current node
+   *   // to the next index
+   * }
+   *
+   * rule.each(decl => {
+   *   decl.cloneBefore({ prop: '-webkit-' + decl.prop })
+   *   // Will be executed only for color and z-index
+   * })
+   * ```
+   *
+   * @param callback Iterator receives each node and index.
+   * @return Returns `false` if iteration was broke.
+   */
+  each(
+    callback: (node: Child, index: number) => false | void
+  ): false | undefined
+
+  /**
+   * Traverses the container’s descendant nodes, calling callback
+   * for each node.
+   *
+   * Like container.each(), this method is safe to use
+   * if you are mutating arrays during iteration.
+   *
+   * If you only need to iterate through the container’s immediate children,
+   * use `Container#each`.
+   *
+   * ```js
+   * root.walk(node => {
+   *   // Traverses all descendant nodes.
+   * })
+   * ```
+   *
+   * @param callback Iterator receives each node and index.
+   * @return  Returns `false` if iteration was broke.
+   */
+  walk(
+    callback: (node: ChildNode, index: number) => false | void
+  ): false | undefined
+
+  /**
+   * Traverses the container’s descendant nodes, calling callback
+   * for each declaration node.
+   *
+   * If you pass a filter, iteration will only happen over declarations
+   * with matching properties.
+   *
+   * ```js
+   * root.walkDecls(decl => {
+   *   checkPropertySupport(decl.prop)
+   * })
+   *
+   * root.walkDecls('border-radius', decl => {
+   *   decl.remove()
+   * })
+   *
+   * root.walkDecls(/^background/, decl => {
+   *   decl.value = takeFirstColorFromGradient(decl.value)
+   * })
+   * ```
+   *
+   * Like `Container#each`, this method is safe
+   * to use if you are mutating arrays during iteration.
+   *
+   * @param prop     String or regular expression to filter declarations
+   *                 by property name.
+   * @param callback Iterator receives each node and index.
+   * @return Returns `false` if iteration was broke.
+   */
+  walkDecls(
+    propFilter: string | RegExp,
+    callback: (decl: Declaration, index: number) => false | void
+  ): false | undefined
+  walkDecls(
+    callback: (decl: Declaration, index: number) => false | void
+  ): false | undefined
+
+  /**
+   * Traverses the container’s descendant nodes, calling callback
+   * for each rule node.
+   *
+   * If you pass a filter, iteration will only happen over rules
+   * with matching selectors.
+   *
+   * Like `Container#each`, this method is safe
+   * to use if you are mutating arrays during iteration.
+   *
+   * ```js
+   * const selectors = []
+   * root.walkRules(rule => {
+   *   selectors.push(rule.selector)
+   * })
+   * console.log(`Your CSS uses ${ selectors.length } selectors`)
+   * ```
+   *
+   * @param selector String or regular expression to filter rules by selector.
+   * @param callback Iterator receives each node and index.
+   * @return Returns `false` if iteration was broke.
+   */
+  walkRules(
+    selectorFilter: string | RegExp,
+    callback: (atRule: Rule, index: number) => false | void
+  ): false | undefined
+  walkRules(
+    callback: (atRule: Rule, index: number) => false | void
+  ): false | undefined
+
+  /**
+   * Traverses the container’s descendant nodes, calling callback
+   * for each at-rule node.
+   *
+   * If you pass a filter, iteration will only happen over at-rules
+   * that have matching names.
+   *
+   * Like `Container#each`, this method is safe
+   * to use if you are mutating arrays during iteration.
+   *
+   * ```js
+   * root.walkAtRules(rule => {
+   *   if (isOld(rule.name)) rule.remove()
+   * })
+   *
+   * let first = false
+   * root.walkAtRules('charset', rule => {
+   *   if (!first) {
+   *     first = true
+   *   } else {
+   *     rule.remove()
+   *   }
+   * })
+   * ```
+   *
+   * @param name     String or regular expression to filter at-rules by name.
+   * @param callback Iterator receives each node and index.
+   * @return Returns `false` if iteration was broke.
+   */
+  walkAtRules(
+    nameFilter: string | RegExp,
+    callback: (atRule: AtRule, index: number) => false | void
+  ): false | undefined
+  walkAtRules(
+    callback: (atRule: AtRule, index: number) => false | void
+  ): false | undefined
+
+  /**
+   * Traverses the container’s descendant nodes, calling callback
+   * for each comment node.
+   *
+   * Like `Container#each`, this method is safe
+   * to use if you are mutating arrays during iteration.
+   *
+   * ```js
+   * root.walkComments(comment => {
+   *   comment.remove()
+   * })
+   * ```
+   *
+   * @param callback Iterator receives each node and index.
+   * @return Returns `false` if iteration was broke.
+   */
+
+  walkComments(
+    callback: (comment: Comment, indexed: number) => false | void
+  ): false | undefined
+  walkComments(
+    callback: (comment: Comment, indexed: number) => false | void
+  ): false | undefined
+
+  /**
+   * Inserts new nodes to the end of the container.
+   *
+   * ```js
+   * const decl1 = new Declaration({ prop: 'color', value: 'black' })
+   * const decl2 = new Declaration({ prop: 'background-color', value: 'white' })
+   * rule.append(decl1, decl2)
+   *
+   * root.append({ name: 'charset', params: '"UTF-8"' })  // at-rule
+   * root.append({ selector: 'a' })                       // rule
+   * rule.append({ prop: 'color', value: 'black' })       // declaration
+   * rule.append({ text: 'Comment' })                     // comment
+   *
+   * root.append('a {}')
+   * root.first.append('color: black; z-index: 1')
+   * ```
+   *
+   * @param nodes New nodes.
+   * @return This node for methods chain.
+   */
+  append(
+    ...nodes: (Node | Node[] | ChildProps | ChildProps[] | string | string[])[]
+  ): this
+
+  /**
+   * Inserts new nodes to the start of the container.
+   *
+   * ```js
+   * const decl1 = new Declaration({ prop: 'color', value: 'black' })
+   * const decl2 = new Declaration({ prop: 'background-color', value: 'white' })
+   * rule.prepend(decl1, decl2)
+   *
+   * root.append({ name: 'charset', params: '"UTF-8"' })  // at-rule
+   * root.append({ selector: 'a' })                       // rule
+   * rule.append({ prop: 'color', value: 'black' })       // declaration
+   * rule.append({ text: 'Comment' })                     // comment
+   *
+   * root.append('a {}')
+   * root.first.append('color: black; z-index: 1')
+   * ```
+   *
+   * @param nodes New nodes.
+   * @return This node for methods chain.
+   */
+  prepend(
+    ...nodes: (Node | Node[] | ChildProps | ChildProps[] | string | string[])[]
+  ): this
+
+  /**
+   * Add child to the end of the node.
+   *
+   * ```js
+   * rule.push(new Declaration({ prop: 'color', value: 'black' }))
+   * ```
+   *
+   * @param child New node.
+   * @return This node for methods chain.
+   */
+  push(child: Child): this
+
+  /**
+   * Insert new node before old node within the container.
+   *
+   * ```js
+   * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop }))
+   * ```
+   *
+   * @param oldNode Child or child’s index.
+   * @param newNode New node.
+   * @return This node for methods chain.
+   */
+  insertBefore(
+    oldNode: Child | number,
+    newNode: Child | ChildProps | string | Child[] | ChildProps[] | string[]
+  ): this
+
+  /**
+   * Insert new node after old node within the container.
+   *
+   * @param oldNode Child or child’s index.
+   * @param newNode New node.
+   * @return This node for methods chain.
+   */
+  insertAfter(
+    oldNode: Child | number,
+    newNode: Child | ChildProps | string | Child[] | ChildProps[] | string[]
+  ): this
+
+  /**
+   * Removes node from the container and cleans the parent properties
+   * from the node and its children.
+   *
+   * ```js
+   * rule.nodes.length  //=> 5
+   * rule.removeChild(decl)
+   * rule.nodes.length  //=> 4
+   * decl.parent        //=> undefined
+   * ```
+   *
+   * @param child Child or child’s index.
+   * @return This node for methods chain.
+   */
+  removeChild(child: Child | number): this
+
+  /**
+   * Removes all children from the container
+   * and cleans their parent properties.
+   *
+   * ```js
+   * rule.removeAll()
+   * rule.nodes.length //=> 0
+   * ```
+   *
+   * @return This node for methods chain.
+   */
+  removeAll(): this
+
+  /**
+   * Passes all declaration values within the container that match pattern
+   * through callback, replacing those values with the returned result
+   * of callback.
+   *
+   * This method is useful if you are using a custom unit or function
+   * and need to iterate through all values.
+   *
+   * ```js
+   * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => {
+   *   return 15 * parseInt(string) + 'px'
+   * })
+   * ```
+   *
+   * @param pattern      Replace pattern.
+   * @param {object} opts                Options to speed up the search.
+   * @param callback   String to replace pattern or callback
+   *                                     that returns a new value. The callback
+   *                                     will receive the same arguments
+   *                                     as those passed to a function parameter
+   *                                     of `String#replace`.
+   * @return This node for methods chain.
+   */
+  replaceValues(
+    pattern: string | RegExp,
+    options: ValueOptions,
+    replaced: string | { (substring: string, ...args: any[]): string }
+  ): this
+  replaceValues(
+    pattern: string | RegExp,
+    replaced: string | { (substring: string, ...args: any[]): string }
+  ): this
+
+  /**
+   * Returns `true` if callback returns `true`
+   * for all of the container’s children.
+   *
+   * ```js
+   * const noPrefixes = rule.every(i => i.prop[0] !== '-')
+   * ```
+   *
+   * @param condition Iterator returns true or false.
+   * @return Is every child pass condition.
+   */
+  every(
+    condition: (node: Child, index: number, nodes: Child[]) => boolean
+  ): boolean
+
+  /**
+   * Returns `true` if callback returns `true` for (at least) one
+   * of the container’s children.
+   *
+   * ```js
+   * const hasPrefix = rule.some(i => i.prop[0] === '-')
+   * ```
+   *
+   * @param condition Iterator returns true or false.
+   * @return Is some child pass condition.
+   */
+  some(
+    condition: (node: Child, index: number, nodes: Child[]) => boolean
+  ): boolean
+
+  /**
+   * Returns a `child`’s index within the `Container#nodes` array.
+   *
+   * ```js
+   * rule.index( rule.nodes[2] ) //=> 2
+   * ```
+   *
+   * @param child Child of the current container.
+   * @return Child index.
+   */
+  index(child: Child | number): number
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/container.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,432 @@
+'use strict'
+
+let { isClean, my } = require('./symbols')
+let Declaration = require('./declaration')
+let Comment = require('./comment')
+let Node = require('./node')
+
+let parse, Rule, AtRule
+
+function cleanSource(nodes) {
+  return nodes.map(i => {
+    if (i.nodes) i.nodes = cleanSource(i.nodes)
+    delete i.source
+    return i
+  })
+}
+
+function markDirtyUp(node) {
+  node[isClean] = false
+  if (node.proxyOf.nodes) {
+    for (let i of node.proxyOf.nodes) {
+      markDirtyUp(i)
+    }
+  }
+}
+
+class Container extends Node {
+  push(child) {
+    child.parent = this
+    this.proxyOf.nodes.push(child)
+    return this
+  }
+
+  each(callback) {
+    if (!this.proxyOf.nodes) return undefined
+    let iterator = this.getIterator()
+
+    let index, result
+    while (this.indexes[iterator] < this.proxyOf.nodes.length) {
+      index = this.indexes[iterator]
+      result = callback(this.proxyOf.nodes[index], index)
+      if (result === false) break
+
+      this.indexes[iterator] += 1
+    }
+
+    delete this.indexes[iterator]
+    return result
+  }
+
+  walk(callback) {
+    return this.each((child, i) => {
+      let result
+      try {
+        result = callback(child, i)
+      } catch (e) {
+        throw child.addToError(e)
+      }
+      if (result !== false && child.walk) {
+        result = child.walk(callback)
+      }
+
+      return result
+    })
+  }
+
+  walkDecls(prop, callback) {
+    if (!callback) {
+      callback = prop
+      return this.walk((child, i) => {
+        if (child.type === 'decl') {
+          return callback(child, i)
+        }
+      })
+    }
+    if (prop instanceof RegExp) {
+      return this.walk((child, i) => {
+        if (child.type === 'decl' && prop.test(child.prop)) {
+          return callback(child, i)
+        }
+      })
+    }
+    return this.walk((child, i) => {
+      if (child.type === 'decl' && child.prop === prop) {
+        return callback(child, i)
+      }
+    })
+  }
+
+  walkRules(selector, callback) {
+    if (!callback) {
+      callback = selector
+
+      return this.walk((child, i) => {
+        if (child.type === 'rule') {
+          return callback(child, i)
+        }
+      })
+    }
+    if (selector instanceof RegExp) {
+      return this.walk((child, i) => {
+        if (child.type === 'rule' && selector.test(child.selector)) {
+          return callback(child, i)
+        }
+      })
+    }
+    return this.walk((child, i) => {
+      if (child.type === 'rule' && child.selector === selector) {
+        return callback(child, i)
+      }
+    })
+  }
+
+  walkAtRules(name, callback) {
+    if (!callback) {
+      callback = name
+      return this.walk((child, i) => {
+        if (child.type === 'atrule') {
+          return callback(child, i)
+        }
+      })
+    }
+    if (name instanceof RegExp) {
+      return this.walk((child, i) => {
+        if (child.type === 'atrule' && name.test(child.name)) {
+          return callback(child, i)
+        }
+      })
+    }
+    return this.walk((child, i) => {
+      if (child.type === 'atrule' && child.name === name) {
+        return callback(child, i)
+      }
+    })
+  }
+
+  walkComments(callback) {
+    return this.walk((child, i) => {
+      if (child.type === 'comment') {
+        return callback(child, i)
+      }
+    })
+  }
+
+  append(...children) {
+    for (let child of children) {
+      let nodes = this.normalize(child, this.last)
+      for (let node of nodes) this.proxyOf.nodes.push(node)
+    }
+
+    this.markDirty()
+
+    return this
+  }
+
+  prepend(...children) {
+    children = children.reverse()
+    for (let child of children) {
+      let nodes = this.normalize(child, this.first, 'prepend').reverse()
+      for (let node of nodes) this.proxyOf.nodes.unshift(node)
+      for (let id in this.indexes) {
+        this.indexes[id] = this.indexes[id] + nodes.length
+      }
+    }
+
+    this.markDirty()
+
+    return this
+  }
+
+  cleanRaws(keepBetween) {
+    super.cleanRaws(keepBetween)
+    if (this.nodes) {
+      for (let node of this.nodes) node.cleanRaws(keepBetween)
+    }
+  }
+
+  insertBefore(exist, add) {
+    exist = this.index(exist)
+
+    let type = exist === 0 ? 'prepend' : false
+    let nodes = this.normalize(add, this.proxyOf.nodes[exist], type).reverse()
+    for (let node of nodes) this.proxyOf.nodes.splice(exist, 0, node)
+
+    let index
+    for (let id in this.indexes) {
+      index = this.indexes[id]
+      if (exist <= index) {
+        this.indexes[id] = index + nodes.length
+      }
+    }
+
+    this.markDirty()
+
+    return this
+  }
+
+  insertAfter(exist, add) {
+    exist = this.index(exist)
+
+    let nodes = this.normalize(add, this.proxyOf.nodes[exist]).reverse()
+    for (let node of nodes) this.proxyOf.nodes.splice(exist + 1, 0, node)
+
+    let index
+    for (let id in this.indexes) {
+      index = this.indexes[id]
+      if (exist < index) {
+        this.indexes[id] = index + nodes.length
+      }
+    }
+
+    this.markDirty()
+
+    return this
+  }
+
+  removeChild(child) {
+    child = this.index(child)
+    this.proxyOf.nodes[child].parent = undefined
+    this.proxyOf.nodes.splice(child, 1)
+
+    let index
+    for (let id in this.indexes) {
+      index = this.indexes[id]
+      if (index >= child) {
+        this.indexes[id] = index - 1
+      }
+    }
+
+    this.markDirty()
+
+    return this
+  }
+
+  removeAll() {
+    for (let node of this.proxyOf.nodes) node.parent = undefined
+    this.proxyOf.nodes = []
+
+    this.markDirty()
+
+    return this
+  }
+
+  replaceValues(pattern, opts, callback) {
+    if (!callback) {
+      callback = opts
+      opts = {}
+    }
+
+    this.walkDecls(decl => {
+      if (opts.props && !opts.props.includes(decl.prop)) return
+      if (opts.fast && !decl.value.includes(opts.fast)) return
+
+      decl.value = decl.value.replace(pattern, callback)
+    })
+
+    this.markDirty()
+
+    return this
+  }
+
+  every(condition) {
+    return this.nodes.every(condition)
+  }
+
+  some(condition) {
+    return this.nodes.some(condition)
+  }
+
+  index(child) {
+    if (typeof child === 'number') return child
+    if (child.proxyOf) child = child.proxyOf
+    return this.proxyOf.nodes.indexOf(child)
+  }
+
+  get first() {
+    if (!this.proxyOf.nodes) return undefined
+    return this.proxyOf.nodes[0]
+  }
+
+  get last() {
+    if (!this.proxyOf.nodes) return undefined
+    return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]
+  }
+
+  normalize(nodes, sample) {
+    if (typeof nodes === 'string') {
+      nodes = cleanSource(parse(nodes).nodes)
+    } else if (Array.isArray(nodes)) {
+      nodes = nodes.slice(0)
+      for (let i of nodes) {
+        if (i.parent) i.parent.removeChild(i, 'ignore')
+      }
+    } else if (nodes.type === 'root' && this.type !== 'document') {
+      nodes = nodes.nodes.slice(0)
+      for (let i of nodes) {
+        if (i.parent) i.parent.removeChild(i, 'ignore')
+      }
+    } else if (nodes.type) {
+      nodes = [nodes]
+    } else if (nodes.prop) {
+      if (typeof nodes.value === 'undefined') {
+        throw new Error('Value field is missed in node creation')
+      } else if (typeof nodes.value !== 'string') {
+        nodes.value = String(nodes.value)
+      }
+      nodes = [new Declaration(nodes)]
+    } else if (nodes.selector) {
+      nodes = [new Rule(nodes)]
+    } else if (nodes.name) {
+      nodes = [new AtRule(nodes)]
+    } else if (nodes.text) {
+      nodes = [new Comment(nodes)]
+    } else {
+      throw new Error('Unknown node type in node creation')
+    }
+
+    let processed = nodes.map(i => {
+      // istanbul ignore next
+      if (!i[my]) Container.rebuild(i)
+      i = i.proxyOf
+      if (i.parent) i.parent.removeChild(i)
+      if (i[isClean]) markDirtyUp(i)
+      if (typeof i.raws.before === 'undefined') {
+        if (sample && typeof sample.raws.before !== 'undefined') {
+          i.raws.before = sample.raws.before.replace(/\S/g, '')
+        }
+      }
+      i.parent = this
+      return i
+    })
+
+    return processed
+  }
+
+  getProxyProcessor() {
+    return {
+      set(node, prop, value) {
+        if (node[prop] === value) return true
+        node[prop] = value
+        if (prop === 'name' || prop === 'params' || prop === 'selector') {
+          node.markDirty()
+        }
+        return true
+      },
+
+      get(node, prop) {
+        if (prop === 'proxyOf') {
+          return node
+        } else if (!node[prop]) {
+          return node[prop]
+        } else if (
+          prop === 'each' ||
+          (typeof prop === 'string' && prop.startsWith('walk'))
+        ) {
+          return (...args) => {
+            return node[prop](
+              ...args.map(i => {
+                if (typeof i === 'function') {
+                  return (child, index) => i(child.toProxy(), index)
+                } else {
+                  return i
+                }
+              })
+            )
+          }
+        } else if (prop === 'every' || prop === 'some') {
+          return cb => {
+            return node[prop]((child, ...other) =>
+              cb(child.toProxy(), ...other)
+            )
+          }
+        } else if (prop === 'root') {
+          return () => node.root().toProxy()
+        } else if (prop === 'nodes') {
+          return node.nodes.map(i => i.toProxy())
+        } else if (prop === 'first' || prop === 'last') {
+          return node[prop].toProxy()
+        } else {
+          return node[prop]
+        }
+      }
+    }
+  }
+
+  getIterator() {
+    if (!this.lastEach) this.lastEach = 0
+    if (!this.indexes) this.indexes = {}
+
+    this.lastEach += 1
+    let iterator = this.lastEach
+    this.indexes[iterator] = 0
+
+    return iterator
+  }
+}
+
+Container.registerParse = dependant => {
+  parse = dependant
+}
+
+Container.registerRule = dependant => {
+  Rule = dependant
+}
+
+Container.registerAtRule = dependant => {
+  AtRule = dependant
+}
+
+module.exports = Container
+Container.default = Container
+
+// istanbul ignore next
+Container.rebuild = node => {
+  if (node.type === 'atrule') {
+    Object.setPrototypeOf(node, AtRule.prototype)
+  } else if (node.type === 'rule') {
+    Object.setPrototypeOf(node, Rule.prototype)
+  } else if (node.type === 'decl') {
+    Object.setPrototypeOf(node, Declaration.prototype)
+  } else if (node.type === 'comment') {
+    Object.setPrototypeOf(node, Comment.prototype)
+  }
+
+  node[my] = true
+
+  if (node.nodes) {
+    node.nodes.forEach(child => {
+      Container.rebuild(child)
+    })
+  }
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,192 @@
+import { FilePosition } from './input.js'
+
+/**
+ * The CSS parser throws this error for broken CSS.
+ *
+ * Custom parsers can throw this error for broken custom syntax using
+ * the `Node#error` method.
+ *
+ * PostCSS will use the input source map to detect the original error location.
+ * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS,
+ * PostCSS will show the original position in the Sass file.
+ *
+ * If you need the position in the PostCSS input
+ * (e.g., to debug the previous compiler), use `error.input.file`.
+ *
+ * ```js
+ * // Raising error from plugin
+ * throw node.error('Unknown variable', { plugin: 'postcss-vars' })
+ * ```
+ *
+ * ```js
+ * // Catching and checking syntax error
+ * try {
+ *   postcss.parse('a{')
+ * } catch (error) {
+ *   if (error.name === 'CssSyntaxError') {
+ *     error //=> CssSyntaxError
+ *   }
+ * }
+ * ```
+ */
+export default class CssSyntaxError {
+  /**
+   * @param message Error message.
+   * @param line    Source line of the error.
+   * @param column  Source column of the error.
+   * @param source  Source code of the broken file.
+   * @param file    Absolute path to the broken file.
+   * @param plugin  PostCSS plugin name, if error came from plugin.
+   */
+  constructor(
+    message: string,
+    line?: number,
+    column?: number,
+    source?: string,
+    file?: string,
+    plugin?: string
+  )
+
+  stack: string
+
+  /**
+   * Always equal to `'CssSyntaxError'`. You should always check error type
+   * by `error.name === 'CssSyntaxError'`
+   * instead of `error instanceof CssSyntaxError`,
+   * because npm could have several PostCSS versions.
+   *
+   * ```js
+   * if (error.name === 'CssSyntaxError') {
+   *   error //=> CssSyntaxError
+   * }
+   * ```
+   */
+  name: 'CssSyntaxError'
+
+  /**
+   * Error message.
+   *
+   * ```js
+   * error.message //=> 'Unclosed block'
+   * ```
+   */
+  reason: string
+
+  /**
+   * Full error text in the GNU error format
+   * with plugin, file, line and column.
+   *
+   * ```js
+   * error.message //=> 'a.css:1:1: Unclosed block'
+   * ```
+   */
+  message: string
+
+  /**
+   * Absolute path to the broken file.
+   *
+   * ```js
+   * error.file       //=> 'a.sass'
+   * error.input.file //=> 'a.css'
+   * ```
+   *
+   * PostCSS will use the input source map to detect the original location.
+   * If you need the position in the PostCSS input, use `error.input.file`.
+   */
+  file?: string
+
+  /**
+   * Source line of the error.
+   *
+   * ```js
+   * error.line       //=> 2
+   * error.input.line //=> 4
+   * ```
+   *
+   * PostCSS will use the input source map to detect the original location.
+   * If you need the position in the PostCSS input, use `error.input.line`.
+   */
+  line?: number
+
+  /**
+   * Source column of the error.
+   *
+   * ```js
+   * error.column       //=> 1
+   * error.input.column //=> 4
+   * ```
+   *
+   * PostCSS will use the input source map to detect the original location.
+   * If you need the position in the PostCSS input, use `error.input.column`.
+   */
+  column?: number
+
+  /**
+   * Source code of the broken file.
+   *
+   * ```js
+   * error.source       //=> 'a { b {} }'
+   * error.input.source //=> 'a b { }'
+   * ```
+   */
+  source?: string
+
+  /**
+   * Plugin name, if error came from plugin.
+   *
+   * ```js
+   * error.plugin //=> 'postcss-vars'
+   * ```
+   */
+  plugin?: string
+
+  /**
+   * Input object with PostCSS internal information
+   * about input file. If input has source map
+   * from previous tool, PostCSS will use origin
+   * (for example, Sass) source. You can use this
+   * object to get PostCSS input source.
+   *
+   * ```js
+   * error.input.file //=> 'a.css'
+   * error.file       //=> 'a.sass'
+   * ```
+   */
+  input?: FilePosition
+
+  /**
+   * Returns error position, message and source code of the broken part.
+   *
+   * ```js
+   * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block
+   *                  //    > 1 | a {
+   *                  //        | ^"
+   * ```
+   *
+   * @return Error position, message and source code.
+   */
+  toString(): string
+
+  /**
+   * Returns a few lines of CSS source that caused the error.
+   *
+   * If the CSS has an input source map without `sourceContent`,
+   * this method will return an empty string.
+   *
+   * ```js
+   * error.showSourceCode() //=> "  4 | }
+   *                        //      5 | a {
+   *                        //    > 6 |   bad
+   *                        //        |   ^
+   *                        //      7 | }
+   *                        //      8 | b {"
+   * ```
+   *
+   * @param color Whether arrow will be colored red by terminal
+   *              color codes. By default, PostCSS will detect
+   *              color support by `process.stdout.isTTY`
+   *              and `process.env.NODE_DISABLE_COLORS`.
+   * @return Few lines of CSS source that caused the error.
+   */
+  showSourceCode(color?: boolean): string
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/css-syntax-error.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,93 @@
+'use strict'
+
+let pico = require('picocolors')
+
+let terminalHighlight = require('./terminal-highlight')
+
+class CssSyntaxError extends Error {
+  constructor(message, line, column, source, file, plugin) {
+    super(message)
+    this.name = 'CssSyntaxError'
+    this.reason = message
+
+    if (file) {
+      this.file = file
+    }
+    if (source) {
+      this.source = source
+    }
+    if (plugin) {
+      this.plugin = plugin
+    }
+    if (typeof line !== 'undefined' && typeof column !== 'undefined') {
+      this.line = line
+      this.column = column
+    }
+
+    this.setMessage()
+
+    if (Error.captureStackTrace) {
+      Error.captureStackTrace(this, CssSyntaxError)
+    }
+  }
+
+  setMessage() {
+    this.message = this.plugin ? this.plugin + ': ' : ''
+    this.message += this.file ? this.file : '<css input>'
+    if (typeof this.line !== 'undefined') {
+      this.message += ':' + this.line + ':' + this.column
+    }
+    this.message += ': ' + this.reason
+  }
+
+  showSourceCode(color) {
+    if (!this.source) return ''
+
+    let css = this.source
+    if (color == null) color = pico.isColorSupported
+    if (terminalHighlight) {
+      if (color) css = terminalHighlight(css)
+    }
+
+    let lines = css.split(/\r?\n/)
+    let start = Math.max(this.line - 3, 0)
+    let end = Math.min(this.line + 2, lines.length)
+
+    let maxWidth = String(end).length
+
+    let mark, aside
+    if (color) {
+      let { bold, red, gray } = pico.createColors(true)
+      mark = text => bold(red(text))
+      aside = text => gray(text)
+    } else {
+      mark = aside = str => str
+    }
+
+    return lines
+      .slice(start, end)
+      .map((line, index) => {
+        let number = start + 1 + index
+        let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '
+        if (number === this.line) {
+          let spacing =
+            aside(gutter.replace(/\d/g, ' ')) +
+            line.slice(0, this.column - 1).replace(/[^\t]/g, ' ')
+          return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^')
+        }
+        return ' ' + aside(gutter) + line
+      })
+      .join('\n')
+  }
+
+  toString() {
+    let code = this.showSourceCode()
+    if (code) {
+      code = '\n\n' + code + '\n'
+    }
+    return this.name + ': ' + this.message + code
+  }
+}
+
+module.exports = CssSyntaxError
+CssSyntaxError.default = CssSyntaxError
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,124 @@
+import Container from './container.js'
+import Node from './node.js'
+
+interface DeclarationRaws {
+  /**
+   * The space symbols before the node. It also stores `*`
+   * and `_` symbols before the declaration (IE hack).
+   */
+  before?: string
+
+  /**
+   * The symbols between the property and value for declarations.
+   */
+  between?: string
+
+  /**
+   * The content of the important statement, if it is not just `!important`.
+   */
+  important?: string
+
+  /**
+   * Declaration value with comments.
+   */
+  value: {
+    value: string
+    raw: string
+  }
+}
+
+export interface DeclarationProps {
+  /** Name of the declaration. */
+  prop: string
+  /** Value of the declaration. */
+  value: string
+  /** Whether the declaration has an `!important` annotation. */
+  important?: boolean
+  /** Information used to generate byte-to-byte equal node string as it was in the origin input. */
+  raws?: DeclarationRaws
+}
+
+/**
+ * Represents a CSS declaration.
+ *
+ * ```js
+ * Once (root, { Declaration }) {
+ *   let color = new Declaration({ prop: 'color', value: 'black' })
+ *   root.append(color)
+ * }
+ * ```
+ *
+ * ```js
+ * const root = postcss.parse('a { color: black }')
+ * const decl = root.first.first
+ * decl.type       //=> 'decl'
+ * decl.toString() //=> ' color: black'
+ * ```
+ */
+export default class Declaration extends Node {
+  type: 'decl'
+  parent: Container | undefined
+  raws: DeclarationRaws
+
+  /**
+   * The declaration's property name.
+   *
+   * ```js
+   * const root = postcss.parse('a { color: black }')
+   * const decl = root.first.first
+   * decl.prop //=> 'color'
+   * ```
+   */
+  prop: string
+
+  /**
+   * The declaration’s value.
+   *
+   * This value will be cleaned of comments. If the source value contained
+   * comments, those comments will be available in the `raws` property.
+   * If you have not changed the value, the result of `decl.toString()`
+   * will include the original raws value (comments and all).
+   *
+   * ```js
+   * const root = postcss.parse('a { color: black }')
+   * const decl = root.first.first
+   * decl.value //=> 'black'
+   * ```
+   */
+  value: string
+
+  /**
+   * `true` if the declaration has an `!important` annotation.
+   *
+   * ```js
+   * const root = postcss.parse('a { color: black !important; color: red }')
+   * root.first.first.important //=> true
+   * root.first.last.important  //=> undefined
+   * ```
+   */
+  important: boolean
+
+  /**
+   * `true` if declaration is declaration of CSS Custom Property
+   * or Sass variable.
+   *
+   * ```js
+   * const root = postcss.parse(':root { --one: 1 }')
+   * let one = root.first.first
+   * one.variable //=> true
+   * ```
+   *
+   * ```js
+   * const root = postcss.parse('$one: 1')
+   * let one = root.first
+   * one.variable //=> true
+   * ```
+   */
+  variable: boolean
+
+  constructor(defaults?: DeclarationProps)
+  assign(overrides: object | DeclarationProps): this
+  clone(overrides?: Partial<DeclarationProps>): this
+  cloneBefore(overrides?: Partial<DeclarationProps>): this
+  cloneAfter(overrides?: Partial<DeclarationProps>): this
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/declaration.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,24 @@
+'use strict'
+
+let Node = require('./node')
+
+class Declaration extends Node {
+  constructor(defaults) {
+    if (
+      defaults &&
+      typeof defaults.value !== 'undefined' &&
+      typeof defaults.value !== 'string'
+    ) {
+      defaults = { ...defaults, value: String(defaults.value) }
+    }
+    super(defaults)
+    this.type = 'decl'
+  }
+
+  get variable() {
+    return this.prop.startsWith('--') || this.prop[0] === '$'
+  }
+}
+
+module.exports = Declaration
+Declaration.default = Declaration
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,57 @@
+import Container, { ContainerProps } from './container.js'
+import { ProcessOptions } from './postcss.js'
+import Result from './result.js'
+import Root, { RootProps } from './root.js'
+
+export interface DocumentProps extends ContainerProps {
+  nodes?: Root[]
+
+  /**
+   * Information to generate byte-to-byte equal node string as it was
+   * in the origin input.
+   *
+   * Every parser saves its own properties.
+   */
+  raws?: Record<string, any>
+}
+
+type ChildNode = Root
+type ChildProps = RootProps
+
+/**
+ * Represents a file and contains all its parsed nodes.
+ *
+ * **Experimental:** some aspects of this node could change within minor
+ * or patch version releases.
+ *
+ * ```js
+ * const document = htmlParser(
+ *   '<html><style>a{color:black}</style><style>b{z-index:2}</style>'
+ * )
+ * document.type         //=> 'document'
+ * document.nodes.length //=> 2
+ * ```
+ */
+export default class Document extends Container<Root> {
+  type: 'document'
+  parent: undefined
+
+  constructor(defaults?: DocumentProps)
+
+  /**
+   * Returns a `Result` instance representing the document’s CSS roots.
+   *
+   * ```js
+   * const root1 = postcss.parse(css1, { from: 'a.css' })
+   * const root2 = postcss.parse(css2, { from: 'b.css' })
+   * const document = postcss.document()
+   * document.append(root1)
+   * document.append(root2)
+   * const result = document.toResult({ to: 'all.css', map: true })
+   * ```
+   *
+   * @param opts Options.
+   * @return Result with current document’s CSS.
+   */
+  toResult(options?: ProcessOptions): Result
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/document.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,33 @@
+'use strict'
+
+let Container = require('./container')
+
+let LazyResult, Processor
+
+class Document extends Container {
+  constructor(defaults) {
+    // type needs to be passed to super, otherwise child roots won't be normalized correctly
+    super({ type: 'document', ...defaults })
+
+    if (!this.nodes) {
+      this.nodes = []
+    }
+  }
+
+  toResult(opts = {}) {
+    let lazy = new LazyResult(new Processor(), this, opts)
+
+    return lazy.stringify()
+  }
+}
+
+Document.registerLazyResult = dependant => {
+  LazyResult = dependant
+}
+
+Document.registerProcessor = dependant => {
+  Processor = dependant
+}
+
+module.exports = Document
+Document.default = Document
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,5 @@
+import { JSONHydrator } from './postcss.js'
+
+declare const fromJSON: JSONHydrator
+
+export default fromJSON
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/fromJSON.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,54 @@
+'use strict'
+
+let Declaration = require('./declaration')
+let PreviousMap = require('./previous-map')
+let Comment = require('./comment')
+let AtRule = require('./at-rule')
+let Input = require('./input')
+let Root = require('./root')
+let Rule = require('./rule')
+
+function fromJSON(json, inputs) {
+  if (Array.isArray(json)) return json.map(n => fromJSON(n))
+
+  let { inputs: ownInputs, ...defaults } = json
+  if (ownInputs) {
+    inputs = []
+    for (let input of ownInputs) {
+      let inputHydrated = { ...input, __proto__: Input.prototype }
+      if (inputHydrated.map) {
+        inputHydrated.map = {
+          ...inputHydrated.map,
+          __proto__: PreviousMap.prototype
+        }
+      }
+      inputs.push(inputHydrated)
+    }
+  }
+  if (defaults.nodes) {
+    defaults.nodes = json.nodes.map(n => fromJSON(n, inputs))
+  }
+  if (defaults.source) {
+    let { inputId, ...source } = defaults.source
+    defaults.source = source
+    if (inputId != null) {
+      defaults.source.input = inputs[inputId]
+    }
+  }
+  if (defaults.type === 'root') {
+    return new Root(defaults)
+  } else if (defaults.type === 'decl') {
+    return new Declaration(defaults)
+  } else if (defaults.type === 'rule') {
+    return new Rule(defaults)
+  } else if (defaults.type === 'comment') {
+    return new Comment(defaults)
+  } else if (defaults.type === 'atrule') {
+    return new AtRule(defaults)
+  } else {
+    throw new Error('Unknown node type: ' + json.type)
+  }
+}
+
+module.exports = fromJSON
+fromJSON.default = fromJSON
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,130 @@
+import { ProcessOptions } from './postcss.js'
+import PreviousMap from './previous-map.js'
+
+export interface FilePosition {
+  /**
+   * URL for the source file.
+   */
+  url: string
+
+  /**
+   * Absolute path to the source file.
+   */
+  file?: string
+
+  /**
+   * Line in source file.
+   */
+  line: number
+
+  /**
+   * Column in source file.
+   */
+  column: number
+
+  /**
+   * Source code.
+   */
+  source?: string
+}
+
+/**
+ * Represents the source CSS.
+ *
+ * ```js
+ * const root  = postcss.parse(css, { from: file })
+ * const input = root.source.input
+ * ```
+ */
+export default class Input {
+  /**
+   * Input CSS source.
+   *
+   * ```js
+   * const input = postcss.parse('a{}', { from: file }).input
+   * input.css //=> "a{}"
+   * ```
+   */
+  css: string
+
+  /**
+   * The input source map passed from a compilation step before PostCSS
+   * (for example, from Sass compiler).
+   *
+   * ```js
+   * root.source.input.map.consumer().sources //=> ['a.sass']
+   * ```
+   */
+  map: PreviousMap
+
+  /**
+   * The absolute path to the CSS source file defined
+   * with the `from` option.
+   *
+   * ```js
+   * const root = postcss.parse(css, { from: 'a.css' })
+   * root.source.input.file //=> '/home/ai/a.css'
+   * ```
+   */
+  file?: string
+
+  /**
+   * The unique ID of the CSS source. It will be created if `from` option
+   * is not provided (because PostCSS does not know the file path).
+   *
+   * ```js
+   * const root = postcss.parse(css)
+   * root.source.input.file //=> undefined
+   * root.source.input.id   //=> "<input css 8LZeVF>"
+   * ```
+   */
+  id?: string
+
+  /**
+   * The flag to indicate whether or not the source code has Unicode BOM.
+   */
+  hasBOM: boolean
+
+  /**
+   * @param css  Input CSS source.
+   * @param opts Process options.
+   */
+  constructor(css: string, opts?: ProcessOptions)
+
+  /**
+   * The CSS source identifier. Contains `Input#file` if the user
+   * set the `from` option, or `Input#id` if they did not.
+   *
+   * ```js
+   * const root = postcss.parse(css, { from: 'a.css' })
+   * root.source.input.from //=> "/home/ai/a.css"
+   *
+   * const root = postcss.parse(css)
+   * root.source.input.from //=> "<input css 1>"
+   * ```
+   */
+  get from(): string
+
+  /**
+   * Reads the input source map and returns a symbol position
+   * in the input source (e.g., in a Sass file that was compiled
+   * to CSS before being passed to PostCSS).
+   *
+   * ```js
+   * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 }
+   * ```
+   *
+   * @param line   Line in input CSS.
+   * @param column Column in input CSS.
+   *
+   * @return Position in input source.
+   */
+  origin(line: number, column: number): FilePosition | false
+
+  /**
+   * Converts source offset to line and column.
+   *
+   * @param offset Source offset.
+   */
+  fromOffset(offset: number): { line: number; col: number } | null
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/input.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,216 @@
+'use strict'
+
+let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')
+let { fileURLToPath, pathToFileURL } = require('url')
+let { resolve, isAbsolute } = require('path')
+let { nanoid } = require('nanoid/non-secure')
+
+let terminalHighlight = require('./terminal-highlight')
+let CssSyntaxError = require('./css-syntax-error')
+let PreviousMap = require('./previous-map')
+
+let fromOffsetCache = Symbol('fromOffsetCache')
+
+let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)
+let pathAvailable = Boolean(resolve && isAbsolute)
+
+class Input {
+  constructor(css, opts = {}) {
+    if (
+      css === null ||
+      typeof css === 'undefined' ||
+      (typeof css === 'object' && !css.toString)
+    ) {
+      throw new Error(`PostCSS received ${css} instead of CSS string`)
+    }
+
+    this.css = css.toString()
+
+    if (this.css[0] === '\uFEFF' || this.css[0] === '\uFFFE') {
+      this.hasBOM = true
+      this.css = this.css.slice(1)
+    } else {
+      this.hasBOM = false
+    }
+
+    if (opts.from) {
+      if (
+        !pathAvailable ||
+        /^\w+:\/\//.test(opts.from) ||
+        isAbsolute(opts.from)
+      ) {
+        this.file = opts.from
+      } else {
+        this.file = resolve(opts.from)
+      }
+    }
+
+    if (pathAvailable && sourceMapAvailable) {
+      let map = new PreviousMap(this.css, opts)
+      if (map.text) {
+        this.map = map
+        let file = map.consumer().file
+        if (!this.file && file) this.file = this.mapResolve(file)
+      }
+    }
+
+    if (!this.file) {
+      this.id = '<input css ' + nanoid(6) + '>'
+    }
+    if (this.map) this.map.file = this.from
+  }
+
+  fromOffset(offset) {
+    let lastLine, lineToIndex
+    if (!this[fromOffsetCache]) {
+      let lines = this.css.split('\n')
+      lineToIndex = new Array(lines.length)
+      let prevIndex = 0
+
+      for (let i = 0, l = lines.length; i < l; i++) {
+        lineToIndex[i] = prevIndex
+        prevIndex += lines[i].length + 1
+      }
+
+      this[fromOffsetCache] = lineToIndex
+    } else {
+      lineToIndex = this[fromOffsetCache]
+    }
+    lastLine = lineToIndex[lineToIndex.length - 1]
+
+    let min = 0
+    if (offset >= lastLine) {
+      min = lineToIndex.length - 1
+    } else {
+      let max = lineToIndex.length - 2
+      let mid
+      while (min < max) {
+        mid = min + ((max - min) >> 1)
+        if (offset < lineToIndex[mid]) {
+          max = mid - 1
+        } else if (offset >= lineToIndex[mid + 1]) {
+          min = mid + 1
+        } else {
+          min = mid
+          break
+        }
+      }
+    }
+    return {
+      line: min + 1,
+      col: offset - lineToIndex[min] + 1
+    }
+  }
+
+  error(message, line, column, opts = {}) {
+    let result
+    if (!column) {
+      let pos = this.fromOffset(line)
+      line = pos.line
+      column = pos.col
+    }
+    let origin = this.origin(line, column)
+    if (origin) {
+      result = new CssSyntaxError(
+        message,
+        origin.line,
+        origin.column,
+        origin.source,
+        origin.file,
+        opts.plugin
+      )
+    } else {
+      result = new CssSyntaxError(
+        message,
+        line,
+        column,
+        this.css,
+        this.file,
+        opts.plugin
+      )
+    }
+
+    result.input = { line, column, source: this.css }
+    if (this.file) {
+      if (pathToFileURL) {
+        result.input.url = pathToFileURL(this.file).toString()
+      }
+      result.input.file = this.file
+    }
+
+    return result
+  }
+
+  origin(line, column) {
+    if (!this.map) return false
+    let consumer = this.map.consumer()
+
+    let from = consumer.originalPositionFor({ line, column })
+    if (!from.source) return false
+
+    let fromUrl
+
+    if (isAbsolute(from.source)) {
+      fromUrl = pathToFileURL(from.source)
+    } else {
+      fromUrl = new URL(
+        from.source,
+        this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)
+      )
+    }
+
+    let result = {
+      url: fromUrl.toString(),
+      line: from.line,
+      column: from.column
+    }
+
+    if (fromUrl.protocol === 'file:') {
+      if (fileURLToPath) {
+        result.file = fileURLToPath(fromUrl)
+      } else {
+        // istanbul ignore next
+        throw new Error(`file: protocol is not available in this PostCSS build`)
+      }
+    }
+
+    let source = consumer.sourceContentFor(from.source)
+    if (source) result.source = source
+
+    return result
+  }
+
+  mapResolve(file) {
+    if (/^\w+:\/\//.test(file)) {
+      return file
+    }
+    return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)
+  }
+
+  get from() {
+    return this.file || this.id
+  }
+
+  toJSON() {
+    let json = {}
+    for (let name of ['hasBOM', 'css', 'file', 'id']) {
+      if (this[name] != null) {
+        json[name] = this[name]
+      }
+    }
+    if (this.map) {
+      json.map = { ...this.map }
+      if (json.map.consumerCache) {
+        json.map.consumerCache = undefined
+      }
+    }
+    return json
+  }
+}
+
+module.exports = Input
+Input.default = Input
+
+if (terminalHighlight && terminalHighlight.registerInput) {
+  terminalHighlight.registerInput(Input)
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,175 @@
+import Result, { Message, ResultOptions } from './result.js'
+import { SourceMap } from './postcss.js'
+import Processor from './processor.js'
+import Warning from './warning.js'
+import Root from './root.js'
+
+/**
+ * A Promise proxy for the result of PostCSS transformations.
+ *
+ * A `LazyResult` instance is returned by `Processor#process`.
+ *
+ * ```js
+ * const lazy = postcss([autoprefixer]).process(css)
+ * ```
+ */
+export default class LazyResult implements PromiseLike<Result> {
+  /**
+   * Processes input CSS through synchronous and asynchronous plugins
+   * and calls `onFulfilled` with a Result instance. If a plugin throws
+   * an error, the `onRejected` callback will be executed.
+   *
+   * It implements standard Promise API.
+   *
+   * ```js
+   * postcss([autoprefixer]).process(css, { from: cssPath }).then(result => {
+   *   console.log(result.css)
+   * })
+   * ```
+   */
+  then: Promise<Result>['then']
+
+  /**
+   * Processes input CSS through synchronous and asynchronous plugins
+   * and calls onRejected for each error thrown in any plugin.
+   *
+   * It implements standard Promise API.
+   *
+   * ```js
+   * postcss([autoprefixer]).process(css).then(result => {
+   *   console.log(result.css)
+   * }).catch(error => {
+   *   console.error(error)
+   * })
+   * ```
+   */
+  catch: Promise<Result>['catch']
+
+  /**
+   * Processes input CSS through synchronous and asynchronous plugins
+   * and calls onFinally on any error or when all plugins will finish work.
+   *
+   * It implements standard Promise API.
+   *
+   * ```js
+   * postcss([autoprefixer]).process(css).finally(() => {
+   *   console.log('processing ended')
+   * })
+   * ```
+   */
+  finally: Promise<Result>['finally']
+
+  /**
+   * @param processor Processor used for this transformation.
+   * @param css       CSS to parse and transform.
+   * @param opts      Options from the `Processor#process` or `Root#toResult`.
+   */
+  constructor(processor: Processor, css: string, opts: ResultOptions)
+
+  /**
+   * Returns the default string description of an object.
+   * Required to implement the Promise interface.
+   */
+  get [Symbol.toStringTag](): string
+
+  /**
+   * Returns a `Processor` instance, which will be used
+   * for CSS transformations.
+   */
+  get processor(): Processor
+
+  /**
+   * Options from the `Processor#process` call.
+   */
+  get opts(): ResultOptions
+
+  /**
+   * Processes input CSS through synchronous plugins, converts `Root`
+   * to a CSS string and returns `Result#css`.
+   *
+   * This property will only work with synchronous plugins.
+   * If the processor contains any asynchronous plugins
+   * it will throw an error. This is why this method is only
+   * for debug purpose, you should always use `LazyResult#then`.
+   */
+  get css(): string
+
+  /**
+   * An alias for the `css` property. Use it with syntaxes
+   * that generate non-CSS output.
+   *
+   * This property will only work with synchronous plugins.
+   * If the processor contains any asynchronous plugins
+   * it will throw an error. This is why this method is only
+   * for debug purpose, you should always use `LazyResult#then`.
+   */
+  get content(): string
+
+  /**
+   * Processes input CSS through synchronous plugins
+   * and returns `Result#map`.
+   *
+   * This property will only work with synchronous plugins.
+   * If the processor contains any asynchronous plugins
+   * it will throw an error. This is why this method is only
+   * for debug purpose, you should always use `LazyResult#then`.
+   */
+  get map(): SourceMap
+
+  /**
+   * Processes input CSS through synchronous plugins
+   * and returns `Result#root`.
+   *
+   * This property will only work with synchronous plugins. If the processor
+   * contains any asynchronous plugins it will throw an error.
+   *
+   * This is why this method is only for debug purpose,
+   * you should always use `LazyResult#then`.
+   */
+  get root(): Root
+
+  /**
+   * Processes input CSS through synchronous plugins
+   * and returns `Result#messages`.
+   *
+   * This property will only work with synchronous plugins. If the processor
+   * contains any asynchronous plugins it will throw an error.
+   *
+   * This is why this method is only for debug purpose,
+   * you should always use `LazyResult#then`.
+   */
+  get messages(): Message[]
+
+  /**
+   * Processes input CSS through synchronous plugins
+   * and calls `Result#warnings`.
+   *
+   * @return Warnings from plugins.
+   */
+  warnings(): Warning[]
+
+  /**
+   * Alias for the `LazyResult#css` property.
+   *
+   * ```js
+   * lazy + '' === lazy.css
+   * ```
+   *
+   * @return Output CSS.
+   */
+  toString(): string
+
+  /**
+   * Run plugin in sync way and return `Result`.
+   *
+   * @return Result with output content.
+   */
+  sync(): Result
+
+  /**
+   * Run plugin in async way and return `Result`.
+   *
+   * @return Result with output content.
+   */
+  async(): Promise<Result>
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/lazy-result.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,548 @@
+'use strict'
+
+let { isClean, my } = require('./symbols')
+let MapGenerator = require('./map-generator')
+let stringify = require('./stringify')
+let Container = require('./container')
+let Document = require('./document')
+let warnOnce = require('./warn-once')
+let Result = require('./result')
+let parse = require('./parse')
+let Root = require('./root')
+
+const TYPE_TO_CLASS_NAME = {
+  document: 'Document',
+  root: 'Root',
+  atrule: 'AtRule',
+  rule: 'Rule',
+  decl: 'Declaration',
+  comment: 'Comment'
+}
+
+const PLUGIN_PROPS = {
+  postcssPlugin: true,
+  prepare: true,
+  Once: true,
+  Document: true,
+  Root: true,
+  Declaration: true,
+  Rule: true,
+  AtRule: true,
+  Comment: true,
+  DeclarationExit: true,
+  RuleExit: true,
+  AtRuleExit: true,
+  CommentExit: true,
+  RootExit: true,
+  DocumentExit: true,
+  OnceExit: true
+}
+
+const NOT_VISITORS = {
+  postcssPlugin: true,
+  prepare: true,
+  Once: true
+}
+
+const CHILDREN = 0
+
+function isPromise(obj) {
+  return typeof obj === 'object' && typeof obj.then === 'function'
+}
+
+function getEvents(node) {
+  let key = false
+  let type = TYPE_TO_CLASS_NAME[node.type]
+  if (node.type === 'decl') {
+    key = node.prop.toLowerCase()
+  } else if (node.type === 'atrule') {
+    key = node.name.toLowerCase()
+  }
+
+  if (key && node.append) {
+    return [
+      type,
+      type + '-' + key,
+      CHILDREN,
+      type + 'Exit',
+      type + 'Exit-' + key
+    ]
+  } else if (key) {
+    return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]
+  } else if (node.append) {
+    return [type, CHILDREN, type + 'Exit']
+  } else {
+    return [type, type + 'Exit']
+  }
+}
+
+function toStack(node) {
+  let events
+  if (node.type === 'document') {
+    events = ['Document', CHILDREN, 'DocumentExit']
+  } else if (node.type === 'root') {
+    events = ['Root', CHILDREN, 'RootExit']
+  } else {
+    events = getEvents(node)
+  }
+
+  return {
+    node,
+    events,
+    eventIndex: 0,
+    visitors: [],
+    visitorIndex: 0,
+    iterator: 0
+  }
+}
+
+function cleanMarks(node) {
+  node[isClean] = false
+  if (node.nodes) node.nodes.forEach(i => cleanMarks(i))
+  return node
+}
+
+let postcss = {}
+
+class LazyResult {
+  constructor(processor, css, opts) {
+    this.stringified = false
+    this.processed = false
+
+    let root
+    if (
+      typeof css === 'object' &&
+      css !== null &&
+      (css.type === 'root' || css.type === 'document')
+    ) {
+      root = cleanMarks(css)
+    } else if (css instanceof LazyResult || css instanceof Result) {
+      root = cleanMarks(css.root)
+      if (css.map) {
+        if (typeof opts.map === 'undefined') opts.map = {}
+        if (!opts.map.inline) opts.map.inline = false
+        opts.map.prev = css.map
+      }
+    } else {
+      let parser = parse
+      if (opts.syntax) parser = opts.syntax.parse
+      if (opts.parser) parser = opts.parser
+      if (parser.parse) parser = parser.parse
+
+      try {
+        root = parser(css, opts)
+      } catch (error) {
+        this.processed = true
+        this.error = error
+      }
+
+      if (root && !root[my]) {
+        // istanbul ignore next
+        Container.rebuild(root)
+      }
+    }
+
+    this.result = new Result(processor, root, opts)
+    this.helpers = { ...postcss, result: this.result, postcss }
+    this.plugins = this.processor.plugins.map(plugin => {
+      if (typeof plugin === 'object' && plugin.prepare) {
+        return { ...plugin, ...plugin.prepare(this.result) }
+      } else {
+        return plugin
+      }
+    })
+  }
+
+  get [Symbol.toStringTag]() {
+    return 'LazyResult'
+  }
+
+  get processor() {
+    return this.result.processor
+  }
+
+  get opts() {
+    return this.result.opts
+  }
+
+  get css() {
+    return this.stringify().css
+  }
+
+  get content() {
+    return this.stringify().content
+  }
+
+  get map() {
+    return this.stringify().map
+  }
+
+  get root() {
+    return this.sync().root
+  }
+
+  get messages() {
+    return this.sync().messages
+  }
+
+  warnings() {
+    return this.sync().warnings()
+  }
+
+  toString() {
+    return this.css
+  }
+
+  then(onFulfilled, onRejected) {
+    if (process.env.NODE_ENV !== 'production') {
+      if (!('from' in this.opts)) {
+        warnOnce(
+          'Without `from` option PostCSS could generate wrong source map ' +
+            'and will not find Browserslist config. Set it to CSS file path ' +
+            'or to `undefined` to prevent this warning.'
+        )
+      }
+    }
+    return this.async().then(onFulfilled, onRejected)
+  }
+
+  catch(onRejected) {
+    return this.async().catch(onRejected)
+  }
+
+  finally(onFinally) {
+    return this.async().then(onFinally, onFinally)
+  }
+
+  async() {
+    if (this.error) return Promise.reject(this.error)
+    if (this.processed) return Promise.resolve(this.result)
+    if (!this.processing) {
+      this.processing = this.runAsync()
+    }
+    return this.processing
+  }
+
+  sync() {
+    if (this.error) throw this.error
+    if (this.processed) return this.result
+    this.processed = true
+
+    if (this.processing) {
+      throw this.getAsyncError()
+    }
+
+    for (let plugin of this.plugins) {
+      let promise = this.runOnRoot(plugin)
+      if (isPromise(promise)) {
+        throw this.getAsyncError()
+      }
+    }
+
+    this.prepareVisitors()
+    if (this.hasListener) {
+      let root = this.result.root
+      while (!root[isClean]) {
+        root[isClean] = true
+        this.walkSync(root)
+      }
+      if (this.listeners.OnceExit) {
+        if (root.type === 'document') {
+          for (let subRoot of root.nodes) {
+            this.visitSync(this.listeners.OnceExit, subRoot)
+          }
+        } else {
+          this.visitSync(this.listeners.OnceExit, root)
+        }
+      }
+    }
+
+    return this.result
+  }
+
+  stringify() {
+    if (this.error) throw this.error
+    if (this.stringified) return this.result
+    this.stringified = true
+
+    this.sync()
+
+    let opts = this.result.opts
+    let str = stringify
+    if (opts.syntax) str = opts.syntax.stringify
+    if (opts.stringifier) str = opts.stringifier
+    if (str.stringify) str = str.stringify
+
+    let map = new MapGenerator(str, this.result.root, this.result.opts)
+    let data = map.generate()
+    this.result.css = data[0]
+    this.result.map = data[1]
+
+    return this.result
+  }
+
+  walkSync(node) {
+    node[isClean] = true
+    let events = getEvents(node)
+    for (let event of events) {
+      if (event === CHILDREN) {
+        if (node.nodes) {
+          node.each(child => {
+            if (!child[isClean]) this.walkSync(child)
+          })
+        }
+      } else {
+        let visitors = this.listeners[event]
+        if (visitors) {
+          if (this.visitSync(visitors, node.toProxy())) return
+        }
+      }
+    }
+  }
+
+  visitSync(visitors, node) {
+    for (let [plugin, visitor] of visitors) {
+      this.result.lastPlugin = plugin
+      let promise
+      try {
+        promise = visitor(node, this.helpers)
+      } catch (e) {
+        throw this.handleError(e, node.proxyOf)
+      }
+      if (node.type !== 'root' && node.type !== 'document' && !node.parent) {
+        return true
+      }
+      if (isPromise(promise)) {
+        throw this.getAsyncError()
+      }
+    }
+  }
+
+  runOnRoot(plugin) {
+    this.result.lastPlugin = plugin
+    try {
+      if (typeof plugin === 'object' && plugin.Once) {
+        if (this.result.root.type === 'document') {
+          let roots = this.result.root.nodes.map(root =>
+            plugin.Once(root, this.helpers)
+          )
+
+          if (isPromise(roots[0])) {
+            return Promise.all(roots)
+          }
+
+          return roots
+        }
+
+        return plugin.Once(this.result.root, this.helpers)
+      } else if (typeof plugin === 'function') {
+        return plugin(this.result.root, this.result)
+      }
+    } catch (error) {
+      throw this.handleError(error)
+    }
+  }
+
+  getAsyncError() {
+    throw new Error('Use process(css).then(cb) to work with async plugins')
+  }
+
+  handleError(error, node) {
+    let plugin = this.result.lastPlugin
+    try {
+      if (node) node.addToError(error)
+      this.error = error
+      if (error.name === 'CssSyntaxError' && !error.plugin) {
+        error.plugin = plugin.postcssPlugin
+        error.setMessage()
+      } else if (plugin.postcssVersion) {
+        if (process.env.NODE_ENV !== 'production') {
+          let pluginName = plugin.postcssPlugin
+          let pluginVer = plugin.postcssVersion
+          let runtimeVer = this.result.processor.version
+          let a = pluginVer.split('.')
+          let b = runtimeVer.split('.')
+
+          if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {
+            console.error(
+              'Unknown error from PostCSS plugin. Your current PostCSS ' +
+                'version is ' +
+                runtimeVer +
+                ', but ' +
+                pluginName +
+                ' uses ' +
+                pluginVer +
+                '. Perhaps this is the source of the error below.'
+            )
+          }
+        }
+      }
+    } catch (err) {
+      // istanbul ignore next
+      if (console && console.error) console.error(err)
+    }
+    return error
+  }
+
+  async runAsync() {
+    this.plugin = 0
+    for (let i = 0; i < this.plugins.length; i++) {
+      let plugin = this.plugins[i]
+      let promise = this.runOnRoot(plugin)
+      if (isPromise(promise)) {
+        try {
+          await promise
+        } catch (error) {
+          throw this.handleError(error)
+        }
+      }
+    }
+
+    this.prepareVisitors()
+    if (this.hasListener) {
+      let root = this.result.root
+      while (!root[isClean]) {
+        root[isClean] = true
+        let stack = [toStack(root)]
+        while (stack.length > 0) {
+          let promise = this.visitTick(stack)
+          if (isPromise(promise)) {
+            try {
+              await promise
+            } catch (e) {
+              let node = stack[stack.length - 1].node
+              throw this.handleError(e, node)
+            }
+          }
+        }
+      }
+
+      if (this.listeners.OnceExit) {
+        for (let [plugin, visitor] of this.listeners.OnceExit) {
+          this.result.lastPlugin = plugin
+          try {
+            if (root.type === 'document') {
+              let roots = root.nodes.map(subRoot =>
+                visitor(subRoot, this.helpers)
+              )
+
+              await Promise.all(roots)
+            } else {
+              await visitor(root, this.helpers)
+            }
+          } catch (e) {
+            throw this.handleError(e)
+          }
+        }
+      }
+    }
+
+    this.processed = true
+    return this.stringify()
+  }
+
+  prepareVisitors() {
+    this.listeners = {}
+    let add = (plugin, type, cb) => {
+      if (!this.listeners[type]) this.listeners[type] = []
+      this.listeners[type].push([plugin, cb])
+    }
+    for (let plugin of this.plugins) {
+      if (typeof plugin === 'object') {
+        for (let event in plugin) {
+          if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {
+            throw new Error(
+              `Unknown event ${event} in ${plugin.postcssPlugin}. ` +
+                `Try to update PostCSS (${this.processor.version} now).`
+            )
+          }
+          if (!NOT_VISITORS[event]) {
+            if (typeof plugin[event] === 'object') {
+              for (let filter in plugin[event]) {
+                if (filter === '*') {
+                  add(plugin, event, plugin[event][filter])
+                } else {
+                  add(
+                    plugin,
+                    event + '-' + filter.toLowerCase(),
+                    plugin[event][filter]
+                  )
+                }
+              }
+            } else if (typeof plugin[event] === 'function') {
+              add(plugin, event, plugin[event])
+            }
+          }
+        }
+      }
+    }
+    this.hasListener = Object.keys(this.listeners).length > 0
+  }
+
+  visitTick(stack) {
+    let visit = stack[stack.length - 1]
+    let { node, visitors } = visit
+
+    if (node.type !== 'root' && node.type !== 'document' && !node.parent) {
+      stack.pop()
+      return
+    }
+
+    if (visitors.length > 0 && visit.visitorIndex < visitors.length) {
+      let [plugin, visitor] = visitors[visit.visitorIndex]
+      visit.visitorIndex += 1
+      if (visit.visitorIndex === visitors.length) {
+        visit.visitors = []
+        visit.visitorIndex = 0
+      }
+      this.result.lastPlugin = plugin
+      try {
+        return visitor(node.toProxy(), this.helpers)
+      } catch (e) {
+        throw this.handleError(e, node)
+      }
+    }
+
+    if (visit.iterator !== 0) {
+      let iterator = visit.iterator
+      let child
+      while ((child = node.nodes[node.indexes[iterator]])) {
+        node.indexes[iterator] += 1
+        if (!child[isClean]) {
+          child[isClean] = true
+          stack.push(toStack(child))
+          return
+        }
+      }
+      visit.iterator = 0
+      delete node.indexes[iterator]
+    }
+
+    let events = visit.events
+    while (visit.eventIndex < events.length) {
+      let event = events[visit.eventIndex]
+      visit.eventIndex += 1
+      if (event === CHILDREN) {
+        if (node.nodes && node.nodes.length) {
+          node[isClean] = true
+          visit.iterator = node.getIterator()
+        }
+        return
+      } else if (this.listeners[event]) {
+        visit.visitors = this.listeners[event]
+        return
+      }
+    }
+    stack.pop()
+  }
+}
+
+LazyResult.registerPostcss = dependant => {
+  postcss = dependant
+}
+
+module.exports = LazyResult
+LazyResult.default = LazyResult
+
+Root.registerLazyResult(LazyResult)
+Document.registerLazyResult(LazyResult)
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,51 @@
+export type List = {
+  /**
+   * Safely splits values.
+   *
+   * ```js
+   * Once (root, { list }) {
+   *   list.split('1px calc(10% + 1px)', [' ', '\n', '\t']) //=> ['1px', 'calc(10% + 1px)']
+   * }
+   * ```
+   *
+   * @param string separated values.
+   * @param separators array of separators.
+   * @param last boolean indicator.
+   * @return Split values.
+   */
+  split(string: string, separators: string[], last: boolean): string[]
+  /**
+   * Safely splits space-separated values (such as those for `background`,
+   * `border-radius`, and other shorthand properties).
+   *
+   * ```js
+   * Once (root, { list }) {
+   *   list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)']
+   * }
+   * ```
+   *
+   * @param str Space-separated values.
+   * @return Split values.
+   */
+  space(str: string): string[]
+
+  /**
+   * Safely splits comma-separated values (such as those for `transition-*`
+   * and `background` properties).
+   *
+   * ```js
+   * Once (root, { list }) {
+   *   list.comma('black, linear-gradient(white, black)')
+   *   //=> ['black', 'linear-gradient(white, black)']
+   * }
+   * ```
+   *
+   * @param str Comma-separated values.
+   * @return Split values.
+   */
+  comma(str: string): string[]
+}
+
+declare const list: List
+
+export default list
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/list.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,56 @@
+'use strict'
+
+let list = {
+  split(string, separators, last) {
+    let array = []
+    let current = ''
+    let split = false
+
+    let func = 0
+    let quote = false
+    let escape = false
+
+    for (let letter of string) {
+      if (escape) {
+        escape = false
+      } else if (letter === '\\') {
+        escape = true
+      } else if (quote) {
+        if (letter === quote) {
+          quote = false
+        }
+      } else if (letter === '"' || letter === "'") {
+        quote = letter
+      } else if (letter === '(') {
+        func += 1
+      } else if (letter === ')') {
+        if (func > 0) func -= 1
+      } else if (func === 0) {
+        if (separators.includes(letter)) split = true
+      }
+
+      if (split) {
+        if (current !== '') array.push(current.trim())
+        current = ''
+        split = false
+      } else {
+        current += letter
+      }
+    }
+
+    if (last || current !== '') array.push(current.trim())
+    return array
+  },
+
+  space(string) {
+    let spaces = [' ', '\n', '\t']
+    return list.split(string, spaces)
+  },
+
+  comma(string) {
+    return list.split(string, [','], true)
+  }
+}
+
+module.exports = list
+list.default = list
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/map-generator.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/map-generator.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/map-generator.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,300 @@
+'use strict'
+
+let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')
+let { dirname, resolve, relative, sep } = require('path')
+let { pathToFileURL } = require('url')
+
+let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)
+let pathAvailable = Boolean(dirname && resolve && relative && sep)
+
+class MapGenerator {
+  constructor(stringify, root, opts) {
+    this.stringify = stringify
+    this.mapOpts = opts.map || {}
+    this.root = root
+    this.opts = opts
+  }
+
+  isMap() {
+    if (typeof this.opts.map !== 'undefined') {
+      return !!this.opts.map
+    }
+    return this.previous().length > 0
+  }
+
+  previous() {
+    if (!this.previousMaps) {
+      this.previousMaps = []
+      this.root.walk(node => {
+        if (node.source && node.source.input.map) {
+          let map = node.source.input.map
+          if (!this.previousMaps.includes(map)) {
+            this.previousMaps.push(map)
+          }
+        }
+      })
+    }
+
+    return this.previousMaps
+  }
+
+  isInline() {
+    if (typeof this.mapOpts.inline !== 'undefined') {
+      return this.mapOpts.inline
+    }
+
+    let annotation = this.mapOpts.annotation
+    if (typeof annotation !== 'undefined' && annotation !== true) {
+      return false
+    }
+
+    if (this.previous().length) {
+      return this.previous().some(i => i.inline)
+    }
+    return true
+  }
+
+  isSourcesContent() {
+    if (typeof this.mapOpts.sourcesContent !== 'undefined') {
+      return this.mapOpts.sourcesContent
+    }
+    if (this.previous().length) {
+      return this.previous().some(i => i.withContent())
+    }
+    return true
+  }
+
+  clearAnnotation() {
+    if (this.mapOpts.annotation === false) return
+
+    let node
+    for (let i = this.root.nodes.length - 1; i >= 0; i--) {
+      node = this.root.nodes[i]
+      if (node.type !== 'comment') continue
+      if (node.text.indexOf('# sourceMappingURL=') === 0) {
+        this.root.removeChild(i)
+      }
+    }
+  }
+
+  setSourcesContent() {
+    let already = {}
+    this.root.walk(node => {
+      if (node.source) {
+        let from = node.source.input.from
+        if (from && !already[from]) {
+          already[from] = true
+          this.map.setSourceContent(
+            this.toUrl(this.path(from)),
+            node.source.input.css
+          )
+        }
+      }
+    })
+  }
+
+  applyPrevMaps() {
+    for (let prev of this.previous()) {
+      let from = this.toUrl(this.path(prev.file))
+      let root = prev.root || dirname(prev.file)
+      let map
+
+      if (this.mapOpts.sourcesContent === false) {
+        map = new SourceMapConsumer(prev.text)
+        if (map.sourcesContent) {
+          map.sourcesContent = map.sourcesContent.map(() => null)
+        }
+      } else {
+        map = prev.consumer()
+      }
+
+      this.map.applySourceMap(map, from, this.toUrl(this.path(root)))
+    }
+  }
+
+  isAnnotation() {
+    if (this.isInline()) {
+      return true
+    }
+    if (typeof this.mapOpts.annotation !== 'undefined') {
+      return this.mapOpts.annotation
+    }
+    if (this.previous().length) {
+      return this.previous().some(i => i.annotation)
+    }
+    return true
+  }
+
+  toBase64(str) {
+    if (Buffer) {
+      return Buffer.from(str).toString('base64')
+    } else {
+      // istanbul ignore next
+      return window.btoa(unescape(encodeURIComponent(str)))
+    }
+  }
+
+  addAnnotation() {
+    let content
+
+    if (this.isInline()) {
+      content =
+        'data:application/json;base64,' + this.toBase64(this.map.toString())
+    } else if (typeof this.mapOpts.annotation === 'string') {
+      content = this.mapOpts.annotation
+    } else if (typeof this.mapOpts.annotation === 'function') {
+      content = this.mapOpts.annotation(this.opts.to, this.root)
+    } else {
+      content = this.outputFile() + '.map'
+    }
+
+    let eol = '\n'
+    if (this.css.includes('\r\n')) eol = '\r\n'
+
+    this.css += eol + '/*# sourceMappingURL=' + content + ' */'
+  }
+
+  outputFile() {
+    if (this.opts.to) {
+      return this.path(this.opts.to)
+    }
+    if (this.opts.from) {
+      return this.path(this.opts.from)
+    }
+    return 'to.css'
+  }
+
+  generateMap() {
+    this.generateString()
+    if (this.isSourcesContent()) this.setSourcesContent()
+    if (this.previous().length > 0) this.applyPrevMaps()
+    if (this.isAnnotation()) this.addAnnotation()
+
+    if (this.isInline()) {
+      return [this.css]
+    }
+    return [this.css, this.map]
+  }
+
+  path(file) {
+    if (file.indexOf('<') === 0) return file
+    if (/^\w+:\/\//.test(file)) return file
+    if (this.mapOpts.absolute) return file
+
+    let from = this.opts.to ? dirname(this.opts.to) : '.'
+
+    if (typeof this.mapOpts.annotation === 'string') {
+      from = dirname(resolve(from, this.mapOpts.annotation))
+    }
+
+    file = relative(from, file)
+    return file
+  }
+
+  toUrl(path) {
+    if (sep === '\\') {
+      // istanbul ignore next
+      path = path.replace(/\\/g, '/')
+    }
+    return encodeURI(path).replace(/[#?]/g, encodeURIComponent)
+  }
+
+  sourcePath(node) {
+    if (this.mapOpts.from) {
+      return this.toUrl(this.mapOpts.from)
+    } else if (this.mapOpts.absolute) {
+      if (pathToFileURL) {
+        return pathToFileURL(node.source.input.from).toString()
+      } else {
+        // istanbul ignore next
+        throw new Error(
+          '`map.absolute` option is not available in this PostCSS build'
+        )
+      }
+    } else {
+      return this.toUrl(this.path(node.source.input.from))
+    }
+  }
+
+  generateString() {
+    this.css = ''
+    this.map = new SourceMapGenerator({ file: this.outputFile() })
+
+    let line = 1
+    let column = 1
+
+    let noSource = '<no source>'
+    let mapping = {
+      source: '',
+      generated: { line: 0, column: 0 },
+      original: { line: 0, column: 0 }
+    }
+
+    let lines, last
+    this.stringify(this.root, (str, node, type) => {
+      this.css += str
+
+      if (node && type !== 'end') {
+        mapping.generated.line = line
+        mapping.generated.column = column - 1
+        if (node.source && node.source.start) {
+          mapping.source = this.sourcePath(node)
+          mapping.original.line = node.source.start.line
+          mapping.original.column = node.source.start.column - 1
+          this.map.addMapping(mapping)
+        } else {
+          mapping.source = noSource
+          mapping.original.line = 1
+          mapping.original.column = 0
+          this.map.addMapping(mapping)
+        }
+      }
+
+      lines = str.match(/\n/g)
+      if (lines) {
+        line += lines.length
+        last = str.lastIndexOf('\n')
+        column = str.length - last
+      } else {
+        column += str.length
+      }
+
+      if (node && type !== 'start') {
+        let p = node.parent || { raws: {} }
+        if (node.type !== 'decl' || node !== p.last || p.raws.semicolon) {
+          if (node.source && node.source.end) {
+            mapping.source = this.sourcePath(node)
+            mapping.original.line = node.source.end.line
+            mapping.original.column = node.source.end.column - 1
+            mapping.generated.line = line
+            mapping.generated.column = column - 2
+            this.map.addMapping(mapping)
+          } else {
+            mapping.source = noSource
+            mapping.original.line = 1
+            mapping.original.column = 0
+            mapping.generated.line = line
+            mapping.generated.column = column - 1
+            this.map.addMapping(mapping)
+          }
+        }
+      }
+    })
+  }
+
+  generate() {
+    this.clearAnnotation()
+
+    if (pathAvailable && sourceMapAvailable && this.isMap()) {
+      return this.generateMap()
+    }
+
+    let result = ''
+    this.stringify(this.root, i => {
+      result += i
+    })
+    return [result]
+  }
+}
+
+module.exports = MapGenerator
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,444 @@
+import Declaration, { DeclarationProps } from './declaration.js'
+import Comment, { CommentProps } from './comment.js'
+import { Stringifier, Syntax } from './postcss.js'
+import AtRule, { AtRuleProps } from './at-rule.js'
+import Rule, { RuleProps } from './rule.js'
+import { WarningOptions } from './warning.js'
+import CssSyntaxError from './css-syntax-error.js'
+import Result from './result.js'
+import Input from './input.js'
+import Root from './root.js'
+import Document from './document.js'
+import Container from './container.js'
+
+export type ChildNode = AtRule | Rule | Declaration | Comment
+
+export type AnyNode = AtRule | Rule | Declaration | Comment | Root | Document
+
+export type ChildProps =
+  | AtRuleProps
+  | RuleProps
+  | DeclarationProps
+  | CommentProps
+
+export interface Position {
+  /**
+   * Source offset in file. It starts from 0.
+   */
+  offset: number
+
+  /**
+   * Source line in file. In contrast to `offset` it starts from 1.
+   */
+  column: number
+
+  /**
+   * Source column in file.
+   */
+  line: number
+}
+
+export interface Source {
+  /**
+   * The file source of the node.
+   */
+  input: Input
+  /**
+   * The starting position of the node’s source.
+   */
+  start?: Position
+  /**
+   * The ending position of the node's source.
+   */
+  end?: Position
+}
+
+export interface NodeProps {
+  source?: Source
+}
+
+interface NodeErrorOptions {
+  /**
+   * Plugin name that created this error. PostCSS will set it automatically.
+   */
+  plugin?: string
+  /**
+   * A word inside a node's string, that should be highlighted as source
+   * of error.
+   */
+  word?: string
+  /**
+   * An index inside a node's string that should be highlighted as source
+   * of error.
+   */
+  index?: number
+}
+
+/**
+ * All node classes inherit the following common methods.
+ *
+ * You should not extend this classes to create AST for selector or value
+ * parser.
+ */
+export default abstract class Node {
+  /**
+   * tring representing the node’s type. Possible values are `root`, `atrule`,
+   * `rule`, `decl`, or `comment`.
+   *
+   * ```js
+   * new Declaration({ prop: 'color', value: 'black' }).type //=> 'decl'
+   * ```
+   */
+  type: string
+
+  /**
+   * The node’s parent node.
+   *
+   * ```js
+   * root.nodes[0].parent === root
+   * ```
+   */
+  parent: Document | Container | undefined
+
+  /**
+   * The input source of the node.
+   *
+   * The property is used in source map generation.
+   *
+   * If you create a node manually (e.g., with `postcss.decl()`),
+   * that node will not have a `source` property and will be absent
+   * from the source map. For this reason, the plugin developer should
+   * consider cloning nodes to create new ones (in which case the new node’s
+   * source will reference the original, cloned node) or setting
+   * the `source` property manually.
+   *
+   * ```js
+   * decl.source.input.from //=> '/home/ai/a.sass'
+   * decl.source.start      //=> { line: 10, column: 2 }
+   * decl.source.end        //=> { line: 10, column: 12 }
+   * ```
+   *
+   * ```js
+   * // Bad
+   * const prefixed = postcss.decl({
+   *   prop: '-moz-' + decl.prop,
+   *   value: decl.value
+   * })
+   *
+   * // Good
+   * const prefixed = decl.clone({ prop: '-moz-' + decl.prop })
+   * ```
+   *
+   * ```js
+   * if (atrule.name === 'add-link') {
+   *   const rule = postcss.rule({ selector: 'a', source: atrule.source })
+   *   atrule.parent.insertBefore(atrule, rule)
+   * }
+   * ```
+   */
+  source?: Source
+
+  /**
+   * Information to generate byte-to-byte equal node string as it was
+   * in the origin input.
+   *
+   * Every parser saves its own properties,
+   * but the default CSS parser uses:
+   *
+   * * `before`: the space symbols before the node. It also stores `*`
+   *   and `_` symbols before the declaration (IE hack).
+   * * `after`: the space symbols after the last child of the node
+   *   to the end of the node.
+   * * `between`: the symbols between the property and value
+   *   for declarations, selector and `{` for rules, or last parameter
+   *   and `{` for at-rules.
+   * * `semicolon`: contains true if the last child has
+   *   an (optional) semicolon.
+   * * `afterName`: the space between the at-rule name and its parameters.
+   * * `left`: the space symbols between `/*` and the comment’s text.
+   * * `right`: the space symbols between the comment’s text
+   *   and <code>*&#47;</code>.
+   * * `important`: the content of the important statement,
+   *   if it is not just `!important`.
+   *
+   * PostCSS cleans selectors, declaration values and at-rule parameters
+   * from comments and extra spaces, but it stores origin content in raws
+   * properties. As such, if you don’t change a declaration’s value,
+   * PostCSS will use the raw value with comments.
+   *
+   * ```js
+   * const root = postcss.parse('a {\n  color:black\n}')
+   * root.first.first.raws //=> { before: '\n  ', between: ':' }
+   * ```
+   */
+  raws: any
+
+  /**
+   * @param defaults Value for node properties.
+   */
+  constructor(defaults?: object)
+
+  /**
+   * Returns a `CssSyntaxError` instance containing the original position
+   * of the node in the source, showing line and column numbers and also
+   * a small excerpt to facilitate debugging.
+   *
+   * If present, an input source map will be used to get the original position
+   * of the source, even from a previous compilation step
+   * (e.g., from Sass compilation).
+   *
+   * This method produces very useful error messages.
+   *
+   * ```js
+   * if (!variables[name]) {
+   *   throw decl.error(`Unknown variable ${name}`, { word: name })
+   *   // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black
+   *   //   color: $black
+   *   // a
+   *   //          ^
+   *   //   background: white
+   * }
+   * ```
+   *
+   * @param message Error description.
+   * @param opts    Options.
+   *
+   * @return Error object to throw it.
+   */
+  error(message: string, options?: NodeErrorOptions): CssSyntaxError
+
+  /**
+   * This method is provided as a convenience wrapper for `Result#warn`.
+   *
+   * ```js
+   *   Declaration: {
+   *     bad: (decl, { result }) => {
+   *       decl.warn(result, 'Deprecated property bad')
+   *     }
+   *   }
+   * ```
+   *
+   * @param result The `Result` instance that will receive the warning.
+   * @param text   Warning message.
+   * @param opts   Warning Options.
+   *
+   * @return Created warning object.
+   */
+  warn(result: Result, text: string, opts?: WarningOptions): void
+
+  /**
+   * Removes the node from its parent and cleans the parent properties
+   * from the node and its children.
+   *
+   * ```js
+   * if (decl.prop.match(/^-webkit-/)) {
+   *   decl.remove()
+   * }
+   * ```
+   *
+   * @return Node to make calls chain.
+   */
+  remove(): this
+
+  /**
+   * Returns a CSS string representing the node.
+   *
+   * ```js
+   * new Rule({ selector: 'a' }).toString() //=> "a {}"
+   * ```
+   *
+   * @param stringifier A syntax to use in string generation.
+   * @return CSS string of this node.
+   */
+  toString(stringifier?: Stringifier | Syntax): string
+
+  /**
+   * Assigns properties to the current node.
+   *
+   * ```js
+   * decl.assign({ prop: 'word-wrap', value: 'break-word' })
+   * ```
+   *
+   * @param overrides New properties to override the node.
+   * @return Current node to methods chain.
+   */
+  assign(overrides: object): this
+
+  /**
+   * Returns an exact clone of the node.
+   *
+   * The resulting cloned node and its (cloned) children will retain
+   * code style properties.
+   *
+   * ```js
+   * decl.raws.before    //=> "\n  "
+   * const cloned = decl.clone({ prop: '-moz-' + decl.prop })
+   * cloned.raws.before  //=> "\n  "
+   * cloned.toString()   //=> -moz-transform: scale(0)
+   * ```
+   *
+   * @param overrides New properties to override in the clone.
+   * @return Clone of the node.
+   */
+  clone(overrides?: object): this
+
+  /**
+   * Shortcut to clone the node and insert the resulting cloned node
+   * before the current node.
+   *
+   * ```js
+   * decl.cloneBefore({ prop: '-moz-' + decl.prop })
+   * ```
+   *
+   * @param overrides Mew properties to override in the clone.
+   *
+   * @return New node
+   */
+  cloneBefore(overrides?: object): this
+
+  /**
+   * Shortcut to clone the node and insert the resulting cloned node
+   * after the current node.
+   *
+   * @param overrides New properties to override in the clone.
+   * @return New node.
+   */
+  cloneAfter(overrides?: object): this
+
+  /**
+   * Inserts node(s) before the current node and removes the current node.
+   *
+   * ```js
+   * AtRule: {
+   *   mixin: atrule => {
+   *     atrule.replaceWith(mixinRules[atrule.params])
+   *   }
+   * }
+   * ```
+   *
+   * @param nodes Mode(s) to replace current one.
+   * @return Current node to methods chain.
+   */
+  replaceWith(
+    ...nodes: (ChildNode | ChildProps | ChildNode[] | ChildProps[])[]
+  ): this
+
+  /**
+   * Returns the next child of the node’s parent.
+   * Returns `undefined` if the current node is the last child.
+   *
+   * ```js
+   * if (comment.text === 'delete next') {
+   *   const next = comment.next()
+   *   if (next) {
+   *     next.remove()
+   *   }
+   * }
+   * ```
+   *
+   * @return Next node.
+   */
+  next(): ChildNode | undefined
+
+  /**
+   * Returns the previous child of the node’s parent.
+   * Returns `undefined` if the current node is the first child.
+   *
+   * ```js
+   * const annotation = decl.prev()
+   * if (annotation.type === 'comment') {
+   *   readAnnotation(annotation.text)
+   * }
+   * ```
+   *
+   * @return Previous node.
+   */
+  prev(): ChildNode | undefined
+
+  /**
+   * Insert new node before current node to current node’s parent.
+   *
+   * Just alias for `node.parent.insertBefore(node, add)`.
+   *
+   * ```js
+   * decl.before('content: ""')
+   * ```
+   *
+   * @param newNode New node.
+   * @return This node for methods chain.
+   */
+  before(newNode: Node | ChildProps | string | Node[]): this
+
+  /**
+   * Insert new node after current node to current node’s parent.
+   *
+   * Just alias for `node.parent.insertAfter(node, add)`.
+   *
+   * ```js
+   * decl.after('color: black')
+   * ```
+   *
+   * @param newNode New node.
+   * @return This node for methods chain.
+   */
+  after(newNode: Node | ChildProps | string | Node[]): this
+
+  /**
+   * Finds the Root instance of the node’s tree.
+   *
+   * ```js
+   * root.nodes[0].nodes[0].root() === root
+   * ```
+   *
+   * @return Root parent.
+   */
+  root(): Root
+
+  /**
+   * Returns a `Node#raws` value. If the node is missing
+   * the code style property (because the node was manually built or cloned),
+   * PostCSS will try to autodetect the code style property by looking
+   * at other nodes in the tree.
+   *
+   * ```js
+   * const root = postcss.parse('a { background: white }')
+   * root.nodes[0].append({ prop: 'color', value: 'black' })
+   * root.nodes[0].nodes[1].raws.before   //=> undefined
+   * root.nodes[0].nodes[1].raw('before') //=> ' '
+   * ```
+   *
+   * @param prop        Name of code style property.
+   * @param defaultType Name of default value, it can be missed
+   *                    if the value is the same as prop.
+   * @return {string} Code style value.
+   */
+  raw(prop: string, defaultType?: string): string
+
+  /**
+   * Clear the code style properties for the node and its children.
+   *
+   * ```js
+   * node.raws.before  //=> ' '
+   * node.cleanRaws()
+   * node.raws.before  //=> undefined
+   * ```
+   *
+   * @param keepBetween Keep the `raws.between` symbols.
+   */
+  cleanRaws(keepBetween?: boolean): void
+
+  /**
+   * Fix circular links on `JSON.stringify()`.
+   *
+   * @return Cleaned object.
+   */
+  toJSON(): object
+
+  /**
+   * Convert string index to line/column.
+   *
+   * @param index The symbol number in the node’s string.
+   * @return Symbol position in file.
+   */
+  positionInside(index: number): Position
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/node.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,320 @@
+'use strict'
+
+let { isClean, my } = require('./symbols')
+let CssSyntaxError = require('./css-syntax-error')
+let Stringifier = require('./stringifier')
+let stringify = require('./stringify')
+
+function cloneNode(obj, parent) {
+  let cloned = new obj.constructor()
+
+  for (let i in obj) {
+    if (!Object.prototype.hasOwnProperty.call(obj, i)) {
+      // istanbul ignore next
+      continue
+    }
+    if (i === 'proxyCache') continue
+    let value = obj[i]
+    let type = typeof value
+
+    if (i === 'parent' && type === 'object') {
+      if (parent) cloned[i] = parent
+    } else if (i === 'source') {
+      cloned[i] = value
+    } else if (Array.isArray(value)) {
+      cloned[i] = value.map(j => cloneNode(j, cloned))
+    } else {
+      if (type === 'object' && value !== null) value = cloneNode(value)
+      cloned[i] = value
+    }
+  }
+
+  return cloned
+}
+
+class Node {
+  constructor(defaults = {}) {
+    this.raws = {}
+    this[isClean] = false
+    this[my] = true
+
+    for (let name in defaults) {
+      if (name === 'nodes') {
+        this.nodes = []
+        for (let node of defaults[name]) {
+          if (typeof node.clone === 'function') {
+            this.append(node.clone())
+          } else {
+            this.append(node)
+          }
+        }
+      } else {
+        this[name] = defaults[name]
+      }
+    }
+  }
+
+  error(message, opts = {}) {
+    if (this.source) {
+      let pos = this.positionBy(opts)
+      return this.source.input.error(message, pos.line, pos.column, opts)
+    }
+    return new CssSyntaxError(message)
+  }
+
+  warn(result, text, opts) {
+    let data = { node: this }
+    for (let i in opts) data[i] = opts[i]
+    return result.warn(text, data)
+  }
+
+  remove() {
+    if (this.parent) {
+      this.parent.removeChild(this)
+    }
+    this.parent = undefined
+    return this
+  }
+
+  toString(stringifier = stringify) {
+    if (stringifier.stringify) stringifier = stringifier.stringify
+    let result = ''
+    stringifier(this, i => {
+      result += i
+    })
+    return result
+  }
+
+  assign(overrides = {}) {
+    for (let name in overrides) {
+      this[name] = overrides[name]
+    }
+    return this
+  }
+
+  clone(overrides = {}) {
+    let cloned = cloneNode(this)
+    for (let name in overrides) {
+      cloned[name] = overrides[name]
+    }
+    return cloned
+  }
+
+  cloneBefore(overrides = {}) {
+    let cloned = this.clone(overrides)
+    this.parent.insertBefore(this, cloned)
+    return cloned
+  }
+
+  cloneAfter(overrides = {}) {
+    let cloned = this.clone(overrides)
+    this.parent.insertAfter(this, cloned)
+    return cloned
+  }
+
+  replaceWith(...nodes) {
+    if (this.parent) {
+      let bookmark = this
+      let foundSelf = false
+      for (let node of nodes) {
+        if (node === this) {
+          foundSelf = true
+        } else if (foundSelf) {
+          this.parent.insertAfter(bookmark, node)
+          bookmark = node
+        } else {
+          this.parent.insertBefore(bookmark, node)
+        }
+      }
+
+      if (!foundSelf) {
+        this.remove()
+      }
+    }
+
+    return this
+  }
+
+  next() {
+    if (!this.parent) return undefined
+    let index = this.parent.index(this)
+    return this.parent.nodes[index + 1]
+  }
+
+  prev() {
+    if (!this.parent) return undefined
+    let index = this.parent.index(this)
+    return this.parent.nodes[index - 1]
+  }
+
+  before(add) {
+    this.parent.insertBefore(this, add)
+    return this
+  }
+
+  after(add) {
+    this.parent.insertAfter(this, add)
+    return this
+  }
+
+  root() {
+    let result = this
+    while (result.parent && result.parent.type !== 'document') {
+      result = result.parent
+    }
+    return result
+  }
+
+  raw(prop, defaultType) {
+    let str = new Stringifier()
+    return str.raw(this, prop, defaultType)
+  }
+
+  cleanRaws(keepBetween) {
+    delete this.raws.before
+    delete this.raws.after
+    if (!keepBetween) delete this.raws.between
+  }
+
+  toJSON(_, inputs) {
+    let fixed = {}
+    let emitInputs = inputs == null
+    inputs = inputs || new Map()
+    let inputsNextIndex = 0
+
+    for (let name in this) {
+      if (!Object.prototype.hasOwnProperty.call(this, name)) {
+        // istanbul ignore next
+        continue
+      }
+      if (name === 'parent' || name === 'proxyCache') continue
+      let value = this[name]
+
+      if (Array.isArray(value)) {
+        fixed[name] = value.map(i => {
+          if (typeof i === 'object' && i.toJSON) {
+            return i.toJSON(null, inputs)
+          } else {
+            return i
+          }
+        })
+      } else if (typeof value === 'object' && value.toJSON) {
+        fixed[name] = value.toJSON(null, inputs)
+      } else if (name === 'source') {
+        let inputId = inputs.get(value.input)
+        if (inputId == null) {
+          inputId = inputsNextIndex
+          inputs.set(value.input, inputsNextIndex)
+          inputsNextIndex++
+        }
+        fixed[name] = {
+          inputId,
+          start: value.start,
+          end: value.end
+        }
+      } else {
+        fixed[name] = value
+      }
+    }
+
+    if (emitInputs) {
+      fixed.inputs = [...inputs.keys()].map(input => input.toJSON())
+    }
+
+    return fixed
+  }
+
+  positionInside(index) {
+    let string = this.toString()
+    let column = this.source.start.column
+    let line = this.source.start.line
+
+    for (let i = 0; i < index; i++) {
+      if (string[i] === '\n') {
+        column = 1
+        line += 1
+      } else {
+        column += 1
+      }
+    }
+
+    return { line, column }
+  }
+
+  positionBy(opts) {
+    let pos = this.source.start
+    if (opts.index) {
+      pos = this.positionInside(opts.index)
+    } else if (opts.word) {
+      let index = this.toString().indexOf(opts.word)
+      if (index !== -1) pos = this.positionInside(index)
+    }
+    return pos
+  }
+
+  getProxyProcessor() {
+    return {
+      set(node, prop, value) {
+        if (node[prop] === value) return true
+        node[prop] = value
+        if (
+          prop === 'prop' ||
+          prop === 'value' ||
+          prop === 'name' ||
+          prop === 'params' ||
+          prop === 'important' ||
+          prop === 'text'
+        ) {
+          node.markDirty()
+        }
+        return true
+      },
+
+      get(node, prop) {
+        if (prop === 'proxyOf') {
+          return node
+        } else if (prop === 'root') {
+          return () => node.root().toProxy()
+        } else {
+          return node[prop]
+        }
+      }
+    }
+  }
+
+  toProxy() {
+    if (!this.proxyCache) {
+      this.proxyCache = new Proxy(this, this.getProxyProcessor())
+    }
+    return this.proxyCache
+  }
+
+  addToError(error) {
+    error.postcssNode = this
+    if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) {
+      let s = this.source
+      error.stack = error.stack.replace(
+        /\n\s{4}at /,
+        `$&${s.input.from}:${s.start.line}:${s.start.column}$&`
+      )
+    }
+    return error
+  }
+
+  markDirty() {
+    if (this[isClean]) {
+      this[isClean] = false
+      let next = this
+      while ((next = next.parent)) {
+        next[isClean] = false
+      }
+    }
+  }
+
+  get proxyOf() {
+    return this
+  }
+}
+
+module.exports = Node
+Node.default = Node
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,5 @@
+import { Parser } from './postcss.js'
+
+declare const parse: Parser
+
+export default parse
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/parse.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,42 @@
+'use strict'
+
+let Container = require('./container')
+let Parser = require('./parser')
+let Input = require('./input')
+
+function parse(css, opts) {
+  let input = new Input(css, opts)
+  let parser = new Parser(input)
+  try {
+    parser.parse()
+  } catch (e) {
+    if (process.env.NODE_ENV !== 'production') {
+      if (e.name === 'CssSyntaxError' && opts && opts.from) {
+        if (/\.scss$/i.test(opts.from)) {
+          e.message +=
+            '\nYou tried to parse SCSS with ' +
+            'the standard CSS parser; ' +
+            'try again with the postcss-scss parser'
+        } else if (/\.sass/i.test(opts.from)) {
+          e.message +=
+            '\nYou tried to parse Sass with ' +
+            'the standard CSS parser; ' +
+            'try again with the postcss-sass parser'
+        } else if (/\.less$/i.test(opts.from)) {
+          e.message +=
+            '\nYou tried to parse Less with ' +
+            'the standard CSS parser; ' +
+            'try again with the postcss-less parser'
+        }
+      }
+    }
+    throw e
+  }
+
+  return parser.root
+}
+
+module.exports = parse
+parse.default = parse
+
+Container.registerParse(parse)
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/parser.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/parser.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/parser.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,565 @@
+'use strict'
+
+let Declaration = require('./declaration')
+let tokenizer = require('./tokenize')
+let Comment = require('./comment')
+let AtRule = require('./at-rule')
+let Root = require('./root')
+let Rule = require('./rule')
+
+class Parser {
+  constructor(input) {
+    this.input = input
+
+    this.root = new Root()
+    this.current = this.root
+    this.spaces = ''
+    this.semicolon = false
+    this.customProperty = false
+
+    this.createTokenizer()
+    this.root.source = { input, start: { offset: 0, line: 1, column: 1 } }
+  }
+
+  createTokenizer() {
+    this.tokenizer = tokenizer(this.input)
+  }
+
+  parse() {
+    let token
+    while (!this.tokenizer.endOfFile()) {
+      token = this.tokenizer.nextToken()
+
+      switch (token[0]) {
+        case 'space':
+          this.spaces += token[1]
+          break
+
+        case ';':
+          this.freeSemicolon(token)
+          break
+
+        case '}':
+          this.end(token)
+          break
+
+        case 'comment':
+          this.comment(token)
+          break
+
+        case 'at-word':
+          this.atrule(token)
+          break
+
+        case '{':
+          this.emptyRule(token)
+          break
+
+        default:
+          this.other(token)
+          break
+      }
+    }
+    this.endFile()
+  }
+
+  comment(token) {
+    let node = new Comment()
+    this.init(node, token[2])
+    node.source.end = this.getPosition(token[3] || token[2])
+
+    let text = token[1].slice(2, -2)
+    if (/^\s*$/.test(text)) {
+      node.text = ''
+      node.raws.left = text
+      node.raws.right = ''
+    } else {
+      let match = text.match(/^(\s*)([^]*\S)(\s*)$/)
+      node.text = match[2]
+      node.raws.left = match[1]
+      node.raws.right = match[3]
+    }
+  }
+
+  emptyRule(token) {
+    let node = new Rule()
+    this.init(node, token[2])
+    node.selector = ''
+    node.raws.between = ''
+    this.current = node
+  }
+
+  other(start) {
+    let end = false
+    let type = null
+    let colon = false
+    let bracket = null
+    let brackets = []
+    let customProperty = start[1].startsWith('--')
+
+    let tokens = []
+    let token = start
+    while (token) {
+      type = token[0]
+      tokens.push(token)
+
+      if (type === '(' || type === '[') {
+        if (!bracket) bracket = token
+        brackets.push(type === '(' ? ')' : ']')
+      } else if (customProperty && colon && type === '{') {
+        if (!bracket) bracket = token
+        brackets.push('}')
+      } else if (brackets.length === 0) {
+        if (type === ';') {
+          if (colon) {
+            this.decl(tokens, customProperty)
+            return
+          } else {
+            break
+          }
+        } else if (type === '{') {
+          this.rule(tokens)
+          return
+        } else if (type === '}') {
+          this.tokenizer.back(tokens.pop())
+          end = true
+          break
+        } else if (type === ':') {
+          colon = true
+        }
+      } else if (type === brackets[brackets.length - 1]) {
+        brackets.pop()
+        if (brackets.length === 0) bracket = null
+      }
+
+      token = this.tokenizer.nextToken()
+    }
+
+    if (this.tokenizer.endOfFile()) end = true
+    if (brackets.length > 0) this.unclosedBracket(bracket)
+
+    if (end && colon) {
+      while (tokens.length) {
+        token = tokens[tokens.length - 1][0]
+        if (token !== 'space' && token !== 'comment') break
+        this.tokenizer.back(tokens.pop())
+      }
+      this.decl(tokens, customProperty)
+    } else {
+      this.unknownWord(tokens)
+    }
+  }
+
+  rule(tokens) {
+    tokens.pop()
+
+    let node = new Rule()
+    this.init(node, tokens[0][2])
+
+    node.raws.between = this.spacesAndCommentsFromEnd(tokens)
+    this.raw(node, 'selector', tokens)
+    this.current = node
+  }
+
+  decl(tokens, customProperty) {
+    let node = new Declaration()
+    this.init(node, tokens[0][2])
+
+    let last = tokens[tokens.length - 1]
+    if (last[0] === ';') {
+      this.semicolon = true
+      tokens.pop()
+    }
+    node.source.end = this.getPosition(last[3] || last[2])
+
+    while (tokens[0][0] !== 'word') {
+      if (tokens.length === 1) this.unknownWord(tokens)
+      node.raws.before += tokens.shift()[1]
+    }
+    node.source.start = this.getPosition(tokens[0][2])
+
+    node.prop = ''
+    while (tokens.length) {
+      let type = tokens[0][0]
+      if (type === ':' || type === 'space' || type === 'comment') {
+        break
+      }
+      node.prop += tokens.shift()[1]
+    }
+
+    node.raws.between = ''
+
+    let token
+    while (tokens.length) {
+      token = tokens.shift()
+
+      if (token[0] === ':') {
+        node.raws.between += token[1]
+        break
+      } else {
+        if (token[0] === 'word' && /\w/.test(token[1])) {
+          this.unknownWord([token])
+        }
+        node.raws.between += token[1]
+      }
+    }
+
+    if (node.prop[0] === '_' || node.prop[0] === '*') {
+      node.raws.before += node.prop[0]
+      node.prop = node.prop.slice(1)
+    }
+    let firstSpaces = this.spacesAndCommentsFromStart(tokens)
+    this.precheckMissedSemicolon(tokens)
+
+    for (let i = tokens.length - 1; i >= 0; i--) {
+      token = tokens[i]
+      if (token[1].toLowerCase() === '!important') {
+        node.important = true
+        let string = this.stringFrom(tokens, i)
+        string = this.spacesFromEnd(tokens) + string
+        if (string !== ' !important') node.raws.important = string
+        break
+      } else if (token[1].toLowerCase() === 'important') {
+        let cache = tokens.slice(0)
+        let str = ''
+        for (let j = i; j > 0; j--) {
+          let type = cache[j][0]
+          if (str.trim().indexOf('!') === 0 && type !== 'space') {
+            break
+          }
+          str = cache.pop()[1] + str
+        }
+        if (str.trim().indexOf('!') === 0) {
+          node.important = true
+          node.raws.important = str
+          tokens = cache
+        }
+      }
+
+      if (token[0] !== 'space' && token[0] !== 'comment') {
+        break
+      }
+    }
+
+    let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')
+    this.raw(node, 'value', tokens)
+    if (hasWord) {
+      node.raws.between += firstSpaces
+    } else {
+      node.value = firstSpaces + node.value
+    }
+
+    if (node.value.includes(':') && !customProperty) {
+      this.checkMissedSemicolon(tokens)
+    }
+  }
+
+  atrule(token) {
+    let node = new AtRule()
+    node.name = token[1].slice(1)
+    if (node.name === '') {
+      this.unnamedAtrule(node, token)
+    }
+    this.init(node, token[2])
+
+    let type
+    let prev
+    let shift
+    let last = false
+    let open = false
+    let params = []
+    let brackets = []
+
+    while (!this.tokenizer.endOfFile()) {
+      token = this.tokenizer.nextToken()
+      type = token[0]
+
+      if (type === '(' || type === '[') {
+        brackets.push(type === '(' ? ')' : ']')
+      } else if (type === '{' && brackets.length > 0) {
+        brackets.push('}')
+      } else if (type === brackets[brackets.length - 1]) {
+        brackets.pop()
+      }
+
+      if (brackets.length === 0) {
+        if (type === ';') {
+          node.source.end = this.getPosition(token[2])
+          this.semicolon = true
+          break
+        } else if (type === '{') {
+          open = true
+          break
+        } else if (type === '}') {
+          if (params.length > 0) {
+            shift = params.length - 1
+            prev = params[shift]
+            while (prev && prev[0] === 'space') {
+              prev = params[--shift]
+            }
+            if (prev) {
+              node.source.end = this.getPosition(prev[3] || prev[2])
+            }
+          }
+          this.end(token)
+          break
+        } else {
+          params.push(token)
+        }
+      } else {
+        params.push(token)
+      }
+
+      if (this.tokenizer.endOfFile()) {
+        last = true
+        break
+      }
+    }
+
+    node.raws.between = this.spacesAndCommentsFromEnd(params)
+    if (params.length) {
+      node.raws.afterName = this.spacesAndCommentsFromStart(params)
+      this.raw(node, 'params', params)
+      if (last) {
+        token = params[params.length - 1]
+        node.source.end = this.getPosition(token[3] || token[2])
+        this.spaces = node.raws.between
+        node.raws.between = ''
+      }
+    } else {
+      node.raws.afterName = ''
+      node.params = ''
+    }
+
+    if (open) {
+      node.nodes = []
+      this.current = node
+    }
+  }
+
+  end(token) {
+    if (this.current.nodes && this.current.nodes.length) {
+      this.current.raws.semicolon = this.semicolon
+    }
+    this.semicolon = false
+
+    this.current.raws.after = (this.current.raws.after || '') + this.spaces
+    this.spaces = ''
+
+    if (this.current.parent) {
+      this.current.source.end = this.getPosition(token[2])
+      this.current = this.current.parent
+    } else {
+      this.unexpectedClose(token)
+    }
+  }
+
+  endFile() {
+    if (this.current.parent) this.unclosedBlock()
+    if (this.current.nodes && this.current.nodes.length) {
+      this.current.raws.semicolon = this.semicolon
+    }
+    this.current.raws.after = (this.current.raws.after || '') + this.spaces
+  }
+
+  freeSemicolon(token) {
+    this.spaces += token[1]
+    if (this.current.nodes) {
+      let prev = this.current.nodes[this.current.nodes.length - 1]
+      if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {
+        prev.raws.ownSemicolon = this.spaces
+        this.spaces = ''
+      }
+    }
+  }
+
+  // Helpers
+
+  getPosition(offset) {
+    let pos = this.input.fromOffset(offset)
+    return {
+      offset,
+      line: pos.line,
+      column: pos.col
+    }
+  }
+
+  init(node, offset) {
+    this.current.push(node)
+    node.source = {
+      start: this.getPosition(offset),
+      input: this.input
+    }
+    node.raws.before = this.spaces
+    this.spaces = ''
+    if (node.type !== 'comment') this.semicolon = false
+  }
+
+  raw(node, prop, tokens) {
+    let token, type
+    let length = tokens.length
+    let value = ''
+    let clean = true
+    let next, prev
+    let pattern = /^([#.|])?(\w)+/i
+
+    for (let 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]
+        } else {
+          clean = false
+        }
+
+        continue
+      }
+
+      if (type === 'comment' || (type === 'space' && i === length - 1)) {
+        clean = false
+      } else {
+        value += token[1]
+      }
+    }
+    if (!clean) {
+      let raw = tokens.reduce((all, i) => all + i[1], '')
+      node.raws[prop] = { value, raw }
+    }
+    node[prop] = value
+  }
+
+  spacesAndCommentsFromEnd(tokens) {
+    let lastTokenType
+    let spaces = ''
+    while (tokens.length) {
+      lastTokenType = tokens[tokens.length - 1][0]
+      if (lastTokenType !== 'space' && lastTokenType !== 'comment') break
+      spaces = tokens.pop()[1] + spaces
+    }
+    return spaces
+  }
+
+  spacesAndCommentsFromStart(tokens) {
+    let next
+    let spaces = ''
+    while (tokens.length) {
+      next = tokens[0][0]
+      if (next !== 'space' && next !== 'comment') break
+      spaces += tokens.shift()[1]
+    }
+    return spaces
+  }
+
+  spacesFromEnd(tokens) {
+    let lastTokenType
+    let spaces = ''
+    while (tokens.length) {
+      lastTokenType = tokens[tokens.length - 1][0]
+      if (lastTokenType !== 'space') break
+      spaces = tokens.pop()[1] + spaces
+    }
+    return spaces
+  }
+
+  stringFrom(tokens, from) {
+    let result = ''
+    for (let i = from; i < tokens.length; i++) {
+      result += tokens[i][1]
+    }
+    tokens.splice(from, tokens.length - from)
+    return result
+  }
+
+  colon(tokens) {
+    let brackets = 0
+    let token, type, prev
+    for (let [i, element] of tokens.entries()) {
+      token = element
+      type = token[0]
+
+      if (type === '(') {
+        brackets += 1
+      }
+      if (type === ')') {
+        brackets -= 1
+      }
+      if (brackets === 0 && type === ':') {
+        if (!prev) {
+          this.doubleColon(token)
+        } else if (prev[0] === 'word' && prev[1] === 'progid') {
+          continue
+        } else {
+          return i
+        }
+      }
+
+      prev = token
+    }
+    return false
+  }
+
+  // Errors
+
+  unclosedBracket(bracket) {
+    throw this.input.error('Unclosed bracket', bracket[2])
+  }
+
+  unknownWord(tokens) {
+    throw this.input.error('Unknown word', tokens[0][2])
+  }
+
+  unexpectedClose(token) {
+    throw this.input.error('Unexpected }', token[2])
+  }
+
+  unclosedBlock() {
+    let pos = this.current.source.start
+    throw this.input.error('Unclosed block', pos.line, pos.column)
+  }
+
+  doubleColon(token) {
+    throw this.input.error('Double colon', token[2])
+  }
+
+  unnamedAtrule(node, token) {
+    throw this.input.error('At-rule without name', token[2])
+  }
+
+  precheckMissedSemicolon(/* tokens */) {
+    // Hook for Safe Parser
+  }
+
+  checkMissedSemicolon(tokens) {
+    let colon = this.colon(tokens)
+    if (colon === false) return
+
+    let founded = 0
+    let token
+    for (let j = colon - 1; j >= 0; j--) {
+      token = tokens[j]
+      if (token[0] !== 'space') {
+        founded += 1
+        if (founded === 2) break
+      }
+    }
+    // If the token is a word, e.g. `!important`, `red` or any other valid property's value.
+    // Then we need to return the colon after that word token. [3] is the "end" colon of that word.
+    // And because we need it after that one we do +1 to get the next one.
+    throw this.input.error(
+      'Missed semicolon',
+      token[0] === 'word' ? token[3] + 1 : token[2]
+    )
+  }
+}
+
+module.exports = Parser
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,472 @@
+import { SourceMapGenerator, RawSourceMap } from 'source-map-js'
+
+import Node, {
+  Position,
+  Source,
+  ChildNode,
+  NodeErrorOptions,
+  NodeProps,
+  ChildProps,
+  AnyNode
+} from './node.js'
+import Declaration, { DeclarationProps } from './declaration.js'
+import Root, { RootProps } from './root.js'
+import Document, { DocumentProps } from './document.js'
+import Comment, { CommentProps } from './comment.js'
+import AtRule, { AtRuleProps } from './at-rule.js'
+import Result, { Message } from './result.js'
+import LazyResult from './lazy-result.js'
+import Rule, { RuleProps } from './rule.js'
+import Container, { ContainerProps } from './container.js'
+import Warning, { WarningOptions } from './warning.js'
+import Input, { FilePosition } from './input.js'
+import CssSyntaxError from './css-syntax-error.js'
+import list, { List } from './list.js'
+import Processor from './processor.js'
+
+export {
+  WarningOptions,
+  FilePosition,
+  Position,
+  Source,
+  ChildNode,
+  AnyNode,
+  Message,
+  NodeErrorOptions,
+  NodeProps,
+  DeclarationProps,
+  ContainerProps,
+  CommentProps,
+  RuleProps,
+  ChildProps,
+  AtRuleProps,
+  RootProps,
+  DocumentProps,
+  Warning,
+  CssSyntaxError,
+  Node,
+  Container,
+  list,
+  Declaration,
+  Comment,
+  AtRule,
+  Rule,
+  Root,
+  Document,
+  Result,
+  LazyResult,
+  Input
+}
+
+export type SourceMap = SourceMapGenerator & {
+  toJSON(): RawSourceMap
+}
+
+export type Helpers = { result: Result; postcss: Postcss } & Postcss
+
+type DocumentProcessor = (
+  document: Document,
+  helper: Helpers
+) => Promise<void> | void
+type RootProcessor = (root: Root, helper: Helpers) => Promise<void> | void
+type DeclarationProcessor = (
+  decl: Declaration,
+  helper: Helpers
+) => Promise<void> | void
+type RuleProcessor = (rule: Rule, helper: Helpers) => Promise<void> | void
+type AtRuleProcessor = (atRule: AtRule, helper: Helpers) => Promise<void> | void
+type CommentProcessor = (
+  comment: Comment,
+  helper: Helpers
+) => Promise<void> | void
+
+interface Processors {
+  /**
+   * Will be called on `Document` node.
+   *
+   * Will be called again on children changes.
+   */
+  Document?: DocumentProcessor
+
+  /**
+   * Will be called on `Document` node, when all children will be processed.
+   *
+   * Will be called again on children changes.
+   */
+  DocumentExit?: DocumentProcessor
+
+  /**
+   * Will be called on `Root` node once.
+   */
+  Once?: RootProcessor
+
+  /**
+   * Will be called on `Root` node once, when all children will be processed.
+   */
+  OnceExit?: RootProcessor
+
+  /**
+   * Will be called on `Root` node.
+   *
+   * Will be called again on children changes.
+   */
+  Root?: RootProcessor
+
+  /**
+   * Will be called on `Root` node, when all children will be processed.
+   *
+   * Will be called again on children changes.
+   */
+  RootExit?: RootProcessor
+
+  /**
+   * Will be called on all `Declaration` nodes after listeners
+   * for `Declaration` event.
+   *
+   * Will be called again on node or children changes.
+   */
+  Declaration?: DeclarationProcessor | { [prop: string]: DeclarationProcessor }
+
+  /**
+   * Will be called on all `Declaration` nodes.
+   *
+   * Will be called again on node or children changes.
+   */
+  DeclarationExit?:
+    | DeclarationProcessor
+    | { [prop: string]: DeclarationProcessor }
+
+  /**
+   * Will be called on all `Rule` nodes.
+   *
+   * Will be called again on node or children changes.
+   */
+  Rule?: RuleProcessor
+
+  /**
+   * Will be called on all `Rule` nodes, when all children will be processed.
+   *
+   * Will be called again on node or children changes.
+   */
+  RuleExit?: RuleProcessor
+
+  /**
+   * Will be called on all`AtRule` nodes.
+   *
+   * Will be called again on node or children changes.
+   */
+  AtRule?: AtRuleProcessor | { [name: string]: AtRuleProcessor }
+
+  /**
+   * Will be called on all `AtRule` nodes, when all children will be processed.
+   *
+   * Will be called again on node or children changes.
+   */
+  AtRuleExit?: AtRuleProcessor | { [name: string]: AtRuleProcessor }
+
+  /**
+   * Will be called on all `Comment` nodes.
+   *
+   * Will be called again on node or children changes.
+   */
+  Comment?: CommentProcessor
+
+  /**
+   * Will be called on all `Comment` nodes after listeners
+   * for `Comment` event.
+   *
+   * Will be called again on node or children changes.
+   */
+  CommentExit?: CommentProcessor
+
+  /**
+   * Will be called when all other listeners processed the document.
+   *
+   * This listener will not be called again.
+   */
+  Exit?: RootProcessor
+}
+
+export interface Plugin extends Processors {
+  postcssPlugin: string
+  prepare?: (result: Result) => Processors
+}
+
+export interface PluginCreator<PluginOptions> {
+  (opts?: PluginOptions): Plugin | Processor
+  postcss: true
+}
+
+export interface Transformer extends TransformCallback {
+  postcssPlugin: string
+  postcssVersion: string
+}
+
+export interface TransformCallback {
+  (root: Root, result: Result): Promise<void> | void
+}
+
+export interface OldPlugin<T> extends Transformer {
+  (opts?: T): Transformer
+  postcss: Transformer
+}
+
+export type AcceptedPlugin =
+  | Plugin
+  | PluginCreator<any>
+  | OldPlugin<any>
+  | TransformCallback
+  | {
+      postcss: TransformCallback | Processor
+    }
+  | Processor
+
+export interface Parser<RootNode = Root> {
+  (
+    css: string | { toString(): string },
+    opts?: Pick<ProcessOptions, 'map' | 'from'>
+  ): RootNode
+}
+
+export interface Builder {
+  (part: string, node?: AnyNode, type?: 'start' | 'end'): void
+}
+
+export interface Stringifier {
+  (node: AnyNode, builder: Builder): void
+}
+
+export interface JSONHydrator {
+  (data: object[]): Node[]
+  (data: object): Node
+}
+
+export interface Syntax {
+  /**
+   * Function to generate AST by string.
+   */
+  parse?: Parser<Root | Document>
+
+  /**
+   * Class to generate string by AST.
+   */
+  stringify?: Stringifier
+}
+
+export interface SourceMapOptions {
+  /**
+   * Indicates that the source map should be embedded in the output CSS
+   * as a Base64-encoded comment. By default, it is `true`.
+   * But if all previous maps are external, not inline, PostCSS will not embed
+   * the map even if you do not set this option.
+   *
+   * If you have an inline source map, the result.map property will be empty,
+   * as the source map will be contained within the text of `result.css`.
+   */
+  inline?: boolean
+
+  /**
+   * Source map content from a previous processing step (e.g., Sass).
+   *
+   * PostCSS will try to read the previous source map
+   * automatically (based on comments within the source CSS), but you can use
+   * this option to identify it manually.
+   *
+   * If desired, you can omit the previous map with prev: `false`.
+   */
+  prev?: string | boolean | object | ((file: string) => string)
+
+  /**
+   * Indicates that PostCSS should set the origin content (e.g., Sass source)
+   * of the source map. By default, it is true. But if all previous maps do not
+   * contain sources content, PostCSS will also leave it out even if you
+   * do not set this option.
+   */
+  sourcesContent?: boolean
+
+  /**
+   * Indicates that PostCSS should add annotation comments to the CSS.
+   * By default, PostCSS will always add a comment with a path
+   * to the source map. PostCSS will not add annotations to CSS files
+   * that do not contain any comments.
+   *
+   * By default, PostCSS presumes that you want to save the source map as
+   * `opts.to + '.map'` and will use this path in the annotation comment.
+   * A different path can be set by providing a string value for annotation.
+   *
+   * If you have set `inline: true`, annotation cannot be disabled.
+   */
+  annotation?: string | boolean | ((file: string, root: Root) => string)
+
+  /**
+   * Override `from` in map’s sources.
+   */
+  from?: string
+
+  /**
+   * Use absolute path in generated source map.
+   */
+  absolute?: boolean
+}
+
+export interface ProcessOptions {
+  /**
+   * The path of the CSS source file. You should always set `from`,
+   * because it is used in source map generation and syntax error messages.
+   */
+  from?: string
+
+  /**
+   * The path where you'll put the output CSS file. You should always set `to`
+   * to generate correct source maps.
+   */
+  to?: string
+
+  /**
+   * Function to generate AST by string.
+   */
+  parser?: Syntax | Parser
+
+  /**
+   * Class to generate string by AST.
+   */
+  stringifier?: Syntax | Stringifier
+
+  /**
+   * Object with parse and stringify.
+   */
+  syntax?: Syntax
+
+  /**
+   * Source map options
+   */
+  map?: SourceMapOptions | boolean
+}
+
+export interface Postcss {
+  /**
+   * Create a new `Processor` instance that will apply `plugins`
+   * as CSS processors.
+   *
+   * ```js
+   * let postcss = require('postcss')
+   *
+   * postcss(plugins).process(css, { from, to }).then(result => {
+   *   console.log(result.css)
+   * })
+   * ```
+   *
+   * @param plugins PostCSS plugins.
+   * @return Processor to process multiple CSS.
+   */
+  (plugins?: AcceptedPlugin[]): Processor
+  (...plugins: AcceptedPlugin[]): Processor
+
+  /**
+   * Default function to convert a node tree into a CSS string.
+   */
+  stringify: Stringifier
+
+  /**
+   * Parses source css and returns a new `Root` or `Document` node,
+   * which contains the source CSS nodes.
+   *
+   * ```js
+   * // Simple CSS concatenation with source map support
+   * const root1 = postcss.parse(css1, { from: file1 })
+   * const root2 = postcss.parse(css2, { from: file2 })
+   * root1.append(root2).toResult().css
+   * ```
+   */
+  parse: Parser
+
+  /**
+   * Rehydrate a JSON AST (from `Node#toJSON`) back into the AST classes.
+   *
+   * ```js
+   * const json = root.toJSON()
+   * // save to file, send by network, etc
+   * const root2  = postcss.fromJSON(json)
+   * ```
+   */
+  fromJSON: JSONHydrator
+
+  /**
+   * Contains the `list` module.
+   */
+  list: List
+
+  /**
+   * Creates a new `Comment` node.
+   *
+   * @param defaults Properties for the new node.
+   * @return New comment node
+   */
+  comment(defaults?: CommentProps): Comment
+
+  /**
+   * Creates a new `AtRule` node.
+   *
+   * @param defaults Properties for the new node.
+   * @return New at-rule node.
+   */
+  atRule(defaults?: AtRuleProps): AtRule
+
+  /**
+   * Creates a new `Declaration` node.
+   *
+   * @param defaults Properties for the new node.
+   * @return New declaration node.
+   */
+  decl(defaults?: DeclarationProps): Declaration
+
+  /**
+   * Creates a new `Rule` node.
+   *
+   * @param default Properties for the new node.
+   * @return New rule node.
+   */
+  rule(defaults?: RuleProps): Rule
+
+  /**
+   * Creates a new `Root` node.
+   *
+   * @param defaults Properties for the new node.
+   * @return New root node.
+   */
+  root(defaults?: RootProps): Root
+
+  /**
+   * Creates a new `Document` node.
+   *
+   * @param defaults Properties for the new node.
+   * @return New document node.
+   */
+  document(defaults?: DocumentProps): Document
+
+  CssSyntaxError: typeof CssSyntaxError
+  Declaration: typeof Declaration
+  Container: typeof Container
+  Comment: typeof Comment
+  Warning: typeof Warning
+  AtRule: typeof AtRule
+  Result: typeof Result
+  Input: typeof Input
+  Rule: typeof Rule
+  Root: typeof Root
+  Node: typeof Node
+}
+
+export const stringify: Stringifier
+export const parse: Parser
+export const fromJSON: JSONHydrator
+
+export const comment: Postcss['comment']
+export const atRule: Postcss['atRule']
+export const decl: Postcss['decl']
+export const rule: Postcss['rule']
+export const root: Postcss['root']
+
+declare const postcss: Postcss
+
+export default postcss
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,95 @@
+'use strict'
+
+let CssSyntaxError = require('./css-syntax-error')
+let Declaration = require('./declaration')
+let LazyResult = require('./lazy-result')
+let Container = require('./container')
+let Processor = require('./processor')
+let stringify = require('./stringify')
+let fromJSON = require('./fromJSON')
+let Document = require('./document')
+let Warning = require('./warning')
+let Comment = require('./comment')
+let AtRule = require('./at-rule')
+let Result = require('./result.js')
+let Input = require('./input')
+let parse = require('./parse')
+let list = require('./list')
+let Rule = require('./rule')
+let Root = require('./root')
+let Node = require('./node')
+
+function postcss(...plugins) {
+  if (plugins.length === 1 && Array.isArray(plugins[0])) {
+    plugins = plugins[0]
+  }
+  return new Processor(plugins)
+}
+
+postcss.plugin = function plugin(name, initializer) {
+  if (console && console.warn) {
+    console.warn(
+      name +
+        ': postcss.plugin was deprecated. Migration guide:\n' +
+        'https://evilmartians.com/chronicles/postcss-8-plugin-migration'
+    )
+    if (process.env.LANG && process.env.LANG.startsWith('cn')) {
+      // istanbul ignore next
+      console.warn(
+        name +
+          ': 里面 postcss.plugin 被弃用. 迁移指南:\n' +
+          'https://www.w3ctech.com/topic/2226'
+      )
+    }
+  }
+  function creator(...args) {
+    let transformer = initializer(...args)
+    transformer.postcssPlugin = name
+    transformer.postcssVersion = new Processor().version
+    return transformer
+  }
+
+  let cache
+  Object.defineProperty(creator, 'postcss', {
+    get() {
+      if (!cache) cache = creator()
+      return cache
+    }
+  })
+
+  creator.process = function (css, processOpts, pluginOpts) {
+    return postcss([creator(pluginOpts)]).process(css, processOpts)
+  }
+
+  return creator
+}
+
+postcss.stringify = stringify
+postcss.parse = parse
+postcss.fromJSON = fromJSON
+postcss.list = list
+
+postcss.comment = defaults => new Comment(defaults)
+postcss.atRule = defaults => new AtRule(defaults)
+postcss.decl = defaults => new Declaration(defaults)
+postcss.rule = defaults => new Rule(defaults)
+postcss.root = defaults => new Root(defaults)
+postcss.document = defaults => new Document(defaults)
+
+postcss.CssSyntaxError = CssSyntaxError
+postcss.Declaration = Declaration
+postcss.Container = Container
+postcss.Document = Document
+postcss.Comment = Comment
+postcss.Warning = Warning
+postcss.AtRule = AtRule
+postcss.Result = Result
+postcss.Input = Input
+postcss.Rule = Rule
+postcss.Root = Root
+postcss.Node = Node
+
+LazyResult.registerPostcss(postcss)
+
+module.exports = postcss
+postcss.default = postcss
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.mjs
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.mjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/postcss.mjs	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,29 @@
+import postcss from './postcss.js'
+
+export default postcss
+
+export const stringify = postcss.stringify
+export const fromJSON = postcss.fromJSON
+export const plugin = postcss.plugin
+export const parse = postcss.parse
+export const list = postcss.list
+
+export const document = postcss.document
+export const comment = postcss.comment
+export const atRule = postcss.atRule
+export const rule = postcss.rule
+export const decl = postcss.decl
+export const root = postcss.root
+
+export const CssSyntaxError = postcss.CssSyntaxError
+export const Declaration = postcss.Declaration
+export const Container = postcss.Container
+export const Document = postcss.Document
+export const Comment = postcss.Comment
+export const Warning = postcss.Warning
+export const AtRule = postcss.AtRule
+export const Result = postcss.Result
+export const Input = postcss.Input
+export const Rule = postcss.Rule
+export const Root = postcss.Root
+export const Node = postcss.Node
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,72 @@
+import { SourceMapConsumer } from 'source-map-js'
+
+import { ProcessOptions } from './postcss.js'
+
+/**
+ * Source map information from input CSS.
+ * For example, source map after Sass compiler.
+ *
+ * This class will automatically find source map in input CSS or in file system
+ * near input file (according `from` option).
+ *
+ * ```js
+ * const root = parse(css, { from: 'a.sass.css' })
+ * root.input.map //=> PreviousMap
+ * ```
+ */
+export default class PreviousMap {
+  /**
+   * Was source map inlined by data-uri to input CSS.
+   */
+  inline: boolean
+
+  /**
+   * `sourceMappingURL` content.
+   */
+  annotation?: string
+
+  /**
+   * Source map file content.
+   */
+  text?: string
+
+  /**
+   * The directory with source map file, if source map is in separated file.
+   */
+  root?: string
+
+  /**
+   * The CSS source identifier. Contains `Input#file` if the user
+   * set the `from` option, or `Input#id` if they did not.
+   */
+  file?: string
+
+  /**
+   * Path to source map file.
+   */
+  mapFile?: string
+
+  /**
+   * @param css  Input CSS source.
+   * @param opts Process options.
+   */
+  constructor(css: string, opts?: ProcessOptions)
+
+  /**
+   * Create a instance of `SourceMapGenerator` class
+   * from the `source-map` library to work with source map information.
+   *
+   * It is lazy method, so it will create object only on first call
+   * and then it will use cache.
+   *
+   * @return Object with source map information.
+   */
+  consumer(): SourceMapConsumer
+
+  /**
+   * Does source map contains `sourcesContent` with input source text.
+   *
+   * @return Is `sourcesContent` present.
+   */
+  withContent(): boolean
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/previous-map.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,142 @@
+'use strict'
+
+let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')
+let { existsSync, readFileSync } = require('fs')
+let { dirname, join } = require('path')
+
+function fromBase64(str) {
+  if (Buffer) {
+    return Buffer.from(str, 'base64').toString()
+  } else {
+    // istanbul ignore next
+    return window.atob(str)
+  }
+}
+
+class PreviousMap {
+  constructor(css, opts) {
+    if (opts.map === false) return
+    this.loadAnnotation(css)
+    this.inline = this.startWith(this.annotation, 'data:')
+
+    let prev = opts.map ? opts.map.prev : undefined
+    let text = this.loadMap(opts.from, prev)
+    if (!this.mapFile && opts.from) {
+      this.mapFile = opts.from
+    }
+    if (this.mapFile) this.root = dirname(this.mapFile)
+    if (text) this.text = text
+  }
+
+  consumer() {
+    if (!this.consumerCache) {
+      this.consumerCache = new SourceMapConsumer(this.text)
+    }
+    return this.consumerCache
+  }
+
+  withContent() {
+    return !!(
+      this.consumer().sourcesContent &&
+      this.consumer().sourcesContent.length > 0
+    )
+  }
+
+  startWith(string, start) {
+    if (!string) return false
+    return string.substr(0, start.length) === start
+  }
+
+  getAnnotationURL(sourceMapString) {
+    return sourceMapString.replace(/^\/\*\s*# sourceMappingURL=/, '').trim()
+  }
+
+  loadAnnotation(css) {
+    let comments = css.match(/\/\*\s*# sourceMappingURL=/gm)
+    if (!comments) return
+
+    // sourceMappingURLs from comments, strings, etc.
+    let start = css.lastIndexOf(comments.pop())
+    let end = css.indexOf('*/', start)
+
+    if (start > -1 && end > -1) {
+      // Locate the last sourceMappingURL to avoid pickin
+      this.annotation = this.getAnnotationURL(css.substring(start, end))
+    }
+  }
+
+  decodeInline(text) {
+    let baseCharsetUri = /^data:application\/json;charset=utf-?8;base64,/
+    let baseUri = /^data:application\/json;base64,/
+    let charsetUri = /^data:application\/json;charset=utf-?8,/
+    let uri = /^data:application\/json,/
+
+    if (charsetUri.test(text) || uri.test(text)) {
+      return decodeURIComponent(text.substr(RegExp.lastMatch.length))
+    }
+
+    if (baseCharsetUri.test(text) || baseUri.test(text)) {
+      return fromBase64(text.substr(RegExp.lastMatch.length))
+    }
+
+    let encoding = text.match(/data:application\/json;([^,]+),/)[1]
+    throw new Error('Unsupported source map encoding ' + encoding)
+  }
+
+  loadFile(path) {
+    this.root = dirname(path)
+    if (existsSync(path)) {
+      this.mapFile = path
+      return readFileSync(path, 'utf-8').toString().trim()
+    }
+  }
+
+  loadMap(file, prev) {
+    if (prev === false) return false
+
+    if (prev) {
+      if (typeof prev === 'string') {
+        return prev
+      } else if (typeof prev === 'function') {
+        let prevPath = prev(file)
+        if (prevPath) {
+          let map = this.loadFile(prevPath)
+          if (!map) {
+            throw new Error(
+              'Unable to load previous source map: ' + prevPath.toString()
+            )
+          }
+          return map
+        }
+      } else if (prev instanceof SourceMapConsumer) {
+        return SourceMapGenerator.fromSourceMap(prev).toString()
+      } else if (prev instanceof SourceMapGenerator) {
+        return prev.toString()
+      } else if (this.isMap(prev)) {
+        return JSON.stringify(prev)
+      } else {
+        throw new Error(
+          'Unsupported previous source map format: ' + prev.toString()
+        )
+      }
+    } else if (this.inline) {
+      return this.decodeInline(this.annotation)
+    } else if (this.annotation) {
+      let map = this.annotation
+      if (file) map = join(dirname(file), map)
+      return this.loadFile(map)
+    }
+  }
+
+  isMap(map) {
+    if (typeof map !== 'object') return false
+    return (
+      typeof map.mappings === 'string' ||
+      typeof map._mappings === 'string' ||
+      Array.isArray(map.sections)
+    )
+  }
+}
+
+module.exports = PreviousMap
+PreviousMap.default = PreviousMap
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,101 @@
+import {
+  AcceptedPlugin,
+  Plugin,
+  ProcessOptions,
+  Transformer,
+  TransformCallback
+} from './postcss.js'
+import LazyResult from './lazy-result.js'
+import Result from './result.js'
+import Root from './root.js'
+
+/**
+ * Contains plugins to process CSS. Create one `Processor` instance,
+ * initialize its plugins, and then use that instance on numerous CSS files.
+ *
+ * ```js
+ * const processor = postcss([autoprefixer, precss])
+ * processor.process(css1).then(result => console.log(result.css))
+ * processor.process(css2).then(result => console.log(result.css))
+ * ```
+ */
+export default class Processor {
+  /**
+   * Current PostCSS version.
+   *
+   * ```js
+   * if (result.processor.version.split('.')[0] !== '6') {
+   *   throw new Error('This plugin works only with PostCSS 6')
+   * }
+   * ```
+   */
+  version: string
+
+  /**
+   * Plugins added to this processor.
+   *
+   * ```js
+   * const processor = postcss([autoprefixer, precss])
+   * processor.plugins.length //=> 2
+   * ```
+   */
+  plugins: (Plugin | Transformer | TransformCallback)[]
+
+  /**
+   * @param plugins PostCSS plugins
+   */
+  constructor(plugins?: AcceptedPlugin[])
+
+  /**
+   * Adds a plugin to be used as a CSS processor.
+   *
+   * PostCSS plugin can be in 4 formats:
+   * * A plugin in `Plugin` format.
+   * * A plugin creator function with `pluginCreator.postcss = true`.
+   *   PostCSS will call this function without argument to get plugin.
+   * * A function. PostCSS will pass the function a @{link Root}
+   *   as the first argument and current `Result` instance
+   *   as the second.
+   * * Another `Processor` instance. PostCSS will copy plugins
+   *   from that instance into this one.
+   *
+   * Plugins can also be added by passing them as arguments when creating
+   * a `postcss` instance (see [`postcss(plugins)`]).
+   *
+   * Asynchronous plugins should return a `Promise` instance.
+   *
+   * ```js
+   * const processor = postcss()
+   *   .use(autoprefixer)
+   *   .use(precss)
+   * ```
+   *
+   * @param plugin PostCSS plugin or `Processor` with plugins.
+   * @return {Processes} Current processor to make methods chain.
+   */
+  use(plugin: AcceptedPlugin): this
+
+  /**
+   * Parses source CSS and returns a `LazyResult` Promise proxy.
+   * Because some plugins can be asynchronous it doesn’t make
+   * any transformations. Transformations will be applied
+   * in the `LazyResult` methods.
+   *
+   * ```js
+   * processor.process(css, { from: 'a.css', to: 'a.out.css' })
+   *   .then(result => {
+   *      console.log(result.css)
+   *   })
+   * ```
+   *
+   * @param css String with input CSS or any object with a `toString()` method,
+   *            like a Buffer. Optionally, senda `Result` instance
+   *            and the processor will take the `Root` from it.
+   * @param opts Options.
+   * @return Promise proxy.
+   */
+  process(
+    css: string | { toString(): string } | Result | LazyResult | Root,
+    options?: ProcessOptions
+  ): LazyResult
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/processor.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,74 @@
+'use strict'
+
+let LazyResult = require('./lazy-result')
+let Document = require('./document')
+let Root = require('./root')
+
+class Processor {
+  constructor(plugins = []) {
+    this.version = '8.3.11'
+    this.plugins = this.normalize(plugins)
+  }
+
+  use(plugin) {
+    this.plugins = this.plugins.concat(this.normalize([plugin]))
+    return this
+  }
+
+  process(css, opts = {}) {
+    if (
+      this.plugins.length === 0 &&
+      typeof opts.parser === 'undefined' &&
+      typeof opts.stringifier === 'undefined' &&
+      typeof opts.syntax === 'undefined' &&
+      !opts.hideNothingWarning
+    ) {
+      if (process.env.NODE_ENV !== 'production') {
+        if (typeof console !== 'undefined' && console.warn) {
+          console.warn(
+            'You did not set any plugins, parser, or stringifier. ' +
+              'Right now, PostCSS does nothing. Pick plugins for your case ' +
+              'on https://www.postcss.parts/ and use them in postcss.config.js.'
+          )
+        }
+      }
+    }
+    return new LazyResult(this, css, opts)
+  }
+
+  normalize(plugins) {
+    let normalized = []
+    for (let i of plugins) {
+      if (i.postcss === true) {
+        i = i()
+      } else if (i.postcss) {
+        i = i.postcss
+      }
+
+      if (typeof i === 'object' && Array.isArray(i.plugins)) {
+        normalized = normalized.concat(i.plugins)
+      } else if (typeof i === 'object' && i.postcssPlugin) {
+        normalized.push(i)
+      } else if (typeof i === 'function') {
+        normalized.push(i)
+      } else if (typeof i === 'object' && (i.parse || i.stringify)) {
+        if (process.env.NODE_ENV !== 'production') {
+          throw new Error(
+            'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +
+              'one of the syntax/parser/stringifier options as outlined ' +
+              'in your PostCSS runner documentation.'
+          )
+        }
+      } else {
+        throw new Error(i + ' is not a PostCSS plugin')
+      }
+    }
+    return normalized
+  }
+}
+
+module.exports = Processor
+Processor.default = Processor
+
+Root.registerProcessor(Processor)
+Document.registerProcessor(Processor)
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,195 @@
+import {
+  ProcessOptions,
+  Plugin,
+  SourceMap,
+  TransformCallback,
+  Root,
+  Node,
+  Warning,
+  WarningOptions
+} from './postcss.js'
+import Processor from './processor.js'
+
+export interface Message {
+  /**
+   * Message type.
+   */
+  type: string
+
+  /**
+   * Source PostCSS plugin name.
+   */
+  plugin?: string
+
+  [others: string]: any
+}
+
+export interface ResultOptions extends ProcessOptions {
+  /**
+   * The CSS node that was the source of the warning.
+   */
+  node?: Node
+
+  /**
+   * Name of plugin that created this warning. `Result#warn` will fill it
+   * automatically with `Plugin#postcssPlugin` value.
+   */
+  plugin?: string
+}
+
+/**
+ * Provides the result of the PostCSS transformations.
+ *
+ * A Result instance is returned by `LazyResult#then`
+ * or `Root#toResult` methods.
+ *
+ * ```js
+ * postcss([autoprefixer]).process(css).then(result => {
+ *  console.log(result.css)
+ * })
+ * ```
+ *
+ * ```js
+ * const result2 = postcss.parse(css).toResult()
+ * ```
+ */
+export default class Result {
+  /**
+   * The Processor instance used for this transformation.
+   *
+   * ```js
+   * for (const plugin of result.processor.plugins) {
+   *   if (plugin.postcssPlugin === 'postcss-bad') {
+   *     throw 'postcss-good is incompatible with postcss-bad'
+   *   }
+   * })
+   * ```
+   */
+  processor: Processor
+
+  /**
+   * Contains messages from plugins (e.g., warnings or custom messages).
+   * Each message should have type and plugin properties.
+   *
+   * ```js
+   * AtRule: {
+   *   import: (atRule, { result }) {
+   *     const importedFile = parseImport(atRule)
+   *     result.messages.push({
+   *       type: 'dependency',
+   *       plugin: 'postcss-import',
+   *       file: importedFile,
+   *       parent: result.opts.from
+   *     })
+   *   }
+   * }
+   * ```
+   */
+  messages: Message[]
+
+  /**
+   * Root node after all transformations.
+   *
+   * ```js
+   * root.toResult().root === root
+   * ```
+   */
+  root: Root
+
+  /**
+   * Options from the `Processor#process` or `Root#toResult` call
+   * that produced this Result instance.]
+   *
+   * ```js
+   * root.toResult(opts).opts === opts
+   * ```
+   */
+  opts: ResultOptions
+
+  /**
+   * A CSS string representing of `Result#root`.
+   *
+   * ```js
+   * postcss.parse('a{}').toResult().css //=> "a{}"
+   * ```
+   */
+  css: string
+
+  /**
+   * An instance of `SourceMapGenerator` class from the `source-map` library,
+   * representing changes to the `Result#root` instance.
+   *
+   * ```js
+   * result.map.toJSON() //=> { version: 3, file: 'a.css', … }
+   * ```
+   *
+   * ```js
+   * if (result.map) {
+   *   fs.writeFileSync(result.opts.to + '.map', result.map.toString())
+   * }
+   * ```
+   */
+  map: SourceMap
+
+  /**
+   * Last runned PostCSS plugin.
+   */
+  lastPlugin: Plugin | TransformCallback
+
+  /**
+   * @param processor Processor used for this transformation.
+   * @param root      Root node after all transformations.
+   * @param opts      Options from the `Processor#process` or `Root#toResult`.
+   */
+  constructor(processor: Processor, root: Root, opts: ResultOptions)
+
+  /**
+   * An alias for the `Result#css` property.
+   * Use it with syntaxes that generate non-CSS output.
+   *
+   * ```js
+   * result.css === result.content
+   * ```
+   */
+  get content(): string
+
+  /**
+   * Returns for `Result#css` content.
+   *
+   * ```js
+   * result + '' === result.css
+   * ```
+   *
+   * @return String representing of `Result#root`.
+   */
+  toString(): string
+
+  /**
+   * Creates an instance of `Warning` and adds it to `Result#messages`.
+   *
+   * ```js
+   * if (decl.important) {
+   *   result.warn('Avoid !important', { node: decl, word: '!important' })
+   * }
+   * ```
+   *
+   * @param text Warning message.
+   * @param opts Warning options.
+   * @return Created warning.
+   */
+  warn(message: string, options?: WarningOptions): Warning
+
+  /**
+   * Returns warnings from plugins. Filters `Warning` instances
+   * from `Result#messages`.
+   *
+   * ```js
+   * result.warnings().forEach(warn => {
+   *   console.warn(warn.toString())
+   * })
+   * ```
+   *
+   * @return Warnings from plugins.
+   */
+  warnings(): Warning[]
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/result.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,42 @@
+'use strict'
+
+let Warning = require('./warning')
+
+class Result {
+  constructor(processor, root, opts) {
+    this.processor = processor
+    this.messages = []
+    this.root = root
+    this.opts = opts
+    this.css = undefined
+    this.map = undefined
+  }
+
+  toString() {
+    return this.css
+  }
+
+  warn(text, opts = {}) {
+    if (!opts.plugin) {
+      if (this.lastPlugin && this.lastPlugin.postcssPlugin) {
+        opts.plugin = this.lastPlugin.postcssPlugin
+      }
+    }
+
+    let warning = new Warning(text, opts)
+    this.messages.push(warning)
+
+    return warning
+  }
+
+  warnings() {
+    return this.messages.filter(i => i.type === 'warning')
+  }
+
+  get content() {
+    return this.css
+  }
+}
+
+module.exports = Result
+Result.default = Result
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,73 @@
+import Container, { ContainerProps } from './container.js'
+import Document from './document.js'
+import { ProcessOptions } from './postcss.js'
+import Result from './result.js'
+
+interface RootRaws extends Record<string, any> {
+  /**
+   * The space symbols after the last child to the end of file.
+   */
+  after?: string
+
+  /**
+   * Non-CSS code before `Root`, when `Root` is inside `Document`.
+   *
+   * **Experimental:** some aspects of this node could change within minor
+   * or patch version releases.
+   */
+  codeBefore?: string
+
+  /**
+   * Non-CSS code after `Root`, when `Root` is inside `Document`.
+   *
+   * **Experimental:** some aspects of this node could change within minor
+   * or patch version releases.
+   */
+  codeAfter?: string
+
+  /**
+   * Is the last child has an (optional) semicolon.
+   */
+  semicolon?: boolean
+}
+
+export interface RootProps extends ContainerProps {
+  /**
+   * Information used to generate byte-to-byte equal node string
+   * as it was in the origin input.
+   * */
+  raws?: RootRaws
+}
+
+/**
+ * Represents a CSS file and contains all its parsed nodes.
+ *
+ * ```js
+ * const root = postcss.parse('a{color:black} b{z-index:2}')
+ * root.type         //=> 'root'
+ * root.nodes.length //=> 2
+ * ```
+ */
+export default class Root extends Container {
+  type: 'root'
+  parent: Document | undefined
+  raws: RootRaws
+
+  /**
+   * Returns a `Result` instance representing the root’s CSS.
+   *
+   * ```js
+   * const root1 = postcss.parse(css1, { from: 'a.css' })
+   * const root2 = postcss.parse(css2, { from: 'b.css' })
+   * root1.append(root2)
+   * const result = root1.toResult({ to: 'all.css', map: true })
+   * ```
+   *
+   * @param opts Options.
+   * @return Result with current root’s CSS.
+   */
+  toResult(options?: ProcessOptions): Result
+
+  constructor(defaults?: RootProps)
+  assign(overrides: object | RootProps): this
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/root.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,59 @@
+'use strict'
+
+let Container = require('./container')
+
+let LazyResult, Processor
+
+class Root extends Container {
+  constructor(defaults) {
+    super(defaults)
+    this.type = 'root'
+    if (!this.nodes) this.nodes = []
+  }
+
+  removeChild(child, ignore) {
+    let index = this.index(child)
+
+    if (!ignore && index === 0 && this.nodes.length > 1) {
+      this.nodes[1].raws.before = this.nodes[index].raws.before
+    }
+
+    return super.removeChild(child)
+  }
+
+  normalize(child, sample, type) {
+    let nodes = super.normalize(child)
+
+    if (sample) {
+      if (type === 'prepend') {
+        if (this.nodes.length > 1) {
+          sample.raws.before = this.nodes[1].raws.before
+        } else {
+          delete sample.raws.before
+        }
+      } else if (this.first !== sample) {
+        for (let node of nodes) {
+          node.raws.before = sample.raws.before
+        }
+      }
+    }
+
+    return nodes
+  }
+
+  toResult(opts = {}) {
+    let lazy = new LazyResult(new Processor(), this, opts)
+    return lazy.stringify()
+  }
+}
+
+Root.registerLazyResult = dependant => {
+  LazyResult = dependant
+}
+
+Root.registerProcessor = dependant => {
+  Processor = dependant
+}
+
+module.exports = Root
+Root.default = Root
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,104 @@
+import Container, { ContainerProps } from './container.js'
+
+interface RuleRaws {
+  /**
+   * The space symbols before the node. It also stores `*`
+   * and `_` symbols before the declaration (IE hack).
+   */
+  before?: string
+
+  /**
+   * The space symbols after the last child of the node to the end of the node.
+   */
+  after?: string
+
+  /**
+   * The symbols between the selector and `{` for rules.
+   */
+  between?: string
+
+  /**
+   * Contains `true` if the last child has an (optional) semicolon.
+   */
+  semicolon?: boolean
+
+  /**
+   * Contains `true` if there is semicolon after rule.
+   */
+  ownSemicolon?: string
+
+  /**
+   * The rule’s selector with comments.
+   */
+  selector?: {
+    value: string
+    raw: string
+  }
+}
+
+export interface RuleProps extends ContainerProps {
+  /** Selector or selectors of the rule. */
+  selector?: string
+  /** Selectors of the rule represented as an array of strings. */
+  selectors?: string[]
+  /** Information used to generate byte-to-byte equal node string as it was in the origin input. */
+  raws?: RuleRaws
+}
+
+/**
+ * Represents a CSS rule: a selector followed by a declaration block.
+ *
+ * ```js
+ * Once (root, { Rule }) {
+ *   let a = new Rule({ selector: 'a' })
+ *   a.append(…)
+ *   root.append(a)
+ * }
+ * ```
+ *
+ * ```js
+ * const root = postcss.parse('a{}')
+ * const rule = root.first
+ * rule.type       //=> 'rule'
+ * rule.toString() //=> 'a{}'
+ * ```
+ */
+export default class Rule extends Container {
+  type: 'rule'
+  parent: Container | undefined
+  raws: RuleRaws
+
+  /**
+   * The rule’s full selector represented as a string.
+   *
+   * ```js
+   * const root = postcss.parse('a, b { }')
+   * const rule = root.first
+   * rule.selector //=> 'a, b'
+   * ```
+   */
+  selector: string
+
+  /**
+   * An array containing the rule’s individual selectors.
+   * Groups of selectors are split at commas.
+   *
+   * ```js
+   * const root = postcss.parse('a, b { }')
+   * const rule = root.first
+   *
+   * rule.selector  //=> 'a, b'
+   * rule.selectors //=> ['a', 'b']
+   *
+   * rule.selectors = ['a', 'strong']
+   * rule.selector //=> 'a, strong'
+   * ```
+   */
+  selectors: string[]
+
+  constructor(defaults?: RuleProps)
+  assign(overrides: object | RuleProps): this
+  clone(overrides?: Partial<RuleProps>): this
+  cloneBefore(overrides?: Partial<RuleProps>): this
+  cloneAfter(overrides?: Partial<RuleProps>): this
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/rule.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,27 @@
+'use strict'
+
+let Container = require('./container')
+let list = require('./list')
+
+class Rule extends Container {
+  constructor(defaults) {
+    super(defaults)
+    this.type = 'rule'
+    if (!this.nodes) this.nodes = []
+  }
+
+  get selectors() {
+    return list.comma(this.selector)
+  }
+
+  set selectors(values) {
+    let match = this.selector ? this.selector.match(/,\s*/) : null
+    let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')
+    this.selector = values.join(sep)
+  }
+}
+
+module.exports = Rule
+Rule.default = Rule
+
+Container.registerRule(Rule)
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringifier.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringifier.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringifier.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,351 @@
+'use strict'
+
+const DEFAULT_RAW = {
+  colon: ': ',
+  indent: '    ',
+  beforeDecl: '\n',
+  beforeRule: '\n',
+  beforeOpen: ' ',
+  beforeClose: '\n',
+  beforeComment: '\n',
+  after: '\n',
+  emptyBody: '',
+  commentLeft: ' ',
+  commentRight: ' ',
+  semicolon: false
+}
+
+function capitalize(str) {
+  return str[0].toUpperCase() + str.slice(1)
+}
+
+class Stringifier {
+  constructor(builder) {
+    this.builder = builder
+  }
+
+  stringify(node, semicolon) {
+    /* istanbul ignore if */
+    if (!this[node.type]) {
+      throw new Error(
+        'Unknown AST node type ' +
+          node.type +
+          '. ' +
+          'Maybe you need to change PostCSS stringifier.'
+      )
+    }
+    this[node.type](node, semicolon)
+  }
+
+  document(node) {
+    this.body(node)
+  }
+
+  root(node) {
+    this.body(node)
+    if (node.raws.after) this.builder(node.raws.after)
+  }
+
+  comment(node) {
+    let left = this.raw(node, 'left', 'commentLeft')
+    let right = this.raw(node, 'right', 'commentRight')
+    this.builder('/*' + left + node.text + right + '*/', node)
+  }
+
+  decl(node, semicolon) {
+    let between = this.raw(node, 'between', 'colon')
+    let string = node.prop + between + this.rawValue(node, 'value')
+
+    if (node.important) {
+      string += node.raws.important || ' !important'
+    }
+
+    if (semicolon) string += ';'
+    this.builder(string, node)
+  }
+
+  rule(node) {
+    this.block(node, this.rawValue(node, 'selector'))
+    if (node.raws.ownSemicolon) {
+      this.builder(node.raws.ownSemicolon, node, 'end')
+    }
+  }
+
+  atrule(node, semicolon) {
+    let name = '@' + node.name
+    let params = node.params ? this.rawValue(node, 'params') : ''
+
+    if (typeof node.raws.afterName !== 'undefined') {
+      name += node.raws.afterName
+    } else if (params) {
+      name += ' '
+    }
+
+    if (node.nodes) {
+      this.block(node, name + params)
+    } else {
+      let end = (node.raws.between || '') + (semicolon ? ';' : '')
+      this.builder(name + params + end, node)
+    }
+  }
+
+  body(node) {
+    let last = node.nodes.length - 1
+    while (last > 0) {
+      if (node.nodes[last].type !== 'comment') break
+      last -= 1
+    }
+
+    let semicolon = this.raw(node, 'semicolon')
+    for (let i = 0; i < node.nodes.length; i++) {
+      let child = node.nodes[i]
+      let before = this.raw(child, 'before')
+      if (before) this.builder(before)
+      this.stringify(child, last !== i || semicolon)
+    }
+  }
+
+  block(node, start) {
+    let between = this.raw(node, 'between', 'beforeOpen')
+    this.builder(start + between + '{', node, 'start')
+
+    let after
+    if (node.nodes && node.nodes.length) {
+      this.body(node)
+      after = this.raw(node, 'after')
+    } else {
+      after = this.raw(node, 'after', 'emptyBody')
+    }
+
+    if (after) this.builder(after)
+    this.builder('}', node, 'end')
+  }
+
+  raw(node, own, detect) {
+    let value
+    if (!detect) detect = own
+
+    // Already had
+    if (own) {
+      value = node.raws[own]
+      if (typeof value !== 'undefined') return value
+    }
+
+    let parent = node.parent
+
+    if (detect === 'before') {
+      // Hack for first rule in CSS
+      if (!parent || (parent.type === 'root' && parent.first === node)) {
+        return ''
+      }
+
+      // `root` nodes in `document` should use only their own raws
+      if (parent && parent.type === 'document') {
+        return ''
+      }
+    }
+
+    // Floating child without parent
+    if (!parent) return DEFAULT_RAW[detect]
+
+    // Detect style by other nodes
+    let root = node.root()
+    if (!root.rawCache) root.rawCache = {}
+    if (typeof root.rawCache[detect] !== 'undefined') {
+      return root.rawCache[detect]
+    }
+
+    if (detect === 'before' || detect === 'after') {
+      return this.beforeAfter(node, detect)
+    } else {
+      let method = 'raw' + capitalize(detect)
+      if (this[method]) {
+        value = this[method](root, node)
+      } else {
+        root.walk(i => {
+          value = i.raws[own]
+          if (typeof value !== 'undefined') return false
+        })
+      }
+    }
+
+    if (typeof value === 'undefined') value = DEFAULT_RAW[detect]
+
+    root.rawCache[detect] = value
+    return value
+  }
+
+  rawSemicolon(root) {
+    let value
+    root.walk(i => {
+      if (i.nodes && i.nodes.length && i.last.type === 'decl') {
+        value = i.raws.semicolon
+        if (typeof value !== 'undefined') return false
+      }
+    })
+    return value
+  }
+
+  rawEmptyBody(root) {
+    let value
+    root.walk(i => {
+      if (i.nodes && i.nodes.length === 0) {
+        value = i.raws.after
+        if (typeof value !== 'undefined') return false
+      }
+    })
+    return value
+  }
+
+  rawIndent(root) {
+    if (root.raws.indent) return root.raws.indent
+    let value
+    root.walk(i => {
+      let p = i.parent
+      if (p && p !== root && p.parent && p.parent === root) {
+        if (typeof i.raws.before !== 'undefined') {
+          let parts = i.raws.before.split('\n')
+          value = parts[parts.length - 1]
+          value = value.replace(/\S/g, '')
+          return false
+        }
+      }
+    })
+    return value
+  }
+
+  rawBeforeComment(root, node) {
+    let value
+    root.walkComments(i => {
+      if (typeof i.raws.before !== 'undefined') {
+        value = i.raws.before
+        if (value.includes('\n')) {
+          value = value.replace(/[^\n]+$/, '')
+        }
+        return false
+      }
+    })
+    if (typeof value === 'undefined') {
+      value = this.raw(node, null, 'beforeDecl')
+    } else if (value) {
+      value = value.replace(/\S/g, '')
+    }
+    return value
+  }
+
+  rawBeforeDecl(root, node) {
+    let value
+    root.walkDecls(i => {
+      if (typeof i.raws.before !== 'undefined') {
+        value = i.raws.before
+        if (value.includes('\n')) {
+          value = value.replace(/[^\n]+$/, '')
+        }
+        return false
+      }
+    })
+    if (typeof value === 'undefined') {
+      value = this.raw(node, null, 'beforeRule')
+    } else if (value) {
+      value = value.replace(/\S/g, '')
+    }
+    return value
+  }
+
+  rawBeforeRule(root) {
+    let value
+    root.walk(i => {
+      if (i.nodes && (i.parent !== root || root.first !== i)) {
+        if (typeof i.raws.before !== 'undefined') {
+          value = i.raws.before
+          if (value.includes('\n')) {
+            value = value.replace(/[^\n]+$/, '')
+          }
+          return false
+        }
+      }
+    })
+    if (value) value = value.replace(/\S/g, '')
+    return value
+  }
+
+  rawBeforeClose(root) {
+    let value
+    root.walk(i => {
+      if (i.nodes && i.nodes.length > 0) {
+        if (typeof i.raws.after !== 'undefined') {
+          value = i.raws.after
+          if (value.includes('\n')) {
+            value = value.replace(/[^\n]+$/, '')
+          }
+          return false
+        }
+      }
+    })
+    if (value) value = value.replace(/\S/g, '')
+    return value
+  }
+
+  rawBeforeOpen(root) {
+    let value
+    root.walk(i => {
+      if (i.type !== 'decl') {
+        value = i.raws.between
+        if (typeof value !== 'undefined') return false
+      }
+    })
+    return value
+  }
+
+  rawColon(root) {
+    let value
+    root.walkDecls(i => {
+      if (typeof i.raws.between !== 'undefined') {
+        value = i.raws.between.replace(/[^\s:]/g, '')
+        return false
+      }
+    })
+    return value
+  }
+
+  beforeAfter(node, detect) {
+    let value
+    if (node.type === 'decl') {
+      value = this.raw(node, null, 'beforeDecl')
+    } else if (node.type === 'comment') {
+      value = this.raw(node, null, 'beforeComment')
+    } else if (detect === 'before') {
+      value = this.raw(node, null, 'beforeRule')
+    } else {
+      value = this.raw(node, null, 'beforeClose')
+    }
+
+    let buf = node.parent
+    let depth = 0
+    while (buf && buf.type !== 'root') {
+      depth += 1
+      buf = buf.parent
+    }
+
+    if (value.includes('\n')) {
+      let indent = this.raw(node, null, 'indent')
+      if (indent.length) {
+        for (let step = 0; step < depth; step++) value += indent
+      }
+    }
+
+    return value
+  }
+
+  rawValue(node, prop) {
+    let value = node[prop]
+    let raw = node.raws[prop]
+    if (raw && raw.value === value) {
+      return raw.raw
+    }
+
+    return value
+  }
+}
+
+module.exports = Stringifier
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,5 @@
+import { Stringifier } from './postcss.js'
+
+declare const stringify: Stringifier
+
+export default stringify
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/stringify.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,11 @@
+'use strict'
+
+let Stringifier = require('./stringifier')
+
+function stringify(node, builder) {
+  let str = new Stringifier(builder)
+  str.stringify(node)
+}
+
+module.exports = stringify
+stringify.default = stringify
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/symbols.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/symbols.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/symbols.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports.isClean = Symbol('isClean')
+
+module.exports.my = Symbol('my')
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/terminal-highlight.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/terminal-highlight.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/terminal-highlight.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,70 @@
+'use strict'
+
+let pico = require('picocolors')
+
+let tokenizer = require('./tokenize')
+
+let Input
+
+function registerInput(dependant) {
+  Input = dependant
+}
+
+const HIGHLIGHT_THEME = {
+  'brackets': pico.cyan,
+  'at-word': pico.cyan,
+  'comment': pico.gray,
+  'string': pico.green,
+  'class': pico.yellow,
+  'hash': pico.magenta,
+  'call': pico.cyan,
+  '(': pico.cyan,
+  ')': pico.cyan,
+  '{': pico.yellow,
+  '}': pico.yellow,
+  '[': pico.yellow,
+  ']': pico.yellow,
+  ':': pico.yellow,
+  ';': pico.yellow
+}
+
+function getTokenType([type, value], processor) {
+  if (type === 'word') {
+    if (value[0] === '.') {
+      return 'class'
+    }
+    if (value[0] === '#') {
+      return 'hash'
+    }
+  }
+
+  if (!processor.endOfFile()) {
+    let next = processor.nextToken()
+    processor.back(next)
+    if (next[0] === 'brackets' || next[0] === '(') return 'call'
+  }
+
+  return type
+}
+
+function terminalHighlight(css) {
+  let processor = tokenizer(new Input(css), { ignoreErrors: true })
+  let result = ''
+  while (!processor.endOfFile()) {
+    let token = processor.nextToken()
+    let color = HIGHLIGHT_THEME[getTokenType(token, processor)]
+    if (color) {
+      result += token[1]
+        .split(/\r?\n/)
+        .map(i => color(i))
+        .join('\n')
+    } else {
+      result += token[1]
+    }
+  }
+  return result
+}
+
+terminalHighlight.registerInput = registerInput
+
+module.exports = terminalHighlight
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/tokenize.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/tokenize.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/tokenize.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,266 @@
+'use strict'
+
+const SINGLE_QUOTE = "'".charCodeAt(0)
+const DOUBLE_QUOTE = '"'.charCodeAt(0)
+const BACKSLASH = '\\'.charCodeAt(0)
+const SLASH = '/'.charCodeAt(0)
+const NEWLINE = '\n'.charCodeAt(0)
+const SPACE = ' '.charCodeAt(0)
+const FEED = '\f'.charCodeAt(0)
+const TAB = '\t'.charCodeAt(0)
+const CR = '\r'.charCodeAt(0)
+const OPEN_SQUARE = '['.charCodeAt(0)
+const CLOSE_SQUARE = ']'.charCodeAt(0)
+const OPEN_PARENTHESES = '('.charCodeAt(0)
+const CLOSE_PARENTHESES = ')'.charCodeAt(0)
+const OPEN_CURLY = '{'.charCodeAt(0)
+const CLOSE_CURLY = '}'.charCodeAt(0)
+const SEMICOLON = ';'.charCodeAt(0)
+const ASTERISK = '*'.charCodeAt(0)
+const COLON = ':'.charCodeAt(0)
+const AT = '@'.charCodeAt(0)
+
+const RE_AT_END = /[\t\n\f\r "#'()/;[\\\]{}]/g
+const RE_WORD_END = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g
+const RE_BAD_BRACKET = /.[\n"'(/\\]/
+const RE_HEX_ESCAPE = /[\da-f]/i
+
+module.exports = function tokenizer(input, options = {}) {
+  let css = input.css.valueOf()
+  let ignore = options.ignoreErrors
+
+  let code, next, quote, content, escape
+  let escaped, escapePos, prev, n, currentToken
+
+  let length = css.length
+  let pos = 0
+  let buffer = []
+  let returned = []
+
+  function position() {
+    return pos
+  }
+
+  function unclosed(what) {
+    throw input.error('Unclosed ' + what, pos)
+  }
+
+  function endOfFile() {
+    return returned.length === 0 && pos >= length
+  }
+
+  function nextToken(opts) {
+    if (returned.length) return returned.pop()
+    if (pos >= length) return
+
+    let ignoreUnclosed = opts ? opts.ignoreUnclosed : false
+
+    code = css.charCodeAt(pos)
+
+    switch (code) {
+      case NEWLINE:
+      case SPACE:
+      case TAB:
+      case CR:
+      case FEED: {
+        next = pos
+        do {
+          next += 1
+          code = css.charCodeAt(next)
+        } while (
+          code === SPACE ||
+          code === NEWLINE ||
+          code === TAB ||
+          code === CR ||
+          code === FEED
+        )
+
+        currentToken = ['space', css.slice(pos, next)]
+        pos = next - 1
+        break
+      }
+
+      case OPEN_SQUARE:
+      case CLOSE_SQUARE:
+      case OPEN_CURLY:
+      case CLOSE_CURLY:
+      case COLON:
+      case SEMICOLON:
+      case CLOSE_PARENTHESES: {
+        let controlChar = String.fromCharCode(code)
+        currentToken = [controlChar, controlChar, pos]
+        break
+      }
+
+      case OPEN_PARENTHESES: {
+        prev = buffer.length ? buffer.pop()[1] : ''
+        n = css.charCodeAt(pos + 1)
+        if (
+          prev === 'url' &&
+          n !== SINGLE_QUOTE &&
+          n !== DOUBLE_QUOTE &&
+          n !== SPACE &&
+          n !== NEWLINE &&
+          n !== TAB &&
+          n !== FEED &&
+          n !== CR
+        ) {
+          next = pos
+          do {
+            escaped = false
+            next = css.indexOf(')', next + 1)
+            if (next === -1) {
+              if (ignore || ignoreUnclosed) {
+                next = pos
+                break
+              } else {
+                unclosed('bracket')
+              }
+            }
+            escapePos = next
+            while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
+              escapePos -= 1
+              escaped = !escaped
+            }
+          } while (escaped)
+
+          currentToken = ['brackets', css.slice(pos, next + 1), pos, next]
+
+          pos = next
+        } else {
+          next = css.indexOf(')', pos + 1)
+          content = css.slice(pos, next + 1)
+
+          if (next === -1 || RE_BAD_BRACKET.test(content)) {
+            currentToken = ['(', '(', pos]
+          } else {
+            currentToken = ['brackets', content, pos, next]
+            pos = next
+          }
+        }
+
+        break
+      }
+
+      case SINGLE_QUOTE:
+      case DOUBLE_QUOTE: {
+        quote = code === SINGLE_QUOTE ? "'" : '"'
+        next = pos
+        do {
+          escaped = false
+          next = css.indexOf(quote, next + 1)
+          if (next === -1) {
+            if (ignore || ignoreUnclosed) {
+              next = pos + 1
+              break
+            } else {
+              unclosed('string')
+            }
+          }
+          escapePos = next
+          while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
+            escapePos -= 1
+            escaped = !escaped
+          }
+        } while (escaped)
+
+        currentToken = ['string', css.slice(pos, next + 1), pos, next]
+        pos = next
+        break
+      }
+
+      case AT: {
+        RE_AT_END.lastIndex = pos + 1
+        RE_AT_END.test(css)
+        if (RE_AT_END.lastIndex === 0) {
+          next = css.length - 1
+        } else {
+          next = RE_AT_END.lastIndex - 2
+        }
+
+        currentToken = ['at-word', css.slice(pos, next + 1), pos, next]
+
+        pos = next
+        break
+      }
+
+      case BACKSLASH: {
+        next = pos
+        escape = true
+        while (css.charCodeAt(next + 1) === BACKSLASH) {
+          next += 1
+          escape = !escape
+        }
+        code = css.charCodeAt(next + 1)
+        if (
+          escape &&
+          code !== SLASH &&
+          code !== SPACE &&
+          code !== NEWLINE &&
+          code !== TAB &&
+          code !== CR &&
+          code !== FEED
+        ) {
+          next += 1
+          if (RE_HEX_ESCAPE.test(css.charAt(next))) {
+            while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {
+              next += 1
+            }
+            if (css.charCodeAt(next + 1) === SPACE) {
+              next += 1
+            }
+          }
+        }
+
+        currentToken = ['word', css.slice(pos, next + 1), pos, next]
+
+        pos = next
+        break
+      }
+
+      default: {
+        if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {
+          next = css.indexOf('*/', pos + 2) + 1
+          if (next === 0) {
+            if (ignore || ignoreUnclosed) {
+              next = css.length
+            } else {
+              unclosed('comment')
+            }
+          }
+
+          currentToken = ['comment', css.slice(pos, next + 1), pos, next]
+          pos = next
+        } else {
+          RE_WORD_END.lastIndex = pos + 1
+          RE_WORD_END.test(css)
+          if (RE_WORD_END.lastIndex === 0) {
+            next = css.length - 1
+          } else {
+            next = RE_WORD_END.lastIndex - 2
+          }
+
+          currentToken = ['word', css.slice(pos, next + 1), pos, next]
+          buffer.push(currentToken)
+          pos = next
+        }
+
+        break
+      }
+    }
+
+    pos++
+    return currentToken
+  }
+
+  function back(token) {
+    returned.push(token)
+  }
+
+  return {
+    back,
+    nextToken,
+    endOfFile,
+    position
+  }
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/warn-once.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/warn-once.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/warn-once.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,12 @@
+'use strict'
+
+let printed = {}
+
+module.exports = function warnOnce(message) {
+  if (printed[message]) return
+  printed[message] = true
+
+  if (typeof console !== 'undefined' && console.warn) {
+    console.warn(message)
+  }
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,104 @@
+import Node from './node.js'
+
+export interface WarningOptions {
+  /**
+   * CSS node that caused the warning.
+   */
+  node?: Node
+
+  /**
+   * Word in CSS source that caused the warning.
+   */
+  word?: string
+
+  /**
+   * Index in CSS node string that caused the warning.
+   */
+  index?: number
+
+  /**
+   * Name of the plugin that created this warning. `Result#warn` fills
+   * this property automatically.
+   */
+  plugin?: string
+}
+
+/**
+ * Represents a plugin’s warning. It can be created using `Node#warn`.
+ *
+ * ```js
+ * if (decl.important) {
+ *   decl.warn(result, 'Avoid !important', { word: '!important' })
+ * }
+ * ```
+ */
+export default class Warning {
+  /**
+   * Type to filter warnings from `Result#messages`.
+   * Always equal to `"warning"`.
+   */
+  type: 'warning'
+
+  /**
+   * The warning message.
+   *
+   * ```js
+   * warning.text //=> 'Try to avoid !important'
+   * ```
+   */
+  text: string
+
+  /**
+   * The name of the plugin that created this warning.
+   * When you call `Node#warn` it will fill this property automatically.
+   *
+   * ```js
+   * warning.plugin //=> 'postcss-important'
+   * ```
+   */
+  plugin: string
+
+  /**
+   * Contains the CSS node that caused the warning.
+   *
+   * ```js
+   * warning.node.toString() //=> 'color: white !important'
+   * ```
+   */
+  node: Node
+
+  /**
+   * Line in the input file with this warning’s source.
+   *
+   * ```js
+   * warning.line //=> 5
+   * ```
+   */
+  line: number
+
+  /**
+   * Column in the input file with this warning’s source.
+   *
+   * ```js
+   * warning.column //=> 6
+   * ```
+   */
+  column: number
+
+  /**
+   * @param text Warning message.
+   * @param opts Warning options.
+   */
+  constructor(text: string, opts?: WarningOptions)
+
+  /**
+   * Returns a warning position and message.
+   *
+   * ```js
+   * warning.toString() //=> 'postcss-lint:a.css:10:14: Avoid !important'
+   * ```
+   *
+   * @return Warning position and message.
+   */
+  toString(): string
+}
Index: trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.js
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/lib/warning.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,35 @@
+'use strict'
+
+class Warning {
+  constructor(text, opts = {}) {
+    this.type = 'warning'
+    this.text = text
+
+    if (opts.node && opts.node.source) {
+      let pos = opts.node.positionBy(opts)
+      this.line = pos.line
+      this.column = pos.column
+    }
+
+    for (let opt in opts) this[opt] = opts[opt]
+  }
+
+  toString() {
+    if (this.node) {
+      return this.node.error(this.text, {
+        plugin: this.plugin,
+        index: this.index,
+        word: this.word
+      }).message
+    }
+
+    if (this.plugin) {
+      return this.plugin + ': ' + this.text
+    }
+
+    return this.text
+  }
+}
+
+module.exports = Warning
+Warning.default = Warning
Index: trip-planner-front/node_modules/critters/node_modules/postcss/package.json
===================================================================
--- trip-planner-front/node_modules/critters/node_modules/postcss/package.json	(revision b73803523f0488ec52498c2ba88889f1642ad263)
+++ trip-planner-front/node_modules/critters/node_modules/postcss/package.json	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -0,0 +1,109 @@
+{
+  "_from": "postcss@^8.3.7",
+  "_id": "postcss@8.3.11",
+  "_inBundle": false,
+  "_integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==",
+  "_location": "/critters/postcss",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "postcss@^8.3.7",
+    "name": "postcss",
+    "escapedName": "postcss",
+    "rawSpec": "^8.3.7",
+    "saveSpec": null,
+    "fetchSpec": "^8.3.7"
+  },
+  "_requiredBy": [
+    "/critters"
+  ],
+  "_resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz",
+  "_shasum": "c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858",
+  "_spec": "postcss@^8.3.7",
+  "_where": "C:\\Users\\DELL\\Desktop\\bachelor-thesis\\trip-planner-front\\node_modules\\critters",
+  "author": {
+    "name": "Andrey Sitnik",
+    "email": "andrey@sitnik.ru"
+  },
+  "browser": {
+    "./lib/terminal-highlight": false,
+    "source-map-js": false,
+    "path": false,
+    "url": false,
+    "fs": false
+  },
+  "bugs": {
+    "url": "https://github.com/postcss/postcss/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "nanoid": "^3.1.30",
+    "picocolors": "^1.0.0",
+    "source-map-js": "^0.6.2"
+  },
+  "deprecated": false,
+  "description": "Tool for transforming styles with JS plugins",
+  "engines": {
+    "node": "^10 || ^12 || >=14"
+  },
+  "exports": {
+    ".": {
+      "require": "./lib/postcss.js",
+      "import": "./lib/postcss.mjs",
+      "types": "./lib/postcss.d.ts"
+    },
+    "./lib/at-rule": "./lib/at-rule.js",
+    "./lib/comment": "./lib/comment.js",
+    "./lib/container": "./lib/container.js",
+    "./lib/css-syntax-error": "./lib/css-syntax-error.js",
+    "./lib/declaration": "./lib/declaration.js",
+    "./lib/fromJSON": "./lib/fromJSON.js",
+    "./lib/input": "./lib/input.js",
+    "./lib/lazy-result": "./lib/lazy-result.js",
+    "./lib/list": "./lib/list.js",
+    "./lib/map-generator": "./lib/map-generator.js",
+    "./lib/node": "./lib/node.js",
+    "./lib/parse": "./lib/parse.js",
+    "./lib/parser": "./lib/parser.js",
+    "./lib/postcss": "./lib/postcss.js",
+    "./lib/previous-map": "./lib/previous-map.js",
+    "./lib/processor": "./lib/processor.js",
+    "./lib/result": "./lib/result.js",
+    "./lib/root": "./lib/root.js",
+    "./lib/rule": "./lib/rule.js",
+    "./lib/stringifier": "./lib/stringifier.js",
+    "./lib/stringify": "./lib/stringify.js",
+    "./lib/symbols": "./lib/symbols.js",
+    "./lib/terminal-highlight": "./lib/terminal-highlight.js",
+    "./lib/tokenize": "./lib/tokenize.js",
+    "./lib/warn-once": "./lib/warn-once.js",
+    "./lib/warning": "./lib/warning.js",
+    "./package.json": "./package.json"
+  },
+  "funding": {
+    "type": "opencollective",
+    "url": "https://opencollective.com/postcss/"
+  },
+  "homepage": "https://postcss.org/",
+  "keywords": [
+    "css",
+    "postcss",
+    "rework",
+    "preprocessor",
+    "parser",
+    "source map",
+    "transform",
+    "manipulation",
+    "transpiler"
+  ],
+  "license": "MIT",
+  "main": "./lib/postcss.js",
+  "name": "postcss",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/postcss/postcss.git"
+  },
+  "types": "./lib/postcss.d.ts",
+  "version": "8.3.11"
+}
Index: trip-planner-front/node_modules/critters/package.json
===================================================================
--- trip-planner-front/node_modules/critters/package.json	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/package.json	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -1,32 +1,29 @@
 {
-  "_args": [
-    [
-      "critters@0.0.10",
-      "C:\\Users\\DELL\\Desktop\\bachelor-thesis\\trip-planner-front"
-    ]
-  ],
-  "_development": true,
-  "_from": "critters@0.0.10",
-  "_id": "critters@0.0.10",
+  "_from": "critters@0.0.12",
+  "_id": "critters@0.0.12",
   "_inBundle": false,
-  "_integrity": "sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw==",
+  "_integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==",
   "_location": "/critters",
-  "_phantomChildren": {},
+  "_phantomChildren": {
+    "nanoid": "3.1.30",
+    "source-map-js": "0.6.2"
+  },
   "_requested": {
     "type": "version",
     "registry": true,
-    "raw": "critters@0.0.10",
+    "raw": "critters@0.0.12",
     "name": "critters",
     "escapedName": "critters",
-    "rawSpec": "0.0.10",
+    "rawSpec": "0.0.12",
     "saveSpec": null,
-    "fetchSpec": "0.0.10"
+    "fetchSpec": "0.0.12"
   },
   "_requiredBy": [
     "/@angular-devkit/build-angular"
   ],
-  "_resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz",
-  "_spec": "0.0.10",
-  "_where": "C:\\Users\\DELL\\Desktop\\bachelor-thesis\\trip-planner-front",
+  "_resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz",
+  "_shasum": "32baa87526e053a41b67e19921673ed92264e2ab",
+  "_spec": "critters@0.0.12",
+  "_where": "C:\\Users\\DELL\\Desktop\\bachelor-thesis\\trip-planner-front\\node_modules\\@angular-devkit\\build-angular",
   "author": {
     "name": "The Chromium Authors"
@@ -35,4 +32,5 @@
     "url": "https://github.com/GoogleChromeLabs/critters/issues"
   },
+  "bundleDependencies": false,
   "contributors": [
     {
@@ -47,31 +45,19 @@
   "dependencies": {
     "chalk": "^4.1.0",
-    "css": "^3.0.0",
+    "css-select": "^4.1.3",
     "parse5": "^6.0.1",
     "parse5-htmlparser2-tree-adapter": "^6.0.1",
+    "postcss": "^8.3.7",
     "pretty-bytes": "^5.3.0"
   },
-  "description": "Plugin to inline critical CSS and lazy-load the rest.",
+  "deprecated": false,
+  "description": "Inline critical CSS and lazy-load the rest.",
   "devDependencies": {
-    "@babel/preset-env": "^7.11.0",
-    "babel-core": "^6.26.0",
-    "babel-jest": "^26.3.0",
-    "css-loader": "^4.2.1",
-    "documentation": "^13.0.2",
-    "eslint": "^7.6.0",
-    "eslint-config-prettier": "^6.11.0",
-    "eslint-config-standard": "^14.1.1",
-    "eslint-plugin-import": "^2.11.0",
-    "eslint-plugin-jest": "^23.20.0",
-    "eslint-plugin-node": "^11.1.0",
-    "eslint-plugin-promise": "^4.2.1",
-    "eslint-plugin-standard": "^4.0.1",
-    "file-loader": "^6.0.0",
-    "html-webpack-plugin": "^3.2.0",
-    "jest": "^26.3.0",
-    "microbundle": "^0.12.3",
-    "mini-css-extract-plugin": "^0.10.0",
-    "webpack": "^4.6.0",
-    "webpack-log": "^3.0.2"
+    "microbundle": "^0.12.3"
+  },
+  "exports": {
+    "import": "./dist/critters.mjs",
+    "require": "./dist/critters.js",
+    "default": "./dist/critters.mjs"
   },
   "files": [
@@ -80,18 +66,4 @@
   ],
   "homepage": "https://github.com/GoogleChromeLabs/critters#readme",
-  "jest": {
-    "testEnvironment": "jsdom",
-    "testURL": "http://localhost",
-    "coverageReporters": [
-      "text"
-    ],
-    "collectCoverageFrom": [
-      "src/**/*.js"
-    ],
-    "watchPathIgnorePatterns": [
-      "node_modules",
-      "dist"
-    ]
-  },
   "keywords": [
     "critical css",
@@ -104,20 +76,18 @@
   "license": "Apache-2.0",
   "main": "dist/critters.js",
+  "module": "dist/critters.mjs",
   "name": "critters",
   "repository": {
     "type": "git",
-    "url": "git+https://github.com/GoogleChromeLabs/critters.git"
+    "url": "git+https://github.com/GoogleChromeLabs/critters.git",
+    "directory": "packages/critters"
   },
   "scripts": {
-    "build": "npm run -s build:main && npm run -s build:webpack",
-    "build:main": "microbundle --target node",
-    "build:webpack": "cd packages/critters-webpack-plugin && npm run -s build",
+    "build": "microbundle --target node --no-sourcemap -f cjs,esm",
     "docs": "documentation readme -q --no-markdown-toc -a public -s Usage --sort-order alpha src",
-    "prepare": "npm run -s build",
-    "release": "npm run build -s && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags && npm publish",
-    "test": "jest --coverage"
+    "prepare": "npm run -s build"
   },
   "source": "src/index.js",
   "typings": "src/index.d.ts",
-  "version": "0.0.10"
+  "version": "0.0.12"
 }
Index: trip-planner-front/node_modules/critters/src/css.js
===================================================================
--- trip-planner-front/node_modules/critters/src/css.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/src/css.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -15,27 +15,61 @@
  */
 
-import css from 'css';
+import { parse, stringify } from 'postcss';
 
 /**
  * Parse a textual CSS Stylesheet into a Stylesheet instance.
- * Stylesheet is a mutable ReworkCSS AST with format similar to CSSOM.
- * @see https://github.com/reworkcss/css
+ * Stylesheet is a mutable postcss AST with format similar to CSSOM.
+ * @see https://github.com/postcss/postcss/
  * @private
  * @param {String} stylesheet
  * @returns {css.Stylesheet} ast
  */
-export function parseStylesheet (stylesheet) {
-  return css.parse(stylesheet);
+export function parseStylesheet(stylesheet) {
+  return parse(stylesheet);
 }
 
 /**
- * Serialize a ReworkCSS Stylesheet to a String of CSS.
+ * Serialize a postcss Stylesheet to a String of CSS.
  * @private
  * @param {css.Stylesheet} ast          A Stylesheet to serialize, such as one returned from `parseStylesheet()`
- * @param {Object} options              Options to pass to `css.stringify()`
+ * @param {Object} options              Options used by the stringify logic
  * @param {Boolean} [options.compress]  Compress CSS output (removes comments, whitespace, etc)
  */
-export function serializeStylesheet (ast, options) {
-  return css.stringify(ast, options);
+export function serializeStylesheet(ast, options) {
+  let cssStr = '';
+
+  stringify(ast, (result, node, type) => {
+    if (!options.compress) {
+      cssStr += result;
+      return;
+    }
+
+    // Simple minification logic
+    if (node?.type === 'comment') return;
+
+    if (node?.type === 'decl') {
+      const prefix = node.prop + node.raws.between;
+
+      cssStr += result.replace(prefix, prefix.trim());
+      return;
+    }
+
+    if (type === 'start') {
+      if (node.type === 'rule' && node.selectors) {
+        cssStr += node.selectors.join(',') + '{';
+      } else {
+        cssStr += result.replace(/\s\{$/, '{');
+      }
+      return;
+    }
+
+    if (type === 'end' && result === '}' && node?.raws?.semicolon) {
+      cssStr = cssStr.slice(0, -1);
+    }
+
+    cssStr += result.trim();
+  });
+
+  return cssStr;
 }
 
@@ -47,6 +81,6 @@
  * @returns {(rule) => void} nonDestructiveIterator
  */
-export function markOnly (predicate) {
-  return rule => {
+export function markOnly(predicate) {
+  return (rule) => {
     const sel = rule.selectors;
     if (predicate(rule) === false) {
@@ -65,6 +99,6 @@
  * @private
  * @param {css.Rule} rule The Rule to apply marked selectors to (if they exist).
-*/
-export function applyMarkedSelectors (rule) {
+ */
+export function applyMarkedSelectors(rule) {
   if (rule.$$markedSelectors) {
     rule.selectors = rule.$$markedSelectors;
@@ -81,9 +115,7 @@
  * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node.
  */
-export function walkStyleRules (node, iterator) {
-  if (node.stylesheet) return walkStyleRules(node.stylesheet, iterator);
-
-  node.rules = node.rules.filter(rule => {
-    if (rule.rules) {
+export function walkStyleRules(node, iterator) {
+  node.nodes = node.nodes.filter((rule) => {
+    if (hasNestedRules(rule)) {
       walkStyleRules(rule, iterator);
     }
@@ -101,23 +133,36 @@
  * @param {Function} iterator   Invoked on each node in the tree. Return `false` to remove that node from the first tree, true to remove it from the second.
  */
-export function walkStyleRulesWithReverseMirror (node, node2, iterator) {
+export function walkStyleRulesWithReverseMirror(node, node2, iterator) {
   if (node2 === null) return walkStyleRules(node, iterator);
 
-  if (node.stylesheet) return walkStyleRulesWithReverseMirror(node.stylesheet, node2.stylesheet, iterator);
+  [node.nodes, node2.nodes] = splitFilter(
+    node.nodes,
+    node2.nodes,
+    (rule, index, rules, rules2) => {
+      const rule2 = rules2[index];
+      if (hasNestedRules(rule)) {
+        walkStyleRulesWithReverseMirror(rule, rule2, iterator);
+      }
+      rule._other = rule2;
+      rule.filterSelectors = filterSelectors;
+      return iterator(rule) !== false;
+    }
+  );
+}
 
-  [node.rules, node2.rules] = splitFilter(node.rules, node2.rules, (rule, index, rules, rules2) => {
-    const rule2 = rules2[index];
-    if (rule.rules) {
-      walkStyleRulesWithReverseMirror(rule, rule2, iterator);
-    }
-    rule._other = rule2;
-    rule.filterSelectors = filterSelectors;
-    return iterator(rule) !== false;
-  });
+// Checks if a node has nested rules, like @media
+// @keyframes are an exception since they are evaluated as a whole
+function hasNestedRules(rule) {
+  return (
+    rule.nodes &&
+    rule.nodes.length &&
+    rule.nodes.some((n) => n.type === 'rule' || n.type === 'atrule') &&
+    rule.name !== 'keyframes'
+  );
 }
 
 // Like [].filter(), but applies the opposite filtering result to a second copy of the Array without a second pass.
 // This is just a quicker version of generating the compliment of the set returned from a filter operation.
-function splitFilter (a, b, predicate) {
+function splitFilter(a, b, predicate) {
   const aOut = [];
   const bOut = [];
@@ -133,7 +178,11 @@
 
 // can be invoked on a style rule to subset its selectors (with reverse mirroring)
-function filterSelectors (predicate) {
+function filterSelectors(predicate) {
   if (this._other) {
-    const [a, b] = splitFilter(this.selectors, this._other.selectors, predicate);
+    const [a, b] = splitFilter(
+      this.selectors,
+      this._other.selectors,
+      predicate
+    );
     this.selectors = a;
     this._other.selectors = b;
Index: trip-planner-front/node_modules/critters/src/dom.js
===================================================================
--- trip-planner-front/node_modules/critters/src/dom.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/src/dom.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -16,9 +16,8 @@
 
 import parse5 from 'parse5';
-import select from 'css-select';
+import { selectAll, selectOne } from 'css-select';
+import treeAdapter from 'parse5-htmlparser2-tree-adapter';
 
 // htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
 const PARSE5_OPTS = {
   treeAdapter
@@ -31,5 +30,7 @@
  */
 export function createDocument(html) {
-  const document = parse5.parse(html, PARSE5_OPTS);
+  const document = /** @type {HTMLDocument} */ (
+    parse5.parse(html, PARSE5_OPTS)
+  );
 
   defineProperties(document, DocumentExtensions);
@@ -48,5 +49,5 @@
 /**
  * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
+ * @param {HTMLDocument} document   A Document, such as one created via `createDocument()`
  */
 export function serializeDocument(document) {
@@ -54,9 +55,12 @@
 }
 
+/** @typedef {treeAdapter.Document & typeof ElementExtensions} HTMLDocument */
+
 /**
  * Methods and descriptors to mix into Element.prototype
+ * @private
  */
 const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
+  /** @extends treeAdapter.Element.prototype */
 
   nodeName: {
@@ -131,5 +135,5 @@
  */
 const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
+  /** @extends treeAdapter.Document.prototype */
 
   // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
@@ -196,5 +200,5 @@
 
   querySelector(sel) {
-    return select.selectOne(sel, this.documentElement);
+    return selectOne(sel, this.documentElement);
   },
 
@@ -203,5 +207,5 @@
       return this;
     }
-    return select(sel, this.documentElement);
+    return selectAll(sel, this.documentElement);
   }
 };
Index: trip-planner-front/node_modules/critters/src/dom2.js
===================================================================
--- trip-planner-front/node_modules/critters/src/dom2.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,435 +1,0 @@
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-import parse5 from 'parse5';
-import nwsapi from 'nwsapi';
-// import crawl from 'tree-crawl';
-// import select from 'css-select';
-
-// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
-const PARSE5_OPTS = {
-  treeAdapter
-};
-
-/**
- * Parse HTML into a mutable, serializable DOM Document.
- * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
- * @param {String} html   HTML to parse into a Document instance
- */
-export function createDocument(html) {
-  const document = parse5.parse(html, PARSE5_OPTS);
-
-  defineProperties(document, DocumentExtensions);
-
-  // Extend Element.prototype with DOM manipulation methods.
-  const scratch = document.createElement('div');
-  // Get a reference to the base Node class - used by createTextNode()
-  document.$$Node = scratch.constructor;
-  const elementProto = Object.getPrototypeOf(scratch);
-  defineProperties(elementProto, ElementExtensions);
-  elementProto.ownerDocument = document;
-
-  // nwsapi is a selector engine that happens to work with Parse5's htmlparser2 DOM (they form the base of jsdom).
-  // It is exposed to the document so that it can be used within Element.prototype methods.
-  document.$match = nwsapi({ document });
-  document.$match.configure({
-    IDS_DUPES: false,
-    LIVECACHE: false,
-    MIXEDCASE: true,
-    LOGERRORS: false
-  });
-
-  return document;
-}
-
-/**
- * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-export function serializeDocument(document) {
-  return parse5.serialize(document, PARSE5_OPTS);
-}
-
-/**
- * Methods and descriptors to mix into Element.prototype
- */
-const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
-
-  nodeName: {
-    get() {
-      return this.tagName.toUpperCase();
-    }
-  },
-
-  id: reflectedProperty('id'),
-
-  className: reflectedProperty('class'),
-
-  classList: {
-    get() {
-      return this.className ? this.className.split(' ') : [];
-    }
-  },
-
-  insertBefore(child, referenceNode) {
-    if (!referenceNode) return this.appendChild(child);
-    treeAdapter.insertBefore(this, child, referenceNode);
-    return child;
-  },
-
-  appendChild(child) {
-    treeAdapter.appendChild(this, child);
-    return child;
-  },
-
-  removeChild(child) {
-    treeAdapter.detachNode(child);
-  },
-
-  remove() {
-    treeAdapter.detachNode(this);
-  },
-
-  textContent: {
-    get() {
-      return this.children.map((node) => node.nodeValue).join('\n');
-    },
-
-    set(text) {
-      this.children = [];
-      treeAdapter.insertText(this, text);
-    }
-  },
-
-  setAttribute(name, value) {
-    if (this.attribs == null) this.attribs = {};
-    if (value == null) value = '';
-    this.attribs[name] = value;
-  },
-
-  removeAttribute(name) {
-    if (this.attribs != null) {
-      delete this.attribs[name];
-    }
-  },
-
-  getAttribute(name) {
-    return this.attribs != null && this.attribs[name];
-  },
-
-  hasAttribute(name) {
-    return this.attribs != null && this.attribs[name] != null;
-  },
-
-  getAttributeNode(name) {
-    const value = this.getAttribute(name);
-    if (value != null) return { specified: true, value };
-  },
-
-  // These are used by nwsapi to implement its selector engine.
-  parentElement: {
-    get() {
-      const parent = this.parentNode;
-      if (parent.nodeType === 1) return parent;
-      return null;
-    }
-  },
-  firstElementChild: {
-    get() {
-      const children = this.children;
-
-      return (
-        (children && children.find((child) => child.nodeType === 1)) || null
-      );
-    }
-  },
-  nextElementSibling: {
-    get() {
-      let sibling = this.nextSibling;
-      while (sibling && sibling.nodeType !== 1) {
-        sibling = sibling.nextSibling;
-      }
-
-      return sibling;
-    }
-  },
-  previousElementSibling: {
-    get() {
-      let sibling = this.previousSibling;
-      while (sibling && sibling.nodeType !== 1) {
-        sibling = sibling.previousSibling;
-      }
-
-      return sibling;
-    }
-  },
-
-  getElementsByTagName,
-  getElementsByClassName
-};
-
-/**
- * Methods and descriptors to mix into the global document instance
- * @private
- */
-const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
-
-  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
-  // nwsapi requires that it at least report a correct nodeType of DOCUMENT_NODE.
-  nodeType: {
-    get() {
-      return 9;
-    }
-  },
-
-  contentType: {
-    get() {
-      return 'text/html';
-    }
-  },
-
-  nodeName: {
-    get() {
-      return '#document';
-    }
-  },
-
-  documentElement: {
-    get() {
-      // Find the first <html> element within the document
-      return this.childNodes.filter(
-        (child) => String(child.tagName).toLowerCase() === 'html'
-      )[0];
-    }
-  },
-
-  compatMode: {
-    get() {
-      const compatMode = {
-        'no-quirks': 'CSS1Compat',
-        quirks: 'BackCompat',
-        'limited-quirks': 'CSS1Compat'
-      };
-      return compatMode[treeAdapter.getDocumentMode(this)];
-    }
-  },
-
-  body: {
-    get() {
-      return this.querySelector('body');
-    }
-  },
-
-  createElement(name) {
-    return treeAdapter.createElement(name, null, []);
-  },
-
-  createTextNode(text) {
-    // there is no dedicated createTextNode equivalent exposed in htmlparser2's DOM
-    const Node = this.$$Node;
-    return new Node({
-      type: 'text',
-      data: text,
-      parent: null,
-      prev: null,
-      next: null
-    });
-  },
-
-  querySelector(sel) {
-    return this.$match.first(sel, this.documentElement);
-    // return select.selectOne(sel, this.documentElement);
-  },
-
-  querySelectorAll(sel) {
-    return this.$match.select(sel, this.documentElement);
-    // return select(sel, this.documentElement);
-  },
-
-  getElementsByTagName,
-  getElementsByClassName
-};
-
-/**
- * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
- * @private
- */
-function defineProperties(obj, properties) {
-  for (const i in properties) {
-    const value = properties[i];
-    Object.defineProperty(
-      obj,
-      i,
-      typeof value === 'function' ? { value } : value
-    );
-  }
-}
-
-/**
- * A simple implementation of Element.prototype.getElementsByTagName().
- * This is used by nwsapi to implement its selector engine.
- * @private
- * @note
- *    If perf issues arise, 2 faster but more verbose implementations are benchmarked here:
- *      https://esbench.com/bench/5ac3b647f2949800a0f619e1
- */
-// function getElementsByTagName(tagName) {
-//   // Only return Element/Document nodes
-//   if (
-//     (this.nodeType !== 1 && this.nodeType !== 9) ||
-//     this.type === 'directive'
-//   ) {
-//     return [];
-//   }
-//   return Array.prototype.concat.apply(
-//     // Add current element if it matches tag
-//     tagName === '*' ||
-//       (this.tagName &&
-//         (this.tagName === tagName || this.nodeName === tagName.toUpperCase()))
-//       ? [this]
-//       : [],
-//     // Check children recursively
-//     this.children.map((child) => getElementsByTagName.call(child, tagName))
-//   );
-// }
-
-function getElementsByTagName(tagName) {
-  if (this.nodeType !== 1 && this.nodeType !== 9) return [];
-  const stack = [this];
-  const matches = [];
-  const isWildCard = tagName === '*';
-  const tagNameUpper = tagName.toUpperCase();
-  while (stack.length !== 0) {
-    const el = stack.pop();
-    let child = el.lastChild;
-    while (child) {
-      if (child.nodeType === 1) stack.push(child);
-      child = child.previousSibling;
-    }
-    if (
-      isWildCard ||
-      (el.tagName != null &&
-        (el.tagName === tagNameUpper ||
-          el.tagName.toUpperCase() === tagNameUpper))
-    ) {
-      matches.push(el);
-    }
-  }
-  return matches;
-}
-
-// function getElementsByTagName(tagName) {
-//   if (this.nodeType !== 1 && this.nodeType !== 9) return [];
-//   const matches = [];
-//   const isWildCard = tagName === '*';
-//   const tagNameUpper = tagName.toUpperCase();
-
-//   crawl(
-//     this,
-//     (node, context) => {
-//       if (node.nodeType !== 1) {
-//         context.skip();
-//       }
-
-//       if (
-//         isWildCard ||
-//         (node.tagName != null &&
-//           (node.tagName === tagNameUpper ||
-//             node.tagName.toUpperCase() === tagNameUpper))
-//       ) {
-//         matches.push(node);
-//       }
-//     },
-//     { order: 'pre' }
-//   );
-//   return matches;
-// }
-
-// function getElementsByClassName(className) {
-//   // Only return Element/Document nodes
-//   if (
-//     (this.nodeType !== 1 && this.nodeType !== 9) ||
-//     this.type === 'directive'
-//   ) {
-//     return [];
-//   }
-//   return Array.prototype.concat.apply(
-//     // Add current element if it matches tag
-//     className && this.classList.includes(className.trim()) ? [this] : [],
-//     // Check children recursively
-//     this.children.map((child) => getElementsByClassName.call(child, className))
-//   );
-// }
-
-function getElementsByClassName(className) {
-  if (this.nodeType !== 1 && this.nodeType !== 9) return [];
-  const stack = [...this.children];
-  const matches = [];
-  while (stack.length !== 0) {
-    const el = stack.pop();
-    let child = el.lastChild;
-    while (child) {
-      if (child.nodeType === 1) stack.push(child);
-      child = child.previousSibling;
-    }
-
-    // const classRe = new RegExp('(^|s)' + className + '(s|$)');
-    if (el.classList.includes(className.trim())) {
-      matches.push(el);
-    }
-  }
-  return matches;
-}
-
-// function getElementsByClassName(className) {
-//   if (this.nodeType !== 1 && this.nodeType !== 9) return [];
-//   const matches = [];
-
-//   crawl(
-//     this,
-//     (node, context) => {
-//       if (node.nodeType !== 1) {
-//         context.skip();
-//       }
-
-//       if (node.classList.includes(className)) {
-//         matches.push(node);
-//       }
-//     },
-//     { order: 'pre' }
-//   );
-
-//   return matches;
-// }
-
-/**
- * Create a property descriptor defining a getter/setter pair alias for a named attribute.
- * @private
- */
-function reflectedProperty(attributeName) {
-  return {
-    get() {
-      return this.getAttribute(attributeName);
-    },
-    set(value) {
-      this.setAttribute(attributeName, value);
-    }
-  };
-}
Index: trip-planner-front/node_modules/critters/src/dom4.js
===================================================================
--- trip-planner-front/node_modules/critters/src/dom4.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,261 +1,0 @@
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-// import parse5 from 'parse5';
-// import { parseDOM, DomUtils } from 'htmlparser2';
-import select from 'css-select';
-
-const { parseDOM, DomUtils } = require('htmlparser2');
-
-// htmlparser2 has a relatively DOM-like tree format, which we'll massage into a DOM elsewhere
-const treeAdapter = require('parse5-htmlparser2-tree-adapter');
-
-const PARSE5_OPTS = {
-  treeAdapter,
-};
-
-/**
- * Parse HTML into a mutable, serializable DOM Document.
- * The DOM implementation is an htmlparser2 DOM enhanced with basic DOM mutation methods.
- * @param {String} html   HTML to parse into a Document instance
- */
-export function createDocument(html) {
-  // const document = parse5.parse(html, PARSE5_OPTS);
-  const document = parseDOM(html);
-
-  defineProperties(document, DocumentExtensions);
-
-  // Extend Element.prototype with DOM manipulation methods.
-  // const scratch = document.createElement('div');
-  // Get a reference to the base Node class - used by createTextNode()
-  // document.$$Node = scratch.constructor;
-  // const elementProto = Object.getPrototypeOf(scratch);
-  // defineProperties(elementProto, ElementExtensions);
-  // elementProto.ownerDocument = document;
-
-  return document;
-}
-
-/**
- * Serialize a Document to an HTML String
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-export function serializeDocument(document) {
-  return DomUtils.getOuterHTML(document);
-}
-
-/**
- * Methods and descriptors to mix into Element.prototype
- */
-const ElementExtensions = {
-  /** @extends htmlparser2.Element.prototype */
-
-  nodeName: {
-    get() {
-      return this.tagName.toUpperCase();
-    },
-  },
-
-  id: reflectedProperty('id'),
-
-  className: reflectedProperty('class'),
-  parentNode: {
-    get() {
-      if (this.parent) defineProperties(this.parent, ElementExtensions);
-      return this.parent;
-    },
-  },
-
-  insertBefore(child, referenceNode) {
-    if (!referenceNode) return this.appendChild(child);
-    DomUtils.prepend(referenceNode, child);
-    return child;
-  },
-
-  appendChild(child) {
-    DomUtils.appendChild(this, child);
-    return child;
-  },
-
-  removeChild(child) {
-    DomUtils.removeElement(child);
-  },
-
-  remove() {
-    DomUtils.removeElement(this);
-  },
-
-  textContent: {
-    get() {
-      return DomUtils.getText(this);
-    },
-
-    set(text) {
-      this.children = [];
-      DomUtils.appendChild(this, createTextNode(text));
-    },
-  },
-
-  setAttribute(name, value) {
-    if (this.attribs == null) this.attribs = {};
-    if (value == null) value = '';
-    this.attribs[name] = value;
-  },
-
-  removeAttribute(name) {
-    if (this.attribs != null) {
-      delete this.attribs[name];
-    }
-  },
-
-  getAttribute(name) {
-    return this.attribs != null && this.attribs[name];
-  },
-
-  hasAttribute(name) {
-    return this.attribs != null && this.attribs[name] != null;
-  },
-
-  getAttributeNode(name) {
-    const value = this.getAttribute(name);
-    if (value != null) return { specified: true, value };
-  },
-};
-
-/**
- * Methods and descriptors to mix into the global document instance
- * @private
- */
-const DocumentExtensions = {
-  /** @extends htmlparser2.Document.prototype */
-
-  // document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
-  // TODO: verify if these are needed for css-select
-  nodeType: {
-    get() {
-      return 9;
-    },
-  },
-
-  contentType: {
-    get() {
-      return 'text/html';
-    },
-  },
-
-  nodeName: {
-    get() {
-      return '#document';
-    },
-  },
-
-  documentElement: {
-    get() {
-      // Find the first <html> element within the document
-      return this.filter(
-        (child) => String(child.tagName).toLowerCase() === 'html'
-      );
-    },
-  },
-
-  compatMode: {
-    get() {
-      const compatMode = {
-        'no-quirks': 'CSS1Compat',
-        quirks: 'BackCompat',
-        'limited-quirks': 'CSS1Compat',
-      };
-      return compatMode[treeAdapter.getDocumentMode(this)];
-    },
-  },
-
-  body: {
-    get() {
-      return this.querySelector('body');
-    },
-  },
-
-  createElement(tagName) {
-    const node = {
-      type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
-      name: tagName,
-      attribs: [],
-      children: [],
-      parent: null,
-      prev: null,
-      next: null,
-    };
-    defineProperties(node, ElementExtensions);
-    return node;
-  },
-
-  querySelector(sel) {
-    if (sel === ':root') {
-      return this.type === 'root';
-    }
-
-    const res = select.selectOne(sel, this.documentElement);
-    if (res) defineProperties(res, ElementExtensions);
-    return res;
-  },
-
-  querySelectorAll(sel) {
-    if (sel === ':root') {
-      return this.type === 'root';
-    }
-
-    const res = select(sel, this.documentElement);
-
-    res.forEach((r) => {
-      if (r) defineProperties(r, ElementExtensions);
-    });
-    return res;
-  },
-};
-
-/**
- * Essentially `Object.defineProperties()`, except function values are assigned as value descriptors for convenience.
- * @private
- */
-function defineProperties(obj, properties) {
-  for (const i in properties) {
-    const value = properties[i];
-    Object.defineProperty(
-      obj,
-      i,
-      typeof value === 'function' ? { value } : value
-    );
-  }
-}
-
-/**
- * Create a property descriptor defining a getter/setter pair alias for a named attribute.
- * @private
- */
-function reflectedProperty(attributeName) {
-  return {
-    get() {
-      return this.getAttribute(attributeName);
-    },
-    set(value) {
-      this.setAttribute(attributeName, value);
-    },
-  };
-}
-
-function createTextNode(text) {
-  return parseDOM(text)[0];
-}
Index: trip-planner-front/node_modules/critters/src/dom_temp.js
===================================================================
--- trip-planner-front/node_modules/critters/src/dom_temp.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,47 +1,0 @@
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-import { JSDOM } from 'jsdom';
-
-/**
- * Parse HTML into a mutable, serializable DOM Document, provided by JSDOM.
- * @private
- * @param {String} html   HTML to parse into a Document instance
- */
-export function createDocument (html) {
-  const jsdom = new JSDOM(html, {
-    contentType: 'text/html'
-  });
-  const { window } = jsdom;
-  const document = window.document;
-  document.$jsdom = jsdom;
-  return document;
-}
-/**
- * Serialize a Document to an HTML String
- * @private
- * @param {Document} document   A Document, such as one created via `createDocument()`
- */
-export function serializeDocument (document) {
-  return document.$jsdom.serialize();
-}
-
-/** Like node.textContent, except it works */
-export function setNodeText (node, text) {
-  while (node.lastChild) {
-    node.removeChild(node.lastChild);
-  }
-  node.appendChild(node.ownerDocument.createTextNode(text));
-}
Index: trip-planner-front/node_modules/critters/src/index.d.ts
===================================================================
--- trip-planner-front/node_modules/critters/src/index.d.ts	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/src/index.d.ts	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -15,39 +15,54 @@
  */
 
-declare module 'critters' {
-  export interface Options {
-    path?: string;
-    publicPath?: string;
-    external?: boolean;
-    inlineThreshold?: number;
-    minimumExternalSize?: number;
-    pruneSource?: boolean;
-    mergeStylesheets?: boolean;
-    additionalStylesheets?: string[];
-    preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
-    noscriptFallback?: boolean;
-    inlineFonts?: boolean;
-    preloadFonts?: boolean;
-    fonts?: boolean;
-    keyframes?: string;
-    compress?: boolean;
-    logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
-    reduceInlineStyles?: boolean;
-    logger?: Logger;
-  }
+export default class Critters {
+  /**
+   * Create an instance of Critters with custom options.
+   * The `.process()` method can be called repeatedly to re-use this instance and its cache.
+   */
+  constructor(options: Options);
+  /**
+   * Process an HTML document to inline critical CSS from its stylesheets.
+   * @param {string} html String containing a full HTML document to be parsed.
+   * @returns {string} A modified copy of the provided HTML with critical CSS inlined.
+   */
+  process(html: string): Promise<string>;
+  /**
+   * Read the contents of a file from the specified filesystem or disk.
+   * Override this method to customize how stylesheets are loaded.
+   */
+  readFile(filename: string): Promise<string> | string;
+  /**
+   * Given a stylesheet URL, returns the corresponding CSS asset.
+   * Overriding this method requires doing your own URL normalization, so it's generally better to override `readFile()`.
+   */
+  getCssAsset(href: string): Promise<string | undefined> | string | undefined;
+}
 
-  export interface Logger {
-    trace?: (message: string) => void;
-    debug?: (message: string) => void;
-    info?: (message: string) => void;
-    warn?: (message: string) => void;
-    error?: (message: string) => void;
-  }
+export interface Options {
+  path?: string;
+  publicPath?: string;
+  external?: boolean;
+  inlineThreshold?: number;
+  minimumExternalSize?: number;
+  pruneSource?: boolean;
+  mergeStylesheets?: boolean;
+  additionalStylesheets?: string[];
+  preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
+  noscriptFallback?: boolean;
+  inlineFonts?: boolean;
+  preloadFonts?: boolean;
+  fonts?: boolean;
+  keyframes?: string;
+  compress?: boolean;
+  logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
+  reduceInlineStyles?: boolean;
+  logger?: Logger;
+}
 
-  class Critters {
-    constructor(options: Options);
-    process(html: string): Promise<string>;
-  }
-
-  export default Critters;
+export interface Logger {
+  trace?: (message: string) => void;
+  debug?: (message: string) => void;
+  info?: (message: string) => void;
+  warn?: (message: string) => void;
+  error?: (message: string) => void;
 }
Index: trip-planner-front/node_modules/critters/src/index.js
===================================================================
--- trip-planner-front/node_modules/critters/src/index.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ trip-planner-front/node_modules/critters/src/index.js	(revision b73803523f0488ec52498c2ba88889f1642ad263)
@@ -30,4 +30,5 @@
 /**
  * The mechanism to use for lazy-loading stylesheets.
+ *
  * Note: <kbd>JS</kbd> indicates a strategy requiring JavaScript (falls back to `<noscript>` unless disabled).
  *
@@ -242,4 +243,10 @@
         .replace(/^\//, '');
     }
+
+    // Ignore remote stylesheets
+    if (/^https:\/\//.test(normalizedPath) || href.startsWith('//')) {
+      return undefined;
+    }
+
     const filename = path.resolve(outputPath, normalizedPath);
 
@@ -484,23 +491,21 @@
             }
           });
+
           // If there are no matched selectors, remove the rule:
-          if (rule.selectors.length === 0) {
+          if (!rule.selector) {
             return false;
           }
 
-          if (rule.declarations) {
-            for (let i = 0; i < rule.declarations.length; i++) {
-              const decl = rule.declarations[i];
+          if (rule.nodes) {
+            for (let i = 0; i < rule.nodes.length; i++) {
+              const decl = rule.nodes[i];
 
               // detect used fonts
-              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
+              if (decl.prop && decl.prop.match(/\bfont(-family)?\b/i)) {
                 criticalFonts += ' ' + decl.value;
               }
 
               // detect used keyframes
-              if (
-                decl.property === 'animation' ||
-                decl.property === 'animation-name'
-              ) {
+              if (decl.prop === 'animation' || decl.prop === 'animation-name') {
                 // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
                 const names = decl.value.split(/\s+/);
@@ -515,8 +520,8 @@
 
         // keep font rules, they're handled in the second pass:
-        if (rule.type === 'font-face') return;
+        if (rule.type === 'atrule' && rule.name === 'font-face') return;
 
         // If there are no remaining rules, remove the whole rule:
-        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);
+        const rules = rule.nodes && rule.nodes.filter((rule) => !rule.$$remove);
         return !rules || rules.length !== 0;
       })
@@ -547,19 +552,19 @@
 
       // prune @keyframes rules
-      if (rule.type === 'keyframes') {
+      if (rule.type === 'atrule' && rule.name === 'keyframes') {
         if (keyframesMode === 'none') return false;
         if (keyframesMode === 'all') return true;
-        return criticalKeyframeNames.indexOf(rule.name) !== -1;
+        return criticalKeyframeNames.indexOf(rule.params) !== -1;
       }
 
       // prune @font-face rules
-      if (rule.type === 'font-face') {
+      if (rule.type === 'atrule' && rule.name === 'font-face') {
         let family, src;
-        for (let i = 0; i < rule.declarations.length; i++) {
-          const decl = rule.declarations[i];
-          if (decl.property === 'src') {
+        for (let i = 0; i < rule.nodes.length; i++) {
+          const decl = rule.nodes[i];
+          if (decl.prop === 'src') {
             // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
             src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-          } else if (decl.property === 'font-family') {
+          } else if (decl.prop === 'font-family') {
             family = decl.value;
           }
@@ -590,5 +595,5 @@
     sheet = serializeStylesheet(ast, {
       compress: this.options.compress !== false
-    }).trim();
+    });
 
     // If all rules were removed, get rid of the style element entirely
Index: trip-planner-front/node_modules/critters/src/index1.js
===================================================================
--- trip-planner-front/node_modules/critters/src/index1.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,680 +1,0 @@
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-import path from 'path';
-import prettyBytes from 'pretty-bytes';
-import sources from 'webpack-sources';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-import log from 'webpack-log';
-import minimatch from 'minimatch';
-import { createDocument, serializeDocument, setNodeText } from './dom';
-import {
-  parseStylesheet,
-  serializeStylesheet,
-  walkStyleRules,
-  walkStyleRulesWithReverseMirror,
-  markOnly,
-  applyMarkedSelectors,
-} from './css';
-import { tap } from './util';
-
-// Used to annotate this plugin's hooks in Tappable invocations
-const PLUGIN_NAME = 'critters-webpack-plugin';
-
-/**
- * The mechanism to use for lazy-loading stylesheets.
- * _[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
- *
- * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
- * - **"body":** Move all external stylesheet links to the end of the document.
- * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
- * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
- * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
- * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
- * @typedef {(default|'body'|'media'|'swap'|'js'|'js-lazy')} PreloadStrategy
- * @public
- */
-
-/**
- * Controls which keyframes rules are inlined.
- *
- * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
- * - **"all":** Inline all keyframes rules.
- * - **"none":** Remove all keyframes rules.
- * @typedef {('critical'|'all'|'none')} KeyframeStrategy
- * @private
- * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
- */
-
-/**
- * Controls log level of the plugin. Specifies the level the logger should use. A logger will
- * not produce output for any log level beneath the specified level. Available levels and order
- * are:
- *
- * - **"info"** _(default)_
- * - **"warn"**
- * - **"error"**
- * - **"trace"**
- * - **"debug"**
- * - **"silent"**
- * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
- * @public
- */
-
-/**
- * All optional. Pass them to `new Critters({ ... })`.
- * @public
- * @typedef Options
- * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
- * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
- * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
- * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `true`)_
- * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
- * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
- * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
- * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
- * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
- * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
- * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
- *  - Values:
- *  - `true` to inline critical font-face rules and preload the fonts
- *  - `false` to don't inline any font-face rules and don't preload fonts
- * @property {String} keyframes     Controls which keyframes rules are inlined.
- *  - Values:
- *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
- *  - `"all"` inline all keyframes rules
- *  - `"none"` remove all keyframes rules
- * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
- * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
- */
-
-/**
- * Create a Critters plugin instance with the given options.
- * @public
- * @param {Options} options Options to control how Critters inlines CSS.
- * @example
- * // webpack.config.js
- * module.exports = {
- *   plugins: [
- *     new Critters({
- *       // Outputs: <link rel="preload" onload="this.rel='stylesheet'">
- *       preload: 'swap',
- *
- *       // Don't inline critical font-face rules, but preload the font URLs:
- *       preloadFonts: true
- *     })
- *   ]
- * }
- */
-export default class Critters {
-  /** @private */
-  constructor(options) {
-    this.options = Object.assign(
-      { logLevel: 'info', externalStylesheets: [] },
-      options || {}
-    );
-    this.options.pruneSource = this.options.pruneSource !== false;
-    this.urlFilter = this.options.filter;
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-    this.logger = log({
-      name: 'Critters',
-      unique: true,
-      level: this.options.logLevel,
-    });
-  }
-
-  /**
-   * Invoked by Webpack during plugin initialization
-   */
-  apply(compiler) {
-    // hook into the compiler to get a Compilation instance...
-    tap(compiler, 'compilation', PLUGIN_NAME, false, (compilation) => {
-      // ... which is how we get an "after" hook into html-webpack-plugin's HTML generation.
-      if (
-        compilation.hooks &&
-        compilation.hooks.htmlWebpackPluginAfterHtmlProcessing
-      ) {
-        tap(
-          compilation,
-          'html-webpack-plugin-after-html-processing',
-          PLUGIN_NAME,
-          true,
-          (htmlPluginData, callback) => {
-            this.process(compiler, compilation, htmlPluginData.html)
-              .then((html) => {
-                callback(null, { html });
-              })
-              .catch(callback);
-          }
-        );
-      } else {
-        // If html-webpack-plugin isn't used, process the first HTML asset as an optimize step
-        tap(
-          compilation,
-          'optimize-assets',
-          PLUGIN_NAME,
-          true,
-          (assets, callback) => {
-            let htmlAssetName;
-            for (const name in assets) {
-              if (name.match(/\.html$/)) {
-                htmlAssetName = name;
-                break;
-              }
-            }
-            if (!htmlAssetName) {
-              return callback(Error('Could not find HTML asset.'));
-            }
-            const html = assets[htmlAssetName].source();
-            if (!html) return callback(Error('Empty HTML asset.'));
-
-            this.process(compiler, compilation, String(html))
-              .then((html) => {
-                assets[htmlAssetName] = new sources.RawSource(html);
-                callback();
-              })
-              .catch(callback);
-          }
-        );
-      }
-    });
-  }
-
-  /**
-   * Read the contents of a file from Webpack's input filesystem
-   */
-  readFile(compilation, filename) {
-    const fs = this.fs || compilation.outputFileSystem;
-    return new Promise((resolve, reject) => {
-      const callback = (err, data) => {
-        if (err) reject(err);
-        else resolve(data);
-      };
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  }
-
-  /**
-   * Apply critical CSS processing to html-webpack-plugin
-   */
-  async process(compiler, compilation, html) {
-    const outputPath = compiler.options.output.path;
-    const publicPath = compiler.options.output.publicPath;
-
-    // Parse the generated HTML in a DOM we can mutate
-    const document = createDocument(html);
-
-    if (this.options.additionalStylesheets) {
-      const styleSheetsIncluded = [];
-      (this.options.additionalStylesheets || []).forEach((cssFile) => {
-        if (styleSheetsIncluded.includes(cssFile)) {
-          return;
-        }
-        styleSheetsIncluded.push(cssFile);
-        const webpackCssAssets = Object.keys(
-          compilation.assets
-        ).filter((file) => minimatch(file, cssFile));
-        webpackCssAssets.map((asset) => {
-          const tag = document.createElement('style');
-          tag.innerHTML = compilation.assets[asset].source();
-          document.head.appendChild(tag);
-        });
-      });
-    }
-
-    // `external:false` skips processing of external sheets
-    if (this.options.external !== false) {
-      const externalSheets = [].slice.call(
-        document.querySelectorAll('link[rel="stylesheet"]')
-      );
-      await Promise.all(
-        externalSheets.map((link) =>
-          this.embedLinkedStylesheet(link, compilation, outputPath, publicPath)
-        )
-      );
-    }
-
-    // go through all the style tags in the document and reduce them to only critical CSS
-    const styles = [].slice.call(document.querySelectorAll('style'));
-    await Promise.all(
-      styles.map((style) => this.processStyle(style, document))
-    );
-
-    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
-      await this.mergeStylesheets(document);
-    }
-
-    // serialize the document back to HTML and we're done
-    return serializeDocument(document);
-  }
-
-  async mergeStylesheets(document) {
-    const styles = [].slice.call(document.querySelectorAll('style'));
-    if (styles.length === 0) {
-      this.logger.warn(
-        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'
-      );
-      return;
-    }
-    const first = styles[0];
-    let sheet = first.textContent;
-    for (let i = 1; i < styles.length; i++) {
-      const node = styles[i];
-      sheet += node.textContent;
-      node.remove();
-    }
-    if (this.options.compress !== false) {
-      const before = sheet;
-      const processor = postcss([cssnano()]);
-      const result = await processor.process(before, { from: undefined });
-      // @todo sourcemap support (elsewhere first)
-      sheet = result.css;
-    }
-    setNodeText(first, sheet);
-  }
-
-  /**
-   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-   */
-  async embedLinkedStylesheet(link, compilation, outputPath, publicPath) {
-    const href = link.getAttribute('href');
-    const media = link.getAttribute('media');
-    const document = link.ownerDocument;
-
-    const preloadMode = this.options.preload;
-
-    // skip filtered resources, or network resources if no filter is provided
-    if (this.urlFilter ? this.urlFilter(href) : href.match(/^(https?:)?\/\//)) {
-      return Promise.resolve();
-    }
-
-    // path on disk (with output.publicPath removed)
-    let normalizedPath = href.replace(/^\//, '');
-    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-    if (normalizedPath.indexOf(pathPrefix) === 0) {
-      normalizedPath = normalizedPath
-        .substring(pathPrefix.length)
-        .replace(/^\//, '');
-    }
-    const filename = path.resolve(outputPath, normalizedPath);
-
-    // try to find a matching asset by filename in webpack's output (not yet written to disk)
-    const relativePath = path
-      .relative(outputPath, filename)
-      .replace(/^\.\//, '');
-    const asset = compilation.assets[relativePath];
-
-    // Attempt to read from assets, falling back to a disk read
-    let sheet = asset && asset.source();
-    if (!sheet) {
-      try {
-        sheet = await this.readFile(compilation, filename);
-        this.logger.warn(
-          `Stylesheet "${relativePath}" not found in assets, but a file was located on disk.${
-            this.options.pruneSource
-              ? ' This means pruneSource will not be applied.'
-              : ''
-          }`
-        );
-      } catch (e) {
-        this.logger.warn(`Unable to locate stylesheet: ${relativePath}`);
-        return;
-      }
-    }
-
-    // CSS loader is only injected for the first sheet, then this becomes an empty string
-    let cssLoaderPreamble = `function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}`;
-    const lazy = preloadMode === 'js-lazy';
-    if (lazy) {
-      cssLoaderPreamble = cssLoaderPreamble.replace(
-        'l.href',
-        `l.media='print';l.onload=function(){l.media=m};l.href`
-      );
-    }
-
-    // the reduced critical CSS gets injected into a new <style> tag
-    const style = document.createElement('style');
-    style.appendChild(document.createTextNode(sheet));
-    link.parentNode.insertBefore(style, link);
-
-    if (
-      this.options.inlineThreshold &&
-      sheet.length < this.options.inlineThreshold
-    ) {
-      style.$$reduce = false;
-      this.logger.info(
-        `\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`
-      );
-      if (asset) {
-        delete compilation.assets[relativePath];
-      } else {
-        this.logger.warn(
-          `  > ${href} was not found in assets. the resource may still be emitted but will be unreferenced.`
-        );
-      }
-      link.parentNode.removeChild(link);
-      return;
-    }
-
-    // drop references to webpack asset locations onto the tag, used for later reporting and in-place asset updates
-    style.$$name = href;
-    style.$$asset = asset;
-    style.$$assetName = relativePath;
-    style.$$assets = compilation.assets;
-    style.$$links = [link];
-
-    // Allow disabling any mutation of the stylesheet link:
-    if (preloadMode === false) return;
-
-    let noscriptFallback = false;
-
-    if (preloadMode === 'body') {
-      document.body.appendChild(link);
-    } else {
-      link.setAttribute('rel', 'preload');
-      link.setAttribute('as', 'style');
-      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-        const script = document.createElement('script');
-        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${
-          lazy ? ',' + JSON.stringify(media || 'all') : ''
-        })`;
-        script.appendChild(document.createTextNode(js));
-        link.parentNode.insertBefore(script, link.nextSibling);
-        style.$$links.push(script);
-        cssLoaderPreamble = '';
-        noscriptFallback = true;
-      } else if (preloadMode === 'media') {
-        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-        link.setAttribute('rel', 'stylesheet');
-        link.removeAttribute('as');
-        link.setAttribute('media', 'print');
-        link.setAttribute('onload', `this.media='${media || 'all'}'`);
-        noscriptFallback = true;
-      } else if (preloadMode === 'swap') {
-        link.setAttribute('onload', "this.rel='stylesheet'");
-        noscriptFallback = true;
-      } else {
-        const bodyLink = document.createElement('link');
-        bodyLink.setAttribute('rel', 'stylesheet');
-        if (media) bodyLink.setAttribute('media', media);
-        bodyLink.setAttribute('href', href);
-        document.body.appendChild(bodyLink);
-        style.$$links.push(bodyLink);
-      }
-    }
-
-    if (this.options.noscriptFallback !== false && noscriptFallback) {
-      const noscript = document.createElement('noscript');
-      const noscriptLink = document.createElement('link');
-      noscriptLink.setAttribute('rel', 'stylesheet');
-      noscriptLink.setAttribute('href', href);
-      if (media) noscriptLink.setAttribute('media', media);
-      noscript.appendChild(noscriptLink);
-      link.parentNode.insertBefore(noscript, link.nextSibling);
-      style.$$links.push(noscript);
-    }
-  }
-
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-  async processStyle(style) {
-    if (style.$$reduce === false) return;
-
-    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-    const options = this.options;
-    const document = style.ownerDocument;
-    const head = document.querySelector('head');
-    let keyframesMode = options.keyframes || 'critical';
-    // we also accept a boolean value for options.keyframes
-    if (keyframesMode === true) keyframesMode = 'all';
-    if (keyframesMode === false) keyframesMode = 'none';
-
-    // basically `.textContent`
-    let sheet =
-      style.childNodes.length > 0 &&
-      [].map.call(style.childNodes, (node) => node.nodeValue).join('\n');
-
-    // store a reference to the previous serialized stylesheet for reporting stats
-    const before = sheet;
-
-    // Skip empty stylesheets
-    if (!sheet) return;
-
-    const ast = parseStylesheet(sheet);
-    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;
-
-    // a string to search for font names (very loose)
-    let criticalFonts = '';
-
-    const failedSelectors = [];
-
-    const criticalKeyframeNames = [];
-
-    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-    // This first pass is also used to collect font and keyframe usage used in the second pass.
-    walkStyleRules(
-      ast,
-      markOnly((rule) => {
-        if (rule.type === 'rule') {
-          // Filter the selector list down to only those match
-          rule.filterSelectors((sel) => {
-            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-            if (sel !== ':root') {
-              sel = sel.replace(/(?:>\s*)?::?[a-z-]+\s*(\{|$)/gi, '$1').trim();
-            }
-            if (!sel) return false;
-
-            try {
-              return document.querySelector(sel) != null;
-            } catch (e) {
-              failedSelectors.push(sel + ' -> ' + e.message);
-              return false;
-            }
-          });
-          // If there are no matched selectors, remove the rule:
-          if (rule.selectors.length === 0) {
-            return false;
-          }
-
-          if (rule.declarations) {
-            for (let i = 0; i < rule.declarations.length; i++) {
-              const decl = rule.declarations[i];
-
-              // detect used fonts
-              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-                criticalFonts += ' ' + decl.value;
-              }
-
-              // detect used keyframes
-              if (
-                decl.property === 'animation' ||
-                decl.property === 'animation-name'
-              ) {
-                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                const names = decl.value.split(/\s+/);
-                for (let j = 0; j < names.length; j++) {
-                  const name = names[j].trim();
-                  if (name) criticalKeyframeNames.push(name);
-                }
-              }
-            }
-          }
-        }
-
-        // keep font rules, they're handled in the second pass:
-        if (rule.type === 'font-face') return;
-
-        // If there are no remaining rules, remove the whole rule:
-        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);
-        return !rules || rules.length !== 0;
-      })
-    );
-
-    if (failedSelectors.length !== 0) {
-      this.logger.warn(
-        `${
-          failedSelectors.length
-        } rules skipped due to selector errors:\n  ${failedSelectors.join(
-          '\n  '
-        )}`
-      );
-    }
-
-    const shouldPreloadFonts =
-      options.fonts === true || options.preloadFonts === true;
-    const shouldInlineFonts =
-      options.fonts !== false && options.inlineFonts === true;
-
-    const preloadedFonts = [];
-    // Second pass, using data picked up from the first
-    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {
-      // remove any rules marked in the first pass
-      if (rule.$$remove === true) return false;
-
-      applyMarkedSelectors(rule);
-
-      // prune @keyframes rules
-      if (rule.type === 'keyframes') {
-        if (keyframesMode === 'none') return false;
-        if (keyframesMode === 'all') return true;
-        return criticalKeyframeNames.indexOf(rule.name) !== -1;
-      }
-
-      // prune @font-face rules
-      if (rule.type === 'font-face') {
-        let family, src;
-        for (let i = 0; i < rule.declarations.length; i++) {
-          const decl = rule.declarations[i];
-          if (decl.property === 'src') {
-            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-          } else if (decl.property === 'font-family') {
-            family = decl.value;
-          }
-        }
-
-        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-          preloadedFonts.push(src);
-          const preload = document.createElement('link');
-          preload.setAttribute('rel', 'preload');
-          preload.setAttribute('as', 'font');
-          preload.setAttribute('crossorigin', 'anonymous');
-          preload.setAttribute('href', src.trim());
-          head.appendChild(preload);
-        }
-
-        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-        if (
-          !family ||
-          !src ||
-          criticalFonts.indexOf(family) === -1 ||
-          !shouldInlineFonts
-        ) {
-          return false;
-        }
-      }
-    });
-
-    sheet = serializeStylesheet(ast, {
-      compress: this.options.compress !== false,
-    }).trim();
-
-    // If all rules were removed, get rid of the style element entirely
-    if (sheet.trim().length === 0) {
-      if (style.parentNode) {
-        style.parentNode.removeChild(style);
-      }
-      return;
-    }
-
-    let afterText = '';
-    if (options.pruneSource) {
-      const sheetInverse = serializeStylesheet(astInverse, {
-        compress: this.options.compress !== false,
-      });
-      const asset = style.$$asset;
-      if (asset) {
-        // if external stylesheet would be below minimum size, just inline everything
-        const minSize = this.options.minimumExternalSize;
-        if (minSize && sheetInverse.length < minSize) {
-          this.logger.info(
-            `\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`
-          );
-          setNodeText(style, before);
-          // remove any associated external resources/loaders:
-          if (style.$$links) {
-            for (const link of style.$$links) {
-              const parent = link.parentNode;
-              if (parent) parent.removeChild(link);
-            }
-          }
-          // delete the webpack asset:
-          delete style.$$assets[style.$$assetName];
-          return;
-        }
-
-        const percent = (sheetInverse.length / before.length) * 100;
-        afterText = `, reducing non-inlined size ${
-          percent | 0
-        }% to ${prettyBytes(sheetInverse.length)}`;
-        style.$$assets[style.$$assetName] = new sources.LineToLineMappedSource(
-          sheetInverse,
-          style.$$assetName,
-          before
-        );
-      } else {
-        this.logger.warn(
-          'pruneSource is enabled, but a style (' +
-            name +
-            ') has no corresponding Webpack asset.'
-        );
-      }
-    }
-
-    // replace the inline stylesheet with its critical'd counterpart
-    setNodeText(style, sheet);
-
-    // output stats
-    const percent = ((sheet.length / before.length) * 100) | 0;
-    this.logger.info(
-      '\u001b[32mInlined ' +
-        prettyBytes(sheet.length) +
-        ' (' +
-        percent +
-        '% of original ' +
-        prettyBytes(before.length) +
-        ') of ' +
-        name +
-        afterText +
-        '.\u001b[39m'
-    );
-  }
-}
-
-// Original code picks 1 html and during prune removes CSS files from assets. What if theres another dependency
-// Handle error when parsing stylesheet
-// Most of our partner's CSS fails parsing
-// JSDOM css parsing fails even when css.parse works
-
Index: trip-planner-front/node_modules/critters/src/index2.js
===================================================================
--- trip-planner-front/node_modules/critters/src/index2.js	(revision 59329aad30ff25ec5095bb7ffb78ddb59b7dc111)
+++ 	(revision )
@@ -1,672 +1,0 @@
-/**
- * Copyright 2018 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-import path from 'path';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-import prettyBytes from 'pretty-bytes';
-import { createDocument, serializeDocument } from './dom';
-import {
-  parseStylesheet,
-  serializeStylesheet,
-  walkStyleRules,
-  walkStyleRulesWithReverseMirror,
-  markOnly,
-  applyMarkedSelectors,
-} from './css';
-import { logger } from './util';
-
-/**
- * The mechanism to use for lazy-loading stylesheets.
- * _[JS]_ indicates that a strategy requires JavaScript (falls back to `<noscript>`).
- *
- * - **default:** Move stylesheet links to the end of the document and insert preload meta tags in their place.
- * - **"body":** Move all external stylesheet links to the end of the document.
- * - **"media":** Load stylesheets asynchronously by adding `media="not x"` and removing once loaded. _[JS]_
- * - **"swap":** Convert stylesheet links to preloads that swap to `rel="stylesheet"` once loaded. _[JS]_
- * - **"js":** Inject an asynchronous CSS loader similar to [LoadCSS](https://github.com/filamentgroup/loadCSS) and use it to load stylesheets. _[JS]_
- * - **"js-lazy":** Like `"js"`, but the stylesheet is disabled until fully loaded.
- * @typedef {(default|'body'|'media'|'swap'|'js'|'js-lazy')} PreloadStrategy
- * @public
- */
-
-/**
- * Controls which keyframes rules are inlined.
- *
- * - **"critical":** _(default)_ inline keyframes rules that are used by the critical CSS.
- * - **"all":** Inline all keyframes rules.
- * - **"none":** Remove all keyframes rules.
- * @typedef {('critical'|'all'|'none')} KeyframeStrategy
- * @private
- * @property {String} keyframes     Which {@link KeyframeStrategy keyframe strategy} to use (default: `critical`)_
- */
-
-/**
- * Controls log level of the plugin. Specifies the level the logger should use. A logger will
- * not produce output for any log level beneath the specified level. Available levels and order
- * are:
- *
- * - **"info"** _(default)_
- * - **"warn"**
- * - **"error"**
- * - **"trace"**
- * - **"debug"**
- * - **"silent"**
- * @typedef {('info'|'warn'|'error'|'trace'|'debug'|'silent')} LogLevel
- * @public
- */
-
-/**
- * All optional. Pass them to `new Critters({ ... })`.
- * @public
- * @typedef Options
- * @property {Boolean} external     Inline styles from external stylesheets _(default: `true`)_
- * @property {Number} inlineThreshold Inline external stylesheets smaller than a given size _(default: `0`)_
- * @property {Number} minimumExternalSize If the non-critical external stylesheet would be below this size, just inline it _(default: `0`)_
- * @property {Boolean} pruneSource  Remove inlined rules from the external stylesheet _(default: `false`)_
- * @property {Boolean} mergeStylesheets Merged inlined stylesheets into a single <style> tag _(default: `true`)_
- * @property {String[]} additionalStylesheets Glob for matching other stylesheets to be used while looking for critical CSS _(default: ``)_.
- * @property {String} preload       Which {@link PreloadStrategy preload strategy} to use
- * @property {Boolean} noscriptFallback Add `<noscript>` fallback to JS-based strategies
- * @property {Boolean} inlineFonts  Inline critical font-face rules _(default: `false`)_
- * @property {Boolean} preloadFonts Preloads critical fonts _(default: `true`)_
- * @property {Boolean} fonts        Shorthand for setting `inlineFonts`+`preloadFonts`
- *  - Values:
- *  - `true` to inline critical font-face rules and preload the fonts
- *  - `false` to don't inline any font-face rules and don't preload fonts
- * @property {String} keyframes     Controls which keyframes rules are inlined.
- *  - Values:
- *  - `"critical"`: _(default)_ inline keyframes rules used by the critical CSS
- *  - `"all"` inline all keyframes rules
- *  - `"none"` remove all keyframes rules
- * @property {Boolean} compress     Compress resulting critical CSS _(default: `true`)_
- * @property {String} logLevel      Controls {@link LogLevel log level} of the plugin _(default: `"info"`)_
- */
-
-export default class Critters {
-  /** @private */
-  constructor(options) {
-    this.options = Object.assign(
-      {
-        logLevel: 'info',
-        externalStylesheets: [],
-        outputPath: '',
-        publicPath: '',
-        reduceInlineStyles: true,
-        pruneSource: false,
-        additionalStylesheets: [],
-        ssrMode: false,
-      },
-      options || {}
-    );
-
-    this.urlFilter = this.options.filter;
-    if (this.urlFilter instanceof RegExp) {
-      this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
-    }
-
-    this.logger = this.options.logger || logger;
-  }
-
-  /**
-   * Read the contents of a file from the specified filesystem or disk
-   */
-  readFile(filename) {
-    const fs = this.fs;
-    return new Promise((resolve, reject) => {
-      const callback = (err, data) => {
-        if (err) reject(err);
-        else resolve(data);
-      };
-      if (fs && fs.readFile) {
-        fs.readFile(filename, callback);
-      } else {
-        require('fs').readFile(filename, 'utf8', callback);
-      }
-    });
-  }
-
-  /**
-   * Apply critical CSS processing to the html
-   */
-  async process(html) {
-    // const start = process.hrtime.bigint();
-    console.time('critters');
-
-    // Parse the generated HTML in a DOM we can mutate
-    // console.time('createDoc');
-    const document = createDocument(html);
-    // console.timeEnd('createDoc');
-
-    if (this.options.additionalStylesheets.length > 0) {
-      this.embedAdditionalStylesheet(document);
-    }
-
-    // `external:false` skips processing of external sheets
-    if (this.options.external !== false) {
-      // console.time('externalSheets');
-      const externalSheets = [].slice.call(
-        document.querySelectorAll('link[rel="stylesheet"]')
-      );
-      // console.timeEnd('externalSheets');
-      // console.time('embedLinkedStylesheet');
-      await Promise.all(
-        externalSheets.map((link) => this.embedLinkedStylesheet(link))
-      );
-      // console.timeEnd('embedLinkedStylesheet');
-    }
-
-    // go through all the style tags in the document and reduce them to only critical CSS
-    // console.time('getAffectedStyleTags');
-    const styles = this.getAffectedStyleTags(document);
-    // console.timeEnd('getAffectedStyleTags');
-
-    // console.time('processStyle');
-    await Promise.all(
-      styles.map((style) => this.processStyle(style, document))
-    );
-    // console.timeEnd('processStyle');
-
-    if (this.options.mergeStylesheets !== false && styles.length !== 0) {
-      // console.time('mergeStylesheets');
-      await this.mergeStylesheets(document);
-      // console.timeEnd('mergeStylesheets');
-    }
-
-    // serialize the document back to HTML and we're done
-    // console.time('serializeDocument');
-    const output = serializeDocument(document);
-    // console.timeEnd('serializeDocument');
-    // const end = process.hrtime.bigint();
-    // console.log(`Time ${(end - start) / 1e6}`);
-    console.timeEnd('critters');
-    return output;
-  }
-
-  /**
-   * Get the style tags that need processing
-   */
-  getAffectedStyleTags(document) {
-    const styles = [].slice.call(document.querySelectorAll('style'));
-
-    // `inline:false` skips processing of inline stylesheets
-    if (this.options.reduceInlineStyles === false) {
-      return styles.filter((style) => style.$$external);
-    }
-    return styles;
-  }
-
-  async mergeStylesheets(document) {
-    const styles = this.getAffectedStyleTags(document);
-    if (styles.length === 0) {
-      this.logger.warn(
-        'Merging inline stylesheets into a single <style> tag skipped, no inline stylesheets to merge'
-      );
-      return;
-    }
-    const first = styles[0];
-    let sheet = first.textContent;
-    // console.log(sheet);
-    for (let i = 1; i < styles.length; i++) {
-      const node = styles[i];
-      // sheet.children.push(...node.children);
-      sheet += node.textContent;
-      // console.log(node);
-      // node.parent.children.splice(node.parent.children.indexOf(node), 1);
-      node.remove();
-    }
-    if (!this.options.ssrMode && this.options.compress !== false) {
-      const before = sheet;
-      const processor = postcss([cssnano()]);
-      const result = await processor.process(before, { from: undefined });
-      // @todo sourcemap support (elsewhere first)
-      sheet = result.css;
-    }
-    // setNodeText(first, sheet);
-    first.textContent = sheet;
-  }
-
-  /**
-   * Given href, find the corresponding CSS asset
-   */
-  async getCssAsset(href) {
-    const outputPath = this.options.outputPath;
-    const publicPath = this.options.publicPath;
-
-    // CHECK - the output path
-    // path on disk (with output.publicPath removed)
-    let normalizedPath = href.replace(/^\//, '');
-    const pathPrefix = (publicPath || '').replace(/(^\/|\/$)/g, '') + '/';
-    if (normalizedPath.indexOf(pathPrefix) === 0) {
-      normalizedPath = normalizedPath
-        .substring(pathPrefix.length)
-        .replace(/^\//, '');
-    }
-    const filename = path.resolve(outputPath, normalizedPath);
-
-    // // try to find a matching asset by filename in webpack's output (not yet written to disk)
-    // const relativePath = path
-    //   .relative(outputPath, filename)
-    //   .replace(/^\.\//, '');
-    // const asset = ''; // compilation.assets[relativePath];
-
-    // // console.log('filename ', filename);
-    // // Attempt to read from assets, falling back to a disk read
-    // let sheet = asset && asset.source();
-
-    let sheet;
-
-    try {
-      sheet = await this.readFile(filename);
-      // this.logger.warn(
-      //   `Stylesheet "${relativePath}" not found in assets, but a file was located on disk.${
-      //     this.options.pruneSource
-      //       ? ' This means pruneSource will not be applied.'
-      //       : ''
-      //   }`
-      // );
-    } catch (e) {
-      this.logger.warn(`Unable to locate stylesheet: ${filename}`);
-    }
-
-    return sheet;
-  }
-
-  checkInlineThreshold(link, style, sheet) {
-    if (
-      this.options.inlineThreshold &&
-      sheet.length < this.options.inlineThreshold
-    ) {
-      const href = style.$$name;
-      style.$$reduce = false;
-      this.logger.info(
-        `\u001b[32mInlined all of ${href} (${sheet.length} was below the threshold of ${this.options.inlineThreshold})\u001b[39m`
-      );
-      // if (asset) {
-      //   delete compilation.assets[relativePath];
-      // } else {
-      //   this.logger.warn(
-      //     `  > ${href} was not found in assets. the resource may still be emitted but will be unreferenced.`
-      //   );
-      // }
-      link.remove();
-      return true;
-    }
-
-    return false;
-  }
-
-  /**
-   * Inline the stylesheets from options.additionalStylesheets (assuming it passes `options.filter`)
-   */
-  async embedAdditionalStylesheet(document) {
-    const styleSheetsIncluded = [];
-
-    const sources = await Promise.all(
-      this.options.additionalStylesheets.map((cssFile) => {
-        if (styleSheetsIncluded.includes(cssFile)) {
-          return;
-        }
-        styleSheetsIncluded.push(cssFile);
-        const style = document.createElement('style');
-        style.$$external = true;
-        return this.getCssAsset(cssFile, style).then((sheet) => [sheet, style]);
-      })
-    );
-
-    sources.forEach(([sheet, style]) => {
-      if (!sheet) return;
-      style.textContent = sheet;
-      document.head.appendChild(style);
-    });
-  }
-
-  /**
-   * Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`)
-   */
-  async embedLinkedStylesheet(link) {
-    const href = link.getAttribute('href');
-    const media = link.getAttribute('media');
-    const document = link.ownerDocument;
-
-    const preloadMode = this.options.preload;
-
-    // skip filtered resources, or network resources if no filter is provided
-    // if (this.urlFilter ? this.urlFilter(href) : href.match(/^(https?:)?\/\//)) {
-    if (this.urlFilter ? this.urlFilter(href) : !(href || '').match(/\.css$/)) {
-      return Promise.resolve();
-    }
-
-    // the reduced critical CSS gets injected into a new <style> tag
-    const style = document.createElement('style');
-    style.$$external = true;
-    const sheet = await this.getCssAsset(href, style);
-
-    if (!sheet) {
-      return;
-    }
-
-    // style.appendChild(document.createTextNode(sheet));
-    style.textContent = sheet;
-    // style.innerHTML = sheet;
-    style.$$name = href;
-    style.$$links = [link];
-    link.parentNode.insertBefore(style, link);
-
-    if (this.checkInlineThreshold(link, style, sheet)) {
-      return;
-    }
-
-    // CSS loader is only injected for the first sheet, then this becomes an empty string
-    let cssLoaderPreamble =
-      "function $loadcss(u,m,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}";
-    const lazy = preloadMode === 'js-lazy';
-    if (lazy) {
-      cssLoaderPreamble = cssLoaderPreamble.replace(
-        'l.href',
-        "l.media='print';l.onload=function(){l.media=m};l.href"
-      );
-    }
-
-    // Allow disabling any mutation of the stylesheet link:
-    if (preloadMode === false) return;
-
-    let noscriptFallback = false;
-
-    if (preloadMode === 'body') {
-      document.body.appendChild(link);
-    } else {
-      link.setAttribute('rel', 'preload');
-      link.setAttribute('as', 'style');
-      if (preloadMode === 'js' || preloadMode === 'js-lazy') {
-        const script = document.createElement('script');
-        const js = `${cssLoaderPreamble}$loadcss(${JSON.stringify(href)}${
-          lazy ? ',' + JSON.stringify(media || 'all') : ''
-        })`;
-        // script.appendChild(document.createTextNode(js));
-        script.textContent = js;
-        link.parentNode.insertBefore(script, link.nextSibling);
-        style.$$links.push(script);
-        cssLoaderPreamble = '';
-        noscriptFallback = true;
-      } else if (preloadMode === 'media') {
-        // @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
-        link.setAttribute('rel', 'stylesheet');
-        link.removeAttribute('as');
-        link.setAttribute('media', 'print');
-        link.setAttribute('onload', `this.media='${media || 'all'}'`);
-        noscriptFallback = true;
-      } else if (preloadMode === 'swap') {
-        link.setAttribute('onload', "this.rel='stylesheet'");
-        noscriptFallback = true;
-      } else {
-        const bodyLink = document.createElement('link');
-        bodyLink.setAttribute('rel', 'stylesheet');
-        if (media) bodyLink.setAttribute('media', media);
-        bodyLink.setAttribute('href', href);
-        document.body.appendChild(bodyLink);
-        style.$$links.push(bodyLink);
-      }
-    }
-
-    if (this.options.noscriptFallback !== false && noscriptFallback) {
-      const noscript = document.createElement('noscript');
-      const noscriptLink = document.createElement('link');
-      noscriptLink.setAttribute('rel', 'stylesheet');
-      noscriptLink.setAttribute('href', href);
-      if (media) noscriptLink.setAttribute('media', media);
-      noscript.appendChild(noscriptLink);
-      link.parentNode.insertBefore(noscript, link.nextSibling);
-      style.$$links.push(noscript);
-    }
-  }
-
-  /**
-   * Prune the source CSS files
-   */
-  pruneSource(style, before, sheetInverse) {
-    // if external stylesheet would be below minimum size, just inline everything
-    const minSize = this.options.minimumExternalSize;
-    const name = style.$$name;
-    if (minSize && sheetInverse.length < minSize) {
-      this.logger.info(
-        `\u001b[32mInlined all of ${name} (non-critical external stylesheet would have been ${sheetInverse.length}b, which was below the threshold of ${minSize})\u001b[39m`
-      );
-      // setNodeText(style, before);
-      style.textContent = before;
-      // remove any associated external resources/loaders:
-      if (style.$$links) {
-        for (const link of style.$$links) {
-          const parent = link.parentNode;
-          if (parent) parent.removeChild(link);
-        }
-      }
-
-      return true;
-    }
-
-    return false;
-  }
-
-  /**
-   * Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document.
-   */
-  async processStyle(style, document) {
-    if (style.$$reduce === false) return;
-
-    const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
-    const options = this.options;
-    // const document = style.ownerDocument;
-    const head = document.querySelector('head');
-    let keyframesMode = options.keyframes || 'critical';
-    // we also accept a boolean value for options.keyframes
-    if (keyframesMode === true) keyframesMode = 'all';
-    if (keyframesMode === false) keyframesMode = 'none';
-
-    let sheet = style.textContent;
-
-    // store a reference to the previous serialized stylesheet for reporting stats
-    const before = sheet;
-
-    // Skip empty stylesheets
-    if (!sheet) return;
-
-    const ast = parseStylesheet(sheet);
-    const astInverse = options.pruneSource ? parseStylesheet(sheet) : null;
-
-    // a string to search for font names (very loose)
-    let criticalFonts = '';
-
-    const failedSelectors = [];
-
-    const criticalKeyframeNames = [];
-
-    // Walk all CSS rules, marking unused rules with `.$$remove=true` for removal in the second pass.
-    // This first pass is also used to collect font and keyframe usage used in the second pass.
-    walkStyleRules(
-      ast,
-      markOnly((rule) => {
-        if (rule.type === 'rule') {
-          // Filter the selector list down to only those match
-          rule.filterSelectors((sel) => {
-            // Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
-            // This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
-            if (sel !== ':root') {
-              sel = sel.replace(/(?:>\s*)?::?[a-z-]+\s*(\{|$)/gi, '$1').trim();
-            }
-            if (!sel) return false;
-
-            try {
-              return document.querySelector(sel) != null;
-            } catch (e) {
-              failedSelectors.push(sel + ' -> ' + e.message);
-              return false;
-            }
-          });
-          // If there are no matched selectors, remove the rule:
-          if (rule.selectors.length === 0) {
-            return false;
-          }
-
-          if (rule.declarations) {
-            for (let i = 0; i < rule.declarations.length; i++) {
-              const decl = rule.declarations[i];
-
-              // detect used fonts
-              if (decl.property && decl.property.match(/\bfont(-family)?\b/i)) {
-                criticalFonts += ' ' + decl.value;
-              }
-
-              // detect used keyframes
-              if (
-                decl.property === 'animation' ||
-                decl.property === 'animation-name'
-              ) {
-                // @todo: parse animation declarations and extract only the name. for now we'll do a lazy match.
-                const names = decl.value.split(/\s+/);
-                for (let j = 0; j < names.length; j++) {
-                  const name = names[j].trim();
-                  if (name) criticalKeyframeNames.push(name);
-                }
-              }
-            }
-          }
-        }
-
-        // keep font rules, they're handled in the second pass:
-        if (rule.type === 'font-face') return;
-
-        // If there are no remaining rules, remove the whole rule:
-        const rules = rule.rules && rule.rules.filter((rule) => !rule.$$remove);
-        return !rules || rules.length !== 0;
-      })
-    );
-
-    if (failedSelectors.length !== 0) {
-      this.logger.warn(
-        `${
-          failedSelectors.length
-        } rules skipped due to selector errors:\n  ${failedSelectors.join(
-          '\n  '
-        )}`
-      );
-    }
-
-    const shouldPreloadFonts =
-      options.fonts === true || options.preloadFonts === true;
-    const shouldInlineFonts =
-      options.fonts !== false && options.inlineFonts === true;
-
-    const preloadedFonts = [];
-    // Second pass, using data picked up from the first
-    walkStyleRulesWithReverseMirror(ast, astInverse, (rule) => {
-      // remove any rules marked in the first pass
-      if (rule.$$remove === true) return false;
-
-      applyMarkedSelectors(rule);
-
-      // prune @keyframes rules
-      if (rule.type === 'keyframes') {
-        if (keyframesMode === 'none') return false;
-        if (keyframesMode === 'all') return true;
-        return criticalKeyframeNames.indexOf(rule.name) !== -1;
-      }
-
-      // prune @font-face rules
-      if (rule.type === 'font-face') {
-        let family, src;
-        for (let i = 0; i < rule.declarations.length; i++) {
-          const decl = rule.declarations[i];
-          if (decl.property === 'src') {
-            // @todo parse this properly and generate multiple preloads with type="font/woff2" etc
-            src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
-          } else if (decl.property === 'font-family') {
-            family = decl.value;
-          }
-        }
-
-        if (src && shouldPreloadFonts && preloadedFonts.indexOf(src) === -1) {
-          preloadedFonts.push(src);
-          const preload = document.createElement('link');
-          preload.setAttribute('rel', 'preload');
-          preload.setAttribute('as', 'font');
-          preload.setAttribute('crossorigin', 'anonymous');
-          preload.setAttribute('href', src.trim());
-          head.appendChild(preload);
-        }
-
-        // if we're missing info, if the font is unused, or if critical font inlining is disabled, remove the rule:
-        if (
-          !family ||
-          !src ||
-          criticalFonts.indexOf(family) === -1 ||
-          !shouldInlineFonts
-        ) {
-          return false;
-        }
-      }
-    });
-
-    sheet = serializeStylesheet(ast, {
-      compress: this.options.compress !== false,
-    }).trim();
-
-    // If all rules were removed, get rid of the style element entirely
-    if (sheet.trim().length === 0) {
-      if (style.parentNode) {
-        style.remove();
-      }
-      return;
-    }
-
-    let afterText = '';
-    let styleInlinedCompletely = false;
-    if (options.pruneSource) {
-      const sheetInverse = serializeStylesheet(astInverse, {
-        compress: this.options.compress !== false,
-      });
-
-      styleInlinedCompletely = this.pruneSource(style, before, sheetInverse);
-
-      if (styleInlinedCompletely) {
-        const percent = (sheetInverse.length / before.length) * 100;
-        afterText = `, reducing non-inlined size ${
-          percent | 0
-        }% to ${prettyBytes(sheetInverse.length)}`;
-      }
-    }
-
-    // replace the inline stylesheet with its critical'd counterpart
-    if (!styleInlinedCompletely) {
-      style.textContent = sheet;
-    }
-
-    // output stats
-    const percent = ((sheet.length / before.length) * 100) | 0;
-    this.logger.info(
-      '\u001b[32mInlined ' +
-        prettyBytes(sheet.length) +
-        ' (' +
-        percent +
-        '% of original ' +
-        prettyBytes(before.length) +
-        ') of ' +
-        name +
-        afterText +
-        '.\u001b[39m'
-    );
-  }
-}
