@pipeline-builder/pipeline-core 3.4.69 → 3.4.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -33
- package/lib/config/app-config.d.ts +1 -1
- package/lib/config/app-config.js +20 -25
- package/lib/config/billing-config.d.ts +1 -1
- package/lib/config/billing-config.js +2 -5
- package/lib/config/config-types.d.ts +1 -1
- package/lib/config/config-types.js +2 -3
- package/lib/config/infrastructure-config.d.ts +1 -1
- package/lib/config/infrastructure-config.js +25 -38
- package/lib/config/server-config.d.ts +1 -1
- package/lib/config/server-config.js +12 -19
- package/lib/core/artifact-manager.js +3 -6
- package/lib/core/id-generator.js +4 -8
- package/lib/core/metadata-builder.d.ts +4 -4
- package/lib/core/metadata-builder.js +32 -44
- package/lib/core/network-types.d.ts +2 -2
- package/lib/core/network-types.js +2 -3
- package/lib/core/network.d.ts +3 -3
- package/lib/core/network.js +18 -20
- package/lib/core/pipeline-helpers.d.ts +3 -3
- package/lib/core/pipeline-helpers.js +73 -79
- package/lib/core/pipeline-types.d.ts +2 -2
- package/lib/core/pipeline-types.js +5 -11
- package/lib/core/role-types.js +2 -3
- package/lib/core/role.d.ts +3 -3
- package/lib/core/role.js +24 -25
- package/lib/core/security-group-types.js +2 -3
- package/lib/core/security-group.d.ts +3 -3
- package/lib/core/security-group.js +8 -9
- package/lib/handlers/plugin-lookup-handler.d.ts +1 -1
- package/lib/handlers/plugin-lookup-handler.js +18 -56
- package/lib/index.d.ts +17 -17
- package/lib/index.js +28 -71
- package/lib/pipeline/pipeline-builder.d.ts +5 -5
- package/lib/pipeline/pipeline-builder.js +73 -110
- package/lib/pipeline/pipeline-configuration.d.ts +5 -5
- package/lib/pipeline/pipeline-configuration.js +15 -19
- package/lib/pipeline/plugin-lookup.d.ts +3 -3
- package/lib/pipeline/plugin-lookup.js +32 -31
- package/lib/pipeline/source-builder.d.ts +2 -2
- package/lib/pipeline/source-builder.js +27 -29
- package/lib/pipeline/source-types.d.ts +1 -1
- package/lib/pipeline/source-types.js +2 -3
- package/lib/pipeline/stage-builder.d.ts +5 -5
- package/lib/pipeline/stage-builder.js +9 -9
- package/lib/pipeline/step-types.d.ts +4 -4
- package/lib/pipeline/step-types.js +2 -3
- package/lib/template/cache.d.ts +1 -1
- package/lib/template/cache.js +5 -9
- package/lib/template/evaluator.d.ts +1 -1
- package/lib/template/evaluator.js +11 -16
- package/lib/template/index.d.ts +9 -9
- package/lib/template/index.js +31 -56
- package/lib/template/metrics.d.ts +0 -7
- package/lib/template/metrics.js +17 -10
- package/lib/template/plugin-resolver.js +5 -9
- package/lib/template/tokenizer.js +13 -19
- package/lib/template/topo-sort.js +2 -5
- package/lib/template/validate.d.ts +1 -1
- package/lib/template/validate.js +20 -25
- package/lib/template/walker.d.ts +1 -1
- package/lib/template/walker.js +6 -10
- package/package.json +20 -14
package/lib/template/index.js
CHANGED
|
@@ -1,44 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Object.defineProperty(exports, "hasTemplate", { enumerable: true, get: function () { return tokenizer_1.hasTemplate; } });
|
|
12
|
-
Object.defineProperty(exports, "TokenizerError", { enumerable: true, get: function () { return tokenizer_1.TokenizerError; } });
|
|
13
|
-
Object.defineProperty(exports, "MAX_FIELD_SIZE_BYTES", { enumerable: true, get: function () { return tokenizer_1.MAX_FIELD_SIZE_BYTES; } });
|
|
14
|
-
Object.defineProperty(exports, "MAX_PATH_DEPTH", { enumerable: true, get: function () { return tokenizer_1.MAX_PATH_DEPTH; } });
|
|
15
|
-
Object.defineProperty(exports, "MAX_IDENTIFIER_LENGTH", { enumerable: true, get: function () { return tokenizer_1.MAX_IDENTIFIER_LENGTH; } });
|
|
16
|
-
var evaluator_1 = require("./evaluator");
|
|
17
|
-
Object.defineProperty(exports, "resolve", { enumerable: true, get: function () { return evaluator_1.resolve; } });
|
|
18
|
-
Object.defineProperty(exports, "lookupPath", { enumerable: true, get: function () { return evaluator_1.lookupPath; } });
|
|
19
|
-
Object.defineProperty(exports, "dependencies", { enumerable: true, get: function () { return evaluator_1.dependencies; } });
|
|
20
|
-
var walker_1 = require("./walker");
|
|
21
|
-
Object.defineProperty(exports, "walkAndBind", { enumerable: true, get: function () { return walker_1.walkAndBind; } });
|
|
22
|
-
var topo_sort_1 = require("./topo-sort");
|
|
23
|
-
Object.defineProperty(exports, "topoSort", { enumerable: true, get: function () { return topo_sort_1.topoSort; } });
|
|
24
|
-
var cache_1 = require("./cache");
|
|
25
|
-
Object.defineProperty(exports, "TokenCache", { enumerable: true, get: function () { return cache_1.TokenCache; } });
|
|
26
|
-
Object.defineProperty(exports, "defaultTokenCache", { enumerable: true, get: function () { return cache_1.defaultTokenCache; } });
|
|
27
|
-
var validate_1 = require("./validate");
|
|
28
|
-
Object.defineProperty(exports, "validateTemplates", { enumerable: true, get: function () { return validate_1.validateTemplates; } });
|
|
29
|
-
Object.defineProperty(exports, "detectCycles", { enumerable: true, get: function () { return validate_1.detectCycles; } });
|
|
30
|
-
Object.defineProperty(exports, "allowedScopeRoots", { enumerable: true, get: function () { return validate_1.allowedScopeRoots; } });
|
|
31
|
-
var metrics_1 = require("./metrics");
|
|
32
|
-
Object.defineProperty(exports, "recordResolution", { enumerable: true, get: function () { return metrics_1.recordResolution; } });
|
|
33
|
-
Object.defineProperty(exports, "templateResolutionsTotal", { enumerable: true, get: function () { return metrics_1.templateResolutionsTotal; } });
|
|
34
|
-
Object.defineProperty(exports, "templateResolutionDurationMs", { enumerable: true, get: function () { return metrics_1.templateResolutionDurationMs; } });
|
|
3
|
+
export { tokenize, hasTemplate, TokenizerError, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, MAX_IDENTIFIER_LENGTH, } from './tokenizer.js';
|
|
4
|
+
export { resolve, lookupPath, dependencies, } from './evaluator.js';
|
|
5
|
+
export { walkAndBind, } from './walker.js';
|
|
6
|
+
export { topoSort, } from './topo-sort.js';
|
|
7
|
+
export { TokenCache, defaultTokenCache, } from './cache.js';
|
|
8
|
+
export { validateTemplates, detectCycles, allowedScopeRoots, } from './validate.js';
|
|
9
|
+
export { recordResolution, templateResolutionsTotal, templateResolutionDurationMs, } from './metrics.js';
|
|
35
10
|
// -- Convenience: high-level resolve() that walks + resolves + measures
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
11
|
+
import { ErrorCode } from '@pipeline-builder/api-core';
|
|
12
|
+
import { resolve as evaluatorResolve } from './evaluator.js';
|
|
13
|
+
import { recordResolution } from './metrics.js';
|
|
14
|
+
import { hasTemplate, tokenize } from './tokenizer.js';
|
|
15
|
+
import { topoSort } from './topo-sort.js';
|
|
16
|
+
import { walkAndBind } from './walker.js';
|
|
42
17
|
/**
|
|
43
18
|
* Resolve all templates inside `doc` by mutating string fields in place.
|
|
44
19
|
* `doc` is treated as opaque — only string fields that match `isTemplatable`
|
|
@@ -46,28 +21,28 @@ const walker_2 = require("./walker");
|
|
|
46
21
|
*
|
|
47
22
|
* `docType` is used for metrics; pass 'pipeline' or 'plugin'.
|
|
48
23
|
*/
|
|
49
|
-
function resolveTemplates(doc, scope, isTemplatable, docType = 'plugin') {
|
|
24
|
+
export function resolveTemplates(doc, scope, isTemplatable, docType = 'plugin') {
|
|
50
25
|
const start = Date.now();
|
|
51
26
|
const errors = [];
|
|
52
|
-
const entries =
|
|
27
|
+
const entries = walkAndBind(doc, isTemplatable);
|
|
53
28
|
let success = true;
|
|
54
29
|
for (const entry of entries) {
|
|
55
30
|
try {
|
|
56
|
-
const value = (
|
|
31
|
+
const value = evaluatorResolve(entry.tokens, scope, entry.field);
|
|
57
32
|
entry.set(value);
|
|
58
33
|
}
|
|
59
34
|
catch (err) {
|
|
60
35
|
success = false;
|
|
61
36
|
const e = err;
|
|
62
37
|
errors.push({
|
|
63
|
-
code: e.code ??
|
|
38
|
+
code: e.code ?? ErrorCode.TEMPLATE_PARSE_ERROR,
|
|
64
39
|
message: e.message,
|
|
65
40
|
field: entry.field,
|
|
66
41
|
path: e.path,
|
|
67
42
|
});
|
|
68
43
|
}
|
|
69
44
|
}
|
|
70
|
-
|
|
45
|
+
recordResolution(docType, Date.now() - start, success);
|
|
71
46
|
return { errors };
|
|
72
47
|
}
|
|
73
48
|
/**
|
|
@@ -78,9 +53,9 @@ function resolveTemplates(doc, scope, isTemplatable, docType = 'plugin') {
|
|
|
78
53
|
* `fieldToScopePath` maps each field (e.g. `metadata.env`) to the scope
|
|
79
54
|
* path it populates (typically the same, sans any array indices).
|
|
80
55
|
*/
|
|
81
|
-
function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, docType = 'pipeline') {
|
|
56
|
+
export function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, docType = 'pipeline') {
|
|
82
57
|
const start = Date.now();
|
|
83
|
-
const entries =
|
|
58
|
+
const entries = walkAndBind(doc, isTemplatable);
|
|
84
59
|
// Build topo nodes keyed by target scope path
|
|
85
60
|
const nodes = entries
|
|
86
61
|
.map(e => {
|
|
@@ -94,17 +69,17 @@ function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, doc
|
|
|
94
69
|
return { key, deps, entry: e };
|
|
95
70
|
})
|
|
96
71
|
.filter((n) => n !== null);
|
|
97
|
-
const { ordered, cycles } =
|
|
72
|
+
const { ordered, cycles } = topoSort(nodes.map(n => ({ key: n.key, deps: n.deps })));
|
|
98
73
|
const errors = [];
|
|
99
74
|
if (cycles.length) {
|
|
100
75
|
for (const c of cycles) {
|
|
101
76
|
errors.push({
|
|
102
|
-
code:
|
|
77
|
+
code: ErrorCode.TEMPLATE_CYCLE,
|
|
103
78
|
message: `Template cycle detected: ${c.join(' -> ')}`,
|
|
104
79
|
path: c.join(' -> '),
|
|
105
80
|
});
|
|
106
81
|
}
|
|
107
|
-
|
|
82
|
+
recordResolution(docType, Date.now() - start, false);
|
|
108
83
|
return { errors };
|
|
109
84
|
}
|
|
110
85
|
// Resolve in topo order; multiple entries may share a scope key (e.g. one
|
|
@@ -120,14 +95,14 @@ function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, doc
|
|
|
120
95
|
for (const key of ordered) {
|
|
121
96
|
for (const n of byKey.get(key) ?? []) {
|
|
122
97
|
try {
|
|
123
|
-
const value = (
|
|
98
|
+
const value = evaluatorResolve(n.entry.tokens, scope, n.entry.field);
|
|
124
99
|
n.entry.set(value);
|
|
125
100
|
}
|
|
126
101
|
catch (err) {
|
|
127
102
|
success = false;
|
|
128
103
|
const e = err;
|
|
129
104
|
errors.push({
|
|
130
|
-
code: e.code ??
|
|
105
|
+
code: e.code ?? ErrorCode.TEMPLATE_PARSE_ERROR,
|
|
131
106
|
message: e.message,
|
|
132
107
|
field: n.entry.field,
|
|
133
108
|
path: e.path,
|
|
@@ -135,7 +110,7 @@ function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, doc
|
|
|
135
110
|
}
|
|
136
111
|
}
|
|
137
112
|
}
|
|
138
|
-
|
|
113
|
+
recordResolution(docType, Date.now() - start, success);
|
|
139
114
|
return { errors };
|
|
140
115
|
}
|
|
141
116
|
/**
|
|
@@ -144,10 +119,10 @@ function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePath, doc
|
|
|
144
119
|
* used (in which case the native type from `| number`, `| bool`, or
|
|
145
120
|
* `| json` is returned).
|
|
146
121
|
*/
|
|
147
|
-
function resolveString(source, scope) {
|
|
148
|
-
if (!
|
|
122
|
+
export function resolveString(source, scope) {
|
|
123
|
+
if (!hasTemplate(source))
|
|
149
124
|
return source;
|
|
150
|
-
const tokens =
|
|
151
|
-
return (
|
|
125
|
+
const tokens = tokenize(source);
|
|
126
|
+
return evaluatorResolve(tokens, scope);
|
|
152
127
|
}
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQTBFdEMsNENBMkJDO0FBVUQsd0RBZ0VDO0FBUUQsc0NBT0M7QUE1TEQseUNBV3FCO0FBVm5CLHFHQUFBLFFBQVEsT0FBQTtBQUNSLHdHQUFBLFdBQVcsT0FBQTtBQUNYLDJHQUFBLGNBQWMsT0FBQTtBQUNkLGlIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLDJHQUFBLGNBQWMsT0FBQTtBQUNkLGtIQUFBLHFCQUFxQixPQUFBO0FBT3ZCLHlDQU1xQjtBQUxuQixvR0FBQSxPQUFPLE9BQUE7QUFDUCx1R0FBQSxVQUFVLE9BQUE7QUFDVix5R0FBQSxZQUFZLE9BQUE7QUFLZCxtQ0FJa0I7QUFIaEIscUdBQUEsV0FBVyxPQUFBO0FBS2IseUNBSXFCO0FBSG5CLHFHQUFBLFFBQVEsT0FBQTtBQUtWLGlDQUdpQjtBQUZmLG1HQUFBLFVBQVUsT0FBQTtBQUNWLDBHQUFBLGlCQUFpQixPQUFBO0FBR25CLHVDQU1vQjtBQUxsQiw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQix3R0FBQSxZQUFZLE9BQUE7QUFDWiw2R0FBQSxpQkFBaUIsT0FBQTtBQUtuQixxQ0FJbUI7QUFIakIsMkdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsbUhBQUEsd0JBQXdCLE9BQUE7QUFDeEIsdUhBQUEsNEJBQTRCLE9BQUE7QUFHOUIsd0VBQXdFO0FBRXhFLHlEQUF1RDtBQUN2RCwyQ0FBc0U7QUFDdEUsdUNBQTZDO0FBQzdDLDJDQUEyRDtBQUMzRCwyQ0FBdUM7QUFDdkMscUNBQTREO0FBTTVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixHQUFNLEVBQ04sS0FBWSxFQUNaLGFBQTZCLEVBQzdCLFVBQWlDLFFBQVE7SUFFekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcs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Q3JCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQWtELENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksb0JBQVMsQ0FBQyxvQkFBb0I7b0JBQzlDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztvQkFDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSztvQkFDcEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUEsMEJBQWdCLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsTUFBYyxFQUNkLEtBQVk7SUFFWixJQUFJLENBQUMsSUFBQSx1QkFBVyxFQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFZLElBQUEsb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxPQUFPLElBQUEsbUJBQWdCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0IHtcbiAgdG9rZW5pemUsXG4gIGhhc1RlbXBsYXRlLFxuICBUb2tlbml6ZXJFcnJvcixcbiAgTUFYX0ZJRUxEX1NJWkVfQllURVMsXG4gIE1BWF9QQVRIX0RFUFRILFxuICBNQVhfSURFTlRJRklFUl9MRU5HVEgsXG4gIHR5cGUgVG9rZW4sXG4gIHR5cGUgTGl0ZXJhbFRva2VuLFxuICB0eXBlIEV4cHJUb2tlbixcbiAgdHlwZSBTb3VyY2VQb3NpdGlvbixcbn0gZnJvbSAnLi90b2tlbml6ZXInO1xuXG5leHBvcnQge1xuICByZXNvbHZlLFxuICBsb29rdXBQYXRoLFxuICBkZXBlbmRlbmNpZXMsXG4gIHR5cGUgU2NvcGUsXG4gIHR5cGUgRXZhbEVycm9yLFxufSBmcm9tICcuL2V2YWx1YXRvcic7XG5cbmV4cG9ydCB7XG4gIHdhbGtBbmRCaW5kLFxuICB0eXBlIFdhbGtFbnRyeSxcbiAgdHlwZSBGaWVsZFByZWRpY2F0ZSxcbn0gZnJvbSAnLi93YWxrZXInO1xuXG5leHBvcnQge1xuICB0b3BvU29ydCxcbiAgdHlwZSBUb3BvTm9kZSxcbiAgdHlwZSBUb3BvUmVzdWx0LFxufSBmcm9tICcuL3RvcG8tc29ydCc7XG5cbmV4cG9ydCB7XG4gIFRva2VuQ2FjaGUsXG4gIGRlZmF1bHRUb2tlbkNhY2hlLFxufSBmcm9tICcuL2NhY2hlJztcblxuZXhwb3J0IHtcbiAgdmFsaWRhdGVUZW1wbGF0ZXMsXG4gIGRldGVjdEN5Y2xlcyxcbiAgYWxsb3dlZFNjb3BlUm9vdHMsXG4gIHR5cGUgVGVtcGxhdGVFcnJvcixcbiAgdHlwZSBWYWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL3ZhbGlkYXRlJztcblxuZXhwb3J0IHtcbiAgcmVjb3JkUmVzb2x1dGlvbixcbiAgdGVtcGxhdGVSZXNvbHV0aW9uc1RvdGFsLFxuICB0ZW1wbGF0ZVJlc29sdXRpb25EdXJhdGlvbk1zLFxufSBmcm9tICcuL21ldHJpY3MnO1xuXG4vLyAtLSBDb252ZW5pZW5jZTogaGlnaC1sZXZlbCByZXNvbHZlKCkgdGhhdCB3YWxrcyArIHJlc29sdmVzICsgbWVhc3VyZXNcblxuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZSBhcyBldmFsdWF0b3JSZXNvbHZlLCB0eXBlIFNjb3BlIH0gZnJvbSAnLi9ldmFsdWF0b3InO1xuaW1wb3J0IHsgcmVjb3JkUmVzb2x1dGlvbiB9IGZyb20gJy4vbWV0cmljcyc7XG5pbXBvcnQgeyBoYXNUZW1wbGF0ZSwgdG9rZW5pemUsIFRva2VuIH0gZnJvbSAnLi90b2tlbml6ZXInO1xuaW1wb3J0IHsgdG9wb1NvcnQgfSBmcm9tICcuL3RvcG8tc29ydCc7XG5pbXBvcnQgeyB3YWxrQW5kQmluZCwgdHlwZSBGaWVsZFByZWRpY2F0ZSB9IGZyb20gJy4vd2Fsa2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVzdWx0IHtcbiAgZXJyb3JzOiBBcnJheTx7IGNvZGU6IEVycm9yQ29kZTsgbWVzc2FnZTogc3RyaW5nOyBmaWVsZD86IHN0cmluZzsgcGF0aD86IHN0cmluZyB9Pjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFsbCB0ZW1wbGF0ZXMgaW5zaWRlIGBkb2NgIGJ5IG11dGF0aW5nIHN0cmluZyBmaWVsZHMgaW4gcGxhY2UuXG4gKiBgZG9jYCBpcyB0cmVhdGVkIGFzIG9wYXF1ZSDigJQgb25seSBzdHJpbmcgZmllbGRzIHRoYXQgbWF0Y2ggYGlzVGVtcGxhdGFibGVgXG4gKiBhcmUgcmV3cml0dGVuLiBSZXR1cm5zIGNvbGxlY3RlZCBlcnJvcnMgKGVtcHR5IGFycmF5IG9uIHN1Y2Nlc3MpLlxuICpcbiAqIGBkb2NUeXBlYCBpcyB1c2VkIGZvciBtZXRyaWNzOyBwYXNzICdwaXBlbGluZScgb3IgJ3BsdWdpbicuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGVzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBkb2M6IFQsXG4gIHNjb3BlOiBTY29wZSxcbiAgaXNUZW1wbGF0YWJsZTogRmllbGRQcmVkaWNhdGUsXG4gIGRvY1R5cGU6ICdwaXBlbGluZScgfCAncGx1Z2luJyA9ICdwbHVnaW4nLFxuKTogUmVzb2x2ZVJlc3VsdCB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlKTtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBldmFsdWF0b3JSZXNvbHZlKGVudHJ5LnRva2Vucywgc2NvcGUsIGVudHJ5LmZpZWxkKTtcbiAgICAgIGVudHJ5LnNldCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICBjb25zdCBlID0gZXJyIGFzIEVycm9yICYgeyBjb2RlPzogRXJyb3JDb2RlOyBwYXRoPzogc3RyaW5nIH07XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIGNvZGU6IGUuY29kZSA/PyBFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgZmllbGQ6IGVudHJ5LmZpZWxkLFxuICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVjb3JkUmVzb2x1dGlvbihkb2NUeXBlLCBEYXRlLm5vdygpIC0gc3RhcnQsIHN1Y2Nlc3MpO1xuICByZXR1cm4geyBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc2VsZi1yZWZlcmVuY2luZyBkb2N1bWVudCAoZS5nLiBwaXBlbGluZS5qc29uIHdoZXJlXG4gKiBtZXRhZGF0YSBmaWVsZHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIpLiBUb3BvbG9naWNhbGx5IG9yZGVycyB0aGVcbiAqIHJlc29sdXRpb24gc28gZGVwZW5kZW5jaWVzIGNvbWUgZmlyc3QuIE11dGF0ZXMgYGRvY2AgaW4gcGxhY2UuXG4gKlxuICogYGZpZWxkVG9TY29wZVBhdGhgIG1hcHMgZWFjaCBmaWVsZCAoZS5nLiBgbWV0YWRhdGEuZW52YCkgdG8gdGhlIHNjb3BlXG4gKiBwYXRoIGl0IHBvcHVsYXRlcyAodHlwaWNhbGx5IHRoZSBzYW1lLCBzYW5zIGFueSBhcnJheSBpbmRpY2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZWxmUmVmZXJlbmNpbmc8VCBleHRlbmRzIG9iamVjdD4oXG4gIGRvYzogVCxcbiAgc2NvcGU6IFNjb3BlLFxuICBpc1RlbXBsYXRhYmxlOiBGaWVsZFByZWRpY2F0ZSxcbiAgZmllbGRUb1Njb3BlUGF0aDogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwsXG4gIGRvY1R5cGU6ICdwaXBlbGluZScgfCAncGx1Z2luJyA9ICdwaXBlbGluZScsXG4pOiBSZXNvbHZlUmVzdWx0IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlKTtcbiAgLy8gQnVpbGQgdG9wbyBub2RlcyBrZXllZCBieSB0YXJnZXQgc2NvcGUgcGF0aFxuICBjb25zdCBub2RlcyA9IGVudHJpZXNcbiAgICAubWFwKGUgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZmllbGRUb1Njb3BlUGF0aChlLmZpZWxkKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgZS50b2tlbnMpIGlmICh0LmtpbmQgPT09ICdleHByJykgZGVwcy5wdXNoKHQucGF0aC5qb2luKCcuJykpO1xuICAgICAgcmV0dXJuIHsga2V5LCBkZXBzLCBlbnRyeTogZSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigobik6IG4gaXMgTm9uTnVsbGFibGU8dHlwZW9mIG4+ID0+IG4gIT09IG51bGwpO1xuXG4gIGNvbnN0IHsgb3JkZXJlZCwgY3ljbGVzIH0gPSB0b3BvU29ydChub2Rlcy5tYXAobiA9PiAoeyBrZXk6IG4ua2V5LCBkZXBzOiBuLmRlcHMgfSkpKTtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICBpZiAoY3ljbGVzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgYyBvZiBjeWNsZXMpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX0NZQ0xFLFxuICAgICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgY3ljbGUgZGV0ZWN0ZWQ6ICR7Yy5qb2luKCcgLT4gJyl9YCxcbiAgICAgICAgcGF0aDogYy5qb2luKCcgLT4gJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVjb3JkUmVzb2x1dGlvbihkb2NUeXBlLCBEYXRlLm5vdygpIC0gc3RhcnQsIGZhbHNlKTtcbiAgICByZXR1cm4geyBlcnJvcnMgfTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgaW4gdG9wbyBvcmRlcjsgbXVsdGlwbGUgZW50cmllcyBtYXkgc2hhcmUgYSBzY29wZSBrZXkgKGUuZy4gb25lXG4gIC8vIHBpcGVsaW5lIGZpZWxkIGNvdWxkIG1hcCB0byB0aGUgc2FtZSBzY29wZSBwYXRoIOKAlCB1bmxpa2VseSBoZXJlKSwgc29cbiAgLy8gaXRlcmF0ZSBhbGwgZW50cmllcyB3aG9zZSBrZXkgPT0gb3JkZXJlZFtpXS5cbiAgY29uc3QgYnlLZXkgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG5vZGVzPigpO1xuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlLZXkuZ2V0KG4ua2V5KSA/PyBbXTtcbiAgICBsaXN0LnB1c2gobik7XG4gICAgYnlLZXkuc2V0KG4ua2V5LCBsaXN0KTtcbiAgfVxuXG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3JkZXJlZCkge1xuICAgIGZvciAoY29uc3QgbiBvZiBieUtleS5nZXQoa2V5KSA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmFsdWF0b3JSZXNvbHZlKG4uZW50cnkudG9rZW5zLCBzY29wZSwgbi5lbnRyeS5maWVsZCk7XG4gICAgICAgIG4uZW50cnkuc2V0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3IgJiB7IGNvZGU/OiBFcnJvckNvZGU7IHBhdGg/OiBzdHJpbmcgfTtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGNvZGU6IGUuY29kZSA/PyBFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgIGZpZWxkOiBuLmVudHJ5LmZpZWxkLFxuICAgICAgICAgIHBhdGg6IGUucGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY29yZFJlc29sdXRpb24oZG9jVHlwZSwgRGF0ZS5ub3coKSAtIHN0YXJ0LCBzdWNjZXNzKTtcbiAgcmV0dXJuIHsgZXJyb3JzIH07XG59XG5cbi8qKlxuICogSW5saW5lIHJvdW5kLXRyaXAgaGVscGVyIOKAlCBwYXJzZXMgYW5kIHJlc29sdmVzIGEgc2luZ2xlIHN0cmluZyBhZ2FpbnN0XG4gKiBhIHNjb3BlLiBSZXR1cm5zIGEgc3RyaW5nIHVubGVzcyBhIHdob2xlLWZpZWxkIGNvZXJjaW9uIGZpbHRlciB3YXNcbiAqIHVzZWQgKGluIHdoaWNoIGNhc2UgdGhlIG5hdGl2ZSB0eXBlIGZyb20gYHwgbnVtYmVyYCwgYHwgYm9vbGAsIG9yXG4gKiBgfCBqc29uYCBpcyByZXR1cm5lZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RyaW5nKFxuICBzb3VyY2U6IHN0cmluZyxcbiAgc2NvcGU6IFNjb3BlLFxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghaGFzVGVtcGxhdGUoc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcbiAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gdG9rZW5pemUoc291cmNlKTtcbiAgcmV0dXJuIGV2YWx1YXRvclJlc29sdmUodG9rZW5zLCBzY29wZSk7XG59XG4iXX0=
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxxQkFBcUIsR0FLdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEdBR2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsV0FBVyxHQUdaLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDTCxRQUFRLEdBR1QsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLFlBQVksQ0FBQztBQUVwQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixpQkFBaUIsR0FHbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsNEJBQTRCLEdBQzdCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLHdFQUF3RTtBQUV4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQU0vRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JB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QkFDckUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBa0QsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsb0JBQW9CO29CQUM5QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUs7b0JBQ3BCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsTUFBYyxFQUNkLEtBQVk7SUFFWixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFZLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHRva2VuaXplLFxuICBoYXNUZW1wbGF0ZSxcbiAgVG9rZW5pemVyRXJyb3IsXG4gIE1BWF9GSUVMRF9TSVpFX0JZVEVTLFxuICBNQVhfUEFUSF9ERVBUSCxcbiAgTUFYX0lERU5USUZJRVJfTEVOR1RILFxuICB0eXBlIFRva2VuLFxuICB0eXBlIExpdGVyYWxUb2tlbixcbiAgdHlwZSBFeHByVG9rZW4sXG4gIHR5cGUgU291cmNlUG9zaXRpb24sXG59IGZyb20gJy4vdG9rZW5pemVyLmpzJztcblxuZXhwb3J0IHtcbiAgcmVzb2x2ZSxcbiAgbG9va3VwUGF0aCxcbiAgZGVwZW5kZW5jaWVzLFxuICB0eXBlIFNjb3BlLFxuICB0eXBlIEV2YWxFcnJvcixcbn0gZnJvbSAnLi9ldmFsdWF0b3IuanMnO1xuXG5leHBvcnQge1xuICB3YWxrQW5kQmluZCxcbiAgdHlwZSBXYWxrRW50cnksXG4gIHR5cGUgRmllbGRQcmVkaWNhdGUsXG59IGZyb20gJy4vd2Fsa2VyLmpzJztcblxuZXhwb3J0IHtcbiAgdG9wb1NvcnQsXG4gIHR5cGUgVG9wb05vZGUsXG4gIHR5cGUgVG9wb1Jlc3VsdCxcbn0gZnJvbSAnLi90b3BvLXNvcnQuanMnO1xuXG5leHBvcnQge1xuICBUb2tlbkNhY2hlLFxuICBkZWZhdWx0VG9rZW5DYWNoZSxcbn0gZnJvbSAnLi9jYWNoZS5qcyc7XG5cbmV4cG9ydCB7XG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCB7XG4gIHJlY29yZFJlc29sdXRpb24sXG4gIHRlbXBsYXRlUmVzb2x1dGlvbnNUb3RhbCxcbiAgdGVtcGxhdGVSZXNvbHV0aW9uRHVyYXRpb25Ncyxcbn0gZnJvbSAnLi9tZXRyaWNzLmpzJztcblxuLy8gLS0gQ29udmVuaWVuY2U6IGhpZ2gtbGV2ZWwgcmVzb2x2ZSgpIHRoYXQgd2Fsa3MgKyByZXNvbHZlcyArIG1lYXN1cmVzXG5cbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHJlc29sdmUgYXMgZXZhbHVhdG9yUmVzb2x2ZSwgdHlwZSBTY29wZSB9IGZyb20gJy4vZXZhbHVhdG9yLmpzJztcbmltcG9ydCB7IHJlY29yZFJlc29sdXRpb24gfSBmcm9tICcuL21ldHJpY3MuanMnO1xuaW1wb3J0IHsgaGFzVGVtcGxhdGUsIHRva2VuaXplLCB0eXBlIFRva2VuIH0gZnJvbSAnLi90b2tlbml6ZXIuanMnO1xuaW1wb3J0IHsgdG9wb1NvcnQgfSBmcm9tICcuL3RvcG8tc29ydC5qcyc7XG5pbXBvcnQgeyB3YWxrQW5kQmluZCwgdHlwZSBGaWVsZFByZWRpY2F0ZSB9IGZyb20gJy4vd2Fsa2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVzdWx0IHtcbiAgZXJyb3JzOiBBcnJheTx7IGNvZGU6IEVycm9yQ29kZTsgbWVzc2FnZTogc3RyaW5nOyBmaWVsZD86IHN0cmluZzsgcGF0aD86IHN0cmluZyB9Pjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFsbCB0ZW1wbGF0ZXMgaW5zaWRlIGBkb2NgIGJ5IG11dGF0aW5nIHN0cmluZyBmaWVsZHMgaW4gcGxhY2UuXG4gKiBgZG9jYCBpcyB0cmVhdGVkIGFzIG9wYXF1ZSDigJQgb25seSBzdHJpbmcgZmllbGRzIHRoYXQgbWF0Y2ggYGlzVGVtcGxhdGFibGVgXG4gKiBhcmUgcmV3cml0dGVuLiBSZXR1cm5zIGNvbGxlY3RlZCBlcnJvcnMgKGVtcHR5IGFycmF5IG9uIHN1Y2Nlc3MpLlxuICpcbiAqIGBkb2NUeXBlYCBpcyB1c2VkIGZvciBtZXRyaWNzOyBwYXNzICdwaXBlbGluZScgb3IgJ3BsdWdpbicuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGVzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBkb2M6IFQsXG4gIHNjb3BlOiBTY29wZSxcbiAgaXNUZW1wbGF0YWJsZTogRmllbGRQcmVkaWNhdGUsXG4gIGRvY1R5cGU6ICdwaXBlbGluZScgfCAncGx1Z2luJyA9ICdwbHVnaW4nLFxuKTogUmVzb2x2ZVJlc3VsdCB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlKTtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBldmFsdWF0b3JSZXNvbHZlKGVudHJ5LnRva2Vucywgc2NvcGUsIGVudHJ5LmZpZWxkKTtcbiAgICAgIGVudHJ5LnNldCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICBjb25zdCBlID0gZXJyIGFzIEVycm9yICYgeyBjb2RlPzogRXJyb3JDb2RlOyBwYXRoPzogc3RyaW5nIH07XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIGNvZGU6IGUuY29kZSA/PyBFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgZmllbGQ6IGVudHJ5LmZpZWxkLFxuICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVjb3JkUmVzb2x1dGlvbihkb2NUeXBlLCBEYXRlLm5vdygpIC0gc3RhcnQsIHN1Y2Nlc3MpO1xuICByZXR1cm4geyBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc2VsZi1yZWZlcmVuY2luZyBkb2N1bWVudCAoZS5nLiBwaXBlbGluZS5qc29uIHdoZXJlXG4gKiBtZXRhZGF0YSBmaWVsZHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIpLiBUb3BvbG9naWNhbGx5IG9yZGVycyB0aGVcbiAqIHJlc29sdXRpb24gc28gZGVwZW5kZW5jaWVzIGNvbWUgZmlyc3QuIE11dGF0ZXMgYGRvY2AgaW4gcGxhY2UuXG4gKlxuICogYGZpZWxkVG9TY29wZVBhdGhgIG1hcHMgZWFjaCBmaWVsZCAoZS5nLiBgbWV0YWRhdGEuZW52YCkgdG8gdGhlIHNjb3BlXG4gKiBwYXRoIGl0IHBvcHVsYXRlcyAodHlwaWNhbGx5IHRoZSBzYW1lLCBzYW5zIGFueSBhcnJheSBpbmRpY2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZWxmUmVmZXJlbmNpbmc8VCBleHRlbmRzIG9iamVjdD4oXG4gIGRvYzogVCxcbiAgc2NvcGU6IFNjb3BlLFxuICBpc1RlbXBsYXRhYmxlOiBGaWVsZFByZWRpY2F0ZSxcbiAgZmllbGRUb1Njb3BlUGF0aDogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwsXG4gIGRvY1R5cGU6ICdwaXBlbGluZScgfCAncGx1Z2luJyA9ICdwaXBlbGluZScsXG4pOiBSZXNvbHZlUmVzdWx0IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlKTtcbiAgLy8gQnVpbGQgdG9wbyBub2RlcyBrZXllZCBieSB0YXJnZXQgc2NvcGUgcGF0aFxuICBjb25zdCBub2RlcyA9IGVudHJpZXNcbiAgICAubWFwKGUgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZmllbGRUb1Njb3BlUGF0aChlLmZpZWxkKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgZS50b2tlbnMpIGlmICh0LmtpbmQgPT09ICdleHByJykgZGVwcy5wdXNoKHQucGF0aC5qb2luKCcuJykpO1xuICAgICAgcmV0dXJuIHsga2V5LCBkZXBzLCBlbnRyeTogZSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigobik6IG4gaXMgTm9uTnVsbGFibGU8dHlwZW9mIG4+ID0+IG4gIT09IG51bGwpO1xuXG4gIGNvbnN0IHsgb3JkZXJlZCwgY3ljbGVzIH0gPSB0b3BvU29ydChub2Rlcy5tYXAobiA9PiAoeyBrZXk6IG4ua2V5LCBkZXBzOiBuLmRlcHMgfSkpKTtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICBpZiAoY3ljbGVzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgYyBvZiBjeWNsZXMpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX0NZQ0xFLFxuICAgICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgY3ljbGUgZGV0ZWN0ZWQ6ICR7Yy5qb2luKCcgLT4gJyl9YCxcbiAgICAgICAgcGF0aDogYy5qb2luKCcgLT4gJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVjb3JkUmVzb2x1dGlvbihkb2NUeXBlLCBEYXRlLm5vdygpIC0gc3RhcnQsIGZhbHNlKTtcbiAgICByZXR1cm4geyBlcnJvcnMgfTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgaW4gdG9wbyBvcmRlcjsgbXVsdGlwbGUgZW50cmllcyBtYXkgc2hhcmUgYSBzY29wZSBrZXkgKGUuZy4gb25lXG4gIC8vIHBpcGVsaW5lIGZpZWxkIGNvdWxkIG1hcCB0byB0aGUgc2FtZSBzY29wZSBwYXRoIOKAlCB1bmxpa2VseSBoZXJlKSwgc29cbiAgLy8gaXRlcmF0ZSBhbGwgZW50cmllcyB3aG9zZSBrZXkgPT0gb3JkZXJlZFtpXS5cbiAgY29uc3QgYnlLZXkgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG5vZGVzPigpO1xuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlLZXkuZ2V0KG4ua2V5KSA/PyBbXTtcbiAgICBsaXN0LnB1c2gobik7XG4gICAgYnlLZXkuc2V0KG4ua2V5LCBsaXN0KTtcbiAgfVxuXG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3JkZXJlZCkge1xuICAgIGZvciAoY29uc3QgbiBvZiBieUtleS5nZXQoa2V5KSA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmFsdWF0b3JSZXNvbHZlKG4uZW50cnkudG9rZW5zLCBzY29wZSwgbi5lbnRyeS5maWVsZCk7XG4gICAgICAgIG4uZW50cnkuc2V0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3IgJiB7IGNvZGU/OiBFcnJvckNvZGU7IHBhdGg/OiBzdHJpbmcgfTtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGNvZGU6IGUuY29kZSA/PyBFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgIGZpZWxkOiBuLmVudHJ5LmZpZWxkLFxuICAgICAgICAgIHBhdGg6IGUucGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY29yZFJlc29sdXRpb24oZG9jVHlwZSwgRGF0ZS5ub3coKSAtIHN0YXJ0LCBzdWNjZXNzKTtcbiAgcmV0dXJuIHsgZXJyb3JzIH07XG59XG5cbi8qKlxuICogSW5saW5lIHJvdW5kLXRyaXAgaGVscGVyIOKAlCBwYXJzZXMgYW5kIHJlc29sdmVzIGEgc2luZ2xlIHN0cmluZyBhZ2FpbnN0XG4gKiBhIHNjb3BlLiBSZXR1cm5zIGEgc3RyaW5nIHVubGVzcyBhIHdob2xlLWZpZWxkIGNvZXJjaW9uIGZpbHRlciB3YXNcbiAqIHVzZWQgKGluIHdoaWNoIGNhc2UgdGhlIG5hdGl2ZSB0eXBlIGZyb20gYHwgbnVtYmVyYCwgYHwgYm9vbGAsIG9yXG4gKiBgfCBqc29uYCBpcyByZXR1cm5lZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RyaW5nKFxuICBzb3VyY2U6IHN0cmluZyxcbiAgc2NvcGU6IFNjb3BlLFxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghaGFzVGVtcGxhdGUoc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcbiAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gdG9rZW5pemUoc291cmNlKTtcbiAgcmV0dXJuIGV2YWx1YXRvclJlc29sdmUodG9rZW5zLCBzY29wZSk7XG59XG4iXX0=
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prometheus metrics for template resolution. Optional — the module is
|
|
3
|
-
* only wired up when `prom-client` is already present in the host
|
|
4
|
-
* process (as is the case for api-server based services). Falls back to
|
|
5
|
-
* no-op stubs when unavailable so pipeline-core stays usable outside
|
|
6
|
-
* server contexts.
|
|
7
|
-
*/
|
|
8
1
|
interface Counter {
|
|
9
2
|
inc(labels?: Record<string, string>, value?: number): void;
|
|
10
3
|
}
|
package/lib/template/metrics.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Prometheus metrics for template resolution. Optional — the module is
|
|
5
|
+
* only wired up when `prom-client` is already present in the host
|
|
6
|
+
* process (as is the case for api-server based services). Falls back to
|
|
7
|
+
* no-op stubs when unavailable so pipeline-core stays usable outside
|
|
8
|
+
* server contexts.
|
|
9
|
+
*/
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
// ESM has no global `require`; createRequire enables the synchronous, OPTIONAL
|
|
12
|
+
// lazy-load of prom-client below (no-op stubs when it isn't installed).
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
7
14
|
function resolvePromClient() {
|
|
8
15
|
try {
|
|
9
16
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
@@ -26,10 +33,10 @@ function makeHistogram(name, help, labelNames, buckets) {
|
|
|
26
33
|
const existing = promClient.register.getSingleMetric(name);
|
|
27
34
|
return existing ?? new promClient.Histogram({ name, help, labelNames, buckets });
|
|
28
35
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
function recordResolution(doc, durationMs, success) {
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
export const templateResolutionsTotal = makeCounter('pipeline_builder_template_resolutions_total', 'Total number of template resolution operations', ['outcome', 'doc']);
|
|
37
|
+
export const templateResolutionDurationMs = makeHistogram('pipeline_builder_template_resolution_duration_ms', 'Template resolution duration in milliseconds', ['doc'], [1, 5, 10, 50, 100, 500, 1000]);
|
|
38
|
+
export function recordResolution(doc, durationMs, success) {
|
|
39
|
+
templateResolutionsTotal.inc({ outcome: success ? 'success' : 'error', doc });
|
|
40
|
+
templateResolutionDurationMs.observe({ doc }, durationMs);
|
|
34
41
|
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1QywrRUFBK0U7QUFDL0Usd0VBQXdFO0FBQ3hFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBSy9DLFNBQVMsaUJBQWlCO0lBQ3hCLElBQUksQ0FBQztRQUNILGlFQUFpRTtRQUNqRSxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFFdkMsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxVQUFvQjtJQUNuRSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQWMsQ0FBQyxFQUFFLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsT0FBTyxRQUFRLElBQUksSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLFVBQW9CLEVBQUUsT0FBaUI7SUFDeEYsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFjLENBQUMsRUFBRSxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELE9BQU8sUUFBUSxJQUFJLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FDakQsNkNBQTZDLEVBQzdDLGdEQUFnRCxFQUNoRCxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FDbkIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLGFBQWEsQ0FDdkQsa0RBQWtELEVBQ2xELDhDQUE4QyxFQUM5QyxDQUFDLEtBQUssQ0FBQyxFQUNQLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQy9CLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBMEIsRUFBRSxVQUFrQixFQUFFLE9BQWdCO0lBQy9GLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUUsNEJBQTRCLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFByb21ldGhldXMgbWV0cmljcyBmb3IgdGVtcGxhdGUgcmVzb2x1dGlvbi4gT3B0aW9uYWwg4oCUIHRoZSBtb2R1bGUgaXNcbiAqIG9ubHkgd2lyZWQgdXAgd2hlbiBgcHJvbS1jbGllbnRgIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgaG9zdFxuICogcHJvY2VzcyAoYXMgaXMgdGhlIGNhc2UgZm9yIGFwaS1zZXJ2ZXIgYmFzZWQgc2VydmljZXMpLiBGYWxscyBiYWNrIHRvXG4gKiBuby1vcCBzdHVicyB3aGVuIHVuYXZhaWxhYmxlIHNvIHBpcGVsaW5lLWNvcmUgc3RheXMgdXNhYmxlIG91dHNpZGVcbiAqIHNlcnZlciBjb250ZXh0cy5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuXG4vLyBFU00gaGFzIG5vIGdsb2JhbCBgcmVxdWlyZWA7IGNyZWF0ZVJlcXVpcmUgZW5hYmxlcyB0aGUgc3luY2hyb25vdXMsIE9QVElPTkFMXG4vLyBsYXp5LWxvYWQgb2YgcHJvbS1jbGllbnQgYmVsb3cgKG5vLW9wIHN0dWJzIHdoZW4gaXQgaXNuJ3QgaW5zdGFsbGVkKS5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmludGVyZmFjZSBDb3VudGVyIHsgaW5jKGxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlPzogbnVtYmVyKTogdm9pZCB9XG5pbnRlcmZhY2UgSGlzdG9ncmFtIHsgb2JzZXJ2ZShsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlOiBudW1iZXIpOiB2b2lkIH1cblxuZnVuY3Rpb24gcmVzb2x2ZVByb21DbGllbnQoKTogYW55IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICByZXR1cm4gcmVxdWlyZSgncHJvbS1jbGllbnQnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY29uc3QgcHJvbUNsaWVudCA9IHJlc29sdmVQcm9tQ2xpZW50KCk7XG5cbmZ1bmN0aW9uIG1ha2VDb3VudGVyKG5hbWU6IHN0cmluZywgaGVscDogc3RyaW5nLCBsYWJlbE5hbWVzOiBzdHJpbmdbXSk6IENvdW50ZXIge1xuICBpZiAoIXByb21DbGllbnQpIHJldHVybiB7IGluYzogKCkgPT4geyAvKiBub29wICovIH0gfTtcbiAgY29uc3QgZXhpc3RpbmcgPSBwcm9tQ2xpZW50LnJlZ2lzdGVyLmdldFNpbmdsZU1ldHJpYyhuYW1lKTtcbiAgcmV0dXJuIGV4aXN0aW5nID8/IG5ldyBwcm9tQ2xpZW50LkNvdW50ZXIoeyBuYW1lLCBoZWxwLCBsYWJlbE5hbWVzIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlSGlzdG9ncmFtKG5hbWU6IHN0cmluZywgaGVscDogc3RyaW5nLCBsYWJlbE5hbWVzOiBzdHJpbmdbXSwgYnVja2V0czogbnVtYmVyW10pOiBIaXN0b2dyYW0ge1xuICBpZiAoIXByb21DbGllbnQpIHJldHVybiB7IG9ic2VydmU6ICgpID0+IHsgLyogbm9vcCAqLyB9IH07XG4gIGNvbnN0IGV4aXN0aW5nID0gcHJvbUNsaWVudC5yZWdpc3Rlci5nZXRTaW5nbGVNZXRyaWMobmFtZSk7XG4gIHJldHVybiBleGlzdGluZyA/PyBuZXcgcHJvbUNsaWVudC5IaXN0b2dyYW0oeyBuYW1lLCBoZWxwLCBsYWJlbE5hbWVzLCBidWNrZXRzIH0pO1xufVxuXG5leHBvcnQgY29uc3QgdGVtcGxhdGVSZXNvbHV0aW9uc1RvdGFsID0gbWFrZUNvdW50ZXIoXG4gICdwaXBlbGluZV9idWlsZGVyX3RlbXBsYXRlX3Jlc29sdXRpb25zX3RvdGFsJyxcbiAgJ1RvdGFsIG51bWJlciBvZiB0ZW1wbGF0ZSByZXNvbHV0aW9uIG9wZXJhdGlvbnMnLFxuICBbJ291dGNvbWUnLCAnZG9jJ10sXG4pO1xuXG5leHBvcnQgY29uc3QgdGVtcGxhdGVSZXNvbHV0aW9uRHVyYXRpb25NcyA9IG1ha2VIaXN0b2dyYW0oXG4gICdwaXBlbGluZV9idWlsZGVyX3RlbXBsYXRlX3Jlc29sdXRpb25fZHVyYXRpb25fbXMnLFxuICAnVGVtcGxhdGUgcmVzb2x1dGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMnLFxuICBbJ2RvYyddLFxuICBbMSwgNSwgMTAsIDUwLCAxMDAsIDUwMCwgMTAwMF0sXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkUmVzb2x1dGlvbihkb2M6ICdwaXBlbGluZScgfCAncGx1Z2luJywgZHVyYXRpb25NczogbnVtYmVyLCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gIHRlbXBsYXRlUmVzb2x1dGlvbnNUb3RhbC5pbmMoeyBvdXRjb21lOiBzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJywgZG9jIH0pO1xuICB0ZW1wbGF0ZVJlc29sdXRpb25EdXJhdGlvbk1zLm9ic2VydmUoeyBkb2MgfSwgZHVyYXRpb25Ncyk7XG59XG4iXX0=
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
exports.isPluginTemplatableField = isPluginTemplatableField;
|
|
6
|
-
exports.resolvePluginTemplates = resolvePluginTemplates;
|
|
7
|
-
const index_1 = require("./index");
|
|
3
|
+
import { resolveTemplates } from './index.js';
|
|
8
4
|
/**
|
|
9
5
|
* Fields inside a Plugin record that accept `{{ ... }}` templates.
|
|
10
6
|
*
|
|
@@ -20,7 +16,7 @@ const TEMPLATABLE_FIELDS = [
|
|
|
20
16
|
'env', // Record<string, string>
|
|
21
17
|
'buildArgs', // Record<string, string>
|
|
22
18
|
];
|
|
23
|
-
function isPluginTemplatableField(field) {
|
|
19
|
+
export function isPluginTemplatableField(field) {
|
|
24
20
|
// `commands` / `installCommands` are arrays of strings → entries like 'commands[0]'
|
|
25
21
|
// `env` / `buildArgs` are objects → entries like 'env.STAGE'
|
|
26
22
|
return TEMPLATABLE_FIELDS.some(f => field === f || field.startsWith(`${f}[`) || field.startsWith(`${f}.`));
|
|
@@ -30,7 +26,7 @@ function isPluginTemplatableField(field) {
|
|
|
30
26
|
* resolved against the given pipeline scope. Caller must pre-populate
|
|
31
27
|
* `pipelineScope` with `{ pipeline, plugin, env }` keys.
|
|
32
28
|
*/
|
|
33
|
-
function resolvePluginTemplates(plugin, pipelineScope) {
|
|
29
|
+
export function resolvePluginTemplates(plugin, pipelineScope) {
|
|
34
30
|
// Deep clone so mutations don't leak back to the caller's Plugin.
|
|
35
31
|
// Structural fields we care about are plain JSON; structuredClone is safe.
|
|
36
32
|
const clone = structuredClone(plugin);
|
|
@@ -39,7 +35,7 @@ function resolvePluginTemplates(plugin, pipelineScope) {
|
|
|
39
35
|
plugin: { name: plugin.name, version: plugin.version },
|
|
40
36
|
env: plugin.env ?? {},
|
|
41
37
|
};
|
|
42
|
-
const { errors } =
|
|
38
|
+
const { errors } = resolveTemplates(clone, scope, isPluginTemplatableField, 'plugin');
|
|
43
39
|
if (errors.length > 0) {
|
|
44
40
|
// First error wins — resolver errors should never be batched at synth time
|
|
45
41
|
// because a broken template is a programmer error, not a validation step.
|
|
@@ -49,4 +45,4 @@ function resolvePluginTemplates(plugin, pipelineScope) {
|
|
|
49
45
|
}
|
|
50
46
|
return clone;
|
|
51
47
|
}
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU5Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixhQUFhO0lBQ2IsVUFBVSxFQUFFLFdBQVc7SUFDdkIsaUJBQWlCLEVBQUUsV0FBVztJQUM5QixLQUFLLEVBQUUseUJBQXlCO0lBQ2hDLFdBQVcsRUFBRSx5QkFBeUI7Q0FDOUIsQ0FBQztBQUVYLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFhO0lBQ3BELG9GQUFvRjtJQUNwRiw2REFBNkQ7SUFDN0QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE1BQWMsRUFDZCxhQUFzQztJQUV0QyxrRUFBa0U7SUFDbEUsMkVBQTJFO0lBQzNFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQXFDLENBQUM7SUFFMUUsTUFBTSxLQUFLLEdBQUc7UUFDWixHQUFHLGFBQWE7UUFDaEIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDdEQsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRTtLQUN0QixDQUFDO0lBRUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEYsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLHlDQUF5QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hHLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgcmVzb2x2ZVRlbXBsYXRlcyB9IGZyb20gJy4vaW5kZXguanMnO1xuXG4vKipcbiAqIEZpZWxkcyBpbnNpZGUgYSBQbHVnaW4gcmVjb3JkIHRoYXQgYWNjZXB0IGB7eyAuLi4gfX1gIHRlbXBsYXRlcy5cbiAqXG4gKiBQdXJlLXN0cmluZyBsZWF2ZXMgb25seS4gYG5hbWVgLCBgdmVyc2lvbmAsIGBwbHVnaW5UeXBlYCwgYGNvbXB1dGVUeXBlYCxcbiAqIGB0aW1lb3V0YCwgYHNlY3JldHNgLCBgZmFpbHVyZUJlaGF2aW9yYCwgYHJlcXVpcmVkTWV0YWRhdGFgLCBgcmVxdWlyZWRWYXJzYFxuICogc3RheSBsaXRlcmFsLiBgbWV0YWRhdGEuKmAgaXMgZXhjbHVkZWQgYmVjYXVzZSBDREstbWV0YWRhdGEgdmFsdWVzIGFyZVxuICogc3RydWN0dXJhbCwgbm90IHVzZXItaW50ZXJwb2xhdGVkLlxuICovXG5jb25zdCBURU1QTEFUQUJMRV9GSUVMRFMgPSBbXG4gICdkZXNjcmlwdGlvbicsXG4gICdjb21tYW5kcycsIC8vIHN0cmluZ1tdXG4gICdpbnN0YWxsQ29tbWFuZHMnLCAvLyBzdHJpbmdbXVxuICAnZW52JywgLy8gUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAnYnVpbGRBcmdzJywgLy8gUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGx1Z2luVGVtcGxhdGFibGVGaWVsZChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBjb21tYW5kc2AgLyBgaW5zdGFsbENvbW1hbmRzYCBhcmUgYXJyYXlzIG9mIHN0cmluZ3Mg4oaSIGVudHJpZXMgbGlrZSAnY29tbWFuZHNbMF0nXG4gIC8vIGBlbnZgIC8gYGJ1aWxkQXJnc2AgYXJlIG9iamVjdHMg4oaSIGVudHJpZXMgbGlrZSAnZW52LlNUQUdFJ1xuICByZXR1cm4gVEVNUExBVEFCTEVfRklFTERTLnNvbWUoZiA9PiBmaWVsZCA9PT0gZiB8fCBmaWVsZC5zdGFydHNXaXRoKGAke2Z9W2ApIHx8IGZpZWxkLnN0YXJ0c1dpdGgoYCR7Zn0uYCkpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHNoYWxsb3cgY2xvbmUgb2YgYHBsdWdpbmAgd2l0aCBhbGwgYHt7IC4uLiB9fWAgdGVtcGxhdGVzXG4gKiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbiBwaXBlbGluZSBzY29wZS4gQ2FsbGVyIG11c3QgcHJlLXBvcHVsYXRlXG4gKiBgcGlwZWxpbmVTY29wZWAgd2l0aCBgeyBwaXBlbGluZSwgcGx1Z2luLCBlbnYgfWAga2V5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMoXG4gIHBsdWdpbjogUGx1Z2luLFxuICBwaXBlbGluZVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFBsdWdpbiB7XG4gIC8vIERlZXAgY2xvbmUgc28gbXV0YXRpb25zIGRvbid0IGxlYWsgYmFjayB0byB0aGUgY2FsbGVyJ3MgUGx1Z2luLlxuICAvLyBTdHJ1Y3R1cmFsIGZpZWxkcyB3ZSBjYXJlIGFib3V0IGFyZSBwbGFpbiBKU09OOyBzdHJ1Y3R1cmVkQ2xvbmUgaXMgc2FmZS5cbiAgY29uc3QgY2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUocGx1Z2luKSBhcyBQbHVnaW4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdCBzY29wZSA9IHtcbiAgICAuLi5waXBlbGluZVNjb3BlLFxuICAgIHBsdWdpbjogeyBuYW1lOiBwbHVnaW4ubmFtZSwgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24gfSxcbiAgICBlbnY6IHBsdWdpbi5lbnYgPz8ge30sXG4gIH07XG5cbiAgY29uc3QgeyBlcnJvcnMgfSA9IHJlc29sdmVUZW1wbGF0ZXMoY2xvbmUsIHNjb3BlLCBpc1BsdWdpblRlbXBsYXRhYmxlRmllbGQsICdwbHVnaW4nKTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgLy8gRmlyc3QgZXJyb3Igd2lucyDigJQgcmVzb2x2ZXIgZXJyb3JzIHNob3VsZCBuZXZlciBiZSBiYXRjaGVkIGF0IHN5bnRoIHRpbWVcbiAgICAvLyBiZWNhdXNlIGEgYnJva2VuIHRlbXBsYXRlIGlzIGEgcHJvZ3JhbW1lciBlcnJvciwgbm90IGEgdmFsaWRhdGlvbiBzdGVwLlxuICAgIGNvbnN0IGUgPSBlcnJvcnNbMF0hO1xuICAgIGNvbnN0IG1zZyA9IGBUZW1wbGF0ZSByZXNvbHV0aW9uIGZhaWxlZCBpbiBwbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGF0IGZpZWxkICcke2UuZmllbGR9JzogJHtlLm1lc3NhZ2V9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG4iXX0=
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.TokenizerError = exports.MAX_IDENTIFIER_LENGTH = exports.MAX_PATH_DEPTH = exports.MAX_FIELD_SIZE_BYTES = void 0;
|
|
6
|
-
exports.tokenize = tokenize;
|
|
7
|
-
exports.hasTemplate = hasTemplate;
|
|
8
3
|
/**
|
|
9
4
|
* Tokenizer for the pipeline-builder template grammar.
|
|
10
5
|
*
|
|
@@ -18,10 +13,10 @@ exports.hasTemplate = hasTemplate;
|
|
|
18
13
|
*
|
|
19
14
|
* `{{{{` is the escape sequence for a literal `{{`.
|
|
20
15
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class TokenizerError extends Error {
|
|
16
|
+
export const MAX_FIELD_SIZE_BYTES = 4 * 1024;
|
|
17
|
+
export const MAX_PATH_DEPTH = 5;
|
|
18
|
+
export const MAX_IDENTIFIER_LENGTH = 64;
|
|
19
|
+
export class TokenizerError extends Error {
|
|
25
20
|
pos;
|
|
26
21
|
constructor(message, pos) {
|
|
27
22
|
super(`${message} at line ${pos.line}, col ${pos.col}`);
|
|
@@ -29,14 +24,13 @@ class TokenizerError extends Error {
|
|
|
29
24
|
this.name = 'TokenizerError';
|
|
30
25
|
}
|
|
31
26
|
}
|
|
32
|
-
exports.TokenizerError = TokenizerError;
|
|
33
27
|
/**
|
|
34
28
|
* Tokenize a template source string. Never throws on valid input;
|
|
35
29
|
* throws `TokenizerError` with source position on malformed templates.
|
|
36
30
|
*/
|
|
37
|
-
function tokenize(source) {
|
|
38
|
-
if (source.length >
|
|
39
|
-
throw new TokenizerError(`Field exceeds max size of ${
|
|
31
|
+
export function tokenize(source) {
|
|
32
|
+
if (source.length > MAX_FIELD_SIZE_BYTES) {
|
|
33
|
+
throw new TokenizerError(`Field exceeds max size of ${MAX_FIELD_SIZE_BYTES} bytes`, { line: 1, col: 1 });
|
|
40
34
|
}
|
|
41
35
|
const tokens = [];
|
|
42
36
|
let i = 0;
|
|
@@ -122,8 +116,8 @@ function readExpression(source, startIdx, startLine, startCol) {
|
|
|
122
116
|
col++;
|
|
123
117
|
}
|
|
124
118
|
const ident = source.slice(startI, i);
|
|
125
|
-
if (ident.length >
|
|
126
|
-
throw new TokenizerError(`Identifier exceeds max length of ${
|
|
119
|
+
if (ident.length > MAX_IDENTIFIER_LENGTH) {
|
|
120
|
+
throw new TokenizerError(`Identifier exceeds max length of ${MAX_IDENTIFIER_LENGTH}`, { line, col: col - ident.length });
|
|
127
121
|
}
|
|
128
122
|
return ident;
|
|
129
123
|
};
|
|
@@ -166,8 +160,8 @@ function readExpression(source, startIdx, startLine, startCol) {
|
|
|
166
160
|
i++;
|
|
167
161
|
col++;
|
|
168
162
|
path.push(readIdentifier());
|
|
169
|
-
if (path.length >
|
|
170
|
-
throw new TokenizerError(`Path depth exceeds max of ${
|
|
163
|
+
if (path.length > MAX_PATH_DEPTH) {
|
|
164
|
+
throw new TokenizerError(`Path depth exceeds max of ${MAX_PATH_DEPTH}`, { line, col });
|
|
171
165
|
}
|
|
172
166
|
}
|
|
173
167
|
skipWs();
|
|
@@ -229,9 +223,9 @@ function readExpression(source, startIdx, startLine, startCol) {
|
|
|
229
223
|
* Convenience: returns true if the source contains any templates.
|
|
230
224
|
* Used as a fast-path to skip tokenization for strings that are obviously literal.
|
|
231
225
|
*/
|
|
232
|
-
function hasTemplate(source) {
|
|
226
|
+
export function hasTemplate(source) {
|
|
233
227
|
// Not completely accurate (a lone `{{{{` would return true) but that's fine —
|
|
234
228
|
// tokenize() will produce a literal-only token list and round-trip correctly.
|
|
235
229
|
return source.includes('{{');
|
|
236
230
|
}
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3Rva2VuaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBMER0Qyw0QkE0RUM7QUFpS0Qsa0NBSUM7QUF6U0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBRVUsUUFBQSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQUEsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNuQixRQUFBLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQTBCeEMsTUFBYSxjQUFlLFNBQVEsS0FBSztJQUdyQjtJQUZsQixZQUNFLE9BQWUsRUFDQyxHQUFtQjtRQUVuQyxLQUFLLENBQUMsR0FBRyxPQUFPLFlBQVksR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUZ4QyxRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUduQyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQVJELHdDQVFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLE1BQWM7SUFDckMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLDRCQUFvQixFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsNkJBQTZCLDRCQUFvQixRQUFRLEVBQ3pELEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQVksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJ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RSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNQLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxNQUFjO0lBQ3hDLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUb2tlbml6ZXIgZm9yIHRoZSBwaXBlbGluZS1idWlsZGVyIHRlbXBsYXRlIGdyYW1tYXIuXG4gKlxuICogR3JhbW1hcjpcbiAqICAgVGVtcGxhdGUgICA6PSAoTGl0ZXJhbCB8IEV4cHIpKlxuICogICBFeHByICAgICAgIDo9IFwie3tcIiB3cyBQYXRoICh3cyBGaWx0ZXIpPyB3cyBcIn19XCJcbiAqICAgUGF0aCAgICAgICA6PSBJZGVudGlmaWVyIChcIi5cIiBJZGVudGlmaWVyKSpcbiAqICAgSWRlbnRpZmllciA6PSBbYS16QS1aX11bYS16QS1aMC05X117MCw2M31cbiAqICAgRmlsdGVyICAgICA6PSBcInxcIiB3cyBcImRlZmF1bHRcIiB3cyBcIjpcIiB3cyBRdW90ZWRcbiAqICAgUXVvdGVkICAgICA6PSBcIidcIiAuLi4gXCInXCIgfCBcIlxcXCJcIiAuLi4gXCJcXFwiXCJcbiAqXG4gKiBge3t7e2AgaXMgdGhlIGVzY2FwZSBzZXF1ZW5jZSBmb3IgYSBsaXRlcmFsIGB7e2AuXG4gKi9cblxuZXhwb3J0IGNvbnN0IE1BWF9GSUVMRF9TSVpFX0JZVEVTID0gNCAqIDEwMjQ7XG5leHBvcnQgY29uc3QgTUFYX1BBVEhfREVQVEggPSA1O1xuZXhwb3J0IGNvbnN0IE1BWF9JREVOVElGSUVSX0xFTkdUSCA9IDY0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVBvc2l0aW9uIHtcbiAgbGluZTogbnVtYmVyO1xuICBjb2w6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXRlcmFsVG9rZW4ge1xuICBraW5kOiAnbGl0ZXJhbCc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHBvczogU291cmNlUG9zaXRpb247XG59XG5cbmV4cG9ydCB0eXBlIENvZXJjZUtpbmQgPSAnbnVtYmVyJyB8ICdib29sJyB8ICdqc29uJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHByVG9rZW4ge1xuICBraW5kOiAnZXhwcic7XG4gIHBhdGg6IHN0cmluZ1tdOyAvLyBlLmcuIFsncGlwZWxpbmUnLCAnbWV0YWRhdGEnLCAnZW52J11cbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nOyAvLyB2YWx1ZSBmb3IgYHwgZGVmYXVsdDogJy4uLidgIGZpbHRlclxuICBjb2VyY2U/OiBDb2VyY2VLaW5kOyAvLyBgfCBudW1iZXJgLCBgfCBib29sYCwgYHwganNvbmBcbiAgc291cmNlOiBzdHJpbmc7IC8vIG9yaWdpbmFsIFwie3sgLi4uIH19XCIgdGV4dCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICBwb3M6IFNvdXJjZVBvc2l0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBUb2tlbiA9IExpdGVyYWxUb2tlbiB8IEV4cHJUb2tlbjtcblxuZXhwb3J0IGNsYXNzIFRva2VuaXplckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHBvczogU291cmNlUG9zaXRpb24sXG4gICkge1xuICAgIHN1cGVyKGAke21lc3NhZ2V9IGF0IGxpbmUgJHtwb3MubGluZX0sIGNvbCAke3Bvcy5jb2x9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1Rva2VuaXplckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRva2VuaXplIGEgdGVtcGxhdGUgc291cmNlIHN0cmluZy4gTmV2ZXIgdGhyb3dzIG9uIHZhbGlkIGlucHV0O1xuICogdGhyb3dzIGBUb2tlbml6ZXJFcnJvcmAgd2l0aCBzb3VyY2UgcG9zaXRpb24gb24gbWFsZm9ybWVkIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplKHNvdXJjZTogc3RyaW5nKTogVG9rZW5bXSB7XG4gIGlmIChzb3VyY2UubGVuZ3RoID4gTUFYX0ZJRUxEX1NJWkVfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoXG4gICAgICBgRmllbGQgZXhjZWVkcyBtYXggc2l6ZSBvZiAke01BWF9GSUVMRF9TSVpFX0JZVEVTfSBieXRlc2AsXG4gICAgICB7IGxpbmU6IDEsIGNvbDogMSB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0b2tlbnM6IFRva2VuW10gPSBbXTtcbiAgbGV0IGkgPSAwO1xuICBsZXQgbGluZSA9IDE7XG4gIGxldCBjb2wgPSAxO1xuICBsZXQgbGl0ZXJhbFN0YXJ0ID0gMDtcbiAgbGV0IGxpdGVyYWxTdGFydFBvczogU291cmNlUG9zaXRpb24gPSB7IGxpbmU6IDEsIGNvbDogMSB9O1xuXG4gIGNvbnN0IGFkdmFuY2UgPSAobjogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGlmIChzb3VyY2VbaSArIGtdID09PSAnXFxuJykge1xuICAgICAgICBsaW5lKys7XG4gICAgICAgIGNvbCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2wrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaSArPSBuO1xuICB9O1xuXG4gIGNvbnN0IGZsdXNoTGl0ZXJhbCA9IChlbmRJZHg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChlbmRJZHggPiBsaXRlcmFsU3RhcnQpIHtcbiAgICAgIC8vIFVuZXNjYXBlIGB7e3t7YCDihpIgYHt7YFxuICAgICAgY29uc3QgcmF3ID0gc291cmNlLnNsaWNlKGxpdGVyYWxTdGFydCwgZW5kSWR4KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnJlcGxhY2UoL1xce1xce1xce1xcey9nLCAne3snKTtcbiAgICAgIHRva2Vucy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSwgcG9zOiBsaXRlcmFsU3RhcnRQb3MgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHN0YXJ0TGl0ZXJhbCA9ICgpOiB2b2lkID0+IHtcbiAgICBsaXRlcmFsU3RhcnQgPSBpO1xuICAgIGxpdGVyYWxTdGFydFBvcyA9IHsgbGluZSwgY29sIH07XG4gIH07XG5cbiAgc3RhcnRMaXRlcmFsKCk7XG5cbiAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgLy8gRXNjYXBlOiBge3t7e2Ag4oaSIGxpdGVyYWwgYHt7YFxuICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgne3t7eycsIGkpKSB7XG4gICAgICBhZHZhbmNlKDQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV4cHJlc3Npb24gc3RhcnRcbiAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoJ3t7JywgaSkpIHtcbiAgICAgIGZsdXNoTGl0ZXJhbChpKTtcbiAgICAgIGNvbnN0IGV4cHJQb3M6IFNvdXJjZVBvc2l0aW9uID0geyBsaW5lLCBjb2wgfTtcbiAgICAgIGFkdmFuY2UoMik7XG4gICAgICBjb25zdCBleHByID0gcmVhZEV4cHJlc3Npb24oc291cmNlLCBpLCBsaW5lLCBjb2wpO1xuICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICBraW5kOiAnZXhwcicsXG4gICAgICAgIHBhdGg6IGV4cHIucGF0aCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBleHByLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgY29lcmNlOiBleHByLmNvZXJjZSxcbiAgICAgICAgc291cmNlOiBzb3VyY2Uuc2xpY2UoZXhwclBvcy5jb2wgLSAxID09PSAwID8gaSAtIDIgOiAoKCkgPT4geyByZXR1cm4gaSAtIDI7IH0pKCksIGV4cHIuZW5kSWR4KSxcbiAgICAgICAgcG9zOiBleHByUG9zLFxuICAgICAgfSk7XG4gICAgICBhZHZhbmNlKGV4cHIuZW5kSWR4IC0gaSk7XG4gICAgICBzdGFydExpdGVyYWwoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBTdHJheSBgfX1gIG91dHNpZGUgYW4gZXhwcmVzc2lvblxuICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgnfX0nLCBpKSkge1xuICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFwiVW5leHBlY3RlZCAnfX0nIG91dHNpZGUgZXhwcmVzc2lvblwiLCB7IGxpbmUsIGNvbCB9KTtcbiAgICB9XG4gICAgYWR2YW5jZSgxKTtcbiAgfVxuXG4gIGZsdXNoTGl0ZXJhbChpKTtcbiAgcmV0dXJuIHRva2Vucztcbn1cblxuaW50ZXJmYWNlIFBhcnNlZEV4cHIge1xuICBwYXRoOiBzdHJpbmdbXTtcbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICBjb2VyY2U/OiBDb2VyY2VLaW5kO1xuICBlbmRJZHg6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcmVhZEV4cHJlc3Npb24oXG4gIHNvdXJjZTogc3RyaW5nLFxuICBzdGFydElkeDogbnVtYmVyLFxuICBzdGFydExpbmU6IG51bWJlcixcbiAgc3RhcnRDb2w6IG51bWJlcixcbik6IFBhcnNlZEV4cHIge1xuICBsZXQgaSA9IHN0YXJ0SWR4O1xuICBsZXQgbGluZSA9IHN0YXJ0TGluZTtcbiAgbGV0IGNvbCA9IHN0YXJ0Q29sO1xuXG4gIGNvbnN0IHNraXBXcyA9ICgpOiB2b2lkID0+IHtcbiAgICB3aGlsZSAoaSA8IHNvdXJjZS5sZW5ndGggJiYgKHNvdXJjZVtpXSA9PT0gJyAnIHx8IHNvdXJjZVtpXSA9PT0gJ1xcdCcpKSB7XG4gICAgICBpKys7XG4gICAgICBjb2wrKztcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVhZElkZW50aWZpZXIgPSAoKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBzdGFydEkgPSBpO1xuICAgIGlmIChpID49IHNvdXJjZS5sZW5ndGggfHwgIS9bYS16QS1aX10vLnRlc3Qoc291cmNlW2ldISkpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIGlkZW50aWZpZXIgaW5zaWRlIHRlbXBsYXRlIGV4cHJlc3Npb24nLFxuICAgICAgICB7IGxpbmUsIGNvbCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoICYmIC9bYS16QS1aMC05X10vLnRlc3Qoc291cmNlW2ldISkpIHtcbiAgICAgIGkrKztcbiAgICAgIGNvbCsrO1xuICAgIH1cbiAgICBjb25zdCBpZGVudCA9IHNvdXJjZS5zbGljZShzdGFydEksIGkpO1xuICAgIGlmIChpZGVudC5sZW5ndGggPiBNQVhfSURFTlRJRklFUl9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcbiAgICAgICAgYElkZW50aWZpZXIgZXhjZWVkcyBtYXggbGVuZ3RoIG9mICR7TUFYX0lERU5USUZJRVJfTEVOR1RIfWAsXG4gICAgICAgIHsgbGluZSwgY29sOiBjb2wgLSBpZGVudC5sZW5ndGggfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBpZGVudDtcbiAgfTtcblxuICBjb25zdCByZWFkUXVvdGVkID0gKCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgcXVvdGUgPSBzb3VyY2VbaV07XG4gICAgaWYgKHF1b3RlICE9PSAnXCInICYmIHF1b3RlICE9PSBcIidcIikge1xuICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKCdFeHBlY3RlZCBxdW90ZWQgc3RyaW5nJywgeyBsaW5lLCBjb2wgfSk7XG4gICAgfVxuICAgIGkrKzsgY29sKys7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoICYmIHNvdXJjZVtpXSAhPT0gcXVvdGUpIHtcbiAgICAgIGlmIChzb3VyY2VbaV0gPT09ICdcXFxcJykge1xuICAgICAgICBjb25zdCBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgPT09ICdcXFxcJyB8fCBuZXh0ID09PSBxdW90ZSkge1xuICAgICAgICAgIHBhcnRzLnB1c2gobmV4dCk7XG4gICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIGNvbCArPSAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBlc2NhcGUgJ1xcXFwke25leHQgPz8gJyd9JyBpbiBxdW90ZWQgc3RyaW5nYCxcbiAgICAgICAgICB7IGxpbmUsIGNvbCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGVkIHN0cmluZycsIHsgbGluZSwgY29sIH0pO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaChzb3VyY2VbaV0hKTtcbiAgICAgIGkrKzsgY29sKys7XG4gICAgfVxuICAgIGlmIChpID49IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcignVW50ZXJtaW5hdGVkIHF1b3RlZCBzdHJpbmcnLCB7IGxpbmUsIGNvbCB9KTtcbiAgICB9XG4gICAgaSsrOyBjb2wrKzsgLy8gY29uc3VtZSBjbG9zaW5nIHF1b3RlXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xuICB9O1xuXG4gIHNraXBXcygpO1xuICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtyZWFkSWRlbnRpZmllcigpXTtcbiAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoICYmIHNvdXJjZVtpXSA9PT0gJy4nKSB7XG4gICAgaSsrOyBjb2wrKztcbiAgICBwYXRoLnB1c2gocmVhZElkZW50aWZpZXIoKSk7XG4gICAgaWYgKHBhdGgubGVuZ3RoID4gTUFYX1BBVEhfREVQVEgpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcbiAgICAgICAgYFBhdGggZGVwdGggZXhjZWVkcyBtYXggb2YgJHtNQVhfUEFUSF9ERVBUSH1gLFxuICAgICAgICB7IGxpbmUsIGNvbCB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgc2tpcFdzKCk7XG5cbiAgbGV0IGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgY29lcmNlOiBDb2VyY2VLaW5kIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEZpbHRlcnMgY2hhaW46IGB8IGRlZmF1bHQ6ICd4JyB8IG51bWJlcmAsIGB8IGJvb2xgLCBgfCBqc29uYCwgZXRjLlxuICAvLyAtIGBkZWZhdWx0YCB0YWtlcyBhIHF1b3RlZCBhcmd1bWVudCDigJQgYXBwbGllZCBmaXJzdCAoYmVmb3JlIGNvZXJjaW9uKVxuICAvLyAtIGBudW1iZXJgLCBgYm9vbGAsIGBqc29uYCBhcmUgYXJndW1lbnQtbGVzcyBjb2VyY2lvbiBmaWx0ZXJzIOKAlCBhcHBsaWVkIGxhc3RcbiAgd2hpbGUgKHNvdXJjZVtpXSA9PT0gJ3wnKSB7XG4gICAgaSsrOyBjb2wrKztcbiAgICBza2lwV3MoKTtcblxuICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgnZGVmYXVsdCcsIGkpKSB7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFwiJ2RlZmF1bHQnIGZpbHRlciBtYXkgb25seSBhcHBlYXIgb25jZVwiLCB7IGxpbmUsIGNvbCB9KTtcbiAgICAgIH1cbiAgICAgIGkgKz0gJ2RlZmF1bHQnLmxlbmd0aDtcbiAgICAgIGNvbCArPSAnZGVmYXVsdCcubGVuZ3RoO1xuICAgICAgc2tpcFdzKCk7XG4gICAgICBpZiAoc291cmNlW2ldICE9PSAnOicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFwiRXhwZWN0ZWQgJzonIGFmdGVyICdkZWZhdWx0J1wiLCB7IGxpbmUsIGNvbCB9KTtcbiAgICAgIH1cbiAgICAgIGkrKzsgY29sKys7XG4gICAgICBza2lwV3MoKTtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHJlYWRRdW90ZWQoKTtcbiAgICAgIHNraXBXcygpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoZWRDb2VyY2U6IENvZXJjZUtpbmQgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWydudW1iZXInLCAnYm9vbCcsICdqc29uJ10gYXMgY29uc3QpIHtcbiAgICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aChraW5kLCBpKSkge1xuICAgICAgICAvLyBFbnN1cmUgaWRlbnRpZmllciBib3VuZGFyeSDigJQgYG51bWJlcmlzaGAgbXVzdCBub3QgbWF0Y2ggYG51bWJlcmBcbiAgICAgICAgY29uc3QgbmV4dCA9IHNvdXJjZVtpICsga2luZC5sZW5ndGhdO1xuICAgICAgICBpZiAoIW5leHQgfHwgIS9bYS16QS1aMC05X10vLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICBtYXRjaGVkQ29lcmNlID0ga2luZDtcbiAgICAgICAgICBpICs9IGtpbmQubGVuZ3RoO1xuICAgICAgICAgIGNvbCArPSBraW5kLmxlbmd0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbWF0Y2hlZENvZXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFxuICAgICAgICBcIlVua25vd24gZmlsdGVyIOKAlCBzdXBwb3J0ZWQ6ICdkZWZhdWx0JywgJ251bWJlcicsICdib29sJywgJ2pzb24nXCIsXG4gICAgICAgIHsgbGluZSwgY29sIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY29lcmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoJ09ubHkgb25lIGNvZXJjaW9uIGZpbHRlciBpcyBhbGxvd2VkIHBlciBleHByZXNzaW9uJywgeyBsaW5lLCBjb2wgfSk7XG4gICAgfVxuICAgIGNvZXJjZSA9IG1hdGNoZWRDb2VyY2U7XG4gICAgc2tpcFdzKCk7XG4gIH1cblxuICBpZiAoIXNvdXJjZS5zdGFydHNXaXRoKCd9fScsIGkpKSB7XG4gICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFwiRXhwZWN0ZWQgJ319J1wiLCB7IGxpbmUsIGNvbCB9KTtcbiAgfVxuICBpICs9IDI7XG4gIHJldHVybiB7IHBhdGgsIGRlZmF1bHRWYWx1ZSwgY29lcmNlLCBlbmRJZHg6IGkgfTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZTogcmV0dXJucyB0cnVlIGlmIHRoZSBzb3VyY2UgY29udGFpbnMgYW55IHRlbXBsYXRlcy5cbiAqIFVzZWQgYXMgYSBmYXN0LXBhdGggdG8gc2tpcCB0b2tlbml6YXRpb24gZm9yIHN0cmluZ3MgdGhhdCBhcmUgb2J2aW91c2x5IGxpdGVyYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUZW1wbGF0ZShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBOb3QgY29tcGxldGVseSBhY2N1cmF0ZSAoYSBsb25lIGB7e3t7YCB3b3VsZCByZXR1cm4gdHJ1ZSkgYnV0IHRoYXQncyBmaW5lIOKAlFxuICAvLyB0b2tlbml6ZSgpIHdpbGwgcHJvZHVjZSBhIGxpdGVyYWwtb25seSB0b2tlbiBsaXN0IGFuZCByb3VuZC10cmlwIGNvcnJlY3RseS5cbiAgcmV0dXJuIHNvdXJjZS5pbmNsdWRlcygne3snKTtcbn1cbiJdfQ==
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3Rva2VuaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUEwQnhDLE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSztJQUdyQjtJQUZsQixZQUNFLE9BQWUsRUFDQyxHQUFtQjtRQUVuQyxLQUFLLENBQUMsR0FBRyxPQUFPLFlBQVksR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUZ4QyxRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUduQyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBYztJQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksY0FBYyxDQUN0Qiw2QkFBNkIsb0JBQW9CLFFBQVEsRUFDekQsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLElBQUks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QUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNQLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBYztJQUN4Qyw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVG9rZW5pemVyIGZvciB0aGUgcGlwZWxpbmUtYnVpbGRlciB0ZW1wbGF0ZSBncmFtbWFyLlxuICpcbiAqIEdyYW1tYXI6XG4gKiAgIFRlbXBsYXRlICAgOj0gKExpdGVyYWwgfCBFeHByKSpcbiAqICAgRXhwciAgICAgICA6PSBcInt7XCIgd3MgUGF0aCAod3MgRmlsdGVyKT8gd3MgXCJ9fVwiXG4gKiAgIFBhdGggICAgICAgOj0gSWRlbnRpZmllciAoXCIuXCIgSWRlbnRpZmllcikqXG4gKiAgIElkZW50aWZpZXIgOj0gW2EtekEtWl9dW2EtekEtWjAtOV9dezAsNjN9XG4gKiAgIEZpbHRlciAgICAgOj0gXCJ8XCIgd3MgXCJkZWZhdWx0XCIgd3MgXCI6XCIgd3MgUXVvdGVkXG4gKiAgIFF1b3RlZCAgICAgOj0gXCInXCIgLi4uIFwiJ1wiIHwgXCJcXFwiXCIgLi4uIFwiXFxcIlwiXG4gKlxuICogYHt7e3tgIGlzIHRoZSBlc2NhcGUgc2VxdWVuY2UgZm9yIGEgbGl0ZXJhbCBge3tgLlxuICovXG5cbmV4cG9ydCBjb25zdCBNQVhfRklFTERfU0laRV9CWVRFUyA9IDQgKiAxMDI0O1xuZXhwb3J0IGNvbnN0IE1BWF9QQVRIX0RFUFRIID0gNTtcbmV4cG9ydCBjb25zdCBNQVhfSURFTlRJRklFUl9MRU5HVEggPSA2NDtcblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VQb3NpdGlvbiB7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29sOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl0ZXJhbFRva2VuIHtcbiAga2luZDogJ2xpdGVyYWwnO1xuICB2YWx1ZTogc3RyaW5nO1xuICBwb3M6IFNvdXJjZVBvc2l0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBDb2VyY2VLaW5kID0gJ251bWJlcicgfCAnYm9vbCcgfCAnanNvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwclRva2VuIHtcbiAga2luZDogJ2V4cHInO1xuICBwYXRoOiBzdHJpbmdbXTsgLy8gZS5nLiBbJ3BpcGVsaW5lJywgJ21ldGFkYXRhJywgJ2VudiddXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZzsgLy8gdmFsdWUgZm9yIGB8IGRlZmF1bHQ6ICcuLi4nYCBmaWx0ZXJcbiAgY29lcmNlPzogQ29lcmNlS2luZDsgLy8gYHwgbnVtYmVyYCwgYHwgYm9vbGAsIGB8IGpzb25gXG4gIHNvdXJjZTogc3RyaW5nOyAvLyBvcmlnaW5hbCBcInt7IC4uLiB9fVwiIHRleHQgKGZvciBlcnJvciBtZXNzYWdlcylcbiAgcG9zOiBTb3VyY2VQb3NpdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgVG9rZW4gPSBMaXRlcmFsVG9rZW4gfCBFeHByVG9rZW47XG5cbmV4cG9ydCBjbGFzcyBUb2tlbml6ZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBwb3M6IFNvdXJjZVBvc2l0aW9uLFxuICApIHtcbiAgICBzdXBlcihgJHttZXNzYWdlfSBhdCBsaW5lICR7cG9zLmxpbmV9LCBjb2wgJHtwb3MuY29sfWApO1xuICAgIHRoaXMubmFtZSA9ICdUb2tlbml6ZXJFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHRlbXBsYXRlIHNvdXJjZSBzdHJpbmcuIE5ldmVyIHRocm93cyBvbiB2YWxpZCBpbnB1dDtcbiAqIHRocm93cyBgVG9rZW5pemVyRXJyb3JgIHdpdGggc291cmNlIHBvc2l0aW9uIG9uIG1hbGZvcm1lZCB0ZW1wbGF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZShzb3VyY2U6IHN0cmluZyk6IFRva2VuW10ge1xuICBpZiAoc291cmNlLmxlbmd0aCA+IE1BWF9GSUVMRF9TSVpFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKFxuICAgICAgYEZpZWxkIGV4Y2VlZHMgbWF4IHNpemUgb2YgJHtNQVhfRklFTERfU0laRV9CWVRFU30gYnl0ZXNgLFxuICAgICAgeyBsaW5lOiAxLCBjb2w6IDEgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gW107XG4gIGxldCBpID0gMDtcbiAgbGV0IGxpbmUgPSAxO1xuICBsZXQgY29sID0gMTtcbiAgbGV0IGxpdGVyYWxTdGFydCA9IDA7XG4gIGxldCBsaXRlcmFsU3RhcnRQb3M6IFNvdXJjZVBvc2l0aW9uID0geyBsaW5lOiAxLCBjb2w6IDEgfTtcblxuICBjb25zdCBhZHZhbmNlID0gKG46IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICBpZiAoc291cmNlW2kgKyBrXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgbGluZSsrO1xuICAgICAgICBjb2wgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sKys7XG4gICAgICB9XG4gICAgfVxuICAgIGkgKz0gbjtcbiAgfTtcblxuICBjb25zdCBmbHVzaExpdGVyYWwgPSAoZW5kSWR4OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZW5kSWR4ID4gbGl0ZXJhbFN0YXJ0KSB7XG4gICAgICAvLyBVbmVzY2FwZSBge3t7e2Ag4oaSIGB7e2BcbiAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zbGljZShsaXRlcmFsU3RhcnQsIGVuZElkeCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJhdy5yZXBsYWNlKC9cXHtcXHtcXHtcXHsvZywgJ3t7Jyk7XG4gICAgICB0b2tlbnMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUsIHBvczogbGl0ZXJhbFN0YXJ0UG9zIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzdGFydExpdGVyYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgbGl0ZXJhbFN0YXJ0ID0gaTtcbiAgICBsaXRlcmFsU3RhcnRQb3MgPSB7IGxpbmUsIGNvbCB9O1xuICB9O1xuXG4gIHN0YXJ0TGl0ZXJhbCgpO1xuXG4gIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCkge1xuICAgIC8vIEVzY2FwZTogYHt7e3tgIOKGkiBsaXRlcmFsIGB7e2BcbiAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoJ3t7e3snLCBpKSkge1xuICAgICAgYWR2YW5jZSg0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFeHByZXNzaW9uIHN0YXJ0XG4gICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCd7eycsIGkpKSB7XG4gICAgICBmbHVzaExpdGVyYWwoaSk7XG4gICAgICBjb25zdCBleHByUG9zOiBTb3VyY2VQb3NpdGlvbiA9IHsgbGluZSwgY29sIH07XG4gICAgICBhZHZhbmNlKDIpO1xuICAgICAgY29uc3QgZXhwciA9IHJlYWRFeHByZXNzaW9uKHNvdXJjZSwgaSwgbGluZSwgY29sKTtcbiAgICAgIHRva2Vucy5wdXNoKHtcbiAgICAgICAga2luZDogJ2V4cHInLFxuICAgICAgICBwYXRoOiBleHByLnBhdGgsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZXhwci5kZWZhdWx0VmFsdWUsXG4gICAgICAgIGNvZXJjZTogZXhwci5jb2VyY2UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLnNsaWNlKGV4cHJQb3MuY29sIC0gMSA9PT0gMCA/IGkgLSAyIDogKCgpID0+IHsgcmV0dXJuIGkgLSAyOyB9KSgpLCBleHByLmVuZElkeCksXG4gICAgICAgIHBvczogZXhwclBvcyxcbiAgICAgIH0pO1xuICAgICAgYWR2YW5jZShleHByLmVuZElkeCAtIGkpO1xuICAgICAgc3RhcnRMaXRlcmFsKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gU3RyYXkgYH19YCBvdXRzaWRlIGFuIGV4cHJlc3Npb25cbiAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoJ319JywgaSkpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcIlVuZXhwZWN0ZWQgJ319JyBvdXRzaWRlIGV4cHJlc3Npb25cIiwgeyBsaW5lLCBjb2wgfSk7XG4gICAgfVxuICAgIGFkdmFuY2UoMSk7XG4gIH1cblxuICBmbHVzaExpdGVyYWwoaSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmludGVyZmFjZSBQYXJzZWRFeHByIHtcbiAgcGF0aDogc3RyaW5nW107XG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgY29lcmNlPzogQ29lcmNlS2luZDtcbiAgZW5kSWR4OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIHJlYWRFeHByZXNzaW9uKFxuICBzb3VyY2U6IHN0cmluZyxcbiAgc3RhcnRJZHg6IG51bWJlcixcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4gIHN0YXJ0Q29sOiBudW1iZXIsXG4pOiBQYXJzZWRFeHByIHtcbiAgbGV0IGkgPSBzdGFydElkeDtcbiAgbGV0IGxpbmUgPSBzdGFydExpbmU7XG4gIGxldCBjb2wgPSBzdGFydENvbDtcblxuICBjb25zdCBza2lwV3MgPSAoKTogdm9pZCA9PiB7XG4gICAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoICYmIChzb3VyY2VbaV0gPT09ICcgJyB8fCBzb3VyY2VbaV0gPT09ICdcXHQnKSkge1xuICAgICAgaSsrO1xuICAgICAgY29sKys7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlYWRJZGVudGlmaWVyID0gKCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3Qgc3RhcnRJID0gaTtcbiAgICBpZiAoaSA+PSBzb3VyY2UubGVuZ3RoIHx8ICEvW2EtekEtWl9dLy50ZXN0KHNvdXJjZVtpXSEpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCBpZGVudGlmaWVyIGluc2lkZSB0ZW1wbGF0ZSBleHByZXNzaW9uJyxcbiAgICAgICAgeyBsaW5lLCBjb2wgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCAmJiAvW2EtekEtWjAtOV9dLy50ZXN0KHNvdXJjZVtpXSEpKSB7XG4gICAgICBpKys7XG4gICAgICBjb2wrKztcbiAgICB9XG4gICAgY29uc3QgaWRlbnQgPSBzb3VyY2Uuc2xpY2Uoc3RhcnRJLCBpKTtcbiAgICBpZiAoaWRlbnQubGVuZ3RoID4gTUFYX0lERU5USUZJRVJfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoXG4gICAgICAgIGBJZGVudGlmaWVyIGV4Y2VlZHMgbWF4IGxlbmd0aCBvZiAke01BWF9JREVOVElGSUVSX0xFTkdUSH1gLFxuICAgICAgICB7IGxpbmUsIGNvbDogY29sIC0gaWRlbnQubGVuZ3RoIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnQ7XG4gIH07XG5cbiAgY29uc3QgcmVhZFF1b3RlZCA9ICgpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHF1b3RlID0gc291cmNlW2ldO1xuICAgIGlmIChxdW90ZSAhPT0gJ1wiJyAmJiBxdW90ZSAhPT0gXCInXCIpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcignRXhwZWN0ZWQgcXVvdGVkIHN0cmluZycsIHsgbGluZSwgY29sIH0pO1xuICAgIH1cbiAgICBpKys7IGNvbCsrO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2VbaV0gIT09IHF1b3RlKSB7XG4gICAgICBpZiAoc291cmNlW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgIGlmIChuZXh0ID09PSAnXFxcXCcgfHwgbmV4dCA9PT0gcXVvdGUpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKG5leHQpO1xuICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICBjb2wgKz0gMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZXNjYXBlICdcXFxcJHtuZXh0ID8/ICcnfScgaW4gcXVvdGVkIHN0cmluZ2AsXG4gICAgICAgICAgeyBsaW5lLCBjb2wgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3VyY2VbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcignVW50ZXJtaW5hdGVkIHF1b3RlZCBzdHJpbmcnLCB7IGxpbmUsIGNvbCB9KTtcbiAgICAgIH1cbiAgICAgIHBhcnRzLnB1c2goc291cmNlW2ldISk7XG4gICAgICBpKys7IGNvbCsrO1xuICAgIH1cbiAgICBpZiAoaSA+PSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoJ1VudGVybWluYXRlZCBxdW90ZWQgc3RyaW5nJywgeyBsaW5lLCBjb2wgfSk7XG4gICAgfVxuICAgIGkrKzsgY29sKys7IC8vIGNvbnN1bWUgY2xvc2luZyBxdW90ZVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbiAgfTtcblxuICBza2lwV3MoKTtcbiAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbcmVhZElkZW50aWZpZXIoKV07XG4gIHdoaWxlIChpIDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2VbaV0gPT09ICcuJykge1xuICAgIGkrKzsgY29sKys7XG4gICAgcGF0aC5wdXNoKHJlYWRJZGVudGlmaWVyKCkpO1xuICAgIGlmIChwYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0RFUFRIKSB7XG4gICAgICB0aHJvdyBuZXcgVG9rZW5pemVyRXJyb3IoXG4gICAgICAgIGBQYXRoIGRlcHRoIGV4Y2VlZHMgbWF4IG9mICR7TUFYX1BBVEhfREVQVEh9YCxcbiAgICAgICAgeyBsaW5lLCBjb2wgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHNraXBXcygpO1xuXG4gIGxldCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvZXJjZTogQ29lcmNlS2luZCB8IHVuZGVmaW5lZDtcblxuICAvLyBGaWx0ZXJzIGNoYWluOiBgfCBkZWZhdWx0OiAneCcgfCBudW1iZXJgLCBgfCBib29sYCwgYHwganNvbmAsIGV0Yy5cbiAgLy8gLSBgZGVmYXVsdGAgdGFrZXMgYSBxdW90ZWQgYXJndW1lbnQg4oCUIGFwcGxpZWQgZmlyc3QgKGJlZm9yZSBjb2VyY2lvbilcbiAgLy8gLSBgbnVtYmVyYCwgYGJvb2xgLCBganNvbmAgYXJlIGFyZ3VtZW50LWxlc3MgY29lcmNpb24gZmlsdGVycyDigJQgYXBwbGllZCBsYXN0XG4gIHdoaWxlIChzb3VyY2VbaV0gPT09ICd8Jykge1xuICAgIGkrKzsgY29sKys7XG4gICAgc2tpcFdzKCk7XG5cbiAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoJ2RlZmF1bHQnLCBpKSkge1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcIidkZWZhdWx0JyBmaWx0ZXIgbWF5IG9ubHkgYXBwZWFyIG9uY2VcIiwgeyBsaW5lLCBjb2wgfSk7XG4gICAgICB9XG4gICAgICBpICs9ICdkZWZhdWx0Jy5sZW5ndGg7XG4gICAgICBjb2wgKz0gJ2RlZmF1bHQnLmxlbmd0aDtcbiAgICAgIHNraXBXcygpO1xuICAgICAgaWYgKHNvdXJjZVtpXSAhPT0gJzonKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcIkV4cGVjdGVkICc6JyBhZnRlciAnZGVmYXVsdCdcIiwgeyBsaW5lLCBjb2wgfSk7XG4gICAgICB9XG4gICAgICBpKys7IGNvbCsrO1xuICAgICAgc2tpcFdzKCk7XG4gICAgICBkZWZhdWx0VmFsdWUgPSByZWFkUXVvdGVkKCk7XG4gICAgICBza2lwV3MoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBtYXRjaGVkQ29lcmNlOiBDb2VyY2VLaW5kIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBraW5kIG9mIFsnbnVtYmVyJywgJ2Jvb2wnLCAnanNvbiddIGFzIGNvbnN0KSB7XG4gICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoa2luZCwgaSkpIHtcbiAgICAgICAgLy8gRW5zdXJlIGlkZW50aWZpZXIgYm91bmRhcnkg4oCUIGBudW1iZXJpc2hgIG11c3Qgbm90IG1hdGNoIGBudW1iZXJgXG4gICAgICAgIGNvbnN0IG5leHQgPSBzb3VyY2VbaSArIGtpbmQubGVuZ3RoXTtcbiAgICAgICAgaWYgKCFuZXh0IHx8ICEvW2EtekEtWjAtOV9dLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgbWF0Y2hlZENvZXJjZSA9IGtpbmQ7XG4gICAgICAgICAgaSArPSBraW5kLmxlbmd0aDtcbiAgICAgICAgICBjb2wgKz0ga2luZC5sZW5ndGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW1hdGNoZWRDb2VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcbiAgICAgICAgXCJVbmtub3duIGZpbHRlciDigJQgc3VwcG9ydGVkOiAnZGVmYXVsdCcsICdudW1iZXInLCAnYm9vbCcsICdqc29uJ1wiLFxuICAgICAgICB7IGxpbmUsIGNvbCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvZXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFRva2VuaXplckVycm9yKCdPbmx5IG9uZSBjb2VyY2lvbiBmaWx0ZXIgaXMgYWxsb3dlZCBwZXIgZXhwcmVzc2lvbicsIHsgbGluZSwgY29sIH0pO1xuICAgIH1cbiAgICBjb2VyY2UgPSBtYXRjaGVkQ29lcmNlO1xuICAgIHNraXBXcygpO1xuICB9XG5cbiAgaWYgKCFzb3VyY2Uuc3RhcnRzV2l0aCgnfX0nLCBpKSkge1xuICAgIHRocm93IG5ldyBUb2tlbml6ZXJFcnJvcihcIkV4cGVjdGVkICd9fSdcIiwgeyBsaW5lLCBjb2wgfSk7XG4gIH1cbiAgaSArPSAyO1xuICByZXR1cm4geyBwYXRoLCBkZWZhdWx0VmFsdWUsIGNvZXJjZSwgZW5kSWR4OiBpIH07XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2U6IHJldHVybnMgdHJ1ZSBpZiB0aGUgc291cmNlIGNvbnRhaW5zIGFueSB0ZW1wbGF0ZXMuXG4gKiBVc2VkIGFzIGEgZmFzdC1wYXRoIHRvIHNraXAgdG9rZW5pemF0aW9uIGZvciBzdHJpbmdzIHRoYXQgYXJlIG9idmlvdXNseSBsaXRlcmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVGVtcGxhdGUoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTm90IGNvbXBsZXRlbHkgYWNjdXJhdGUgKGEgbG9uZSBge3t7e2Agd291bGQgcmV0dXJuIHRydWUpIGJ1dCB0aGF0J3MgZmluZSDigJRcbiAgLy8gdG9rZW5pemUoKSB3aWxsIHByb2R1Y2UgYSBsaXRlcmFsLW9ubHkgdG9rZW4gbGlzdCBhbmQgcm91bmQtdHJpcCBjb3JyZWN0bHkuXG4gIHJldHVybiBzb3VyY2UuaW5jbHVkZXMoJ3t7Jyk7XG59XG4iXX0=
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.topoSort = topoSort;
|
|
6
3
|
/**
|
|
7
4
|
* Topologically sort a set of nodes by their declared dependency keys.
|
|
8
5
|
* Returns `ordered` in resolution order, plus any detected cycles.
|
|
9
6
|
* Nodes whose deps reference keys not in the node set are treated as
|
|
10
7
|
* depending on "external" values and ordered first (no cycle risk).
|
|
11
8
|
*/
|
|
12
|
-
function topoSort(nodes) {
|
|
9
|
+
export function topoSort(nodes) {
|
|
13
10
|
const keys = new Set(nodes.map(n => n.key));
|
|
14
11
|
const graph = new Map();
|
|
15
12
|
const inDegree = new Map();
|
|
@@ -88,4 +85,4 @@ function findCycle(start, graph, visited, path, remaining) {
|
|
|
88
85
|
path.pop();
|
|
89
86
|
return null;
|
|
90
87
|
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wby1zb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3RvcG8tc29ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBY3RDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFpQjtJQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFM0MsT0FBTztJQUNQLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFDO0lBQ2pDLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3RCLEtBQUssTUFBTSxHQUFHLElB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Q2IsS0FBK0IsRUFDL0IsT0FBb0IsRUFDcEIsSUFBYyxFQUNkLFNBQXNCO0lBRXRCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0QsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNYLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9Ob2RlIHtcbiAgLyoqIFVuaXF1ZSBrZXkgaWRlbnRpZnlpbmcgdGhpcyBub2RlIChlLmcuIHNvdXJjZSBmaWVsZCBwYXRoKSAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIERlcGVuZGVuY3kga2V5cyB0aGF0IG11c3QgcmVzb2x2ZSBiZWZvcmUgdGhpcyBub2RlICovXG4gIGRlcHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9SZXN1bHQge1xuICBvcmRlcmVkOiBzdHJpbmdbXTtcbiAgY3ljbGVzOiBzdHJpbmdbXVtdO1xufVxuXG4vKipcbiAqIFRvcG9sb2dpY2FsbHkgc29ydCBhIHNldCBvZiBub2RlcyBieSB0aGVpciBkZWNsYXJlZCBkZXBlbmRlbmN5IGtleXMuXG4gKiBSZXR1cm5zIGBvcmRlcmVkYCBpbiByZXNvbHV0aW9uIG9yZGVyLCBwbHVzIGFueSBkZXRlY3RlZCBjeWNsZXMuXG4gKiBOb2RlcyB3aG9zZSBkZXBzIHJlZmVyZW5jZSBrZXlzIG5vdCBpbiB0aGUgbm9kZSBzZXQgYXJlIHRyZWF0ZWQgYXNcbiAqIGRlcGVuZGluZyBvbiBcImV4dGVybmFsXCIgdmFsdWVzIGFuZCBvcmRlcmVkIGZpcnN0IChubyBjeWNsZSByaXNrKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcG9Tb3J0KG5vZGVzOiBUb3BvTm9kZVtdKTogVG9wb1Jlc3VsdCB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KG5vZGVzLm1hcChuID0+IG4ua2V5KSk7XG4gIGNvbnN0IGdyYXBoID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBjb25zdCBpbkRlZ3JlZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8gSW5pdFxuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIHtcbiAgICBncmFwaC5zZXQobi5rZXksIG5ldyBTZXQoKSk7XG4gICAgaW5EZWdyZWUuc2V0KG4ua2V5LCAwKTtcbiAgfVxuXG4gIC8vIFNlbGYtbG9vcHMgc2hvcnQtY2lyY3VpdCDigJQgZGV0ZWN0ZWQgYmVmb3JlIHRvcG8tc29ydCBzbyBzaW5nbGUtbm9kZVxuICAvLyBjeWNsZXMgYXJlIHJlcG9ydGVkIGV2ZW4gd2hlbiBLYWhuJ3Mgd291bGQgb3RoZXJ3aXNlIGFjY2VwdCB0aGVtLlxuICBjb25zdCBzZWxmTG9vcHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgZm9yIChjb25zdCBuIG9mIG5vZGVzKSB7XG4gICAgaWYgKG4uZGVwcy5pbmNsdWRlcyhuLmtleSkpIHNlbGZMb29wcy5wdXNoKFtuLmtleSwgbi5rZXldKTtcbiAgfVxuXG4gIC8vIEVkZ2VzIG9ubHkgYmV0d2VlbiBpbnRlcm5hbCBub2RlcyAoZXh0ZXJuYWwgZGVwcyByZXNvbHZlIGJlZm9yZSBwYXNzIHN0YXJ0cylcbiAgZm9yIChjb25zdCBuIG9mIG5vZGVzKSB7XG4gICAgZm9yIChjb25zdCBkZXAgb2Ygbi5kZXBzKSB7XG4gICAgICBpZiAoIWtleXMuaGFzKGRlcCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGRlcCA9PT0gbi5rZXkpIGNvbnRpbnVlOyAvLyBzZWxmLWRlcCDihpIgYWxyZWFkeSBjYXB0dXJlZCBhYm92ZVxuICAgICAgLy8gRWRnZTogZGVwIC0+IG4ua2V5IChkZXAgbXVzdCBjb21lIGZpcnN0KVxuICAgICAgaWYgKCFncmFwaC5nZXQoZGVwKSEuaGFzKG4ua2V5KSkge1xuICAgICAgICBncmFwaC5nZXQoZGVwKSEuYWRkKG4ua2V5KTtcbiAgICAgICAgaW5EZWdyZWUuc2V0KG4ua2V5LCAoaW5EZWdyZWUuZ2V0KG4ua2V5KSA/PyAwKSArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEthaG4ncyBhbGdvcml0aG1cbiAgY29uc3Qgb3JkZXJlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2ssIGRdIG9mIGluRGVncmVlKSBpZiAoZCA9PT0gMCkgcXVldWUucHVzaChrKTtcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IGsgPSBxdWV1ZS5zaGlmdCgpITtcbiAgICBvcmRlcmVkLnB1c2goayk7XG4gICAgZm9yIChjb25zdCBuZXh0IG9mIGdyYXBoLmdldChrKSA/PyBbXSkge1xuICAgICAgY29uc3QgZCA9IChpbkRlZ3JlZS5nZXQobmV4dCkgPz8gMCkgLSAxO1xuICAgICAgaW5EZWdyZWUuc2V0KG5leHQsIGQpO1xuICAgICAgaWYgKGQgPT09IDApIHF1ZXVlLnB1c2gobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZWN0IGN5Y2xlczogYW55IG5vZGUgbm90IGluIGBvcmRlcmVkYCBpcyBwYXJ0IG9mIGEgY3ljbGVcbiAgY29uc3QgY3ljbGVzOiBzdHJpbmdbXVtdID0gWy4uLnNlbGZMb29wc107XG4gIGlmIChvcmRlcmVkLmxlbmd0aCA8IG5vZGVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobm9kZXMubWFwKG4gPT4gbi5rZXkpLmZpbHRlcihrID0+ICFvcmRlcmVkLmluY2x1ZGVzKGspKSk7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgc3RhcnQgb2YgcmVtYWluaW5nKSB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoc3RhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjeWNsZSA9IGZpbmRDeWNsZShzdGFydCwgZ3JhcGgsIHZpc2l0ZWQsIHBhdGgsIHJlbWFpbmluZyk7XG4gICAgICBpZiAoY3ljbGUpIGN5Y2xlcy5wdXNoKGN5Y2xlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBvcmRlcmVkLCBjeWNsZXMgfTtcbn1cblxuZnVuY3Rpb24gZmluZEN5Y2xlKFxuICBzdGFydDogc3RyaW5nLFxuICBncmFwaDogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LFxuICB2aXNpdGVkOiBTZXQ8c3RyaW5nPixcbiAgcGF0aDogc3RyaW5nW10sXG4gIHJlbWFpbmluZzogU2V0PHN0cmluZz4sXG4pOiBzdHJpbmdbXSB8IG51bGwge1xuICBpZiAocGF0aC5pbmNsdWRlcyhzdGFydCkpIHtcbiAgICBjb25zdCBpZHggPSBwYXRoLmluZGV4T2Yoc3RhcnQpO1xuICAgIHJldHVybiBbLi4ucGF0aC5zbGljZShpZHgpLCBzdGFydF07XG4gIH1cbiAgaWYgKHZpc2l0ZWQuaGFzKHN0YXJ0KSB8fCAhcmVtYWluaW5nLmhhcyhzdGFydCkpIHJldHVybiBudWxsO1xuICB2aXNpdGVkLmFkZChzdGFydCk7XG4gIHBhdGgucHVzaChzdGFydCk7XG4gIGZvciAoY29uc3QgbmV4dCBvZiBncmFwaC5nZXQoc3RhcnQpID8/IFtdKSB7XG4gICAgY29uc3QgY3ljbGUgPSBmaW5kQ3ljbGUobmV4dCwgZ3JhcGgsIHZpc2l0ZWQsIHBhdGgsIHJlbWFpbmluZyk7XG4gICAgaWYgKGN5Y2xlKSByZXR1cm4gY3ljbGU7XG4gIH1cbiAgcGF0aC5wb3AoKTtcbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
|