@anansi/core 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,21 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.4.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.3.1...@anansi/core@0.4.0) (2022-05-17)
7
+
8
+
9
+ ### 🚀 Features
10
+
11
+ * SSR uses webpack devserver and responds to code changes ([#1504](https://github.com/ntucker/anansi/issues/1504)) ([25803a5](https://github.com/ntucker/anansi/commit/25803a5b49316c7e73846efbe774d5cbe3eb28a3))
12
+
13
+
14
+ ### 📦 Package
15
+
16
+ * Update babel monorepo to v7.17.12 ([#1505](https://github.com/ntucker/anansi/issues/1505)) ([cdf449c](https://github.com/ntucker/anansi/commit/cdf449c234da377c6968847a500ef77d7340c5bb))
17
+ * Update jest monorepo to ^28.1.0 ([#1493](https://github.com/ntucker/anansi/issues/1493)) ([7cc9df4](https://github.com/ntucker/anansi/commit/7cc9df4a439a0743bf243a5ad8393c62c067aa44))
18
+
19
+
20
+
6
21
  ### [0.3.1](https://github.com/ntucker/anansi/compare/@anansi/core@0.3.0...@anansi/core@0.3.1) (2022-05-04)
7
22
 
8
23
 
@@ -11,4 +11,4 @@ async function floodSpouts(spouts) {
11
11
  } = await spouts();
12
12
  (0, _client.hydrateRoot)(document, app);
13
13
  }
14
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmbG9vZFNwb3V0cyIsInNwb3V0cyIsImFwcCIsImRvY3VtZW50Il0sInNvdXJjZXMiOlsiLi4vc3JjL2Zsb29kU3BvdXRzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoeWRyYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmbG9vZFNwb3V0cyhcbiAgc3BvdXRzOiAoKSA9PiBQcm9taXNlPHtcbiAgICBhcHA6IEpTWC5FbGVtZW50O1xuICB9Pixcbikge1xuICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKCk7XG5cbiAgaHlkcmF0ZVJvb3QoZG9jdW1lbnQsIGFwcCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7O0FBRWUsZUFBZUEsV0FBZixDQUNiQyxNQURhLEVBSWI7RUFDQSxNQUFNO0lBQUVDO0VBQUYsSUFBVSxNQUFNRCxNQUFNLEVBQTVCO0VBRUEseUJBQVlFLFFBQVosRUFBc0JELEdBQXRCO0FBQ0QifQ==
14
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmbG9vZFNwb3V0cyIsInNwb3V0cyIsImFwcCIsImh5ZHJhdGVSb290IiwiZG9jdW1lbnQiXSwic291cmNlcyI6WyIuLi9zcmMvZmxvb2RTcG91dHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGh5ZHJhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGZsb29kU3BvdXRzKFxuICBzcG91dHM6ICgpID0+IFByb21pc2U8e1xuICAgIGFwcDogSlNYLkVsZW1lbnQ7XG4gIH0+LFxuKSB7XG4gIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBzcG91dHMoKTtcblxuICBoeWRyYXRlUm9vdChkb2N1bWVudCwgYXBwKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7QUFFZSxlQUFlQSxXQUFmLENBQ2JDLE1BRGEsRUFJYjtFQUNBLE1BQU07SUFBRUM7RUFBRixJQUFVLE1BQU1ELE1BQU0sRUFBNUI7RUFFQSxJQUFBRSxtQkFBQSxFQUFZQyxRQUFaLEVBQXNCRixHQUF0QjtBQUNEIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EAAE,SAAgB,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,UAkDlD"}
1
+ {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EAAE,SAAe,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,UAkDjD"}
package/lib/laySpouts.js CHANGED
@@ -6,7 +6,7 @@ exports.default = laySpouts;
6
6
  var _server = require("react-dom/server");
7
7
 
8
8
  function laySpouts(spouts, {
9
- timeoutMS = 1000
9
+ timeoutMS = 100
10
10
  } = {}) {
11
11
  const render = async (clientManifest, req, res) => {
12
12
  const {
@@ -68,4 +68,4 @@ function laySpouts(spouts, {
68
68
 
69
69
  return render;
70
70
  }
71
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJyZW5kZXIiLCJjbGllbnRNYW5pZmVzdCIsInJlcSIsInJlcyIsImFwcCIsImRpZEVycm9yIiwicGlwZSIsImFib3J0Iiwib25TaGVsbFJlYWR5Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsIm9uU2hlbGxFcnJvciIsIm9uRXJyb3IiLCJ4IiwiY29uc29sZSIsImVycm9yIiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sYXlTcG91dHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlclRvUGlwZWFibGVTdHJlYW0gYXMgcmVhY3RSZW5kZXIgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcblxuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi9zY3JpcHRzL3R5cGVzJztcbmltcG9ydCB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHsgdGltZW91dE1TID0gMTAwMCB9OiB7IHRpbWVvdXRNUz86IG51bWJlciB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IHNwb3V0cyh7IGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcyB9KTtcbiAgICBsZXQgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB7IHBpcGUsIGFib3J0IH0gPSByZWFjdFJlbmRlcihcbiAgICAgIGFwcCxcbiAgICAgIC8qXG4gICAgICBUaGlzIGlzIG5vdCBkb2N1bWVudGVkLCBzbyBpbmNsdWRlZCB0aGUgdHlwZXMgaGVyZSBmb3IgcmVmZXJlbmNlOlxudHlwZSBPcHRpb25zID0ge3xcbiAgaWRlbnRpZmllclByZWZpeD86IHN0cmluZyxcbiAgbmFtZXNwYWNlVVJJPzogc3RyaW5nLFxuICBub25jZT86IHN0cmluZyxcbiAgYm9vdHN0cmFwU2NyaXB0Q29udGVudD86IHN0cmluZyxcbiAgYm9vdHN0cmFwU2NyaXB0cz86IEFycmF5PHN0cmluZz4sXG4gIGJvb3RzdHJhcE1vZHVsZXM/OiBBcnJheTxzdHJpbmc+LFxuICBwcm9ncmVzc2l2ZUNodW5rU2l6ZT86IG51bWJlcixcbiAgb25TaGVsbFJlYWR5PzogKCkgPT4gdm9pZCxcbiAgb25TaGVsbEVycm9yPzogKCkgPT4gdm9pZCxcbiAgb25BbGxSZWFkeT86ICgpID0+IHZvaWQsXG4gIG9uRXJyb3I/OiAoZXJyb3I6IG1peGVkKSA9PiB2b2lkLFxufH07XG4gICovXG4gICAgICB7XG4gICAgICAgIC8vYm9vdHN0cmFwU2NyaXB0czogYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgICBvblNoZWxsUmVhZHkoKSB7XG4gICAgICAgICAgLy9tYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIGJlZm9yZSB3ZSBzdGFydGVkIHN0cmVhbWluZywgd2Ugc2V0IHRoZSBlcnJvciBjb2RlIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBkaWRFcnJvciA/IDUwMCA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcih4OiBhbnkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcih4KTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgIC8vIFRyeSBsb3dlcmluZyB0aGlzIHRvIHNlZSB0aGUgY2xpZW50IHJlY292ZXIuXG4gICAgc2V0VGltZW91dChhYm9ydCwgdGltZW91dE1TKTtcbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7QUFLZSxTQUFTQSxTQUFULENBQ2JDLE1BRGEsRUFJYjtFQUFFQyxTQUFTLEdBQUc7QUFBZCxJQUErQyxFQUpsQyxFQUtiO0VBQ0EsTUFBTUMsTUFBYyxHQUFHLE9BQU9DLGNBQVAsRUFBdUJDLEdBQXZCLEVBQTRCQyxHQUE1QixLQUFvQztJQUN6RCxNQUFNO01BQUVDO0lBQUYsSUFBVSxNQUFNTixNQUFNLENBQUM7TUFBRUcsY0FBRjtNQUFrQkMsR0FBbEI7TUFBdUJDO0lBQXZCLENBQUQsQ0FBNUI7SUFDQSxJQUFJRSxRQUFRLEdBQUcsS0FBZjtJQUNBLE1BQU07TUFBRUMsSUFBRjtNQUFRQztJQUFSLElBQWtCLG9DQUN0QkgsR0FEc0I7SUFFdEI7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDTTtNQUNFO01BQ0FJLFlBQVksR0FBRztRQUNiO1FBQ0E7UUFDQUwsR0FBRyxDQUFDTSxVQUFKLEdBQWlCSixRQUFRLEdBQUcsR0FBSCxHQUFTLEdBQWxDO1FBQ0FGLEdBQUcsQ0FBQ08sU0FBSixDQUFjLGNBQWQsRUFBOEIsV0FBOUI7UUFDQUosSUFBSSxDQUFDSCxHQUFELENBQUo7TUFDRCxDQVJIOztNQVNFUSxZQUFZLEdBQUc7UUFDYk4sUUFBUSxHQUFHLElBQVg7UUFDQUYsR0FBRyxDQUFDTSxVQUFKLEdBQWlCLEdBQWpCO1FBQ0FILElBQUksQ0FBQ0gsR0FBRCxDQUFKO01BQ0QsQ0FiSDs7TUFjRVMsT0FBTyxDQUFDQyxDQUFELEVBQVM7UUFDZFIsUUFBUSxHQUFHLElBQVg7UUFDQVMsT0FBTyxDQUFDQyxLQUFSLENBQWNGLENBQWQ7UUFDQVYsR0FBRyxDQUFDTSxVQUFKLEdBQWlCLEdBQWpCO1FBQ0FILElBQUksQ0FBQ0gsR0FBRCxDQUFKO01BQ0Q7O0lBbkJILENBbEJzQixDQUF4QixDQUh5RCxDQTJDekQ7SUFDQTs7SUFDQWEsVUFBVSxDQUFDVCxLQUFELEVBQVFSLFNBQVIsQ0FBVjtFQUNELENBOUNEOztFQStDQSxPQUFPQyxNQUFQO0FBQ0QifQ==
71
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJyZW5kZXIiLCJjbGllbnRNYW5pZmVzdCIsInJlcSIsInJlcyIsImFwcCIsImRpZEVycm9yIiwicGlwZSIsImFib3J0IiwicmVhY3RSZW5kZXIiLCJvblNoZWxsUmVhZHkiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwib25TaGVsbEVycm9yIiwib25FcnJvciIsIngiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2xheVNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuXG5pbXBvcnQgeyBSZW5kZXIgfSBmcm9tICcuL3NjcmlwdHMvdHlwZXMnO1xuaW1wb3J0IHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3Nwb3V0cy90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxheVNwb3V0cyhcbiAgc3BvdXRzOiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPHtcbiAgICBhcHA6IEpTWC5FbGVtZW50O1xuICB9PixcbiAgeyB0aW1lb3V0TVMgPSAxMDAgfTogeyB0aW1lb3V0TVM/OiBudW1iZXIgfSA9IHt9LFxuKSB7XG4gIGNvbnN0IHJlbmRlcjogUmVuZGVyID0gYXN5bmMgKGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBzcG91dHMoeyBjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMgfSk7XG4gICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgY29uc3QgeyBwaXBlLCBhYm9ydCB9ID0gcmVhY3RSZW5kZXIoXG4gICAgICBhcHAsXG4gICAgICAvKlxuICAgICAgVGhpcyBpcyBub3QgZG9jdW1lbnRlZCwgc28gaW5jbHVkZWQgdGhlIHR5cGVzIGhlcmUgZm9yIHJlZmVyZW5jZTpcbnR5cGUgT3B0aW9ucyA9IHt8XG4gIGlkZW50aWZpZXJQcmVmaXg/OiBzdHJpbmcsXG4gIG5hbWVzcGFjZVVSST86IHN0cmluZyxcbiAgbm9uY2U/OiBzdHJpbmcsXG4gIGJvb3RzdHJhcFNjcmlwdENvbnRlbnQ/OiBzdHJpbmcsXG4gIGJvb3RzdHJhcFNjcmlwdHM/OiBBcnJheTxzdHJpbmc+LFxuICBib290c3RyYXBNb2R1bGVzPzogQXJyYXk8c3RyaW5nPixcbiAgcHJvZ3Jlc3NpdmVDaHVua1NpemU/OiBudW1iZXIsXG4gIG9uU2hlbGxSZWFkeT86ICgpID0+IHZvaWQsXG4gIG9uU2hlbGxFcnJvcj86ICgpID0+IHZvaWQsXG4gIG9uQWxsUmVhZHk/OiAoKSA9PiB2b2lkLFxuICBvbkVycm9yPzogKGVycm9yOiBtaXhlZCkgPT4gdm9pZCxcbnx9O1xuICAqL1xuICAgICAge1xuICAgICAgICAvL2Jvb3RzdHJhcFNjcmlwdHM6IGFzc2V0cy5maWx0ZXIoYXNzZXQgPT4gYXNzZXQuZW5kc1dpdGgoJy5qcycpKSxcbiAgICAgICAgb25TaGVsbFJlYWR5KCkge1xuICAgICAgICAgIC8vbWFuYWdlcnMuZm9yRWFjaChtYW5hZ2VyID0+IG1hbmFnZXIuY2xlYW51cCgpKTtcbiAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBiZWZvcmUgd2Ugc3RhcnRlZCBzdHJlYW1pbmcsIHdlIHNldCB0aGUgZXJyb3IgY29kZSBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZGlkRXJyb3IgPyA1MDAgOiAyMDA7XG4gICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TaGVsbEVycm9yKCkge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IoeDogYW55KSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoeCk7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIEFiYW5kb24gYW5kIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nIGlmIGVub3VnaCB0aW1lIHBhc3Nlcy5cbiAgICAvLyBUcnkgbG93ZXJpbmcgdGhpcyB0byBzZWUgdGhlIGNsaWVudCByZWNvdmVyLlxuICAgIHNldFRpbWVvdXQoYWJvcnQsIHRpbWVvdXRNUyk7XG4gIH07XG4gIHJldHVybiByZW5kZXI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7O0FBS2UsU0FBU0EsU0FBVCxDQUNiQyxNQURhLEVBSWI7RUFBRUMsU0FBUyxHQUFHO0FBQWQsSUFBOEMsRUFKakMsRUFLYjtFQUNBLE1BQU1DLE1BQWMsR0FBRyxPQUFPQyxjQUFQLEVBQXVCQyxHQUF2QixFQUE0QkMsR0FBNUIsS0FBb0M7SUFDekQsTUFBTTtNQUFFQztJQUFGLElBQVUsTUFBTU4sTUFBTSxDQUFDO01BQUVHLGNBQUY7TUFBa0JDLEdBQWxCO01BQXVCQztJQUF2QixDQUFELENBQTVCO0lBQ0EsSUFBSUUsUUFBUSxHQUFHLEtBQWY7SUFDQSxNQUFNO01BQUVDLElBQUY7TUFBUUM7SUFBUixJQUFrQixJQUFBQyw4QkFBQSxFQUN0QkosR0FEc0I7SUFFdEI7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDTTtNQUNFO01BQ0FLLFlBQVksR0FBRztRQUNiO1FBQ0E7UUFDQU4sR0FBRyxDQUFDTyxVQUFKLEdBQWlCTCxRQUFRLEdBQUcsR0FBSCxHQUFTLEdBQWxDO1FBQ0FGLEdBQUcsQ0FBQ1EsU0FBSixDQUFjLGNBQWQsRUFBOEIsV0FBOUI7UUFDQUwsSUFBSSxDQUFDSCxHQUFELENBQUo7TUFDRCxDQVJIOztNQVNFUyxZQUFZLEdBQUc7UUFDYlAsUUFBUSxHQUFHLElBQVg7UUFDQUYsR0FBRyxDQUFDTyxVQUFKLEdBQWlCLEdBQWpCO1FBQ0FKLElBQUksQ0FBQ0gsR0FBRCxDQUFKO01BQ0QsQ0FiSDs7TUFjRVUsT0FBTyxDQUFDQyxDQUFELEVBQVM7UUFDZFQsUUFBUSxHQUFHLElBQVg7UUFDQVUsT0FBTyxDQUFDQyxLQUFSLENBQWNGLENBQWQ7UUFDQVgsR0FBRyxDQUFDTyxVQUFKLEdBQWlCLEdBQWpCO1FBQ0FKLElBQUksQ0FBQ0gsR0FBRCxDQUFKO01BQ0Q7O0lBbkJILENBbEJzQixDQUF4QixDQUh5RCxDQTJDekQ7SUFDQTs7SUFDQWMsVUFBVSxDQUFDVixLQUFELEVBQVFSLFNBQVIsQ0FBVjtFQUNELENBOUNEOztFQStDQSxPQUFPQyxNQUFQO0FBQ0QifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAiBA,OAAO,sBAAsB,CAAC"}
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,sBAAsB,CAAC"}
@@ -11,8 +11,6 @@ var _path = _interopRequireDefault(require("path"));
11
11
 
12
12
  var _webpack = _interopRequireDefault(require("webpack"));
13
13
 
14
- var _webpackHotMiddleware = _interopRequireDefault(require("webpack-hot-middleware"));
15
-
16
14
  var _memfs = require("memfs");
17
15
 
18
16
  var _express = _interopRequireDefault(require("express"));
@@ -29,8 +27,16 @@ var _unionfs = require("unionfs");
29
27
 
30
28
  var _compression = _interopRequireDefault(require("compression"));
31
29
 
30
+ var _webpackDevServer = _interopRequireDefault(require("webpack-dev-server"));
31
+
32
+ var _importFresh = _interopRequireDefault(require("import-fresh"));
33
+
34
+ var _chalk = _interopRequireDefault(require("chalk"));
35
+
32
36
  require("cross-fetch/polyfill");
33
37
 
38
+ var _webpackConfigs$, _webpackConfigs$$devS;
39
+
34
40
  // eslint-disable-next-line @typescript-eslint/no-var-requires
35
41
  const webpackConfig = require(require.resolve( // TODO: use normal resolution algorithm to find webpack file
36
42
  _path.default.join(process.cwd(), 'webpack.config')));
@@ -45,7 +51,8 @@ if (!entrypoint) {
45
51
  process.exit(-1);
46
52
  }
47
53
 
48
- const loader = (0, _ora.default)('Building the assets').start(); // Set up in memory filesystem
54
+ console.log(_chalk.default.greenBright(`Starting SSR at`), _chalk.default.cyanBright(process.env.WEBPACK_PUBLIC_HOST));
55
+ const loader = (0, _ora.default)().start(); // Set up in memory filesystem
49
56
 
50
57
  const volume = new _memfs.Volume();
51
58
  const fs = (0, _memfs.createFsFromVolume)(volume);
@@ -82,17 +89,18 @@ const webpackConfigs = [webpackConfig({
82
89
  }, {
83
90
  mode: 'development'
84
91
  }), webpackConfig({
85
- entrypoint: hotEntry(entrypoint.replace('.tsx', '.server.tsx')).name,
92
+ entrypoint: entrypoint.replace('.tsx', '.server.tsx'),
86
93
  name: 'server'
87
94
  }, {
88
95
  mode: 'development',
89
96
  target: 'node'
90
- })]; // initialize the webpack compiler
97
+ })]; // only have one output for server so we can avoid cached modules
98
+
99
+ webpackConfigs[1].plugins.push(new _webpack.default.optimize.LimitChunkCountPlugin({
100
+ maxChunks: 1
101
+ })); // initialize the webpack compiler
91
102
 
92
103
  const compiler = (0, _webpack.default)(webpackConfigs);
93
- compiler.outputFileSystem = { ...fs,
94
- join: _path.default.join
95
- };
96
104
 
97
105
  _sourceMapSupport.default.install({
98
106
  hookRequire: true
@@ -115,20 +123,22 @@ function handleErrors(fn) {
115
123
  next(x);
116
124
  }
117
125
  };
118
- } // Start the express server after the first compilation
126
+ }
119
127
 
128
+ let render; // Start the express server after the first compilation
120
129
 
121
130
  function initializeApp(stats) {
122
131
  var _clientStats$compilat, _clientStats$compilat2, _serverStats$compilat, _serverStats$compilat2;
123
132
 
124
- loader.info('Launching server');
125
133
  const [clientStats, serverStats] = stats;
126
134
 
127
135
  if (clientStats !== null && clientStats !== void 0 && (_clientStats$compilat = clientStats.compilation) !== null && _clientStats$compilat !== void 0 && (_clientStats$compilat2 = _clientStats$compilat.errors) !== null && _clientStats$compilat2 !== void 0 && _clientStats$compilat2.length || serverStats !== null && serverStats !== void 0 && (_serverStats$compilat = serverStats.compilation) !== null && _serverStats$compilat !== void 0 && (_serverStats$compilat2 = _serverStats$compilat.errors) !== null && _serverStats$compilat2 !== void 0 && _serverStats$compilat2.length) {
128
- console.log('Errors for client build: ', clientStats.compilation.errors);
129
- console.log('Errors for server build:', serverStats.compilation.errors); // TODO: handle more gracefully
136
+ loader.fail('Errors for client build: ' + clientStats.compilation.errors);
137
+ loader.fail('Errors for server build: ' + serverStats.compilation.errors); // TODO: handle more gracefully
130
138
 
131
139
  process.exit(-1);
140
+ } else {
141
+ loader.info('Launching server');
132
142
  }
133
143
 
134
144
  const wrappingApp = (0, _express.default)(); // eslint-disable-next-line
@@ -136,19 +146,12 @@ function initializeApp(stats) {
136
146
 
137
147
  wrappingApp.use((0, _compression.default)()); // ASSETS
138
148
 
139
- wrappingApp.use((0, _webpackHotMiddleware.default)(compiler.compilers[0], {
140
- log: console.log,
141
- path: '/__webpack_hmr',
142
- heartbeat: 10 * 1000 //noInfo: true,
143
- //name: 'client',
144
-
145
- }));
146
149
  const clientManifest = clientStats.toJson();
147
150
 
148
151
  const assetRoute = async (req, res) => {
149
- var _req$url$substr, _req$url, _clientManifest$outpu;
152
+ var _req$url$substring$sp, _req$url, _clientManifest$outpu;
150
153
 
151
- const filename = (_req$url$substr = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.substr(process.env.WEBPACK_PUBLIC_PATH.length)) != null ? _req$url$substr : '';
154
+ const filename = (_req$url$substring$sp = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.substring(process.env.WEBPACK_PUBLIC_PATH.length).split('?')[0]) != null ? _req$url$substring$sp : '';
152
155
 
153
156
  const assetPath = _path.default.join((_clientManifest$outpu = clientManifest.outputPath) != null ? _clientManifest$outpu : '', filename);
154
157
 
@@ -166,8 +169,7 @@ function initializeApp(stats) {
166
169
  wrappingApp.get(`${process.env.WEBPACK_PUBLIC_PATH}*`, assetRoute); // SERVER SIDE RENDERING
167
170
  // eslint-disable-next-line @typescript-eslint/no-var-requires
168
171
 
169
- const render = require(getServerBundle(serverStats)).default;
170
-
172
+ render = require(getServerBundle(serverStats)).default;
171
173
  wrappingApp.get('/*', handleErrors(async function (req, res) {
172
174
  if (req.url.endsWith('favicon.ico')) {
173
175
  res.statusCode = 404;
@@ -182,7 +184,7 @@ function initializeApp(stats) {
182
184
  await render(clientManifest, req, res);
183
185
  }));
184
186
  server = wrappingApp.listen(PORT, () => {
185
- console.log(`Listening at ${PORT}...`);
187
+ loader.succeed(`SSR Running`);
186
188
  }).on('error', function (error) {
187
189
  if (error.syscall !== 'listen') {
188
190
  throw error;
@@ -207,44 +209,61 @@ function initializeApp(stats) {
207
209
  throw error;
208
210
  }
209
211
  });
210
- } // Watch the files for changes
211
-
212
+ }
212
213
 
213
- const watcher = compiler.watch({}, (err, multiStats) => {
214
- if (!multiStats) {
215
- console.error('stats not send');
216
- process.exit(-1);
214
+ const devServer = new _webpackDevServer.default( // write to memory filesystem so we can import
215
+ { ...webpackConfigs[0].devServer,
216
+
217
+ /*client: {
218
+ ...webpackConfigs[0].devServer?.client,
219
+ webSocketURL: {
220
+ ...webpackConfigs[0].devServer?.client.webSocketURL,
221
+ port: 8080,
222
+ },
223
+ },*/
224
+ devMiddleware: { ...((_webpackConfigs$ = webpackConfigs[0]) === null || _webpackConfigs$ === void 0 ? void 0 : (_webpackConfigs$$devS = _webpackConfigs$.devServer) === null || _webpackConfigs$$devS === void 0 ? void 0 : _webpackConfigs$$devS.devMiddleware),
225
+ outputFileSystem: { ...fs,
226
+ join: _path.default.join
227
+ }
217
228
  }
229
+ }, compiler);
230
+
231
+ const runServer = async () => {
232
+ await devServer.start();
233
+ devServer.compiler.hooks.done.tap('Anansi Server', multiStats => {
234
+ if (!multiStats) {
235
+ loader.fail('stats not send');
236
+ process.exit(-1);
237
+ }
218
238
 
219
- if (err) {
220
- console.error('Error in compilation');
221
- console.error(err);
222
- process.exit(-1);
223
- }
239
+ if (!Object.hasOwn(multiStats, 'stats')) return;
224
240
 
225
- if (server) {
226
- loader.succeed('Webpack bundle updated');
227
- return;
228
- }
241
+ if (server && multiStats.stats.length > 1) {
242
+ render = (0, _importFresh.default)(getServerBundle(multiStats.stats[1])).default;
243
+ return;
244
+ }
229
245
 
230
- try {
231
- initializeApp(multiStats.stats);
232
- } catch (e) {
233
- console.error('Failed to initialize app');
234
- console.error(e);
235
- }
236
- });
237
- process.on('SIGINT', () => {
238
- var _server;
246
+ if (!server) {
247
+ try {
248
+ initializeApp(multiStats.stats);
249
+ } catch (e) {
250
+ loader.fail('Failed to initialize app');
251
+ console.error(e);
252
+ }
253
+ }
254
+ });
255
+ };
256
+
257
+ const stopServer = async () => {
258
+ loader.info('Stopping server...');
259
+ await devServer.stop();
260
+ loader.info('Server closed');
261
+ };
239
262
 
263
+ process.on('SIGINT', () => {
240
264
  loader.warn('Received SIGINT, devserver shutting down');
241
- if (server) console.log('Closing server');
242
- (_server = server) === null || _server === void 0 ? void 0 : _server.close(() => {
243
- loader.info('Server closed');
244
- });
245
- watcher.close(() => {
246
- loader.info('webpack build stopped');
247
- });
265
+ stopServer();
248
266
  process.exit(-1);
249
267
  });
250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3ZWJwYWNrQ29uZmlnIiwicmVxdWlyZSIsInJlc29sdmUiLCJwYXRoIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJlbnRyeXBvaW50IiwiYXJndiIsIlBPUlQiLCJlbnYiLCJXRUJQQUNLX1BVQkxJQ19IT1NUIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwibG9hZGVyIiwic3RhcnQiLCJ2b2x1bWUiLCJWb2x1bWUiLCJmcyIsInVmcyIsInVzZSIsImRpc2tGcyIsInJlYWRGaWxlIiwic2VydmVyIiwiaG90RW50cnkiLCJlbnRyeVBhdGgiLCJnZW5lcmF0ZWRFbnRyeXBvaW50IiwidG1wIiwiZmlsZVN5bmMiLCJwb3N0Zml4Iiwid3JpdGVTeW5jIiwiZmQiLCJ3ZWJwYWNrQ29uZmlncyIsIm5hbWUiLCJtb2RlIiwicmVwbGFjZSIsInRhcmdldCIsImNvbXBpbGVyIiwib3V0cHV0RmlsZVN5c3RlbSIsInNvdXJjZU1hcFN1cHBvcnQiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRpYWxpemVBcHAiLCJzdGF0cyIsImluZm8iLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwid3JhcHBpbmdBcHAiLCJjb21waWxlcnMiLCJoZWFydGJlYXQiLCJjbGllbnRNYW5pZmVzdCIsImFzc2V0Um91dGUiLCJmaWxlbmFtZSIsInVybCIsInN1YnN0ciIsImFzc2V0UGF0aCIsImZpbGVDb250ZW50IiwidG9TdHJpbmciLCJjb250ZW50VHlwZSIsInNlbmQiLCJlIiwic3RhdHVzIiwiZ2V0IiwicmVuZGVyIiwiZGVmYXVsdCIsImVuZHNXaXRoIiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsInNvY2tldCIsIm9uIiwiZXJyb3IiLCJsaXN0ZW4iLCJzeXNjYWxsIiwiaXNQaXBlIiwicG9ydE9yUGlwZSIsIk51bWJlciIsImlzTmFOIiwiYmluZCIsImNvZGUiLCJ3YXRjaGVyIiwid2F0Y2giLCJlcnIiLCJtdWx0aVN0YXRzIiwic3VjY2VlZCIsIndhcm4iLCJjbG9zZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3N0YXJ0RGV2c2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgZGlza0ZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHdlYnBhY2ssIHsgTXVsdGlDb21waWxlciB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IHdlYnBhY2tIb3RNaWRkbGV3YXJlIGZyb20gJ3dlYnBhY2staG90LW1pZGRsZXdhcmUnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgeyBTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJztcbmltcG9ydCBleHByZXNzLCB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHsgcGF0Y2hSZXF1aXJlIH0gZnJvbSAnZnMtbW9ua2V5JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCBjb21wcmVzcyBmcm9tICdjb21wcmVzc2lvbic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCB3ZWJwYWNrQ29uZmlnID0gcmVxdWlyZShyZXF1aXJlLnJlc29sdmUoXG4gIC8vIFRPRE86IHVzZSBub3JtYWwgcmVzb2x1dGlvbiBhbGdvcml0aG0gdG8gZmluZCB3ZWJwYWNrIGZpbGVcbiAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpLFxuKSk7XG5cbmNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5jb25zdCBQT1JUID0gcHJvY2Vzcy5lbnYuUE9SVCB8fCAzMDAwO1xucHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfSE9TVCA9IGBodHRwOi8vbG9jYWxob3N0OiR7UE9SVH1gO1xucHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCA9ICcvYXNzZXRzLyc7XG5cbmlmICghZW50cnlwb2ludCkge1xuICBjb25zb2xlLmxvZyhgVXNhZ2U6ICR7cHJvY2Vzcy5hcmd2WzBdfSA8ZW50cnlwb2ludC1maWxlPmApO1xuICBwcm9jZXNzLmV4aXQoLTEpO1xufVxuXG5jb25zdCBsb2FkZXIgPSBvcmEoJ0J1aWxkaW5nIHRoZSBhc3NldHMnKS5zdGFydCgpO1xuXG4vLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbmNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbmNvbnN0IGZzID0gY3JlYXRlRnNGcm9tVm9sdW1lKHZvbHVtZSk7XG51ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbnBhdGNoUmVxdWlyZSh1ZnMpO1xuY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkodWZzLnJlYWRGaWxlKTtcbmxldCBzZXJ2ZXI6IFNlcnZlciB8IHVuZGVmaW5lZDtcblxuLy8gR2VuZXJhdGUgYSB0ZW1wb3JhcnkgZmlsZSBzbyB3ZSBjYW4gaG90IHJlbG9hZCBmcm9tIHRoZSByb290IG9mIHRoZSBhcHBsaWNhdGlvblxuZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIC8vIEB0cy1pZ25vcmUgZm9yIHNvbWUgcmVhc29uIGl0J3Mgbm90IHBpY2tpbmcgdXAgdGhhdCBvdGhlciBvcHRpb25zIGFyZSBvcHRpb25hbFxuICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgZ2VuZXJhdGVkRW50cnlwb2ludC5mZCxcbiAgICBgXG5pbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbmlmIChtb2R1bGUuaG90KSB7XG4gIG1vZHVsZS5ob3QuYWNjZXB0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVudHJ5O1xuICBgLFxuICApO1xuICByZXR1cm4gZ2VuZXJhdGVkRW50cnlwb2ludDtcbn1cblxuY29uc3Qgd2VicGFja0NvbmZpZ3MgPSBbXG4gIHdlYnBhY2tDb25maWcoXG4gICAge1xuICAgICAgZW50cnlwb2ludDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgIG5hbWU6ICdjbGllbnQnLFxuICAgIH0sXG4gICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICksXG4gIHdlYnBhY2tDb25maWcoXG4gICAge1xuICAgICAgZW50cnlwb2ludDogaG90RW50cnkoZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JykpLm5hbWUsXG4gICAgICBuYW1lOiAnc2VydmVyJyxcbiAgICB9LFxuICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgKSxcbl0gYXMgY29uc3Q7XG4vLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG5jb25zdCBjb21waWxlcjogTXVsdGlDb21waWxlciA9IHdlYnBhY2sod2VicGFja0NvbmZpZ3MpO1xuXG5jb21waWxlci5vdXRwdXRGaWxlU3lzdGVtID0ge1xuICAuLi5mcyxcbiAgam9pbjogcGF0aC5qb2luIGFzIGFueSxcbn0gYXMgYW55IGFzIHR5cGVvZiBmcztcblxuc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICBjb25zdCBzZXJ2ZXJKc29uID0gc2VydmVyU3RhdHMudG9Kc29uKHsgYXNzZXRzOiB0cnVlIH0pO1xuICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ21haW4uanMnKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgRiBleHRlbmRzIChcbiAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICApID0+IFByb21pc2U8dm9pZD4sXG4+KGZuOiBGKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4ocmVxLCByZXMpO1xuICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgIG5leHQoeCk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBTdGFydCB0aGUgZXhwcmVzcyBzZXJ2ZXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbXBpbGF0aW9uXG5mdW5jdGlvbiBpbml0aWFsaXplQXBwKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgbG9hZGVyLmluZm8oJ0xhdW5jaGluZyBzZXJ2ZXInKTtcbiAgY29uc3QgW2NsaWVudFN0YXRzLCBzZXJ2ZXJTdGF0c10gPSBzdGF0cztcbiAgaWYgKFxuICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICBzZXJ2ZXJTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoXG4gICkge1xuICAgIGNvbnNvbGUubG9nKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJywgY2xpZW50U3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICBjb25zb2xlLmxvZygnRXJyb3JzIGZvciBzZXJ2ZXIgYnVpbGQ6Jywgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSBncmFjZWZ1bGx5XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwaW5nQXBwID0gZXhwcmVzcygpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy9AdHMtaWdub3JlXG4gIHdyYXBwaW5nQXBwLnVzZShjb21wcmVzcygpKTtcblxuICAvLyBBU1NFVFNcbiAgd3JhcHBpbmdBcHAudXNlKFxuICAgIHdlYnBhY2tIb3RNaWRkbGV3YXJlKGNvbXBpbGVyLmNvbXBpbGVyc1swXSwge1xuICAgICAgbG9nOiBjb25zb2xlLmxvZyxcbiAgICAgIHBhdGg6ICcvX193ZWJwYWNrX2htcicsXG4gICAgICBoZWFydGJlYXQ6IDEwICogMTAwMCxcbiAgICAgIC8vbm9JbmZvOiB0cnVlLFxuICAgICAgLy9uYW1lOiAnY2xpZW50JyxcbiAgICB9KSxcbiAgKTtcbiAgY29uc3QgY2xpZW50TWFuaWZlc3QgPSBjbGllbnRTdGF0cy50b0pzb24oKTtcbiAgY29uc3QgYXNzZXRSb3V0ZSA9IGFzeW5jIChyZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsIHJlczogYW55KSA9PiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgcmVxLnVybD8uc3Vic3RyKChwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIIGFzIHN0cmluZykubGVuZ3RoKSA/PyAnJztcbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oY2xpZW50TWFuaWZlc3Qub3V0cHV0UGF0aCA/PyAnJywgZmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGFzc2V0UGF0aCkpLnRvU3RyaW5nKCk7XG4gICAgICByZXMuY29udGVudFR5cGUoZmlsZW5hbWUpO1xuICAgICAgcmVzLnNlbmQoZmlsZUNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgIHJlcy5zZW5kKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcbiAgd3JhcHBpbmdBcHAuZ2V0KGAke3Byb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEh9KmAsIGFzc2V0Um91dGUpO1xuXG4gIC8vIFNFUlZFUiBTSURFIFJFTkRFUklOR1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCByZW5kZXI6IFJlbmRlciA9IHJlcXVpcmUoZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzKSkuZGVmYXVsdDtcbiAgd3JhcHBpbmdBcHAuZ2V0KFxuICAgICcvKicsXG4gICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgIGlmIChyZXEudXJsLmVuZHNXaXRoKCdmYXZpY29uLmljbycpKSB7XG4gICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgIHJlcy5zZW5kKCdub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLnNvY2tldC5vbignZXJyb3InLCAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmF0YWwnLCBlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgcmVuZGVyKGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcyk7XG4gICAgfSksXG4gICk7XG5cbiAgc2VydmVyID0gd3JhcHBpbmdBcHBcbiAgICAubGlzdGVuKFBPUlQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgYXQgJHtQT1JUfS4uLmApO1xuICAgIH0pXG4gICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3Iuc3lzY2FsbCAhPT0gJ2xpc3RlbicpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1BpcGUgPSAocG9ydE9yUGlwZTogc3RyaW5nIHwgbnVtYmVyKSA9PiBOdW1iZXIuaXNOYU4ocG9ydE9yUGlwZSk7XG4gICAgICBjb25zdCBiaW5kID0gaXNQaXBlKFBPUlQpID8gJ1BpcGUgJyArIFBPUlQgOiAnUG9ydCAnICsgUE9SVDtcbiAgICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgICAgICBjYXNlICdFQUNDRVMnOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYmluZCArICcgcmVxdWlyZXMgZWxldmF0ZWQgcHJpdmlsZWdlcycpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRUFERFJJTlVTRSc6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihiaW5kICsgJyBpcyBhbHJlYWR5IGluIHVzZScpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLy8gV2F0Y2ggdGhlIGZpbGVzIGZvciBjaGFuZ2VzXG5jb25zdCB3YXRjaGVyID0gY29tcGlsZXIud2F0Y2goe30sIChlcnIsIG11bHRpU3RhdHMpID0+IHtcbiAgaWYgKCFtdWx0aVN0YXRzKSB7XG4gICAgY29uc29sZS5lcnJvcignc3RhdHMgbm90IHNlbmQnKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBjb21waWxhdGlvbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG4gIGlmIChzZXJ2ZXIpIHtcbiAgICBsb2FkZXIuc3VjY2VlZCgnV2VicGFjayBidW5kbGUgdXBkYXRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGluaXRpYWxpemVBcHAobXVsdGlTdGF0cy5zdGF0cyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHAnKTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICB9XG59KTtcblxucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICBsb2FkZXIud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICBpZiAoc2VydmVyKSBjb25zb2xlLmxvZygnQ2xvc2luZyBzZXJ2ZXInKTtcbiAgc2VydmVyPy5jbG9zZSgoKSA9PiB7XG4gICAgbG9hZGVyLmluZm8oJ1NlcnZlciBjbG9zZWQnKTtcbiAgfSk7XG4gIHdhdGNoZXIuY2xvc2UoKCkgPT4ge1xuICAgIGxvYWRlci5pbmZvKCd3ZWJwYWNrIGJ1aWxkIHN0b3BwZWQnKTtcbiAgfSk7XG4gIHByb2Nlc3MuZXhpdCgtMSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBR0E7QUFDQSxNQUFNQSxh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
268
+ runServer();
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3ZWJwYWNrQ29uZmlnIiwicmVxdWlyZSIsInJlc29sdmUiLCJwYXRoIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJlbnRyeXBvaW50IiwiYXJndiIsIlBPUlQiLCJlbnYiLCJXRUJQQUNLX1BVQkxJQ19IT1NUIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwiY2hhbGsiLCJncmVlbkJyaWdodCIsImN5YW5CcmlnaHQiLCJsb2FkZXIiLCJvcmEiLCJzdGFydCIsInZvbHVtZSIsIlZvbHVtZSIsImZzIiwiY3JlYXRlRnNGcm9tVm9sdW1lIiwidWZzIiwidXNlIiwiZGlza0ZzIiwicGF0Y2hSZXF1aXJlIiwicmVhZEZpbGUiLCJwcm9taXNpZnkiLCJzZXJ2ZXIiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJ0bXAiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsIndlYnBhY2tDb25maWdzIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwidGFyZ2V0IiwicGx1Z2lucyIsInB1c2giLCJ3ZWJwYWNrIiwib3B0aW1pemUiLCJMaW1pdENodW5rQ291bnRQbHVnaW4iLCJtYXhDaHVua3MiLCJjb21waWxlciIsInNvdXJjZU1hcFN1cHBvcnQiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsInJlbmRlciIsImluaXRpYWxpemVBcHAiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJmYWlsIiwiaW5mbyIsIndyYXBwaW5nQXBwIiwiZXhwcmVzcyIsImNvbXByZXNzIiwiY2xpZW50TWFuaWZlc3QiLCJhc3NldFJvdXRlIiwiZmlsZW5hbWUiLCJ1cmwiLCJzdWJzdHJpbmciLCJzcGxpdCIsImFzc2V0UGF0aCIsImZpbGVDb250ZW50IiwidG9TdHJpbmciLCJjb250ZW50VHlwZSIsInNlbmQiLCJlIiwic3RhdHVzIiwiZ2V0IiwiZGVmYXVsdCIsImVuZHNXaXRoIiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsInNvY2tldCIsIm9uIiwiZXJyb3IiLCJsaXN0ZW4iLCJzdWNjZWVkIiwic3lzY2FsbCIsImlzUGlwZSIsInBvcnRPclBpcGUiLCJOdW1iZXIiLCJpc05hTiIsImJpbmQiLCJjb2RlIiwiZGV2U2VydmVyIiwiV2VicGFja0RldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwicnVuU2VydmVyIiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsIk9iamVjdCIsImhhc093biIsImltcG9ydEZyZXNoIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgd2VicGFjaywgeyBNdWx0aUNvbXBpbGVyIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCB7IFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IGV4cHJlc3MsIHsgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQgeyBwYXRjaFJlcXVpcmUgfSBmcm9tICdmcy1tb25rZXknO1xuaW1wb3J0IHRtcCBmcm9tICd0bXAnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IGNvbXByZXNzIGZyb20gJ2NvbXByZXNzaW9uJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5pbXBvcnQgaW1wb3J0RnJlc2ggZnJvbSAnaW1wb3J0LWZyZXNoJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCB3ZWJwYWNrQ29uZmlnID0gcmVxdWlyZShyZXF1aXJlLnJlc29sdmUoXG4gIC8vIFRPRE86IHVzZSBub3JtYWwgcmVzb2x1dGlvbiBhbGdvcml0aG0gdG8gZmluZCB3ZWJwYWNrIGZpbGVcbiAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpLFxuKSk7XG5cbmNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5jb25zdCBQT1JUID0gcHJvY2Vzcy5lbnYuUE9SVCB8fCAzMDAwO1xucHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfSE9TVCA9IGBodHRwOi8vbG9jYWxob3N0OiR7UE9SVH1gO1xucHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCA9ICcvYXNzZXRzLyc7XG5cbmlmICghZW50cnlwb2ludCkge1xuICBjb25zb2xlLmxvZyhgVXNhZ2U6ICR7cHJvY2Vzcy5hcmd2WzBdfSA8ZW50cnlwb2ludC1maWxlPmApO1xuICBwcm9jZXNzLmV4aXQoLTEpO1xufVxuXG5jb25zb2xlLmxvZyhcbiAgY2hhbGsuZ3JlZW5CcmlnaHQoYFN0YXJ0aW5nIFNTUiBhdGApLFxuICBjaGFsay5jeWFuQnJpZ2h0KHByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX0hPU1QpLFxuKTtcbmNvbnN0IGxvYWRlciA9IG9yYSgpLnN0YXJ0KCk7XG5cbi8vIFNldCB1cCBpbiBtZW1vcnkgZmlsZXN5c3RlbVxuY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbnVmcy51c2UoZGlza0ZzKS51c2UoZnMgYXMgYW55KTtcblxucGF0Y2hSZXF1aXJlKHVmcyk7XG5jb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xubGV0IHNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4vLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG5mdW5jdGlvbiBob3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gIGNvbnN0IGdlbmVyYXRlZEVudHJ5cG9pbnQgPSB0bXAuZmlsZVN5bmMoeyBwb3N0Zml4OiAnLmpzJyB9KTtcbiAgZGlza0ZzLndyaXRlU3luYyhcbiAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgIGBcbmltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuaWYgKG1vZHVsZS5ob3QpIHtcbiAgbW9kdWxlLmhvdC5hY2NlcHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gIGAsXG4gICk7XG4gIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xufVxuXG5jb25zdCB3ZWJwYWNrQ29uZmlncyA9IFtcbiAgd2VicGFja0NvbmZpZyhcbiAgICB7XG4gICAgICBlbnRyeXBvaW50OiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgfSxcbiAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgKSxcbiAgd2VicGFja0NvbmZpZyhcbiAgICB7XG4gICAgICBlbnRyeXBvaW50OiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgIH0sXG4gICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnLCB0YXJnZXQ6ICdub2RlJyB9LFxuICApLFxuXSBhcyBjb25zdDtcbi8vIG9ubHkgaGF2ZSBvbmUgb3V0cHV0IGZvciBzZXJ2ZXIgc28gd2UgY2FuIGF2b2lkIGNhY2hlZCBtb2R1bGVzXG53ZWJwYWNrQ29uZmlnc1sxXS5wbHVnaW5zLnB1c2goXG4gIG5ldyB3ZWJwYWNrLm9wdGltaXplLkxpbWl0Q2h1bmtDb3VudFBsdWdpbih7IG1heENodW5rczogMSB9KSxcbik7XG4vLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG5jb25zdCBjb21waWxlcjogTXVsdGlDb21waWxlciA9IHdlYnBhY2sod2VicGFja0NvbmZpZ3MpO1xuXG5zb3VyY2VNYXBTdXBwb3J0Lmluc3RhbGwoeyBob29rUmVxdWlyZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gIHJldHVybiBwYXRoLmpvaW4oc2VydmVySnNvbi5vdXRwdXRQYXRoID8/ICcnLCAnbWFpbi5qcycpO1xufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3JzPFxuICBGIGV4dGVuZHMgKFxuICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICkgPT4gUHJvbWlzZTx2b2lkPixcbj4oZm46IEYpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IE5leHRGdW5jdGlvbixcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgfSBjYXRjaCAoeCkge1xuICAgICAgbmV4dCh4KTtcbiAgICB9XG4gIH07XG59XG5sZXQgcmVuZGVyOiBSZW5kZXI7XG4vLyBTdGFydCB0aGUgZXhwcmVzcyBzZXJ2ZXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbXBpbGF0aW9uXG5mdW5jdGlvbiBpbml0aWFsaXplQXBwKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgY29uc3QgW2NsaWVudFN0YXRzLCBzZXJ2ZXJTdGF0c10gPSBzdGF0cztcbiAgaWYgKFxuICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICBzZXJ2ZXJTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoXG4gICkge1xuICAgIGxvYWRlci5mYWlsKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgbG9hZGVyLmZhaWwoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSBncmFjZWZ1bGx5XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkZXIuaW5mbygnTGF1bmNoaW5nIHNlcnZlcicpO1xuICB9XG5cbiAgY29uc3Qgd3JhcHBpbmdBcHAgPSBleHByZXNzKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAvL0B0cy1pZ25vcmVcbiAgd3JhcHBpbmdBcHAudXNlKGNvbXByZXNzKCkpO1xuXG4gIC8vIEFTU0VUU1xuICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuICBjb25zdCBhc3NldFJvdXRlID0gYXN5bmMgKHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSwgcmVzOiBhbnkpID0+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9XG4gICAgICByZXEudXJsXG4gICAgICAgID8uc3Vic3RyaW5nKChwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIIGFzIHN0cmluZykubGVuZ3RoKVxuICAgICAgICAuc3BsaXQoJz8nKVswXSA/PyAnJztcbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oY2xpZW50TWFuaWZlc3Qub3V0cHV0UGF0aCA/PyAnJywgZmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGFzc2V0UGF0aCkpLnRvU3RyaW5nKCk7XG4gICAgICByZXMuY29udGVudFR5cGUoZmlsZW5hbWUpO1xuICAgICAgcmVzLnNlbmQoZmlsZUNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgIHJlcy5zZW5kKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcbiAgd3JhcHBpbmdBcHAuZ2V0KGAke3Byb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEh9KmAsIGFzc2V0Um91dGUpO1xuXG4gIC8vIFNFUlZFUiBTSURFIFJFTkRFUklOR1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICByZW5kZXIgPSByZXF1aXJlKGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cykpLmRlZmF1bHQ7XG4gIHdyYXBwaW5nQXBwLmdldChcbiAgICAnLyonLFxuICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhdGFsJywgZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHJlbmRlcihjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpO1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlciA9IHdyYXBwaW5nQXBwXG4gICAgLmxpc3RlbihQT1JULCAoKSA9PiB7XG4gICAgICBsb2FkZXIuc3VjY2VlZChgU1NSIFJ1bm5pbmdgKTtcbiAgICB9KVxuICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLnN5c2NhbGwgIT09ICdsaXN0ZW4nKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNQaXBlID0gKHBvcnRPclBpcGU6IHN0cmluZyB8IG51bWJlcikgPT4gTnVtYmVyLmlzTmFOKHBvcnRPclBpcGUpO1xuICAgICAgY29uc3QgYmluZCA9IGlzUGlwZShQT1JUKSA/ICdQaXBlICcgKyBQT1JUIDogJ1BvcnQgJyArIFBPUlQ7XG4gICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgY2FzZSAnRUFDQ0VTJzpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGJpbmQgKyAnIHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXMnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0VBRERSSU5VU0UnOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYmluZCArICcgaXMgYWxyZWFkeSBpbiB1c2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gIHtcbiAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgLypjbGllbnQ6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LFxuICAgICAgd2ViU29ja2V0VVJMOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LndlYlNvY2tldFVSTCxcbiAgICAgICAgcG9ydDogODA4MCxcbiAgICAgIH0sXG4gICAgfSwqL1xuICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgIC4uLmZzLFxuICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgfSBhcyBhbnkgYXMgdHlwZW9mIGZzLFxuICAgIH0sXG4gIH0sXG4gIGNvbXBpbGVyLFxuKTtcbmNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gIGRldlNlcnZlci5jb21waWxlci5ob29rcy5kb25lLnRhcChcbiAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgIGlmICghbXVsdGlTdGF0cykge1xuICAgICAgICBsb2FkZXIuZmFpbCgnc3RhdHMgbm90IHNlbmQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKG11bHRpU3RhdHMsICdzdGF0cycpKSByZXR1cm47XG4gICAgICBpZiAoc2VydmVyICYmIChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICByZW5kZXIgPSAoXG4gICAgICAgICAgaW1wb3J0RnJlc2goXG4gICAgICAgICAgICBnZXRTZXJ2ZXJCdW5kbGUoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0c1sxXSksXG4gICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgKS5kZWZhdWx0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGluaXRpYWxpemVBcHAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2FkZXIuZmFpbCgnRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICk7XG59O1xuY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgbG9hZGVyLmluZm8oJ1N0b3BwaW5nIHNlcnZlci4uLicpO1xuICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICBsb2FkZXIuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xufTtcblxucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICBsb2FkZXIud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICBzdG9wU2VydmVyKCk7XG4gIHByb2Nlc3MuZXhpdCgtMSk7XG59KTtcblxucnVuU2VydmVyKCk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOzs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBR0E7QUFDQSxNQUFNQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDQyxPQUFSLEVBQzVCO0FBQ0FDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVQyxPQUFPLENBQUNDLEdBQVIsRUFBVixFQUF5QixnQkFBekIsQ0FGNEIsQ0FBRCxDQUE3Qjs7QUFLQSxNQUFNQyxVQUFVLEdBQUdGLE9BQU8sQ0FBQ0csSUFBUixDQUFhLENBQWIsQ0FBbkI7QUFDQSxNQUFNQyxJQUFJLEdBQUdKLE9BQU8sQ0FBQ0ssR0FBUixDQUFZRCxJQUFaLElBQW9CLElBQWpDO0FBQ0FKLE9BQU8sQ0FBQ0ssR0FBUixDQUFZQyxtQkFBWixHQUFtQyxvQkFBbUJGLElBQUssRUFBM0Q7QUFDQUosT0FBTyxDQUFDSyxHQUFSLENBQVlFLG1CQUFaLEdBQWtDLFVBQWxDOztBQUVBLElBQUksQ0FBQ0wsVUFBTCxFQUFpQjtFQUNmTSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxVQUFTVCxPQUFPLENBQUNHLElBQVIsQ0FBYSxDQUFiLENBQWdCLG9CQUF0QztFQUNBSCxPQUFPLENBQUNVLElBQVIsQ0FBYSxDQUFDLENBQWQ7QUFDRDs7QUFFREYsT0FBTyxDQUFDQyxHQUFSLENBQ0VFLGNBQUEsQ0FBTUMsV0FBTixDQUFtQixpQkFBbkIsQ0FERixFQUVFRCxjQUFBLENBQU1FLFVBQU4sQ0FBaUJiLE9BQU8sQ0FBQ0ssR0FBUixDQUFZQyxtQkFBN0IsQ0FGRjtBQUlBLE1BQU1RLE1BQU0sR0FBRyxJQUFBQyxZQUFBLElBQU1DLEtBQU4sRUFBZixDLENBRUE7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGFBQUosRUFBZjtBQUNBLE1BQU1DLEVBQUUsR0FBRyxJQUFBQyx5QkFBQSxFQUFtQkgsTUFBbkIsQ0FBWDs7QUFDQUksWUFBQSxDQUFJQyxHQUFKLENBQVFDLFdBQVIsRUFBZ0JELEdBQWhCLENBQW9CSCxFQUFwQjs7QUFFQSxJQUFBSyxzQkFBQSxFQUFhSCxZQUFiO0FBQ0EsTUFBTUksUUFBUSxHQUFHLElBQUFDLGVBQUEsRUFBVUwsWUFBQSxDQUFJSSxRQUFkLENBQWpCO0FBQ0EsSUFBSUUsTUFBSixDLENBRUE7O0FBQ0EsU0FBU0MsUUFBVCxDQUFrQkMsU0FBbEIsRUFBcUM7RUFDbkM7RUFDQTtFQUNBLE1BQU1DLG1CQUFtQixHQUFHQyxZQUFBLENBQUlDLFFBQUosQ0FBYTtJQUFFQyxPQUFPLEVBQUU7RUFBWCxDQUFiLENBQTVCOztFQUNBVixXQUFBLENBQU9XLFNBQVAsQ0FDRUosbUJBQW1CLENBQUNLLEVBRHRCLEVBRUc7QUFDTCxxQkFBcUJyQyxhQUFBLENBQUtELE9BQUwsQ0FBYUcsT0FBTyxDQUFDQyxHQUFSLEVBQWIsRUFBNEI0QixTQUE1QixDQUF1QztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQVZFOztFQVlBLE9BQU9DLG1CQUFQO0FBQ0Q7O0FBRUQsTUFBTU0sY0FBYyxHQUFHLENBQ3JCekMsYUFBYSxDQUNYO0VBQ0VPLFVBQVUsRUFBRTBCLFFBQVEsQ0FBQzFCLFVBQUQsQ0FBUixDQUFxQm1DLElBRG5DO0VBRUVBLElBQUksRUFBRTtBQUZSLENBRFcsRUFLWDtFQUFFQyxJQUFJLEVBQUU7QUFBUixDQUxXLENBRFEsRUFRckIzQyxhQUFhLENBQ1g7RUFDRU8sVUFBVSxFQUFFQSxVQUFVLENBQUNxQyxPQUFYLENBQW1CLE1BQW5CLEVBQTJCLGFBQTNCLENBRGQ7RUFFRUYsSUFBSSxFQUFFO0FBRlIsQ0FEVyxFQUtYO0VBQUVDLElBQUksRUFBRSxhQUFSO0VBQXVCRSxNQUFNLEVBQUU7QUFBL0IsQ0FMVyxDQVJRLENBQXZCLEMsQ0FnQkE7O0FBQ0FKLGNBQWMsQ0FBQyxDQUFELENBQWQsQ0FBa0JLLE9BQWxCLENBQTBCQyxJQUExQixDQUNFLElBQUlDLGdCQUFBLENBQVFDLFFBQVIsQ0FBaUJDLHFCQUFyQixDQUEyQztFQUFFQyxTQUFTLEVBQUU7QUFBYixDQUEzQyxDQURGLEUsQ0FHQTs7QUFDQSxNQUFNQyxRQUF1QixHQUFHLElBQUFKLGdCQUFBLEVBQVFQLGNBQVIsQ0FBaEM7O0FBRUFZLHlCQUFBLENBQWlCQyxPQUFqQixDQUF5QjtFQUFFQyxXQUFXLEVBQUU7QUFBZixDQUF6Qjs7QUFFQSxTQUFTQyxlQUFULENBQXlCQyxXQUF6QixFQUFxRDtFQUFBOztFQUNuRCxNQUFNQyxVQUFVLEdBQUdELFdBQVcsQ0FBQ0UsTUFBWixDQUFtQjtJQUFFQyxNQUFNLEVBQUU7RUFBVixDQUFuQixDQUFuQjtFQUNBLE9BQU96RCxhQUFBLENBQUtDLElBQUwsMEJBQVVzRCxVQUFVLENBQUNHLFVBQXJCLG9DQUFtQyxFQUFuQyxFQUF1QyxTQUF2QyxDQUFQO0FBQ0Q7O0FBQ0QsU0FBU0MsWUFBVCxDQUtFQyxFQUxGLEVBS1M7RUFDUCxPQUFPLGdCQUNMQyxHQURLLEVBRUxDLEdBRkssRUFHTEMsSUFISyxFQUlMO0lBQ0EsSUFBSTtNQUNGLE9BQU8sTUFBTUgsRUFBRSxDQUFDQyxHQUFELEVBQU1DLEdBQU4sQ0FBZjtJQUNELENBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7TUFDVkQsSUFBSSxDQUFDQyxDQUFELENBQUo7SUFDRDtFQUNGLENBVkQ7QUFXRDs7QUFDRCxJQUFJQyxNQUFKLEMsQ0FDQTs7QUFDQSxTQUFTQyxhQUFULENBQXVCQyxLQUF2QixFQUErQztFQUFBOztFQUM3QyxNQUFNLENBQUNDLFdBQUQsRUFBY2QsV0FBZCxJQUE2QmEsS0FBbkM7O0VBQ0EsSUFDRUMsV0FBVyxTQUFYLElBQUFBLFdBQVcsV0FBWCw2QkFBQUEsV0FBVyxDQUFFQyxXQUFiLGtHQUEwQkMsTUFBMUIsMEVBQWtDQyxNQUFsQyxJQUNBakIsV0FEQSxhQUNBQSxXQURBLHdDQUNBQSxXQUFXLENBQUVlLFdBRGIsNEVBQ0Esc0JBQTBCQyxNQUQxQixtREFDQSx1QkFBa0NDLE1BRnBDLEVBR0U7SUFDQXZELE1BQU0sQ0FBQ3dELElBQVAsQ0FBWSw4QkFBOEJKLFdBQVcsQ0FBQ0MsV0FBWixDQUF3QkMsTUFBbEU7SUFDQXRELE1BQU0sQ0FBQ3dELElBQVAsQ0FBWSw4QkFBOEJsQixXQUFXLENBQUNlLFdBQVosQ0FBd0JDLE1BQWxFLEVBRkEsQ0FHQTs7SUFDQXBFLE9BQU8sQ0FBQ1UsSUFBUixDQUFhLENBQUMsQ0FBZDtFQUNELENBUkQsTUFRTztJQUNMSSxNQUFNLENBQUN5RCxJQUFQLENBQVksa0JBQVo7RUFDRDs7RUFFRCxNQUFNQyxXQUFXLEdBQUcsSUFBQUMsZ0JBQUEsR0FBcEIsQ0FkNkMsQ0FlN0M7RUFDQTs7RUFDQUQsV0FBVyxDQUFDbEQsR0FBWixDQUFnQixJQUFBb0Qsb0JBQUEsR0FBaEIsRUFqQjZDLENBbUI3Qzs7RUFDQSxNQUFNQyxjQUFjLEdBQUdULFdBQVcsQ0FBQ1osTUFBWixFQUF2Qjs7RUFDQSxNQUFNc0IsVUFBVSxHQUFHLE9BQU9qQixHQUFQLEVBQXVDQyxHQUF2QyxLQUFvRDtJQUFBOztJQUNyRSxNQUFNaUIsUUFBUSx3Q0FDWmxCLEdBQUcsQ0FBQ21CLEdBRFEsNkNBQ1osU0FDSUMsU0FESixDQUNlL0UsT0FBTyxDQUFDSyxHQUFSLENBQVlFLG1CQUFiLENBQTRDOEQsTUFEMUQsRUFFR1csS0FGSCxDQUVTLEdBRlQsRUFFYyxDQUZkLENBRFksb0NBR1EsRUFIdEI7O0lBSUEsTUFBTUMsU0FBUyxHQUFHbkYsYUFBQSxDQUFLQyxJQUFMLDBCQUFVNEUsY0FBYyxDQUFDbkIsVUFBekIsb0NBQXVDLEVBQXZDLEVBQTJDcUIsUUFBM0MsQ0FBbEI7O0lBRUEsSUFBSTtNQUNGLE1BQU1LLFdBQVcsR0FBRyxDQUFDLE1BQU16RCxRQUFRLENBQUN3RCxTQUFELENBQWYsRUFBNEJFLFFBQTVCLEVBQXBCO01BQ0F2QixHQUFHLENBQUN3QixXQUFKLENBQWdCUCxRQUFoQjtNQUNBakIsR0FBRyxDQUFDeUIsSUFBSixDQUFTSCxXQUFUO0lBQ0QsQ0FKRCxDQUlFLE9BQU9JLENBQVAsRUFBVTtNQUNWMUIsR0FBRyxDQUFDMkIsTUFBSixDQUFXLEdBQVg7TUFDQTNCLEdBQUcsQ0FBQ3lCLElBQUosQ0FBU0MsQ0FBVDtNQUNBO0lBQ0Q7RUFDRixDQWhCRDs7RUFpQkFkLFdBQVcsQ0FBQ2dCLEdBQVosQ0FBaUIsR0FBRXhGLE9BQU8sQ0FBQ0ssR0FBUixDQUFZRSxtQkFBb0IsR0FBbkQsRUFBdURxRSxVQUF2RCxFQXRDNkMsQ0F3QzdDO0VBQ0E7O0VBQ0FiLE1BQU0sR0FBR25FLE9BQU8sQ0FBQ3VELGVBQWUsQ0FBQ0MsV0FBRCxDQUFoQixDQUFQLENBQXNDcUMsT0FBL0M7RUFDQWpCLFdBQVcsQ0FBQ2dCLEdBQVosQ0FDRSxJQURGLEVBRUUvQixZQUFZLENBQUMsZ0JBQWdCRSxHQUFoQixFQUEwQkMsR0FBMUIsRUFBb0M7SUFDL0MsSUFBSUQsR0FBRyxDQUFDbUIsR0FBSixDQUFRWSxRQUFSLENBQWlCLGFBQWpCLENBQUosRUFBcUM7TUFDbkM5QixHQUFHLENBQUMrQixVQUFKLEdBQWlCLEdBQWpCO01BQ0EvQixHQUFHLENBQUNnQyxTQUFKLENBQWMsY0FBZCxFQUE4QixXQUE5QjtNQUNBaEMsR0FBRyxDQUFDeUIsSUFBSixDQUFTLFdBQVQ7TUFDQTtJQUNEOztJQUNEekIsR0FBRyxDQUFDaUMsTUFBSixDQUFXQyxFQUFYLENBQWMsT0FBZCxFQUF3QkMsS0FBRCxJQUFvQjtNQUN6Q3ZGLE9BQU8sQ0FBQ3VGLEtBQVIsQ0FBYyxPQUFkLEVBQXVCQSxLQUF2QjtJQUNELENBRkQ7SUFJQSxNQUFNaEMsTUFBTSxDQUFDWSxjQUFELEVBQWlCaEIsR0FBakIsRUFBc0JDLEdBQXRCLENBQVo7RUFDRCxDQVpXLENBRmQ7RUFpQkFqQyxNQUFNLEdBQUc2QyxXQUFXLENBQ2pCd0IsTUFETSxDQUNDNUYsSUFERCxFQUNPLE1BQU07SUFDbEJVLE1BQU0sQ0FBQ21GLE9BQVAsQ0FBZ0IsYUFBaEI7RUFDRCxDQUhNLEVBSU5ILEVBSk0sQ0FJSCxPQUpHLEVBSU0sVUFBVUMsS0FBVixFQUFzQjtJQUNqQyxJQUFJQSxLQUFLLENBQUNHLE9BQU4sS0FBa0IsUUFBdEIsRUFBZ0M7TUFDOUIsTUFBTUgsS0FBTjtJQUNEOztJQUNELE1BQU1JLE1BQU0sR0FBSUMsVUFBRCxJQUFpQ0MsTUFBTSxDQUFDQyxLQUFQLENBQWFGLFVBQWIsQ0FBaEQ7O0lBQ0EsTUFBTUcsSUFBSSxHQUFHSixNQUFNLENBQUMvRixJQUFELENBQU4sR0FBZSxVQUFVQSxJQUF6QixHQUFnQyxVQUFVQSxJQUF2RDs7SUFDQSxRQUFRMkYsS0FBSyxDQUFDUyxJQUFkO01BQ0UsS0FBSyxRQUFMO1FBQ0VoRyxPQUFPLENBQUN1RixLQUFSLENBQWNRLElBQUksR0FBRywrQkFBckI7UUFDQXZHLE9BQU8sQ0FBQ1UsSUFBUixDQUFhLENBQWI7UUFDQTs7TUFDRixLQUFLLFlBQUw7UUFDRUYsT0FBTyxDQUFDdUYsS0FBUixDQUFjUSxJQUFJLEdBQUcsb0JBQXJCO1FBQ0F2RyxPQUFPLENBQUNVLElBQVIsQ0FBYSxDQUFiO1FBQ0E7O01BQ0Y7UUFDRSxNQUFNcUYsS0FBTjtJQVZKO0VBWUQsQ0F0Qk0sQ0FBVDtBQXVCRDs7QUFFRCxNQUFNVSxTQUFTLEdBQUcsSUFBSUMseUJBQUosRUFDaEI7QUFDQSxFQUNFLEdBQUd0RSxjQUFjLENBQUMsQ0FBRCxDQUFkLENBQWtCcUUsU0FEdkI7O0VBRUU7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUUsYUFBYSxFQUFFLEVBQ2Isd0JBQUd2RSxjQUFjLENBQUMsQ0FBRCxDQUFqQiw4RUFBRyxpQkFBbUJxRSxTQUF0QiwwREFBRyxzQkFBOEJFLGFBQWpDLENBRGE7SUFFYkMsZ0JBQWdCLEVBQUUsRUFDaEIsR0FBR3pGLEVBRGE7TUFFaEJwQixJQUFJLEVBQUVELGFBQUEsQ0FBS0M7SUFGSztFQUZMO0FBVGpCLENBRmdCLEVBbUJoQmdELFFBbkJnQixDQUFsQjs7QUFxQkEsTUFBTThELFNBQVMsR0FBRyxZQUFZO0VBQzVCLE1BQU1KLFNBQVMsQ0FBQ3pGLEtBQVYsRUFBTjtFQUNBeUYsU0FBUyxDQUFDMUQsUUFBVixDQUFtQitELEtBQW5CLENBQXlCQyxJQUF6QixDQUE4QkMsR0FBOUIsQ0FDRSxlQURGLEVBRUdDLFVBQUQsSUFBb0Q7SUFDbEQsSUFBSSxDQUFDQSxVQUFMLEVBQWlCO01BQ2ZuRyxNQUFNLENBQUN3RCxJQUFQLENBQVksZ0JBQVo7TUFDQXRFLE9BQU8sQ0FBQ1UsSUFBUixDQUFhLENBQUMsQ0FBZDtJQUNEOztJQUVELElBQUksQ0FBQ3dHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixVQUFkLEVBQTBCLE9BQTFCLENBQUwsRUFBeUM7O0lBQ3pDLElBQUl0RixNQUFNLElBQUtzRixVQUFELENBQW1DaEQsS0FBbkMsQ0FBeUNJLE1BQXpDLEdBQWtELENBQWhFLEVBQW1FO01BQ2pFTixNQUFNLEdBQ0osSUFBQXFELG9CQUFBLEVBQ0VqRSxlQUFlLENBQUU4RCxVQUFELENBQW1DaEQsS0FBbkMsQ0FBeUMsQ0FBekMsQ0FBRCxDQURqQixDQURPLENBSVB3QixPQUpGO01BS0E7SUFDRDs7SUFDRCxJQUFJLENBQUM5RCxNQUFMLEVBQWE7TUFDWCxJQUFJO1FBQ0ZxQyxhQUFhLENBQUVpRCxVQUFELENBQW1DaEQsS0FBcEMsQ0FBYjtNQUNELENBRkQsQ0FFRSxPQUFPcUIsQ0FBUCxFQUFVO1FBQ1Z4RSxNQUFNLENBQUN3RCxJQUFQLENBQVksMEJBQVo7UUFDQTlELE9BQU8sQ0FBQ3VGLEtBQVIsQ0FBY1QsQ0FBZDtNQUNEO0lBQ0Y7RUFDRixDQXpCSDtBQTJCRCxDQTdCRDs7QUE4QkEsTUFBTStCLFVBQVUsR0FBRyxZQUFZO0VBQzdCdkcsTUFBTSxDQUFDeUQsSUFBUCxDQUFZLG9CQUFaO0VBQ0EsTUFBTWtDLFNBQVMsQ0FBQ2EsSUFBVixFQUFOO0VBQ0F4RyxNQUFNLENBQUN5RCxJQUFQLENBQVksZUFBWjtBQUNELENBSkQ7O0FBTUF2RSxPQUFPLENBQUM4RixFQUFSLENBQVcsUUFBWCxFQUFxQixNQUFNO0VBQ3pCaEYsTUFBTSxDQUFDeUcsSUFBUCxDQUFZLDBDQUFaO0VBQ0FGLFVBQVU7RUFDVnJILE9BQU8sQ0FBQ1UsSUFBUixDQUFhLENBQUMsQ0FBZDtBQUNELENBSkQ7QUFNQW1HLFNBQVMifQ==
@@ -31,4 +31,4 @@ function restHooksSpout(options = {
31
31
  };
32
32
  };
33
33
  }
34
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsImRhdGEiLCJuZXh0UHJvcHMiLCJhcHAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3Jlc3RIb29rcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVQcm92aWRlciwgTWFuYWdlciwgTmV0d29ya01hbmFnZXIgfSBmcm9tICdAcmVzdC1ob29rcy9jb3JlJztcbmltcG9ydCB7IFNlcnZlckRhdGFDb21wb25lbnQsIGdldERhdGFmcm9tRE9NIH0gZnJvbSAnQHJlc3QtaG9va3Mvc3NyJztcblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOZWVkZWRQcm9wcyA9IFJlc29sdmVQcm9wcztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzdEhvb2tzU3BvdXQoXG4gIG9wdGlvbnM6IHtcbiAgICBnZXRNYW5hZ2VyczogKCkgPT4gTWFuYWdlcltdO1xuICB9ID0geyBnZXRNYW5hZ2VyczogKCkgPT4gW25ldyBOZXR3b3JrTWFuYWdlcigpXSB9LFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIE5lZWRlZFByb3BzPihuZXh0OiAoKSA9PiBQcm9taXNlPFQ+KSB7XG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXREYXRhZnJvbURPTSgpO1xuXG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgICAgYXBwOiAoXG4gICAgICAgICAgPENhY2hlUHJvdmlkZXIgaW5pdGlhbFN0YXRlPXtkYXRhfSBtYW5hZ2Vycz17b3B0aW9ucy5nZXRNYW5hZ2VycygpfT5cbiAgICAgICAgICAgIHtuZXh0UHJvcHMuYXBwfVxuICAgICAgICAgICAgPFNlcnZlckRhdGFDb21wb25lbnQgZGF0YT17ZGF0YX0gLz5cbiAgICAgICAgICA8L0NhY2hlUHJvdmlkZXI+XG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBTWUsU0FBU0EsY0FBVCxDQUNiQyxPQUVDLEdBQUc7RUFBRUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJQyxvQkFBSixFQUFEO0FBQXJCLENBSFMsRUFJYjtFQUNBLE9BQU8sVUFBaUNDLElBQWpDLEVBQXlEO0lBQzlELE9BQU8sWUFBWTtNQUNqQixNQUFNQyxJQUFJLEdBQUcsMEJBQWI7TUFFQSxNQUFNQyxTQUFTLEdBQUcsTUFBTUYsSUFBSSxFQUE1QjtNQUVBLE9BQU8sRUFDTCxHQUFHRSxTQURFO1FBRUxDLEdBQUcsZUFDRCxtQkFBQyxtQkFBRDtVQUFlLFlBQVksRUFBRUYsSUFBN0I7VUFBbUMsUUFBUSxFQUFFSixPQUFPLENBQUNDLFdBQVI7UUFBN0MsV0FDR0ksU0FBUyxDQUFDQyxHQURiLGVBRUUsbUJBQUMsd0JBQUQ7VUFBcUIsSUFBSSxFQUFFRjtRQUEzQixFQUZGO01BSEcsQ0FBUDtJQVNELENBZEQ7RUFlRCxDQWhCRDtBQWlCRCJ9
34
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsImRhdGEiLCJnZXREYXRhZnJvbURPTSIsIm5leHRQcm9wcyIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcmVzdEhvb2tzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYWNoZVByb3ZpZGVyLCBNYW5hZ2VyLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gJ0ByZXN0LWhvb2tzL2NvcmUnO1xuaW1wb3J0IHsgU2VydmVyRGF0YUNvbXBvbmVudCwgZ2V0RGF0YWZyb21ET00gfSBmcm9tICdAcmVzdC1ob29rcy9zc3InO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5lZWRlZFByb3BzID0gUmVzb2x2ZVByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXN0SG9va3NTcG91dChcbiAgb3B0aW9uczoge1xuICAgIGdldE1hbmFnZXJzOiAoKSA9PiBNYW5hZ2VyW107XG4gIH0gPSB7IGdldE1hbmFnZXJzOiAoKSA9PiBbbmV3IE5ldHdvcmtNYW5hZ2VyKCldIH0sXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KG5leHQ6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGdldERhdGFmcm9tRE9NKCk7XG5cbiAgICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgICBhcHA6IChcbiAgICAgICAgICA8Q2FjaGVQcm92aWRlciBpbml0aWFsU3RhdGU9e2RhdGF9IG1hbmFnZXJzPXtvcHRpb25zLmdldE1hbmFnZXJzKCl9PlxuICAgICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgICAgICA8U2VydmVyRGF0YUNvbXBvbmVudCBkYXRhPXtkYXRhfSAvPlxuICAgICAgICAgIDwvQ2FjaGVQcm92aWRlcj5cbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFNZSxTQUFTQSxjQUFULENBQ2JDLE9BRUMsR0FBRztFQUFFQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUlDLG9CQUFKLEVBQUQ7QUFBckIsQ0FIUyxFQUliO0VBQ0EsT0FBTyxVQUFpQ0MsSUFBakMsRUFBeUQ7SUFDOUQsT0FBTyxZQUFZO01BQ2pCLE1BQU1DLElBQUksR0FBRyxJQUFBQyxtQkFBQSxHQUFiO01BRUEsTUFBTUMsU0FBUyxHQUFHLE1BQU1ILElBQUksRUFBNUI7TUFFQSxPQUFPLEVBQ0wsR0FBR0csU0FERTtRQUVMQyxHQUFHLGVBQ0QsbUJBQUMsbUJBQUQ7VUFBZSxZQUFZLEVBQUVILElBQTdCO1VBQW1DLFFBQVEsRUFBRUosT0FBTyxDQUFDQyxXQUFSO1FBQTdDLFdBQ0dLLFNBQVMsQ0FBQ0MsR0FEYixlQUVFLG1CQUFDLHdCQUFEO1VBQXFCLElBQUksRUFBRUg7UUFBM0IsRUFGRjtNQUhHLENBQVA7SUFTRCxDQWREO0VBZUQsQ0FoQkQ7QUFpQkQifQ==
@@ -27,4 +27,4 @@ function restHooksSpout(options = {
27
27
  };
28
28
  };
29
29
  }
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsInByb3BzIiwiU2VydmVyQ2FjaGVQcm92aWRlciIsImNvbnRyb2xsZXIiLCJuZXh0UHJvcHMiLCJhcHAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3Jlc3RIb29rcy5zZXJ2ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hbmFnZXIsIE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSAnQHJlc3QtaG9va3MvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVQZXJzaXN0ZWRTdG9yZSB9IGZyb20gJ0ByZXN0LWhvb2tzL3Nzcic7XG5cbmltcG9ydCB0eXBlIHsgUmVzb2x2ZVByb3BzLCBTZXJ2ZXJQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5lZWRlZFByb3BzID0gUmVzb2x2ZVByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXN0SG9va3NTcG91dChcbiAgb3B0aW9uczoge1xuICAgIGdldE1hbmFnZXJzOiAoKSA9PiBNYW5hZ2VyW107XG4gIH0gPSB7IGdldE1hbmFnZXJzOiAoKSA9PiBbbmV3IE5ldHdvcmtNYW5hZ2VyKCldIH0sXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KFxuICAgIG5leHQ6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8VD4sXG4gICkge1xuICAgIHJldHVybiBhc3luYyAocHJvcHM6IFNlcnZlclByb3BzKSA9PiB7XG4gICAgICBjb25zdCBbU2VydmVyQ2FjaGVQcm92aWRlciwgY29udHJvbGxlcl0gPSBjcmVhdGVQZXJzaXN0ZWRTdG9yZShcbiAgICAgICAgb3B0aW9ucy5nZXRNYW5hZ2VycygpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgYXBwOiA8U2VydmVyQ2FjaGVQcm92aWRlcj57bmV4dFByb3BzLmFwcH08L1NlcnZlckNhY2hlUHJvdmlkZXI+LFxuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQU1lLFNBQVNBLGNBQVQsQ0FDYkMsT0FFQyxHQUFHO0VBQUVDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSUMsb0JBQUosRUFBRDtBQUFyQixDQUhTLEVBSWI7RUFDQSxPQUFPLFVBQ0xDLElBREssRUFFTDtJQUNBLE9BQU8sTUFBT0MsS0FBUCxJQUE4QjtNQUNuQyxNQUFNLENBQUNDLG1CQUFELEVBQXNCQyxVQUF0QixJQUFvQywrQkFDeENOLE9BQU8sQ0FBQ0MsV0FBUixFQUR3QyxDQUExQztNQUlBLE1BQU1NLFNBQVMsR0FBRyxNQUFNSixJQUFJLENBQUNDLEtBQUQsQ0FBNUI7TUFFQSxPQUFPLEVBQ0wsR0FBR0csU0FERTtRQUVMRCxVQUZLO1FBR0xFLEdBQUcsZUFBRSxtQkFBQyxtQkFBRCxjQUFzQkQsU0FBUyxDQUFDQyxHQUFoQztNQUhBLENBQVA7SUFLRCxDQVpEO0VBYUQsQ0FoQkQ7QUFpQkQifQ==
30
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsInByb3BzIiwiU2VydmVyQ2FjaGVQcm92aWRlciIsImNvbnRyb2xsZXIiLCJjcmVhdGVQZXJzaXN0ZWRTdG9yZSIsIm5leHRQcm9wcyIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcmVzdEhvb2tzLnNlcnZlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFuYWdlciwgTmV0d29ya01hbmFnZXIgfSBmcm9tICdAcmVzdC1ob29rcy9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVBlcnNpc3RlZFN0b3JlIH0gZnJvbSAnQHJlc3QtaG9va3Mvc3NyJztcblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUHJvcHMsIFNlcnZlclByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHMgPSBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc3RIb29rc1Nwb3V0KFxuICBvcHRpb25zOiB7XG4gICAgZ2V0TWFuYWdlcnM6ICgpID0+IE1hbmFnZXJbXTtcbiAgfSA9IHsgZ2V0TWFuYWdlcnM6ICgpID0+IFtuZXcgTmV0d29ya01hbmFnZXIoKV0gfSxcbikge1xuICByZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOZWVkZWRQcm9wcz4oXG4gICAgbmV4dDogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTxUPixcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIChwcm9wczogU2VydmVyUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IFtTZXJ2ZXJDYWNoZVByb3ZpZGVyLCBjb250cm9sbGVyXSA9IGNyZWF0ZVBlcnNpc3RlZFN0b3JlKFxuICAgICAgICBvcHRpb25zLmdldE1hbmFnZXJzKCksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBhcHA6IDxTZXJ2ZXJDYWNoZVByb3ZpZGVyPntuZXh0UHJvcHMuYXBwfTwvU2VydmVyQ2FjaGVQcm92aWRlcj4sXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBTWUsU0FBU0EsY0FBVCxDQUNiQyxPQUVDLEdBQUc7RUFBRUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJQyxvQkFBSixFQUFEO0FBQXJCLENBSFMsRUFJYjtFQUNBLE9BQU8sVUFDTEMsSUFESyxFQUVMO0lBQ0EsT0FBTyxNQUFPQyxLQUFQLElBQThCO01BQ25DLE1BQU0sQ0FBQ0MsbUJBQUQsRUFBc0JDLFVBQXRCLElBQW9DLElBQUFDLHlCQUFBLEVBQ3hDUCxPQUFPLENBQUNDLFdBQVIsRUFEd0MsQ0FBMUM7TUFJQSxNQUFNTyxTQUFTLEdBQUcsTUFBTUwsSUFBSSxDQUFDQyxLQUFELENBQTVCO01BRUEsT0FBTyxFQUNMLEdBQUdJLFNBREU7UUFFTEYsVUFGSztRQUdMRyxHQUFHLGVBQUUsbUJBQUMsbUJBQUQsY0FBc0JELFNBQVMsQ0FBQ0MsR0FBaEM7TUFIQSxDQUFQO0lBS0QsQ0FaRDtFQWFELENBaEJEO0FBaUJEIn0=
@@ -38,4 +38,4 @@ function routerSpout(options) {
38
38
  };
39
39
  };
40
40
  }
41
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm5leHQiLCJoaXN0b3J5IiwiY3JlYXRlUm91dGVyIiwibWF0Y2hlZFJvdXRlcyIsImdldE1hdGNoZWRSb3V0ZXMiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwibmV4dFByb3BzIiwiYXBwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nwb3V0cy9yb3V0ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlLCBSb3V0ZVByb3ZpZGVyLCBSb3V0ZUNvbnRyb2xsZXIgfSBmcm9tICdAYW5hbnNpL3JvdXRlcic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3Nlckhpc3RvcnkgfSBmcm9tICdoaXN0b3J5JztcblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUHJvcHMsIENyZWF0ZVJvdXRlciB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5lZWRlZFByb3BzID0gUmVzb2x2ZVByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByb3V0ZXJTcG91dDxSZXNvbHZlV2l0aD4ob3B0aW9uczoge1xuICByZXNvbHZlV2l0aD86IGFueTtcbiAgdXNlUmVzb2x2ZVdpdGg6ICgpID0+IFJlc29sdmVXaXRoO1xuICBjcmVhdGVSb3V0ZXI6IENyZWF0ZVJvdXRlcjxSZXNvbHZlV2l0aD47XG59KSB7XG4gIGNvbnN0IGNyZWF0ZVJvdXRlQ29tcG9uZW50ID0gKFxuICAgIHJvdXRlcjogUm91dGVDb250cm9sbGVyPFJvdXRlPFJlc29sdmVXaXRoLCBhbnk+PixcbiAgKSA9PlxuICAgIGZ1bmN0aW9uIFJvdXRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgICBjb25zdCByZXNvbHZlV2l0aCA9IG9wdGlvbnMudXNlUmVzb2x2ZVdpdGgoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFJvdXRlUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IHJlc29sdmVXaXRoPXtyZXNvbHZlV2l0aH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JvdXRlUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KG5leHQ6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCk7XG4gICAgICBjb25zdCByb3V0ZXIgPSBvcHRpb25zLmNyZWF0ZVJvdXRlcihoaXN0b3J5KTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSb3V0ZXMgPSByb3V0ZXIuZ2V0TWF0Y2hlZFJvdXRlcyhoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lKTtcblxuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCgpO1xuXG4gICAgICBjb25zdCBSb3V0ZXIgPSBjcmVhdGVSb3V0ZUNvbXBvbmVudChyb3V0ZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgICBtYXRjaGVkUm91dGVzLFxuICAgICAgICBhcHA6IDxSb3V0ZXI+e25leHRQcm9wcy5hcHB9PC9Sb3V0ZXI+LFxuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFNZSxTQUFTQSxXQUFULENBQWtDQyxPQUFsQyxFQUlaO0VBQ0QsTUFBTUMsb0JBQW9CLEdBQ3hCQyxNQUQyQixJQUczQixTQUFTQyxNQUFULENBQWdCO0lBQUVDO0VBQUYsQ0FBaEIsRUFBNkQ7SUFDM0QsTUFBTUMsV0FBVyxHQUFHTCxPQUFPLENBQUNNLGNBQVIsRUFBcEI7SUFFQSxvQkFDRSxtQkFBQyxxQkFBRDtNQUFlLE1BQU0sRUFBRUosTUFBdkI7TUFBK0IsV0FBVyxFQUFFRztJQUE1QyxXQUNHRCxRQURILENBREY7RUFLRCxDQVhIOztFQWFBLE9BQU8sVUFBaUNHLElBQWpDLEVBQXlEO0lBQzlELE9BQU8sWUFBWTtNQUNqQixNQUFNQyxPQUFPLEdBQUcsb0NBQWhCO01BQ0EsTUFBTU4sTUFBTSxHQUFHRixPQUFPLENBQUNTLFlBQVIsQ0FBcUJELE9BQXJCLENBQWY7TUFDQSxNQUFNRSxhQUFhLEdBQUdSLE1BQU0sQ0FBQ1MsZ0JBQVAsQ0FBd0JILE9BQU8sQ0FBQ0ksUUFBUixDQUFpQkMsUUFBekMsQ0FBdEI7TUFFQSxNQUFNQyxTQUFTLEdBQUcsTUFBTVAsSUFBSSxFQUE1QjtNQUVBLE1BQU1KLE1BQU0sR0FBR0Ysb0JBQW9CLENBQUNDLE1BQUQsQ0FBbkM7TUFDQSxPQUFPLEVBQ0wsR0FBR1ksU0FERTtRQUVMSixhQUZLO1FBR0xLLEdBQUcsZUFBRSxtQkFBQyxNQUFELGNBQVNELFNBQVMsQ0FBQ0MsR0FBbkI7TUFIQSxDQUFQO0lBS0QsQ0FiRDtFQWNELENBZkQ7QUFnQkQifQ==
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm5leHQiLCJoaXN0b3J5IiwiY3JlYXRlQnJvd3Nlckhpc3RvcnkiLCJjcmVhdGVSb3V0ZXIiLCJtYXRjaGVkUm91dGVzIiwiZ2V0TWF0Y2hlZFJvdXRlcyIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJuZXh0UHJvcHMiLCJhcHAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3JvdXRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUsIFJvdXRlUHJvdmlkZXIsIFJvdXRlQ29udHJvbGxlciB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VySGlzdG9yeSB9IGZyb20gJ2hpc3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgQ3JlYXRlUm91dGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHMgPSBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdXRlclNwb3V0PFJlc29sdmVXaXRoPihvcHRpb25zOiB7XG4gIHJlc29sdmVXaXRoPzogYW55O1xuICB1c2VSZXNvbHZlV2l0aDogKCkgPT4gUmVzb2x2ZVdpdGg7XG4gIGNyZWF0ZVJvdXRlcjogQ3JlYXRlUm91dGVyPFJlc29sdmVXaXRoPjtcbn0pIHtcbiAgY29uc3QgY3JlYXRlUm91dGVDb21wb25lbnQgPSAoXG4gICAgcm91dGVyOiBSb3V0ZUNvbnRyb2xsZXI8Um91dGU8UmVzb2x2ZVdpdGgsIGFueT4+LFxuICApID0+XG4gICAgZnVuY3Rpb24gUm91dGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgICAgIGNvbnN0IHJlc29sdmVXaXRoID0gb3B0aW9ucy51c2VSZXNvbHZlV2l0aCgpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Um91dGVQcm92aWRlciByb3V0ZXI9e3JvdXRlcn0gcmVzb2x2ZVdpdGg9e3Jlc29sdmVXaXRofT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvUm91dGVQcm92aWRlcj5cbiAgICAgICk7XG4gICAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOZWVkZWRQcm9wcz4obmV4dDogKCkgPT4gUHJvbWlzZTxUPikge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoaXN0b3J5ID0gY3JlYXRlQnJvd3Nlckhpc3RvcnkoKTtcbiAgICAgIGNvbnN0IHJvdXRlciA9IG9wdGlvbnMuY3JlYXRlUm91dGVyKGhpc3RvcnkpO1xuICAgICAgY29uc3QgbWF0Y2hlZFJvdXRlcyA9IHJvdXRlci5nZXRNYXRjaGVkUm91dGVzKGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUpO1xuXG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KCk7XG5cbiAgICAgIGNvbnN0IFJvdXRlciA9IGNyZWF0ZVJvdXRlQ29tcG9uZW50KHJvdXRlcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAgIG1hdGNoZWRSb3V0ZXMsXG4gICAgICAgIGFwcDogPFJvdXRlcj57bmV4dFByb3BzLmFwcH08L1JvdXRlcj4sXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQU1lLFNBQVNBLFdBQVQsQ0FBa0NDLE9BQWxDLEVBSVo7RUFDRCxNQUFNQyxvQkFBb0IsR0FDeEJDLE1BRDJCLElBRzNCLFNBQVNDLE1BQVQsQ0FBZ0I7SUFBRUM7RUFBRixDQUFoQixFQUE2RDtJQUMzRCxNQUFNQyxXQUFXLEdBQUdMLE9BQU8sQ0FBQ00sY0FBUixFQUFwQjtJQUVBLG9CQUNFLG1CQUFDLHFCQUFEO01BQWUsTUFBTSxFQUFFSixNQUF2QjtNQUErQixXQUFXLEVBQUVHO0lBQTVDLFdBQ0dELFFBREgsQ0FERjtFQUtELENBWEg7O0VBYUEsT0FBTyxVQUFpQ0csSUFBakMsRUFBeUQ7SUFDOUQsT0FBTyxZQUFZO01BQ2pCLE1BQU1DLE9BQU8sR0FBRyxJQUFBQyw2QkFBQSxHQUFoQjtNQUNBLE1BQU1QLE1BQU0sR0FBR0YsT0FBTyxDQUFDVSxZQUFSLENBQXFCRixPQUFyQixDQUFmO01BQ0EsTUFBTUcsYUFBYSxHQUFHVCxNQUFNLENBQUNVLGdCQUFQLENBQXdCSixPQUFPLENBQUNLLFFBQVIsQ0FBaUJDLFFBQXpDLENBQXRCO01BRUEsTUFBTUMsU0FBUyxHQUFHLE1BQU1SLElBQUksRUFBNUI7TUFFQSxNQUFNSixNQUFNLEdBQUdGLG9CQUFvQixDQUFDQyxNQUFELENBQW5DO01BQ0EsT0FBTyxFQUNMLEdBQUdhLFNBREU7UUFFTEosYUFGSztRQUdMSyxHQUFHLGVBQUUsbUJBQUMsTUFBRCxjQUFTRCxTQUFTLENBQUNDLEdBQW5CO01BSEEsQ0FBUDtJQUtELENBYkQ7RUFjRCxDQWZEO0FBZ0JEIn0=
@@ -40,4 +40,4 @@ function routerSpout(options) {
40
40
  };
41
41
  };
42
42
  }
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm5leHQiLCJwcm9wcyIsInVybCIsInJlcSIsImNyZWF0ZVJvdXRlciIsImluaXRpYWxFbnRyaWVzIiwibWF0Y2hlZFJvdXRlcyIsImdldE1hdGNoZWRSb3V0ZXMiLCJuZXh0UHJvcHMiLCJhcHAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3JvdXRlci5zZXJ2ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlLCBSb3V0ZVByb3ZpZGVyLCBSb3V0ZUNvbnRyb2xsZXIgfSBmcm9tICdAYW5hbnNpL3JvdXRlcic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5SGlzdG9yeSB9IGZyb20gJ2hpc3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgU2VydmVyUHJvcHMsIENyZWF0ZVJvdXRlciB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5lZWRlZFByb3BzID0gUmVzb2x2ZVByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByb3V0ZXJTcG91dDxSZXNvbHZlV2l0aD4ob3B0aW9uczoge1xuICByZXNvbHZlV2l0aD86IGFueTtcbiAgdXNlUmVzb2x2ZVdpdGg6ICgpID0+IFJlc29sdmVXaXRoO1xuICBjcmVhdGVSb3V0ZXI6IENyZWF0ZVJvdXRlcjxSZXNvbHZlV2l0aD47XG59KSB7XG4gIGNvbnN0IGNyZWF0ZVJvdXRlQ29tcG9uZW50ID0gKFxuICAgIHJvdXRlcjogUm91dGVDb250cm9sbGVyPFJvdXRlPFJlc29sdmVXaXRoLCBhbnk+PixcbiAgKSA9PlxuICAgIGZ1bmN0aW9uIFJvdXRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgICBjb25zdCByZXNvbHZlV2l0aCA9IG9wdGlvbnMudXNlUmVzb2x2ZVdpdGgoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFJvdXRlUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IHJlc29sdmVXaXRoPXtyZXNvbHZlV2l0aH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JvdXRlUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KFxuICAgIG5leHQ6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8VD4sXG4gICkge1xuICAgIHJldHVybiBhc3luYyAocHJvcHM6IFNlcnZlclByb3BzKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBwcm9wcy5yZXEudXJsIHx8ICcnO1xuICAgICAgY29uc3Qgcm91dGVyID0gb3B0aW9ucy5jcmVhdGVSb3V0ZXIoXG4gICAgICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnkoeyBpbml0aWFsRW50cmllczogW3VybF0gfSksXG4gICAgICApO1xuICAgICAgY29uc3QgbWF0Y2hlZFJvdXRlczogUm91dGU8UmVzb2x2ZVdpdGg+W10gPSByb3V0ZXIuZ2V0TWF0Y2hlZFJvdXRlcyh1cmwpO1xuXG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgICAgY29uc3QgUm91dGVyID0gY3JlYXRlUm91dGVDb21wb25lbnQocm91dGVyKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgICAgbWF0Y2hlZFJvdXRlcyxcbiAgICAgICAgYXBwOiA8Um91dGVyPntuZXh0UHJvcHMuYXBwfTwvUm91dGVyPixcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBTWUsU0FBU0EsV0FBVCxDQUFrQ0MsT0FBbEMsRUFJWjtFQUNELE1BQU1DLG9CQUFvQixHQUN4QkMsTUFEMkIsSUFHM0IsU0FBU0MsTUFBVCxDQUFnQjtJQUFFQztFQUFGLENBQWhCLEVBQTZEO0lBQzNELE1BQU1DLFdBQVcsR0FBR0wsT0FBTyxDQUFDTSxjQUFSLEVBQXBCO0lBRUEsb0JBQ0UsbUJBQUMscUJBQUQ7TUFBZSxNQUFNLEVBQUVKLE1BQXZCO01BQStCLFdBQVcsRUFBRUc7SUFBNUMsV0FDR0QsUUFESCxDQURGO0VBS0QsQ0FYSDs7RUFhQSxPQUFPLFVBQ0xHLElBREssRUFFTDtJQUNBLE9BQU8sTUFBT0MsS0FBUCxJQUE4QjtNQUNuQyxNQUFNQyxHQUFHLEdBQUdELEtBQUssQ0FBQ0UsR0FBTixDQUFVRCxHQUFWLElBQWlCLEVBQTdCO01BQ0EsTUFBTVAsTUFBTSxHQUFHRixPQUFPLENBQUNXLFlBQVIsQ0FDYixrQ0FBb0I7UUFBRUMsY0FBYyxFQUFFLENBQUNILEdBQUQ7TUFBbEIsQ0FBcEIsQ0FEYSxDQUFmO01BR0EsTUFBTUksYUFBbUMsR0FBR1gsTUFBTSxDQUFDWSxnQkFBUCxDQUF3QkwsR0FBeEIsQ0FBNUM7TUFFQSxNQUFNTSxTQUFTLEdBQUcsTUFBTVIsSUFBSSxDQUFDQyxLQUFELENBQTVCO01BRUEsTUFBTUwsTUFBTSxHQUFHRixvQkFBb0IsQ0FBQ0MsTUFBRCxDQUFuQztNQUNBLE9BQU8sRUFDTCxHQUFHYSxTQURFO1FBRUxGLGFBRks7UUFHTEcsR0FBRyxlQUFFLG1CQUFDLE1BQUQsY0FBU0QsU0FBUyxDQUFDQyxHQUFuQjtNQUhBLENBQVA7SUFLRCxDQWZEO0VBZ0JELENBbkJEO0FBb0JEIn0=
43
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm5leHQiLCJwcm9wcyIsInVybCIsInJlcSIsImNyZWF0ZVJvdXRlciIsImNyZWF0ZU1lbW9yeUhpc3RvcnkiLCJpbml0aWFsRW50cmllcyIsIm1hdGNoZWRSb3V0ZXMiLCJnZXRNYXRjaGVkUm91dGVzIiwibmV4dFByb3BzIiwiYXBwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nwb3V0cy9yb3V0ZXIuc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZSwgUm91dGVQcm92aWRlciwgUm91dGVDb250cm9sbGVyIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeUhpc3RvcnkgfSBmcm9tICdoaXN0b3J5JztcblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUHJvcHMsIFNlcnZlclByb3BzLCBDcmVhdGVSb3V0ZXIgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOZWVkZWRQcm9wcyA9IFJlc29sdmVQcm9wcztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91dGVyU3BvdXQ8UmVzb2x2ZVdpdGg+KG9wdGlvbnM6IHtcbiAgcmVzb2x2ZVdpdGg/OiBhbnk7XG4gIHVzZVJlc29sdmVXaXRoOiAoKSA9PiBSZXNvbHZlV2l0aDtcbiAgY3JlYXRlUm91dGVyOiBDcmVhdGVSb3V0ZXI8UmVzb2x2ZVdpdGg+O1xufSkge1xuICBjb25zdCBjcmVhdGVSb3V0ZUNvbXBvbmVudCA9IChcbiAgICByb3V0ZXI6IFJvdXRlQ29udHJvbGxlcjxSb3V0ZTxSZXNvbHZlV2l0aCwgYW55Pj4sXG4gICkgPT5cbiAgICBmdW5jdGlvbiBSb3V0ZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICAgICAgY29uc3QgcmVzb2x2ZVdpdGggPSBvcHRpb25zLnVzZVJlc29sdmVXaXRoKCk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxSb3V0ZVByb3ZpZGVyIHJvdXRlcj17cm91dGVyfSByZXNvbHZlV2l0aD17cmVzb2x2ZVdpdGh9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9Sb3V0ZVByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIE5lZWRlZFByb3BzPihcbiAgICBuZXh0OiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPFQ+LFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gcHJvcHMucmVxLnVybCB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRlciA9IG9wdGlvbnMuY3JlYXRlUm91dGVyKFxuICAgICAgICBjcmVhdGVNZW1vcnlIaXN0b3J5KHsgaW5pdGlhbEVudHJpZXM6IFt1cmxdIH0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSb3V0ZXM6IFJvdXRlPFJlc29sdmVXaXRoPltdID0gcm91dGVyLmdldE1hdGNoZWRSb3V0ZXModXJsKTtcblxuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IFJvdXRlciA9IGNyZWF0ZVJvdXRlQ29tcG9uZW50KHJvdXRlcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAgIG1hdGNoZWRSb3V0ZXMsXG4gICAgICAgIGFwcDogPFJvdXRlcj57bmV4dFByb3BzLmFwcH08L1JvdXRlcj4sXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQU1lLFNBQVNBLFdBQVQsQ0FBa0NDLE9BQWxDLEVBSVo7RUFDRCxNQUFNQyxvQkFBb0IsR0FDeEJDLE1BRDJCLElBRzNCLFNBQVNDLE1BQVQsQ0FBZ0I7SUFBRUM7RUFBRixDQUFoQixFQUE2RDtJQUMzRCxNQUFNQyxXQUFXLEdBQUdMLE9BQU8sQ0FBQ00sY0FBUixFQUFwQjtJQUVBLG9CQUNFLG1CQUFDLHFCQUFEO01BQWUsTUFBTSxFQUFFSixNQUF2QjtNQUErQixXQUFXLEVBQUVHO0lBQTVDLFdBQ0dELFFBREgsQ0FERjtFQUtELENBWEg7O0VBYUEsT0FBTyxVQUNMRyxJQURLLEVBRUw7SUFDQSxPQUFPLE1BQU9DLEtBQVAsSUFBOEI7TUFDbkMsTUFBTUMsR0FBRyxHQUFHRCxLQUFLLENBQUNFLEdBQU4sQ0FBVUQsR0FBVixJQUFpQixFQUE3QjtNQUNBLE1BQU1QLE1BQU0sR0FBR0YsT0FBTyxDQUFDVyxZQUFSLENBQ2IsSUFBQUMsNEJBQUEsRUFBb0I7UUFBRUMsY0FBYyxFQUFFLENBQUNKLEdBQUQ7TUFBbEIsQ0FBcEIsQ0FEYSxDQUFmO01BR0EsTUFBTUssYUFBbUMsR0FBR1osTUFBTSxDQUFDYSxnQkFBUCxDQUF3Qk4sR0FBeEIsQ0FBNUM7TUFFQSxNQUFNTyxTQUFTLEdBQUcsTUFBTVQsSUFBSSxDQUFDQyxLQUFELENBQTVCO01BRUEsTUFBTUwsTUFBTSxHQUFHRixvQkFBb0IsQ0FBQ0MsTUFBRCxDQUFuQztNQUNBLE9BQU8sRUFDTCxHQUFHYyxTQURFO1FBRUxGLGFBRks7UUFHTEcsR0FBRyxlQUFFLG1CQUFDLE1BQUQsY0FBU0QsU0FBUyxDQUFDQyxHQUFuQjtNQUhBLENBQVA7SUFLRCxDQWZEO0VBZ0JELENBbkJEO0FBb0JEIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "React 18 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -56,25 +56,27 @@
56
56
  "browser"
57
57
  ],
58
58
  "devDependencies": {
59
- "@anansi/babel-preset": "^3.1.1",
59
+ "@anansi/babel-preset": "^3.1.2",
60
60
  "@anansi/browserslist-config": "1.3.3",
61
61
  "@babel/cli": "7.17.10",
62
- "@babel/core": "7.17.10",
62
+ "@babel/core": "7.17.12",
63
63
  "@types/compression": "^1.7.2",
64
64
  "@types/source-map-support": "^0.5.4",
65
65
  "@types/tmp": "^0.2.3",
66
66
  "@types/webpack-hot-middleware": "^2.25.6",
67
- "jest": "28.0.3",
67
+ "jest": "28.1.0",
68
68
  "rimraf": "^3.0.0"
69
69
  },
70
70
  "dependencies": {
71
- "@anansi/router": "^0.4.1",
71
+ "@anansi/router": "^0.4.2",
72
72
  "@babel/runtime": "^7.10.5",
73
73
  "@rest-hooks/ssr": "^0.1.3",
74
+ "chalk": "^4.0.0",
74
75
  "compression": "^1.7.4",
75
76
  "cross-fetch": "^3.1.5",
76
77
  "express": "^4.17.3",
77
78
  "fs-monkey": "^1.0.3",
79
+ "import-fresh": "^3.3.0",
78
80
  "memfs": "^3.4.1",
79
81
  "ora": "^5.0.0",
80
82
  "redux": "^4.1.2",
@@ -82,14 +84,15 @@
82
84
  "source-map-support": "^0.5.21",
83
85
  "tmp": "^0.2.1",
84
86
  "unionfs": "^4.4.0",
85
- "webpack-hot-middleware": "^2.25.1",
87
+ "webpack-dev-server": "^4.9.0",
86
88
  "whatwg-fetch": "^3.6.2"
87
89
  },
88
90
  "peerDependencies": {
89
91
  "@types/react": "^17.0.40 || ^18.0.0-0",
90
92
  "@types/react-dom": "^17.0.40 || ^18.0.0-0",
91
93
  "react": "^18.0.0-0",
92
- "react-dom": "^18.0.0-0"
94
+ "react-dom": "^18.0.0-0",
95
+ "webpack": "^5.60.0"
93
96
  },
94
97
  "peerDependenciesMeta": {
95
98
  "@types/react": {
package/src/laySpouts.tsx CHANGED
@@ -7,7 +7,7 @@ export default function laySpouts(
7
7
  spouts: (props: ServerProps) => Promise<{
8
8
  app: JSX.Element;
9
9
  }>,
10
- { timeoutMS = 1000 }: { timeoutMS?: number } = {},
10
+ { timeoutMS = 100 }: { timeoutMS?: number } = {},
11
11
  ) {
12
12
  const render: Render = async (clientManifest, req, res) => {
13
13
  const { app } = await spouts({ clientManifest, req, res });
@@ -4,7 +4,6 @@ import { promisify } from 'util';
4
4
  import diskFs from 'fs';
5
5
  import path from 'path';
6
6
  import webpack, { MultiCompiler } from 'webpack';
7
- import webpackHotMiddleware from 'webpack-hot-middleware';
8
7
  import { createFsFromVolume, Volume } from 'memfs';
9
8
  import { Server, IncomingMessage, ServerResponse } from 'http';
10
9
  import express, { NextFunction } from 'express';
@@ -14,6 +13,9 @@ import tmp from 'tmp';
14
13
  import sourceMapSupport from 'source-map-support';
15
14
  import { ufs } from 'unionfs';
16
15
  import compress from 'compression';
16
+ import WebpackDevServer from 'webpack-dev-server';
17
+ import importFresh from 'import-fresh';
18
+ import chalk from 'chalk';
17
19
 
18
20
  import 'cross-fetch/polyfill';
19
21
  import { Render } from './types';
@@ -34,7 +36,11 @@ if (!entrypoint) {
34
36
  process.exit(-1);
35
37
  }
36
38
 
37
- const loader = ora('Building the assets').start();
39
+ console.log(
40
+ chalk.greenBright(`Starting SSR at`),
41
+ chalk.cyanBright(process.env.WEBPACK_PUBLIC_HOST),
42
+ );
43
+ const loader = ora().start();
38
44
 
39
45
  // Set up in memory filesystem
40
46
  const volume = new Volume();
@@ -75,20 +81,19 @@ const webpackConfigs = [
75
81
  ),
76
82
  webpackConfig(
77
83
  {
78
- entrypoint: hotEntry(entrypoint.replace('.tsx', '.server.tsx')).name,
84
+ entrypoint: entrypoint.replace('.tsx', '.server.tsx'),
79
85
  name: 'server',
80
86
  },
81
87
  { mode: 'development', target: 'node' },
82
88
  ),
83
89
  ] as const;
90
+ // only have one output for server so we can avoid cached modules
91
+ webpackConfigs[1].plugins.push(
92
+ new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 }),
93
+ );
84
94
  // initialize the webpack compiler
85
95
  const compiler: MultiCompiler = webpack(webpackConfigs);
86
96
 
87
- compiler.outputFileSystem = {
88
- ...fs,
89
- join: path.join as any,
90
- } as any as typeof fs;
91
-
92
97
  sourceMapSupport.install({ hookRequire: true });
93
98
 
94
99
  function getServerBundle(serverStats: webpack.Stats) {
@@ -113,19 +118,20 @@ function handleErrors<
113
118
  }
114
119
  };
115
120
  }
116
-
121
+ let render: Render;
117
122
  // Start the express server after the first compilation
118
123
  function initializeApp(stats: webpack.Stats[]) {
119
- loader.info('Launching server');
120
124
  const [clientStats, serverStats] = stats;
121
125
  if (
122
126
  clientStats?.compilation?.errors?.length ||
123
127
  serverStats?.compilation?.errors?.length
124
128
  ) {
125
- console.log('Errors for client build: ', clientStats.compilation.errors);
126
- console.log('Errors for server build:', serverStats.compilation.errors);
129
+ loader.fail('Errors for client build: ' + clientStats.compilation.errors);
130
+ loader.fail('Errors for server build: ' + serverStats.compilation.errors);
127
131
  // TODO: handle more gracefully
128
132
  process.exit(-1);
133
+ } else {
134
+ loader.info('Launching server');
129
135
  }
130
136
 
131
137
  const wrappingApp = express();
@@ -134,19 +140,12 @@ function initializeApp(stats: webpack.Stats[]) {
134
140
  wrappingApp.use(compress());
135
141
 
136
142
  // ASSETS
137
- wrappingApp.use(
138
- webpackHotMiddleware(compiler.compilers[0], {
139
- log: console.log,
140
- path: '/__webpack_hmr',
141
- heartbeat: 10 * 1000,
142
- //noInfo: true,
143
- //name: 'client',
144
- }),
145
- );
146
143
  const clientManifest = clientStats.toJson();
147
144
  const assetRoute = async (req: Request | IncomingMessage, res: any) => {
148
145
  const filename =
149
- req.url?.substr((process.env.WEBPACK_PUBLIC_PATH as string).length) ?? '';
146
+ req.url
147
+ ?.substring((process.env.WEBPACK_PUBLIC_PATH as string).length)
148
+ .split('?')[0] ?? '';
150
149
  const assetPath = path.join(clientManifest.outputPath ?? '', filename);
151
150
 
152
151
  try {
@@ -163,7 +162,7 @@ function initializeApp(stats: webpack.Stats[]) {
163
162
 
164
163
  // SERVER SIDE RENDERING
165
164
  // eslint-disable-next-line @typescript-eslint/no-var-requires
166
- const render: Render = require(getServerBundle(serverStats)).default;
165
+ render = require(getServerBundle(serverStats)).default;
167
166
  wrappingApp.get(
168
167
  '/*',
169
168
  handleErrors(async function (req: any, res: any) {
@@ -183,7 +182,7 @@ function initializeApp(stats: webpack.Stats[]) {
183
182
 
184
183
  server = wrappingApp
185
184
  .listen(PORT, () => {
186
- console.log(`Listening at ${PORT}...`);
185
+ loader.succeed(`SSR Running`);
187
186
  })
188
187
  .on('error', function (error: any) {
189
188
  if (error.syscall !== 'listen') {
@@ -206,37 +205,67 @@ function initializeApp(stats: webpack.Stats[]) {
206
205
  });
207
206
  }
208
207
 
209
- // Watch the files for changes
210
- const watcher = compiler.watch({}, (err, multiStats) => {
211
- if (!multiStats) {
212
- console.error('stats not send');
213
- process.exit(-1);
214
- }
215
- if (err) {
216
- console.error('Error in compilation');
217
- console.error(err);
218
- process.exit(-1);
219
- }
220
- if (server) {
221
- loader.succeed('Webpack bundle updated');
222
- return;
223
- }
224
- try {
225
- initializeApp(multiStats.stats);
226
- } catch (e) {
227
- console.error('Failed to initialize app');
228
- console.error(e);
229
- }
230
- });
208
+ const devServer = new WebpackDevServer(
209
+ // write to memory filesystem so we can import
210
+ {
211
+ ...webpackConfigs[0].devServer,
212
+ /*client: {
213
+ ...webpackConfigs[0].devServer?.client,
214
+ webSocketURL: {
215
+ ...webpackConfigs[0].devServer?.client.webSocketURL,
216
+ port: 8080,
217
+ },
218
+ },*/
219
+ devMiddleware: {
220
+ ...webpackConfigs[0]?.devServer?.devMiddleware,
221
+ outputFileSystem: {
222
+ ...fs,
223
+ join: path.join as any,
224
+ } as any as typeof fs,
225
+ },
226
+ },
227
+ compiler,
228
+ );
229
+ const runServer = async () => {
230
+ await devServer.start();
231
+ devServer.compiler.hooks.done.tap(
232
+ 'Anansi Server',
233
+ (multiStats: webpack.MultiStats | webpack.Stats) => {
234
+ if (!multiStats) {
235
+ loader.fail('stats not send');
236
+ process.exit(-1);
237
+ }
238
+
239
+ if (!Object.hasOwn(multiStats, 'stats')) return;
240
+ if (server && (multiStats as webpack.MultiStats).stats.length > 1) {
241
+ render = (
242
+ importFresh(
243
+ getServerBundle((multiStats as webpack.MultiStats).stats[1]),
244
+ ) as any
245
+ ).default;
246
+ return;
247
+ }
248
+ if (!server) {
249
+ try {
250
+ initializeApp((multiStats as webpack.MultiStats).stats);
251
+ } catch (e) {
252
+ loader.fail('Failed to initialize app');
253
+ console.error(e);
254
+ }
255
+ }
256
+ },
257
+ );
258
+ };
259
+ const stopServer = async () => {
260
+ loader.info('Stopping server...');
261
+ await devServer.stop();
262
+ loader.info('Server closed');
263
+ };
231
264
 
232
265
  process.on('SIGINT', () => {
233
266
  loader.warn('Received SIGINT, devserver shutting down');
234
- if (server) console.log('Closing server');
235
- server?.close(() => {
236
- loader.info('Server closed');
237
- });
238
- watcher.close(() => {
239
- loader.info('webpack build stopped');
240
- });
267
+ stopServer();
241
268
  process.exit(-1);
242
269
  });
270
+
271
+ runServer();