@mnaoumov/typescript-dev-toolkit 2.0.0 → 2.2.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.
Files changed (42) hide show
  1. package/README.md +4 -0
  2. package/dist/lib/cjs/commitlint-config.cjs +18 -3
  3. package/dist/lib/cjs/commitlint-config.d.cts +6 -0
  4. package/dist/lib/cjs/docs-site/api-doc-documented-files.cjs +51 -0
  5. package/dist/lib/cjs/docs-site/api-doc-documented-files.d.cts +31 -0
  6. package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +3 -2
  7. package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +2 -1
  8. package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +4 -7
  9. package/dist/lib/cjs/docs-site/index.cjs +4 -1
  10. package/dist/lib/cjs/docs-site/index.d.cts +1 -0
  11. package/dist/lib/cjs/exec.cjs +18 -14
  12. package/dist/lib/cjs/exec.d.cts +31 -0
  13. package/dist/lib/cjs/linters/eslint-config.cjs +8 -1
  14. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
  15. package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -1
  16. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -0
  17. package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.cjs +170 -0
  18. package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.d.cts +30 -0
  19. package/dist/lib/cjs/nano-staged-config.cjs +42 -3
  20. package/dist/lib/cjs/nano-staged-config.d.cts +24 -4
  21. package/dist/lib/esm/commitlint-config.d.mts +6 -0
  22. package/dist/lib/esm/commitlint-config.mjs +7 -3
  23. package/dist/lib/esm/docs-site/api-doc-documented-files.d.mts +31 -0
  24. package/dist/lib/esm/docs-site/api-doc-documented-files.mjs +25 -0
  25. package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +2 -1
  26. package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +3 -2
  27. package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +7 -7
  28. package/dist/lib/esm/docs-site/index.d.mts +1 -0
  29. package/dist/lib/esm/docs-site/index.mjs +3 -1
  30. package/dist/lib/esm/exec.d.mts +31 -0
  31. package/dist/lib/esm/exec.mjs +15 -13
  32. package/dist/lib/esm/linters/eslint-config.mjs +8 -1
  33. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
  34. package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -0
  35. package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -1
  36. package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.d.mts +30 -0
  37. package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.mjs +134 -0
  38. package/dist/lib/esm/nano-staged-config.d.mts +24 -4
  39. package/dist/lib/esm/nano-staged-config.mjs +48 -3
  40. package/docs-site/api-doc-documented-files/package.json +6 -0
  41. package/linters/eslint-rules/prefer-logical-operator-over-ternary/package.json +6 -0
  42. package/package.json +2 -2
@@ -0,0 +1,134 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import eslintPluginUnicorn from "eslint-plugin-unicorn";
40
+ const UNICORN_RULE_NAME = "prefer-logical-operator-over-ternary";
41
+ const MESSAGE_ID = "prefer-logical-operator-over-ternary/error";
42
+ const unicornRule = getUnicornRule();
43
+ const preferLogicalOperatorOverTernary = {
44
+ create(context) {
45
+ const reportingContext = Object.create(context, {
46
+ report: {
47
+ value(descriptor) {
48
+ context.report(withLiteralBranchFix(descriptor, context.sourceCode));
49
+ }
50
+ }
51
+ });
52
+ return unicornRule.create(reportingContext);
53
+ },
54
+ meta: {
55
+ ...unicornRule.meta,
56
+ docs: {
57
+ description: "Prefer a logical operator over a ternary, fixing a boolean literal branch in TypeScript too"
58
+ }
59
+ }
60
+ };
61
+ function getBooleanLiteralValue(node) {
62
+ return node.type === "Literal" && typeof node.value === "boolean" ? node.value : void 0;
63
+ }
64
+ function getUnicornRule() {
65
+ const rule = eslintPluginUnicorn.rules?.[UNICORN_RULE_NAME];
66
+ if (!rule || typeof rule === "function") {
67
+ throw new Error(`eslint-plugin-unicorn no longer defines the ${UNICORN_RULE_NAME} rule.`);
68
+ }
69
+ return rule;
70
+ }
71
+ function needsParentheses(node, operator) {
72
+ switch (node.type) {
73
+ case "ArrayExpression":
74
+ case "AwaitExpression":
75
+ case "CallExpression":
76
+ case "ChainExpression":
77
+ case "Identifier":
78
+ case "Literal":
79
+ case "MemberExpression":
80
+ case "NewExpression":
81
+ case "ObjectExpression":
82
+ case "TaggedTemplateExpression":
83
+ case "TemplateLiteral":
84
+ case "ThisExpression":
85
+ case "UnaryExpression": {
86
+ return false;
87
+ }
88
+ case "BinaryExpression": {
89
+ return operator === "!";
90
+ }
91
+ case "LogicalExpression": {
92
+ return operator === "!" || node.operator === "??" || operator === "&&" && node.operator === "||";
93
+ }
94
+ default: {
95
+ return true;
96
+ }
97
+ }
98
+ }
99
+ function toOperandText(node, operator, sourceCode) {
100
+ const text = sourceCode.getText(node);
101
+ return needsParentheses(node, operator) ? `(${text})` : text;
102
+ }
103
+ function withLiteralBranchFix(descriptor, sourceCode) {
104
+ const { fix, messageId, node, suggest } = descriptor;
105
+ if (messageId !== MESSAGE_ID || fix || suggest) {
106
+ return descriptor;
107
+ }
108
+ const conditionalExpression = node;
109
+ const { alternate, consequent, test } = conditionalExpression;
110
+ const consequentValue = getBooleanLiteralValue(consequent);
111
+ const alternateValue = getBooleanLiteralValue(alternate);
112
+ const literalValue = consequentValue ?? alternateValue;
113
+ if (literalValue === void 0 || consequentValue !== void 0 && alternateValue !== void 0 || sourceCode.getCommentsInside(conditionalExpression).length > 0) {
114
+ return descriptor;
115
+ }
116
+ const isConsequentLiteral = consequentValue !== void 0;
117
+ const other = isConsequentLiteral ? alternate : consequent;
118
+ const shouldNegateTest = isConsequentLiteral !== literalValue;
119
+ const operator = literalValue ? "||" : "&&";
120
+ const testText = shouldNegateTest ? `!${toOperandText(test, "!", sourceCode)}` : toOperandText(test, operator, sourceCode);
121
+ const otherText = toOperandText(other, operator, sourceCode);
122
+ return {
123
+ ...descriptor,
124
+ fix(fixer) {
125
+ return fixer.replaceText(conditionalExpression, `${testText} ${operator} ${otherText}`);
126
+ }
127
+ };
128
+ }
129
+ export {
130
+ MESSAGE_ID,
131
+ UNICORN_RULE_NAME,
132
+ preferLogicalOperatorOverTernary
133
+ };
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL2VzbGludC1ydWxlcy9wcmVmZXItbG9naWNhbC1vcGVyYXRvci1vdmVyLXRlcm5hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBwcmVmZXItbG9naWNhbC1vcGVyYXRvci1vdmVyLXRlcm5hcnlcbiAqXG4gKiBgdW5pY29ybi9wcmVmZXItbG9naWNhbC1vcGVyYXRvci1vdmVyLXRlcm5hcnlgLCB3aXRoIHRoZSBmaXggaXQgd2l0aGhvbGRzIGluIGEgVHlwZVNjcmlwdCBmaWxlLlxuICpcbiAqIFVuaWNvcm4gcmVwb3J0cyBhIHRlcm5hcnkgd2l0aCBvbmUgYm9vbGVhbiBicmFuY2ggKGBhID8gZmFsc2UgOiBiYCkgYW5kIGZpeGVzIGl0IHRvIGEgbG9naWNhbCBleHByZXNzaW9uXG4gKiAoYCFhICYmIGJgKSwgYnV0IG9ubHkgb3V0c2lkZSBUeXBlU2NyaXB0LiBgdW5pY29ybi9wcmVmZXItdGVybmFyeWAgZml4ZXMgYGlmIChhKSB7IHJldHVybiBmYWxzZTsgfSByZXR1cm4gYjtgIGludG9cbiAqIGV4YWN0bHkgdGhhdCB0ZXJuYXJ5LCBzbyBpbiBhIFR5cGVTY3JpcHQgZmlsZSBgbGludDpmaXhgIHByb2R1Y2VkIGFuIGVycm9yIGl0IHRoZW4gY291bGQgbm90IGZpeCwgYW5kIGV2ZXJ5IHNpdGVcbiAqIGhhZCB0byBiZSByZXdyaXR0ZW4gYnkgaGFuZC4gVGhpcyBydWxlIHJlcG9ydHMgd2hhdCB1bmljb3JuIHJlcG9ydHMgYW5kIGFkZHMgdGhlIGZpeCB3aGVyZSBvbmUgYnJhbmNoIGlzIGEgYm9vbGVhblxuICogbGl0ZXJhbC4gVGhlIHJld3JpdGUgaXMgZXhhY3QgYXQgcnVudGltZTogd2l0aCBhIG5lZ2F0ZWQgdGVzdCAoYGEgPyBmYWxzZSA6IGJgIOKGkiBgIWEgJiYgYmAsIGBhID8gYiA6IHRydWVgIOKGklxuICogYCFhIHx8IGJgKSBmb3IgYW55IHRlc3QsIGFuZCBvdGhlcndpc2UgKGBhID8gdHJ1ZSA6IGJgIOKGkiBgYSB8fCBiYCwgYGEgPyBiIDogZmFsc2VgIOKGkiBgYSAmJiBiYCkgYmVjYXVzZSB1bmljb3JuXG4gKiByZXBvcnRzIHRoYXQgc2hhcGUgb25seSBmb3IgYSB0ZXN0IGl0IGhhcyBwcm92ZW4gYm9vbGVhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnO1xuaW1wb3J0IHR5cGUge1xuICBDb25kaXRpb25hbEV4cHJlc3Npb24sXG4gIEV4cHJlc3Npb24sXG4gIE5vZGVcbn0gZnJvbSAnZXN0cmVlJztcblxuaW1wb3J0IGVzbGludFBsdWdpblVuaWNvcm4gZnJvbSAnZXNsaW50LXBsdWdpbi11bmljb3JuJztcblxuLyoqXG4gKiBUaGUgaWQgb2YgdGhlIHVuaWNvcm4gcnVsZSB0aGlzIHJ1bGUgZGVsZWdhdGVzIHRvLCBpbnNpZGUgdGhlIGB1bmljb3JuYCBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBVTklDT1JOX1JVTEVfTkFNRSA9ICdwcmVmZXItbG9naWNhbC1vcGVyYXRvci1vdmVyLXRlcm5hcnknO1xuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGlkIHVuaWNvcm4gcmVwb3J0cyBhIHRlcm5hcnkgdW5kZXIgd2hlbiBhIGxvZ2ljYWwgb3BlcmF0b3IgY291bGQgcmVwbGFjZSBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAncHJlZmVyLWxvZ2ljYWwtb3BlcmF0b3Itb3Zlci10ZXJuYXJ5L2Vycm9yJztcblxudHlwZSBMb2dpY2FsT3BlcmF0b3IgPSAnJiYnIHwgJ3x8JztcblxudHlwZSBVbmljb3JuUmVwb3J0RGVzY3JpcHRvciA9IFJ1bGUuUmVwb3J0RGVzY3JpcHRvck9wdGlvbnMgJiBVbmljb3JuUmVwb3J0RGVzY3JpcHRvckZpZWxkcztcblxuaW50ZXJmYWNlIFVuaWNvcm5SZXBvcnREZXNjcmlwdG9yRmllbGRzIHtcbiAgcmVhZG9ubHkgbWVzc2FnZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBub2RlOiBOb2RlO1xufVxuXG5jb25zdCB1bmljb3JuUnVsZSA9IGdldFVuaWNvcm5SdWxlKCk7XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgcmVwb3J0aW5nIHdoYXQgYHVuaWNvcm4vcHJlZmVyLWxvZ2ljYWwtb3BlcmF0b3Itb3Zlci10ZXJuYXJ5YCByZXBvcnRzLCBmaXhpbmcgYSB0ZXJuYXJ5IHdpdGggYSBib29sZWFuXG4gKiBsaXRlcmFsIGJyYW5jaCBpbiBhIFR5cGVTY3JpcHQgZmlsZSB0b28uXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVmZXJMb2dpY2FsT3BlcmF0b3JPdmVyVGVybmFyeTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IHJlcG9ydGluZ0NvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQgPSBPYmplY3QuY3JlYXRlKGNvbnRleHQsIHtcbiAgICAgIHJlcG9ydDoge1xuICAgICAgICB2YWx1ZShkZXNjcmlwdG9yOiBSdWxlLlJlcG9ydERlc2NyaXB0b3IpOiB2b2lkIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh3aXRoTGl0ZXJhbEJyYW5jaEZpeChkZXNjcmlwdG9yLCBjb250ZXh0LnNvdXJjZUNvZGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVuaWNvcm5SdWxlLmNyZWF0ZShyZXBvcnRpbmdDb250ZXh0KTtcbiAgfSxcbiAgbWV0YToge1xuICAgIC4uLnVuaWNvcm5SdWxlLm1ldGEsXG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmVmZXIgYSBsb2dpY2FsIG9wZXJhdG9yIG92ZXIgYSB0ZXJuYXJ5LCBmaXhpbmcgYSBib29sZWFuIGxpdGVyYWwgYnJhbmNoIGluIFR5cGVTY3JpcHQgdG9vJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0Qm9vbGVhbkxpdGVyYWxWYWx1ZShub2RlOiBOb2RlKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdMaXRlcmFsJyAmJiB0eXBlb2Ygbm9kZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gbm9kZS52YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pY29yblJ1bGUoKTogUnVsZS5SdWxlTW9kdWxlIHtcbiAgY29uc3QgcnVsZSA9IGVzbGludFBsdWdpblVuaWNvcm4ucnVsZXM/LltVTklDT1JOX1JVTEVfTkFNRV07XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEd1YXJkcyBhbiB1cGdyYWRlIG9mIGVzbGludC1wbHVnaW4tdW5pY29ybiB0aGF0IGRyb3BzIG9yIHJlbmFtZXMgdGhlIHJ1bGUuICovXG4gIGlmICghcnVsZSB8fCB0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXNsaW50LXBsdWdpbi11bmljb3JuIG5vIGxvbmdlciBkZWZpbmVzIHRoZSAke1VOSUNPUk5fUlVMRV9OQU1FfSBydWxlLmApO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgcmV0dXJuIHJ1bGU7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUGFyZW50aGVzZXMobm9kZTogRXhwcmVzc2lvbiwgb3BlcmF0b3I6ICchJyB8IExvZ2ljYWxPcGVyYXRvcik6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ0FycmF5RXhwcmVzc2lvbic6XG4gICAgY2FzZSAnQXdhaXRFeHByZXNzaW9uJzpcbiAgICBjYXNlICdDYWxsRXhwcmVzc2lvbic6XG4gICAgY2FzZSAnQ2hhaW5FeHByZXNzaW9uJzpcbiAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICBjYXNlICdMaXRlcmFsJzpcbiAgICBjYXNlICdNZW1iZXJFeHByZXNzaW9uJzpcbiAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICBjYXNlICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nOlxuICAgIGNhc2UgJ1RlbXBsYXRlTGl0ZXJhbCc6XG4gICAgY2FzZSAnVGhpc0V4cHJlc3Npb24nOlxuICAgIGNhc2UgJ1VuYXJ5RXhwcmVzc2lvbic6IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6IHtcbiAgICAgIHJldHVybiBvcGVyYXRvciA9PT0gJyEnO1xuICAgIH1cbiAgICBjYXNlICdMb2dpY2FsRXhwcmVzc2lvbic6IHtcbiAgICAgIHJldHVybiBvcGVyYXRvciA9PT0gJyEnIHx8IG5vZGUub3BlcmF0b3IgPT09ICc/PycgfHwgKG9wZXJhdG9yID09PSAnJiYnICYmIG5vZGUub3BlcmF0b3IgPT09ICd8fCcpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9PcGVyYW5kVGV4dChub2RlOiBFeHByZXNzaW9uLCBvcGVyYXRvcjogJyEnIHwgTG9naWNhbE9wZXJhdG9yLCBzb3VyY2VDb2RlOiBSdWxlLlJ1bGVDb250ZXh0Wydzb3VyY2VDb2RlJ10pOiBzdHJpbmcge1xuICBjb25zdCB0ZXh0ID0gc291cmNlQ29kZS5nZXRUZXh0KG5vZGUpO1xuICByZXR1cm4gbmVlZHNQYXJlbnRoZXNlcyhub2RlLCBvcGVyYXRvcikgPyBgKCR7dGV4dH0pYCA6IHRleHQ7XG59XG5cbmZ1bmN0aW9uIHdpdGhMaXRlcmFsQnJhbmNoRml4KGRlc2NyaXB0b3I6IFJ1bGUuUmVwb3J0RGVzY3JpcHRvciwgc291cmNlQ29kZTogUnVsZS5SdWxlQ29udGV4dFsnc291cmNlQ29kZSddKTogUnVsZS5SZXBvcnREZXNjcmlwdG9yIHtcbiAgY29uc3QgeyBmaXgsIG1lc3NhZ2VJZCwgbm9kZSwgc3VnZ2VzdCB9ID0gZGVzY3JpcHRvciBhcyBVbmljb3JuUmVwb3J0RGVzY3JpcHRvcjtcblxuICAvLyBVbmljb3JuIGZpeGVzIHRoZSBzaGFwZSBpdHNlbGYgb3V0c2lkZSBUeXBlU2NyaXB0LCBhbmQgb2ZmZXJzIHN1Z2dlc3Rpb25zIGZvciB0aGUgc2hhcGVzIGl0IGNhbm5vdCBmaXguXG4gIGlmIChtZXNzYWdlSWQgIT09IE1FU1NBR0VfSUQgfHwgZml4IHx8IHN1Z2dlc3QpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfVxuXG4gIC8vIFVuaWNvcm4gcmVwb3J0cyB0aGlzIG1lc3NhZ2Ugb24gdGhlIHRlcm5hcnkgaXRzZWxmLlxuICBjb25zdCBjb25kaXRpb25hbEV4cHJlc3Npb24gPSBub2RlIGFzIENvbmRpdGlvbmFsRXhwcmVzc2lvbjtcbiAgY29uc3QgeyBhbHRlcm5hdGUsIGNvbnNlcXVlbnQsIHRlc3QgfSA9IGNvbmRpdGlvbmFsRXhwcmVzc2lvbjtcbiAgY29uc3QgY29uc2VxdWVudFZhbHVlID0gZ2V0Qm9vbGVhbkxpdGVyYWxWYWx1ZShjb25zZXF1ZW50KTtcbiAgY29uc3QgYWx0ZXJuYXRlVmFsdWUgPSBnZXRCb29sZWFuTGl0ZXJhbFZhbHVlKGFsdGVybmF0ZSk7XG4gIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IGNvbnNlcXVlbnRWYWx1ZSA/PyBhbHRlcm5hdGVWYWx1ZTtcblxuICBpZiAoXG4gICAgbGl0ZXJhbFZhbHVlID09PSB1bmRlZmluZWRcbiAgICB8fCAoY29uc2VxdWVudFZhbHVlICE9PSB1bmRlZmluZWQgJiYgYWx0ZXJuYXRlVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICB8fCBzb3VyY2VDb2RlLmdldENvbW1lbnRzSW5zaWRlKGNvbmRpdGlvbmFsRXhwcmVzc2lvbikubGVuZ3RoID4gMFxuICApIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfVxuXG4gIGNvbnN0IGlzQ29uc2VxdWVudExpdGVyYWwgPSBjb25zZXF1ZW50VmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgb3RoZXIgPSBpc0NvbnNlcXVlbnRMaXRlcmFsID8gYWx0ZXJuYXRlIDogY29uc2VxdWVudDtcbiAgY29uc3Qgc2hvdWxkTmVnYXRlVGVzdCA9IGlzQ29uc2VxdWVudExpdGVyYWwgIT09IGxpdGVyYWxWYWx1ZTtcbiAgY29uc3Qgb3BlcmF0b3I6IExvZ2ljYWxPcGVyYXRvciA9IGxpdGVyYWxWYWx1ZSA/ICd8fCcgOiAnJiYnO1xuICBjb25zdCB0ZXN0VGV4dCA9IHNob3VsZE5lZ2F0ZVRlc3QgPyBgISR7dG9PcGVyYW5kVGV4dCh0ZXN0LCAnIScsIHNvdXJjZUNvZGUpfWAgOiB0b09wZXJhbmRUZXh0KHRlc3QsIG9wZXJhdG9yLCBzb3VyY2VDb2RlKTtcbiAgY29uc3Qgb3RoZXJUZXh0ID0gdG9PcGVyYW5kVGV4dChvdGhlciwgb3BlcmF0b3IsIHNvdXJjZUNvZGUpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uZGVzY3JpcHRvcixcbiAgICBmaXgoZml4ZXIpOiBSdWxlLkZpeCB7XG4gICAgICByZXR1cm4gZml4ZXIucmVwbGFjZVRleHQoY29uZGl0aW9uYWxFeHByZXNzaW9uLCBgJHt0ZXN0VGV4dH0gJHtvcGVyYXRvcn0gJHtvdGhlclRleHR9YCk7XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxPQUFPLHlCQUF5QjtBQUt6QixNQUFNLG9CQUFvQjtBQUsxQixNQUFNLGFBQWE7QUFXMUIsTUFBTSxjQUFjLGVBQWU7QUFNNUIsTUFBTSxtQ0FBb0Q7QUFBQSxFQUMvRCxPQUFPLFNBQVM7QUFDZCxVQUFNLG1CQUFxQyxPQUFPLE9BQU8sU0FBUztBQUFBLE1BQ2hFLFFBQVE7QUFBQSxRQUNOLE1BQU0sWUFBeUM7QUFDN0Msa0JBQVEsT0FBTyxxQkFBcUIsWUFBWSxRQUFRLFVBQVUsQ0FBQztBQUFBLFFBQ3JFO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUVELFdBQU8sWUFBWSxPQUFPLGdCQUFnQjtBQUFBLEVBQzVDO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDSixHQUFHLFlBQVk7QUFBQSxJQUNmLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyx1QkFBdUIsTUFBaUM7QUFDL0QsU0FBTyxLQUFLLFNBQVMsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLEtBQUssUUFBUTtBQUNuRjtBQUVBLFNBQVMsaUJBQWtDO0FBQ3pDLFFBQU0sT0FBTyxvQkFBb0IsUUFBUSxpQkFBaUI7QUFHMUQsTUFBSSxDQUFDLFFBQVEsT0FBTyxTQUFTLFlBQVk7QUFDdkMsVUFBTSxJQUFJLE1BQU0sK0NBQStDLGlCQUFpQixRQUFRO0FBQUEsRUFDMUY7QUFHQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixNQUFrQixVQUEwQztBQUNwRixVQUFRLEtBQUssTUFBTTtBQUFBLElBQ2pCLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUssbUJBQW1CO0FBQ3RCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLG9CQUFvQjtBQUN2QixhQUFPLGFBQWE7QUFBQSxJQUN0QjtBQUFBLElBQ0EsS0FBSyxxQkFBcUI7QUFDeEIsYUFBTyxhQUFhLE9BQU8sS0FBSyxhQUFhLFFBQVMsYUFBYSxRQUFRLEtBQUssYUFBYTtBQUFBLElBQy9GO0FBQUEsSUFDQSxTQUFTO0FBQ1AsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGNBQWMsTUFBa0IsVUFBaUMsWUFBb0Q7QUFDNUgsUUFBTSxPQUFPLFdBQVcsUUFBUSxJQUFJO0FBQ3BDLFNBQU8saUJBQWlCLE1BQU0sUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNO0FBQzFEO0FBRUEsU0FBUyxxQkFBcUIsWUFBbUMsWUFBbUU7QUFDbEksUUFBTSxFQUFFLEtBQUssV0FBVyxNQUFNLFFBQVEsSUFBSTtBQUcxQyxNQUFJLGNBQWMsY0FBYyxPQUFPLFNBQVM7QUFDOUMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxRQUFNLHdCQUF3QjtBQUM5QixRQUFNLEVBQUUsV0FBVyxZQUFZLEtBQUssSUFBSTtBQUN4QyxRQUFNLGtCQUFrQix1QkFBdUIsVUFBVTtBQUN6RCxRQUFNLGlCQUFpQix1QkFBdUIsU0FBUztBQUN2RCxRQUFNLGVBQWUsbUJBQW1CO0FBRXhDLE1BQ0UsaUJBQWlCLFVBQ2Isb0JBQW9CLFVBQWEsbUJBQW1CLFVBQ3JELFdBQVcsa0JBQWtCLHFCQUFxQixFQUFFLFNBQVMsR0FDaEU7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sc0JBQXNCLG9CQUFvQjtBQUNoRCxRQUFNLFFBQVEsc0JBQXNCLFlBQVk7QUFDaEQsUUFBTSxtQkFBbUIsd0JBQXdCO0FBQ2pELFFBQU0sV0FBNEIsZUFBZSxPQUFPO0FBQ3hELFFBQU0sV0FBVyxtQkFBbUIsSUFBSSxjQUFjLE1BQU0sS0FBSyxVQUFVLENBQUMsS0FBSyxjQUFjLE1BQU0sVUFBVSxVQUFVO0FBQ3pILFFBQU0sWUFBWSxjQUFjLE9BQU8sVUFBVSxVQUFVO0FBRTNELFNBQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILElBQUksT0FBaUI7QUFDbkIsYUFBTyxNQUFNLFlBQVksdUJBQXVCLEdBQUcsUUFBUSxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUU7QUFBQSxJQUN4RjtBQUFBLEVBQ0Y7QUFDRjsiLCJuYW1lcyI6W119
@@ -12,10 +12,29 @@ export interface GetNanoStagedConfigOptions {
12
12
  * Repo-specific file-rewriting tasks, keyed by the nano-staged pattern that claims their files.
13
13
  *
14
14
  * Each gets spellcheck appended and its files removed from the spellcheck-only key, exactly like the shared
15
- * writers. A pattern must not contain `/`, and must not repeat a shared writer pattern.
15
+ * writers. A pattern must not contain `/`, and must not repeat a shared writer pattern. Each command is a
16
+ * prefix the staged paths are appended to, in batches, like the shared ones (`npm run lint:fix --`).
16
17
  */
17
18
  readonly additionalWriterTasks?: Readonly<Record<string, readonly string[]>>;
18
19
  }
20
+ /**
21
+ * A nano-staged configuration whose every key is a {@link NanoStagedTask}.
22
+ */
23
+ export type NanoStagedConfig = Record<string, NanoStagedTask>;
24
+ /**
25
+ * A function-valued nano-staged task: it receives the staged files its pattern claims and returns the
26
+ * commands to run over them, in order.
27
+ */
28
+ export type NanoStagedTask = (context: NanoStagedTaskContext) => string[];
29
+ /**
30
+ * What nano-staged passes to a function-valued task.
31
+ */
32
+ export interface NanoStagedTaskContext {
33
+ /**
34
+ * The absolute paths of the staged files the task's pattern claims.
35
+ */
36
+ readonly filenames: readonly string[];
37
+ }
19
38
  /**
20
39
  * Nano-staged configuration that runs file-based lint, format, and spellcheck on staged files.
21
40
  *
@@ -23,14 +42,15 @@ export interface GetNanoStagedConfigOptions {
23
42
  * (TypeScript compilation, unit tests) are left to CI.
24
43
  *
25
44
  * Commands run through the package manager that owns the tree — `npm run ... --`, `bun run ... --`, and
26
- * so on — so nano-staged file paths are forwarded as CLI arguments.
45
+ * so on — so nano-staged file paths are forwarded as CLI arguments, batched to fit the command line (see
46
+ * `toBatchedTask`).
27
47
  *
28
48
  * Spellcheck is partitioned across the keys rather than given a catch-all `'*'` key (see
29
49
  * `partitionSpellcheck`). A repo adding a file-rewriting task of its own passes it to
30
50
  * {@link getNanoStagedConfig} as `additionalWriterTasks` rather than spreading this object and adding a key,
31
51
  * which would reintroduce the overlap for that key's files.
32
52
  */
33
- export declare const obsidianDevUtilsConfig: Record<string, string[]>;
53
+ export declare const obsidianDevUtilsConfig: NanoStagedConfig;
34
54
  /**
35
55
  * Resolves the nano-staged configuration to use, honoring a per-developer opt-out.
36
56
  *
@@ -51,4 +71,4 @@ export declare const obsidianDevUtilsConfig: Record<string, string[]>;
51
71
  * @param options - The optional options.
52
72
  * @returns The nano-staged task configuration. Does not return when the opt-out is active.
53
73
  */
54
- export declare function getNanoStagedConfig(options?: GetNanoStagedConfigOptions): Record<string, string[]>;
74
+ export declare function getNanoStagedConfig(options?: GetNanoStagedConfigOptions): NanoStagedConfig;
@@ -3,14 +3,24 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
5
 
6
+ import {
7
+ isAbsolute,
8
+ relative
9
+ } from "node:path";
6
10
  import process from "node:process";
7
11
  import {
8
12
  isEnvVariableOff,
9
13
  loadEnvFileIfExists
10
14
  } from "./env-toggle.mjs";
15
+ import {
16
+ getEffectiveCommandLineLength,
17
+ getMaxBatchCommandLength
18
+ } from "./exec.mjs";
11
19
  import { getPackageManagerRunCommand } from "./package-manager.mjs";
12
20
  const PACKAGE_MANAGER_RUN_COMMAND = getPackageManagerRunCommand().join(" ");
13
21
  const SPELLCHECK_COMMAND = `${PACKAGE_MANAGER_RUN_COMMAND} spellcheck --`;
22
+ const EXECUTABLE_PATH_RESERVE = 260;
23
+ const TOKENIZER_UNSAFE_CHARACTERS_REG_EXP = /[\s"']/g;
14
24
  const WRITER_TASKS = {
15
25
  "*.{ts,tsx,mts}": [
16
26
  `${PACKAGE_MANAGER_RUN_COMMAND} lint:fix --`,
@@ -39,6 +49,27 @@ function getNanoStagedConfig(options) {
39
49
  }
40
50
  return partitionSpellcheck({ ...WRITER_TASKS, ...additionalWriterTasks });
41
51
  }
52
+ function batchCommandArguments(prefix, commandArguments) {
53
+ const emptyLength = getEffectiveCommandLineLength("");
54
+ const budget = getMaxBatchCommandLength() - EXECUTABLE_PATH_RESERVE - getEffectiveCommandLineLength(prefix);
55
+ const batches = [];
56
+ let batch = [];
57
+ let batchLength = 0;
58
+ for (const commandArgument of commandArguments) {
59
+ const argumentLength = getEffectiveCommandLineLength(` "${commandArgument}"`) - emptyLength;
60
+ if (batch.length > 0 && batchLength + argumentLength > budget) {
61
+ batches.push(batch);
62
+ batch = [];
63
+ batchLength = 0;
64
+ }
65
+ batch.push(commandArgument);
66
+ batchLength += argumentLength;
67
+ }
68
+ if (batch.length > 0) {
69
+ batches.push(batch);
70
+ }
71
+ return batches;
72
+ }
42
73
  function partitionSpellcheck(writerTasks) {
43
74
  const patterns = Object.keys(writerTasks);
44
75
  const patternWithSlash = patterns.find((pattern) => pattern.includes("/"));
@@ -47,15 +78,29 @@ function partitionSpellcheck(writerTasks) {
47
78
  }
48
79
  const complementPattern = `!(${patterns.map((pattern) => `${pattern}!(?)`).join("|")})*`;
49
80
  const config = {
50
- [complementPattern]: [SPELLCHECK_COMMAND]
81
+ [complementPattern]: toBatchedTask([SPELLCHECK_COMMAND])
51
82
  };
52
83
  for (const [pattern, commands] of Object.entries(writerTasks)) {
53
- config[pattern] = [...commands, SPELLCHECK_COMMAND];
84
+ config[pattern] = toBatchedTask([...commands, SPELLCHECK_COMMAND]);
54
85
  }
55
86
  return config;
56
87
  }
88
+ function toBatchedTask(commands) {
89
+ return ({ filenames }) => {
90
+ const commandArguments = filenames.map((filename) => toCommandArgument(filename));
91
+ return commands.flatMap((command) => batchCommandArguments(command, commandArguments).map((batch) => `${command} ${batch.join(" ")}`));
92
+ };
93
+ }
94
+ function toCommandArgument(filename) {
95
+ const relativePath = relative(process.cwd(), filename);
96
+ let commandArgument = (relativePath.startsWith("..") || isAbsolute(relativePath) ? filename : relativePath).replaceAll("\\", "/");
97
+ if (commandArgument.startsWith("-")) {
98
+ commandArgument = `./${commandArgument}`;
99
+ }
100
+ return commandArgument.replaceAll(TOKENIZER_UNSAFE_CHARACTERS_REG_EXP, "?");
101
+ }
57
102
  export {
58
103
  getNanoStagedConfig,
59
104
  obsidianDevUtilsConfig
60
105
  };
61
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIGlzRW52VmFyaWFibGVPZmYsXG4gIGxvYWRFbnZGaWxlSWZFeGlzdHNcbn0gZnJvbSAnLi9lbnYtdG9nZ2xlLnRzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZCB9IGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0TmFub1N0YWdlZENvbmZpZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0TmFub1N0YWdlZENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogUmVwby1zcGVjaWZpYyBmaWxlLXJld3JpdGluZyB0YXNrcywga2V5ZWQgYnkgdGhlIG5hbm8tc3RhZ2VkIHBhdHRlcm4gdGhhdCBjbGFpbXMgdGhlaXIgZmlsZXMuXG4gICAqXG4gICAqIEVhY2ggZ2V0cyBzcGVsbGNoZWNrIGFwcGVuZGVkIGFuZCBpdHMgZmlsZXMgcmVtb3ZlZCBmcm9tIHRoZSBzcGVsbGNoZWNrLW9ubHkga2V5LCBleGFjdGx5IGxpa2UgdGhlIHNoYXJlZFxuICAgKiB3cml0ZXJzLiBBIHBhdHRlcm4gbXVzdCBub3QgY29udGFpbiBgL2AsIGFuZCBtdXN0IG5vdCByZXBlYXQgYSBzaGFyZWQgd3JpdGVyIHBhdHRlcm4uXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsV3JpdGVyVGFza3M/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xufVxuXG4vKipcbiAqIFRoZSBgPG1hbmFnZXI+IHJ1bmAgcHJlZml4IGV2ZXJ5IHRhc2sgYmVsb3cgaXMgYnVpbHQgb24sIHJlc29sdmVkIG9uY2UgZm9yIHRoZSBwcm9jZXNzLlxuICpcbiAqIERldGVjdGlvbiBwcm9iZXMgZm9yIGEgbG9ja2ZpbGUgYmVzaWRlIGBwYWNrYWdlLmpzb25gLCBzbyBpdCBpcyBhIGhhbmRmdWwgb2YgYGV4aXN0c1N5bmNgIGNhbGxzIGFuZFxuICogbm90aGluZyBtb3JlIFx1MjAxNCBubyBgLmVudmAgcmVhZCBhbmQgbm8gYHByb2Nlc3MuZXhpdGAsIHdoaWNoIGlzIHdoYXQgbGV0cyBpdCBzaXQgYXQgbW9kdWxlIHNjb3BlLlxuICovXG5jb25zdCBQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkQgPSBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKS5qb2luKCcgJyk7XG5cbmNvbnN0IFNQRUxMQ0hFQ0tfQ09NTUFORCA9IGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gc3BlbGxjaGVjayAtLWA7XG5cbi8qKlxuICogVGhlIHRhc2tzIHRoYXQgUkVXUklURSBhIHN0YWdlZCBmaWxlLCBrZXllZCBieSB0aGUgbmFuby1zdGFnZWQgcGF0dGVybiB0aGF0IGNsYWltcyBpdC5cbiAqXG4gKiBgbGludDpmaXhgIGFuZCBgZm9ybWF0YCBib3RoIHJld3JpdGUgdGhlIGZpbGUsIHNvIHRoZXkgaGF2ZSB0byBzaGFyZSBvbmUga2V5OiBuYW5vLXN0YWdlZCBydW5zIGl0c1xuICogcGVyLXBhdHRlcm4gZ3JvdXBzIHVuZGVyIGBQcm9taXNlLmFsbGAgKGBydW4oKWAgaW4gYG5hbm8tc3RhZ2VkL2xpYi9jbWQtcnVubmVyLmpzYCksIGFuZCBzZXF1ZW5jZXMgb25seVxuICogdGhlIGNvbW1hbmRzIElOU0lERSBhIHNpbmdsZSBrZXkncyBhcnJheSAoYHJ1blRhc2soKWAsIGEgYGZvciAuLi4gb2YgYXdhaXRgKS4gU3BsaXQgYWNyb3NzIHR3byBrZXlzIHRoZXlcbiAqIHJhY2UsIHdoaWNoZXZlciBmaW5pc2hlcyBsYXN0IHdpbnMsIGFuZCB0aGUgY29tbWl0IHN0YWdlcyBieXRlcyB0aGF0IG5laXRoZXIgdG9vbCB3b3VsZCBoYXZlIHByb2R1Y2VkIG9uXG4gKiBpdHMgb3duLlxuICpcbiAqIFNvIGRvIE5PVCBleHByZXNzIGEgZGlyZWN0b3J5IGV4Y2x1c2lvbiBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHR3byBpdHMgb3duIG5lZ2F0ZWQga2V5IC0tIHRoYXQgc2lsZW50bHlcbiAqIHRha2VzIHRoZSBvcmRlcmluZyBhd2F5LiBBbiBleGNsdXNpb24gYmVsb25ncyBpbiB0aGUgZXhjbHVkZWQgdG9vbCdzIG93biBjb25maWcsIHdoZXJlIEVTTGludCdzXG4gKiBgZ2xvYmFsSWdub3Jlc2AgYWxyZWFkeSBwdXRzIGl0OiBhIHBhdGggRVNMaW50IGlnbm9yZXMgaXMgcmVwb3J0ZWQgYXMgYSB3YXJuaW5nIGFuZCBleGl0cyAwIHdoZW4gaXQgaXNcbiAqIHBhc3NlZCBleHBsaWNpdGx5LCBzbyBpdCBjb3N0cyBhIGNvbnNvbGUgbGluZSByYXRoZXIgdGhhbiBhIGZhaWxlZCBjb21taXQgYW5kIG5lZWRzIG5vIGtleSBoZXJlLlxuICovXG5jb25zdCBXUklURVJfVEFTS1M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4gPSB7XG4gICcqLnt0cyx0c3gsbXRzfSc6IFtcbiAgICBgJHtQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkR9IGxpbnQ6Zml4IC0tYCxcbiAgICBgJHtQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkR9IGZvcm1hdCAtLWBcbiAgXSxcbiAgJyoubWQnOiBbXG4gICAgYCR7UEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EfSBsaW50Om1kOmZpeCAtLWBcbiAgXVxufTtcblxuLyoqXG4gKiBOYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIHRoYXQgcnVucyBmaWxlLWJhc2VkIGxpbnQsIGZvcm1hdCwgYW5kIHNwZWxsY2hlY2sgb24gc3RhZ2VkIGZpbGVzLlxuICpcbiAqIE9ubHkgaW5jbHVkZXMgdG9vbHMgdGhhdCBjYW4gb3BlcmF0ZSBvbiBpbmRpdmlkdWFsIGZpbGVzLiBXaG9sZS1wcm9qZWN0IGNoZWNrc1xuICogKFR5cGVTY3JpcHQgY29tcGlsYXRpb24sIHVuaXQgdGVzdHMpIGFyZSBsZWZ0IHRvIENJLlxuICpcbiAqIENvbW1hbmRzIHJ1biB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIgdGhhdCBvd25zIHRoZSB0cmVlIFx1MjAxNCBgbnBtIHJ1biAuLi4gLS1gLCBgYnVuIHJ1biAuLi4gLS1gLCBhbmRcbiAqIHNvIG9uIFx1MjAxNCBzbyBuYW5vLXN0YWdlZCBmaWxlIHBhdGhzIGFyZSBmb3J3YXJkZWQgYXMgQ0xJIGFyZ3VtZW50cy5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0gcGFydGl0aW9uU3BlbGxjaGVjayhXUklURVJfVEFTS1MpO1xuXG5jb25zdCBOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEUgPSAnTkFOT19TVEFHRUQnO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIHRvIHVzZSwgaG9ub3JpbmcgYSBwZXItZGV2ZWxvcGVyIG9wdC1vdXQuXG4gKlxuICogTG9hZHMgYSBnaXRpZ25vcmVkIGAuZW52YCBpZiBwcmVzZW50LCB0aGVuIFx1MjAxNCB3aGVuIGBOQU5PX1NUQUdFRGAgaXMgc2V0IHRvIGFuIG9mZiB2YWx1ZSAoYDBgLCBgZmFsc2VgLFxuICogYG9mZmAsIG9yIGBub2ApIFx1MjAxNCBwcmludHMgYSBub3RpY2UgYW5kIGV4aXRzIHRoZSBwcm9jZXNzIHN1Y2Nlc3NmdWxseSBzbyB0aGUgcHJlLWNvbW1pdCBjaGVja3MgYXJlXG4gKiBza2lwcGVkLiBUaGlzIG1pcnJvcnMgaHVza3kncyBvd24gYEhVU0tZPTBgIHN3aXRjaCwgYnV0IHNjb3BlZCB0byB0aGUgbmFuby1zdGFnZWQgc3RlcCAoc28gdGhlXG4gKiBjb21taXQtbXNnIGhvb2sgc3RpbGwgcnVucykuIE90aGVyd2lzZSBpdCByZXR1cm5zIHtAbGluayBvYnNpZGlhbkRldlV0aWxzQ29uZmlnfSwgb3IgXHUyMDE0IHdoZW5cbiAqIGBhZGRpdGlvbmFsV3JpdGVyVGFza3NgIGFyZSBnaXZlbiBcdTIwMTQgdGhlIHNhbWUgY29uZmlndXJhdGlvbiByZS1wYXJ0aXRpb25lZCB3aXRoIHRob3NlIHdyaXRlcnMgYWRkZWQuXG4gKlxuICogYE5BTk9fU1RBR0VEYCBpcyBub3QgYW4gbnBtIHNjcmlwdCwgc28gaXQgY2FycmllcyBpdHMgb3duIHN3aXRjaCByYXRoZXIgdGhhbiB0aGUgc2NyaXB0LW5hbWUtZGVyaXZlZCBvbmVcbiAqIGV2ZXJ5IG5wbSBzY3JpcHQgZ2V0cyBcdTIwMTQgYnV0IGJvdGggc2hhcmUgdGhlIHNhbWUgbm90aW9uIG9mIGFuIG9mZiB2YWx1ZSwgdmlhIHtAbGluayBpc0VudlZhcmlhYmxlT2ZmfS5cbiAqXG4gKiBUaGlzIGlzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gbW9kdWxlLWxldmVsIGNvZGUgc28gaW1wb3J0aW5nIHRoZSBwYWNrYWdlIGJhcnJlbCBuZXZlciB0cmlnZ2VycyB0aGVcbiAqIGAuZW52YCByZWFkIG9yIHRoZSBwcm9jZXNzIGV4aXQ7IGNhbGwgaXQgZnJvbSB0aGUgdGhpbiBgc2NyaXB0cy9uYW5vLXN0YWdlZC1jb25maWcudHNgIGVudHJ5LiBSZXNvbHZpbmcgdGhlXG4gKiBwYWNrYWdlIG1hbmFnZXIgaXMgdGhlIG9uZSB0aGluZyB0aGF0IGRvZXMgcnVuIGF0IG1vZHVsZSBzY29wZSwgYW5kIGl0IGRvZXMgbmVpdGhlciBvZiB0aG9zZSB0d29cbiAqIHRoaW5ncyBcdTIwMTQgaXQgb25seSBwcm9iZXMgZm9yIGEgbG9ja2ZpbGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uYWwgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBuYW5vLXN0YWdlZCB0YXNrIGNvbmZpZ3VyYXRpb24uIERvZXMgbm90IHJldHVybiB3aGVuIHRoZSBvcHQtb3V0IGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbm9TdGFnZWRDb25maWcob3B0aW9ucz86IEdldE5hbm9TdGFnZWRDb25maWdPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcbiAgbG9hZEVudkZpbGVJZkV4aXN0cygpO1xuXG4gIGlmIChpc0VudlZhcmlhYmxlT2ZmKE5BTk9fU1RBR0VEX0VOVl9WQVJJQUJMRSkpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgbmFuby1zdGFnZWQ6IHNraXBwZWQgKCR7TkFOT19TVEFHRURfRU5WX1ZBUklBQkxFfSBpcyBvZmYpLlxcbmApO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uYWxXcml0ZXJUYXNrcyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxXcml0ZXJUYXNrcyA/PyB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKGFkZGl0aW9uYWxXcml0ZXJUYXNrcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9ic2lkaWFuRGV2VXRpbHNDb25maWc7XG4gIH1cblxuICBjb25zdCBkdXBsaWNhdGVQYXR0ZXJuID0gT2JqZWN0LmtleXMoYWRkaXRpb25hbFdyaXRlclRhc2tzKS5maW5kKChwYXR0ZXJuKSA9PiBPYmplY3QuaGFzT3duKFdSSVRFUl9UQVNLUywgcGF0dGVybikpO1xuICBpZiAoZHVwbGljYXRlUGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBuYW5vLXN0YWdlZCB3cml0ZXIgcGF0dGVybiAnJHtkdXBsaWNhdGVQYXR0ZXJufScgaXMgYWxyZWFkeSBhIHNoYXJlZCB3cml0ZXIgcGF0dGVybi5gKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0aXRpb25TcGVsbGNoZWNrKHsgLi4uV1JJVEVSX1RBU0tTLCAuLi5hZGRpdGlvbmFsV3JpdGVyVGFza3MgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBpbiB3aGljaCBzcGVsbGNoZWNrIG5ldmVyIHJlYWRzIGEgZmlsZSB3aGlsZSBhbm90aGVyIHRhc2sgcmV3cml0ZXMgaXQuXG4gKlxuICogVGhlIHNhbWUgYFByb21pc2UuYWxsYCB0aGF0IGZvcmNlcyB0d28gd3JpdGVycyBpbnRvIG9uZSBrZXkgbWFrZXMgYSBjYXRjaC1hbGwgYCcqJ2Agc3BlbGxjaGVjayBrZXkgcnVuXG4gKiBDT05DVVJSRU5UTFkgd2l0aCBldmVyeSB3cml0ZXIga2V5LCBzbyBjc3BlbGwgd291bGQgcmVhZCBhIGZpbGUgdGhhdCBFU0xpbnQgb3IgZHByaW50IGlzIHJld3JpdGluZyBpblxuICogcGxhY2UgLS0gYSBzcHVyaW91cyBmaW5kaW5nIG9uIGEgaGFsZi13cml0dGVuIGZpbGUsIG9yIGEgcGFzcyBvdmVyIGNvbnRlbnQgdGhhdCBpcyBub3Qgd2hhdCBnZXRzXG4gKiBjb21taXR0ZWQuIFNvIHRoZSBzdGFnZWQgZmlsZXMgYXJlIFBBUlRJVElPTkVEIGluc3RlYWQ6XG4gKlxuICogLSBldmVyeSB3cml0ZXIga2V5IGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhcyBpdHMgTEFTVCBjb21tYW5kLCBzbyBpdCByZWFkcyB0aGF0IGtleSdzIGZpbGVzIGFmdGVyIHRoZXlcbiAqICAgaGF2ZSBiZWVuIHJld3JpdHRlbjtcbiAqIC0gb25lIGNvbXBsZW1lbnQga2V5IHNwZWxsY2hlY2tzIGV4YWN0bHkgdGhlIGZpbGVzIG5vIHdyaXRlciBrZXkgY2xhaW1zLlxuICpcbiAqIFRoZSBjb21wbGVtZW50IGlzIHdyaXR0ZW4gaW4gbmFuby1zdGFnZWQncyBvd24gZ2xvYiBkaWFsZWN0LCB3aGljaCBjb21waWxlcyBgISguLi4pYCB0byBhIGxvb2thaGVhZCB0aGF0XG4gKiBpcyBOT1QgYW5jaG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aDogYCEoKi5tZCkqYCB3b3VsZCBleGNsdWRlIGBub3Rlcy5tZC5iYWtgIHRvby4gQSBuZXN0ZWQgYCEoPylgXG4gKiBjb21waWxlcyB0byBgKD8hLilgLCB3aGljaCBJUyBhbiBlbmQgYW5jaG9yLCBzbyBlYWNoIGFsdGVybmF0aXZlIGlzIHN1ZmZpeGVkIHdpdGggaXQuIEEgd3JpdGVyIHBhdHRlcm5cbiAqIGNvbnRhaW5pbmcgYC9gIHdvdWxkIHN3aXRjaCBuYW5vLXN0YWdlZCBpbnRvIGdsb2JzdGFyIG1vZGUsIHdoZXJlIGAqYCBzdG9wcyBjcm9zc2luZyBkaXJlY3RvcmllcyBhbmQgdGhlXG4gKiBjb25zdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhvbGRzIC0tIGhlbmNlIHRoZSB0aHJvdy4gVGhlIHVuaXQgdGVzdCBwaW5zIHRoZSBwYXJ0aXRpb24gYWdhaW5zdCB0aGUgaW5zdGFsbGVkXG4gKiBuYW5vLXN0YWdlZCBjb21waWxlciwgc28gYSByZWxlYXNlIHRoYXQgY2hhbmdlcyBpdHMgZGlhbGVjdCBmYWlscyB0aGVyZSByYXRoZXIgdGhhbiBpbiBhIGNvbW1pdC5cbiAqXG4gKiBAcGFyYW0gd3JpdGVyVGFza3MgLSBUaGUgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIHdpdGggdGhlIHNwZWxsY2hlY2sgc3RlcCBwYXJ0aXRpb25lZCBhY3Jvc3MgdGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvblNwZWxsY2hlY2sod3JpdGVyVGFza3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHdyaXRlclRhc2tzKTtcbiAgY29uc3QgcGF0dGVybldpdGhTbGFzaCA9IHBhdHRlcm5zLmZpbmQoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJy8nKSk7XG4gIGlmIChwYXR0ZXJuV2l0aFNsYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke3BhdHRlcm5XaXRoU2xhc2h9JyBjb250YWlucyAnLycsIHdoaWNoIHRoZSBzcGVsbGNoZWNrIHBhcnRpdGlvbiBjYW5ub3QgZXhwcmVzcy5gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbXBsZW1lbnRQYXR0ZXJuID0gYCEoJHtwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IGAke3BhdHRlcm59ISg/KWApLmpvaW4oJ3wnKX0pKmA7XG4gIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICAgIFtjb21wbGVtZW50UGF0dGVybl06IFtTUEVMTENIRUNLX0NPTU1BTkRdXG4gIH07XG5cbiAgZm9yIChjb25zdCBbcGF0dGVybiwgY29tbWFuZHNdIG9mIE9iamVjdC5lbnRyaWVzKHdyaXRlclRhc2tzKSkge1xuICAgIGNvbmZpZ1twYXR0ZXJuXSA9IFsuLi5jb21tYW5kcywgU1BFTExDSEVDS19DT01NQU5EXTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQU1BLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsbUNBQW1DO0FBcUI1QyxNQUFNLDhCQUE4Qiw0QkFBNEIsRUFBRSxLQUFLLEdBQUc7QUFFMUUsTUFBTSxxQkFBcUIsR0FBRywyQkFBMkI7QUFnQnpELE1BQU0sZUFBNEQ7QUFBQSxFQUNoRSxrQkFBa0I7QUFBQSxJQUNoQixHQUFHLDJCQUEyQjtBQUFBLElBQzlCLEdBQUcsMkJBQTJCO0FBQUEsRUFDaEM7QUFBQSxFQUNBLFFBQVE7QUFBQSxJQUNOLEdBQUcsMkJBQTJCO0FBQUEsRUFDaEM7QUFDRjtBQWdCTyxNQUFNLHlCQUFtRCxvQkFBb0IsWUFBWTtBQUVoRyxNQUFNLDJCQUEyQjtBQXNCMUIsU0FBUyxvQkFBb0IsU0FBZ0U7QUFDbEcsc0JBQW9CO0FBRXBCLE1BQUksaUJBQWlCLHdCQUF3QixHQUFHO0FBQzlDLFlBQVEsT0FBTyxNQUFNLHlCQUF5Qix3QkFBd0I7QUFBQSxDQUFhO0FBQ25GLFlBQVEsS0FBSyxDQUFDO0FBQUEsRUFDaEI7QUFFQSxRQUFNLHdCQUF3QixTQUFTLHlCQUF5QixDQUFDO0FBQ2pFLE1BQUksT0FBTyxLQUFLLHFCQUFxQixFQUFFLFdBQVcsR0FBRztBQUNuRCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQW1CLE9BQU8sS0FBSyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsWUFBWSxPQUFPLE9BQU8sY0FBYyxPQUFPLENBQUM7QUFDbEgsTUFBSSxxQkFBcUIsUUFBVztBQUNsQyxVQUFNLElBQUksTUFBTSwrQkFBK0IsZ0JBQWdCLHVDQUF1QztBQUFBLEVBQ3hHO0FBRUEsU0FBTyxvQkFBb0IsRUFBRSxHQUFHLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQztBQUMxRTtBQXdCQSxTQUFTLG9CQUFvQixhQUFvRjtBQUMvRyxRQUFNLFdBQVcsT0FBTyxLQUFLLFdBQVc7QUFDeEMsUUFBTSxtQkFBbUIsU0FBUyxLQUFLLENBQUMsWUFBWSxRQUFRLFNBQVMsR0FBRyxDQUFDO0FBQ3pFLE1BQUkscUJBQXFCLFFBQVc7QUFDbEMsVUFBTSxJQUFJLE1BQU0sK0JBQStCLGdCQUFnQixnRUFBZ0U7QUFBQSxFQUNqSTtBQUVBLFFBQU0sb0JBQW9CLEtBQUssU0FBUyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDO0FBQ3BGLFFBQU0sU0FBbUM7QUFBQSxJQUN2QyxDQUFDLGlCQUFpQixHQUFHLENBQUMsa0JBQWtCO0FBQUEsRUFDMUM7QUFFQSxhQUFXLENBQUMsU0FBUyxRQUFRLEtBQUssT0FBTyxRQUFRLFdBQVcsR0FBRztBQUM3RCxXQUFPLE9BQU8sSUFBSSxDQUFDLEdBQUcsVUFBVSxrQkFBa0I7QUFBQSxFQUNwRDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbm8tc3RhZ2VkLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBuYW5vLXN0YWdlZCBjb25maWd1cmF0aW9uIGZvciBwcmUtY29tbWl0IGhvb2tzLlxuICovXG5cbmltcG9ydCB7XG4gIGlzQWJzb2x1dGUsXG4gIHJlbGF0aXZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBpc0VudlZhcmlhYmxlT2ZmLFxuICBsb2FkRW52RmlsZUlmRXhpc3RzXG59IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5pbXBvcnQge1xuICBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCxcbiAgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoXG59IGZyb20gJy4vZXhlYy50cyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQgfSBmcm9tICcuL3BhY2thZ2UtbWFuYWdlci50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldE5hbm9TdGFnZWRDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE5hbm9TdGFnZWRDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcG8tc3BlY2lmaWMgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBuYW5vLXN0YWdlZCBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICAgKlxuICAgKiBFYWNoIGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhbmQgaXRzIGZpbGVzIHJlbW92ZWQgZnJvbSB0aGUgc3BlbGxjaGVjay1vbmx5IGtleSwgZXhhY3RseSBsaWtlIHRoZSBzaGFyZWRcbiAgICogd3JpdGVycy4gQSBwYXR0ZXJuIG11c3Qgbm90IGNvbnRhaW4gYC9gLCBhbmQgbXVzdCBub3QgcmVwZWF0IGEgc2hhcmVkIHdyaXRlciBwYXR0ZXJuLiBFYWNoIGNvbW1hbmQgaXMgYVxuICAgKiBwcmVmaXggdGhlIHN0YWdlZCBwYXRocyBhcmUgYXBwZW5kZWQgdG8sIGluIGJhdGNoZXMsIGxpa2UgdGhlIHNoYXJlZCBvbmVzIChgbnBtIHJ1biBsaW50OmZpeCAtLWApLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFdyaXRlclRhc2tzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pjtcbn1cblxuLyoqXG4gKiBBIG5hbm8tc3RhZ2VkIGNvbmZpZ3VyYXRpb24gd2hvc2UgZXZlcnkga2V5IGlzIGEge0BsaW5rIE5hbm9TdGFnZWRUYXNrfS5cbiAqL1xuZXhwb3J0IHR5cGUgTmFub1N0YWdlZENvbmZpZyA9IFJlY29yZDxzdHJpbmcsIE5hbm9TdGFnZWRUYXNrPjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCBuYW5vLXN0YWdlZCB0YXNrOiBpdCByZWNlaXZlcyB0aGUgc3RhZ2VkIGZpbGVzIGl0cyBwYXR0ZXJuIGNsYWltcyBhbmQgcmV0dXJucyB0aGVcbiAqIGNvbW1hbmRzIHRvIHJ1biBvdmVyIHRoZW0sIGluIG9yZGVyLlxuICovXG5leHBvcnQgdHlwZSBOYW5vU3RhZ2VkVGFzayA9IChjb250ZXh0OiBOYW5vU3RhZ2VkVGFza0NvbnRleHQpID0+IHN0cmluZ1tdO1xuXG4vKipcbiAqIFdoYXQgbmFuby1zdGFnZWQgcGFzc2VzIHRvIGEgZnVuY3Rpb24tdmFsdWVkIHRhc2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFub1N0YWdlZFRhc2tDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc3RhZ2VkIGZpbGVzIHRoZSB0YXNrJ3MgcGF0dGVybiBjbGFpbXMuXG4gICAqL1xuICByZWFkb25seSBmaWxlbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBgPG1hbmFnZXI+IHJ1bmAgcHJlZml4IGV2ZXJ5IHRhc2sgYmVsb3cgaXMgYnVpbHQgb24sIHJlc29sdmVkIG9uY2UgZm9yIHRoZSBwcm9jZXNzLlxuICpcbiAqIERldGVjdGlvbiBwcm9iZXMgZm9yIGEgbG9ja2ZpbGUgYmVzaWRlIGBwYWNrYWdlLmpzb25gLCBzbyBpdCBpcyBhIGhhbmRmdWwgb2YgYGV4aXN0c1N5bmNgIGNhbGxzIGFuZFxuICogbm90aGluZyBtb3JlIFx1MjAxNCBubyBgLmVudmAgcmVhZCBhbmQgbm8gYHByb2Nlc3MuZXhpdGAsIHdoaWNoIGlzIHdoYXQgbGV0cyBpdCBzaXQgYXQgbW9kdWxlIHNjb3BlLlxuICovXG5jb25zdCBQQUNLQUdFX01BTkFHRVJfUlVOX0NPTU1BTkQgPSBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKS5qb2luKCcgJyk7XG5cbmNvbnN0IFNQRUxMQ0hFQ0tfQ09NTUFORCA9IGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gc3BlbGxjaGVjayAtLWA7XG5cbi8qKlxuICogUm9vbSBsZWZ0IGluIGV2ZXJ5IGJhdGNoIGZvciB0aGUgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgcGFja2FnZSBtYW5hZ2VyJ3MgZXhlY3V0YWJsZS5cbiAqXG4gKiBuYW5vLXN0YWdlZCBydW5zIGBucG1gIGFzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGBucG0uY21kYCAoYDxjb21zcGVjPiAvRCAvUyAvQyBcIjxwYXRoPlwiIFwiPGFyZz5cIiBcdTIwMjZgKSwgd2hpY2hcbiAqIHRoZSBiYXRjaCBjYW5ub3Qgc2VlLCBzbyBhIGZ1bGwgV2luZG93cyBgTUFYX1BBVEhgIGlzIHNldCBhc2lkZSBmb3IgaXQuXG4gKi9cbmNvbnN0IEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFID0gMjYwO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXJzIG5hbm8tc3RhZ2VkJ3MgY29tbWFuZCB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IGluc2lkZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBBIGZ1bmN0aW9uLXZhbHVlZCB0YXNrIHJldHVybnMgaXRzIGNvbW1hbmRzIGFzIFNUUklOR1MsIGFuZCBuYW5vLXN0YWdlZCBzcGxpdHMgZWFjaCBvbmUgd2l0aFxuICogYHN0cmluZ0FyZ3ZUb0FycmF5YCwgd2hpY2ggZW1pdHMgYSBxdW90ZWQgdG9rZW4gdHdpY2UgKG9uY2UgYmFyZSwgb25jZSB3aXRoIGl0cyBxdW90ZXMpIGFuZCBoYXMgbm8gZXNjYXBlLlxuICogU28gYSBwYXRoIGhvbGRpbmcgd2hpdGVzcGFjZSBvciBhIHF1b3RlIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXRzZWxmLlxuICovXG5jb25zdCBUT0tFTklaRVJfVU5TQUZFX0NIQVJBQ1RFUlNfUkVHX0VYUCA9IC9bXFxzXCInXS9nO1xuXG4vKipcbiAqIFRoZSB0YXNrcyB0aGF0IFJFV1JJVEUgYSBzdGFnZWQgZmlsZSwga2V5ZWQgYnkgdGhlIG5hbm8tc3RhZ2VkIHBhdHRlcm4gdGhhdCBjbGFpbXMgaXQuXG4gKlxuICogYGxpbnQ6Zml4YCBhbmQgYGZvcm1hdGAgYm90aCByZXdyaXRlIHRoZSBmaWxlLCBzbyB0aGV5IGhhdmUgdG8gc2hhcmUgb25lIGtleTogbmFuby1zdGFnZWQgcnVucyBpdHNcbiAqIHBlci1wYXR0ZXJuIGdyb3VwcyB1bmRlciBgUHJvbWlzZS5hbGxgIChgcnVuKClgIGluIGBuYW5vLXN0YWdlZC9saWIvY21kLXJ1bm5lci5qc2ApLCBhbmQgc2VxdWVuY2VzIG9ubHlcbiAqIHRoZSBjb21tYW5kcyBJTlNJREUgYSBzaW5nbGUga2V5J3MgYXJyYXkgKGBydW5UYXNrKClgLCBhIGBmb3IgLi4uIG9mIGF3YWl0YCkuIFNwbGl0IGFjcm9zcyB0d28ga2V5cyB0aGV5XG4gKiByYWNlLCB3aGljaGV2ZXIgZmluaXNoZXMgbGFzdCB3aW5zLCBhbmQgdGhlIGNvbW1pdCBzdGFnZXMgYnl0ZXMgdGhhdCBuZWl0aGVyIHRvb2wgd291bGQgaGF2ZSBwcm9kdWNlZCBvblxuICogaXRzIG93bi5cbiAqXG4gKiBTbyBkbyBOT1QgZXhwcmVzcyBhIGRpcmVjdG9yeSBleGNsdXNpb24gYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSB0d28gaXRzIG93biBuZWdhdGVkIGtleSAtLSB0aGF0IHNpbGVudGx5XG4gKiB0YWtlcyB0aGUgb3JkZXJpbmcgYXdheS4gQW4gZXhjbHVzaW9uIGJlbG9uZ3MgaW4gdGhlIGV4Y2x1ZGVkIHRvb2wncyBvd24gY29uZmlnLCB3aGVyZSBFU0xpbnQnc1xuICogYGdsb2JhbElnbm9yZXNgIGFscmVhZHkgcHV0cyBpdDogYSBwYXRoIEVTTGludCBpZ25vcmVzIGlzIHJlcG9ydGVkIGFzIGEgd2FybmluZyBhbmQgZXhpdHMgMCB3aGVuIGl0IGlzXG4gKiBwYXNzZWQgZXhwbGljaXRseSwgc28gaXQgY29zdHMgYSBjb25zb2xlIGxpbmUgcmF0aGVyIHRoYW4gYSBmYWlsZWQgY29tbWl0IGFuZCBuZWVkcyBubyBrZXkgaGVyZS5cbiAqL1xuY29uc3QgV1JJVEVSX1RBU0tTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+ID0ge1xuICAnKi57dHMsdHN4LG10c30nOiBbXG4gICAgYCR7UEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EfSBsaW50OmZpeCAtLWAsXG4gICAgYCR7UEFDS0FHRV9NQU5BR0VSX1JVTl9DT01NQU5EfSBmb3JtYXQgLS1gXG4gIF0sXG4gICcqLm1kJzogW1xuICAgIGAke1BBQ0tBR0VfTUFOQUdFUl9SVU5fQ09NTUFORH0gbGludDptZDpmaXggLS1gXG4gIF1cbn07XG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyBydW4gdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZSBcdTIwMTQgYG5wbSBydW4gLi4uIC0tYCwgYGJ1biBydW4gLi4uIC0tYCwgYW5kXG4gKiBzbyBvbiBcdTIwMTQgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMsIGJhdGNoZWQgdG8gZml0IHRoZSBjb21tYW5kIGxpbmUgKHNlZVxuICogYHRvQmF0Y2hlZFRhc2tgKS5cbiAqXG4gKiBTcGVsbGNoZWNrIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyB0aGUga2V5cyByYXRoZXIgdGhhbiBnaXZlbiBhIGNhdGNoLWFsbCBgJyonYCBrZXkgKHNlZVxuICogYHBhcnRpdGlvblNwZWxsY2hlY2tgKS4gQSByZXBvIGFkZGluZyBhIGZpbGUtcmV3cml0aW5nIHRhc2sgb2YgaXRzIG93biBwYXNzZXMgaXQgdG9cbiAqIHtAbGluayBnZXROYW5vU3RhZ2VkQ29uZmlnfSBhcyBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhpcyBvYmplY3QgYW5kIGFkZGluZyBhIGtleSxcbiAqIHdoaWNoIHdvdWxkIHJlaW50cm9kdWNlIHRoZSBvdmVybGFwIGZvciB0aGF0IGtleSdzIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZzogTmFub1N0YWdlZENvbmZpZyA9IHBhcnRpdGlvblNwZWxsY2hlY2soV1JJVEVSX1RBU0tTKTtcblxuY29uc3QgTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFID0gJ05BTk9fU1RBR0VEJztcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCwgdGhlbiBcdTIwMTQgd2hlbiBgTkFOT19TVEFHRURgIGlzIHNldCB0byBhbiBvZmYgdmFsdWUgKGAwYCwgYGZhbHNlYCxcbiAqIGBvZmZgLCBvciBgbm9gKSBcdTIwMTQgcHJpbnRzIGEgbm90aWNlIGFuZCBleGl0cyB0aGUgcHJvY2VzcyBzdWNjZXNzZnVsbHkgc28gdGhlIHByZS1jb21taXQgY2hlY2tzIGFyZVxuICogc2tpcHBlZC4gVGhpcyBtaXJyb3JzIGh1c2t5J3Mgb3duIGBIVVNLWT0wYCBzd2l0Y2gsIGJ1dCBzY29wZWQgdG8gdGhlIG5hbm8tc3RhZ2VkIHN0ZXAgKHNvIHRoZVxuICogY29tbWl0LW1zZyBob29rIHN0aWxsIHJ1bnMpLiBPdGhlcndpc2UgaXQgcmV0dXJucyB7QGxpbmsgb2JzaWRpYW5EZXZVdGlsc0NvbmZpZ30sIG9yIFx1MjAxNCB3aGVuXG4gKiBgYWRkaXRpb25hbFdyaXRlclRhc2tzYCBhcmUgZ2l2ZW4gXHUyMDE0IHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gcmUtcGFydGl0aW9uZWQgd2l0aCB0aG9zZSB3cml0ZXJzIGFkZGVkLlxuICpcbiAqIGBOQU5PX1NUQUdFRGAgaXMgbm90IGFuIG5wbSBzY3JpcHQsIHNvIGl0IGNhcnJpZXMgaXRzIG93biBzd2l0Y2ggcmF0aGVyIHRoYW4gdGhlIHNjcmlwdC1uYW1lLWRlcml2ZWQgb25lXG4gKiBldmVyeSBucG0gc2NyaXB0IGdldHMgXHUyMDE0IGJ1dCBib3RoIHNoYXJlIHRoZSBzYW1lIG5vdGlvbiBvZiBhbiBvZmYgdmFsdWUsIHZpYSB7QGxpbmsgaXNFbnZWYXJpYWJsZU9mZn0uXG4gKlxuICogVGhpcyBpcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIG1vZHVsZS1sZXZlbCBjb2RlIHNvIGltcG9ydGluZyB0aGUgcGFja2FnZSBiYXJyZWwgbmV2ZXIgdHJpZ2dlcnMgdGhlXG4gKiBgLmVudmAgcmVhZCBvciB0aGUgcHJvY2VzcyBleGl0OyBjYWxsIGl0IGZyb20gdGhlIHRoaW4gYHNjcmlwdHMvbmFuby1zdGFnZWQtY29uZmlnLnRzYCBlbnRyeS4gUmVzb2x2aW5nIHRoZVxuICogcGFja2FnZSBtYW5hZ2VyIGlzIHRoZSBvbmUgdGhpbmcgdGhhdCBkb2VzIHJ1biBhdCBtb2R1bGUgc2NvcGUsIGFuZCBpdCBkb2VzIG5laXRoZXIgb2YgdGhvc2UgdHdvXG4gKiB0aGluZ3MgXHUyMDE0IGl0IG9ubHkgcHJvYmVzIGZvciBhIGxvY2tmaWxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbmFsIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbmFuby1zdGFnZWQgdGFzayBjb25maWd1cmF0aW9uLiBEb2VzIG5vdCByZXR1cm4gd2hlbiB0aGUgb3B0LW91dCBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW5vU3RhZ2VkQ29uZmlnKG9wdGlvbnM/OiBHZXROYW5vU3RhZ2VkQ29uZmlnT3B0aW9ucyk6IE5hbm9TdGFnZWRDb25maWcge1xuICBsb2FkRW52RmlsZUlmRXhpc3RzKCk7XG5cbiAgaWYgKGlzRW52VmFyaWFibGVPZmYoTkFOT19TVEFHRURfRU5WX1ZBUklBQkxFKSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBuYW5vLXN0YWdlZDogc2tpcHBlZCAoJHtOQU5PX1NUQUdFRF9FTlZfVkFSSUFCTEV9IGlzIG9mZikuXFxuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbFdyaXRlclRhc2tzID0gb3B0aW9ucz8uYWRkaXRpb25hbFdyaXRlclRhc2tzID8/IHt9O1xuICBpZiAoT2JqZWN0LmtleXMoYWRkaXRpb25hbFdyaXRlclRhc2tzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JzaWRpYW5EZXZVdGlsc0NvbmZpZztcbiAgfVxuXG4gIGNvbnN0IGR1cGxpY2F0ZVBhdHRlcm4gPSBPYmplY3Qua2V5cyhhZGRpdGlvbmFsV3JpdGVyVGFza3MpLmZpbmQoKHBhdHRlcm4pID0+IE9iamVjdC5oYXNPd24oV1JJVEVSX1RBU0tTLCBwYXR0ZXJuKSk7XG4gIGlmIChkdXBsaWNhdGVQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbm8tc3RhZ2VkIHdyaXRlciBwYXR0ZXJuICcke2R1cGxpY2F0ZVBhdHRlcm59JyBpcyBhbHJlYWR5IGEgc2hhcmVkIHdyaXRlciBwYXR0ZXJuLmApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRpdGlvblNwZWxsY2hlY2soeyAuLi5XUklURVJfVEFTS1MsIC4uLmFkZGl0aW9uYWxXcml0ZXJUYXNrcyB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgY29tbWFuZCBhcmd1bWVudHMgaW50byBiYXRjaGVzIHRoYXQgZWFjaCBmaXQgb25lIGNvbW1hbmQgbGluZSBhZnRlciBhIGdpdmVuIHByZWZpeC5cbiAqXG4gKiBFYWNoIGFyZ3VtZW50IGlzIGNvc3RlZCBhcyBuYW5vLXN0YWdlZCBwYXNzZXMgaXQgb24gV2luZG93cyBcdTIwMTQgcXVvdGVkLCB0aGVuIGBeYC1lc2NhcGVkIGJ5IGBjbWQuZXhlYCdzXG4gKiBydWxlcyBcdTIwMTQgdGhyb3VnaCB7QGxpbmsgZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGh9LCBhbmQgdGhlIGJ1ZGdldCBpcyB7QGxpbmsgZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RofSxcbiAqIHdoaWNoIGFscmVhZHkgaG9sZHMgYmFjayB0aGUgcmVzZXJ2ZSBmb3IgdGhlIGBucG1gIFx1MjE5MiBgY21kLmV4ZWAgXHUyMTkyIGAuYmluYCBzaGltIGNoYWluIHJlLWV4cGFuZGluZyB0aGVcbiAqIGFyZ3VtZW50cy4gQW4gYXJndW1lbnQgdG9vIGxvbmcgZm9yIGFueSBiYXRjaCBzdGlsbCBnZXRzIGEgYmF0Y2ggb2YgaXRzIG93bjogaXQgZmFpbHMgbG91ZGx5IHRoZXJlLCB3aGljaFxuICogZHJvcHBpbmcgaXQgd291bGQgbm90LlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBUaGUgY29tbWFuZCB0aGUgYXJndW1lbnRzIGFyZSBhcHBlbmRlZCB0by5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byBzcGxpdC5cbiAqIEByZXR1cm5zIFRoZSBiYXRjaGVzLCBpbiBvcmRlciwgdG9nZXRoZXIgaG9sZGluZyBldmVyeSBhcmd1bWVudCBvbmNlLlxuICovXG5mdW5jdGlvbiBiYXRjaENvbW1hbmRBcmd1bWVudHMocHJlZml4OiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW11bXSB7XG4gIGNvbnN0IGVtcHR5TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoJycpO1xuICBjb25zdCBidWRnZXQgPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKSAtIEVYRUNVVEFCTEVfUEFUSF9SRVNFUlZFIC0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgocHJlZml4KTtcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgYmF0Y2g6IHN0cmluZ1tdID0gW107XG4gIGxldCBiYXRjaExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCBjb21tYW5kQXJndW1lbnQgb2YgY29tbWFuZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGFyZ3VtZW50TGVuZ3RoID0gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoYCBcIiR7Y29tbWFuZEFyZ3VtZW50fVwiYCkgLSBlbXB0eUxlbmd0aDtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCAmJiBiYXRjaExlbmd0aCArIGFyZ3VtZW50TGVuZ3RoID4gYnVkZ2V0KSB7XG4gICAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgIGJhdGNoTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgYmF0Y2gucHVzaChjb21tYW5kQXJndW1lbnQpO1xuICAgIGJhdGNoTGVuZ3RoICs9IGFyZ3VtZW50TGVuZ3RoO1xuICB9XG5cbiAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoZXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBpbiB3aGljaCBzcGVsbGNoZWNrIG5ldmVyIHJlYWRzIGEgZmlsZSB3aGlsZSBhbm90aGVyIHRhc2sgcmV3cml0ZXMgaXQuXG4gKlxuICogVGhlIHNhbWUgYFByb21pc2UuYWxsYCB0aGF0IGZvcmNlcyB0d28gd3JpdGVycyBpbnRvIG9uZSBrZXkgbWFrZXMgYSBjYXRjaC1hbGwgYCcqJ2Agc3BlbGxjaGVjayBrZXkgcnVuXG4gKiBDT05DVVJSRU5UTFkgd2l0aCBldmVyeSB3cml0ZXIga2V5LCBzbyBjc3BlbGwgd291bGQgcmVhZCBhIGZpbGUgdGhhdCBFU0xpbnQgb3IgZHByaW50IGlzIHJld3JpdGluZyBpblxuICogcGxhY2UgLS0gYSBzcHVyaW91cyBmaW5kaW5nIG9uIGEgaGFsZi13cml0dGVuIGZpbGUsIG9yIGEgcGFzcyBvdmVyIGNvbnRlbnQgdGhhdCBpcyBub3Qgd2hhdCBnZXRzXG4gKiBjb21taXR0ZWQuIFNvIHRoZSBzdGFnZWQgZmlsZXMgYXJlIFBBUlRJVElPTkVEIGluc3RlYWQ6XG4gKlxuICogLSBldmVyeSB3cml0ZXIga2V5IGdldHMgc3BlbGxjaGVjayBhcHBlbmRlZCBhcyBpdHMgTEFTVCBjb21tYW5kLCBzbyBpdCByZWFkcyB0aGF0IGtleSdzIGZpbGVzIGFmdGVyIHRoZXlcbiAqICAgaGF2ZSBiZWVuIHJld3JpdHRlbjtcbiAqIC0gb25lIGNvbXBsZW1lbnQga2V5IHNwZWxsY2hlY2tzIGV4YWN0bHkgdGhlIGZpbGVzIG5vIHdyaXRlciBrZXkgY2xhaW1zLlxuICpcbiAqIFRoZSBjb21wbGVtZW50IGlzIHdyaXR0ZW4gaW4gbmFuby1zdGFnZWQncyBvd24gZ2xvYiBkaWFsZWN0LCB3aGljaCBjb21waWxlcyBgISguLi4pYCB0byBhIGxvb2thaGVhZCB0aGF0XG4gKiBpcyBOT1QgYW5jaG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aDogYCEoKi5tZCkqYCB3b3VsZCBleGNsdWRlIGBub3Rlcy5tZC5iYWtgIHRvby4gQSBuZXN0ZWQgYCEoPylgXG4gKiBjb21waWxlcyB0byBgKD8hLilgLCB3aGljaCBJUyBhbiBlbmQgYW5jaG9yLCBzbyBlYWNoIGFsdGVybmF0aXZlIGlzIHN1ZmZpeGVkIHdpdGggaXQuIEEgd3JpdGVyIHBhdHRlcm5cbiAqIGNvbnRhaW5pbmcgYC9gIHdvdWxkIHN3aXRjaCBuYW5vLXN0YWdlZCBpbnRvIGdsb2JzdGFyIG1vZGUsIHdoZXJlIGAqYCBzdG9wcyBjcm9zc2luZyBkaXJlY3RvcmllcyBhbmQgdGhlXG4gKiBjb25zdHJ1Y3Rpb24gbm8gbG9uZ2VyIGhvbGRzIC0tIGhlbmNlIHRoZSB0aHJvdy4gVGhlIHVuaXQgdGVzdCBwaW5zIHRoZSBwYXJ0aXRpb24gYWdhaW5zdCB0aGUgaW5zdGFsbGVkXG4gKiBuYW5vLXN0YWdlZCBjb21waWxlciwgc28gYSByZWxlYXNlIHRoYXQgY2hhbmdlcyBpdHMgZGlhbGVjdCBmYWlscyB0aGVyZSByYXRoZXIgdGhhbiBpbiBhIGNvbW1pdC5cbiAqXG4gKiBAcGFyYW0gd3JpdGVyVGFza3MgLSBUaGUgZmlsZS1yZXdyaXRpbmcgdGFza3MsIGtleWVkIGJ5IHRoZSBwYXR0ZXJuIHRoYXQgY2xhaW1zIHRoZWlyIGZpbGVzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIHdpdGggdGhlIHNwZWxsY2hlY2sgc3RlcCBwYXJ0aXRpb25lZCBhY3Jvc3MgdGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvblNwZWxsY2hlY2sod3JpdGVyVGFza3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4pOiBOYW5vU3RhZ2VkQ29uZmlnIHtcbiAgY29uc3QgcGF0dGVybnMgPSBPYmplY3Qua2V5cyh3cml0ZXJUYXNrcyk7XG4gIGNvbnN0IHBhdHRlcm5XaXRoU2xhc2ggPSBwYXR0ZXJucy5maW5kKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCcvJykpO1xuICBpZiAocGF0dGVybldpdGhTbGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBuYW5vLXN0YWdlZCB3cml0ZXIgcGF0dGVybiAnJHtwYXR0ZXJuV2l0aFNsYXNofScgY29udGFpbnMgJy8nLCB3aGljaCB0aGUgc3BlbGxjaGVjayBwYXJ0aXRpb24gY2Fubm90IGV4cHJlc3MuYCk7XG4gIH1cblxuICBjb25zdCBjb21wbGVtZW50UGF0dGVybiA9IGAhKCR7cGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBgJHtwYXR0ZXJufSEoPylgKS5qb2luKCd8Jyl9KSpgO1xuICBjb25zdCBjb25maWc6IE5hbm9TdGFnZWRDb25maWcgPSB7XG4gICAgW2NvbXBsZW1lbnRQYXR0ZXJuXTogdG9CYXRjaGVkVGFzayhbU1BFTExDSEVDS19DT01NQU5EXSlcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb21tYW5kc10gb2YgT2JqZWN0LmVudHJpZXMod3JpdGVyVGFza3MpKSB7XG4gICAgY29uZmlnW3BhdHRlcm5dID0gdG9CYXRjaGVkVGFzayhbLi4uY29tbWFuZHMsIFNQRUxMQ0hFQ0tfQ09NTUFORF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB0YXNrIHRoYXQgcnVucyBlYWNoIGNvbW1hbmQgb3ZlciBldmVyeSBzdGFnZWQgZmlsZSBpdCByZWNlaXZlcywgaW4gYXMgbWFueSBiYXRjaGVzIGFzIHRoZSBjb21tYW5kXG4gKiBsaW5lIG5lZWRzLlxuICpcbiAqIG5hbm8tc3RhZ2VkIGFwcGVuZHMgYSBzdHJpbmcgdGFzaydzIGZpbGVzIHRvIE9ORSBjb21tYW5kLCBzbyBhIGNvbW1pdCBzdGFnaW5nIGEgZmV3IGh1bmRyZWQgZmlsZXMgcmFuXG4gKiBgbnBtIHJ1biBsaW50OmZpeCAtLSA8ZXZlcnkgcGF0aD5gIGFuZCBmYWlsZWQgb24gV2luZG93cyB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmAsIHJlZnVzaW5nXG4gKiBleGFjdGx5IHRoZSB3aG9sZS1yZXBvIGNvbW1pdHMgdGhhdCBtb3N0IG5lZWQgdGhlIGhvb2suIEEgZnVuY3Rpb24tdmFsdWVkIHRhc2sgYnVpbGRzIGl0cyBvd24gY29tbWFuZHNcbiAqIGluc3RlYWQsIGFuZCB0aGVzZSBhcmUgYmF0Y2hlZCBhZ2FpbnN0IHRoZSBzYW1lIGJ1ZGdldCBgZXhlYygpYCB1c2VzIChzZWUgYGJhdGNoQ29tbWFuZEFyZ3VtZW50c2ApLlxuICpcbiAqIFRoZSBjb21tYW5kcyBrZWVwIHRoZWlyIG9yZGVyOiBldmVyeSBiYXRjaCBvZiB0aGUgZmlyc3QgY29tbWFuZCBydW5zIGJlZm9yZSBhbnkgYmF0Y2ggb2YgdGhlIHNlY29uZCxcbiAqIGJlY2F1c2UgbmFuby1zdGFnZWQgcnVucyBvbmUga2V5J3MgY29tbWFuZHMgb25lIGFmdGVyIGFub3RoZXIsIHNvIGEgd3JpdGVyIHN0aWxsIGZpbmlzaGVzIGJlZm9yZSB0aGUgbmV4dFxuICogd3JpdGVyLCBhbmQgc3BlbGxjaGVjayBzdGlsbCByZWFkcyB0aGUgcmV3cml0dGVuIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBjb21tYW5kIHByZWZpeGVzLCBpbiB0aGUgb3JkZXIgdGhleSBydW4uXG4gKiBAcmV0dXJucyBUaGUgdGFzay5cbiAqL1xuZnVuY3Rpb24gdG9CYXRjaGVkVGFzayhjb21tYW5kczogcmVhZG9ubHkgc3RyaW5nW10pOiBOYW5vU3RhZ2VkVGFzayB7XG4gIHJldHVybiAoeyBmaWxlbmFtZXMgfSkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBmaWxlbmFtZXMubWFwKChmaWxlbmFtZSkgPT4gdG9Db21tYW5kQXJndW1lbnQoZmlsZW5hbWUpKTtcbiAgICByZXR1cm4gY29tbWFuZHMuZmxhdE1hcCgoY29tbWFuZCkgPT4gYmF0Y2hDb21tYW5kQXJndW1lbnRzKGNvbW1hbmQsIGNvbW1hbmRBcmd1bWVudHMpLm1hcCgoYmF0Y2gpID0+IGAke2NvbW1hbmR9ICR7YmF0Y2guam9pbignICcpfWApKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBhIHN0YWdlZCBmaWxlJ3MgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBhcmd1bWVudCBhIGJhdGNoZWQgdGFzayBwYXNzZXMgZm9yIGl0LlxuICpcbiAqIFRoZSBwYXRoIGlzIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGVyZSBuYW5vLXN0YWdlZCBhbmQgdGhlIHRhc2sgYm90aCBydW4sIHdoaWNoIHJvdWdobHlcbiAqIGhhbHZlcyBpdHMgbGVuZ3RoIGFuZCBzbyB0aGUgbnVtYmVyIG9mIGJhdGNoZXM7IGEgcGF0aCBvdXRzaWRlIGl0IHN0YXlzIGFic29sdXRlLiBBIHJlbGF0aXZlIHBhdGggc3RhcnRpbmdcbiAqIHdpdGggYC1gIGdldHMgYC4vYCwgc28gbm8gdG9vbCByZWFkcyBpdCBhcyBhbiBvcHRpb24uXG4gKlxuICogV2hpdGVzcGFjZSBhbmQgcXVvdGVzIGJlY29tZSBgP2AsIGJlY2F1c2UgbmFuby1zdGFnZWQncyB0b2tlbml6ZXIgY2Fubm90IGNhcnJ5IHRoZW0gKHNlZVxuICoge0BsaW5rIFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQfSkuIEV2ZXJ5IHRvb2wgdGhlIHRhc2tzIHJ1biAoRVNMaW50LCBkcHJpbnQsIGNzcGVsbCxcbiAqIG1hcmtkb3dubGludC1jbGkyKSB0YWtlcyBpdHMgcGF0aHMgYXMgZ2xvYnMsIGFuZCBgP2AgbWF0Y2hlcyBleGFjdGx5IHRoZSBvbmUgY2hhcmFjdGVyIGl0IHJlcGxhY2VkLCBzbyB0aGVcbiAqIGZpbGUgaXMgc3RpbGwgZm91bmQ7IGEgc2libGluZyBkaWZmZXJpbmcgb25seSBpbiB0aGF0IGNoYXJhY3RlciB3b3VsZCBtYXRjaCB0b28sIHdoaWNoIGNvc3RzIGEgbGludCBvZiBhblxuICogZXh0cmEgZmlsZSwgbm90IGEgbWlzc2VkIG9uZS5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3RhZ2VkIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZEFyZ3VtZW50KGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSk7XG4gIGxldCBjb21tYW5kQXJndW1lbnQgPSAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgfHwgaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpID8gZmlsZW5hbWUgOiByZWxhdGl2ZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoY29tbWFuZEFyZ3VtZW50LnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbW1hbmRBcmd1bWVudCA9IGAuLyR7Y29tbWFuZEFyZ3VtZW50fWA7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRBcmd1bWVudC5yZXBsYWNlQWxsKFRPS0VOSVpFUl9VTlNBRkVfQ0hBUkFDVEVSU19SRUdfRVhQLCAnPycpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUEyQzVDLE1BQU0sOEJBQThCLDRCQUE0QixFQUFFLEtBQUssR0FBRztBQUUxRSxNQUFNLHFCQUFxQixHQUFHLDJCQUEyQjtBQVF6RCxNQUFNLDBCQUEwQjtBQVNoQyxNQUFNLHNDQUFzQztBQWdCNUMsTUFBTSxlQUE0RDtBQUFBLEVBQ2hFLGtCQUFrQjtBQUFBLElBQ2hCLEdBQUcsMkJBQTJCO0FBQUEsSUFDOUIsR0FBRywyQkFBMkI7QUFBQSxFQUNoQztBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQ04sR0FBRywyQkFBMkI7QUFBQSxFQUNoQztBQUNGO0FBaUJPLE1BQU0seUJBQTJDLG9CQUFvQixZQUFZO0FBRXhGLE1BQU0sMkJBQTJCO0FBc0IxQixTQUFTLG9CQUFvQixTQUF3RDtBQUMxRixzQkFBb0I7QUFFcEIsTUFBSSxpQkFBaUIsd0JBQXdCLEdBQUc7QUFDOUMsWUFBUSxPQUFPLE1BQU0seUJBQXlCLHdCQUF3QjtBQUFBLENBQWE7QUFDbkYsWUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQjtBQUVBLFFBQU0sd0JBQXdCLFNBQVMseUJBQXlCLENBQUM7QUFDakUsTUFBSSxPQUFPLEtBQUsscUJBQXFCLEVBQUUsV0FBVyxHQUFHO0FBQ25ELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsT0FBTyxLQUFLLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxZQUFZLE9BQU8sT0FBTyxjQUFjLE9BQU8sQ0FBQztBQUNsSCxNQUFJLHFCQUFxQixRQUFXO0FBQ2xDLFVBQU0sSUFBSSxNQUFNLCtCQUErQixnQkFBZ0IsdUNBQXVDO0FBQUEsRUFDeEc7QUFFQSxTQUFPLG9CQUFvQixFQUFFLEdBQUcsY0FBYyxHQUFHLHNCQUFzQixDQUFDO0FBQzFFO0FBZUEsU0FBUyxzQkFBc0IsUUFBZ0Isa0JBQWlEO0FBQzlGLFFBQU0sY0FBYyw4QkFBOEIsRUFBRTtBQUNwRCxRQUFNLFNBQVMseUJBQXlCLElBQUksMEJBQTBCLDhCQUE4QixNQUFNO0FBQzFHLFFBQU0sVUFBc0IsQ0FBQztBQUM3QixNQUFJLFFBQWtCLENBQUM7QUFDdkIsTUFBSSxjQUFjO0FBRWxCLGFBQVcsbUJBQW1CLGtCQUFrQjtBQUM5QyxVQUFNLGlCQUFpQiw4QkFBOEIsS0FBSyxlQUFlLEdBQUcsSUFBSTtBQUNoRixRQUFJLE1BQU0sU0FBUyxLQUFLLGNBQWMsaUJBQWlCLFFBQVE7QUFDN0QsY0FBUSxLQUFLLEtBQUs7QUFDbEIsY0FBUSxDQUFDO0FBQ1Qsb0JBQWM7QUFBQSxJQUNoQjtBQUNBLFVBQU0sS0FBSyxlQUFlO0FBQzFCLG1CQUFlO0FBQUEsRUFDakI7QUFFQSxNQUFJLE1BQU0sU0FBUyxHQUFHO0FBQ3BCLFlBQVEsS0FBSyxLQUFLO0FBQUEsRUFDcEI7QUFFQSxTQUFPO0FBQ1Q7QUF3QkEsU0FBUyxvQkFBb0IsYUFBNEU7QUFDdkcsUUFBTSxXQUFXLE9BQU8sS0FBSyxXQUFXO0FBQ3hDLFFBQU0sbUJBQW1CLFNBQVMsS0FBSyxDQUFDLFlBQVksUUFBUSxTQUFTLEdBQUcsQ0FBQztBQUN6RSxNQUFJLHFCQUFxQixRQUFXO0FBQ2xDLFVBQU0sSUFBSSxNQUFNLCtCQUErQixnQkFBZ0IsZ0VBQWdFO0FBQUEsRUFDakk7QUFFQSxRQUFNLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQztBQUNwRixRQUFNLFNBQTJCO0FBQUEsSUFDL0IsQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7QUFBQSxFQUN6RDtBQUVBLGFBQVcsQ0FBQyxTQUFTLFFBQVEsS0FBSyxPQUFPLFFBQVEsV0FBVyxHQUFHO0FBQzdELFdBQU8sT0FBTyxJQUFJLGNBQWMsQ0FBQyxHQUFHLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxFQUNuRTtBQUVBLFNBQU87QUFDVDtBQWtCQSxTQUFTLGNBQWMsVUFBNkM7QUFDbEUsU0FBTyxDQUFDLEVBQUUsVUFBVSxNQUFNO0FBQ3hCLFVBQU0sbUJBQW1CLFVBQVUsSUFBSSxDQUFDLGFBQWEsa0JBQWtCLFFBQVEsQ0FBQztBQUNoRixXQUFPLFNBQVMsUUFBUSxDQUFDLFlBQVksc0JBQXNCLFNBQVMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUN2STtBQUNGO0FBa0JBLFNBQVMsa0JBQWtCLFVBQTBCO0FBQ25ELFFBQU0sZUFBZSxTQUFTLFFBQVEsSUFBSSxHQUFHLFFBQVE7QUFDckQsTUFBSSxtQkFBbUIsYUFBYSxXQUFXLElBQUksS0FBSyxXQUFXLFlBQVksSUFBSSxXQUFXLGNBQWMsV0FBVyxNQUFNLEdBQUc7QUFDaEksTUFBSSxnQkFBZ0IsV0FBVyxHQUFHLEdBQUc7QUFDbkMsc0JBQWtCLEtBQUssZUFBZTtBQUFBLEVBQ3hDO0FBQ0EsU0FBTyxnQkFBZ0IsV0FBVyxxQ0FBcUMsR0FBRztBQUM1RTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/docs-site/api-doc-documented-files.cjs",
3
+ "module": "../../dist/lib/esm/docs-site/api-doc-documented-files.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/docs-site/api-doc-documented-files.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.cjs",
3
+ "module": "../../../dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.mjs",
4
+ "type": "module",
5
+ "types": "../../../dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.d.cts"
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-dev-toolkit",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -278,6 +278,7 @@
278
278
  "version": "jiti scripts/version.ts"
279
279
  },
280
280
  "dependencies": {
281
+ "@commitlint/config-conventional": "^21.2.3",
281
282
  "@commitlint/types": "^21.2.0",
282
283
  "@eslint-community/eslint-plugin-eslint-comments": "^4.8.1",
283
284
  "@eslint/config-helpers": "^0.7.0",
@@ -314,7 +315,6 @@
314
315
  "@astrojs/markdown-satteri": "^0.4.4",
315
316
  "@astrojs/starlight": "^0.42.6",
316
317
  "@commitlint/cli": "^21.2.2",
317
- "@commitlint/config-conventional": "^21.2.2",
318
318
  "@mnaoumov/typescript-test-toolkit": "^1.0.0",
319
319
  "@resvg/resvg-js": "^2.6.2",
320
320
  "@total-typescript/ts-reset": "^0.6.1",