@decohere/create 0.0.1-dev.43 → 0.0.1-dev.44

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.
Files changed (47) hide show
  1. package/commonjs/src/models/config-yaml.model.js +58 -4
  2. package/commonjs/src/models/env-file.model.js +14 -1
  3. package/commonjs/src/models/launch-json.model.js +49 -27
  4. package/commonjs/src/models/package-json.model.js +64 -7
  5. package/commonjs/src/models/project.model.js +4 -1
  6. package/commonjs/src/program.js +52 -21
  7. package/commonjs/src/runner.js +13 -2
  8. package/commonjs/src/webapi/api-name.js +95 -0
  9. package/commonjs/src/webapi/const.js +32 -4
  10. package/commonjs/src/webapi/create-api.js +62 -18
  11. package/commonjs/src/webapi/features/auth.feature.js +56 -51
  12. package/commonjs/src/webapi/features/biome-format.js +6 -4
  13. package/commonjs/src/webapi/features/database.feature.js +125 -98
  14. package/commonjs/src/webapi/features/finalize.feature.js +19 -7
  15. package/commonjs/src/webapi/models/api-package-json.model.js +7 -5
  16. package/commonjs/src/webapi/models/main-source-file.model.js +12 -3
  17. package/commonjs/src/webapi/models/production-dockerfile.model.js +76 -36
  18. package/es6/src/models/config-yaml.model.js +47 -1
  19. package/es6/src/models/env-file.model.js +14 -1
  20. package/es6/src/models/launch-json.model.js +49 -27
  21. package/es6/src/models/package-json.model.js +62 -5
  22. package/es6/src/models/project.model.js +4 -1
  23. package/es6/src/program.js +52 -21
  24. package/es6/src/runner.js +13 -2
  25. package/es6/src/webapi/api-name.js +59 -0
  26. package/es6/src/webapi/const.js +18 -5
  27. package/es6/src/webapi/create-api.js +64 -20
  28. package/es6/src/webapi/features/auth.feature.js +56 -51
  29. package/es6/src/webapi/features/biome-format.js +6 -4
  30. package/es6/src/webapi/features/database.feature.js +125 -98
  31. package/es6/src/webapi/features/finalize.feature.js +19 -7
  32. package/es6/src/webapi/models/api-package-json.model.js +8 -6
  33. package/es6/src/webapi/models/main-source-file.model.js +12 -3
  34. package/es6/src/webapi/models/production-dockerfile.model.js +71 -36
  35. package/package.json +2 -2
  36. package/types/src/models/config-yaml.model.d.ts +11 -0
  37. package/types/src/models/env-file.model.d.ts +1 -0
  38. package/types/src/models/launch-json.model.d.ts +2 -0
  39. package/types/src/models/package-json.model.d.ts +16 -6
  40. package/types/src/models/project.model.d.ts +3 -0
  41. package/types/src/webapi/api-name.d.ts +14 -0
  42. package/types/src/webapi/const.d.ts +15 -5
  43. package/types/src/webapi/create-api.d.ts +4 -0
  44. package/types/src/webapi/features/biome-format.d.ts +1 -1
  45. package/types/src/webapi/models/api-package-json.model.d.ts +4 -3
  46. package/types/src/webapi/models/main-source-file.model.d.ts +6 -0
  47. package/types/src/webapi/models/production-dockerfile.model.d.ts +13 -2
@@ -2,12 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "ConfigYaml", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get ConfigYaml () {
8
13
  return ConfigYaml;
14
+ },
15
+ get injectYamlDataSource () {
16
+ return injectYamlDataSource;
9
17
  }
10
18
  });
19
+ const _nodefs = require("node:fs");
11
20
  class ConfigYaml {
12
21
  key;
13
22
  filePath;
@@ -21,6 +30,25 @@ class ConfigYaml {
21
30
  this._sections.push(yaml);
22
31
  return this;
23
32
  }
33
+ /** True when a datasource with this `name:` already appears in the file. */ hasDataSource(name) {
34
+ return this._sections.join("\n").includes(`name: ${name}\n`);
35
+ }
36
+ hasDataSources() {
37
+ return this._sections.join("\n").includes("dataSources:");
38
+ }
39
+ /**
40
+ * Insert a `dataSources` list item. Used by `webapi add` so we do not write a
41
+ * second top-level `database:` key (YAML last-key-wins).
42
+ */ appendDataSource(item) {
43
+ const current = this._sections.join("\n");
44
+ this._sections.length = 0;
45
+ this._sections.push(injectYamlDataSource(current, item));
46
+ return this;
47
+ }
48
+ static fromFile(key, relativePath, absolutePath) {
49
+ const content = (0, _nodefs.readFileSync)(absolutePath, "utf8");
50
+ return new ConfigYaml(key, relativePath, content);
51
+ }
24
52
  files() {
25
53
  return [
26
54
  {
@@ -30,5 +58,31 @@ class ConfigYaml {
30
58
  ];
31
59
  }
32
60
  }
61
+ function injectYamlDataSource(yaml, item) {
62
+ const block = item.replace(/\n$/, "");
63
+ if (!yaml.includes("dataSources:")) {
64
+ const prefix = yaml.trimEnd();
65
+ const section = `database:\n dataSources:\n${block}\n`;
66
+ return prefix.length > 0 ? `${prefix}\n\n${section}` : section;
67
+ }
68
+ const lines = yaml.split("\n");
69
+ const dsIndex = lines.findIndex((line)=>/^\s*dataSources:\s*$/.test(line));
70
+ if (dsIndex < 0) {
71
+ return `${yaml.trimEnd()}\n\ndatabase:\n dataSources:\n${block}\n`;
72
+ }
73
+ let insertAt = lines.length;
74
+ for(let i = dsIndex + 1; i < lines.length; i++){
75
+ if (/^[A-Za-z]/.test(lines[i] ?? "")) {
76
+ insertAt = i;
77
+ break;
78
+ }
79
+ }
80
+ const insertLines = block.split("\n");
81
+ if (insertAt < lines.length && lines[insertAt - 1] !== "") {
82
+ insertLines.push("");
83
+ }
84
+ lines.splice(insertAt, 0, ...insertLines);
85
+ return lines.join("\n");
86
+ }
33
87
 
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYSBZQU1MIGNvbmZpZyBmaWxlIChlLmcuIGNvbmZpZy9jb25maWcueWFtbCBvciBjb25maWcvY29uZmlnLmRldi55YW1sKS5cbiAqXG4gKiBTdGFydHMgd2l0aCBhIGJhc2Ugc2VjdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiBGZWF0dXJlcyBjYWxsXG4gKiBgYWRkU2VjdGlvbih5YW1sKWAgZHVyaW5nIHRoZWlyIHNjYWZmb2xkIHBoYXNlIHRvIGFwcGVuZCB0aGVpciBvd24gYmxvY2suXG4gKiBgZmlsZXMoKWAgam9pbnMgYWxsIHNlY3Rpb25zIHdpdGggYSBibGFuayBsaW5lIHNlcGFyYXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ1lhbWwgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHJpdmF0ZSByZWFkb25seSBfc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyByZWFkb25seSBrZXk6IHN0cmluZyxcblx0XHRwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmcsXG5cdFx0YmFzZUNvbnRlbnQ6IHN0cmluZyxcblx0KSB7XG5cdFx0dGhpcy5fc2VjdGlvbnMucHVzaChiYXNlQ29udGVudCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2VjdGlvbih5YW1sOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9zZWN0aW9ucy5wdXNoKHlhbWwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiB0aGlzLmZpbGVQYXRoLCBjb250ZW50OiB0aGlzLl9zZWN0aW9ucy5qb2luKFwiXFxuXCIpIH1dO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQ29uZmlnWWFtbCIsIl9zZWN0aW9ucyIsImtleSIsImZpbGVQYXRoIiwiYmFzZUNvbnRlbnQiLCJwdXNoIiwiYWRkU2VjdGlvbiIsInlhbWwiLCJmaWxlcyIsImNvbnRlbnQiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7OytCQVNhQTs7O2VBQUFBOzs7QUFBTixNQUFNQTs7O0lBQ0tDLFlBQXNCLEVBQUUsQ0FBQztJQUUxQyxZQUNDLEFBQWdCQyxHQUFXLEVBQzNCLEFBQWlCQyxRQUFnQixFQUNqQ0MsV0FBbUIsQ0FDbEI7YUFIZUYsTUFBQUE7YUFDQ0MsV0FBQUE7UUFHakIsSUFBSSxDQUFDRixTQUFTLENBQUNJLElBQUksQ0FBQ0Q7SUFDckI7SUFFT0UsV0FBV0MsSUFBWSxFQUFRO1FBQ3JDLElBQUksQ0FBQ04sU0FBUyxDQUFDSSxJQUFJLENBQUNFO1FBQ3BCLE9BQU8sSUFBSTtJQUNaO0lBRU9DLFFBQXNCO1FBQzVCLE9BQU87WUFBQztnQkFBRUwsVUFBVSxJQUFJLENBQUNBLFFBQVE7Z0JBQUVNLFNBQVMsSUFBSSxDQUFDUixTQUFTLENBQUNTLElBQUksQ0FBQztZQUFNO1NBQUU7SUFDekU7QUFDRCJ9
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIGEgWUFNTCBjb25maWcgZmlsZSAoZS5nLiBjb25maWcvY29uZmlnLnlhbWwgb3IgY29uZmlnL2NvbmZpZy5kZXYueWFtbCkuXG4gKlxuICogU3RhcnRzIHdpdGggYSBiYXNlIHNlY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gRmVhdHVyZXMgY2FsbFxuICogYGFkZFNlY3Rpb24oeWFtbClgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBhcHBlbmQgdGhlaXIgb3duIGJsb2NrLlxuICogYGZpbGVzKClgIGpvaW5zIGFsbCBzZWN0aW9ucyB3aXRoIGEgYmxhbmsgbGluZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdZYW1sIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3NlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nLFxuXHRcdGJhc2VDb250ZW50OiBzdHJpbmcsXG5cdCkge1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goYmFzZUNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGFkZFNlY3Rpb24oeWFtbDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VjdGlvbnMucHVzaCh5YW1sKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBUcnVlIHdoZW4gYSBkYXRhc291cmNlIHdpdGggdGhpcyBgbmFtZTpgIGFscmVhZHkgYXBwZWFycyBpbiB0aGUgZmlsZS4gKi9cblx0cHVibGljIGhhc0RhdGFTb3VyY2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlY3Rpb25zLmpvaW4oXCJcXG5cIikuaW5jbHVkZXMoYG5hbWU6ICR7bmFtZX1cXG5gKTtcblx0fVxuXG5cdHB1YmxpYyBoYXNEYXRhU291cmNlcygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKS5pbmNsdWRlcyhcImRhdGFTb3VyY2VzOlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnNlcnQgYSBgZGF0YVNvdXJjZXNgIGxpc3QgaXRlbS4gVXNlZCBieSBgd2ViYXBpIGFkZGAgc28gd2UgZG8gbm90IHdyaXRlIGFcblx0ICogc2Vjb25kIHRvcC1sZXZlbCBgZGF0YWJhc2U6YCBrZXkgKFlBTUwgbGFzdC1rZXktd2lucykuXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kRGF0YVNvdXJjZShpdGVtOiBzdHJpbmcpOiB0aGlzIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKTtcblx0XHR0aGlzLl9zZWN0aW9ucy5sZW5ndGggPSAwO1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goaW5qZWN0WWFtbERhdGFTb3VyY2UoY3VycmVudCwgaXRlbSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBmcm9tRmlsZShrZXk6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogQ29uZmlnWWFtbCB7XG5cdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRyZXR1cm4gbmV3IENvbmZpZ1lhbWwoa2V5LCByZWxhdGl2ZVBhdGgsIGNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiB0aGlzLmZpbGVQYXRoLCBjb250ZW50OiB0aGlzLl9zZWN0aW9ucy5qb2luKFwiXFxuXCIpIH1dO1xuXHR9XG59XG5cbi8qKiBJbnNlcnQgYSBZQU1MIGxpc3QgaXRlbSB1bmRlciBgZGF0YVNvdXJjZXM6YDsgYXBwZW5kIGEgbmV3IGBkYXRhYmFzZTpgIGJsb2NrIGlmIG1pc3NpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0WWFtbERhdGFTb3VyY2UoeWFtbDogc3RyaW5nLCBpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBibG9jayA9IGl0ZW0ucmVwbGFjZSgvXFxuJC8sIFwiXCIpO1xuXHRpZiAoIXlhbWwuaW5jbHVkZXMoXCJkYXRhU291cmNlczpcIikpIHtcblx0XHRjb25zdCBwcmVmaXggPSB5YW1sLnRyaW1FbmQoKTtcblx0XHRjb25zdCBzZWN0aW9uID0gYGRhdGFiYXNlOlxcbiAgZGF0YVNvdXJjZXM6XFxuJHtibG9ja31cXG5gO1xuXHRcdHJldHVybiBwcmVmaXgubGVuZ3RoID4gMCA/IGAke3ByZWZpeH1cXG5cXG4ke3NlY3Rpb259YCA6IHNlY3Rpb247XG5cdH1cblx0Y29uc3QgbGluZXMgPSB5YW1sLnNwbGl0KFwiXFxuXCIpO1xuXHRjb25zdCBkc0luZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypkYXRhU291cmNlczpcXHMqJC8udGVzdChsaW5lKSk7XG5cdGlmIChkc0luZGV4IDwgMCkge1xuXHRcdHJldHVybiBgJHt5YW1sLnRyaW1FbmQoKX1cXG5cXG5kYXRhYmFzZTpcXG4gIGRhdGFTb3VyY2VzOlxcbiR7YmxvY2t9XFxuYDtcblx0fVxuXHRsZXQgaW5zZXJ0QXQgPSBsaW5lcy5sZW5ndGg7XG5cdGZvciAobGV0IGkgPSBkc0luZGV4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKC9eW0EtWmEtel0vLnRlc3QobGluZXNbaV0gPz8gXCJcIikpIHtcblx0XHRcdGluc2VydEF0ID0gaTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpbnNlcnRMaW5lcyA9IGJsb2NrLnNwbGl0KFwiXFxuXCIpO1xuXHRpZiAoaW5zZXJ0QXQgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaW5zZXJ0QXQgLSAxXSAhPT0gXCJcIikge1xuXHRcdGluc2VydExpbmVzLnB1c2goXCJcIik7XG5cdH1cblx0bGluZXMuc3BsaWNlKGluc2VydEF0LCAwLCAuLi5pbnNlcnRMaW5lcyk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm5hbWVzIjpbIkNvbmZpZ1lhbWwiLCJpbmplY3RZYW1sRGF0YVNvdXJjZSIsIl9zZWN0aW9ucyIsImtleSIsImZpbGVQYXRoIiwiYmFzZUNvbnRlbnQiLCJwdXNoIiwiYWRkU2VjdGlvbiIsInlhbWwiLCJoYXNEYXRhU291cmNlIiwibmFtZSIsImpvaW4iLCJpbmNsdWRlcyIsImhhc0RhdGFTb3VyY2VzIiwiYXBwZW5kRGF0YVNvdXJjZSIsIml0ZW0iLCJjdXJyZW50IiwibGVuZ3RoIiwiZnJvbUZpbGUiLCJyZWxhdGl2ZVBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJjb250ZW50IiwicmVhZEZpbGVTeW5jIiwiZmlsZXMiLCJibG9jayIsInJlcGxhY2UiLCJwcmVmaXgiLCJ0cmltRW5kIiwic2VjdGlvbiIsImxpbmVzIiwic3BsaXQiLCJkc0luZGV4IiwiZmluZEluZGV4IiwibGluZSIsInRlc3QiLCJpbnNlcnRBdCIsImkiLCJpbnNlcnRMaW5lcyIsInNwbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFVYUE7ZUFBQUE7O1FBK0NHQztlQUFBQTs7O3dCQXpEYTtBQVV0QixNQUFNRDs7O0lBQ0tFLFlBQXNCLEVBQUUsQ0FBQztJQUUxQyxZQUNDLEFBQWdCQyxHQUFXLEVBQzNCLEFB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
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "EnvFile", {
8
8
  return EnvFile;
9
9
  }
10
10
  });
11
+ const _nodefs = require("node:fs");
11
12
  const _const = require("./const.js");
12
13
  class EnvFile {
13
14
  key = _const.WELL_KNOWN_FILES.ENV_FILE;
@@ -16,6 +17,18 @@ class EnvFile {
16
17
  this._entries.set(key, value);
17
18
  return this;
18
19
  }
20
+ static fromFile(absolutePath) {
21
+ const env = new EnvFile();
22
+ const raw = (0, _nodefs.readFileSync)(absolutePath, "utf8");
23
+ for (const line of raw.split("\n")){
24
+ const trimmed = line.trim();
25
+ if (trimmed === "" || trimmed.startsWith("#")) continue;
26
+ const eq = line.indexOf("=");
27
+ if (eq <= 0) continue;
28
+ env.addEntry(line.slice(0, eq).trim(), line.slice(eq + 1));
29
+ }
30
+ return env;
31
+ }
19
32
  files() {
20
33
  if (this._entries.size === 0) return [];
21
34
  const body = [
@@ -31,4 +44,4 @@ class EnvFile {
31
44
  }
32
45
  }
33
46
 
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Vudi1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBBY2N1bXVsYXRlcyBrZXk9dmFsdWUgcGFpcnMgYW5kIHJlbmRlcnMgdGhlbSBhcyBhIGAuZW52YCBmaWxlLlxuICpcbiAqIFJlZ2lzdGVyIG9uY2UgaW4gdGhlIHdvcmtzcGFjZTsgZmVhdHVyZXMgY2FsbCBgYWRkRW50cnlgIGR1cmluZyB0aGVpclxuICogc2NhZmZvbGQgcGhhc2UgdG8gY29udHJpYnV0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBmaW5hbCBmaWxlIGlzXG4gKiB3cml0dGVuIGF0IHJlbmRlciB0aW1lIHdoZW4gYHdvcmtzcGFjZS5zY2FmZm9sZCgpYCBpcyBjYWxsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZGaWxlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2VudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG5cdHB1YmxpYyBhZGRFbnRyeShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2VudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0aWYgKHRoaXMuX2VudHJpZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIFtdO1xuXHRcdGNvbnN0IGJvZHkgPSBbLi4udGhpcy5fZW50cmllcy5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke3Z9YCkuam9pbihcIlxcblwiKTtcblx0XHRjb25zdCBjb250ZW50ID0gYCR7Ym9keX1cXG5gO1xuXHRcdHJldHVybiBbeyBmaWxlUGF0aDogXCIuZW52XCIsIGNvbnRlbnQgfV07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFbnZGaWxlIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkVOVl9GSUxFIiwiX2VudHJpZXMiLCJNYXAiLCJhZGRFbnRyeSIsInZhbHVlIiwic2V0IiwiZmlsZXMiLCJzaXplIiwiYm9keSIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImpvaW4iLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7K0JBVWFBOzs7ZUFBQUE7Ozt1QkFWb0I7QUFVMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFFBQVEsQ0FBQztJQUUvQkMsV0FBVyxJQUFJQyxNQUFzQjtJQUUvQ0MsU0FBU0wsR0FBVyxFQUFFTSxLQUFhLEVBQVE7UUFDakQsSUFBSSxDQUFDSCxRQUFRLENBQUNJLEdBQUcsQ0FBQ1AsS0FBS007UUFDdkIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsSUFBSSxJQUFJLENBQUNMLFFBQVEsQ0FBQ00sSUFBSSxLQUFLLEdBQUcsT0FBTyxFQUFFO1FBQ3ZDLE1BQU1DLE9BQU87ZUFBSSxJQUFJLENBQUNQLFFBQVEsQ0FBQ1EsT0FBTztTQUFHLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUNDLEdBQUdDLEVBQUUsR0FBSyxHQUFHRCxFQUFFLENBQUMsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLENBQUM7UUFDNUUsTUFBTUMsVUFBVSxHQUFHTixLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQUM7Z0JBQUVPLFVBQVU7Z0JBQVFEO1lBQVE7U0FBRTtJQUN2QztBQUNEIn0=
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Vudi1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQWNjdW11bGF0ZXMga2V5PXZhbHVlIHBhaXJzIGFuZCByZW5kZXJzIHRoZW0gYXMgYSBgLmVudmAgZmlsZS5cbiAqXG4gKiBSZWdpc3RlciBvbmNlIGluIHRoZSB3b3Jrc3BhY2U7IGZlYXR1cmVzIGNhbGwgYGFkZEVudHJ5YCBkdXJpbmcgdGhlaXJcbiAqIHNjYWZmb2xkIHBoYXNlIHRvIGNvbnRyaWJ1dGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgZmluYWwgZmlsZSBpc1xuICogd3JpdHRlbiBhdCByZW5kZXIgdGltZSB3aGVuIGB3b3Jrc3BhY2Uuc2NhZmZvbGQoKWAgaXMgY2FsbGVkLlxuICovXG5leHBvcnQgY2xhc3MgRW52RmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuXHRwdWJsaWMgYWRkRW50cnkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9lbnRyaWVzLnNldChrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBFbnZGaWxlIHtcblx0XHRjb25zdCBlbnYgPSBuZXcgRW52RmlsZSgpO1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgcmF3LnNwbGl0KFwiXFxuXCIpKSB7XG5cdFx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdFx0XHRpZiAodHJpbW1lZCA9PT0gXCJcIiB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCIjXCIpKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcblx0XHRcdGlmIChlcSA8PSAwKSBjb250aW51ZTtcblx0XHRcdGVudi5hZGRFbnRyeShsaW5lLnNsaWNlKDAsIGVxKS50cmltKCksIGxpbmUuc2xpY2UoZXEgKyAxKSk7XG5cdFx0fVxuXHRcdHJldHVybiBlbnY7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRpZiAodGhpcy5fZW50cmllcy5zaXplID09PSAwKSByZXR1cm4gW107XG5cdFx0Y29uc3QgYm9keSA9IFsuLi50aGlzLl9lbnRyaWVzLmVudHJpZXMoKV0ubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKS5qb2luKFwiXFxuXCIpO1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBgJHtib2R5fVxcbmA7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiBcIi5lbnZcIiwgY29udGVudCB9XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkVudkZpbGUiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiRU5WX0ZJTEUiLCJfZW50cmllcyIsIk1hcCIsImFkZEVudHJ5IiwidmFsdWUiLCJzZXQiLCJmcm9tRmlsZSIsImFic29sdXRlUGF0aCIsImVudiIsInJhdyIsInJlYWRGaWxlU3luYyIsImxpbmUiLCJzcGxpdCIsInRyaW1tZWQiLCJ0cmltIiwic3RhcnRzV2l0aCIsImVxIiwiaW5kZXhPZiIsInNsaWNlIiwiZmlsZXMiLCJzaXplIiwiYm9keSIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImpvaW4iLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7K0JBV2FBOzs7ZUFBQUE7Ozt3QkFYZ0I7dUJBQ0k7QUFVMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFFBQVEsQ0FBQztJQUUvQkMsV0FBVyxJQUFJQyxNQUFzQjtJQUUvQ0MsU0FBU0wsR0FBVyxFQUFFTSxLQUFhLEVBQVE7UUFDakQsSUFBSSxDQUFDSCxRQUFRLENBQUNJLEdBQUcsQ0FBQ1AsS0FBS007UUFDdkIsT0FBTyxJQUFJO0lBQ1o7SUFFQSxPQUFjRSxTQUFTQyxZQUFvQixFQUFXO1FBQ3JELE1BQU1DLE1BQU0sSUFBSVg7UUFDaEIsTUFBTVksTUFBTUMsSUFBQUEsb0JBQVksRUFBQ0gsY0FBYztRQUN2QyxLQUFLLE1BQU1JLFFBQVFGLElBQUlHLEtBQUssQ0FBQyxNQUFPO1lBQ25DLE1BQU1DLFVBQVVGLEtBQUtHLElBQUk7WUFDekIsSUFBSUQsWUFBWSxNQUFNQSxRQUFRRSxVQUFVLENBQUMsTUFBTTtZQUMvQyxNQUFNQyxLQUFLTCxLQUFLTSxPQUFPLENBQUM7WUFDeEIsSUFBSUQsTUFBTSxHQUFHO1lBQ2JSLElBQUlMLFFBQVEsQ0FBQ1EsS0FBS08sS0FBSyxDQUFDLEdBQUdGLElBQUlGLElBQUksSUFBSUgsS0FBS08sS0FBSyxDQUFDRixLQUFLO1FBQ3hEO1FBQ0EsT0FBT1I7SUFDUjtJQUVPVyxRQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQ2xCLFFBQVEsQ0FBQ21CLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRTtRQUN2QyxNQUFNQyxPQUFPO2VBQUksSUFBSSxDQUFDcEIsUUFBUSxDQUFDcUIsT0FBTztTQUFHLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUNDLEdBQUdDLEVBQUUsR0FBSyxHQUFHRCxFQUFFLENBQUMsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLENBQUM7UUFDNUUsTUFBTUMsVUFBVSxHQUFHTixLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQUM7Z0JBQUVPLFVBQVU7Z0JBQVFEO1lBQVE7U0FBRTtJQUN2QztBQUNEIn0=
@@ -10,43 +10,65 @@ Object.defineProperty(exports, "LaunchJson", {
10
10
  });
11
11
  const _const = require("./const.js");
12
12
  class LaunchJson {
13
+ apiNames;
13
14
  key = _const.WELL_KNOWN_FILES.LAUNCH_JSON;
15
+ constructor(apiNames = [
16
+ "api"
17
+ ]){
18
+ this.apiNames = apiNames;
19
+ }
14
20
  files() {
21
+ const configurations = [
22
+ {
23
+ name: "Build",
24
+ type: "node",
25
+ request: "launch",
26
+ runtimeExecutable: "pnpm",
27
+ runtimeArgs: [
28
+ "build"
29
+ ],
30
+ console: "integratedTerminal",
31
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
32
+ cwd: "${workspaceFolder}"
33
+ }
34
+ ];
35
+ const first = this.apiNames[0] ?? "api";
36
+ const defaultDevArgs = first === "api" && this.apiNames.length === 1 ? [
37
+ "dev"
38
+ ] : [
39
+ "run",
40
+ `dev:${first}`
41
+ ];
42
+ configurations.push(serveConfig("Serve / Dev", defaultDevArgs));
43
+ for (const apiName of this.apiNames){
44
+ if (apiName === first && this.apiNames.length === 1 && apiName === "api") continue;
45
+ configurations.push(serveConfig(`Serve / Dev (${apiName})`, [
46
+ "run",
47
+ `dev:${apiName}`
48
+ ]));
49
+ }
15
50
  return [
16
51
  {
17
52
  filePath: ".vscode/launch.json",
18
53
  content: JSON.stringify({
19
54
  version: "0.2.0",
20
- configurations: [
21
- {
22
- name: "Build",
23
- type: "node",
24
- request: "launch",
25
- runtimeExecutable: "pnpm",
26
- runtimeArgs: [
27
- "build"
28
- ],
29
- console: "integratedTerminal",
30
- // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
31
- cwd: "${workspaceFolder}"
32
- },
33
- {
34
- name: "Serve / Dev",
35
- type: "node",
36
- request: "launch",
37
- runtimeExecutable: "pnpm",
38
- runtimeArgs: [
39
- "dev"
40
- ],
41
- console: "integratedTerminal",
42
- // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
43
- cwd: "${workspaceFolder}"
44
- }
45
- ]
55
+ configurations
46
56
  }, null, 2)
47
57
  }
48
58
  ];
49
59
  }
50
60
  }
61
+ function serveConfig(name, runtimeArgs) {
62
+ return {
63
+ name,
64
+ type: "node",
65
+ request: "launch",
66
+ runtimeExecutable: "pnpm",
67
+ runtimeArgs,
68
+ console: "integratedTerminal",
69
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
70
+ cwd: "${workspaceFolder}"
71
+ };
72
+ }
51
73
 
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9uczogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogXCJCdWlsZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRcdFx0XHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0XHRcdFx0XHRcdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdFx0XHRcdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlOiBcImludGVncmF0ZWRUZXJtaW5hbFwiLFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IFZTIENvZGUgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiBcIlNlcnZlIC8gRGV2XCIsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJub2RlXCIsXG5cdFx0XHRcdFx0XHRcdFx0cmVxdWVzdDogXCJsYXVuY2hcIixcblx0XHRcdFx0XHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdFx0XHRcdFx0cnVudGltZUFyZ3M6IFtcImRldlwiXSxcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlOiBcImludGVncmF0ZWRUZXJtaW5hbFwiLFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IFZTIENvZGUgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQyLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTGF1bmNoSnNvbiIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJMQVVOQ0hfSlNPTiIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsInZlcnNpb24iLCJjb25maWd1cmF0aW9ucyIsIm5hbWUiLCJ0eXBlIiwicmVxdWVzdCIsInJ1bnRpbWVFeGVjdXRhYmxlIiwicnVudGltZUFyZ3MiLCJjb25zb2xlIiwiY3dkIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdhQTs7O2VBQUFBOzs7dUJBSG9CO0FBRzFCLE1BQU1BO0lBQ0lDLE1BQU1DLHVCQUFnQixDQUFDQyxXQUFXLENBQUM7SUFFNUNDLFFBQXNCO1FBQzVCLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVEMsZ0JBQWdCO3dCQUNmOzRCQUNDQyxNQUFNOzRCQUNOQyxNQUFNOzRCQUNOQyxTQUFTOzRCQUNUQyxtQkFBbUI7NEJBQ25CQyxhQUFhO2dDQUFDOzZCQUFROzRCQUN0QkMsU0FBUzs0QkFDVCx5RUFBeUU7NEJBQ3pFQyxLQUFLO3dCQUNOO3dCQUNBOzRCQUNDTixNQUFNOzRCQUNOQyxNQUFNOzRCQUNOQyxTQUFTOzRCQUNUQyxtQkFBbUI7NEJBQ25CQyxhQUFhO2dDQUFDOzZCQUFNOzRCQUNwQkMsU0FBUzs0QkFDVCx5RUFBeUU7NEJBQ3pFQyxLQUFLO3dCQUNOO3FCQUNBO2dCQUNGLEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEIn0=
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1wiYXBpXCJdKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJ1aWxkXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRyZXF1ZXN0OiBcImxhdW5jaFwiLFxuXHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0Y29uc29sZTogXCJpbnRlZ3JhdGVkVGVybWluYWxcIixcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHR9LFxuXHRcdF07XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYXBpTmFtZXNbMF0gPz8gXCJhcGlcIjtcblx0XHRjb25zdCBkZWZhdWx0RGV2QXJncyA9XG5cdFx0XHRmaXJzdCA9PT0gXCJhcGlcIiAmJiB0aGlzLmFwaU5hbWVzLmxlbmd0aCA9PT0gMSA/IFtcImRldlwiXSA6IFtcInJ1blwiLCBgZGV2OiR7Zmlyc3R9YF07XG5cdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhcIlNlcnZlIC8gRGV2XCIsIGRlZmF1bHREZXZBcmdzKSk7XG5cblx0XHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgdGhpcy5hcGlOYW1lcykge1xuXHRcdFx0aWYgKGFwaU5hbWUgPT09IGZpcnN0ICYmIHRoaXMuYXBpTmFtZXMubGVuZ3RoID09PSAxICYmIGFwaU5hbWUgPT09IFwiYXBpXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhgU2VydmUgLyBEZXYgKCR7YXBpTmFtZX0pYCwgW1wicnVuXCIsIGBkZXY6JHthcGlOYW1lfWBdKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9ucyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUNvbmZpZyhuYW1lOiBzdHJpbmcsIHJ1bnRpbWVBcmdzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIHtcblx0XHRuYW1lLFxuXHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdHJ1bnRpbWVBcmdzLFxuXHRcdGNvbnNvbGU6IFwiaW50ZWdyYXRlZFRlcm1pbmFsXCIsXG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdGN3ZDogXCIke3dvcmtzcGFjZUZvbGRlcn1cIixcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJMYXVuY2hKc29uIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkxBVU5DSF9KU09OIiwiYXBpTmFtZXMiLCJmaWxlcyIsImNvbmZpZ3VyYXRpb25zIiwibmFtZSIsInR5cGUiLCJyZXF1ZXN0IiwicnVudGltZUV4ZWN1dGFibGUiLCJydW50aW1lQXJncyIsImNvbnNvbGUiLCJjd2QiLCJmaXJzdCIsImRlZmF1bHREZXZBcmdzIiwibGVuZ3RoIiwicHVzaCIsInNlcnZlQ29uZmlnIiwiYXBpTmFtZSIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdhQTs7O2VBQUFBOzs7dUJBSG9CO0FBRzFCLE1BQU1BOztJQUNJQyxNQUFNQyx1QkFBZ0IsQ0FBQ0MsV0FBVyxDQUFDO0lBRW5ELFlBQW1CLEFBQWlCQyxXQUE4QjtRQUFDO0tBQU0sQ0FBRTthQUF2Q0EsV0FBQUE7SUFBd0M7SUFFckVDLFFBQXNCO1FBQzVCLE1BQU1DLGlCQUE0QztZQUNqRDtnQkFDQ0MsTUFBTTtnQkFDTkMsTUFBTTtnQkFDTkMsU0FBUztnQkFDVEMsbUJBQW1CO2dCQUNuQkMsYUFBYTtvQkFBQztpQkFBUTtnQkFDdEJDLFNBQVM7Z0JBQ1QseUVBQXlFO2dCQUN6RUMsS0FBSztZQUNOO1NBQ0E7UUFFRCxNQUFNQyxRQUFRLElBQUksQ0FBQ1YsUUFBUSxDQUFDLEVBQUUsSUFBSTtRQUNsQyxNQUFNVyxpQkFDTEQsVUFBVSxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssSUFBSTtZQUFDO1NBQU0sR0FBRztZQUFDO1lBQU8sQ0FBQyxJQUFJLEVBQUVGLE9BQU87U0FBQztRQUNsRlIsZUFBZVcsSUFBSSxDQUFDQyxZQUFZLGVBQWVIO1FBRS9DLEtBQUssTUFBTUksV0FBVyxJQUFJLENBQUNmLFFBQVEsQ0FBRTtZQUNwQyxJQUFJZSxZQUFZTCxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssS0FBS0csWUFBWSxPQUFPO1lBQzFFYixlQUFlVyxJQUFJLENBQUNDLFlBQVksQ0FBQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0JBQUM7Z0JBQU8sQ0FBQyxJQUFJLEVBQUVBLFNBQVM7YUFBQztRQUN0RjtRQUVBLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVGxCO2dCQUNELEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEO0FBRUEsU0FBU1ksWUFBWVgsSUFBWSxFQUFFSSxXQUFxQjtJQUN2RCxPQUFPO1FBQ05KO1FBQ0FDLE1BQU07UUFDTkMsU0FBUztRQUNUQyxtQkFBbUI7UUFDbkJDO1FBQ0FDLFNBQVM7UUFDVCx5RUFBeUU7UUFDekVDLEtBQUs7SUFDTjtBQUNEIn0=
@@ -8,26 +8,41 @@ Object.defineProperty(exports, "PackageJson", {
8
8
  return PackageJson;
9
9
  }
10
10
  });
11
+ const _nodefs = require("node:fs");
11
12
  const _version = require("../version.js");
12
- const _const = require("./const.js");
13
+ const _const = require("../webapi/const.js");
14
+ const _const1 = require("./const.js");
13
15
  class PackageJson {
14
16
  name;
15
- key = _const.WELL_KNOWN_FILES.PACKAGE_JSON;
17
+ key = _const1.WELL_KNOWN_FILES.PACKAGE_JSON;
16
18
  _dependencies;
17
19
  _devDependencies;
18
20
  _scripts;
21
+ _version = "0.0.1";
22
+ _type = "module";
23
+ _rest = {};
19
24
  constructor(name, options){
20
25
  this.name = name;
21
- const startEntry = options?.startEntry ?? "dist/release/projects/api/es6/src/main.js";
26
+ const apiNames = options?.apiNames ?? [
27
+ _const.DEFAULT_WEBAPI_NAME
28
+ ];
29
+ const first = apiNames[0] ?? _const.DEFAULT_WEBAPI_NAME;
30
+ const startEntry = options?.startEntry ?? (0, _const.webapiReleaseEntry)(first);
31
+ const workspaceName = options?.workspaceName ?? stripApiSuffix(name);
32
+ const namedOrMany = apiNames.length > 1 || first !== _const.DEFAULT_WEBAPI_NAME;
22
33
  this._scripts = {
23
34
  build: "forge build --configuration release",
24
35
  "build:watch": "forge build --watch",
25
36
  start: `node ${startEntry}`,
26
- dev: "flux serve",
37
+ dev: namedOrMany ? fluxDevScript(workspaceName, first, (0, _const.webapiPort)(0)) : "flux serve",
27
38
  "lint:check": "biome check .",
28
39
  typecheck: "tsc --noEmit",
29
40
  test: "vitest run --passWithNoTests"
30
41
  };
42
+ for (const [index, apiName] of apiNames.entries()){
43
+ this._scripts[`start:${apiName}`] = `node ${(0, _const.webapiReleaseEntry)(apiName)}`;
44
+ this._scripts[`dev:${apiName}`] = fluxDevScript(workspaceName, apiName, (0, _const.webapiPort)(index));
45
+ }
31
46
  this._dependencies = {
32
47
  "@decohere/cortex": _version.CREATE_VERSION,
33
48
  "@decohere/crucible": _version.CREATE_VERSION,
@@ -44,6 +59,33 @@ class PackageJson {
44
59
  vitest: "^3.2.4"
45
60
  };
46
61
  }
62
+ /** Load an existing root package.json so `webapi add` can merge scripts/deps. */ static fromFile(filePath) {
63
+ const raw = JSON.parse((0, _nodefs.readFileSync)(filePath, "utf8"));
64
+ const pkg = new PackageJson(typeof raw.name === "string" ? raw.name : "app", {
65
+ apiNames: []
66
+ });
67
+ pkg._version = typeof raw.version === "string" ? raw.version : "0.0.1";
68
+ pkg._type = typeof raw.type === "string" ? raw.type : "module";
69
+ pkg._scripts = {
70
+ ...asStringMap(raw.scripts)
71
+ };
72
+ pkg._dependencies = {
73
+ ...asStringMap(raw.dependencies)
74
+ };
75
+ pkg._devDependencies = {
76
+ ...asStringMap(raw.devDependencies)
77
+ };
78
+ const reserved = new Set([
79
+ "name",
80
+ "version",
81
+ "type",
82
+ "scripts",
83
+ "dependencies",
84
+ "devDependencies"
85
+ ]);
86
+ pkg._rest = Object.fromEntries(Object.entries(raw).filter(([key])=>!reserved.has(key)));
87
+ return pkg;
88
+ }
47
89
  addDependency(name, version) {
48
90
  this._dependencies[name] = version;
49
91
  return this;
@@ -62,8 +104,9 @@ class PackageJson {
62
104
  filePath: "package.json",
63
105
  content: JSON.stringify({
64
106
  name: this.name,
65
- version: "0.0.1",
66
- type: "module",
107
+ version: this._version,
108
+ type: this._type,
109
+ ...this._rest,
67
110
  scripts: this._scripts,
68
111
  dependencies: this._dependencies,
69
112
  devDependencies: this._devDependencies
@@ -72,5 +115,19 @@ class PackageJson {
72
115
  ];
73
116
  }
74
117
  }
118
+ function stripApiSuffix(name) {
119
+ return name.endsWith(".api") ? name.slice(0, -".api".length) : name;
120
+ }
121
+ function asStringMap(value) {
122
+ if (value == null || typeof value !== "object") return {};
123
+ const result = {};
124
+ for (const [key, entry] of Object.entries(value)){
125
+ if (typeof entry === "string") result[key] = entry;
126
+ }
127
+ return result;
128
+ }
129
+ function fluxDevScript(workspaceName, apiName, port) {
130
+ return `PORT=${port} flux serve --project ${(0, _const.webapiPackageName)(workspaceName, apiName)}`;
131
+ }
75
132
 
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgdGhlIHJvb3QgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIGNvcmUgQVBJIGRlcGVuZGVuY2llcy4gRmVhdHVyZXMgY2FsbCBgYWRkRGVwZW5kZW5jeWAgL1xuICogYGFkZERldkRlcGVuZGVuY3lgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBpbmplY3QgdGhlaXIgb3duIGRlcHNcbiAqIGJlZm9yZSBgZmlsZXMoKWAgaXMgY2FsbGVkIGF0IHJlbmRlciB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuUEFDS0FHRV9KU09OO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2RlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cHJpdmF0ZSByZWFkb25seSBfZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcblx0XHRvcHRpb25zPzogeyBzdGFydEVudHJ5Pzogc3RyaW5nIH0sXG5cdCkge1xuXHRcdGNvbnN0IHN0YXJ0RW50cnkgPSBvcHRpb25zPy5zdGFydEVudHJ5ID8/IFwiZGlzdC9yZWxlYXNlL3Byb2plY3RzL2FwaS9lczYvc3JjL21haW4uanNcIjtcblx0XHR0aGlzLl9zY3JpcHRzID0ge1xuXHRcdFx0YnVpbGQ6IFwiZm9yZ2UgYnVpbGQgLS1jb25maWd1cmF0aW9uIHJlbGVhc2VcIixcblx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRzdGFydDogYG5vZGUgJHtzdGFydEVudHJ5fWAsXG5cdFx0XHRkZXY6IFwiZmx1eCBzZXJ2ZVwiLFxuXHRcdFx0XCJsaW50OmNoZWNrXCI6IFwiYmlvbWUgY2hlY2sgLlwiLFxuXHRcdFx0dHlwZWNoZWNrOiBcInRzYyAtLW5vRW1pdFwiLFxuXHRcdFx0dGVzdDogXCJ2aXRlc3QgcnVuIC0tcGFzc1dpdGhOb1Rlc3RzXCIsXG5cdFx0fTtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL25leHVzXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdFx0XCJAZGVjb2hlcmUvcHJvdG9jb2xcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmVcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmUtcGlub1wiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwicGluby1wcmV0dHlcIjogXCJeMTMuMC4wXCIsXG5cdFx0fTtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS90ZXJtaW5hbFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHRcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjIuMC4wXCIsXG5cdFx0XHR2aXRlc3Q6IFwiXjMuMi40XCIsXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBhZGREZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fZGVwZW5kZW5jaWVzW25hbWVdID0gdmVyc2lvbjtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGREZXZEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fZGV2RGVwZW5kZW5jaWVzW25hbWVdID0gdmVyc2lvbjtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGRTY3JpcHQobmFtZTogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9zY3JpcHRzW25hbWVdID0gY29tbWFuZDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInBhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMC4xXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIm1vZHVsZVwiLFxuXHRcdFx0XHRcdFx0c2NyaXB0czogdGhpcy5fc2NyaXB0cyxcblx0XHRcdFx0XHRcdGRlcGVuZGVuY2llczogdGhpcy5fZGVwZW5kZW5jaWVzLFxuXHRcdFx0XHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB0aGlzLl9kZXZEZXBlbmRlbmNpZXMsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJQYWNrYWdlSnNvbiIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJQQUNLQUdFX0pTT04iLCJfZGVwZW5kZW5jaWVzIiwiX2RldkRlcGVuZGVuY2llcyIsIl9zY3JpcHRzIiwibmFtZSIsIm9wdGlvbnMiLCJzdGFydEVudHJ5IiwiYnVpbGQiLCJzdGFydCIsImRldiIsInR5cGVjaGVjayIsInRlc3QiLCJDUkVBVEVfVkVSU0lPTiIsInR5cGVzY3JpcHQiLCJ2aXRlc3QiLCJhZGREZXBlbmRlbmN5IiwidmVyc2lvbiIsImFkZERldkRlcGVuZGVuY3kiLCJhZGRTY3JpcHQiLCJjb21tYW5kIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwidHlwZSIsInNjcmlwdHMiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiXSwibWFwcGluZ3MiOiI7Ozs7K0JBV2FBOzs7ZUFBQUE7Ozt5QkFYa0I7dUJBQ0U7QUFVMUIsTUFBTUE7O0lBQ0lDLE1BQU1DLHVCQUFnQixDQUFDQyxZQUFZLENBQUM7SUFFbkNDLGNBQXNDO0lBQ3RDQyxpQkFBeUM7SUFDekNDLFNBQWlDO0lBRWxELFlBQ0MsQUFBaUJDLElBQVksRUFDN0JDLE9BQWlDLENBQ2hDO2FBRmdCRCxPQUFBQTtRQUdqQixNQUFNRSxhQUFhRCxTQUFTQyxjQUFjO1FBQzFDLElBQUksQ0FBQ0gsUUFBUSxHQUFHO1lBQ2ZJLE9BQU87WUFDUCxlQUFlO1lBQ2ZDLE9BQU8sQ0FBQyxLQUFLLEVBQUVGLFlBQVk7WUFDM0JHLEtBQUs7WUFDTCxjQUFjO1lBQ2RDLFdBQVc7WUFDWEMsTUFBTTtRQUNQO1FBQ0EsSUFBSSxDQUFDVixhQUFhLEdBQUc7WUFDcEIsb0JBQW9CVyx1QkFBYztZQUNsQyxzQkFBc0JBLHVCQUFjO1lBQ3BDLG1CQUFtQkEsdUJBQWM7WUFDakMsc0JBQXNCQSx1QkFBYztZQUNwQyxvQkFBb0JBLHVCQUFjO1lBQ2xDLHlCQUF5QkEsdUJBQWM7WUFDdkMsZUFBZTtRQUNoQjtRQUNBLElBQUksQ0FBQ1YsZ0JBQWdCLEdBQUc7WUFDdkIsc0JBQXNCVSx1QkFBYztZQUNwQ0MsWUFBWTtZQUNaLGtCQUFrQjtZQUNsQkMsUUFBUTtRQUNUO0lBQ0Q7SUFFT0MsY0FBY1gsSUFBWSxFQUFFWSxPQUFlLEVBQVE7UUFDekQsSUFBSSxDQUFDZixhQUFhLENBQUNHLEtBQUssR0FBR1k7UUFDM0IsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsaUJBQWlCYixJQUFZLEVBQUVZLE9BQWUsRUFBUTtRQUM1RCxJQUFJLENBQUNkLGdCQUFnQixDQUFDRSxLQUFLLEdBQUdZO1FBQzlCLE9BQU8sSUFBSTtJQUNaO0lBRU9FLFVBQVVkLElBQVksRUFBRWUsT0FBZSxFQUFRO1FBQ3JELElBQUksQ0FBQ2hCLFFBQVEsQ0FBQ0MsS0FBSyxHQUFHZTtRQUN0QixPQUFPLElBQUk7SUFDWjtJQUVPQyxRQUFzQjtRQUM1QixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVNDLEtBQUtDLFNBQVMsQ0FDdEI7b0JBQ0NwQixNQUFNLElBQUksQ0FBQ0EsSUFBSTtvQkFDZlksU0FBUztvQkFDVFMsTUFBTTtvQkFDTkMsU0FBUyxJQUFJLENBQUN2QixRQUFRO29CQUN0QndCLGNBQWMsSUFBSSxDQUFDMUIsYUFBYTtvQkFDaEMyQixpQkFBaUIsSUFBSSxDQUFDMUIsZ0JBQWdCO2dCQUN2QyxHQUNBLE1BQ0E7WUFFRjtTQUNBO0lBQ0Y7QUFDRCJ9
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHtcblx0REVGQVVMVF9XRUJBUElfTkFNRSxcblx0d2ViYXBpUGFja2FnZU5hbWUsXG5cdHdlYmFwaVBvcnQsXG5cdHdlYmFwaVJlbGVhc2VFbnRyeSxcbn0gZnJvbSBcIi4uL3dlYmFwaS9jb25zdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBQYWNrYWdlSnNvbk9wdGlvbnMgPSB7XG5cdHN0YXJ0RW50cnk/OiBzdHJpbmc7XG5cdC8qKiBBUEkgc2x1Z3MgaW4gdGhpcyB3b3Jrc3BhY2UuIERyaXZlcyBgc3RhcnQ6PG5hbWU+YCAvIGBkZXY6PG5hbWU+YC4gKi9cblx0YXBpTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXTtcblx0LyoqIEhvc3Qgd29ya3NwYWNlIG5hbWUgdXNlZCBpbiBgQDx3b3Jrc3BhY2U+LzxhcGk+YCBmb3IgZmx1eCBgLS1wcm9qZWN0YC4gKi9cblx0d29ya3NwYWNlTmFtZT86IHN0cmluZztcbn07XG5cbi8qKlxuICogQnVpbGRlciBmb3IgdGhlIHJvb3QgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIGNvcmUgQVBJIGRlcGVuZGVuY2llcy4gRmVhdHVyZXMgY2FsbCBgYWRkRGVwZW5kZW5jeWAgL1xuICogYGFkZERldkRlcGVuZGVuY3lgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBpbmplY3QgdGhlaXIgb3duIGRlcHNcbiAqIGJlZm9yZSBgZmlsZXMoKWAgaXMgY2FsbGVkIGF0IHJlbmRlciB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuUEFDS0FHRV9KU09OO1xuXG5cdHByaXZhdGUgX2RlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cHJpdmF0ZSBfZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF9zY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF92ZXJzaW9uID0gXCIwLjAuMVwiO1xuXHRwcml2YXRlIF90eXBlID0gXCJtb2R1bGVcIjtcblx0cHJpdmF0ZSBfcmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcsXG5cdFx0b3B0aW9ucz86IFBhY2thZ2VKc29uT3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgYXBpTmFtZXMgPSBvcHRpb25zPy5hcGlOYW1lcyA/PyBbREVGQVVMVF9XRUJBUElfTkFNRV07XG5cdFx0Y29uc3QgZmlyc3QgPSBhcGlOYW1lc1swXSA/PyBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXHRcdGNvbnN0IHN0YXJ0RW50cnkgPSBvcHRpb25zPy5zdGFydEVudHJ5ID8/IHdlYmFwaVJlbGVhc2VFbnRyeShmaXJzdCk7XG5cdFx0Y29uc3Qgd29ya3NwYWNlTmFtZSA9IG9wdGlvbnM/LndvcmtzcGFjZU5hbWUgPz8gc3RyaXBBcGlTdWZmaXgobmFtZSk7XG5cdFx0Y29uc3QgbmFtZWRPck1hbnkgPSBhcGlOYW1lcy5sZW5ndGggPiAxIHx8IGZpcnN0ICE9PSBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXG5cdFx0dGhpcy5fc2NyaXB0cyA9IHtcblx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkIC0tY29uZmlndXJhdGlvbiByZWxlYXNlXCIsXG5cdFx0XHRcImJ1aWxkOndhdGNoXCI6IFwiZm9yZ2UgYnVpbGQgLS13YXRjaFwiLFxuXHRcdFx0c3RhcnQ6IGBub2RlICR7c3RhcnRFbnRyeX1gLFxuXHRcdFx0ZGV2OiBuYW1lZE9yTWFueSA/IGZsdXhEZXZTY3JpcHQod29ya3NwYWNlTmFtZSwgZmlyc3QsIHdlYmFwaVBvcnQoMCkpIDogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHRcImxpbnQ6Y2hlY2tcIjogXCJiaW9tZSBjaGVjayAuXCIsXG5cdFx0XHR0eXBlY2hlY2s6IFwidHNjIC0tbm9FbWl0XCIsXG5cdFx0XHR0ZXN0OiBcInZpdGVzdCBydW4gLS1wYXNzV2l0aE5vVGVzdHNcIixcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgW2luZGV4LCBhcGlOYW1lXSBvZiBhcGlOYW1lcy5lbnRyaWVzKCkpIHtcblx0XHRcdHRoaXMuX3NjcmlwdHNbYHN0YXJ0OiR7YXBpTmFtZX1gXSA9IGBub2RlICR7d2ViYXBpUmVsZWFzZUVudHJ5KGFwaU5hbWUpfWA7XG5cdFx0XHR0aGlzLl9zY3JpcHRzW2BkZXY6JHthcGlOYW1lfWBdID0gZmx1eERldlNjcmlwdChcblx0XHRcdFx0d29ya3NwYWNlTmFtZSxcblx0XHRcdFx0YXBpTmFtZSxcblx0XHRcdFx0d2ViYXBpUG9ydChpbmRleCksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL25leHVzXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdFx0XCJAZGVjb2hlcmUvcHJvdG9jb2xcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmVcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9zY3JpYmUtcGlub1wiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwicGluby1wcmV0dHlcIjogXCJeMTMuMC4wXCIsXG5cdFx0fTtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS90ZXJtaW5hbFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHRcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjIuMC4wXCIsXG5cdFx0XHR2aXRlc3Q6IFwiXjMuMi40XCIsXG5cdFx0fTtcblx0fVxuXG5cdC8qKiBMb2FkIGFuIGV4aXN0aW5nIHJvb3QgcGFja2FnZS5qc29uIHNvIGB3ZWJhcGkgYWRkYCBjYW4gbWVyZ2Ugc2NyaXB0cy9kZXBzLiAqL1xuXHRwdWJsaWMgc3RhdGljIGZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB7XG5cdFx0Y29uc3QgcmF3ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmOFwiKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgcGtnID0gbmV3IFBhY2thZ2VKc29uKHR5cGVvZiByYXcubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy5uYW1lIDogXCJhcHBcIiwge1xuXHRcdFx0YXBpTmFtZXM6IFtdLFxuXHRcdH0pO1xuXHRcdHBrZy5fdmVyc2lvbiA9IHR5cGVvZiByYXcudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHJhdy52ZXJzaW9uIDogXCIwLjAuMVwiO1xuXHRcdHBrZy5fdHlwZSA9IHR5cGVvZiByYXcudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy50eXBlIDogXCJtb2R1bGVcIjtcblx0XHRwa2cuX3NjcmlwdHMgPSB7IC4uLmFzU3RyaW5nTWFwKHJhdy5zY3JpcHRzKSB9O1xuXHRcdHBrZy5fZGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGVwZW5kZW5jaWVzKSB9O1xuXHRcdHBrZy5fZGV2RGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGV2RGVwZW5kZW5jaWVzKSB9O1xuXHRcdGNvbnN0IHJlc2VydmVkID0gbmV3IFNldChbXG5cdFx0XHRcIm5hbWVcIixcblx0XHRcdFwidmVyc2lvblwiLFxuXHRcdFx0XCJ0eXBlXCIsXG5cdFx0XHRcInNjcmlwdHNcIixcblx0XHRcdFwiZGVwZW5kZW5jaWVzXCIsXG5cdFx0XHRcImRldkRlcGVuZGVuY2llc1wiLFxuXHRcdF0pO1xuXHRcdHBrZy5fcmVzdCA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhyYXcpLmZpbHRlcigoW2tleV0pID0+ICFyZXNlcnZlZC5oYXMoa2V5KSkpO1xuXHRcdHJldHVybiBwa2c7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGV2RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2NyaXB0KG5hbWU6IHN0cmluZywgY29tbWFuZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2NyaXB0c1tuYW1lXSA9IGNvbW1hbmQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXHRcdFx0XHRcdFx0dmVyc2lvbjogdGhpcy5fdmVyc2lvbixcblx0XHRcdFx0XHRcdHR5cGU6IHRoaXMuX3R5cGUsXG5cdFx0XHRcdFx0XHQuLi50aGlzLl9yZXN0LFxuXHRcdFx0XHRcdFx0c2NyaXB0czogdGhpcy5fc2NyaXB0cyxcblx0XHRcdFx0XHRcdGRlcGVuZGVuY2llczogdGhpcy5fZGVwZW5kZW5jaWVzLFxuXHRcdFx0XHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB0aGlzLl9kZXZEZXBlbmRlbmNpZXMsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cblxuZnVuY3Rpb24gc3RyaXBBcGlTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIG5hbWUuZW5kc1dpdGgoXCIuYXBpXCIpID8gbmFtZS5zbGljZSgwLCAtXCIuYXBpXCIubGVuZ3RoKSA6IG5hbWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG5cdGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHt9O1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Zm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdFx0aWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIikgcmVzdWx0W2tleV0gPSBlbnRyeTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmbHV4RGV2U2NyaXB0KHdvcmtzcGFjZU5hbWU6IHN0cmluZywgYXBpTmFtZTogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuXHRyZXR1cm4gYFBPUlQ9JHtwb3J0fSBmbHV4IHNlcnZlIC0tcHJvamVjdCAke3dlYmFwaVBhY2thZ2VOYW1lKHdvcmtzcGFjZU5hbWUsIGFwaU5hbWUpfWA7XG59XG4iXSwibmFtZXMiOlsiUGFja2FnZUpzb24iLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiUEFDS0FHRV9KU09OIiwiX2RlcGVuZGVuY2llcyIsIl9kZXZEZXBlbmRlbmNpZXMiLCJfc2NyaXB0cyIsIl92ZXJzaW9uIiwiX3R5cGUiLCJfcmVzdCIsIm5hbWUiLCJvcHRpb25zIiwiYXBpTmFtZXMiLCJERUZBVUxUX1dFQkFQSV9OQU1FIiwiZmlyc3QiLCJzdGFydEVudHJ5Iiwid2ViYXBpUmVsZWFzZUVudHJ5Iiwid29ya3NwYWNlTmFtZSIsInN0cmlwQXBpU3VmZml4IiwibmFtZWRPck1hbnkiLCJsZW5ndGgiLCJidWlsZCIsInN0YXJ0IiwiZGV2IiwiZmx1eERldlNjcmlwdCIsIndlYmFwaVBvcnQiLCJ0eXBlY2hlY2siLCJ0ZXN0IiwiaW5kZXgiLCJhcGlOYW1lIiwiZW50cmllcyIsIkNSRUFURV9WRVJTSU9OIiwidHlwZXNjcmlwdCIsInZpdGVzdCIsImZyb21GaWxlIiwiZmlsZVBhdGgiLCJyYXciLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJwa2ciLCJ2ZXJzaW9uIiwidHlwZSIsImFzU3RyaW5nTWFwIiwic2NyaXB0cyIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsInJlc2VydmVkIiwiU2V0IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJoYXMiLCJhZGREZXBlbmRlbmN5IiwiYWRkRGV2RGVwZW5kZW5jeSIsImFkZFNjcmlwdCIsImNvbW1hbmQiLCJmaWxlcyIsImNvbnRlbnQiLCJzdHJpbmdpZnkiLCJlbmRzV2l0aCIsInNsaWNlIiwidmFsdWUiLCJyZXN1bHQiLCJlbnRyeSIsInBvcnQiLCJ3ZWJhcGlQYWNrYWdlTmFtZSJd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
@@ -83,6 +83,9 @@ class MonoRepoScaffold extends WorkspaceScaffold {
83
83
  /** Retrieve a previously-registered project by its directory path. */ getProject(dir) {
84
84
  return this._projects.find((p)=>p.dir === dir);
85
85
  }
86
+ /** All registered projects, in registration order. */ getProjects() {
87
+ return this._projects;
88
+ }
86
89
  /** Register a named model at workspace level. */ addModel(model) {
87
90
  this._models.set(model.key, model);
88
91
  return model;
@@ -128,4 +131,4 @@ class MonoRepoScaffold extends WorkspaceScaffold {
128
131
  }
129
132
  }
130
133
 
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL3Byb2plY3QubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSwgU291cmNlRmlsZVByb3ZpZGVyIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBBIHN1Yi11bml0IG9mIHRoZSBtb25vcmVwbyAoZS5nLiBgcHJvamVjdHMvYXBpYCkuXG4gKlxuICogTW9kZWxzIGFuZCBmaWxlcyByZWdpc3RlcmVkIGhlcmUgcHJvZHVjZSBwYXRocyByZWxhdGl2ZSB0byBgZGlyYC4gVGhlIHBhcmVudFxuICogYE1vbm9SZXBvU2NhZmZvbGRgIGNhbGxzIGBmaWxlcygpYCBhbmQgcHJlcGVuZHMgYGRpci9gIHRvIGV2ZXJ5IHBhdGgsIHNvXG4gKiBtb2RlbHMgcmVtYWluIHVuYXdhcmUgb2Ygd2hlcmUgdGhleSBsaXZlIGluIHRoZSByZXBvLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdFNjYWZmb2xkIHtcblx0cHJpdmF0ZSByZWFkb25seSBfbW9kZWxzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVQcm92aWRlcj4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfZmlsZXM6IFNvdXJjZUZpbGVbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyOiBzdHJpbmcpIHt9XG5cblx0cHVibGljIGFkZE1vZGVsPFQgZXh0ZW5kcyBLZXllZE1vZGVsPihtb2RlbDogVCk6IFQge1xuXHRcdHRoaXMuX21vZGVscy5zZXQobW9kZWwua2V5LCBtb2RlbCk7XG5cdFx0cmV0dXJuIG1vZGVsO1xuXHR9XG5cblx0cHVibGljIGFkZEZpbGUocHJvdmlkZXI6IFNvdXJjZUZpbGVQcm92aWRlcik6IHRoaXMge1xuXHRcdHRoaXMuX2ZpbGVzLnB1c2goLi4ucHJvdmlkZXIuZmlsZXMoKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9kZWw8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fbW9kZWxzLmdldChrZXkpIGFzIFQgfCB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9kZWxzPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGN0b3I6IG5ldyAoLi4uYXJnczogbmV2ZXJbXSkgPT4gVCk6IFRbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLl9tb2RlbHMudmFsdWVzKCldLmZpbHRlcigobSk6IG0gaXMgVCA9PiBtIGluc3RhbmNlb2YgY3Rvcik7XG5cdH1cblxuXHQvKiogUmV0dXJucyBhbGwgZmlsZXMgd2l0aCBgZGlyL2AgcHJlcGVuZGVkIHRvIGVhY2ggcGF0aC4gKi9cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgYWxsID0gWy4uLnRoaXMuX2ZpbGVzLCAuLi5bLi4udGhpcy5fbW9kZWxzLnZhbHVlcygpXS5mbGF0TWFwKChtKSA9PiBtLmZpbGVzKCkpXTtcblx0XHRyZXR1cm4gYWxsLm1hcCgoZikgPT4gKHsgZmlsZVBhdGg6IGAke3RoaXMuZGlyfS8ke2YuZmlsZVBhdGh9YCwgY29udGVudDogZi5jb250ZW50IH0pKTtcblx0fVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya3NwYWNlU2NhZmZvbGQge1xuXHRwdWJsaWMgcmVhZG9ubHkgZmlsZXM6IFNvdXJjZUZpbGVbXSA9IFtdO1xuXHRwdWJsaWMgdGFyZ2V0RGlyOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXHRwcml2YXRlIF9uYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqIFByb2plY3QgbmFtZSDigJQgaG9zdCBkaXJlY3RvcnkgYmFzZW5hbWUsIG5vdCB0aGUgaW4tY29udGFpbmVyIG1vdW50IHBhdGguICovXG5cdHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9uYW1lID8/IGJhc2VuYW1lKHRoaXMudGFyZ2V0RGlyKTtcblx0fVxuXG5cdHB1YmxpYyBzZXROYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX25hbWUgPSBuYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhbiBhZC1ob2MgZmlsZSBwcm92aWRlciB3aG9zZSBvdXRwdXQgaXMgaW5jbHVkZWQgYXQgcmVuZGVyIHRpbWUuICovXG5cdHB1YmxpYyBhZGRGaWxlKHByb3ZpZGVyOiBTb3VyY2VGaWxlUHJvdmlkZXIpOiB0aGlzIHtcblx0XHR0aGlzLmZpbGVzLnB1c2goLi4ucHJvdmlkZXIuZmlsZXMoKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWJzdHJhY3QgYWRkTW9kZWw8VCBleHRlbmRzIEtleWVkTW9kZWw+KG1vZGVsOiBUKTogVDtcblx0cHVibGljIGFic3RyYWN0IGdldE1vZGVsPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcblx0cHVibGljIGFic3RyYWN0IGdldE1vZGVsczxUIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyPihcblx0XHRjdG9yOiBuZXcgKC4uLmFyZ3M6IG5ldmVyW10pID0+IFQsXG5cdCk6IFRbXTtcblx0cHVibGljIGFic3RyYWN0IGdldFByb2plY3QoZGlyOiBzdHJpbmcpOiBQcm9qZWN0U2NhZmZvbGQgfCB1bmRlZmluZWQ7XG5cdHB1YmxpYyBhYnN0cmFjdCBzY2FmZm9sZCgpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1vbm9SZXBvU2NhZmZvbGQgZXh0ZW5kcyBXb3Jrc3BhY2VTY2FmZm9sZCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX21vZGVscyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlUHJvdmlkZXI+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3Byb2plY3RzOiBQcm9qZWN0U2NhZmZvbGRbXSA9IFtdO1xuXG5cdC8qKiBSZWdpc3RlciBhIG5hbWVkIHByb2plY3QuICovXG5cdHB1YmxpYyBhZGRQcm9qZWN0KHByb2plY3Q6IFByb2plY3RTY2FmZm9sZCk6IFByb2plY3RTY2FmZm9sZCB7XG5cdFx0dGhpcy5fcHJvamVjdHMucHVzaChwcm9qZWN0KTtcblx0XHRyZXR1cm4gcHJvamVjdDtcblx0fVxuXG5cdC8qKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHktcmVnaXN0ZXJlZCBwcm9qZWN0IGJ5IGl0cyBkaXJlY3RvcnkgcGF0aC4gKi9cblx0cHVibGljIGdldFByb2plY3QoZGlyOiBzdHJpbmcpOiBQcm9qZWN0U2NhZmZvbGQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9wcm9qZWN0cy5maW5kKChwKSA9PiBwLmRpciA9PT0gZGlyKTtcblx0fVxuXG5cdC8qKiBSZWdpc3RlciBhIG5hbWVkIG1vZGVsIGF0IHdvcmtzcGFjZSBsZXZlbC4gKi9cblx0cHVibGljIGFkZE1vZGVsPFQgZXh0ZW5kcyBLZXllZE1vZGVsPihtb2RlbDogVCk6IFQge1xuXHRcdHRoaXMuX21vZGVscy5zZXQobW9kZWwua2V5LCBtb2RlbCk7XG5cdFx0cmV0dXJuIG1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGEgbW9kZWwgYnkga2V5LiBTZWFyY2hlcyB3b3Jrc3BhY2UgbW9kZWxzIGZpcnN0LCB0aGVuIGFsbFxuXHQgKiByZWdpc3RlcmVkIHByb2plY3RzIGluIG9yZGVyLlxuXHQgKi9cblx0cHVibGljIGdldE1vZGVsPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbSA9IHRoaXMuX21vZGVscy5nZXQoa2V5KSBhcyBUIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChtICE9PSB1bmRlZmluZWQpIHJldHVybiBtO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiB0aGlzLl9wcm9qZWN0cykge1xuXHRcdFx0Y29uc3QgcG0gPSBwcm9qZWN0LmdldE1vZGVsPFQ+KGtleSk7XG5cdFx0XHRpZiAocG0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBtO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGFsbCBtb2RlbHMgb2YgYSBnaXZlbiB0eXBlLiBTZWFyY2hlcyB3b3Jrc3BhY2UgbW9kZWxzIGFuZCBhbGxcblx0ICogcHJvamVjdHMsIHNvIGZlYXR1cmVzIGNhbiBkaXNjb3ZlciBjb250cm9sbGVycyBhY3Jvc3MgbXVsdGlwbGUgcHJvamVjdHMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TW9kZWxzPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGN0b3I6IG5ldyAoLi4uYXJnczogbmV2ZXJbXSkgPT4gVCk6IFRbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdC4uLlsuLi50aGlzLl9tb2RlbHMudmFsdWVzKCldLmZpbHRlcigobSk6IG0gaXMgVCA9PiBtIGluc3RhbmNlb2YgY3RvciksXG5cdFx0XHQuLi50aGlzLl9wcm9qZWN0cy5mbGF0TWFwKChwKSA9PiBwLmdldE1vZGVscyhjdG9yKSksXG5cdFx0XTtcblx0fVxuXG5cdC8qKiBSZW5kZXIgYWxsIG1vZGVscyBhbmQgcHJvamVjdHMgaW50byBmaWxlcywgdGhlbiB3cml0ZSBldmVyeXRoaW5nIHRvIGRpc2suICovXG5cdHB1YmxpYyBhc3luYyBzY2FmZm9sZCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhbGxGaWxlcyA9IFtcblx0XHRcdC4uLnRoaXMuZmlsZXMsXG5cdFx0XHQuLi5bLi4udGhpcy5fbW9kZWxzLnZhbHVlcygpXS5mbGF0TWFwKChtKSA9PiBtLmZpbGVzKCkpLFxuXHRcdFx0Li4udGhpcy5fcHJvamVjdHMuZmxhdE1hcCgocCkgPT4gcC5maWxlcygpKSxcblx0XHRdO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRhbGxGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKHRoaXMudGFyZ2V0RGlyLCBmaWxlLmZpbGVQYXRoKTtcblx0XHRcdFx0YXdhaXQgbWtkaXIoZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHRhd2FpdCB3cml0ZUZpbGUoZnVsbFBhdGgsIGZpbGUuY29udGVudCk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTW9ub1JlcG9TY2FmZm9sZCIsIlByb2plY3RTY2FmZm9sZCIsIldvcmtzcGFjZVNjYWZmb2xkIiwiX21vZGVscyIsIk1hcCIsIl9maWxlcyIsImRpciIsImFkZE1vZGVsIiwibW9kZWwiLCJzZXQiLCJrZXkiLCJhZGRGaWxlIiwicHJvdmlkZXIiLCJwdXNoIiwiZmlsZXMiLCJnZXRNb2RlbCIsImdldCIsImdldE1vZGVscyIsImN0b3IiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJtIiwiYWxsIiwiZmxhdE1hcCIsIm1hcCIsImYiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJ0YXJnZXREaXIiLCJwcm9jZXNzIiwiY3dkIiwiX25hbWUiLCJuYW1lIiwiYmFzZW5hbWUiLCJzZXROYW1lIiwiX3Byb2plY3RzIiwiYWRkUHJvamVjdCIsInByb2plY3QiLCJnZXRQcm9qZWN0IiwiZmluZCIsInAiLCJ1bmRlZmluZWQiLCJwbSIsInNjYWZmb2xkIiwiYWxsRmlsZXMiLCJQcm9taXNlIiwiZmlsZSIsImZ1bGxQYXRoIiwiam9pbiIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIndyaXRlRmlsZSJd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
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL3Byb2plY3QubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSwgU291cmNlRmlsZVByb3ZpZGVyIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBBIHN1Yi11bml0IG9mIHRoZSBtb25vcmVwbyAoZS5nLiBgcHJvamVjdHMvYXBpYCkuXG4gKlxuICogTW9kZWxzIGFuZCBmaWxlcyByZWdpc3RlcmVkIGhlcmUgcHJvZHVjZSBwYXRocyByZWxhdGl2ZSB0byBgZGlyYC4gVGhlIHBhcmVudFxuICogYE1vbm9SZXBvU2NhZmZvbGRgIGNhbGxzIGBmaWxlcygpYCBhbmQgcHJlcGVuZHMgYGRpci9gIHRvIGV2ZXJ5IHBhdGgsIHNvXG4gKiBtb2RlbHMgcmVtYWluIHVuYXdhcmUgb2Ygd2hlcmUgdGhleSBsaXZlIGluIHRoZSByZXBvLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdFNjYWZmb2xkIHtcblx0cHJpdmF0ZSByZWFkb25seSBfbW9kZWxzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVQcm92aWRlcj4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfZmlsZXM6IFNvdXJjZUZpbGVbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyOiBzdHJpbmcpIHt9XG5cblx0cHVibGljIGFkZE1vZGVsPFQgZXh0ZW5kcyBLZXllZE1vZGVsPihtb2RlbDogVCk6IFQge1xuXHRcdHRoaXMuX21vZGVscy5zZXQobW9kZWwua2V5LCBtb2RlbCk7XG5cdFx0cmV0dXJuIG1vZGVsO1xuXHR9XG5cblx0cHVibGljIGFkZEZpbGUocHJvdmlkZXI6IFNvdXJjZUZpbGVQcm92aWRlcik6IHRoaXMge1xuXHRcdHRoaXMuX2ZpbGVzLnB1c2goLi4ucHJvdmlkZXIuZmlsZXMoKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9kZWw8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fbW9kZWxzLmdldChrZXkpIGFzIFQgfCB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9kZWxzPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGN0b3I6IG5ldyAoLi4uYXJnczogbmV2ZXJbXSkgPT4gVCk6IFRbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLl9tb2RlbHMudmFsdWVzKCldLmZpbHRlcigobSk6IG0gaXMgVCA9PiBtIGluc3RhbmNlb2YgY3Rvcik7XG5cdH1cblxuXHQvKiogUmV0dXJucyBhbGwgZmlsZXMgd2l0aCBgZGlyL2AgcHJlcGVuZGVkIHRvIGVhY2ggcGF0aC4gKi9cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgYWxsID0gWy4uLnRoaXMuX2ZpbGVzLCAuLi5bLi4udGhpcy5fbW9kZWxzLnZhbHVlcygpXS5mbGF0TWFwKChtKSA9PiBtLmZpbGVzKCkpXTtcblx0XHRyZXR1cm4gYWxsLm1hcCgoZikgPT4gKHsgZmlsZVBhdGg6IGAke3RoaXMuZGlyfS8ke2YuZmlsZVBhdGh9YCwgY29udGVudDogZi5jb250ZW50IH0pKTtcblx0fVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya3NwYWNlU2NhZmZvbGQge1xuXHRwdWJsaWMgcmVhZG9ubHkgZmlsZXM6IFNvdXJjZUZpbGVbXSA9IFtdO1xuXHRwdWJsaWMgdGFyZ2V0RGlyOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXHRwcml2YXRlIF9uYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqIFByb2plY3QgbmFtZSDigJQgaG9zdCBkaXJlY3RvcnkgYmFzZW5hbWUsIG5vdCB0aGUgaW4tY29udGFpbmVyIG1vdW50IHBhdGguICovXG5cdHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9uYW1lID8/IGJhc2VuYW1lKHRoaXMudGFyZ2V0RGlyKTtcblx0fVxuXG5cdHB1YmxpYyBzZXROYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX25hbWUgPSBuYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhbiBhZC1ob2MgZmlsZSBwcm92aWRlciB3aG9zZSBvdXRwdXQgaXMgaW5jbHVkZWQgYXQgcmVuZGVyIHRpbWUuICovXG5cdHB1YmxpYyBhZGRGaWxlKHByb3ZpZGVyOiBTb3VyY2VGaWxlUHJvdmlkZXIpOiB0aGlzIHtcblx0XHR0aGlzLmZpbGVzLnB1c2goLi4ucHJvdmlkZXIuZmlsZXMoKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWJzdHJhY3QgYWRkTW9kZWw8VCBleHRlbmRzIEtleWVkTW9kZWw+KG1vZGVsOiBUKTogVDtcblx0cHVibGljIGFic3RyYWN0IGdldE1vZGVsPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcblx0cHVibGljIGFic3RyYWN0IGdldE1vZGVsczxUIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyPihcblx0XHRjdG9yOiBuZXcgKC4uLmFyZ3M6IG5ldmVyW10pID0+IFQsXG5cdCk6IFRbXTtcblx0cHVibGljIGFic3RyYWN0IGdldFByb2plY3QoZGlyOiBzdHJpbmcpOiBQcm9qZWN0U2NhZmZvbGQgfCB1bmRlZmluZWQ7XG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRQcm9qZWN0cygpOiByZWFkb25seSBQcm9qZWN0U2NhZmZvbGRbXTtcblx0cHVibGljIGFic3RyYWN0IHNjYWZmb2xkKCk6IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ub1JlcG9TY2FmZm9sZCBleHRlbmRzIFdvcmtzcGFjZVNjYWZmb2xkIHtcblx0cHJpdmF0ZSByZWFkb25seSBfbW9kZWxzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVQcm92aWRlcj4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfcHJvamVjdHM6IFByb2plY3RTY2FmZm9sZFtdID0gW107XG5cblx0LyoqIFJlZ2lzdGVyIGEgbmFtZWQgcHJvamVjdC4gKi9cblx0cHVibGljIGFkZFByb2plY3QocHJvamVjdDogUHJvamVjdFNjYWZmb2xkKTogUHJvamVjdFNjYWZmb2xkIHtcblx0XHR0aGlzLl9wcm9qZWN0cy5wdXNoKHByb2plY3QpO1xuXHRcdHJldHVybiBwcm9qZWN0O1xuXHR9XG5cblx0LyoqIFJldHJpZXZlIGEgcHJldmlvdXNseS1yZWdpc3RlcmVkIHByb2plY3QgYnkgaXRzIGRpcmVjdG9yeSBwYXRoLiAqL1xuXHRwdWJsaWMgZ2V0UHJvamVjdChkaXI6IHN0cmluZyk6IFByb2plY3RTY2FmZm9sZCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb2plY3RzLmZpbmQoKHApID0+IHAuZGlyID09PSBkaXIpO1xuXHR9XG5cblx0LyoqIEFsbCByZWdpc3RlcmVkIHByb2plY3RzLCBpbiByZWdpc3RyYXRpb24gb3JkZXIuICovXG5cdHB1YmxpYyBnZXRQcm9qZWN0cygpOiByZWFkb25seSBQcm9qZWN0U2NhZmZvbGRbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb2plY3RzO1xuXHR9XG5cblx0LyoqIFJlZ2lzdGVyIGEgbmFtZWQgbW9kZWwgYXQgd29ya3NwYWNlIGxldmVsLiAqL1xuXHRwdWJsaWMgYWRkTW9kZWw8VCBleHRlbmRzIEtleWVkTW9kZWw+KG1vZGVsOiBUKTogVCB7XG5cdFx0dGhpcy5fbW9kZWxzLnNldChtb2RlbC5rZXksIG1vZGVsKTtcblx0XHRyZXR1cm4gbW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBtb2RlbCBieSBrZXkuIFNlYXJjaGVzIHdvcmtzcGFjZSBtb2RlbHMgZmlyc3QsIHRoZW4gYWxsXG5cdCAqIHJlZ2lzdGVyZWQgcHJvamVjdHMgaW4gb3JkZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TW9kZWw8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtID0gdGhpcy5fbW9kZWxzLmdldChrZXkpIGFzIFQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG07XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHRoaXMuX3Byb2plY3RzKSB7XG5cdFx0XHRjb25zdCBwbSA9IHByb2plY3QuZ2V0TW9kZWw8VD4oa2V5KTtcblx0XHRcdGlmIChwbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcG07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYWxsIG1vZGVscyBvZiBhIGdpdmVuIHR5cGUuIFNlYXJjaGVzIHdvcmtzcGFjZSBtb2RlbHMgYW5kIGFsbFxuXHQgKiBwcm9qZWN0cywgc28gZmVhdHVyZXMgY2FuIGRpc2NvdmVyIGNvbnRyb2xsZXJzIGFjcm9zcyBtdWx0aXBsZSBwcm9qZWN0cy5cblx0ICovXG5cdHB1YmxpYyBnZXRNb2RlbHM8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oY3RvcjogbmV3ICguLi5hcmdzOiBuZXZlcltdKSA9PiBUKTogVFtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0Li4uWy4uLnRoaXMuX21vZGVscy52YWx1ZXMoKV0uZmlsdGVyKChtKTogbSBpcyBUID0+IG0gaW5zdGFuY2VvZiBjdG9yKSxcblx0XHRcdC4uLnRoaXMuX3Byb2plY3RzLmZsYXRNYXAoKHApID0+IHAuZ2V0TW9kZWxzKGN0b3IpKSxcblx0XHRdO1xuXHR9XG5cblx0LyoqIFJlbmRlciBhbGwgbW9kZWxzIGFuZCBwcm9qZWN0cyBpbnRvIGZpbGVzLCB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgdG8gZGlzay4gKi9cblx0cHVibGljIGFzeW5jIHNjYWZmb2xkKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFsbEZpbGVzID0gW1xuXHRcdFx0Li4udGhpcy5maWxlcyxcblx0XHRcdC4uLlsuLi50aGlzLl9tb2RlbHMudmFsdWVzKCldLmZsYXRNYXAoKG0pID0+IG0uZmlsZXMoKSksXG5cdFx0XHQuLi50aGlzLl9wcm9qZWN0cy5mbGF0TWFwKChwKSA9PiBwLmZpbGVzKCkpLFxuXHRcdF07XG5cblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdGFsbEZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4odGhpcy50YXJnZXREaXIsIGZpbGUuZmlsZVBhdGgpO1xuXHRcdFx0XHRhd2FpdCBta2RpcihkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdGF3YWl0IHdyaXRlRmlsZShmdWxsUGF0aCwgZmlsZS5jb250ZW50KTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJNb25vUmVwb1NjYWZmb2xkIiwiUHJvamVjdFNjYWZmb2xkIiwiV29ya3NwYWNlU2NhZmZvbGQiLCJfbW9kZWxzIiwiTWFwIiwiX2ZpbGVzIiwiZGlyIiwiYWRkTW9kZWwiLCJtb2RlbCIsInNldCIsImtleSIsImFkZEZpbGUiLCJwcm92aWRlciIsInB1c2giLCJmaWxlcyIsImdldE1vZGVsIiwiZ2V0IiwiZ2V0TW9kZWxzIiwiY3RvciIsInZhbHVlcyIsImZpbHRlciIsIm0iLCJhbGwiLCJmbGF0TWFwIiwibWFwIiwiZiIsImZpbGVQYXRoIiwiY29udGVudCIsInRhcmdldERpciIsInByb2Nlc3MiLCJjd2QiLCJfbmFtZSIsIm5hbWUiLCJiYXNlbmFtZSIsInNldE5hbWUiLCJfcHJvamVjdHMiLCJhZGRQcm9qZWN0IiwicHJvamVjdCIsImdldFByb2plY3QiLCJmaW5kIiwicCIsImdldFByb2plY3RzIiwidW5kZWZpbmVkIiwicG0iLCJzY2FmZm9sZCIsImFsbEZpbGVzIiwiUHJvbWlzZSIsImZpbGUiLCJmdWxsUGF0aCIsImpvaW4iLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBeUVhQTtlQUFBQTs7UUE5REFDO2VBQUFBOztRQStCU0M7ZUFBQUE7OzswQkExQ1c7MEJBQ087QUFVakMsTUFBTUQ7O0lBQ0tFLFVBQVUsSUFBSUMsTUFBa0M7SUFDaERDLFNBQXVCLEVBQUUsQ0FBQztJQUUzQyxZQUFtQixBQUFnQkMsR0FBVyxDQUFFO2FBQWJBLE1BQUFBO0lBQWM7SUFFMUNDLFNBQStCQyxLQUFRLEVBQUs7UUFDbEQsSUFBSSxDQUFDTCxPQUFPLENBQUNNLEdBQUcsQ0FBQ0QsTUFBTUUsR0FBRyxFQUFFRjtRQUM1QixPQUFPQTtJQUNSO0lBRU9HLFFBQVFDLFFBQTRCLEVBQVE7UUFDbEQsSUFBSSxDQUFDUCxNQUFNLENBQUNRLElBQUksSUFBSUQsU0FBU0UsS0FBSztRQUNsQyxPQUFPLElBQUk7SUFDWjtJQUVPQyxTQUF1Q0wsR0FBVyxFQUFpQjtRQUN6RSxPQUFPLElBQUksQ0FBQ1AsT0FBTyxDQUFDYSxHQUFHLENBQUNOO0lBQ3pCO0lBRU9PLFVBQXdDQyxJQUFpQyxFQUFPO1FBQ3RGLE9BQU87ZUFBSSxJQUFJLENBQUNmLE9BQU8sQ0FBQ2dCLE1BQU07U0FBRyxDQUFDQyxNQUFNLENBQUMsQ0FBQ0MsSUFBY0EsYUFBYUg7SUFDdEU7SUFFQSwwREFBMEQsR0FDMUQsQUFBT0osUUFBc0I7UUFDNUIsTUFBTVEsTUFBTTtlQUFJLElBQUksQ0FBQ2pCLE1BQU07ZUFBSzttQkFBSSxJQUFJLENBQUNGLE9BQU8sQ0FBQ2dCLE1BQU07YUFBRyxD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
@@ -19,6 +19,7 @@ _export(exports, {
19
19
  const _commander = require("commander");
20
20
  const _resolvetargetdir = require("./resolve-target-dir.js");
21
21
  const _runner = require("./runner.js");
22
+ const _apiname = require("./webapi/api-name.js");
22
23
  const _createapi = require("./webapi/create-api.js");
23
24
  function _getRequireWildcardCache(nodeInterop) {
24
25
  if (typeof WeakMap !== "function") return null;
@@ -61,30 +62,56 @@ function _interop_require_wildcard(obj, nodeInterop) {
61
62
  }
62
63
  return newObj;
63
64
  }
65
+ function collectName(value, previous) {
66
+ previous.push(value);
67
+ return previous;
68
+ }
69
+ function addWebapiFeatureOptions(cmd) {
70
+ return cmd.option("--database <provider>", "Database provider: none | postgres/typeorm").option("--auth <provider>", "Auth provider: none | auth0").option("--postman <provider>", "Postman provider: none | local | api").option("-y, --yes", "Install dependencies without prompting").option("--install <mode>", "Dependency install mode: ask | yes | no", "ask");
71
+ }
72
+ function toApiOptions(directory, opts, extra = {}) {
73
+ const installMode = String(opts.install ?? "ask").toLowerCase();
74
+ const names = Array.isArray(opts.name) ? opts.name : typeof opts.name === "string" ? [
75
+ opts.name
76
+ ] : extra.names;
77
+ return {
78
+ d: (0, _resolvetargetdir.resolveTargetDir)(directory, typeof opts.d === "string" ? opts.d : undefined),
79
+ databaseProvider: opts.database,
80
+ authProvider: opts.auth,
81
+ postmanProvider: opts.postman,
82
+ installDependencies: opts.yes === true ? "yes" : installMode === "yes" || installMode === "no" ? installMode : undefined,
83
+ names,
84
+ ...extra
85
+ };
86
+ }
87
+ async function runWebapi(normalized) {
88
+ (0, _apiname.parseApiNames)(normalized.names);
89
+ if (process.env.DECOHERE_BUILDER !== "1") {
90
+ (0, _runner.runInBuilder)(normalized);
91
+ return;
92
+ }
93
+ const { closePrompt } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("./domain/prompt.js")));
94
+ try {
95
+ await (0, _createapi.scaffoldApi)(normalized);
96
+ } finally{
97
+ closePrompt();
98
+ }
99
+ }
64
100
  function createProgram() {
65
101
  const program = new _commander.Command();
66
102
  program.exitOverride();
67
103
  program.name("decohere").description("Scaffold a new Decohere project").option("-d <directory>", "Target directory (default: current directory)", ".");
68
- program.command("webapi").argument("[directory]", "Target directory (default: -d or current directory)").option("--database <provider>", "Database provider: none | postgres/typeorm").option("--auth <provider>", "Auth provider: none | auth0").option("--postman <provider>", "Postman provider: none | local | api").option("-y, --yes", "Install dependencies without prompting").option("--install <mode>", "Dependency install mode: ask | yes | no", "ask").action(async (directory, _opts, cmd)=>{
69
- const opts = cmd.optsWithGlobals();
70
- const installMode = String(opts.install ?? "ask").toLowerCase();
71
- const normalized = {
72
- d: (0, _resolvetargetdir.resolveTargetDir)(directory, typeof opts.d === "string" ? opts.d : undefined),
73
- databaseProvider: opts.database,
74
- authProvider: opts.auth,
75
- postmanProvider: opts.postman,
76
- installDependencies: opts.yes === true ? "yes" : installMode === "yes" || installMode === "no" ? installMode : undefined
77
- };
78
- if (process.env.DECOHERE_BUILDER !== "1") {
79
- (0, _runner.runInBuilder)(normalized);
80
- return;
81
- }
82
- const { closePrompt } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("./domain/prompt.js")));
83
- try {
84
- await (0, _createapi.scaffoldApi)(normalized);
85
- } finally{
86
- closePrompt();
87
- }
104
+ const webapi = addWebapiFeatureOptions(program.command("webapi").argument("[directory]", "Target directory (default: -d or current directory)").option("--name <slug>", "API name under projects/ (repeatable; default: api)", collectName, []));
105
+ webapi.action(async (directory, _opts, cmd)=>{
106
+ await runWebapi(toApiOptions(directory, cmd.optsWithGlobals()));
107
+ });
108
+ addWebapiFeatureOptions(webapi.command("add").argument("<name>", "API name under projects/")).action(async (name, _opts, cmd)=>{
109
+ await runWebapi(toApiOptions(undefined, cmd.optsWithGlobals(), {
110
+ names: [
111
+ name
112
+ ],
113
+ add: true
114
+ }));
88
115
  });
89
116
  return program;
90
117
  }
@@ -95,10 +122,14 @@ async function runCli(argv = process.argv) {
95
122
  if (err instanceof _commander.CommanderError) {
96
123
  process.exit(err.exitCode);
97
124
  }
125
+ if (err instanceof _apiname.CreateCliError) {
126
+ console.error(`\n ${err.message}\n`);
127
+ process.exit(1);
128
+ }
98
129
  console.error(err);
99
130
  process.exit(1);
100
131
  }
101
132
  process.exit(process.exitCode ?? 0);
102
133
  }
103
134
 
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcHJvZ3JhbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kLCBDb21tYW5kZXJFcnJvciB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHJlc29sdmVUYXJnZXREaXIgfSBmcm9tIFwiLi9yZXNvbHZlLXRhcmdldC1kaXIuanNcIjtcbmltcG9ydCB7IHJ1bkluQnVpbGRlciB9IGZyb20gXCIuL3J1bm5lci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBcGlPcHRpb25zIH0gZnJvbSBcIi4vd2ViYXBpL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB7IHNjYWZmb2xkQXBpIH0gZnJvbSBcIi4vd2ViYXBpL2NyZWF0ZS1hcGkuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oKTogQ29tbWFuZCB7XG5cdGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXHRwcm9ncmFtLmV4aXRPdmVycmlkZSgpO1xuXHRwcm9ncmFtXG5cdFx0Lm5hbWUoXCJkZWNvaGVyZVwiKVxuXHRcdC5kZXNjcmlwdGlvbihcIlNjYWZmb2xkIGEgbmV3IERlY29oZXJlIHByb2plY3RcIilcblx0XHQub3B0aW9uKFwiLWQgPGRpcmVjdG9yeT5cIiwgXCJUYXJnZXQgZGlyZWN0b3J5IChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcIiwgXCIuXCIpO1xuXG5cdHByb2dyYW1cblx0XHQuY29tbWFuZChcIndlYmFwaVwiKVxuXHRcdC5hcmd1bWVudChcIltkaXJlY3RvcnldXCIsIFwiVGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdDogLWQgb3IgY3VycmVudCBkaXJlY3RvcnkpXCIpXG5cdFx0Lm9wdGlvbihcIi0tZGF0YWJhc2UgPHByb3ZpZGVyPlwiLCBcIkRhdGFiYXNlIHByb3ZpZGVyOiBub25lIHwgcG9zdGdyZXMvdHlwZW9ybVwiKVxuXHRcdC5vcHRpb24oXCItLWF1dGggPHByb3ZpZGVyPlwiLCBcIkF1dGggcHJvdmlkZXI6IG5vbmUgfCBhdXRoMFwiKVxuXHRcdC5vcHRpb24oXCItLXBvc3RtYW4gPHByb3ZpZGVyPlwiLCBcIlBvc3RtYW4gcHJvdmlkZXI6IG5vbmUgfCBsb2NhbCB8IGFwaVwiKVxuXHRcdC5vcHRpb24oXCIteSwgLS15ZXNcIiwgXCJJbnN0YWxsIGRlcGVuZGVuY2llcyB3aXRob3V0IHByb21wdGluZ1wiKVxuXHRcdC5vcHRpb24oXCItLWluc3RhbGwgPG1vZGU+XCIsIFwiRGVwZW5kZW5jeSBpbnN0YWxsIG1vZGU6IGFzayB8IHllcyB8IG5vXCIsIFwiYXNrXCIpXG5cdFx0LmFjdGlvbihhc3luYyAoZGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsIF9vcHRzOiB1bmtub3duLCBjbWQ6IENvbW1hbmQpID0+IHtcblx0XHRcdGNvbnN0IG9wdHMgPSBjbWQub3B0c1dpdGhHbG9iYWxzKCk7XG5cdFx0XHRjb25zdCBpbnN0YWxsTW9kZSA9IFN0cmluZyhvcHRzLmluc3RhbGwgPz8gXCJhc2tcIikudG9Mb3dlckNhc2UoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQ6IEFwaU9wdGlvbnMgPSB7XG5cdFx0XHRcdGQ6IHJlc29sdmVUYXJnZXREaXIoZGlyZWN0b3J5LCB0eXBlb2Ygb3B0cy5kID09PSBcInN0cmluZ1wiID8gb3B0cy5kIDogdW5kZWZpbmVkKSxcblx0XHRcdFx0ZGF0YWJhc2VQcm92aWRlcjogb3B0cy5kYXRhYmFzZSxcblx0XHRcdFx0YXV0aFByb3ZpZGVyOiBvcHRzLmF1dGgsXG5cdFx0XHRcdHBvc3RtYW5Qcm92aWRlcjogb3B0cy5wb3N0bWFuLFxuXHRcdFx0XHRpbnN0YWxsRGVwZW5kZW5jaWVzOlxuXHRcdFx0XHRcdG9wdHMueWVzID09PSB0cnVlXG5cdFx0XHRcdFx0XHQ/IFwieWVzXCJcblx0XHRcdFx0XHRcdDogaW5zdGFsbE1vZGUgPT09IFwieWVzXCIgfHwgaW5zdGFsbE1vZGUgPT09IFwibm9cIlxuXHRcdFx0XHRcdFx0XHQ/IGluc3RhbGxNb2RlXG5cdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHByb2Nlc3MuZW52LkRFQ09IRVJFX0JVSUxERVIgIT09IFwiMVwiKSB7XG5cdFx0XHRcdHJ1bkluQnVpbGRlcihub3JtYWxpemVkKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB7IGNsb3NlUHJvbXB0IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2RvbWFpbi9wcm9tcHQuanNcIik7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBzY2FmZm9sZEFwaShub3JtYWxpemVkKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGNsb3NlUHJvbXB0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0cmV0dXJuIHByb2dyYW07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcblx0dHJ5IHtcblx0XHRhd2FpdCBjcmVhdGVQcm9ncmFtKCkucGFyc2VBc3luYyhhcmd2KTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIENvbW1hbmRlckVycm9yKSB7XG5cdFx0XHRwcm9jZXNzLmV4aXQoZXJyLmV4aXRDb2RlKTtcblx0XHR9XG5cdFx0Y29uc29sZS5lcnJvcihlcnIpO1xuXHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0fVxuXHRwcm9jZXNzLmV4aXQocHJvY2Vzcy5leGl0Q29kZSA/PyAwKTtcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVQcm9ncmFtIiwicnVuQ2xpIiwicHJvZ3JhbSIsIkNvbW1hbmQiLCJleGl0T3ZlcnJpZGUiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJvcHRpb24iLCJjb21tYW5kIiwiYXJndW1lbnQiLCJhY3Rpb24iLCJkaXJlY3RvcnkiLCJfb3B0cyIsImNtZCIsIm9wdHMiLCJvcHRzV2l0aEdsb2JhbHMiLCJpbnN0YWxsTW9kZSIsIlN0cmluZyIsImluc3RhbGwiLCJ0b0xvd2VyQ2FzZSIsIm5vcm1hbGl6ZWQiLCJkIiwicmVzb2x2ZVRhcmdldERpciIsInVuZGVmaW5lZCIsImRhdGFiYXNlUHJvdmlkZXIiLCJkYXRhYmFzZSIsImF1dGhQcm92aWRlciIsImF1dGgiLCJwb3N0bWFuUHJvdmlkZXIiLCJwb3N0bWFuIiwiaW5zdGFsbERlcGVuZGVuY2llcyIsInllcyIsInByb2Nlc3MiLCJlbnYiLCJERUNPSEVSRV9CVUlMREVSIiwicnVuSW5CdWlsZGVyIiwiY2xvc2VQcm9tcHQiLCJzY2FmZm9sZEFwaSIsImFyZ3YiLCJwYXJzZUFzeW5jIiwiZXJyIiwiQ29tbWFuZGVyRXJyb3IiLCJleGl0IiwiZXhpdENvZGUiLCJjb25zb2xlIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBTWdCQTtlQUFBQTs7UUFnRE1DO2VBQUFBOzs7MkJBdERrQjtrQ0FDUDt3QkFDSjsyQkFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXJCLFNBQVNEO0lBQ2YsTUFBTUUsVUFBVSxJQUFJQyxrQkFBTztJQUMzQkQsUUFBUUUsWUFBWTtJQUNwQkYsUUFDRUcsSUFBSSxDQUFDLFlBQ0xDLFdBQVcsQ0FBQyxtQ0FDWkMsTUFBTSxDQUFDLGtCQUFrQixpREFBaUQ7SUFFNUVMLFFBQ0VNLE9BQU8sQ0FBQyxVQUNSQyxRQUFRLENBQUMsZUFBZSx1REFDeEJGLE1BQU0sQ0FBQyx5QkFBeUIsOENBQ2hDQSxNQUFNLENBQUMscUJBQXFCLCtCQUM1QkEsTUFBTSxDQUFDLHdCQUF3Qix3Q0FDL0JBLE1BQU0sQ0FBQyxhQUFhLDBDQUNwQkEsTUFBTSxDQUFDLG9CQUFvQiwyQ0FBMkMsT0FDdEVHLE1BQU0sQ0FBQyxPQUFPQyxXQUErQkMsT0FBZ0JDO1FBQzdELE1BQU1DLE9BQU9ELElBQUlFLGVBQWU7UUFDaEMsTUFBTUMsY0FBY0MsT0FBT0gsS0FBS0ksT0FBTyxJQUFJLE9BQU9DLFdBQVc7UUFDN0QsTUFBTUMsYUFBeUI7WUFDOUJDLEdBQUdDLElBQUFBLGtDQUFnQixFQUFDWCxXQUFXLE9BQU9HLEtBQUtPLENBQUMsS0FBSyxXQUFXUCxLQUFLTyxDQUFDLEdBQUdFO1lBQ3JFQyxrQkFBa0JWLEtBQUtXLFFBQVE7WUFDL0JDLGNBQWNaLEtBQUthLElBQUk7WUFDdkJDLGlCQUFpQmQsS0FBS2UsT0FBTztZQUM3QkMscUJBQ0NoQixLQUFLaUIsR0FBRyxLQUFLLE9BQ1YsUUFDQWYsZ0JBQWdCLFNBQVNBLGdCQUFnQixPQUN4Q0EsY0FDQU87UUFDTjtRQUVBLElBQUlTLFFBQVFDLEdBQUcsQ0FBQ0MsZ0JBQWdCLEtBQUssS0FBSztZQUN6Q0MsSUFBQUEsb0JBQVksRUFBQ2Y7WUFDYjtRQUNEO1FBRUEsTUFBTSxFQUFFZ0IsV0FBVyxFQUFFLEdBQUcsTUFBTSxtRUFBQSxRQUFPO1FBQ3JDLElBQUk7WUFDSCxNQUFNQyxJQUFBQSxzQkFBVyxFQUFDakI7UUFDbkIsU0FBVTtZQUNUZ0I7UUFDRDtJQUNEO0lBRUQsT0FBT2xDO0FBQ1I7QUFFTyxlQUFlRCxPQUFPcUMsT0FBaUJOLFFBQVFNLElBQUk7SUFDekQsSUFBSTtRQUNILE1BQU10QyxnQkFBZ0J1QyxVQUFVLENBQUNEO0lBQ2xDLEVBQUUsT0FBT0UsS0FBSztRQUNiLElBQUlBLGVBQWVDLHlCQUFjLEVBQUU7WUFDbENULFFBQVFVLElBQUksQ0FBQ0YsSUFBSUcsUUFBUTtRQUMxQjtRQUNBQyxRQUFRQyxLQUFLLENBQUNMO1FBQ2RSLFFBQVFVLElBQUksQ0FBQztJQUNkO0lBQ0FWLFFBQVFVLElBQUksQ0FBQ1YsUUFBUVcsUUFBUSxJQUFJO0FBQ2xDIn0=
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvcHJvZ3JhbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kLCBDb21tYW5kZXJFcnJvciB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHJlc29sdmVUYXJnZXREaXIgfSBmcm9tIFwiLi9yZXNvbHZlLXRhcmdldC1kaXIuanNcIjtcbmltcG9ydCB7IHJ1bkluQnVpbGRlciB9IGZyb20gXCIuL3J1bm5lci5qc1wiO1xuaW1wb3J0IHsgQ3JlYXRlQ2xpRXJyb3IsIHBhcnNlQXBpTmFtZXMgfSBmcm9tIFwiLi93ZWJhcGkvYXBpLW5hbWUuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpT3B0aW9ucyB9IGZyb20gXCIuL3dlYmFwaS9jcmVhdGUtYXBpLmpzXCI7XG5pbXBvcnQgeyBzY2FmZm9sZEFwaSB9IGZyb20gXCIuL3dlYmFwaS9jcmVhdGUtYXBpLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbGxlY3ROYW1lKHZhbHVlOiBzdHJpbmcsIHByZXZpb3VzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0cHJldmlvdXMucHVzaCh2YWx1ZSk7XG5cdHJldHVybiBwcmV2aW91cztcbn1cblxuZnVuY3Rpb24gYWRkV2ViYXBpRmVhdHVyZU9wdGlvbnMoY21kOiBDb21tYW5kKTogQ29tbWFuZCB7XG5cdHJldHVybiBjbWRcblx0XHQub3B0aW9uKFwiLS1kYXRhYmFzZSA8cHJvdmlkZXI+XCIsIFwiRGF0YWJhc2UgcHJvdmlkZXI6IG5vbmUgfCBwb3N0Z3Jlcy90eXBlb3JtXCIpXG5cdFx0Lm9wdGlvbihcIi0tYXV0aCA8cHJvdmlkZXI+XCIsIFwiQXV0aCBwcm92aWRlcjogbm9uZSB8IGF1dGgwXCIpXG5cdFx0Lm9wdGlvbihcIi0tcG9zdG1hbiA8cHJvdmlkZXI+XCIsIFwiUG9zdG1hbiBwcm92aWRlcjogbm9uZSB8IGxvY2FsIHwgYXBpXCIpXG5cdFx0Lm9wdGlvbihcIi15LCAtLXllc1wiLCBcIkluc3RhbGwgZGVwZW5kZW5jaWVzIHdpdGhvdXQgcHJvbXB0aW5nXCIpXG5cdFx0Lm9wdGlvbihcIi0taW5zdGFsbCA8bW9kZT5cIiwgXCJEZXBlbmRlbmN5IGluc3RhbGwgbW9kZTogYXNrIHwgeWVzIHwgbm9cIiwgXCJhc2tcIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpT3B0aW9ucyhcblx0ZGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRleHRyYTogUGFydGlhbDxBcGlPcHRpb25zPiA9IHt9LFxuKTogQXBpT3B0aW9ucyB7XG5cdGNvbnN0IGluc3RhbGxNb2RlID0gU3RyaW5nKG9wdHMuaW5zdGFsbCA/PyBcImFza1wiKS50b0xvd2VyQ2FzZSgpO1xuXHRjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkob3B0cy5uYW1lKVxuXHRcdD8gKG9wdHMubmFtZSBhcyBzdHJpbmdbXSlcblx0XHQ6IHR5cGVvZiBvcHRzLm5hbWUgPT09IFwic3RyaW5nXCJcblx0XHRcdD8gW29wdHMubmFtZV1cblx0XHRcdDogZXh0cmEubmFtZXM7XG5cdHJldHVybiB7XG5cdFx0ZDogcmVzb2x2ZVRhcmdldERpcihkaXJlY3RvcnksIHR5cGVvZiBvcHRzLmQgPT09IFwic3RyaW5nXCIgPyBvcHRzLmQgOiB1bmRlZmluZWQpLFxuXHRcdGRhdGFiYXNlUHJvdmlkZXI6IG9wdHMuZGF0YWJhc2UgYXMgQXBpT3B0aW9uc1tcImRhdGFiYXNlUHJvdmlkZXJcIl0sXG5cdFx0YXV0aFByb3ZpZGVyOiBvcHRzLmF1dGggYXMgQXBpT3B0aW9uc1tcImF1dGhQcm92aWRlclwiXSxcblx0XHRwb3N0bWFuUHJvdmlkZXI6IG9wdHMucG9zdG1hbiBhcyBBcGlPcHRpb25zW1wicG9zdG1hblByb3ZpZGVyXCJdLFxuXHRcdGluc3RhbGxEZXBlbmRlbmNpZXM6XG5cdFx0XHRvcHRzLnllcyA9PT0gdHJ1ZVxuXHRcdFx0XHQ/IFwieWVzXCJcblx0XHRcdFx0OiBpbnN0YWxsTW9kZSA9PT0gXCJ5ZXNcIiB8fCBpbnN0YWxsTW9kZSA9PT0gXCJub1wiXG5cdFx0XHRcdFx0PyBpbnN0YWxsTW9kZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdG5hbWVzLFxuXHRcdC4uLmV4dHJhLFxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5XZWJhcGkobm9ybWFsaXplZDogQXBpT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRwYXJzZUFwaU5hbWVzKG5vcm1hbGl6ZWQubmFtZXMpO1xuXHRpZiAocHJvY2Vzcy5lbnYuREVDT0hFUkVfQlVJTERFUiAhPT0gXCIxXCIpIHtcblx0XHRydW5JbkJ1aWxkZXIobm9ybWFsaXplZCk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgeyBjbG9zZVByb21wdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9kb21haW4vcHJvbXB0LmpzXCIpO1xuXHR0cnkge1xuXHRcdGF3YWl0IHNjYWZmb2xkQXBpKG5vcm1hbGl6ZWQpO1xuXHR9IGZpbmFsbHkge1xuXHRcdGNsb3NlUHJvbXB0KCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oKTogQ29tbWFuZCB7XG5cdGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXHRwcm9ncmFtLmV4aXRPdmVycmlkZSgpO1xuXHRwcm9ncmFtXG5cdFx0Lm5hbWUoXCJkZWNvaGVyZVwiKVxuXHRcdC5kZXNjcmlwdGlvbihcIlNjYWZmb2xkIGEgbmV3IERlY29oZXJlIHByb2plY3RcIilcblx0XHQub3B0aW9uKFwiLWQgPGRpcmVjdG9yeT5cIiwgXCJUYXJnZXQgZGlyZWN0b3J5IChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcIiwgXCIuXCIpO1xuXG5cdGNvbnN0IHdlYmFwaSA9IGFkZFdlYmFwaUZlYXR1cmVPcHRpb25zKFxuXHRcdHByb2dyYW1cblx0XHRcdC5jb21tYW5kKFwid2ViYXBpXCIpXG5cdFx0XHQuYXJndW1lbnQoXCJbZGlyZWN0b3J5XVwiLCBcIlRhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHQ6IC1kIG9yIGN1cnJlbnQgZGlyZWN0b3J5KVwiKVxuXHRcdFx0Lm9wdGlvbihcblx0XHRcdFx0XCItLW5hbWUgPHNsdWc+XCIsXG5cdFx0XHRcdFwiQVBJIG5hbWUgdW5kZXIgcHJvamVjdHMvIChyZXBlYXRhYmxlOyBkZWZhdWx0OiBhcGkpXCIsXG5cdFx0XHRcdGNvbGxlY3ROYW1lLFxuXHRcdFx0XHRbXSBhcyBzdHJpbmdbXSxcblx0XHRcdCksXG5cdCk7XG5cdHdlYmFwaS5hY3Rpb24oYXN5bmMgKGRpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBfb3B0czogdW5rbm93biwgY21kOiBDb21tYW5kKSA9PiB7XG5cdFx0YXdhaXQgcnVuV2ViYXBpKHRvQXBpT3B0aW9ucyhkaXJlY3RvcnksIGNtZC5vcHRzV2l0aEdsb2JhbHMoKSkpO1xuXHR9KTtcblxuXHRhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyhcblx0XHR3ZWJhcGkuY29tbWFuZChcImFkZFwiKS5hcmd1bWVudChcIjxuYW1lPlwiLCBcIkFQSSBuYW1lIHVuZGVyIHByb2plY3RzL1wiKSxcblx0KS5hY3Rpb24oYXN5bmMgKG5hbWU6IHN0cmluZywgX29wdHM6IHVua25vd24sIGNtZDogQ29tbWFuZCkgPT4ge1xuXHRcdGF3YWl0IHJ1bldlYmFwaShcblx0XHRcdHRvQXBpT3B0aW9ucyh1bmRlZmluZWQsIGNtZC5vcHRzV2l0aEdsb2JhbHMoKSwgeyBuYW1lczogW25hbWVdLCBhZGQ6IHRydWUgfSksXG5cdFx0KTtcblx0fSk7XG5cblx0cmV0dXJuIHByb2dyYW07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcblx0dHJ5IHtcblx0XHRhd2FpdCBjcmVhdGVQcm9ncmFtKCkucGFyc2VBc3luYyhhcmd2KTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIENvbW1hbmRlckVycm9yKSB7XG5cdFx0XHRwcm9jZXNzLmV4aXQoZXJyLmV4aXRDb2RlKTtcblx0XHR9XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIENyZWF0ZUNsaUVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBcXG4gICR7ZXJyLm1lc3NhZ2V9XFxuYCk7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdFx0fVxuXHRcdGNvbnNvbGUuZXJyb3IoZXJyKTtcblx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdH1cblx0cHJvY2Vzcy5leGl0KHByb2Nlc3MuZXhpdENvZGUgPz8gMCk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlUHJvZ3JhbSIsInJ1bkNsaSIsImNvbGxlY3ROYW1lIiwidmFsdWUiLCJwcmV2aW91cyIsInB1c2giLCJhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyIsImNtZCIsIm9wdGlvbiIsInRvQXBpT3B0aW9ucyIsImRpcmVjdG9yeSIsIm9wdHMiLCJleHRyYSIsImluc3RhbGxNb2RlIiwiU3RyaW5nIiwiaW5zdGFsbCIsInRvTG93ZXJDYXNlIiwibmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJuYW1lIiwiZCIsInJlc29sdmVUYXJnZXREaXIiLCJ1bmRlZmluZWQiLCJkYXRhYmFzZVByb3ZpZGVyIiwiZGF0YWJhc2UiLCJhdXRoUHJvdmlkZXIiLCJhdXRoIiwicG9zdG1hblByb3ZpZGVyIiwicG9zdG1hbiIsImluc3RhbGxEZXBlbmRlbmNpZXMiLCJ5ZXMiLCJydW5XZWJhcGkiLCJub3JtYWxpemVkIiwicGFyc2VBcGlOYW1lcyIsInByb2Nlc3MiLCJlbnYiLCJERUNPSEVSRV9CVUlMREVSIiwicnVuSW5CdWlsZGVyIiwiY2xvc2VQcm9tcHQiLCJzY2FmZm9sZEFwaSIsInByb2dyYW0iLCJDb21tYW5kIiwiZXhpdE92ZXJyaWRlIiwiZGVzY3JpcHRpb24iLCJ3ZWJhcGkiLCJjb21tYW5kIiwiYXJndW1lbnQiLCJhY3Rpb24iLCJfb3B0cyIsIm9wdHNXaXRoR2xvYmFscyIsImFkZCIsImFyZ3YiLCJwYXJzZUFzeW5jIiwiZXJyIiwiQ29tbWFuZGVyRXJyb3IiLCJleGl0IiwiZXhpdENvZGUiLCJDcmVhdGVDbGlFcnJvciIsImNvbnNvbGUiLCJlcnJvciIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBK0RnQkE7ZUFBQUE7O1FBa0NNQztlQUFBQTs7OzJCQWpHa0I7a0NBQ1A7d0JBQ0o7eUJBQ2lCOzJCQUVsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVCLFNBQVNDLFlBQVlDLEtBQWEsRUFBRUMsUUFBa0I7SUFDckRBLFNBQVNDLElBQUksQ0FBQ0Y7SUFDZCxPQUFPQztBQUNSO0FBRUEsU0FBU0Usd0JBQXdCQyxHQUFZO0lBQzVDLE9BQU9BLElBQ0xDLE1BQU0sQ0FBQyx5QkFBeUIsOENBQ2hDQSxNQUFNLENBQUMscUJBQXFCLCtCQUM1QkEsTUFBTSxDQUFDLHdCQUF3Qix3Q0FDL0JBLE1BQU0sQ0FBQyxhQUFhLDBDQUNwQkEsTUFBTSxDQUFDLG9CQUFvQiwyQ0FBMkM7QUFDekU7QUFFQSxTQUFTQyxhQUNSQyxTQUE2QixFQUM3QkMsSUFBNkIsRUFDN0JDLFFBQTZCLENBQUMsQ0FBQztJQUUvQixNQUFNQyxjQUFjQyxPQUFPSCxLQUFLSSxPQUFPLElBQUksT0FBT0MsV0FBVztJQUM3RCxNQUFNQyxRQUFRQyxNQUFNQyxPQUFPLENBQUNSLEtBQUtTLElBQUksSUFDakNULEtBQUtTLElBQUksR0FDVixPQUFPVCxLQUFLUyxJQUFJLEtBQUssV0FDcEI7UUFBQ1QsS0FBS1MsSUFBSTtLQUFDLEdBQ1hSLE1BQU1LLEtBQUs7SUFDZixPQUFPO1FBQ05JLEdBQUdDLElBQUFBLGtDQUFnQixFQUFDWixXQUFXLE9BQU9DLEtBQUtVLENBQUMsS0FBSyxXQUFXVixLQUFLVSxDQUFDLEdBQUdFO1FBQ3JFQyxrQkFBa0JiLEtBQUtjLFFBQVE7UUFDL0JDLGNBQWNmLEtBQUtnQixJQUFJO1FBQ3ZCQyxpQkFBaUJqQixLQUFLa0IsT0FBTztRQUM3QkMscUJBQ0NuQixLQUFLb0IsR0FBRyxLQUFLLE9BQ1YsUUFDQWxCLGdCQUFnQixTQUFTQSxnQkFBZ0IsT0FDeENBLGNBQ0FVO1FBQ0xOO1FBQ0EsR0FBR0wsS0FBSztJQUNUO0FBQ0Q7QUFFQSxlQUFlb0IsVUFBVUMsVUFBc0I7SUFDOUNDLElBQUFBLHNCQUFhLEVBQUNELFdBQVdoQixLQUFLO0lBQzlCLElBQUlrQixRQUFRQyxHQUFHLENBQUNDLGdCQUFnQixLQUFLLEtBQUs7UUFDekNDLElBQUFBLG9CQUFZLEVBQUNMO1FBQ2I7SUFDRDtJQUVBLE1BQU0sRUFBRU0sV0FBVyxFQUFFLEdBQUcsTUFBTSxtRUFBQSxRQUFPO0lBQ3JDLElBQUk7UUFDSCxNQUFNQyxJQUFBQSxzQkFBVyxFQUFDUDtJQUNuQixTQUFVO1FBQ1RNO0lBQ0Q7QUFDRDtBQUVPLFNBQVN2QztJQUNmLE1BQU15QyxVQUFVLElBQUlDLGtCQUFPO0lBQzNCRCxRQUFRRSxZQUFZO0lBQ3BCRixRQUNFckIsSUFBSSxDQUFDLFlBQ0x3QixXQUFXLENBQUMsbUNBQ1pwQyxNQUFNLENBQUMsa0JBQWtCLGlEQUFpRDtJQUU1RSxNQUFNcUMsU0FBU3ZDLHdCQUNkbUMsUUFDRUssT0FBTyxDQUFDLFVBQ1JDLFFBQVEsQ0FBQyxlQUFlLHVEQUN4QnZDLE1BQU0sQ0FDTixpQkFDQSx1REFDQU4sYUFDQSxFQUFFO0lBR0wyQyxPQUFPRyxNQUFNLENBQUMsT0FBT3RDLFdBQStCdUMsT0FBZ0IxQztRQUNuRSxNQUFNeUIsVUFBVXZCLGFBQWFDLFdBQVdILElBQUkyQyxlQUFlO0lBQzVEO0lBRUE1Qyx3QkFDQ3VDLE9BQU9DLE9BQU8sQ0FBQyxPQUFPQyxRQUFRLENBQUMsVUFBVSw2QkFDeENDLE1BQU0sQ0FBQyxPQUFPNUIsTUFBYzZCLE9BQWdCMUM7UUFDN0MsTUFBTXlCLFVBQ0x2QixhQUFhYyxXQUFXaEIsSUFBSTJDLGVBQWUsSUFBSTtZQUFFakMsT0FBTztnQkFBQ0c7YUFBSztZQUFFK0IsS0FBSztRQUFLO0lBRTVFO0lBRUEsT0FBT1Y7QUFDUjtBQUVPLGVBQWV4QyxPQUFPbUQsT0FBaUJqQixRQUFRaUIsSUFBSTtJQUN6RCxJQUFJO1FBQ0gsTUFBTXBELGdCQUFnQnFELFVBQVUsQ0FBQ0Q7SUFDbEMsRUFBRSxPQUFPRSxLQUFLO1FBQ2IsSUFBSUEsZUFBZUMseUJBQWMsRUFBRTtZQUNsQ3BCLFFBQVFxQixJQUFJLENBQUNGLElBQUlHLFFBQVE7UUFDMUI7UUFDQSxJQUFJSCxlQUFlSSx1QkFBYyxFQUFFO1lBQ2xDQyxRQUFRQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUVOLElBQUlPLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDcEMxQixRQUFRcUIsSUFBSSxDQUFDO1FBQ2Q7UUFDQUcsUUFBUUMsS0FBSyxDQUFDTjtRQUNkbkIsUUFBUXFCLElBQUksQ0FBQztJQUNkO0lBQ0FyQixRQUFRcUIsSUFBSSxDQUFDckIsUUFBUXNCLFFBQVEsSUFBSTtBQUNsQyJ9