@pipeline-builder/pipeline-manager 3.4.163 → 3.4.165
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/dist/agent/ai.d.ts +5 -12
- package/dist/agent/ai.d.ts.map +1 -1
- package/dist/agent/ai.js +32 -13
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +87 -18
- package/package.json +4 -3
package/dist/agent/ai.d.ts
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lazy, OPTIONAL AI helpers for the `provision` advisor. The deterministic core
|
|
3
|
-
* (targets/prereqs) always works; these add the two things an LLM genuinely does
|
|
4
|
-
* better than a script: parsing a free-text goal into params, and diagnosing an
|
|
5
|
-
* arbitrary CloudFormation failure.
|
|
6
|
-
*
|
|
7
|
-
* Everything here is best-effort: `@pipeline-builder/ai-core` (and its ESM-only
|
|
8
|
-
* `ai` dependency) is imported dynamically so the base CLI stays light and the
|
|
9
|
-
* import can fail closed — no key, no provider, or an interop hiccup degrades to
|
|
10
|
-
* the deterministic path instead of erroring.
|
|
11
|
-
*/
|
|
12
1
|
import { z } from 'zod';
|
|
13
2
|
export interface AiOptions {
|
|
14
3
|
readonly provider?: string;
|
|
15
4
|
readonly model?: string;
|
|
16
5
|
}
|
|
17
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* True when the selected provider can be used: a key-based provider needs its API
|
|
8
|
+
* key, a keyless provider (Bedrock) needs either static AWS creds or an AWS region
|
|
9
|
+
* (the IAM-role signal). Kept in lockstep with ai-core's registry gating.
|
|
10
|
+
*/
|
|
18
11
|
export declare function isAiConfigured(opts?: AiOptions): boolean;
|
|
19
12
|
/**
|
|
20
13
|
* Diagnose a CloudFormation / deploy failure. Returns a short plain-English
|
package/dist/agent/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/agent/ai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/agent/ai.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAmCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,SAAc,GAAG,OAAO,CAM5D;AA0BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBvG;AAED;;;;;GAKG;AACH,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;iBASd,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,6EAA6E;AAC7E,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkBhG"}
|
package/dist/agent/ai.js
CHANGED
|
@@ -11,30 +11,49 @@
|
|
|
11
11
|
* import can fail closed — no key, no provider, or an interop hiccup degrades to
|
|
12
12
|
* the deterministic path instead of erroring.
|
|
13
13
|
*/
|
|
14
|
+
import { AI_PROVIDER_ENV_VARS } from '@pipeline-builder/api-core';
|
|
14
15
|
import { z } from 'zod';
|
|
15
|
-
// Keyed by the CANONICAL provider id used by @pipeline-builder/ai-core's
|
|
16
|
-
// registry (e.g. 'amazon-bedrock', not 'bedrock').
|
|
17
|
-
const PROVIDER_KEY_ENV = {
|
|
18
|
-
'anthropic': 'ANTHROPIC_API_KEY',
|
|
19
|
-
'openai': 'OPENAI_API_KEY',
|
|
20
|
-
'google': 'GOOGLE_GENERATIVE_AI_API_KEY',
|
|
21
|
-
'xai': 'XAI_API_KEY',
|
|
22
|
-
'amazon-bedrock': 'AWS_ACCESS_KEY_ID',
|
|
23
|
-
};
|
|
24
16
|
// Friendly aliases → canonical ids. Without this, --ai-provider bedrock (which
|
|
25
17
|
// the docs advertise) resolves to no models in ai-core and silently degrades.
|
|
18
|
+
// The provider→key-env map itself is the shared catalog (AI_PROVIDER_ENV_VARS in
|
|
19
|
+
// api-core) that ai-core's registry uses — importing it keeps the two in lockstep
|
|
20
|
+
// instead of maintaining a second, drift-prone copy here.
|
|
26
21
|
const PROVIDER_ALIASES = {
|
|
27
22
|
bedrock: 'amazon-bedrock',
|
|
28
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Providers that authenticate WITHOUT an API key (Bedrock uses the runtime IAM
|
|
26
|
+
* role). Mirrors ai-core's provider-registry so the CLI's "is AI usable?" gate
|
|
27
|
+
* agrees with what the registry will actually register.
|
|
28
|
+
*/
|
|
29
|
+
const KEYLESS_PROVIDERS = new Set(['amazon-bedrock']);
|
|
29
30
|
/** Resolve the canonical provider id from options/env, defaulting to anthropic. */
|
|
30
31
|
function providerId(opts) {
|
|
31
32
|
const raw = opts.provider || process.env.AI_PROVIDER || 'anthropic';
|
|
32
33
|
return PROVIDER_ALIASES[raw] ?? raw;
|
|
33
34
|
}
|
|
34
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Whether a keyless provider (Bedrock) is available. It auths via the runtime IAM
|
|
37
|
+
* role (no API key), so an AWS region — set by every AWS runtime — is the "running
|
|
38
|
+
* in / configured for AWS" signal. Gating it on AWS_ACCESS_KEY_ID (which it never
|
|
39
|
+
* uses) left it permanently unavailable on instance-role EC2/EKS despite valid IAM
|
|
40
|
+
* creds. Mirrors ai-core `provider-registry.ts` `keylessProviderAvailable()`.
|
|
41
|
+
*/
|
|
42
|
+
function keylessProviderAvailable() {
|
|
43
|
+
return !!(process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* True when the selected provider can be used: a key-based provider needs its API
|
|
47
|
+
* key, a keyless provider (Bedrock) needs either static AWS creds or an AWS region
|
|
48
|
+
* (the IAM-role signal). Kept in lockstep with ai-core's registry gating.
|
|
49
|
+
*/
|
|
35
50
|
export function isAiConfigured(opts = {}) {
|
|
36
|
-
const
|
|
37
|
-
|
|
51
|
+
const id = providerId(opts);
|
|
52
|
+
const env = AI_PROVIDER_ENV_VARS[id];
|
|
53
|
+
const hasKey = !!(env && process.env[env]);
|
|
54
|
+
if (KEYLESS_PROVIDERS.has(id))
|
|
55
|
+
return hasKey || keylessProviderAvailable();
|
|
56
|
+
return hasKey;
|
|
38
57
|
}
|
|
39
58
|
/** Dynamically load ai-core; null if it can't be imported (e.g. not installed). */
|
|
40
59
|
async function loadAiCore() {
|
|
@@ -127,4 +146,4 @@ export async function parseGoal(prompt, opts = {}) {
|
|
|
127
146
|
return null;
|
|
128
147
|
}
|
|
129
148
|
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQU94Qix5RUFBeUU7QUFDekUsbURBQW1EO0FBQ25ELE1BQU0sZ0JBQWdCLEdBQTJCO0lBQy9DLFdBQVcsRUFBRSxtQkFBbUI7SUFDaEMsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixRQUFRLEVBQUUsOEJBQThCO0lBQ3hDLEtBQUssRUFBRSxhQUFhO0lBQ3BCLGdCQUFnQixFQUFFLG1CQUFtQjtDQUN0QyxDQUFDO0FBRUYsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxNQUFNLGdCQUFnQixHQUEyQjtJQUMvQyxPQUFPLEVBQUUsZ0JBQWdCO0NBQzFCLENBQUM7QUFFRixtRkFBbUY7QUFDbkYsU0FBUyxVQUFVLENBQUMsSUFBZTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztJQUNwRSxPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUN0QyxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBSSxHQUFjLEVBQUU7SUFDakQsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsS0FBSyxVQUFVLFVBQVU7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FB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VSxTQUFTLENBQUMsTUFBYyxFQUFFLElBQUksR0FBYyxFQUFFO0lBQ2xFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNyQyw4REFBOEQ7WUFDOUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFZO1lBQ3JCLE1BQU0sRUFDSiw2RkFBNkY7Z0JBQzdGLDhGQUE4RjtnQkFDOUYsb0NBQW9DO1lBQ3RDLE1BQU07WUFDTixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1NBQ25ELENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMYXp5LCBPUFRJT05BTCBBSSBoZWxwZXJzIGZvciB0aGUgYHByb3Zpc2lvbmAgYWR2aXNvci4gVGhlIGRldGVybWluaXN0aWMgY29yZVxuICogKHRhcmdldHMvcHJlcmVxcykgYWx3YXlzIHdvcmtzOyB0aGVzZSBhZGQgdGhlIHR3byB0aGluZ3MgYW4gTExNIGdlbnVpbmVseSBkb2VzXG4gKiBiZXR0ZXIgdGhhbiBhIHNjcmlwdDogcGFyc2luZyBhIGZyZWUtdGV4dCBnb2FsIGludG8gcGFyYW1zLCBhbmQgZGlhZ25vc2luZyBhblxuICogYXJiaXRyYXJ5IENsb3VkRm9ybWF0aW9uIGZhaWx1cmUuXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIGJlc3QtZWZmb3J0OiBgQHBpcGVsaW5lLWJ1aWxkZXIvYWktY29yZWAgKGFuZCBpdHMgRVNNLW9ubHlcbiAqIGBhaWAgZGVwZW5kZW5jeSkgaXMgaW1wb3J0ZWQgZHluYW1pY2FsbHkgc28gdGhlIGJhc2UgQ0xJIHN0YXlzIGxpZ2h0IGFuZCB0aGVcbiAqIGltcG9ydCBjYW4gZmFpbCBjbG9zZWQg4oCUIG5vIGtleSwgbm8gcHJvdmlkZXIsIG9yIGFuIGludGVyb3AgaGljY3VwIGRlZ3JhZGVzIHRvXG4gKiB0aGUgZGV0ZXJtaW5pc3RpYyBwYXRoIGluc3RlYWQgb2YgZXJyb3JpbmcuXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWlPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xufVxuXG4vLyBLZXllZCBieSB0aGUgQ0FOT05JQ0FMIHByb3ZpZGVyIGlkIHVzZWQgYnkgQHBpcGVsaW5lLWJ1aWxkZXIvYWktY29yZSdzXG4vLyByZWdpc3RyeSAoZS5nLiAnYW1hem9uLWJlZHJvY2snLCBub3QgJ2JlZHJvY2snKS5cbmNvbnN0IFBST1ZJREVSX0tFWV9FTlY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdhbnRocm9waWMnOiAnQU5USFJPUElDX0FQSV9LRVknLFxuICAnb3BlbmFpJzogJ09QRU5BSV9BUElfS0VZJyxcbiAgJ2dvb2dsZSc6ICdHT09HTEVfR0VORVJBVElWRV9BSV9BUElfS0VZJyxcbiAgJ3hhaSc6ICdYQUlfQVBJX0tFWScsXG4gICdhbWF6b24tYmVkcm9jayc6ICdBV1NfQUNDRVNTX0tFWV9JRCcsXG59O1xuXG4vLyBGcmllbmRseSBhbGlhc2VzIOKGkiBjYW5vbmljYWwgaWRzLiBXaXRob3V0IHRoaXMsIC0tYWktcHJvdmlkZXIgYmVkcm9jayAod2hpY2hcbi8vIHRoZSBkb2NzIGFkdmVydGlzZSkgcmVzb2x2ZXMgdG8gbm8gbW9kZWxzIGluIGFpLWNvcmUgYW5kIHNpbGVudGx5IGRlZ3JhZGVzLlxuY29uc3QgUFJPVklERVJfQUxJQVNFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYmVkcm9jazogJ2FtYXpvbi1iZWRyb2NrJyxcbn07XG5cbi8qKiBSZXNvbHZlIHRoZSBjYW5vbmljYWwgcHJvdmlkZXIgaWQgZnJvbSBvcHRpb25zL2VudiwgZGVmYXVsdGluZyB0byBhbnRocm9waWMuICovXG5mdW5jdGlvbiBwcm92aWRlcklkKG9wdHM6IEFpT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHJhdyA9IG9wdHMucHJvdmlkZXIgfHwgcHJvY2Vzcy5lbnYuQUlfUFJPVklERVIgfHwgJ2FudGhyb3BpYyc7XG4gIHJldHVybiBQUk9WSURFUl9BTElBU0VTW3Jhd10gPz8gcmF3O1xufVxuXG4vKiogVHJ1ZSB3aGVuIGFuIEFQSSBrZXkgZm9yIHRoZSBzZWxlY3RlZCBwcm92aWRlciBpcyBwcmVzZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWlDb25maWd1cmVkKG9wdHM6IEFpT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gIGNvbnN0IGVudiA9IFBST1ZJREVSX0tFWV9FTlZbcHJvdmlkZXJJZChvcHRzKV07XG4gIHJldHVybiAhIShlbnYgJiYgcHJvY2Vzcy5lbnZbZW52XSk7XG59XG5cbi8qKiBEeW5hbWljYWxseSBsb2FkIGFpLWNvcmU7IG51bGwgaWYgaXQgY2FuJ3QgYmUgaW1wb3J0ZWQgKGUuZy4gbm90IGluc3RhbGxlZCkuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkQWlDb3JlKCk6IFByb21pc2U8dHlwZW9mIGltcG9ydCgnQHBpcGVsaW5lLWJ1aWxkZXIvYWktY29yZScpIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBpbXBvcnQoJ0BwaXBlbGluZS1idWlsZGVyL2FpLWNvcmUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqIFJlc29sdmUgYSBtb2RlbCwgb3IgbnVsbCBpZiB0aGUgcHJvdmlkZXIvbW9kZWwva2V5IGNhbid0IGJlIHJlc29sdmVkLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShvcHRzOiBBaU9wdGlvbnMpOiBQcm9taXNlPHsgYWk6IE5vbk51bGxhYmxlPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgbG9hZEFpQ29yZT4+PjsgbW9kZWw6IHVua25vd24gfSB8IG51bGw+IHtcbiAgaWYgKCFpc0FpQ29uZmlndXJlZChvcHRzKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFpID0gYXdhaXQgbG9hZEFpQ29yZSgpO1xuICBpZiAoIWFpKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVySWQob3B0cyk7XG4gICAgY29uc3QgbW9kZWxJZCA9IG9wdHMubW9kZWwgfHwgcHJvY2Vzcy5lbnYuQUlfTU9ERUwgfHwgYWkuZ2V0UHJvdmlkZXJNb2RlbHMocHJvdmlkZXIpWzBdPy5pZDtcbiAgICBpZiAoIW1vZGVsSWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGFpLCBtb2RlbDogYWkucmVzb2x2ZU1vZGVsKHByb3ZpZGVyLCBtb2RlbElkKSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIERpYWdub3NlIGEgQ2xvdWRGb3JtYXRpb24gLyBkZXBsb3kgZmFpbHVyZS4gUmV0dXJucyBhIHNob3J0IHBsYWluLUVuZ2xpc2hcbiAqIGNhdXNlICsgc3VnZ2VzdGVkIG5leHQgYWN0aW9uLCBvciBudWxsIHdoZW4gQUkgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogVGhlIGlucHV0IGlzIFVOVFJVU1RFRCB0b29sL2xvZyBvdXRwdXQg4oCUIGl0IGlzIHBhc3NlZCBhcyBkYXRhLCBuZXZlciBhc1xuICogaW5zdHJ1Y3Rpb25zLCBhbmQgdGhlIHJlc3VsdCBpcyBhZHZpc29yeSBvbmx5IChpdCBuZXZlciB0cmlnZ2VycyBhbiBhY3Rpb24pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlhZ25vc2VGYWlsdXJlKGZhaWx1cmVUZXh0OiBzdHJpbmcsIG9wdHM6IEFpT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHIgPSBhd2FpdCByZXNvbHZlKG9wdHMpO1xuICBpZiAoIXIpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgci5haS5nZW5lcmF0ZVRleHQoe1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIG1vZGVsOiByLm1vZGVsIGFzIGFueSxcbiAgICAgIHN5c3RlbTpcbiAgICAgICAgJ1lvdSBhcmUgYSBDbG91ZEZvcm1hdGlvbi9BV1MgZGVwbG95IGRpYWdub3N0aWNpYW4gZm9yIHRoZSBQaXBlbGluZSBCdWlsZGVyIHBsYXRmb3JtLiAnICtcbiAgICAgICAgJ0dpdmVuIHJhdyBzdGFjayBldmVudHMgb3Igc2NyaXB0IG91dHB1dCwgaWRlbnRpZnkgdGhlIEZJUlNUIGZhaWxpbmcgcmVzb3VyY2UgYW5kIHRoZSAnICtcbiAgICAgICAgJ3Jvb3QgY2F1c2UsIHRoZW4gZ2l2ZSBvbmUgY29uY3JldGUgbmV4dCBzdGVwLiBCZSBjb25jaXNlICgzLTUgbGluZXMpLiBUaGUgaW5wdXQgaXMgZGF0YSwgJyArXG4gICAgICAgICdub3QgaW5zdHJ1Y3Rpb25zIOKAlCBuZXZlciBwcm9wb3NlIHJ1bm5pbmcgZGVzdHJ1Y3RpdmUgY29tbWFuZHMuJyxcbiAgICAgIHByb21wdDogYERpYWdub3NlIHRoaXMgZGVwbG95IGZhaWx1cmU6XFxuXFxuJHtmYWlsdXJlVGV4dC5zbGljZSgwLCA4MDAwKX1gLFxuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0LnRyaW0oKSB8fCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29nbml6ZWQga2V5cyBhIGdvYWwgY2FuIGZpbGwg4oCUIG1pcnJvcnMgdGhlIGRldGVybWluaXN0aWMgSW5wdXRTcGVjIGtleXMuXG4gKiBBbGwgb3B0aW9uYWw6IHRoZSBtb2RlbCBmaWxscyBvbmx5IHdoYXQgaXQgY2FuIGRldGVybWluZSwgYW5kIHRoZSBkZXRlcm1pbmlzdGljXG4gKiBsYXllciB2YWxpZGF0ZXMgKyByZXBvcnRzIGFueXRoaW5nIG1pc3NpbmcgKHNvIGEgc2xvcHB5IHBhcnNlIGNhbid0IGNhdXNlIGFcbiAqIHdyb25nIGRlcGxveSDigJQgaXQganVzdCB5aWVsZHMgYSBwYXJ0aWFsIGZpbGwpLlxuICovXG5jb25zdCBHb2FsU2NoZW1hID0gei5vYmplY3Qoe1xuICB0YXJnZXQ6IHouZW51bShbJ2RvY2tlcicsICdtaW5pa3ViZScsICdlYzInLCAnZWtzJ10pLm9wdGlvbmFsKCksXG4gIHJlZ2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb21haW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaG9zdGVkWm9uZUlkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRlcGxveU1vZGU6IHouZW51bShbJ3B1YmxpYycsICdwcml2YXRlJ10pLm9wdGlvbmFsKCksXG4gIGVtYWlsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBlbWFpbEZyb206IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYWxlcnRFbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZEdvYWwgPSB6LmluZmVyPHR5cGVvZiBHb2FsU2NoZW1hPjtcblxuLyoqIFBhcnNlIGEgbmF0dXJhbC1sYW5ndWFnZSBnb2FsIGludG8ga25vd24gcGFyYW1zIHZpYSBzdHJ1Y3R1cmVkIG91dHB1dC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZUdvYWwocHJvbXB0OiBzdHJpbmcsIG9wdHM6IEFpT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQYXJzZWRHb2FsIHwgbnVsbD4ge1xuICBjb25zdCByID0gYXdhaXQgcmVzb2x2ZShvcHRzKTtcbiAgaWYgKCFyKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByLmFpLmdlbmVyYXRlVGV4dCh7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgbW9kZWw6IHIubW9kZWwgYXMgYW55LFxuICAgICAgc3lzdGVtOlxuICAgICAgICAnRXh0cmFjdCBQaXBlbGluZSBCdWlsZGVyIHBsYXRmb3JtIGRlcGxveSBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXIgZ29hbC4gRmlsbCBvbmx5IHRoZSBrZXlzICcgK1xuICAgICAgICAneW91IGNhbiBkZXRlcm1pbmUgd2l0aCBjb25maWRlbmNlIGFuZCBvbWl0IHRoZSByZXN0LiBgZW1haWxgIGlzIHRydWUgb25seSBpZiB0aGUgdXNlciB3YW50cyAnICtcbiAgICAgICAgJ3RyYW5zYWN0aW9uYWwgZW1haWwgLyBTRVMgZW5hYmxlZC4nLFxuICAgICAgcHJvbXB0LFxuICAgICAgb3V0cHV0OiByLmFpLk91dHB1dC5vYmplY3QoeyBzY2hlbWE6IEdvYWxTY2hlbWEgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvYWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQU94QiwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGlGQUFpRjtBQUNqRixrRkFBa0Y7QUFDbEYsMERBQTBEO0FBQzFELE1BQU0sZ0JBQWdCLEdBQTJCO0lBQy9DLE9BQU8sRUFBRSxnQkFBZ0I7Q0FDMUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0FBRXRELG1GQUFtRjtBQUNuRixTQUFTLFVBQVUsQ0FBQyxJQUFlO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO0lBQ3BFLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHdCQUF3QjtJQUMvQixPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBSSxHQUFjLEVBQUU7SUFDakQsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE1BQU0sR0FBRyxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQUUsT0FBTyxNQUFNLElBQUksd0JBQXdCLEVBQUUsQ0FBQztJQUMzRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLEtBQUssVUFBVSxVQUFVO0lBQ3ZCLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQWU7SUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxNQUFNLEVBQUUsR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM1RixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxXQUFtQixFQUFFLElBQUksR0FBYyxFQUFFO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDdkMsOERBQThEO1lBQzlELEtBQUssRUFBRSxDQUFDLENBQUMsS0FBWTtZQUNyQixNQUFNLEVBQ0osdUZBQXVGO2dCQUN2Rix1RkFBdUY7Z0JBQ3ZGLDJGQUEyRjtnQkFDM0YsZ0VBQWdFO1lBQ2xFLE1BQU0sRUFBRSxvQ0FBb0MsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDekUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDL0QsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDcEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDbEMsQ0FBQyxDQUFDO0FBSUgsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWMsRUFBRSxJQUFJLEdBQWMsRUFBRTtJQUNsRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDckMsOERBQThEO1lBQzlELEtBQUssRUFBRSxDQUFDLENBQUMsS0FBWTtZQUNyQixNQUFNLEVBQ0osNkZBQTZGO2dCQUM3Riw4RkFBOEY7Z0JBQzlGLG9DQUFvQztZQUN0QyxNQUFNO1lBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztTQUNuRCxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTGF6eSwgT1BUSU9OQUwgQUkgaGVscGVycyBmb3IgdGhlIGBwcm92aXNpb25gIGFkdmlzb3IuIFRoZSBkZXRlcm1pbmlzdGljIGNvcmVcbiAqICh0YXJnZXRzL3ByZXJlcXMpIGFsd2F5cyB3b3JrczsgdGhlc2UgYWRkIHRoZSB0d28gdGhpbmdzIGFuIExMTSBnZW51aW5lbHkgZG9lc1xuICogYmV0dGVyIHRoYW4gYSBzY3JpcHQ6IHBhcnNpbmcgYSBmcmVlLXRleHQgZ29hbCBpbnRvIHBhcmFtcywgYW5kIGRpYWdub3NpbmcgYW5cbiAqIGFyYml0cmFyeSBDbG91ZEZvcm1hdGlvbiBmYWlsdXJlLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaGVyZSBpcyBiZXN0LWVmZm9ydDogYEBwaXBlbGluZS1idWlsZGVyL2FpLWNvcmVgIChhbmQgaXRzIEVTTS1vbmx5XG4gKiBgYWlgIGRlcGVuZGVuY3kpIGlzIGltcG9ydGVkIGR5bmFtaWNhbGx5IHNvIHRoZSBiYXNlIENMSSBzdGF5cyBsaWdodCBhbmQgdGhlXG4gKiBpbXBvcnQgY2FuIGZhaWwgY2xvc2VkIOKAlCBubyBrZXksIG5vIHByb3ZpZGVyLCBvciBhbiBpbnRlcm9wIGhpY2N1cCBkZWdyYWRlcyB0b1xuICogdGhlIGRldGVybWluaXN0aWMgcGF0aCBpbnN0ZWFkIG9mIGVycm9yaW5nLlxuICovXG5cbmltcG9ydCB7IEFJX1BST1ZJREVSX0VOVl9WQVJTIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWlPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xufVxuXG4vLyBGcmllbmRseSBhbGlhc2VzIOKGkiBjYW5vbmljYWwgaWRzLiBXaXRob3V0IHRoaXMsIC0tYWktcHJvdmlkZXIgYmVkcm9jayAod2hpY2hcbi8vIHRoZSBkb2NzIGFkdmVydGlzZSkgcmVzb2x2ZXMgdG8gbm8gbW9kZWxzIGluIGFpLWNvcmUgYW5kIHNpbGVudGx5IGRlZ3JhZGVzLlxuLy8gVGhlIHByb3ZpZGVy4oaSa2V5LWVudiBtYXAgaXRzZWxmIGlzIHRoZSBzaGFyZWQgY2F0YWxvZyAoQUlfUFJPVklERVJfRU5WX1ZBUlMgaW5cbi8vIGFwaS1jb3JlKSB0aGF0IGFpLWNvcmUncyByZWdpc3RyeSB1c2VzIOKAlCBpbXBvcnRpbmcgaXQga2VlcHMgdGhlIHR3byBpbiBsb2Nrc3RlcFxuLy8gaW5zdGVhZCBvZiBtYWludGFpbmluZyBhIHNlY29uZCwgZHJpZnQtcHJvbmUgY29weSBoZXJlLlxuY29uc3QgUFJPVklERVJfQUxJQVNFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYmVkcm9jazogJ2FtYXpvbi1iZWRyb2NrJyxcbn07XG5cbi8qKlxuICogUHJvdmlkZXJzIHRoYXQgYXV0aGVudGljYXRlIFdJVEhPVVQgYW4gQVBJIGtleSAoQmVkcm9jayB1c2VzIHRoZSBydW50aW1lIElBTVxuICogcm9sZSkuIE1pcnJvcnMgYWktY29yZSdzIHByb3ZpZGVyLXJlZ2lzdHJ5IHNvIHRoZSBDTEkncyBcImlzIEFJIHVzYWJsZT9cIiBnYXRlXG4gKiBhZ3JlZXMgd2l0aCB3aGF0IHRoZSByZWdpc3RyeSB3aWxsIGFjdHVhbGx5IHJlZ2lzdGVyLlxuICovXG5jb25zdCBLRVlMRVNTX1BST1ZJREVSUyA9IG5ldyBTZXQoWydhbWF6b24tYmVkcm9jayddKTtcblxuLyoqIFJlc29sdmUgdGhlIGNhbm9uaWNhbCBwcm92aWRlciBpZCBmcm9tIG9wdGlvbnMvZW52LCBkZWZhdWx0aW5nIHRvIGFudGhyb3BpYy4gKi9cbmZ1bmN0aW9uIHByb3ZpZGVySWQob3B0czogQWlPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcmF3ID0gb3B0cy5wcm92aWRlciB8fCBwcm9jZXNzLmVudi5BSV9QUk9WSURFUiB8fCAnYW50aHJvcGljJztcbiAgcmV0dXJuIFBST1ZJREVSX0FMSUFTRVNbcmF3XSA/PyByYXc7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGtleWxlc3MgcHJvdmlkZXIgKEJlZHJvY2spIGlzIGF2YWlsYWJsZS4gSXQgYXV0aHMgdmlhIHRoZSBydW50aW1lIElBTVxuICogcm9sZSAobm8gQVBJIGtleSksIHNvIGFuIEFXUyByZWdpb24g4oCUIHNldCBieSBldmVyeSBBV1MgcnVudGltZSDigJQgaXMgdGhlIFwicnVubmluZ1xuICogaW4gLyBjb25maWd1cmVkIGZvciBBV1NcIiBzaWduYWwuIEdhdGluZyBpdCBvbiBBV1NfQUNDRVNTX0tFWV9JRCAod2hpY2ggaXQgbmV2ZXJcbiAqIHVzZXMpIGxlZnQgaXQgcGVybWFuZW50bHkgdW5hdmFpbGFibGUgb24gaW5zdGFuY2Utcm9sZSBFQzIvRUtTIGRlc3BpdGUgdmFsaWQgSUFNXG4gKiBjcmVkcy4gTWlycm9ycyBhaS1jb3JlIGBwcm92aWRlci1yZWdpc3RyeS50c2AgYGtleWxlc3NQcm92aWRlckF2YWlsYWJsZSgpYC5cbiAqL1xuZnVuY3Rpb24ga2V5bGVzc1Byb3ZpZGVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEocHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04pO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiB0aGUgc2VsZWN0ZWQgcHJvdmlkZXIgY2FuIGJlIHVzZWQ6IGEga2V5LWJhc2VkIHByb3ZpZGVyIG5lZWRzIGl0cyBBUElcbiAqIGtleSwgYSBrZXlsZXNzIHByb3ZpZGVyIChCZWRyb2NrKSBuZWVkcyBlaXRoZXIgc3RhdGljIEFXUyBjcmVkcyBvciBhbiBBV1MgcmVnaW9uXG4gKiAodGhlIElBTS1yb2xlIHNpZ25hbCkuIEtlcHQgaW4gbG9ja3N0ZXAgd2l0aCBhaS1jb3JlJ3MgcmVnaXN0cnkgZ2F0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBaUNvbmZpZ3VyZWQob3B0czogQWlPcHRpb25zID0ge30pOiBib29sZWFuIHtcbiAgY29uc3QgaWQgPSBwcm92aWRlcklkKG9wdHMpO1xuICBjb25zdCBlbnYgPSBBSV9QUk9WSURFUl9FTlZfVkFSU1tpZF07XG4gIGNvbnN0IGhhc0tleSA9ICEhKGVudiAmJiBwcm9jZXNzLmVudltlbnZdKTtcbiAgaWYgKEtFWUxFU1NfUFJPVklERVJTLmhhcyhpZCkpIHJldHVybiBoYXNLZXkgfHwga2V5bGVzc1Byb3ZpZGVyQXZhaWxhYmxlKCk7XG4gIHJldHVybiBoYXNLZXk7XG59XG5cbi8qKiBEeW5hbWljYWxseSBsb2FkIGFpLWNvcmU7IG51bGwgaWYgaXQgY2FuJ3QgYmUgaW1wb3J0ZWQgKGUuZy4gbm90IGluc3RhbGxlZCkuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkQWlDb3JlKCk6IFByb21pc2U8dHlwZW9mIGltcG9ydCgnQHBpcGVsaW5lLWJ1aWxkZXIvYWktY29yZScpIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBpbXBvcnQoJ0BwaXBlbGluZS1idWlsZGVyL2FpLWNvcmUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqIFJlc29sdmUgYSBtb2RlbCwgb3IgbnVsbCBpZiB0aGUgcHJvdmlkZXIvbW9kZWwva2V5IGNhbid0IGJlIHJlc29sdmVkLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShvcHRzOiBBaU9wdGlvbnMpOiBQcm9taXNlPHsgYWk6IE5vbk51bGxhYmxlPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgbG9hZEFpQ29yZT4+PjsgbW9kZWw6IHVua25vd24gfSB8IG51bGw+IHtcbiAgaWYgKCFpc0FpQ29uZmlndXJlZChvcHRzKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFpID0gYXdhaXQgbG9hZEFpQ29yZSgpO1xuICBpZiAoIWFpKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVySWQob3B0cyk7XG4gICAgY29uc3QgbW9kZWxJZCA9IG9wdHMubW9kZWwgfHwgcHJvY2Vzcy5lbnYuQUlfTU9ERUwgfHwgYWkuZ2V0UHJvdmlkZXJNb2RlbHMocHJvdmlkZXIpWzBdPy5pZDtcbiAgICBpZiAoIW1vZGVsSWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGFpLCBtb2RlbDogYWkucmVzb2x2ZU1vZGVsKHByb3ZpZGVyLCBtb2RlbElkKSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIERpYWdub3NlIGEgQ2xvdWRGb3JtYXRpb24gLyBkZXBsb3kgZmFpbHVyZS4gUmV0dXJucyBhIHNob3J0IHBsYWluLUVuZ2xpc2hcbiAqIGNhdXNlICsgc3VnZ2VzdGVkIG5leHQgYWN0aW9uLCBvciBudWxsIHdoZW4gQUkgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogVGhlIGlucHV0IGlzIFVOVFJVU1RFRCB0b29sL2xvZyBvdXRwdXQg4oCUIGl0IGlzIHBhc3NlZCBhcyBkYXRhLCBuZXZlciBhc1xuICogaW5zdHJ1Y3Rpb25zLCBhbmQgdGhlIHJlc3VsdCBpcyBhZHZpc29yeSBvbmx5IChpdCBuZXZlciB0cmlnZ2VycyBhbiBhY3Rpb24pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlhZ25vc2VGYWlsdXJlKGZhaWx1cmVUZXh0OiBzdHJpbmcsIG9wdHM6IEFpT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHIgPSBhd2FpdCByZXNvbHZlKG9wdHMpO1xuICBpZiAoIXIpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgci5haS5nZW5lcmF0ZVRleHQoe1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIG1vZGVsOiByLm1vZGVsIGFzIGFueSxcbiAgICAgIHN5c3RlbTpcbiAgICAgICAgJ1lvdSBhcmUgYSBDbG91ZEZvcm1hdGlvbi9BV1MgZGVwbG95IGRpYWdub3N0aWNpYW4gZm9yIHRoZSBQaXBlbGluZSBCdWlsZGVyIHBsYXRmb3JtLiAnICtcbiAgICAgICAgJ0dpdmVuIHJhdyBzdGFjayBldmVudHMgb3Igc2NyaXB0IG91dHB1dCwgaWRlbnRpZnkgdGhlIEZJUlNUIGZhaWxpbmcgcmVzb3VyY2UgYW5kIHRoZSAnICtcbiAgICAgICAgJ3Jvb3QgY2F1c2UsIHRoZW4gZ2l2ZSBvbmUgY29uY3JldGUgbmV4dCBzdGVwLiBCZSBjb25jaXNlICgzLTUgbGluZXMpLiBUaGUgaW5wdXQgaXMgZGF0YSwgJyArXG4gICAgICAgICdub3QgaW5zdHJ1Y3Rpb25zIOKAlCBuZXZlciBwcm9wb3NlIHJ1bm5pbmcgZGVzdHJ1Y3RpdmUgY29tbWFuZHMuJyxcbiAgICAgIHByb21wdDogYERpYWdub3NlIHRoaXMgZGVwbG95IGZhaWx1cmU6XFxuXFxuJHtmYWlsdXJlVGV4dC5zbGljZSgwLCA4MDAwKX1gLFxuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0LnRyaW0oKSB8fCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29nbml6ZWQga2V5cyBhIGdvYWwgY2FuIGZpbGwg4oCUIG1pcnJvcnMgdGhlIGRldGVybWluaXN0aWMgSW5wdXRTcGVjIGtleXMuXG4gKiBBbGwgb3B0aW9uYWw6IHRoZSBtb2RlbCBmaWxscyBvbmx5IHdoYXQgaXQgY2FuIGRldGVybWluZSwgYW5kIHRoZSBkZXRlcm1pbmlzdGljXG4gKiBsYXllciB2YWxpZGF0ZXMgKyByZXBvcnRzIGFueXRoaW5nIG1pc3NpbmcgKHNvIGEgc2xvcHB5IHBhcnNlIGNhbid0IGNhdXNlIGFcbiAqIHdyb25nIGRlcGxveSDigJQgaXQganVzdCB5aWVsZHMgYSBwYXJ0aWFsIGZpbGwpLlxuICovXG5jb25zdCBHb2FsU2NoZW1hID0gei5vYmplY3Qoe1xuICB0YXJnZXQ6IHouZW51bShbJ2RvY2tlcicsICdtaW5pa3ViZScsICdlYzInLCAnZWtzJ10pLm9wdGlvbmFsKCksXG4gIHJlZ2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb21haW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaG9zdGVkWm9uZUlkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRlcGxveU1vZGU6IHouZW51bShbJ3B1YmxpYycsICdwcml2YXRlJ10pLm9wdGlvbmFsKCksXG4gIGVtYWlsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBlbWFpbEZyb206IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYWxlcnRFbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZEdvYWwgPSB6LmluZmVyPHR5cGVvZiBHb2FsU2NoZW1hPjtcblxuLyoqIFBhcnNlIGEgbmF0dXJhbC1sYW5ndWFnZSBnb2FsIGludG8ga25vd24gcGFyYW1zIHZpYSBzdHJ1Y3R1cmVkIG91dHB1dC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZUdvYWwocHJvbXB0OiBzdHJpbmcsIG9wdHM6IEFpT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQYXJzZWRHb2FsIHwgbnVsbD4ge1xuICBjb25zdCByID0gYXdhaXQgcmVzb2x2ZShvcHRzKTtcbiAgaWYgKCFyKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByLmFpLmdlbmVyYXRlVGV4dCh7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgbW9kZWw6IHIubW9kZWwgYXMgYW55LFxuICAgICAgc3lzdGVtOlxuICAgICAgICAnRXh0cmFjdCBQaXBlbGluZSBCdWlsZGVyIHBsYXRmb3JtIGRlcGxveSBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXIgZ29hbC4gRmlsbCBvbmx5IHRoZSBrZXlzICcgK1xuICAgICAgICAneW91IGNhbiBkZXRlcm1pbmUgd2l0aCBjb25maWRlbmNlIGFuZCBvbWl0IHRoZSByZXN0LiBgZW1haWxgIGlzIHRydWUgb25seSBpZiB0aGUgdXNlciB3YW50cyAnICtcbiAgICAgICAgJ3RyYW5zYWN0aW9uYWwgZW1haWwgLyBTRVMgZW5hYmxlZC4nLFxuICAgICAgcHJvbXB0LFxuICAgICAgb3V0cHV0OiByLmFpLk91dHB1dC5vYmplY3QoeyBzY2hlbWE6IEdvYWxTY2hlbWEgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAgHA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAM7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAgB7E"}
|
|
@@ -14,9 +14,16 @@ import path from 'path';
|
|
|
14
14
|
* identifier fall back to a shared `_default` bucket (coarse anti-bruteforce).
|
|
15
15
|
*/
|
|
16
16
|
const STATE_FILE = path.join(os.tmpdir(), '.pipeline-manager-auth-state.json');
|
|
17
|
+
// Directory-as-mutex guarding the read-modify-write. `mkdir` is atomic on every
|
|
18
|
+
// platform, so concurrent CLI invocations serialize on it instead of racing (a
|
|
19
|
+
// lost increment would under-count toward lockout — see withLock).
|
|
20
|
+
const LOCK_DIR = `${STATE_FILE}.lock`;
|
|
17
21
|
const MAX_FAILURES = 5;
|
|
18
22
|
const COOLDOWN_MS = 60_000; // 1 minute
|
|
19
23
|
const PRUNE_MS = 60 * 60_000; // drop buckets idle for >1h to bound file growth
|
|
24
|
+
const LOCK_STALE_MS = 5_000; // reclaim a lock left by a crashed process
|
|
25
|
+
const LOCK_WAIT_MS = 1_000; // give up waiting after this (best-effort: proceed unlocked)
|
|
26
|
+
const LOCK_RETRY_MS = 15; // spin interval while the lock is held
|
|
20
27
|
const EMPTY = { failures: 0, lastFailure: 0, lockedUntil: 0 };
|
|
21
28
|
/** Stable, non-reversible bucket key for a (baseUrl, identifier) pair. */
|
|
22
29
|
function keyFor(identifier, baseUrl) {
|
|
@@ -43,10 +50,59 @@ function writeMap(map) {
|
|
|
43
50
|
delete map[k];
|
|
44
51
|
}
|
|
45
52
|
try {
|
|
46
|
-
|
|
53
|
+
// Write to a per-process temp file then rename: rename is atomic on the same
|
|
54
|
+
// filesystem, so a concurrent reader never observes a torn/half-written file.
|
|
55
|
+
const tmp = `${STATE_FILE}.${process.pid}.tmp`;
|
|
56
|
+
fs.writeFileSync(tmp, JSON.stringify(map), { mode: 0o600 });
|
|
57
|
+
fs.renameSync(tmp, STATE_FILE);
|
|
47
58
|
}
|
|
48
59
|
catch { /* best-effort */ }
|
|
49
60
|
}
|
|
61
|
+
/** Block the current thread for `ms` without a busy-wait (CLI-only, short waits). */
|
|
62
|
+
function sleep(ms) {
|
|
63
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run `fn` while holding a cross-process advisory lock so the read-modify-write in
|
|
67
|
+
* recordAuthFailure/Success can't lose an update to a concurrent CLI invocation
|
|
68
|
+
* (the TOCTOU that let parallel runs under-count toward lockout). Best-effort: if
|
|
69
|
+
* the lock can't be acquired within LOCK_WAIT_MS we proceed anyway rather than
|
|
70
|
+
* block the user — server-side rate limiting remains the real enforcement.
|
|
71
|
+
*/
|
|
72
|
+
function withLock(fn) {
|
|
73
|
+
const deadline = Date.now() + LOCK_WAIT_MS;
|
|
74
|
+
let held = false;
|
|
75
|
+
while (Date.now() < deadline) {
|
|
76
|
+
try {
|
|
77
|
+
fs.mkdirSync(LOCK_DIR);
|
|
78
|
+
held = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Held elsewhere — reclaim it if it's stale (owner crashed without cleanup),
|
|
83
|
+
// otherwise wait a beat and retry.
|
|
84
|
+
try {
|
|
85
|
+
if (Date.now() - fs.statSync(LOCK_DIR).mtimeMs > LOCK_STALE_MS) {
|
|
86
|
+
fs.rmdirSync(LOCK_DIR);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch { /* lock vanished between calls — just retry */ }
|
|
91
|
+
sleep(LOCK_RETRY_MS);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
return fn();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (held) {
|
|
99
|
+
try {
|
|
100
|
+
fs.rmdirSync(LOCK_DIR);
|
|
101
|
+
}
|
|
102
|
+
catch { /* already gone */ }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
50
106
|
/**
|
|
51
107
|
* Check if auth attempts for this identifier are currently rate-limited.
|
|
52
108
|
* @returns null if allowed, or a message string if blocked.
|
|
@@ -60,10 +116,17 @@ export function checkAuthRateLimit(identifier, baseUrl) {
|
|
|
60
116
|
const waitSec = Math.ceil((state.lockedUntil - now) / 1000);
|
|
61
117
|
return `Too many failed login attempts. Try again in ${waitSec}s.`;
|
|
62
118
|
}
|
|
63
|
-
// Reset this bucket once the cooldown window has passed.
|
|
119
|
+
// Reset this bucket once the cooldown window has passed. Re-read under the lock
|
|
120
|
+
// so we don't clobber a concurrent recordAuthFailure for another bucket.
|
|
64
121
|
if (state.lastFailure !== 0 && now - state.lastFailure > COOLDOWN_MS) {
|
|
65
|
-
|
|
66
|
-
|
|
122
|
+
withLock(() => {
|
|
123
|
+
const m = readMap();
|
|
124
|
+
const s = m[key];
|
|
125
|
+
if (s && s.lastFailure !== 0 && Date.now() - s.lastFailure > COOLDOWN_MS) {
|
|
126
|
+
delete m[key];
|
|
127
|
+
writeMap(m);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
67
130
|
}
|
|
68
131
|
return null;
|
|
69
132
|
}
|
|
@@ -71,9 +134,11 @@ export function checkAuthRateLimit(identifier, baseUrl) {
|
|
|
71
134
|
* Record a successful auth for this identifier — clears its failure counter.
|
|
72
135
|
*/
|
|
73
136
|
export function recordAuthSuccess(identifier, baseUrl) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
137
|
+
withLock(() => {
|
|
138
|
+
const map = readMap();
|
|
139
|
+
delete map[keyFor(identifier, baseUrl)];
|
|
140
|
+
writeMap(map);
|
|
141
|
+
});
|
|
77
142
|
}
|
|
78
143
|
/**
|
|
79
144
|
* Record a failed auth attempt for this identifier. After MAX_FAILURES, locks out
|
|
@@ -81,15 +146,19 @@ export function recordAuthSuccess(identifier, baseUrl) {
|
|
|
81
146
|
*/
|
|
82
147
|
export function recordAuthFailure(identifier, baseUrl) {
|
|
83
148
|
const key = keyFor(identifier, baseUrl);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
state.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
149
|
+
// Read-modify-write under the lock: a concurrent CLI invocation must not read the
|
|
150
|
+
// same pre-increment count and overwrite this one (which would under-count).
|
|
151
|
+
withLock(() => {
|
|
152
|
+
const map = readMap();
|
|
153
|
+
const now = Date.now();
|
|
154
|
+
const state = { ...(map[key] ?? EMPTY) };
|
|
155
|
+
state.failures += 1;
|
|
156
|
+
state.lastFailure = now;
|
|
157
|
+
if (state.failures >= MAX_FAILURES) {
|
|
158
|
+
state.lockedUntil = now + COOLDOWN_MS;
|
|
159
|
+
}
|
|
160
|
+
map[key] = state;
|
|
161
|
+
writeMap(map);
|
|
162
|
+
});
|
|
94
163
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLG1DQUFtQyxDQUFDLENBQUM7QUFDL0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFdBQVc7QUFDdkMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLGlEQUFpRDtBQVUvRSxNQUFNLEtBQUssR0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFFekUsMEVBQTBFO0FBQzFFLFNBQVMsTUFBTSxDQUFDLFVBQW1CLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFFRCxTQUFTLE9BQU87SUFDZCxJQUFJLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FB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RSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDekMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFDeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNqQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFNpbXBsZSBmaWxlLWJhc2VkIHJhdGUgbGltaXRlciBmb3IgYXV0aCBvcGVyYXRpb25zLlxuICogVHJhY2tzIGZhaWxlZCBhdHRlbXB0cyBhbmQgZW5mb3JjZXMgYSBjb29sZG93biBwZXJpb2QgYWZ0ZXIgdG9vIG1hbnkgZmFpbHVyZXMuXG4gKiBTdGF0ZSBpcyBwZXJzaXN0ZWQgaW4gYSB0ZW1wIGZpbGUgc28gaXQgc3Vydml2ZXMgYWNyb3NzIENMSSBpbnZvY2F0aW9ucy5cbiAqXG4gKiBTdGF0ZSBpcyBrZXllZCBwZXIgKGJhc2VVcmwsIGlkZW50aWZpZXIpIHNvIGEgZmFpbGVkIGxvZ2luIGZvciBvbmUgYWNjb3VudCBkb2VzXG4gKiBOT1QgbG9jayBvdXQgYW5vdGhlciBhY2NvdW50IG9uIGEgc2hhcmVkIHdvcmtzdGF0aW9uIC8gQ0kgaG9zdC4gQ2FsbHMgd2l0aG91dCBhblxuICogaWRlbnRpZmllciBmYWxsIGJhY2sgdG8gYSBzaGFyZWQgYF9kZWZhdWx0YCBidWNrZXQgKGNvYXJzZSBhbnRpLWJydXRlZm9yY2UpLlxuICovXG5cbmNvbnN0IFNUQVRFX0ZJTEUgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksICcucGlwZWxpbmUtbWFuYWdlci1hdXRoLXN0YXRlLmpzb24nKTtcbmNvbnN0IE1BWF9GQUlMVVJFUyA9IDU7XG5jb25zdCBDT09MRE9XTl9NUyA9IDYwXzAwMDsgLy8gMSBtaW51dGVcbmNvbnN0IFBSVU5FX01TID0gNjAgKiA2MF8wMDA7IC8vIGRyb3AgYnVja2V0cyBpZGxlIGZvciA+MWggdG8gYm91bmQgZmlsZSBncm93dGhcblxuaW50ZXJmYWNlIEF1dGhTdGF0ZSB7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIGxhc3RGYWlsdXJlOiBudW1iZXI7XG4gIGxvY2tlZFVudGlsOiBudW1iZXI7XG59XG5cbnR5cGUgU3RhdGVNYXAgPSBSZWNvcmQ8c3RyaW5nLCBBdXRoU3RhdGU+O1xuXG5jb25zdCBFTVBUWTogQXV0aFN0YXRlID0geyBmYWlsdXJlczogMCwgbGFzdEZhaWx1cmU6IDAsIGxvY2tlZFVudGlsOiAwIH07XG5cbi8qKiBTdGFibGUsIG5vbi1yZXZlcnNpYmxlIGJ1Y2tldCBrZXkgZm9yIGEgKGJhc2VVcmwsIGlkZW50aWZpZXIpIHBhaXIuICovXG5mdW5jdGlvbiBrZXlGb3IoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaWRlbnRpZmllcikgcmV0dXJuICdfZGVmYXVsdCc7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGAke2Jhc2VVcmwgPz8gJyd9XFxuJHtpZGVudGlmaWVyfWApLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMTYpO1xufVxuXG5mdW5jdGlvbiByZWFkTWFwKCk6IFN0YXRlTWFwIHtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhTVEFURV9GSUxFKSkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoU1RBVEVfRklMRSwgJ3V0Zi04JykpIGFzIHVua25vd247XG4gICAgICBpZiAocGFyc2VkICYmIHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnKSByZXR1cm4gcGFyc2VkIGFzIFN0YXRlTWFwO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIGlnbm9yZSBjb3JydXB0IHN0YXRlICovIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiB3cml0ZU1hcChtYXA6IFN0YXRlTWFwKTogdm9pZCB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIC8vIFBydW5lIGlkbGUgYnVja2V0cyBzbyB0aGUgZmlsZSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkIGFjcm9zcyBtYW55IGlkZW50aWZpZXJzLlxuICBmb3IgKGNvbnN0IFtrLCBzXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgaWYgKHMubG9ja2VkVW50aWwgPD0gbm93ICYmIG5vdyAtIHMubGFzdEZhaWx1cmUgPiBQUlVORV9NUykgZGVsZXRlIG1hcFtrXTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkobWFwKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhdXRoIGF0dGVtcHRzIGZvciB0aGlzIGlkZW50aWZpZXIgYXJlIGN1cnJlbnRseSByYXRlLWxpbWl0ZWQuXG4gKiBAcmV0dXJucyBudWxsIGlmIGFsbG93ZWQsIG9yIGEgbWVzc2FnZSBzdHJpbmcgaWYgYmxvY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXV0aFJhdGVMaW1pdChpZGVudGlmaWVyPzogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGtleSA9IGtleUZvcihpZGVudGlmaWVyLCBiYXNlVXJsKTtcbiAgY29uc3QgbWFwID0gcmVhZE1hcCgpO1xuICBjb25zdCBzdGF0ZSA9IG1hcFtrZXldID8/IEVNUFRZO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIGlmIChzdGF0ZS5sb2NrZWRVbnRpbCA+IG5vdykge1xuICAgIGNvbnN0IHdhaXRTZWMgPSBNYXRoLmNlaWwoKHN0YXRlLmxvY2tlZFVudGlsIC0gbm93KSAvIDEwMDApO1xuICAgIHJldHVybiBgVG9vIG1hbnkgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLiBUcnkgYWdhaW4gaW4gJHt3YWl0U2VjfXMuYDtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoaXMgYnVja2V0IG9uY2UgdGhlIGNvb2xkb3duIHdpbmRvdyBoYXMgcGFzc2VkLlxuICBpZiAoc3RhdGUubGFzdEZhaWx1cmUgIT09IDAgJiYgbm93IC0gc3RhdGUubGFzdEZhaWx1cmUgPiBDT09MRE9XTl9NUykge1xuICAgIGRlbGV0ZSBtYXBba2V5XTtcbiAgICB3cml0ZU1hcChtYXApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVjb3JkIGEgc3VjY2Vzc2Z1bCBhdXRoIGZvciB0aGlzIGlkZW50aWZpZXIg4oCUIGNsZWFycyBpdHMgZmFpbHVyZSBjb3VudGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aFN1Y2Nlc3MoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtYXAgPSByZWFkTWFwKCk7XG4gIGRlbGV0ZSBtYXBba2V5Rm9yKGlkZW50aWZpZXIsIGJhc2VVcmwpXTtcbiAgd3JpdGVNYXAobWFwKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBmYWlsZWQgYXV0aCBhdHRlbXB0IGZvciB0aGlzIGlkZW50aWZpZXIuIEFmdGVyIE1BWF9GQUlMVVJFUywgbG9ja3Mgb3V0XG4gKiB0aGF0IGlkZW50aWZpZXIgZm9yIENPT0xET1dOX01TLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aEZhaWx1cmUoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBrZXkgPSBrZXlGb3IoaWRlbnRpZmllciwgYmFzZVVybCk7XG4gIGNvbnN0IG1hcCA9IHJlYWRNYXAoKTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3RhdGUgPSB7IC4uLihtYXBba2V5XSA/PyBFTVBUWSkgfTtcbiAgc3RhdGUuZmFpbHVyZXMgKz0gMTtcbiAgc3RhdGUubGFzdEZhaWx1cmUgPSBub3c7XG4gIGlmIChzdGF0ZS5mYWlsdXJlcyA+PSBNQVhfRkFJTFVSRVMpIHtcbiAgICBzdGF0ZS5sb2NrZWRVbnRpbCA9IG5vdyArIENPT0xET1dOX01TO1xuICB9XG4gIG1hcFtrZXldID0gc3RhdGU7XG4gIHdyaXRlTWFwKG1hcCk7XG59XG4iXX0=
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4Qjs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLG1DQUFtQyxDQUFDLENBQUM7QUFDL0UsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxtRUFBbUU7QUFDbkUsTUFBTSxRQUFRLEdBQUcsR0FBRyxVQUFVLE9BQU8sQ0FBQztBQUN0QyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsV0FBVztBQUN2QyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsaURBQWlEO0FBQy9FLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLDJDQUEyQztBQUN4RSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyw2REFBNkQ7QUFDekYsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLENBQUMsdUNBQXVDO0FBVWpFLE1BQU0sS0FBSyxHQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUV6RSwwRUFBMEU7QUFDMUUsU0FBUyxNQUFNLENBQUMsVUFBbUIsRUFBRSxPQUFnQjtJQUNuRCxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ25DLE9BQU8s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R0FBRyxDQUFDO1FBQ3hCLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNuQyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFDeEMsQ0FBQztRQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDakIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFNpbXBsZSBmaWxlLWJhc2VkIHJhdGUgbGltaXRlciBmb3IgYXV0aCBvcGVyYXRpb25zLlxuICogVHJhY2tzIGZhaWxlZCBhdHRlbXB0cyBhbmQgZW5mb3JjZXMgYSBjb29sZG93biBwZXJpb2QgYWZ0ZXIgdG9vIG1hbnkgZmFpbHVyZXMuXG4gKiBTdGF0ZSBpcyBwZXJzaXN0ZWQgaW4gYSB0ZW1wIGZpbGUgc28gaXQgc3Vydml2ZXMgYWNyb3NzIENMSSBpbnZvY2F0aW9ucy5cbiAqXG4gKiBTdGF0ZSBpcyBrZXllZCBwZXIgKGJhc2VVcmwsIGlkZW50aWZpZXIpIHNvIGEgZmFpbGVkIGxvZ2luIGZvciBvbmUgYWNjb3VudCBkb2VzXG4gKiBOT1QgbG9jayBvdXQgYW5vdGhlciBhY2NvdW50IG9uIGEgc2hhcmVkIHdvcmtzdGF0aW9uIC8gQ0kgaG9zdC4gQ2FsbHMgd2l0aG91dCBhblxuICogaWRlbnRpZmllciBmYWxsIGJhY2sgdG8gYSBzaGFyZWQgYF9kZWZhdWx0YCBidWNrZXQgKGNvYXJzZSBhbnRpLWJydXRlZm9yY2UpLlxuICovXG5cbmNvbnN0IFNUQVRFX0ZJTEUgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksICcucGlwZWxpbmUtbWFuYWdlci1hdXRoLXN0YXRlLmpzb24nKTtcbi8vIERpcmVjdG9yeS1hcy1tdXRleCBndWFyZGluZyB0aGUgcmVhZC1tb2RpZnktd3JpdGUuIGBta2RpcmAgaXMgYXRvbWljIG9uIGV2ZXJ5XG4vLyBwbGF0Zm9ybSwgc28gY29uY3VycmVudCBDTEkgaW52b2NhdGlvbnMgc2VyaWFsaXplIG9uIGl0IGluc3RlYWQgb2YgcmFjaW5nIChhXG4vLyBsb3N0IGluY3JlbWVudCB3b3VsZCB1bmRlci1jb3VudCB0b3dhcmQgbG9ja291dCDigJQgc2VlIHdpdGhMb2NrKS5cbmNvbnN0IExPQ0tfRElSID0gYCR7U1RBVEVfRklMRX0ubG9ja2A7XG5jb25zdCBNQVhfRkFJTFVSRVMgPSA1O1xuY29uc3QgQ09PTERPV05fTVMgPSA2MF8wMDA7IC8vIDEgbWludXRlXG5jb25zdCBQUlVORV9NUyA9IDYwICogNjBfMDAwOyAvLyBkcm9wIGJ1Y2tldHMgaWRsZSBmb3IgPjFoIHRvIGJvdW5kIGZpbGUgZ3Jvd3RoXG5jb25zdCBMT0NLX1NUQUxFX01TID0gNV8wMDA7IC8vIHJlY2xhaW0gYSBsb2NrIGxlZnQgYnkgYSBjcmFzaGVkIHByb2Nlc3NcbmNvbnN0IExPQ0tfV0FJVF9NUyA9IDFfMDAwOyAvLyBnaXZlIHVwIHdhaXRpbmcgYWZ0ZXIgdGhpcyAoYmVzdC1lZmZvcnQ6IHByb2NlZWQgdW5sb2NrZWQpXG5jb25zdCBMT0NLX1JFVFJZX01TID0gMTU7IC8vIHNwaW4gaW50ZXJ2YWwgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZFxuXG5pbnRlcmZhY2UgQXV0aFN0YXRlIHtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgbGFzdEZhaWx1cmU6IG51bWJlcjtcbiAgbG9ja2VkVW50aWw6IG51bWJlcjtcbn1cblxudHlwZSBTdGF0ZU1hcCA9IFJlY29yZDxzdHJpbmcsIEF1dGhTdGF0ZT47XG5cbmNvbnN0IEVNUFRZOiBBdXRoU3RhdGUgPSB7IGZhaWx1cmVzOiAwLCBsYXN0RmFpbHVyZTogMCwgbG9ja2VkVW50aWw6IDAgfTtcblxuLyoqIFN0YWJsZSwgbm9uLXJldmVyc2libGUgYnVja2V0IGtleSBmb3IgYSAoYmFzZVVybCwgaWRlbnRpZmllcikgcGFpci4gKi9cbmZ1bmN0aW9uIGtleUZvcihpZGVudGlmaWVyPzogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gJ19kZWZhdWx0JztcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYCR7YmFzZVVybCA/PyAnJ31cXG4ke2lkZW50aWZpZXJ9YCkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNik7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXAoKTogU3RhdGVNYXAge1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKFNUQVRFX0ZJTEUpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSkgYXMgdW5rbm93bjtcbiAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHJldHVybiBwYXJzZWQgYXMgU3RhdGVNYXA7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogaWdub3JlIGNvcnJ1cHQgc3RhdGUgKi8gfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHdyaXRlTWFwKG1hcDogU3RhdGVNYXApOiB2b2lkIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgLy8gUHJ1bmUgaWRsZSBidWNrZXRzIHNvIHRoZSBmaWxlIGRvZXNuJ3QgZ3JvdyB1bmJvdW5kZWQgYWNyb3NzIG1hbnkgaWRlbnRpZmllcnMuXG4gIGZvciAoY29uc3QgW2ssIHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcCkpIHtcbiAgICBpZiAocy5sb2NrZWRVbnRpbCA8PSBub3cgJiYgbm93IC0gcy5sYXN0RmFpbHVyZSA+IFBSVU5FX01TKSBkZWxldGUgbWFwW2tdO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gV3JpdGUgdG8gYSBwZXItcHJvY2VzcyB0ZW1wIGZpbGUgdGhlbiByZW5hbWU6IHJlbmFtZSBpcyBhdG9taWMgb24gdGhlIHNhbWVcbiAgICAvLyBmaWxlc3lzdGVtLCBzbyBhIGNvbmN1cnJlbnQgcmVhZGVyIG5ldmVyIG9ic2VydmVzIGEgdG9ybi9oYWxmLXdyaXR0ZW4gZmlsZS5cbiAgICBjb25zdCB0bXAgPSBgJHtTVEFURV9GSUxFfS4ke3Byb2Nlc3MucGlkfS50bXBgO1xuICAgIGZzLndyaXRlRmlsZVN5bmModG1wLCBKU09OLnN0cmluZ2lmeShtYXApLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgIGZzLnJlbmFtZVN5bmModG1wLCBTVEFURV9GSUxFKTtcbiAgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqIEJsb2NrIHRoZSBjdXJyZW50IHRocmVhZCBmb3IgYG1zYCB3aXRob3V0IGEgYnVzeS13YWl0IChDTEktb25seSwgc2hvcnQgd2FpdHMpLiAqL1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IHZvaWQge1xuICBBdG9taWNzLndhaXQobmV3IEludDMyQXJyYXkobmV3IFNoYXJlZEFycmF5QnVmZmVyKDQpKSwgMCwgMCwgbXMpO1xufVxuXG4vKipcbiAqIFJ1biBgZm5gIHdoaWxlIGhvbGRpbmcgYSBjcm9zcy1wcm9jZXNzIGFkdmlzb3J5IGxvY2sgc28gdGhlIHJlYWQtbW9kaWZ5LXdyaXRlIGluXG4gKiByZWNvcmRBdXRoRmFpbHVyZS9TdWNjZXNzIGNhbid0IGxvc2UgYW4gdXBkYXRlIHRvIGEgY29uY3VycmVudCBDTEkgaW52b2NhdGlvblxuICogKHRoZSBUT0NUT1UgdGhhdCBsZXQgcGFyYWxsZWwgcnVucyB1bmRlci1jb3VudCB0b3dhcmQgbG9ja291dCkuIEJlc3QtZWZmb3J0OiBpZlxuICogdGhlIGxvY2sgY2FuJ3QgYmUgYWNxdWlyZWQgd2l0aGluIExPQ0tfV0FJVF9NUyB3ZSBwcm9jZWVkIGFueXdheSByYXRoZXIgdGhhblxuICogYmxvY2sgdGhlIHVzZXIg4oCUIHNlcnZlci1zaWRlIHJhdGUgbGltaXRpbmcgcmVtYWlucyB0aGUgcmVhbCBlbmZvcmNlbWVudC5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2s8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTE9DS19XQUlUX01TO1xuICBsZXQgaGVsZCA9IGZhbHNlO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLm1rZGlyU3luYyhMT0NLX0RJUik7XG4gICAgICBoZWxkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSGVsZCBlbHNld2hlcmUg4oCUIHJlY2xhaW0gaXQgaWYgaXQncyBzdGFsZSAob3duZXIgY3Jhc2hlZCB3aXRob3V0IGNsZWFudXApLFxuICAgICAgLy8gb3RoZXJ3aXNlIHdhaXQgYSBiZWF0IGFuZCByZXRyeS5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gZnMuc3RhdFN5bmMoTE9DS19ESVIpLm10aW1lTXMgPiBMT0NLX1NUQUxFX01TKSB7XG4gICAgICAgICAgZnMucm1kaXJTeW5jKExPQ0tfRElSKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7IC8qIGxvY2sgdmFuaXNoZWQgYmV0d2VlbiBjYWxscyDigJQganVzdCByZXRyeSAqLyB9XG4gICAgICBzbGVlcChMT0NLX1JFVFJZX01TKTtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoaGVsZCkge1xuICAgICAgdHJ5IHsgZnMucm1kaXJTeW5jKExPQ0tfRElSKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgZ29uZSAqLyB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYXV0aCBhdHRlbXB0cyBmb3IgdGhpcyBpZGVudGlmaWVyIGFyZSBjdXJyZW50bHkgcmF0ZS1saW1pdGVkLlxuICogQHJldHVybnMgbnVsbCBpZiBhbGxvd2VkLCBvciBhIG1lc3NhZ2Ugc3RyaW5nIGlmIGJsb2NrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F1dGhSYXRlTGltaXQoaWRlbnRpZmllcj86IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBrZXkgPSBrZXlGb3IoaWRlbnRpZmllciwgYmFzZVVybCk7XG4gIGNvbnN0IG1hcCA9IHJlYWRNYXAoKTtcbiAgY29uc3Qgc3RhdGUgPSBtYXBba2V5XSA/PyBFTVBUWTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICBpZiAoc3RhdGUubG9ja2VkVW50aWwgPiBub3cpIHtcbiAgICBjb25zdCB3YWl0U2VjID0gTWF0aC5jZWlsKChzdGF0ZS5sb2NrZWRVbnRpbCAtIG5vdykgLyAxMDAwKTtcbiAgICByZXR1cm4gYFRvbyBtYW55IGZhaWxlZCBsb2dpbiBhdHRlbXB0cy4gVHJ5IGFnYWluIGluICR7d2FpdFNlY31zLmA7XG4gIH1cblxuICAvLyBSZXNldCB0aGlzIGJ1Y2tldCBvbmNlIHRoZSBjb29sZG93biB3aW5kb3cgaGFzIHBhc3NlZC4gUmUtcmVhZCB1bmRlciB0aGUgbG9ja1xuICAvLyBzbyB3ZSBkb24ndCBjbG9iYmVyIGEgY29uY3VycmVudCByZWNvcmRBdXRoRmFpbHVyZSBmb3IgYW5vdGhlciBidWNrZXQuXG4gIGlmIChzdGF0ZS5sYXN0RmFpbHVyZSAhPT0gMCAmJiBub3cgLSBzdGF0ZS5sYXN0RmFpbHVyZSA+IENPT0xET1dOX01TKSB7XG4gICAgd2l0aExvY2soKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IHJlYWRNYXAoKTtcbiAgICAgIGNvbnN0IHMgPSBtW2tleV07XG4gICAgICBpZiAocyAmJiBzLmxhc3RGYWlsdXJlICE9PSAwICYmIERhdGUubm93KCkgLSBzLmxhc3RGYWlsdXJlID4gQ09PTERPV05fTVMpIHtcbiAgICAgICAgZGVsZXRlIG1ba2V5XTtcbiAgICAgICAgd3JpdGVNYXAobSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBzdWNjZXNzZnVsIGF1dGggZm9yIHRoaXMgaWRlbnRpZmllciDigJQgY2xlYXJzIGl0cyBmYWlsdXJlIGNvdW50ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdXRoU3VjY2VzcyhpZGVudGlmaWVyPzogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogdm9pZCB7XG4gIHdpdGhMb2NrKCgpID0+IHtcbiAgICBjb25zdCBtYXAgPSByZWFkTWFwKCk7XG4gICAgZGVsZXRlIG1hcFtrZXlGb3IoaWRlbnRpZmllciwgYmFzZVVybCldO1xuICAgIHdyaXRlTWFwKG1hcCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlY29yZCBhIGZhaWxlZCBhdXRoIGF0dGVtcHQgZm9yIHRoaXMgaWRlbnRpZmllci4gQWZ0ZXIgTUFYX0ZBSUxVUkVTLCBsb2NrcyBvdXRcbiAqIHRoYXQgaWRlbnRpZmllciBmb3IgQ09PTERPV05fTVMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdXRoRmFpbHVyZShpZGVudGlmaWVyPzogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IGtleUZvcihpZGVudGlmaWVyLCBiYXNlVXJsKTtcbiAgLy8gUmVhZC1tb2RpZnktd3JpdGUgdW5kZXIgdGhlIGxvY2s6IGEgY29uY3VycmVudCBDTEkgaW52b2NhdGlvbiBtdXN0IG5vdCByZWFkIHRoZVxuICAvLyBzYW1lIHByZS1pbmNyZW1lbnQgY291bnQgYW5kIG92ZXJ3cml0ZSB0aGlzIG9uZSAod2hpY2ggd291bGQgdW5kZXItY291bnQpLlxuICB3aXRoTG9jaygoKSA9PiB7XG4gICAgY29uc3QgbWFwID0gcmVhZE1hcCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RhdGUgPSB7IC4uLihtYXBba2V5XSA/PyBFTVBUWSkgfTtcbiAgICBzdGF0ZS5mYWlsdXJlcyArPSAxO1xuICAgIHN0YXRlLmxhc3RGYWlsdXJlID0gbm93O1xuICAgIGlmIChzdGF0ZS5mYWlsdXJlcyA+PSBNQVhfRkFJTFVSRVMpIHtcbiAgICAgIHN0YXRlLmxvY2tlZFVudGlsID0gbm93ICsgQ09PTERPV05fTVM7XG4gICAgfVxuICAgIG1hcFtrZXldID0gc3RhdGU7XG4gICAgd3JpdGVNYXAobWFwKTtcbiAgfSk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -42,8 +42,9 @@
|
|
|
42
42
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
43
43
|
"yaml": "2.9.0",
|
|
44
44
|
"zod": "4.4.3",
|
|
45
|
-
"@pipeline-builder/ai-core": "3.4.
|
|
46
|
-
"@pipeline-builder/pipeline-core": "3.4.
|
|
45
|
+
"@pipeline-builder/ai-core": "3.4.107",
|
|
46
|
+
"@pipeline-builder/pipeline-core": "3.4.126",
|
|
47
|
+
"@pipeline-builder/api-core": "3.4.107"
|
|
47
48
|
},
|
|
48
49
|
"keywords": [
|
|
49
50
|
"ci-cd",
|
|
@@ -98,7 +99,7 @@
|
|
|
98
99
|
"access": "public",
|
|
99
100
|
"registry": "https://registry.npmjs.org/"
|
|
100
101
|
},
|
|
101
|
-
"version": "3.4.
|
|
102
|
+
"version": "3.4.165",
|
|
102
103
|
"bugs": {
|
|
103
104
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
104
105
|
},
|