@pipeline-builder/api-core 3.4.104 → 3.4.106
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/lib/middleware/auth.js +5 -1
- package/lib/openapi/routes/index.js +3 -1
- package/lib/openapi/routes/pipeline-routes.js +10 -1
- package/lib/openapi/routes/pipeline-template-routes.d.ts +1 -0
- package/lib/openapi/routes/pipeline-template-routes.js +59 -0
- package/lib/services/audit-spool.d.ts +21 -2
- package/lib/services/audit-spool.js +79 -7
- package/lib/services/entity-events.js +20 -1
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.js +2 -1
- package/lib/services/remote-audit-client.d.ts +1 -1
- package/lib/services/remote-audit-client.js +18 -1
- package/lib/types/catalog-metadata.d.ts +36 -0
- package/lib/types/catalog-metadata.js +21 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/index.js +3 -1
- package/lib/types/pipeline-template.d.ts +30 -0
- package/lib/types/pipeline-template.js +13 -0
- package/lib/utils/identity.js +11 -2
- package/lib/utils/logger.d.ts +10 -0
- package/lib/utils/logger.js +15 -1
- package/lib/utils/params.d.ts +12 -0
- package/lib/utils/params.js +1 -1
- package/lib/validation/common-schemas.d.ts +62 -0
- package/lib/validation/common-schemas.js +33 -1
- package/lib/validation/index.d.ts +1 -0
- package/lib/validation/index.js +2 -1
- package/lib/validation/message-schemas.d.ts +6 -0
- package/lib/validation/middleware.d.ts +17 -1
- package/lib/validation/middleware.js +1 -1
- package/lib/validation/pipeline-schemas.d.ts +50 -0
- package/lib/validation/pipeline-schemas.js +4 -2
- package/lib/validation/pipeline-template-schemas.d.ts +152 -0
- package/lib/validation/pipeline-template-schemas.js +65 -0
- package/lib/validation/plugin-schemas.d.ts +50 -0
- package/lib/validation/plugin-schemas.js +4 -2
- package/package.json +1 -1
|
@@ -6,6 +6,8 @@ import { emitCounter } from '../utils/metric-emitter.js';
|
|
|
6
6
|
const logger = createLogger('audit-spool');
|
|
7
7
|
const DEFAULT_SPOOL_KEY = 'audit:spool';
|
|
8
8
|
const DEFAULT_MAX_DEPTH = 10_000;
|
|
9
|
+
/** Guard so a pathological in-progress list can't spin `recover`/`take` forever. */
|
|
10
|
+
const MAX_MOVE_ITERATIONS = 100_000;
|
|
9
11
|
function errMsg(err) {
|
|
10
12
|
return err instanceof Error ? err.message : String(err);
|
|
11
13
|
}
|
|
@@ -25,7 +27,18 @@ function safeParse(raw) {
|
|
|
25
27
|
*/
|
|
26
28
|
export function createRedisAuditSpool(redis, opts = {}) {
|
|
27
29
|
const key = opts.key ?? DEFAULT_SPOOL_KEY;
|
|
30
|
+
// The in-progress "processing" list — a taken batch lives here until it is
|
|
31
|
+
// acked (delivered) or requeued (still failing). It is a security log's
|
|
32
|
+
// durability net: a crash between take and ack/requeue leaves the batch here,
|
|
33
|
+
// and `recover` reclaims it on restart instead of silently losing it.
|
|
34
|
+
const inProgressKey = `${key}:inflight`;
|
|
28
35
|
const maxDepth = Math.max(1, opts.maxDepth ?? DEFAULT_MAX_DEPTH);
|
|
36
|
+
// The EXACT serialized string each returned entry was parsed from, so `ack` /
|
|
37
|
+
// `requeue` can LREM the precise value off the in-progress list. Keyed by the
|
|
38
|
+
// returned object identity (the drain consumer passes the SAME objects back),
|
|
39
|
+
// so it needs no stable re-serialization. WeakMap → entries GC naturally.
|
|
40
|
+
const rawByEntry = new WeakMap();
|
|
41
|
+
const rawOf = (entry) => rawByEntry.get(entry) ?? JSON.stringify(entry);
|
|
29
42
|
return {
|
|
30
43
|
async enqueue(entry) {
|
|
31
44
|
try {
|
|
@@ -45,28 +58,87 @@ export function createRedisAuditSpool(redis, opts = {}) {
|
|
|
45
58
|
},
|
|
46
59
|
async take(max) {
|
|
47
60
|
try {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
const out = [];
|
|
62
|
+
const limit = Math.max(1, max);
|
|
63
|
+
for (let i = 0; i < limit; i++) {
|
|
64
|
+
// Atomically MOVE head→in-progress-tail so the entry is never in limbo:
|
|
65
|
+
// it is on exactly one list at all times, recoverable after a crash.
|
|
66
|
+
const raw = await redis.lmove(key, inProgressKey, 'LEFT', 'RIGHT');
|
|
67
|
+
if (raw === null || raw === undefined)
|
|
68
|
+
break;
|
|
69
|
+
const parsed = safeParse(raw);
|
|
70
|
+
if (parsed) {
|
|
71
|
+
rawByEntry.set(parsed, raw);
|
|
72
|
+
out.push(parsed);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Corrupt payload — drop it off the in-progress list so it can't wedge
|
|
76
|
+
// the drain, and account for it.
|
|
77
|
+
await redis.lrem(inProgressKey, 1, raw);
|
|
78
|
+
emitCounter('audit_spool_dropped_total', { service: 'unknown' });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
52
82
|
}
|
|
53
83
|
catch (err) {
|
|
54
84
|
logger.warn('Audit spool take failed', { error: errMsg(err) });
|
|
55
85
|
return [];
|
|
56
86
|
}
|
|
57
87
|
},
|
|
88
|
+
async ack(entries) {
|
|
89
|
+
if (entries.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
for (const entry of entries) {
|
|
93
|
+
await redis.lrem(inProgressKey, 1, rawOf(entry));
|
|
94
|
+
rawByEntry.delete(entry);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
logger.warn('Audit spool ack failed (may re-deliver on recover)', { error: errMsg(err) });
|
|
99
|
+
}
|
|
100
|
+
},
|
|
58
101
|
async requeue(entries) {
|
|
59
102
|
if (entries.length === 0)
|
|
60
103
|
return;
|
|
61
104
|
try {
|
|
62
105
|
// Put failed re-deliveries back at the HEAD so they're retried first and
|
|
63
|
-
// rough emission order is preserved across the outage
|
|
64
|
-
|
|
106
|
+
// rough emission order is preserved across the outage — and clear them
|
|
107
|
+
// from the in-progress list so `recover` doesn't double them. Iterate in
|
|
108
|
+
// reverse so lpush restores the batch's original order at the head.
|
|
109
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
110
|
+
const raw = rawOf(entries[i]);
|
|
111
|
+
await redis.lrem(inProgressKey, 1, raw);
|
|
112
|
+
await redis.lpush(key, raw);
|
|
113
|
+
rawByEntry.delete(entries[i]);
|
|
114
|
+
}
|
|
65
115
|
}
|
|
66
116
|
catch (err) {
|
|
67
117
|
logger.warn('Audit spool requeue failed (events lost)', { error: errMsg(err) });
|
|
68
118
|
}
|
|
69
119
|
},
|
|
120
|
+
async recover() {
|
|
121
|
+
try {
|
|
122
|
+
let reclaimed = 0;
|
|
123
|
+
for (let i = 0; i < MAX_MOVE_ITERATIONS; i++) {
|
|
124
|
+
// Move in-progress-tail → main-head: an older stranded entry (nearer the
|
|
125
|
+
// in-progress head) ends up ahead of a newer one, preserving order.
|
|
126
|
+
const raw = await redis.lmove(inProgressKey, key, 'RIGHT', 'LEFT');
|
|
127
|
+
if (raw === null || raw === undefined)
|
|
128
|
+
break;
|
|
129
|
+
reclaimed++;
|
|
130
|
+
}
|
|
131
|
+
if (reclaimed > 0) {
|
|
132
|
+
emitCounter('audit_spool_recovered_total', {}, reclaimed);
|
|
133
|
+
logger.warn('Audit spool recovered stranded in-progress events', { reclaimed });
|
|
134
|
+
}
|
|
135
|
+
return reclaimed;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logger.warn('Audit spool recover failed', { error: errMsg(err) });
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
},
|
|
70
142
|
async depth() {
|
|
71
143
|
try {
|
|
72
144
|
return await redis.llen(key);
|
|
@@ -91,4 +163,4 @@ export function createEnvRedisAuditSpool(opts = {}) {
|
|
|
91
163
|
logger.info('Redis audit spool initialized');
|
|
92
164
|
return createRedisAuditSpool(inst, opts);
|
|
93
165
|
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQTRDM0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFFakMsU0FBUyxNQUFNLENBQUMsR0FBWTtJQUMxQixPQUFPLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBb0IsQ0FBQztRQUNsRCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsS0FBc0IsRUFDdEIsSUFBSSxHQUF3QyxFQUFFO0lBRTlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUks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QUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUksR0FBd0MsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBa0IsYUFBYSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZW1vdmUgYW5kIHJldHVybiB1cCB0byBgbWF4YCBidWZmZXJlZCBlbnRyaWVzIGZvciByZS1kZWxpdmVyeSBhdHRlbXB0cy4gKi9cbiAgdGFrZShtYXg6IG51bWJlcik6IFByb21pc2U8QXVkaXRTcG9vbEVudHJ5W10+O1xuICAvKiogUmV0dXJuIGVudHJpZXMgd2hvc2UgcmUtZGVsaXZlcnkgZmFpbGVkIHRvIHRoZSBidWZmZXIgKGJlc3QtZWZmb3J0KS4gKi9cbiAgcmVxdWV1ZShlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBBcHByb3hpbWF0ZSBjdXJyZW50IGRlcHRoIChmb3IgbWV0cmljcyAvIGRyYWluIGRlY2lzaW9ucykuICovXG4gIGRlcHRoKCk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLyoqIE1pbmltYWwgUmVkaXMgTElTVCBzdXJmYWNlIHRoZSBzcG9vbCBuZWVkcyAoYSBzdWJzZXQgb2YgaW9yZWRpcykuICovXG5pbnRlcmZhY2UgUmVkaXNMaXN0Q2xpZW50IHtcbiAgcnB1c2goa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGxwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscG9wKGtleTogc3RyaW5nLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+O1xuICBsdHJpbShrZXk6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogUHJvbWlzZTx1bmtub3duPjtcbiAgbGxlbihrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgREVGQVVMVF9TUE9PTF9LRVkgPSAnYXVkaXQ6c3Bvb2wnO1xuY29uc3QgREVGQVVMVF9NQVhfREVQVEggPSAxMF8wMDA7XG5cbmZ1bmN0aW9uIGVyck1zZyhlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xufVxuXG5mdW5jdGlvbiBzYWZlUGFyc2UocmF3OiBzdHJpbmcpOiBBdWRpdFNwb29sRW50cnkgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgQXVkaXRTcG9vbEVudHJ5O1xuICAgIHJldHVybiBwYXJzZWQgJiYgcGFyc2VkLmV2ZW50ICYmIHBhcnNlZC5zZXJ2aWNlTmFtZSA/IHBhcnNlZCA6IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmVkaXMtTElTVC1iYWNrZWQgc3Bvb2wuIER1cmFibGUgYWNyb3NzIHByb2Nlc3MgcmVzdGFydHMgKHVubGlrZSBhbiBpbi1tZW1vcnlcbiAqIG9yIHBlci1wb2QtZGlzayBidWZmZXIpLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzIG9mIGEgc2VydmljZSwgYW5kIGJvdW5kZWQgdmlhXG4gKiBhIHRyaW0tdG8tdGFpbCBvbiBvdmVyZmxvdyAoZHJvcHMgdGhlIE9MREVTVCwgZW1pdHRpbmcgYGF1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWxgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzQXVkaXRTcG9vbChcbiAgcmVkaXM6IFJlZGlzTGlzdENsaWVudCxcbiAgb3B0czogeyBtYXhEZXB0aD86IG51bWJlcjsga2V5Pzogc3RyaW5nIH0gPSB7fSxcbik6IEF1ZGl0U3Bvb2wge1xuICBjb25zdCBrZXkgPSBvcHRzLmtleSA/PyBERUZBVUxUX1NQT09MX0tFWTtcbiAgY29uc3QgbWF4RGVwdGggPSBNYXRoLm1heCgxLCBvcHRzLm1heERlcHRoID8/IERFRkFVTFRfTUFYX0RFUFRIKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGVucXVldWUoZW50cnkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHJlZGlzLnJwdXNoKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2VucXVldWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgaWYgKGxlbiA+IG1heERlcHRoKSB7XG4gICAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBuZXdlc3QgYG1heERlcHRoYDsgZHJvcCB0aGUgb3ZlcmZsb3cgYXQgdGhlIGhlYWQuXG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGxlbiAtIG1heERlcHRoO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmx0cmltKGtleSwgZHJvcHBlZCwgLTEpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9LCBkcm9wcGVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgb3ZlcmZsb3cg4oCUIGRyb3BwZWQgb2xkZXN0IGJ1ZmZlcmVkIGV2ZW50cycsIHsgZHJvcHBlZCwgbWF4RGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZW5xdWV1ZSBmYWlsZWQgKGV2ZW50IGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHRha2UobWF4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5scG9wKGtleSwgTWF0aC5tYXgoMSwgbWF4KSk7XG4gICAgICAgIGlmICghcmF3IHx8IHJhdy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIHJhdy5tYXAoc2FmZVBhcnNlKS5maWx0ZXIoKGUpOiBlIGlzIEF1ZGl0U3Bvb2xFbnRyeSA9PiBlICE9PSBudWxsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgdGFrZSBmYWlsZWQnLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXVlKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUHV0IGZhaWxlZCByZS1kZWxpdmVyaWVzIGJhY2sgYXQgdGhlIEhFQUQgc28gdGhleSdyZSByZXRyaWVkIGZpcnN0IGFuZFxuICAgICAgICAvLyByb3VnaCBlbWlzc2lvbiBvcmRlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBvdXRhZ2UuXG4gICAgICAgIGF3YWl0IHJlZGlzLmxwdXNoKGtleSwgLi4uZW50cmllcy5tYXAoKGUpID0+IEpTT04uc3RyaW5naWZ5KGUpKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlcXVldWUgZmFpbGVkIChldmVudHMgbG9zdCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVwdGgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVkaXMubGxlbihrZXkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBSZWRpcy1iYWNrZWQgYXVkaXQgc3Bvb2wgZnJvbSB0aGUgYW1iaWVudCBgUkVESVNfVVJMYCAvIGBSRURJU19IT1NUYFxuICogZW52IHZpYSB0aGUgc2hhcmVkIGBjcmVhdGVFbnZSZWRpc0NsaWVudGAuIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXMgbm90XG4gKiBjb25maWd1cmVkIG9yIHRoZSBjbGllbnQgY2FuJ3QgYmUgY29uc3RydWN0ZWQg4oCUIHRoZSBjYWxsZXIgdGhlbiBydW5zIHdpdGhvdXQgYVxuICogc3Bvb2wgKHByZS1zcG9vbCBiZXN0LWVmZm9ydCBiZWhhdmlvciksIG5ldmVyIGNyYXNoaW5nLiBUaGUgc2hhcmVkIGhlbHBlciBsb2Fkc1xuICogaW9yZWRpcyB2aWEgYGNyZWF0ZVJlcXVpcmVgLCBzbyB0aGlzIHN0YXlzIGltcG9ydGFibGUgd2hlcmUgUmVkaXMgaXNuJ3QgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbChvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9KTogQXVkaXRTcG9vbCB8IG51bGwge1xuICBjb25zdCBpbnN0ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNMaXN0Q2xpZW50PignYXVkaXQtc3Bvb2wnKTtcbiAgaWYgKCFpbnN0KSByZXR1cm4gbnVsbDtcbiAgbG9nZ2VyLmluZm8oJ1JlZGlzIGF1ZGl0IHNwb29sIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woaW5zdCwgb3B0cyk7XG59XG4iXX0=
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQStEM0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDakMsb0ZBQW9GO0FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBRXBDLFNBQVMsTUFBTSxDQUFDLEdBQVk7SUFDMUIsT0FBTyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQW9CLENBQUM7UUFDbEQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEtBQXNCLEVBQ3RCLElBQUksR0FBd0Ms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U0FBUyxDQUFDLENBQUM7b0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixDQUFDO2dCQUNELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLO1lBQ1QsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUksR0FBd0MsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBa0IsYUFBYSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IE1PVkUgdXAgdG8gYG1heGAgYnVmZmVyZWQgZW50cmllcyBvbnRvIGFuIGluLXByb2dyZXNzIGxpc3QgYW5kXG4gICAqIHJldHVybiB0aGVtLiBCZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBtb3ZlZCAobm90IHBvcHBlZC1hbmQtZHJvcHBlZCksIGEgY3Jhc2hcbiAgICogbWlkLWRyYWluIGxlYXZlcyB0aGVtIHJlY292ZXJhYmxlIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IOKAlCBzZWUgYHJlY292ZXJgLlxuICAgKiBFYWNoIHRha2VuIGVudHJ5IE1VU1QgYmUgcmVzb2x2ZWQgd2l0aCBleGFjdGx5IG9uZSBvZiBgYWNrYCAoZGVsaXZlcmVkKSBvclxuICAgKiBgcmVxdWV1ZWAgKHN0aWxsIGZhaWxpbmcpLCBvciBpdCBsaW5nZXJzIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHVudGlsIHRoZVxuICAgKiBuZXh0IGByZWNvdmVyYC5cbiAgICovXG4gIHRha2UobWF4OiBudW1iZXIpOiBQcm9taXNlPEF1ZGl0U3Bvb2xFbnRyeVtdPjtcbiAgLyoqIEFja25vd2xlZGdlIHN1Y2Nlc3NmdWxseSByZS1kZWxpdmVyZWQgZW50cmllcyDigJQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlXG4gICAqICBpbi1wcm9ncmVzcyBsaXN0IHNvIHRoZXkgYXJlIG5vdCByZWNvdmVyZWQgYWdhaW4uICovXG4gIGFjayhlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZXR1cm4gZW50cmllcyB3aG9zZSByZS1kZWxpdmVyeSBmYWlsZWQgdG8gdGhlIEhFQUQgb2YgdGhlIGJ1ZmZlciAocmV0cmllZFxuICAgKiAgZmlyc3QpIGFuZCBjbGVhciB0aGVtIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3QuIEJlc3QtZWZmb3J0LiAqL1xuICByZXF1ZXVlKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlY2xhaW0gYW55IGVudHJpZXMgc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCxcbiAgICogIG1vdmluZyB0aGVtIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIG1haW4gYnVmZmVyLiBDYWxsIG9uY2UgYXQgc3RhcnR1cC5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciByZWNsYWltZWQuICovXG4gIHJlY292ZXIoKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogQXBwcm94aW1hdGUgY3VycmVudCBkZXB0aCAoZm9yIG1ldHJpY3MgLyBkcmFpbiBkZWNpc2lvbnMpLiAqL1xuICBkZXB0aCgpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKiBNaW5pbWFsIFJlZGlzIExJU1Qgc3VyZmFjZSB0aGUgc3Bvb2wgbmVlZHMgKGEgc3Vic2V0IG9mIGlvcmVkaXMpLiAqL1xuaW50ZXJmYWNlIFJlZGlzTGlzdENsaWVudCB7XG4gIHJwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscHVzaChrZXk6IHN0cmluZywgLi4udmFsdWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgbHBvcChrZXk6IHN0cmluZywgY291bnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPjtcbiAgbHRyaW0oa2V5OiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIGxsZW4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBBdG9taWNhbGx5IHBvcCBmcm9tIG9uZSBsaXN0IGVuZCBhbmQgcHVzaCB0byBhbm90aGVyIChSZWRpcyDiiaUgNi4yKS4gKi9cbiAgbG1vdmUoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGZyb206ICdMRUZUJyB8ICdSSUdIVCcsIHRvOiAnTEVGVCcgfCAnUklHSFQnKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFJlbW92ZSBgY291bnRgIG9jY3VycmVuY2VzIG9mIGB2YWx1ZWAgZnJvbSBhIGxpc3QuICovXG4gIGxyZW0oa2V5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IERFRkFVTFRfU1BPT0xfS0VZID0gJ2F1ZGl0OnNwb29sJztcbmNvbnN0IERFRkFVTFRfTUFYX0RFUFRIID0gMTBfMDAwO1xuLyoqIEd1YXJkIHNvIGEgcGF0aG9sb2dpY2FsIGluLXByb2dyZXNzIGxpc3QgY2FuJ3Qgc3BpbiBgcmVjb3ZlcmAvYHRha2VgIGZvcmV2ZXIuICovXG5jb25zdCBNQVhfTU9WRV9JVEVSQVRJT05TID0gMTAwXzAwMDtcblxuZnVuY3Rpb24gZXJyTXNnKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZShyYXc6IHN0cmluZyk6IEF1ZGl0U3Bvb2xFbnRyeSB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBBdWRpdFNwb29sRW50cnk7XG4gICAgcmV0dXJuIHBhcnNlZCAmJiBwYXJzZWQuZXZlbnQgJiYgcGFyc2VkLnNlcnZpY2VOYW1lID8gcGFyc2VkIDogbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWRpcy1MSVNULWJhY2tlZCBzcG9vbC4gRHVyYWJsZSBhY3Jvc3MgcHJvY2VzcyByZXN0YXJ0cyAodW5saWtlIGFuIGluLW1lbW9yeVxuICogb3IgcGVyLXBvZC1kaXNrIGJ1ZmZlciksIHNoYXJlZCBieSBhbGwgcmVwbGljYXMgb2YgYSBzZXJ2aWNlLCBhbmQgYm91bmRlZCB2aWFcbiAqIGEgdHJpbS10by10YWlsIG9uIG92ZXJmbG93IChkcm9wcyB0aGUgT0xERVNULCBlbWl0dGluZyBgYXVkaXRfc3Bvb2xfZHJvcHBlZF90b3RhbGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNBdWRpdFNwb29sKFxuICByZWRpczogUmVkaXNMaXN0Q2xpZW50LFxuICBvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9LFxuKTogQXVkaXRTcG9vbCB7XG4gIGNvbnN0IGtleSA9IG9wdHMua2V5ID8/IERFRkFVTFRfU1BPT0xfS0VZO1xuICAvLyBUaGUgaW4tcHJvZ3Jlc3MgXCJwcm9jZXNzaW5nXCIgbGlzdCDigJQgYSB0YWtlbiBiYXRjaCBsaXZlcyBoZXJlIHVudGlsIGl0IGlzXG4gIC8vIGFja2VkIChkZWxpdmVyZWQpIG9yIHJlcXVldWVkIChzdGlsbCBmYWlsaW5nKS4gSXQgaXMgYSBzZWN1cml0eSBsb2cnc1xuICAvLyBkdXJhYmlsaXR5IG5ldDogYSBjcmFzaCBiZXR3ZWVuIHRha2UgYW5kIGFjay9yZXF1ZXVlIGxlYXZlcyB0aGUgYmF0Y2ggaGVyZSxcbiAgLy8gYW5kIGByZWNvdmVyYCByZWNsYWltcyBpdCBvbiByZXN0YXJ0IGluc3RlYWQgb2Ygc2lsZW50bHkgbG9zaW5nIGl0LlxuICBjb25zdCBpblByb2dyZXNzS2V5ID0gYCR7a2V5fTppbmZsaWdodGA7XG4gIGNvbnN0IG1heERlcHRoID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhEZXB0aCA/PyBERUZBVUxUX01BWF9ERVBUSCk7XG5cbiAgLy8gVGhlIEVYQUNUIHNlcmlhbGl6ZWQgc3RyaW5nIGVhY2ggcmV0dXJuZWQgZW50cnkgd2FzIHBhcnNlZCBmcm9tLCBzbyBgYWNrYCAvXG4gIC8vIGByZXF1ZXVlYCBjYW4gTFJFTSB0aGUgcHJlY2lzZSB2YWx1ZSBvZmYgdGhlIGluLXByb2dyZXNzIGxpc3QuIEtleWVkIGJ5IHRoZVxuICAvLyByZXR1cm5lZCBvYmplY3QgaWRlbnRpdHkgKHRoZSBkcmFpbiBjb25zdW1lciBwYXNzZXMgdGhlIFNBTUUgb2JqZWN0cyBiYWNrKSxcbiAgLy8gc28gaXQgbmVlZHMgbm8gc3RhYmxlIHJlLXNlcmlhbGl6YXRpb24uIFdlYWtNYXAg4oaSIGVudHJpZXMgR0MgbmF0dXJhbGx5LlxuICBjb25zdCByYXdCeUVudHJ5ID0gbmV3IFdlYWtNYXA8QXVkaXRTcG9vbEVudHJ5LCBzdHJpbmc+KCk7XG4gIGNvbnN0IHJhd09mID0gKGVudHJ5OiBBdWRpdFNwb29sRW50cnkpOiBzdHJpbmcgPT4gcmF3QnlFbnRyeS5nZXQoZW50cnkpID8/IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGVucXVldWUoZW50cnkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHJlZGlzLnJwdXNoKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2VucXVldWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgaWYgKGxlbiA+IG1heERlcHRoKSB7XG4gICAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBuZXdlc3QgYG1heERlcHRoYDsgZHJvcCB0aGUgb3ZlcmZsb3cgYXQgdGhlIGhlYWQuXG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGxlbiAtIG1heERlcHRoO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmx0cmltKGtleSwgZHJvcHBlZCwgLTEpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9LCBkcm9wcGVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgb3ZlcmZsb3cg4oCUIGRyb3BwZWQgb2xkZXN0IGJ1ZmZlcmVkIGV2ZW50cycsIHsgZHJvcHBlZCwgbWF4RGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZW5xdWV1ZSBmYWlsZWQgKGV2ZW50IGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHRha2UobWF4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdXQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgbWF4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICAgICAgLy8gQXRvbWljYWxseSBNT1ZFIGhlYWTihpJpbi1wcm9ncmVzcy10YWlsIHNvIHRoZSBlbnRyeSBpcyBuZXZlciBpbiBsaW1ibzpcbiAgICAgICAgICAvLyBpdCBpcyBvbiBleGFjdGx5IG9uZSBsaXN0IGF0IGFsbCB0aW1lcywgcmVjb3ZlcmFibGUgYWZ0ZXIgYSBjcmFzaC5cbiAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5sbW92ZShrZXksIGluUHJvZ3Jlc3NLZXksICdMRUZUJywgJ1JJR0hUJyk7XG4gICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gc2FmZVBhcnNlKHJhdyk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgcmF3QnlFbnRyeS5zZXQocGFyc2VkLCByYXcpO1xuICAgICAgICAgICAgb3V0LnB1c2gocGFyc2VkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29ycnVwdCBwYXlsb2FkIOKAlCBkcm9wIGl0IG9mZiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdCBzbyBpdCBjYW4ndCB3ZWRnZVxuICAgICAgICAgICAgLy8gdGhlIGRyYWluLCBhbmQgYWNjb3VudCBmb3IgaXQuXG4gICAgICAgICAgICBhd2FpdCByZWRpcy5scmVtKGluUHJvZ3Jlc3NLZXksIDEsIHJhdyk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogJ3Vua25vd24nIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCB0YWtlIGZhaWxlZCcsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFjayhlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3T2YoZW50cnkpKTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgYWNrIGZhaWxlZCAobWF5IHJlLWRlbGl2ZXIgb24gcmVjb3ZlciknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWV1ZShlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFB1dCBmYWlsZWQgcmUtZGVsaXZlcmllcyBiYWNrIGF0IHRoZSBIRUFEIHNvIHRoZXkncmUgcmV0cmllZCBmaXJzdCBhbmRcbiAgICAgICAgLy8gcm91Z2ggZW1pc3Npb24gb3JkZXIgaXMgcHJlc2VydmVkIGFjcm9zcyB0aGUgb3V0YWdlIOKAlCBhbmQgY2xlYXIgdGhlbVxuICAgICAgICAvLyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHNvIGByZWNvdmVyYCBkb2Vzbid0IGRvdWJsZSB0aGVtLiBJdGVyYXRlIGluXG4gICAgICAgIC8vIHJldmVyc2Ugc28gbHB1c2ggcmVzdG9yZXMgdGhlIGJhdGNoJ3Mgb3JpZ2luYWwgb3JkZXIgYXQgdGhlIGhlYWQuXG4gICAgICAgIGZvciAobGV0IGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gcmF3T2YoZW50cmllc1tpXSk7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHJlbShpblByb2dyZXNzS2V5LCAxLCByYXcpO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxwdXNoKGtleSwgcmF3KTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyaWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZXF1ZXVlIGZhaWxlZCAoZXZlbnRzIGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlY292ZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVjbGFpbWVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfTU9WRV9JVEVSQVRJT05TOyBpKyspIHtcbiAgICAgICAgICAvLyBNb3ZlIGluLXByb2dyZXNzLXRhaWwg4oaSIG1haW4taGVhZDogYW4gb2xkZXIgc3RyYW5kZWQgZW50cnkgKG5lYXJlciB0aGVcbiAgICAgICAgICAvLyBpbi1wcm9ncmVzcyBoZWFkKSBlbmRzIHVwIGFoZWFkIG9mIGEgbmV3ZXIgb25lLCBwcmVzZXJ2aW5nIG9yZGVyLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGluUHJvZ3Jlc3NLZXksIGtleSwgJ1JJR0hUJywgJ0xFRlQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICByZWNsYWltZWQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjbGFpbWVkID4gMCkge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWNvdmVyZWRfdG90YWwnLCB7fSwgcmVjbGFpbWVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgcmVjb3ZlcmVkIHN0cmFuZGVkIGluLXByb2dyZXNzIGV2ZW50cycsIHsgcmVjbGFpbWVkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNsYWltZWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlY292ZXIgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkZXB0aCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy5sbGVuKGtleSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCBhdWRpdCBzcG9vbCBmcm9tIHRoZSBhbWJpZW50IGBSRURJU19VUkxgIC8gYFJFRElTX0hPU1RgXG4gKiBlbnYgdmlhIHRoZSBzaGFyZWQgYGNyZWF0ZUVudlJlZGlzQ2xpZW50YC4gUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpcyBub3RcbiAqIGNvbmZpZ3VyZWQgb3IgdGhlIGNsaWVudCBjYW4ndCBiZSBjb25zdHJ1Y3RlZCDigJQgdGhlIGNhbGxlciB0aGVuIHJ1bnMgd2l0aG91dCBhXG4gKiBzcG9vbCAocHJlLXNwb29sIGJlc3QtZWZmb3J0IGJlaGF2aW9yKSwgbmV2ZXIgY3Jhc2hpbmcuIFRoZSBzaGFyZWQgaGVscGVyIGxvYWRzXG4gKiBpb3JlZGlzIHZpYSBgY3JlYXRlUmVxdWlyZWAsIHNvIHRoaXMgc3RheXMgaW1wb3J0YWJsZSB3aGVyZSBSZWRpcyBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30pOiBBdWRpdFNwb29sIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc0xpc3RDbGllbnQ+KCdhdWRpdC1zcG9vbCcpO1xuICBpZiAoIWluc3QpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgYXVkaXQgc3Bvb2wgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzQXVkaXRTcG9vbChpbnN0LCBvcHRzKTtcbn1cbiJdfQ==
|
|
@@ -15,8 +15,20 @@
|
|
|
15
15
|
* - Fire-and-forget: emit() never throws, subscriber errors are logged
|
|
16
16
|
* - In-process only: no network, no Redis, no infrastructure
|
|
17
17
|
* - Subscribers run async: never block the original request
|
|
18
|
+
*
|
|
19
|
+
* Durability contract (deliberately BEST-EFFORT):
|
|
20
|
+
* - The post-mutation compliance evaluation this feeds is NOT the enforcement
|
|
21
|
+
* gate — LIVE validation on the mutation path already enforces compliance
|
|
22
|
+
* before the write commits. This async fan-out is a convenience/reporting
|
|
23
|
+
* signal, so a lost delivery (subscriber throw, process crash mid-callback)
|
|
24
|
+
* downgrades timeliness, not correctness. Backing it with the durable Redis
|
|
25
|
+
* spool would pull network/infra into a module whose whole point is to have
|
|
26
|
+
* none, for no enforcement benefit — so instead a dropped delivery is made
|
|
27
|
+
* OBSERVABLE via the `entity_event_subscriber_failed_total` counter (alert on
|
|
28
|
+
* a sustained rate) rather than silently swallowed at debug level.
|
|
18
29
|
*/
|
|
19
30
|
import { createLogger } from '../utils/logger.js';
|
|
31
|
+
import { emitCounter } from '../utils/metric-emitter.js';
|
|
20
32
|
const logger = createLogger('entity-events');
|
|
21
33
|
class EntityEventEmitter {
|
|
22
34
|
subscribers = [];
|
|
@@ -39,6 +51,13 @@ class EntityEventEmitter {
|
|
|
39
51
|
emit(event) {
|
|
40
52
|
for (const subscriber of this.subscribers) {
|
|
41
53
|
subscriber.onEntityEvent(event).catch((err) => {
|
|
54
|
+
// Make the drop observable — a lost async compliance eval is best-effort
|
|
55
|
+
// (live validation already enforced), but a sustained failure rate is an
|
|
56
|
+
// operational signal, not something to bury at debug level.
|
|
57
|
+
emitCounter('entity_event_subscriber_failed_total', {
|
|
58
|
+
target: event.target,
|
|
59
|
+
eventType: event.eventType,
|
|
60
|
+
});
|
|
42
61
|
logger.debug('Entity event subscriber failed', {
|
|
43
62
|
target: event.target,
|
|
44
63
|
eventType: event.eventType,
|
|
@@ -57,4 +76,4 @@ class EntityEventEmitter {
|
|
|
57
76
|
}
|
|
58
77
|
/** Singleton entity event emitter — shared across the process */
|
|
59
78
|
export const entityEvents = new EntityEventEmitter();
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdHktZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjdDLE1BQU0sa0JBQWtCO0lBQ2QsV0FBVyxHQUE0QixFQUFFLENBQUM7SUFFbEQ7O09BRUc7SUFDSCxTQUFTLENBQUMsVUFBaUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLFVBQWlDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLEtBQWtCO1FBQ3JCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzVDLHlFQUF5RTtnQkFDekUseUVBQXlFO2dCQUN6RSw0REFBNEQ7Z0JBQzVELFdBQVcsQ0FBQyxzQ0FBc0MsRUFBRTtvQkFDbEQsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFO29CQUM3QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztvQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO29CQUN4QixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDeEQsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMaWdodHdlaWdodCBpbi1wcm9jZXNzIGV2ZW50IGVtaXR0ZXIgZm9yIGVudGl0eSBsaWZlY3ljbGUgZXZlbnRzLlxuICpcbiAqIFNlcnZpY2VzIGVtaXQgZXZlbnRzIGFmdGVyIG11dGF0aW9ucyAoY3JlYXRlL3VwZGF0ZS9kZWxldGUpIHZpYSBDcnVkU2VydmljZSBob29rcy5cbiAqIFN1YnNjcmliZXJzIHJlYWN0IGFzeW5jaHJvbm91c2x5IHRvIGVudGl0eSBjaGFuZ2VzLlxuICpcbiAqIEFjdGl2ZSBzdWJzY3JpYmVyczpcbiAqIC0gKipDb21wbGlhbmNlIGV2ZW50IHN1YnNjcmliZXIqKiAoYHJlZ2lzdGVyQ29tcGxpYW5jZUV2ZW50U3Vic2NyaWJlcigpYCkg4oCUIGZvcndhcmRzXG4gKiAgIGVudGl0eSBldmVudHMgdG8gdGhlIGNvbXBsaWFuY2Ugc2VydmljZSBmb3IgcG9zdC1tdXRhdGlvbiBydWxlIGV2YWx1YXRpb24uXG4gKiAgIFJlZ2lzdGVyZWQgYXQgc3RhcnR1cCBpbiBwbHVnaW4gYW5kIHBpcGVsaW5lIHNlcnZpY2UgaW5kZXgudHMuXG4gKlxuICogRGVzaWduOlxuICogLSBGaXJlLWFuZC1mb3JnZXQ6IGVtaXQoKSBuZXZlciB0aHJvd3MsIHN1YnNjcmliZXIgZXJyb3JzIGFyZSBsb2dnZWRcbiAqIC0gSW4tcHJvY2VzcyBvbmx5OiBubyBuZXR3b3JrLCBubyBSZWRpcywgbm8gaW5mcmFzdHJ1Y3R1cmVcbiAqIC0gU3Vic2NyaWJlcnMgcnVuIGFzeW5jOiBuZXZlciBibG9jayB0aGUgb3JpZ2luYWwgcmVxdWVzdFxuICpcbiAqIER1cmFiaWxpdHkgY29udHJhY3QgKGRlbGliZXJhdGVseSBCRVNULUVGRk9SVCk6XG4gKiAtIFRoZSBwb3N0LW11dGF0aW9uIGNvbXBsaWFuY2UgZXZhbHVhdGlvbiB0aGlzIGZlZWRzIGlzIE5PVCB0aGUgZW5mb3JjZW1lbnRcbiAqICAgZ2F0ZSDigJQgTElWRSB2YWxpZGF0aW9uIG9uIHRoZSBtdXRhdGlvbiBwYXRoIGFscmVhZHkgZW5mb3JjZXMgY29tcGxpYW5jZVxuICogICBiZWZvcmUgdGhlIHdyaXRlIGNvbW1pdHMuIFRoaXMgYXN5bmMgZmFuLW91dCBpcyBhIGNvbnZlbmllbmNlL3JlcG9ydGluZ1xuICogICBzaWduYWwsIHNvIGEgbG9zdCBkZWxpdmVyeSAoc3Vic2NyaWJlciB0aHJvdywgcHJvY2VzcyBjcmFzaCBtaWQtY2FsbGJhY2spXG4gKiAgIGRvd25ncmFkZXMgdGltZWxpbmVzcywgbm90IGNvcnJlY3RuZXNzLiBCYWNraW5nIGl0IHdpdGggdGhlIGR1cmFibGUgUmVkaXNcbiAqICAgc3Bvb2wgd291bGQgcHVsbCBuZXR3b3JrL2luZnJhIGludG8gYSBtb2R1bGUgd2hvc2Ugd2hvbGUgcG9pbnQgaXMgdG8gaGF2ZVxuICogICBub25lLCBmb3Igbm8gZW5mb3JjZW1lbnQgYmVuZWZpdCDigJQgc28gaW5zdGVhZCBhIGRyb3BwZWQgZGVsaXZlcnkgaXMgbWFkZVxuICogICBPQlNFUlZBQkxFIHZpYSB0aGUgYGVudGl0eV9ldmVudF9zdWJzY3JpYmVyX2ZhaWxlZF90b3RhbGAgY291bnRlciAoYWxlcnQgb25cbiAqICAgYSBzdXN0YWluZWQgcmF0ZSkgcmF0aGVyIHRoYW4gc2lsZW50bHkgc3dhbGxvd2VkIGF0IGRlYnVnIGxldmVsLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdlbnRpdHktZXZlbnRzJyk7XG5cbmV4cG9ydCB0eXBlIEVudGl0eUV2ZW50VHlwZSA9ICdjcmVhdGVkJyB8ICd1cGRhdGVkJyB8ICdkZWxldGVkJztcbmV4cG9ydCB0eXBlIEVudGl0eVRhcmdldCA9ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJyB8ICdtZXNzYWdlJyB8ICdvcmdhbml6YXRpb24nIHwgJ3VzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUV2ZW50IHtcbiAgLyoqIFRoZSB0eXBlIG9mIG11dGF0aW9uIHRoYXQgb2NjdXJyZWQgKi9cbiAgZXZlbnRUeXBlOiBFbnRpdHlFdmVudFR5cGU7XG4gIC8qKiBUaGUgZW50aXR5IHR5cGUgdGhhdCB3YXMgbXV0YXRlZCAqL1xuICB0YXJnZXQ6IEVudGl0eVRhcmdldDtcbiAgLyoqIFRoZSBlbnRpdHkncyB1bmlxdWUgSUQgKi9cbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgLyoqIFRoZSBvcmdhbml6YXRpb24gdGhhdCBvd25zIHRoaXMgZW50aXR5ICovXG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB0aGUgb3duaW5nIG9yZydzIHBhcmVudCAocHJlc2VudCBvbmx5IHdoZW4gYG9yZ0lkYCBpc1xuICAgKiAgYSB0ZWFtKS4gTGV0cyBjb21wbGlhbmNlIGV2YWx1YXRlIHBhcmVudCBgcHJvcGFnYXRlVG9DaGlsZHJlbmAgcnVsZXMgb24gdGhlXG4gICAqICBhc3luYyBldmVudCBwYXRoLCBtYXRjaGluZyBsaXZlIHZhbGlkYXRpb24uICovXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nO1xuICAvKiogVGhlIHVzZXIgd2hvIHBlcmZvcm1lZCB0aGUgbXV0YXRpb24gKi9cbiAgdXNlcklkOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoZSBldmVudCBvY2N1cnJlZCAqL1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIC8qKiBTbmFwc2hvdCBvZiBlbnRpdHkgYXR0cmlidXRlcyAoZm9yIGNvbXBsaWFuY2UgZXZhbHVhdGlvbikgKi9cbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RXZlbnRTdWJzY3JpYmVyIHtcbiAgb25FbnRpdHlFdmVudChldmVudDogRW50aXR5RXZlbnQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5jbGFzcyBFbnRpdHlFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIHN1YnNjcmliZXJzOiBFbnRpdHlFdmVudFN1YnNjcmliZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHN1YnNjcmliZXIgdG8gcmVjZWl2ZSBlbnRpdHkgZXZlbnRzLlxuICAgKi9cbiAgc3Vic2NyaWJlKHN1YnNjcmliZXI6IEVudGl0eUV2ZW50U3Vic2NyaWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzdWJzY3JpYmVyLlxuICAgKi9cbiAgdW5zdWJzY3JpYmUoc3Vic2NyaWJlcjogRW50aXR5RXZlbnRTdWJzY3JpYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpYmVycyA9IHRoaXMuc3Vic2NyaWJlcnMuZmlsdGVyKChzKSA9PiBzICE9PSBzdWJzY3JpYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGVudGl0eSBldmVudCB0byBhbGwgc3Vic2NyaWJlcnMuXG4gICAqIEZpcmUtYW5kLWZvcmdldDogZXJyb3JzIGFyZSBjYXVnaHQgYW5kIGxvZ2dlZCwgbmV2ZXIgdGhyb3duLlxuICAgKi9cbiAgZW1pdChldmVudDogRW50aXR5RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmliZXIgb2YgdGhpcy5zdWJzY3JpYmVycykge1xuICAgICAgc3Vic2NyaWJlci5vbkVudGl0eUV2ZW50KGV2ZW50KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIC8vIE1ha2UgdGhlIGRyb3Agb2JzZXJ2YWJsZSDigJQgYSBsb3N0IGFzeW5jIGNvbXBsaWFuY2UgZXZhbCBpcyBiZXN0LWVmZm9ydFxuICAgICAgICAvLyAobGl2ZSB2YWxpZGF0aW9uIGFscmVhZHkgZW5mb3JjZWQpLCBidXQgYSBzdXN0YWluZWQgZmFpbHVyZSByYXRlIGlzIGFuXG4gICAgICAgIC8vIG9wZXJhdGlvbmFsIHNpZ25hbCwgbm90IHNvbWV0aGluZyB0byBidXJ5IGF0IGRlYnVnIGxldmVsLlxuICAgICAgICBlbWl0Q291bnRlcignZW50aXR5X2V2ZW50X3N1YnNjcmliZXJfZmFpbGVkX3RvdGFsJywge1xuICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdFbnRpdHkgZXZlbnQgc3Vic2NyaWJlciBmYWlsZWQnLCB7XG4gICAgICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgZW50aXR5SWQ6IGV2ZW50LmVudGl0eUlkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzdWJzY3JpYmVyIGNvdW50IChmb3IgdGVzdGluZy9kaWFnbm9zdGljcykuXG4gICAqL1xuICBnZXQgc3Vic2NyaWJlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlcnMubGVuZ3RoO1xuICB9XG59XG5cbi8qKiBTaW5nbGV0b24gZW50aXR5IGV2ZW50IGVtaXR0ZXIg4oCUIHNoYXJlZCBhY3Jvc3MgdGhlIHByb2Nlc3MgKi9cbmV4cG9ydCBjb25zdCBlbnRpdHlFdmVudHMgPSBuZXcgRW50aXR5RXZlbnRFbWl0dGVyKCk7XG4iXX0=
|
package/lib/services/index.d.ts
CHANGED
|
@@ -10,5 +10,6 @@ export type { RetryConfig, RetryDecision } from './retry-strategy.js';
|
|
|
10
10
|
export * from './quota.js';
|
|
11
11
|
export * from './remote-audit-client.js';
|
|
12
12
|
export * from './audit-spool.js';
|
|
13
|
+
export * from './env-redis.js';
|
|
13
14
|
export * from './token-revocation.js';
|
|
14
15
|
export { enqueueComplianceEvent, registerComplianceQueueBackend, type ComplianceEvent } from './compliance-queue.js';
|
package/lib/services/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RET
|
|
|
11
11
|
export * from './quota.js';
|
|
12
12
|
export * from './remote-audit-client.js';
|
|
13
13
|
export * from './audit-spool.js';
|
|
14
|
+
export * from './env-redis.js';
|
|
14
15
|
export * from './token-revocation.js';
|
|
15
16
|
export { enqueueComplianceEvent, registerComplianceQueueBackend } from './compliance-queue.js';
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQXdCLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGNhbGN1bGF0ZUJhY2tvZmYsXG4gIGlzVHJhbnNpZW50U3RhdHVzQ29kZSxcbiAgaXNSYXRlTGltaXRlZCxcbiAgZ2V0UmV0cnlEZWNpc2lvbixcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcsIFJldHJ5RGVjaXNpb24gfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90b2tlbi1yZXZvY2F0aW9uLmpzJztcbmV4cG9ydCB7IGVucXVldWVDb21wbGlhbmNlRXZlbnQsIHJlZ2lzdGVyQ29tcGxpYW5jZVF1ZXVlQmFja2VuZCwgdHlwZSBDb21wbGlhbmNlRXZlbnQgfSBmcm9tICcuL2NvbXBsaWFuY2UtcXVldWUuanMnO1xuIl19
|
|
@@ -10,7 +10,7 @@ import { type AuditSpool } from './audit-spool.js';
|
|
|
10
10
|
* (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
|
|
11
11
|
* this list free of any platform-only action.
|
|
12
12
|
*/
|
|
13
|
-
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.cancel', 'registry.gc', 'registry.image.delete', 'message.announcement.create', 'message.delete', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'authz.denied'];
|
|
13
|
+
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.cancel', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'message.announcement.create', 'message.delete', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'authz.denied'];
|
|
14
14
|
export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
|
|
15
15
|
/** Whether `value` is an action a remote service may emit (the ingest allow-list). */
|
|
16
16
|
export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;
|
|
@@ -52,6 +52,9 @@ export const REMOTE_AUDIT_ACTIONS = [
|
|
|
52
52
|
'pipeline.create',
|
|
53
53
|
'pipeline.update',
|
|
54
54
|
'pipeline.delete',
|
|
55
|
+
'pipeline_template.create',
|
|
56
|
+
'pipeline_template.update',
|
|
57
|
+
'pipeline_template.delete',
|
|
55
58
|
'pipeline.execution.start',
|
|
56
59
|
'pipeline.execution.cancel',
|
|
57
60
|
// CodePipeline ARN-registry config (api/pipeline registry route) — registering /
|
|
@@ -87,6 +90,10 @@ export const REMOTE_AUDIT_ACTIONS = [
|
|
|
87
90
|
// sweeps and explicit image/tag deletes (previously only a log line).
|
|
88
91
|
'registry.gc',
|
|
89
92
|
'registry.image.delete',
|
|
93
|
+
// Cross-repo tag/image copy (api/image-registry POST /api/images/copy). A
|
|
94
|
+
// cross-tenant copy moves data across customer boundaries, so it needs the
|
|
95
|
+
// durable, tamper-evident trail — not just the Loki operator line.
|
|
96
|
+
'registry.image.copy',
|
|
90
97
|
// Messaging (api/message) — admin BROADCAST announcements + destructive
|
|
91
98
|
// deletes. 1:1 user messages are intentionally NOT audited (noise + they would
|
|
92
99
|
// pull private content into the trail). `details` carry metadata only
|
|
@@ -208,6 +215,7 @@ export function createRemoteAuditClient(config = {}) {
|
|
|
208
215
|
const batch = await spool.take(drainBatchSize);
|
|
209
216
|
if (batch.length === 0)
|
|
210
217
|
return;
|
|
218
|
+
const delivered = [];
|
|
211
219
|
const failed = [];
|
|
212
220
|
let platformDown = false;
|
|
213
221
|
for (const entry of batch) {
|
|
@@ -217,6 +225,7 @@ export function createRemoteAuditClient(config = {}) {
|
|
|
217
225
|
}
|
|
218
226
|
const ok = await deliver(entry.event, entry.serviceName);
|
|
219
227
|
if (ok) {
|
|
228
|
+
delivered.push(entry);
|
|
220
229
|
emitCounter('audit_spool_redelivered_total', { service: entry.serviceName });
|
|
221
230
|
}
|
|
222
231
|
else {
|
|
@@ -224,6 +233,11 @@ export function createRemoteAuditClient(config = {}) {
|
|
|
224
233
|
failed.push(entry);
|
|
225
234
|
}
|
|
226
235
|
}
|
|
236
|
+
// Acknowledge the delivered prefix so it clears the in-progress list; the
|
|
237
|
+
// reliable take() moved the whole batch there, so unacked survivors are
|
|
238
|
+
// reclaimed by recover() after a crash rather than being silently lost.
|
|
239
|
+
if (delivered.length > 0)
|
|
240
|
+
await spool.ack(delivered);
|
|
227
241
|
if (failed.length > 0) {
|
|
228
242
|
await spool.requeue(failed);
|
|
229
243
|
return; // still down — try again on the next tick
|
|
@@ -239,6 +253,9 @@ export function createRemoteAuditClient(config = {}) {
|
|
|
239
253
|
}
|
|
240
254
|
let drainTimer;
|
|
241
255
|
if (spool) {
|
|
256
|
+
// Reclaim any batch stranded on the in-progress list by a prior crash, then
|
|
257
|
+
// attempt to flush it. Both are best-effort (the spool swallows its errors).
|
|
258
|
+
void spool.recover().then(() => drain());
|
|
242
259
|
drainTimer = setInterval(() => { void drain(); }, config.drainIntervalMs ?? 30_000);
|
|
243
260
|
// Don't let the drain timer keep the process alive on shutdown.
|
|
244
261
|
drainTimer.unref?.();
|
|
@@ -340,4 +357,4 @@ export function createRemoteAuditAccessor(serviceName) {
|
|
|
340
357
|
emit: (event) => svc().emit(event),
|
|
341
358
|
};
|
|
342
359
|
}
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMEJBQTBCO0lB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RUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdELE9BQU87UUFDTCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQztRQUNsRCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFdBQW1CO0lBSTNELElBQUksS0FBSyxHQUE4QixJQUFJLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsR0FBdUIsRUFBRTtRQUNuQyxJQUFJLENBQUMsS0FBSztZQUFFLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTTtRQUNsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsIHR5cGUgQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sRW50cnkgfSBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyLCBzZXRBdXRoekRlbmlhbEF1ZGl0b3IsIHR5cGUgQXV0aHpEZW5pYWxJbmZvIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVtb3RlLWF1ZGl0Jyk7XG5cbi8qKlxuICogQXVkaXQgaW5nZXN0IGlzIGJlc3QtZWZmb3J0IGFuZCBNVVNUIE5PVCBibG9jayB0aGUgY2FsbGVyLCBidXQgYSB0cmFuc2llbnRcbiAqIGZhaWx1cmUgKDQyOSAvIDV4eCAvIGNvbm5lY3Rpb24gcmVzZXQgLyB0aW1lb3V0KSBzaG91bGQgbm90IHNpbGVudGx5IGRyb3AgdGhlXG4gKiByb3cgb24gdGhlIGZpcnN0IGF0dGVtcHQuIEVhY2ggZW1pc3Npb24gY2FycmllcyBhIHN0YWJsZSBwZXItZXZlbnRcbiAqIGBJZGVtcG90ZW5jeS1LZXlgIChzZWUgYHJlY29yZGApLCBzbyB0aGUgaHR0cC1jbGllbnQgdHJlYXRzIHRoZSBQT1NUIGFzXG4gKiByZXRyeS1zYWZlIGFuZCB0aGUgcGxhdGZvcm0gY2FuIGRlZHVwIGEgcmV0cmllZCBkZWxpdmVyeSBpbnN0ZWFkIG9mIHdyaXRpbmcgYVxuICogZHVwbGljYXRlIHJvdy4gQnVkZ2V0IGlzIGtlcHQgc21hbGwgc28gYSBoYXJkLWRvd24gcGxhdGZvcm0gY2FuJ3QgYmFjayB0aGVcbiAqIHdvcmtlciB1cCBmb3IgbG9uZzogYmFzZSBkZWxheSDDlygyIHJldHJpZXMpICsgYSBjb3VwbGUgb2YgNDI5IGJhY2tvZmZzLlxuICovXG5jb25zdCBBVURJVF9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDIsXG4gIG1heFJldHJpZXM6IDIsXG59O1xuXG4vKipcbiAqIFRoZSBleGFjdCBzZXQgb2YgYXVkaXQgYWN0aW9ucyBhIE5PTi1QTEFURk9STSAocmVtb3RlKSBzZXJ2aWNlIGlzIHBlcm1pdHRlZCB0b1xuICogZW1pdCB0aHJvdWdoIGBQT1NUIC9hdWRpdC9ldmVudHNgLiBUaGlzIGlzIHRoZSBTSU5HTEUgU09VUkNFIOKAlCBgUmVtb3RlQXVkaXRBY3Rpb25gXG4gKiBpcyBkZXJpdmVkIGZyb20gaXQsIHNvIHRoZSB0eXBlIGFuZCB0aGUgcnVudGltZSBhbGxvdy1saXN0IGNhbiBuZXZlciBkcmlmdC5cbiAqXG4gKiBTRUNVUklUWTogcGxhdGZvcm0ncyBpbmdlc3QgdmFsaWRhdGVzIGBhY3Rpb25gIGFnYWluc3QgdGhpcyBzdWJzZXQgKHZpYVxuICoge0BsaW5rIGlzUmVtb3RlQXVkaXRBY3Rpb259KSwgTk9UIHRoZSBmdWxsIHBsYXRmb3JtIGBBdWRpdEFjdGlvbmAgdW5pb24g4oCUIGFcbiAqIGBzZXJ2aWNlOipgIHRva2VuIG11c3Qgbm90IGJlIGFibGUgdG8gZm9yZ2UgcGxhdGZvcm0tYXV0aG9yaXR5IGV2ZW50c1xuICogKGBhZG1pbi5zdXBlcmFkbWluLmdyYW50YCwgYG9yZy5vd25lcnNoaXAudHJhbnNmZXJgLCBgdXNlci5sb2dpbmAsIOKApikuIEtlZXBcbiAqIHRoaXMgbGlzdCBmcmVlIG9mIGFueSBwbGF0Zm9ybS1vbmx5IGFjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFTU9URV9BVURJVF9BQ1RJT05TID0gW1xuICAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gICdwbHVnaW4uYnVpbGQuZmFpbGVkJyxcbiAgJ3BsdWdpbi5idWlsZC50aW1lb3V0JyxcbiAgLy8gUGx1Z2luIGxpZmVjeWNsZSBtdXRhdGlvbnMgKGFwaS9wbHVnaW4gcm91dGUgaGFuZGxlcnMpIOKAlCB0aGUgZGVzdHJ1Y3RpdmUgL1xuICAvLyBwdWJsaXNoaW5nIHN1cmZhY2UgdGhhdCBidWlsZHMgYWxyZWFkeSBhdWRpdCdzIGNvdW50ZXJwYXJ0OiByZWdpc3RyeSBkZWxldGUsXG4gIC8vIHNvdXJjZSB1cGxvYWQsIGFuZCBkZXBsb3ktdG8tY2x1c3Rlci4gYHRhcmdldElkYCBpcyB0aGUgcGx1Z2luIGlkLlxuICAncGx1Z2luLmRlbGV0ZScsXG4gICdwbHVnaW4udXBsb2FkJyxcbiAgJ3BsdWdpbi5kZXBsb3knLFxuICAvLyBQbHVnaW4gYnVsayBtdXRhdGlvbnMgKGFwaS9wbHVnaW4gYnVsay1wbHVnaW4gcm91dGUpICsgRExRIHB1cmdlIChkcm9wcyBhbGxcbiAgLy8gZGVhZC1sZXR0ZXJlZCBidWlsZCBqb2JzLCBjcm9zcy1vcmcsIHN5c2FkbWluKS4gYGRldGFpbHNgIGNhcnJpZXMgY291bnRzLlxuICAncGx1Z2luLmJ1bGsudXBkYXRlJyxcbiAgJ3BsdWdpbi5idWxrLmRlbGV0ZScsXG4gICdwbHVnaW4uZGxxLnB1cmdlJyxcbiAgLy8gUGlwZWxpbmUgbXV0YXRpb25zIOKAlCBlbWl0dGVkIGJ5IGFwaS9waXBlbGluZSdzIHJvdXRlIGhhbmRsZXJzXG4gIC8vIChjcmVhdGUvdXBkYXRlL2RlbGV0ZSArIENvZGVQaXBlbGluZSBleGVjdXRpb24gdHJpZ2dlci9jYW5jZWwpIGFuZFxuICAvLyBwb3N0ZWQgdG8gcGxhdGZvcm0ncyBgUE9TVCAvYXVkaXQvZXZlbnRzYCBpbmdlc3QuXG4gICdwaXBlbGluZS5jcmVhdGUnLFxuICAncGlwZWxpbmUudXBkYXRlJyxcbiAgJ3BpcGVsaW5lLmRlbGV0ZScsXG4gICdwaXBlbGluZS5leGVjdXRpb24uc3RhcnQnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLmNhbmNlbCcsXG4gIC8vIENvZGVQaXBlbGluZSBBUk4tcmVnaXN0cnkgY29uZmlnIChhcGkvcGlwZWxpbmUgcmVnaXN0cnkgcm91dGUpIOKAlCByZWdpc3RlcmluZyAvXG4gIC8vIGRlcmVnaXN0ZXJpbmcgdGhlIGV4dGVybmFsIENvZGVQaXBlbGluZSB0aGF0IGJhY2tzIGEgcGlwZWxpbmUgKGRlcGxveS1hZmZlY3RpbmcpLlxuICAncGlwZWxpbmUucmVnaXN0cnkucmVnaXN0ZXInLFxuICAncGlwZWxpbmUucmVnaXN0cnkuZGVyZWdpc3RlcicsXG4gIC8vIFF1b3RhIGFkbWluaXN0cmF0aW9uIChhcGkvcXVvdGEpIOKAlCBhIHN1cGVyYWRtaW4gcmVzZXR0aW5nIGFuIG9yZydzIHVzYWdlXG4gIC8vIGNvdW50ZXIgb3IgZWRpdGluZyBpdHMgdGllciBsaW1pdHMuIGBhZmZlY3RlZE9yZ0lkYCBpcyB0aGUgb3JnIGNoYW5nZWQ7XG4gIC8vIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSBxdW90YVR5cGUgKyBvbGQvbmV3IHZhbHVlLlxuICAncXVvdGEucmVzZXQnLFxuICAncXVvdGEubGltaXQudXBkYXRlJyxcbiAgLy8gQSBzdXBlcmFkbWluIGRlbGV0aW5nIGFuIG9yZydzIGVudGlyZSBxdW90YSBkb2N1bWVudC5cbiAgJ3F1b3RhLmRlbGV0ZScsXG4gIC8vIENvbXBsaWFuY2UgYWRtaW5pc3RyYXRpb24gKGFwaS9jb21wbGlhbmNlKSDigJQgdGhlIGVuZm9yY2VtZW50LXBvc3R1cmUgc3VyZmFjZS5cbiAgLy8gQXBwcm92aW5nL3Jldm9raW5nIGFuIGV4ZW1wdGlvbiwgdG9nZ2xpbmcvYXV0aG9yaW5nL2RlbGV0aW5nIGEgcnVsZSxcbiAgLy8gYXV0aG9yaW5nL2RlbGV0aW5nIGEgcG9saWN5LCBtYW5hZ2luZyBzY2FuIHNjaGVkdWxlcywgYXBwbHlpbmcgYSB0ZW1wbGF0ZSxcbiAgLy8gb3IgY2FuY2VsbGluZyBhIHJ1bm5pbmcgc2Nhbi4gYHRhcmdldElkYCBpcyB0aGUgcnVsZS9wb2xpY3kvZXhlbXB0aW9uL3NjYW4gaWQuXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5hcHByb3ZlJyxcbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLnJldm9rZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudG9nZ2xlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UudGVtcGxhdGUuYXBwbHknLFxuICAnY29tcGxpYW5jZS5zY2FuLmNhbmNlbCcsXG4gIC8vIEltYWdlLXJlZ2lzdHJ5IGRlc3RydWN0aXZlIG9wcyAoYXBpL2ltYWdlLXJlZ2lzdHJ5KSDigJQgZ2FyYmFnZS1jb2xsZWN0aW9uXG4gIC8vIHN3ZWVwcyBhbmQgZXhwbGljaXQgaW1hZ2UvdGFnIGRlbGV0ZXMgKHByZXZpb3VzbHkgb25seSBhIGxvZyBsaW5lKS5cbiAgJ3JlZ2lzdHJ5LmdjJyxcbiAgJ3JlZ2lzdHJ5LmltYWdlLmRlbGV0ZScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAvLyBCaWxsaW5nIChhcGkvYmlsbGluZykg4oCUIHN1YnNjcmlwdGlvbiArIGVudGl0bGVtZW50IG11dGF0aW9ucywgbWlycm9yZWQgdG8gdGhlXG4gIC8vIGNlbnRyYWwgYXVkaXQgdHJhaWwgKHRoZXNlIGFsc28gd3JpdGUgdG8gdGhlIHNlcnZpY2UtbG9jYWwgYmlsbGluZ19ldmVudHNcbiAgLy8gY29sbGVjdGlvbikuIGBkZXRhaWxzYCBjYXJyeSBwbGFuL3RpZXIvYWRkb24gaWRzIG9ubHkg4oCUIG5ldmVyIGNhcmQvcGF5bWVudFxuICAvLyBzZWNyZXRzIG9yIGFuIEFXUyBhY2NvdW50IGlkLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY2FuY2VsJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmRlbGV0ZScsXG4gICdiaWxsaW5nLnRpZXIub3ZlcnJpZGUnLFxuICAnYmlsbGluZy5hZGRvbi5hZGQnLFxuICAnYmlsbGluZy5hZGRvbi5yZW1vdmUnLFxuICAvLyBTeXN0ZW0taW5pdGlhdGVkIHJlbW92YWwgb2YgYSB0aWVyLWluY2x1ZGVkIGFkZC1vbiBvbiBhIHBsYW4gdXBncmFkZSAodGhlXG4gIC8vIGFjY291bnQncyBuZXcgdGllciBub3cgYnVuZGxlcyB0aGUgZmVhdHVyZSkg4oCUIGRpc3RpbmN0IGZyb20gYSB1c2VyLWluaXRpYXRlZFxuICAvLyBgcmVtb3ZlYCBzbyBmaW5hbmNlIGNhbiB0ZWxsIGFuIGF1dG8tcHJ1bmUgZnJvbSBhIGN1c3RvbWVyIGFjdGlvbi5cbiAgJ2JpbGxpbmcuYWRkb24ucHJ1bmUnLFxuICAvLyBEaXNjb3VudHMgKGRvY3MvYmlsbGluZy1kaXNjb3VudHMubWQpIOKAlCBtaW50L2lzc3VlL2FwcGx5L3JlbW92ZS9yZXZva2Ugb2YgYVxuICAvLyBwcmljZSBjb3Vwb24gb3IgdXNhZ2UgY3JlZGl0LiBgZGV0YWlsc2AgY2FycnkgdGhlIGRpc2NvdW50IGlkICsga2luZC92YWx1ZVxuICAvLyBvbmx5LCBuZXZlciB0aGUgb3BhcXVlIHRva2VuIG9yIHNpZ25pbmcga2V5LlxuICAnYmlsbGluZy5kaXNjb3VudC5nZW5lcmF0ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50Lmlzc3VlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQuYXBwbHknLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZW1vdmUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZXZva2UnLFxuICAvLyBQcm9tb3Rpb25zIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kI3Byb21vdGlvbnMpIOKAlCBydWxlLWRyaXZlbiBhdXRvLWdyYW50XG4gIC8vIGNhbXBhaWducy4gYGRldGFpbHNgIGNhcnJ5IHRoZSBwcm9tb3Rpb24gaWQgKyBjZW50cy9ldmVudCBvbmx5LlxuICAnYmlsbGluZy5wcm9tb3Rpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi5yZXZva2UnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uZ3JhbnQnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uYWN0aXZhdGUnLFxuICAvLyBVc2FnZS1jcmVkaXQgcmVhbGl6YXRpb24g4oCUIGEgY3VzdG9tZXIvY29tcGxpYW5jZS12aXNpYmxlIHJlY29yZCBvZiBjcmVkaXRcbiAgLy8gbW92ZW1lbnQ6IGBjb25zdW1lZGAgKE1hcmtldHBsYWNlIG1ldGVyZWQgZHJhd2Rvd24pLCBgZXhoYXVzdGVkYCAoYmFsYW5jZSBoaXRcbiAgLy8gemVybyksIGFuZCBhIGNvbWJvIGVuZGluZy4gYGRldGFpbHNgIGNhcnJ5IGNlbnRzL2lkcyBvbmx5LCBubyBwYXltZW50IHNlY3JldHMuXG4gICdiaWxsaW5nLmNyZWRpdC5jb25zdW1lZCcsXG4gICdiaWxsaW5nLmNyZWRpdC5leGhhdXN0ZWQnLFxuICAnYmlsbGluZy5jb21iby5leHBpcmVkJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlbW90ZUF1ZGl0QWN0aW9uID0gdHlwZW9mIFJFTU9URV9BVURJVF9BQ1RJT05TW251bWJlcl07XG5cbi8qKiBXaGV0aGVyIGB2YWx1ZWAgaXMgYW4gYWN0aW9uIGEgcmVtb3RlIHNlcnZpY2UgbWF5IGVtaXQgKHRoZSBpbmdlc3QgYWxsb3ctbGlzdCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZW1vdGVBdWRpdEFjdGlvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUmVtb3RlQXVkaXRBY3Rpb24ge1xuICByZXR1cm4gKFJFTU9URV9BVURJVF9BQ1RJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRFdmVudCB7XG4gIGFjdGlvbjogUmVtb3RlQXVkaXRBY3Rpb247XG4gIGFjdG9ySWQ6IHN0cmluZztcbiAgYWN0b3JFbWFpbD86IHN0cmluZztcbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIGFmZmVjdGVkT3JnSWQ/OiBzdHJpbmc7XG4gIHRhcmdldFR5cGU/OiBzdHJpbmc7XG4gIHRhcmdldElkPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlkIHRoZSBhdWRpdGVkIGFjdGlvbiBzdWNjZWVkIG9yIGZhaWw/IERlZmF1bHRzIHRvICdzdWNjZXNzJyB3aGVuIG9taXR0ZWRcbiAgICogKHRoZSBwbGF0Zm9ybSBpbmdlc3QgYXBwbGllcyB0aGUgc2FtZSBkZWZhdWx0KS4gRGVuaWVkLWF1dGh6IGV2ZW50cyBzZXRcbiAgICogJ2ZhaWx1cmUnIHNvIGEgcmV2aWV3ZXIgY2FuIGZpbHRlciBhdHRlbXB0cyBmcm9tIGNvbXBsZXRlZCBhY3Rpb25zLlxuICAgKi9cbiAgb3V0Y29tZT86ICdzdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIGF1ZGl0ZWQgYWN0aW9uIGFjdHVhbGx5IE9DQ1VSUkVEIChJU08tODYwMSksIHN0YW1wZWQgYXQgZW1pc3Npb24uXG4gICAqIFRoZSBwbGF0Zm9ybSBzdG9yZXMgdGhpcyBmb3IgcmV2aWV3ZXJzOyBpdCBpcyBOT1QgdGhlIGNoYWluLW9yZGVyaW5nIGZpZWxkXG4gICAqICh0aGUgdGFtcGVyLWV2aWRlbnQgY2hhaW4gb3JkZXJzIGJ5IGluZ2VzdC9gY3JlYXRlZEF0YCkuIEl0IG1hdHRlcnMgZm9yXG4gICAqIFNQT09MRUQgZXZlbnRzOiBvbmUgYnVmZmVyZWQgZHVyaW5nIGEgcGxhdGZvcm0gb3V0YWdlIGlzIHJlLWRlbGl2ZXJlZCDigJQgYW5kXG4gICAqIHNvIGNoYWluZWQg4oCUIGxhdGVyLCBidXQgYG9jY3VycmVkQXRgIHByZXNlcnZlcyB3aGVuIGl0IHJlYWxseSBoYXBwZW5lZC5cbiAgICovXG4gIG9jY3VycmVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdGFibGUgcGVyLWVtaXNzaW9uIGRlZHVwIGtleSAoYWxzbyBzZW50IGFzIHRoZSBgSWRlbXBvdGVuY3ktS2V5YCBoZWFkZXIgdGhlXG4gICAqIHBsYXRmb3JtIGluZ2VzdCBkZWR1cHMgb24pLiBTdGFtcGVkIGJ5IGByZWNvcmQoKWAgYW5kIGNhcnJpZWQgb24gdGhlIHNwb29sZWRcbiAgICogY29weSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIGxhdGVyIHJlLWRlbGl2ZXJ5IGNvbGxhcHNlIHRvIE9ORSBzdG9yZWQgcm93LlxuICAgKi9cbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDbGllbnQgZm9yIFBPU1RpbmcgYXVkaXQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGAvYXVkaXQtZXZlbnRzYCBpbmdlc3RcbiAqIGVuZHBvaW50LiBNaW50cyBhIGZyZXNoIHNlcnZpY2UgdG9rZW4gcGVyIGNhbGwgKDUgbWluIFRUTCkgIHRoZXJlJ3Mgbm9cbiAqIG1lYW5pbmdmdWwgY2FjaGluZyBiZW5lZml0IHdoZW4gZW1pc3Npb25zIGFyZSBzcGFyc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnQge1xuICAvKipcbiAgICogRmlyZS1hbmQtZm9yZ2V0IGF1ZGl0IGVtaXNzaW9uLiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IHdhcm4gbGV2ZWwgYnV0XG4gICAqIG5ldmVyIHRocm93biAgdGhlIG9yaWdpbmF0aW5nIGFjdGlvbiAoZS5nLiBhIHBsdWdpbiBidWlsZCkgaGFzIGl0c1xuICAgKiBvd24gc3VjY2Vzcy9mYWlsdXJlIHBhdGggdGhhdCBzaG91bGRuJ3QgZ2V0IHBvbGx1dGVkIGJ5IGEgZmxha3kgYXVkaXRcbiAgICogZG93bnN0cmVhbS4gV2hlbiBhIHtAbGluayBBdWRpdFNwb29sfSBpcyBjb25maWd1cmVkLCBhbiBlbWlzc2lvbiB0aGF0XG4gICAqIGV4aGF1c3RzIGl0cyBsaXZlIHJldHJpZXMgaXMgYnVmZmVyZWQgYW5kIHJlLWRlbGl2ZXJlZCBsYXRlciBpbnN0ZWFkIG9mXG4gICAqIGJlaW5nIGRyb3BwZWQuXG4gICAqL1xuICByZWNvcmQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogU3RvcCB0aGUgYmFja2dyb3VuZCBzcG9vbC1kcmFpbiB0aW1lciAoaWYgYW55KS4gU2FmZSB0byBjYWxsIHJlcGVhdGVkbHkuICovXG4gIGNsb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZSBhdWRpdCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnRDb25maWcge1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9IT1NUIG9yICdwbGF0Zm9ybScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBQTEFURk9STV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBtcyAoZGVmYXVsdCAzMDAwICBhdWRpdCBzaG91bGRuJ3QgYmxvY2sgdGhlIHdvcmtlcikuICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkdXJhYmxlIGJ1ZmZlci4gV2hlbiBzZXQsIGFuIGVtaXNzaW9uIHRoYXQgZXhoYXVzdHMgaXRzIGxpdmUgcmV0cnlcbiAgICogYnVkZ2V0IChzdXN0YWluZWQgcGxhdGZvcm0gb3V0YWdlKSBpcyBzcG9vbGVkIGFuZCByZS1kZWxpdmVyZWQg4oCUIG9uIHRoZSBuZXh0XG4gICAqIHN1Y2Nlc3NmdWwgZW1pc3Npb24gYW5kIG9uIGEgcGVyaW9kaWMgdGltZXIg4oCUIGluc3RlYWQgb2YgYmVpbmcgbG9zdC5cbiAgICovXG4gIHNwb29sPzogQXVkaXRTcG9vbDtcbiAgLyoqIFNwb29sLWRyYWluIGludGVydmFsIG1zIChkZWZhdWx0IDMwXzAwMCkuIE9ubHkgdXNlZCB3aGVuIGBzcG9vbGAgaXMgc2V0LiAqL1xuICBkcmFpbkludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBNYXggZW50cmllcyBkcmFpbmVkIHBlciBzd2VlcCAoZGVmYXVsdCAxMDApLiAqL1xuICBkcmFpbkJhdGNoU2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSByZW1vdGUtYXVkaXQgY2xpZW50IHRhcmdldGVkIGF0IHRoZSBwbGF0Zm9ybSBzZXJ2aWNlLlxuICpcbiAqIFVzZWQgYnkgYXBpL3BsdWdpbidzIGJ1aWxkIHdvcmtlciB0byBwdXNoIGBwbHVnaW4uYnVpbGQuKmAgZXZlbnRzIGludG9cbiAqIHRoZSBwbGF0Zm9ybSdzIE1vbmdvREIgYGF1ZGl0X2V2ZW50c2AgY29sbGVjdGlvbi4gT3RoZXIgc2VydmljZXNcbiAqIHdpdGggd29ya2VyLXN0eWxlIGVtaXR0ZXJzIGNhbiB1c2UgdGhlIHNhbWUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhdWRpdENsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KCk7XG4gKiBhdWRpdENsaWVudC5yZWNvcmQoe1xuICogYWN0aW9uOiAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gKiBhY3RvcklkOiAndXNlci0xMjMnLFxuICogb3JnSWQ6ICdvcmctYWNtZScsXG4gKiB0YXJnZXRUeXBlOiAncGx1Z2luJyxcbiAqIHRhcmdldElkOiAncGx1Z2luLWFiYycsXG4gKiBkZXRhaWxzOiB7IG5hbWU6ICdteS1wbHVnaW4nLCB2ZXJzaW9uOiAnMS4wLjAnIH0sXG4gKiB9LCAncGx1Z2luJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX0hPU1QgPz8gJ3BsYXRmb3JtJyxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBwYXJzZUludChwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX1BPUlQgPz8gJzMwMDAnLCAxMCksXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMzAwMCxcbiAgfTtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcbiAgY29uc3Qgc3Bvb2wgPSBjb25maWcuc3Bvb2w7XG4gIGNvbnN0IGRyYWluQmF0Y2hTaXplID0gY29uZmlnLmRyYWluQmF0Y2hTaXplID8/IDEwMDtcblxuICAvKipcbiAgICogQXR0ZW1wdCBPTkUgbGl2ZSBkZWxpdmVyeS4gUmVzb2x2ZXMgYHRydWVgIG9uIGEgMnh4IGFjY2VwdCwgYGZhbHNlYCBvbiBhbnlcbiAgICogbm9uLTJ4eCAvIHRocm93biBlcnJvciAodGhlIGh0dHAtY2xpZW50IGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlIHJldHJ5XG4gICAqIGJ1ZGdldCkuIEEgc3RhYmxlIHBlci1lbWlzc2lvbiBgSWRlbXBvdGVuY3ktS2V5YCBtYWtlcyB0aGlzIG5vbi1pZGVtcG90ZW50XG4gICAqIFBPU1QgcmV0cnktc2FmZSBhbmQgbGV0cyB0aGUgcGxhdGZvcm0gaW5nZXN0IGRlZHVwIGEgcmUtZGVsaXZlcmVkIGV2ZW50XG4gICAqIGluc3RlYWQgb2Ygd3JpdGluZyBhIGR1cGxpY2F0ZSBhdWRpdCByb3cgKGFuZCBkdXBsaWNhdGUgY2hhaW4gbGluaykuXG4gICAqIGBJZGVtcG90ZW5jeS1LZXlgIGlzIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnQgc28gYSBTUE9PTEVEIHJlLWRlbGl2ZXJ5IHJldXNlc1xuICAgKiB0aGUgc2FtZSBrZXkgYXMgaXRzIG9yaWdpbmFsIGxpdmUgYXR0ZW1wdCDigJQgdGhlIHR3byBjb2xsYXBzZSB0byBvbmUgcm93LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVsaXZlcihldmVudDogUmVtb3RlQXVkaXRFdmVudCwgc2VydmljZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7IHNlcnZpY2VOYW1lLCBvcmdJZDogZXZlbnQub3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGF1dGhIZWFkZXIsXG4gICAgICAnSWRlbXBvdGVuY3ktS2V5JzogZXZlbnQuaWRlbXBvdGVuY3lLZXkgPz8gcmFuZG9tVVVJRCgpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy9hdWRpdC9ldmVudHMnLCBldmVudCwgeyBoZWFkZXJzLCAuLi5BVURJVF9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgICBjb25zdCBvayA9ICEhcmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDMwMDtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3Qgbm9uLW9rJywgeyBhY3Rpb246IGV2ZW50LmFjdGlvbiwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2s7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignUmVtb3RlIGF1ZGl0IGluZ2VzdCB0aHJldycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGZhaWxlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgbGV0IHBsYXRmb3JtRG93biA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhdGNoKSB7XG4gICAgICAgICAgaWYgKHBsYXRmb3JtRG93bikgeyBmYWlsZWQucHVzaChlbnRyeSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBkZWxpdmVyKGVudHJ5LmV2ZW50LCBlbnRyeS5zZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfcmVkZWxpdmVyZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbGF0Zm9ybURvd24gPSB0cnVlO1xuICAgICAgICAgICAgZmFpbGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCBzcG9vbC5yZXF1ZXVlKGZhaWxlZCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBzdGlsbCBkb3duIOKAlCB0cnkgYWdhaW4gb24gdGhlIG5leHQgdGlja1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZHJhaW4gZmFpbGVkJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBkcmFpblRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIGlmIChzcG9vbCkge1xuICAgIGRyYWluVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IHZvaWQgZHJhaW4oKTsgfSwgY29uZmlnLmRyYWluSW50ZXJ2YWxNcyA/PyAzMF8wMDApO1xuICAgIC8vIERvbid0IGxldCB0aGUgZHJhaW4gdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBzaHV0ZG93bi5cbiAgICAoZHJhaW5UaW1lciBhcyB1bmtub3duIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgLy8gU3RhbXAgd2hlbiB0aGUgYWN0aW9uIGFjdHVhbGx5IG9jY3VycmVkIChzdXJ2aXZlcyBzcG9vbCBkZWxheSkgYW5kIHBpbiBhXG4gICAgICAvLyBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgc3Bvb2xlZCByZXRyeSBkZWR1cC5cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFJlbW90ZUF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBvY2N1cnJlZEF0OiBldmVudC5vY2N1cnJlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICB2b2lkIGRlbGl2ZXIoc3RhbXBlZCwgc2VydmljZU5hbWUpLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9lbWl0dGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgb3V0Y29tZTogc3RhbXBlZC5vdXRjb21lID8/ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICBpZiAoc3Bvb2wpIHZvaWQgZHJhaW4oKTsgLy8gcGxhdGZvcm0gaXMgcmVhY2hhYmxlIOKAlCBmbHVzaCBhbnkgYmFja2xvZ1xuICAgICAgICB9IGVsc2UgaWYgKHNwb29sKSB7XG4gICAgICAgICAgdm9pZCBzcG9vbC5lbnF1ZXVlKHsgZXZlbnQ6IHN0YW1wZWQsIHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9zZSgpIHtcbiAgICAgIGlmIChkcmFpblRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoZHJhaW5UaW1lcik7IGRyYWluVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBzdGFuZGFyZCBgYXV0aHouZGVuaWVkYCBzaW5rIHVzZWQgYnkgZXZlcnkgcmVtb3RlLWF1ZGl0IHNlcnZpY2VcbiAqIChwaXBlbGluZSwgcGx1Z2luLCBjb21wbGlhbmNlLCBxdW90YSwgbWVzc2FnZSwgYmlsbGluZywgcmVwb3J0aW5nLCDigKYpLlxuICpcbiAqIFRoZSBzaGFyZWQgYHJlcXVpcmVBdXRoYCBnYXRlIGZvcndhcmRzIGVhY2ggREVOSUVEIHN0YXRlLWNoYW5naW5nIHJlcXVlc3QgdG9cbiAqIHRoZSBhdWRpdG9yIHNldCB2aWEge0BsaW5rIHNldEF1dGh6RGVuaWFsQXVkaXRvcn07IHRoaXMgd2lyZXMgdGhhdCBob29rIHRvIHRoZVxuICogc2VydmljZSdzIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH0sIGZvcndhcmRpbmcgYSBgZmFpbHVyZWAtb3V0Y29tZVxuICogYGF1dGh6LmRlbmllZGAgZXZlbnQgc28gcHJvYmluZyAvIHByaXZpbGVnZS1lc2NhbGF0aW9uIGF0dGVtcHRzIGxlYXZlIGEgdHJhaWwuXG4gKiBFbWlzc2lvbiBpcyBmaXJlLWFuZC1mb3JnZXQgKHRoZSBjbGllbnQgbmV2ZXIgdGhyb3dzKS4gYGdldENsaWVudGAgaXMgYSBnZXR0ZXJcbiAqIHNvIHRoZSBjbGllbnQgc3RheXMgbGF6aWx5IGNvbnN0cnVjdGVkIChzZXJ2aWNlcyBtZW1vaXplIGl0IG9uIGZpcnN0IHVzZSkuXG4gKlxuICogUGxhdGZvcm0gaXMgaW50ZW50aW9uYWxseSBOT1QgYSBjYWxsZXIg4oCUIGl0IGlzIHRoZSBhdWRpdCBhdXRob3JpdHkgYW5kIHdyaXRlc1xuICogYGF1dGh6LmRlbmllZGAgc3RyYWlnaHQgdG8gaXRzIGxvY2FsIHN0b3JlICh3aXRoIGBhZmZlY3RlZE9yZ0lkYCksIG5vdCB0aHJvdWdoXG4gKiBhIFJlbW90ZUF1ZGl0Q2xpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZUF1dGh6RGVuaWFsQXVkaXRvcihzZXJ2aWNlTmFtZTogc3RyaW5nLCBnZXRDbGllbnQ6ICgpID0+IFJlbW90ZUF1ZGl0Q2xpZW50KTogdm9pZCB7XG4gIHNldEF1dGh6RGVuaWFsQXVkaXRvcigoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiBnZXRDbGllbnQoKS5yZWNvcmQoe1xuICAgIGFjdGlvbjogJ2F1dGh6LmRlbmllZCcsXG4gICAgYWN0b3JJZDogaW5mby5hY3RvcklkID8/ICdhbm9ueW1vdXMnLFxuICAgIGFjdG9yRW1haWw6IGluZm8uYWN0b3JFbWFpbCxcbiAgICBvcmdJZDogaW5mby5vcmdJZCxcbiAgICBvdXRjb21lOiAnZmFpbHVyZScsXG4gICAgZGV0YWlsczogeyBtZXRob2Q6IGluZm8ubWV0aG9kLCBwYXRoOiBpbmZvLnBhdGgsIHJlcXVpcmVkOiBpbmZvLnJlcXVpcmVkIH0sXG4gIH0sIHNlcnZpY2VOYW1lKSk7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlLXNjb3BlZCBhdWRpdCBjbGllbnQ6IGEgZHVyYWJsZS1zcG9vbC1iYWNrZWQge0BsaW5rIFJlbW90ZUF1ZGl0Q2xpZW50fVxuICogd2l0aCB0aGUgc2VydmljZSBuYW1lIHByZS1ib3VuZCBmb3IgZW1pc3Npb24uIFJlcGxhY2VzIHRoZSBwZXItc2VydmljZVxuICogYm9pbGVycGxhdGUgb2YgYGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgc3Bvb2w6IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZCB9KWBcbiAqIHBsdXMgYSBoYW5kLXJvbGxlZCBgZW1pdDxTZXJ2aWNlPkF1ZGl0YCB3cmFwcGVyIHRoYXQgcmVwZWF0cyB0aGUgc2VydmljZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIC8qKiBFbWl0IGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIHNlcnZpY2UgbmFtZSBib3VuZC4gRmlyZS1hbmQtZm9yZ2V0LiAqL1xuICBlbWl0KGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KTogdm9pZDtcbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHJlbW90ZSBjbGllbnQg4oCUIGZvciBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmAgKyBgY2xvc2UoKWAuICovXG4gIHJlYWRvbmx5IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBzZXJ2aWNlJ3MgYXVkaXQgY2xpZW50OiBhIFJlbW90ZUF1ZGl0Q2xpZW50IHdpcmVkIHRvIHRoZSBkdXJhYmxlIFJlZGlzXG4gKiBzcG9vbCAoZnJvbSBhbWJpZW50IGVudjsgbnVsbCDihpIgbm8gc3Bvb2wpIHdpdGggYHNlcnZpY2VOYW1lYCBib3VuZC4gQ29uc3RydWN0XG4gKiBPTkNFIHBlciBwcm9jZXNzIOKAlCBtZW1vaXplIGJlaGluZCBhIGxhenkgYGdldEF1ZGl0Q2xpZW50KClgIGluIHRoZSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AuIFBhc3MgYGNvbmZpZy5zcG9vbGAgdG8gb3ZlcnJpZGUgdGhlIGVudi1kZXJpdmVkIHNwb29sXG4gKiAoZS5nLiByZXVzZSBhIHNlcnZpY2UncyBleGlzdGluZyBpb3JlZGlzIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sID8/IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoeyAuLi5jb25maWcsIHNwb29sIH0pO1xuICByZXR1cm4ge1xuICAgIGVtaXQ6IChldmVudCkgPT4gY2xpZW50LnJlY29yZChldmVudCwgc2VydmljZU5hbWUpLFxuICAgIGNsaWVudCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMYXppbHktY29uc3RydWN0ZWQgcmVtb3RlLWF1ZGl0IGFjY2Vzc29yIGZvciBhIHNlcnZpY2UuIEV2ZXJ5IHNlcnZpY2Unc1xuICogYHNlcnZpY2VzL2F1ZGl0LnRzYCB1c2VkIHRvIGhhbmQtcm9sbCB0aGUgc2FtZSBtb2R1bGUgc2luZ2xldG9uIChhIGBsZXQgYXVkaXRgXG4gKiArIGBzdmMoKWAgdGhhdCBidWlsZHMgYSB7QGxpbmsgU2VydmljZUF1ZGl0Q2xpZW50fSBvbiBmaXJzdCB1c2UsIHRoZW4gYVxuICogYGdldEF1ZGl0Q2xpZW50KClgIHJldHVybmluZyBgLmNsaWVudGAgYW5kIGFuIGBlbWl0KGV2ZW50KWAgZm9yd2FyZGluZyB0b1xuICogYC5lbWl0YCkuIFRoaXMgcGFja2FnZXMgdGhhdCBwYXR0ZXJuIGluIE9ORSBwbGFjZSBzbyBlYWNoIHNlcnZpY2UncyBhdWRpdFxuICogd2lyaW5nIGlzIGEgb25lLWxpbmVyIGFuZCBjYW4ndCBkcmlmdC5cbiAqXG4gKiBMYXp5IG9uIHB1cnBvc2U6IHRoZSB1bmRlcmx5aW5nIGNsaWVudCB3aXJlcyBhbiBlbnYtUmVkaXMgYXVkaXQgc3Bvb2wsIHNvXG4gKiBidWlsZGluZyBpdCBhdCBpbXBvcnQgdGltZSB3b3VsZCBmb3JjZSB0aGF0IGNvbm5lY3Rpb24gd2hlcmV2ZXIgdGhlIG1vZHVsZSBpc1xuICogbWVyZWx5IGltcG9ydGVkIChlLmcuIHRlc3RzKS4gYGdldEF1ZGl0Q2xpZW50YCBpcyBwYXNzZWQgdG9cbiAqIGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYDsgYGVtaXRgIGJhY2tzIHRoZSBwZXItc2VydmljZSBgZW1pdFhBdWRpdGAgaGVscGVycy5cbiAqIEJvdGggc3RheSBGSVJFLUFORC1GT1JHRVQgKHJlY29yZCBuZXZlciB0aHJvd3MgLyBpcyBub3QgYXdhaXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdEFjY2Vzc29yKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB7XG4gIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudDtcbiAgZW1pdDogKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KSA9PiB2b2lkO1xufSB7XG4gIGxldCBhdWRpdDogU2VydmljZUF1ZGl0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHN2YyA9ICgpOiBTZXJ2aWNlQXVkaXRDbGllbnQgPT4ge1xuICAgIGlmICghYXVkaXQpIGF1ZGl0ID0gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lKTtcbiAgICByZXR1cm4gYXVkaXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgZ2V0QXVkaXRDbGllbnQ6ICgpID0+IHN2YygpLmNsaWVudCxcbiAgICBlbWl0OiAoZXZlbnQpID0+IHN2YygpLmVtaXQoZXZlbnQpLFxuICB9O1xufVxuIl19
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMEJBQTBCO0lB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QUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLmNyZWF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS51cGRhdGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5zdGFydCcsXG4gICdwaXBlbGluZS5leGVjdXRpb24uY2FuY2VsJyxcbiAgLy8gQ29kZVBpcGVsaW5lIEFSTi1yZWdpc3RyeSBjb25maWcgKGFwaS9waXBlbGluZSByZWdpc3RyeSByb3V0ZSkg4oCUIHJlZ2lzdGVyaW5nIC9cbiAgLy8gZGVyZWdpc3RlcmluZyB0aGUgZXh0ZXJuYWwgQ29kZVBpcGVsaW5lIHRoYXQgYmFja3MgYSBwaXBlbGluZSAoZGVwbG95LWFmZmVjdGluZykuXG4gICdwaXBlbGluZS5yZWdpc3RyeS5yZWdpc3RlcicsXG4gICdwaXBlbGluZS5yZWdpc3RyeS5kZXJlZ2lzdGVyJyxcbiAgLy8gUXVvdGEgYWRtaW5pc3RyYXRpb24gKGFwaS9xdW90YSkg4oCUIGEgc3VwZXJhZG1pbiByZXNldHRpbmcgYW4gb3JnJ3MgdXNhZ2VcbiAgLy8gY291bnRlciBvciBlZGl0aW5nIGl0cyB0aWVyIGxpbWl0cy4gYGFmZmVjdGVkT3JnSWRgIGlzIHRoZSBvcmcgY2hhbmdlZDtcbiAgLy8gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHF1b3RhVHlwZSArIG9sZC9uZXcgdmFsdWUuXG4gICdxdW90YS5yZXNldCcsXG4gICdxdW90YS5saW1pdC51cGRhdGUnLFxuICAvLyBBIHN1cGVyYWRtaW4gZGVsZXRpbmcgYW4gb3JnJ3MgZW50aXJlIHF1b3RhIGRvY3VtZW50LlxuICAncXVvdGEuZGVsZXRlJyxcbiAgLy8gQ29tcGxpYW5jZSBhZG1pbmlzdHJhdGlvbiAoYXBpL2NvbXBsaWFuY2UpIOKAlCB0aGUgZW5mb3JjZW1lbnQtcG9zdHVyZSBzdXJmYWNlLlxuICAvLyBBcHByb3ZpbmcvcmV2b2tpbmcgYW4gZXhlbXB0aW9uLCB0b2dnbGluZy9hdXRob3JpbmcvZGVsZXRpbmcgYSBydWxlLFxuICAvLyBhdXRob3JpbmcvZGVsZXRpbmcgYSBwb2xpY3ksIG1hbmFnaW5nIHNjYW4gc2NoZWR1bGVzLCBhcHBseWluZyBhIHRlbXBsYXRlLFxuICAvLyBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLiBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL3BvbGljeS9leGVtcHRpb24vc2NhbiBpZC5cbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLmFwcHJvdmUnLFxuICAnY29tcGxpYW5jZS5leGVtcHRpb24ucmV2b2tlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS50b2dnbGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAvLyBCaWxsaW5nIChhcGkvYmlsbGluZykg4oCUIHN1YnNjcmlwdGlvbiArIGVudGl0bGVtZW50IG11dGF0aW9ucywgbWlycm9yZWQgdG8gdGhlXG4gIC8vIGNlbnRyYWwgYXVkaXQgdHJhaWwgKHRoZXNlIGFsc28gd3JpdGUgdG8gdGhlIHNlcnZpY2UtbG9jYWwgYmlsbGluZ19ldmVudHNcbiAgLy8gY29sbGVjdGlvbikuIGBkZXRhaWxzYCBjYXJyeSBwbGFuL3RpZXIvYWRkb24gaWRzIG9ubHkg4oCUIG5ldmVyIGNhcmQvcGF5bWVudFxuICAvLyBzZWNyZXRzIG9yIGFuIEFXUyBhY2NvdW50IGlkLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY2FuY2VsJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmRlbGV0ZScsXG4gICdiaWxsaW5nLnRpZXIub3ZlcnJpZGUnLFxuICAnYmlsbGluZy5hZGRvbi5hZGQnLFxuICAnYmlsbGluZy5hZGRvbi5yZW1vdmUnLFxuICAvLyBTeXN0ZW0taW5pdGlhdGVkIHJlbW92YWwgb2YgYSB0aWVyLWluY2x1ZGVkIGFkZC1vbiBvbiBhIHBsYW4gdXBncmFkZSAodGhlXG4gIC8vIGFjY291bnQncyBuZXcgdGllciBub3cgYnVuZGxlcyB0aGUgZmVhdHVyZSkg4oCUIGRpc3RpbmN0IGZyb20gYSB1c2VyLWluaXRpYXRlZFxuICAvLyBgcmVtb3ZlYCBzbyBmaW5hbmNlIGNhbiB0ZWxsIGFuIGF1dG8tcHJ1bmUgZnJvbSBhIGN1c3RvbWVyIGFjdGlvbi5cbiAgJ2JpbGxpbmcuYWRkb24ucHJ1bmUnLFxuICAvLyBEaXNjb3VudHMgKGRvY3MvYmlsbGluZy1kaXNjb3VudHMubWQpIOKAlCBtaW50L2lzc3VlL2FwcGx5L3JlbW92ZS9yZXZva2Ugb2YgYVxuICAvLyBwcmljZSBjb3Vwb24gb3IgdXNhZ2UgY3JlZGl0LiBgZGV0YWlsc2AgY2FycnkgdGhlIGRpc2NvdW50IGlkICsga2luZC92YWx1ZVxuICAvLyBvbmx5LCBuZXZlciB0aGUgb3BhcXVlIHRva2VuIG9yIHNpZ25pbmcga2V5LlxuICAnYmlsbGluZy5kaXNjb3VudC5nZW5lcmF0ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50Lmlzc3VlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQuYXBwbHknLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZW1vdmUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5yZXZva2UnLFxuICAvLyBQcm9tb3Rpb25zIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kI3Byb21vdGlvbnMpIOKAlCBydWxlLWRyaXZlbiBhdXRvLWdyYW50XG4gIC8vIGNhbXBhaWducy4gYGRldGFpbHNgIGNhcnJ5IHRoZSBwcm9tb3Rpb24gaWQgKyBjZW50cy9ldmVudCBvbmx5LlxuICAnYmlsbGluZy5wcm9tb3Rpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi5yZXZva2UnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uZ3JhbnQnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24uYWN0aXZhdGUnLFxuICAvLyBVc2FnZS1jcmVkaXQgcmVhbGl6YXRpb24g4oCUIGEgY3VzdG9tZXIvY29tcGxpYW5jZS12aXNpYmxlIHJlY29yZCBvZiBjcmVkaXRcbiAgLy8gbW92ZW1lbnQ6IGBjb25zdW1lZGAgKE1hcmtldHBsYWNlIG1ldGVyZWQgZHJhd2Rvd24pLCBgZXhoYXVzdGVkYCAoYmFsYW5jZSBoaXRcbiAgLy8gemVybyksIGFuZCBhIGNvbWJvIGVuZGluZy4gYGRldGFpbHNgIGNhcnJ5IGNlbnRzL2lkcyBvbmx5LCBubyBwYXltZW50IHNlY3JldHMuXG4gICdiaWxsaW5nLmNyZWRpdC5jb25zdW1lZCcsXG4gICdiaWxsaW5nLmNyZWRpdC5leGhhdXN0ZWQnLFxuICAnYmlsbGluZy5jb21iby5leHBpcmVkJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlbW90ZUF1ZGl0QWN0aW9uID0gdHlwZW9mIFJFTU9URV9BVURJVF9BQ1RJT05TW251bWJlcl07XG5cbi8qKiBXaGV0aGVyIGB2YWx1ZWAgaXMgYW4gYWN0aW9uIGEgcmVtb3RlIHNlcnZpY2UgbWF5IGVtaXQgKHRoZSBpbmdlc3QgYWxsb3ctbGlzdCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZW1vdGVBdWRpdEFjdGlvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUmVtb3RlQXVkaXRBY3Rpb24ge1xuICByZXR1cm4gKFJFTU9URV9BVURJVF9BQ1RJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRFdmVudCB7XG4gIGFjdGlvbjogUmVtb3RlQXVkaXRBY3Rpb247XG4gIGFjdG9ySWQ6IHN0cmluZztcbiAgYWN0b3JFbWFpbD86IHN0cmluZztcbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIGFmZmVjdGVkT3JnSWQ/OiBzdHJpbmc7XG4gIHRhcmdldFR5cGU/OiBzdHJpbmc7XG4gIHRhcmdldElkPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlkIHRoZSBhdWRpdGVkIGFjdGlvbiBzdWNjZWVkIG9yIGZhaWw/IERlZmF1bHRzIHRvICdzdWNjZXNzJyB3aGVuIG9taXR0ZWRcbiAgICogKHRoZSBwbGF0Zm9ybSBpbmdlc3QgYXBwbGllcyB0aGUgc2FtZSBkZWZhdWx0KS4gRGVuaWVkLWF1dGh6IGV2ZW50cyBzZXRcbiAgICogJ2ZhaWx1cmUnIHNvIGEgcmV2aWV3ZXIgY2FuIGZpbHRlciBhdHRlbXB0cyBmcm9tIGNvbXBsZXRlZCBhY3Rpb25zLlxuICAgKi9cbiAgb3V0Y29tZT86ICdzdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIGF1ZGl0ZWQgYWN0aW9uIGFjdHVhbGx5IE9DQ1VSUkVEIChJU08tODYwMSksIHN0YW1wZWQgYXQgZW1pc3Npb24uXG4gICAqIFRoZSBwbGF0Zm9ybSBzdG9yZXMgdGhpcyBmb3IgcmV2aWV3ZXJzOyBpdCBpcyBOT1QgdGhlIGNoYWluLW9yZGVyaW5nIGZpZWxkXG4gICAqICh0aGUgdGFtcGVyLWV2aWRlbnQgY2hhaW4gb3JkZXJzIGJ5IGluZ2VzdC9gY3JlYXRlZEF0YCkuIEl0IG1hdHRlcnMgZm9yXG4gICAqIFNQT09MRUQgZXZlbnRzOiBvbmUgYnVmZmVyZWQgZHVyaW5nIGEgcGxhdGZvcm0gb3V0YWdlIGlzIHJlLWRlbGl2ZXJlZCDigJQgYW5kXG4gICAqIHNvIGNoYWluZWQg4oCUIGxhdGVyLCBidXQgYG9jY3VycmVkQXRgIHByZXNlcnZlcyB3aGVuIGl0IHJlYWxseSBoYXBwZW5lZC5cbiAgICovXG4gIG9jY3VycmVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdGFibGUgcGVyLWVtaXNzaW9uIGRlZHVwIGtleSAoYWxzbyBzZW50IGFzIHRoZSBgSWRlbXBvdGVuY3ktS2V5YCBoZWFkZXIgdGhlXG4gICAqIHBsYXRmb3JtIGluZ2VzdCBkZWR1cHMgb24pLiBTdGFtcGVkIGJ5IGByZWNvcmQoKWAgYW5kIGNhcnJpZWQgb24gdGhlIHNwb29sZWRcbiAgICogY29weSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIGxhdGVyIHJlLWRlbGl2ZXJ5IGNvbGxhcHNlIHRvIE9ORSBzdG9yZWQgcm93LlxuICAgKi9cbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDbGllbnQgZm9yIFBPU1RpbmcgYXVkaXQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGAvYXVkaXQtZXZlbnRzYCBpbmdlc3RcbiAqIGVuZHBvaW50LiBNaW50cyBhIGZyZXNoIHNlcnZpY2UgdG9rZW4gcGVyIGNhbGwgKDUgbWluIFRUTCkgIHRoZXJlJ3Mgbm9cbiAqIG1lYW5pbmdmdWwgY2FjaGluZyBiZW5lZml0IHdoZW4gZW1pc3Npb25zIGFyZSBzcGFyc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnQge1xuICAvKipcbiAgICogRmlyZS1hbmQtZm9yZ2V0IGF1ZGl0IGVtaXNzaW9uLiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IHdhcm4gbGV2ZWwgYnV0XG4gICAqIG5ldmVyIHRocm93biAgdGhlIG9yaWdpbmF0aW5nIGFjdGlvbiAoZS5nLiBhIHBsdWdpbiBidWlsZCkgaGFzIGl0c1xuICAgKiBvd24gc3VjY2Vzcy9mYWlsdXJlIHBhdGggdGhhdCBzaG91bGRuJ3QgZ2V0IHBvbGx1dGVkIGJ5IGEgZmxha3kgYXVkaXRcbiAgICogZG93bnN0cmVhbS4gV2hlbiBhIHtAbGluayBBdWRpdFNwb29sfSBpcyBjb25maWd1cmVkLCBhbiBlbWlzc2lvbiB0aGF0XG4gICAqIGV4aGF1c3RzIGl0cyBsaXZlIHJldHJpZXMgaXMgYnVmZmVyZWQgYW5kIHJlLWRlbGl2ZXJlZCBsYXRlciBpbnN0ZWFkIG9mXG4gICAqIGJlaW5nIGRyb3BwZWQuXG4gICAqL1xuICByZWNvcmQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogU3RvcCB0aGUgYmFja2dyb3VuZCBzcG9vbC1kcmFpbiB0aW1lciAoaWYgYW55KS4gU2FmZSB0byBjYWxsIHJlcGVhdGVkbHkuICovXG4gIGNsb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZSBhdWRpdCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlQXVkaXRDbGllbnRDb25maWcge1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9IT1NUIG9yICdwbGF0Zm9ybScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBQTEFURk9STV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBtcyAoZGVmYXVsdCAzMDAwICBhdWRpdCBzaG91bGRuJ3QgYmxvY2sgdGhlIHdvcmtlcikuICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkdXJhYmxlIGJ1ZmZlci4gV2hlbiBzZXQsIGFuIGVtaXNzaW9uIHRoYXQgZXhoYXVzdHMgaXRzIGxpdmUgcmV0cnlcbiAgICogYnVkZ2V0IChzdXN0YWluZWQgcGxhdGZvcm0gb3V0YWdlKSBpcyBzcG9vbGVkIGFuZCByZS1kZWxpdmVyZWQg4oCUIG9uIHRoZSBuZXh0XG4gICAqIHN1Y2Nlc3NmdWwgZW1pc3Npb24gYW5kIG9uIGEgcGVyaW9kaWMgdGltZXIg4oCUIGluc3RlYWQgb2YgYmVpbmcgbG9zdC5cbiAgICovXG4gIHNwb29sPzogQXVkaXRTcG9vbDtcbiAgLyoqIFNwb29sLWRyYWluIGludGVydmFsIG1zIChkZWZhdWx0IDMwXzAwMCkuIE9ubHkgdXNlZCB3aGVuIGBzcG9vbGAgaXMgc2V0LiAqL1xuICBkcmFpbkludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBNYXggZW50cmllcyBkcmFpbmVkIHBlciBzd2VlcCAoZGVmYXVsdCAxMDApLiAqL1xuICBkcmFpbkJhdGNoU2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSByZW1vdGUtYXVkaXQgY2xpZW50IHRhcmdldGVkIGF0IHRoZSBwbGF0Zm9ybSBzZXJ2aWNlLlxuICpcbiAqIFVzZWQgYnkgYXBpL3BsdWdpbidzIGJ1aWxkIHdvcmtlciB0byBwdXNoIGBwbHVnaW4uYnVpbGQuKmAgZXZlbnRzIGludG9cbiAqIHRoZSBwbGF0Zm9ybSdzIE1vbmdvREIgYGF1ZGl0X2V2ZW50c2AgY29sbGVjdGlvbi4gT3RoZXIgc2VydmljZXNcbiAqIHdpdGggd29ya2VyLXN0eWxlIGVtaXR0ZXJzIGNhbiB1c2UgdGhlIHNhbWUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhdWRpdENsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KCk7XG4gKiBhdWRpdENsaWVudC5yZWNvcmQoe1xuICogYWN0aW9uOiAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gKiBhY3RvcklkOiAndXNlci0xMjMnLFxuICogb3JnSWQ6ICdvcmctYWNtZScsXG4gKiB0YXJnZXRUeXBlOiAncGx1Z2luJyxcbiAqIHRhcmdldElkOiAncGx1Z2luLWFiYycsXG4gKiBkZXRhaWxzOiB7IG5hbWU6ICdteS1wbHVnaW4nLCB2ZXJzaW9uOiAnMS4wLjAnIH0sXG4gKiB9LCAncGx1Z2luJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX0hPU1QgPz8gJ3BsYXRmb3JtJyxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBwYXJzZUludChwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX1BPUlQgPz8gJzMwMDAnLCAxMCksXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMzAwMCxcbiAgfTtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcbiAgY29uc3Qgc3Bvb2wgPSBjb25maWcuc3Bvb2w7XG4gIGNvbnN0IGRyYWluQmF0Y2hTaXplID0gY29uZmlnLmRyYWluQmF0Y2hTaXplID8/IDEwMDtcblxuICAvKipcbiAgICogQXR0ZW1wdCBPTkUgbGl2ZSBkZWxpdmVyeS4gUmVzb2x2ZXMgYHRydWVgIG9uIGEgMnh4IGFjY2VwdCwgYGZhbHNlYCBvbiBhbnlcbiAgICogbm9uLTJ4eCAvIHRocm93biBlcnJvciAodGhlIGh0dHAtY2xpZW50IGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlIHJldHJ5XG4gICAqIGJ1ZGdldCkuIEEgc3RhYmxlIHBlci1lbWlzc2lvbiBgSWRlbXBvdGVuY3ktS2V5YCBtYWtlcyB0aGlzIG5vbi1pZGVtcG90ZW50XG4gICAqIFBPU1QgcmV0cnktc2FmZSBhbmQgbGV0cyB0aGUgcGxhdGZvcm0gaW5nZXN0IGRlZHVwIGEgcmUtZGVsaXZlcmVkIGV2ZW50XG4gICAqIGluc3RlYWQgb2Ygd3JpdGluZyBhIGR1cGxpY2F0ZSBhdWRpdCByb3cgKGFuZCBkdXBsaWNhdGUgY2hhaW4gbGluaykuXG4gICAqIGBJZGVtcG90ZW5jeS1LZXlgIGlzIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnQgc28gYSBTUE9PTEVEIHJlLWRlbGl2ZXJ5IHJldXNlc1xuICAgKiB0aGUgc2FtZSBrZXkgYXMgaXRzIG9yaWdpbmFsIGxpdmUgYXR0ZW1wdCDigJQgdGhlIHR3byBjb2xsYXBzZSB0byBvbmUgcm93LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVsaXZlcihldmVudDogUmVtb3RlQXVkaXRFdmVudCwgc2VydmljZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF1dGhIZWFkZXIgPSBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7IHNlcnZpY2VOYW1lLCBvcmdJZDogZXZlbnQub3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGF1dGhIZWFkZXIsXG4gICAgICAnSWRlbXBvdGVuY3ktS2V5JzogZXZlbnQuaWRlbXBvdGVuY3lLZXkgPz8gcmFuZG9tVVVJRCgpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy9hdWRpdC9ldmVudHMnLCBldmVudCwgeyBoZWFkZXJzLCAuLi5BVURJVF9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgICBjb25zdCBvayA9ICEhcmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDMwMDtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3Qgbm9uLW9rJywgeyBhY3Rpb246IGV2ZW50LmFjdGlvbiwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2s7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignUmVtb3RlIGF1ZGl0IGluZ2VzdCB0aHJldycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGRlbGl2ZXJlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFja25vd2xlZGdlIHRoZSBkZWxpdmVyZWQgcHJlZml4IHNvIGl0IGNsZWFycyB0aGUgaW4tcHJvZ3Jlc3MgbGlzdDsgdGhlXG4gICAgICAgIC8vIHJlbGlhYmxlIHRha2UoKSBtb3ZlZCB0aGUgd2hvbGUgYmF0Y2ggdGhlcmUsIHNvIHVuYWNrZWQgc3Vydml2b3JzIGFyZVxuICAgICAgICAvLyByZWNsYWltZWQgYnkgcmVjb3ZlcigpIGFmdGVyIGEgY3Jhc2ggcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgbG9zdC5cbiAgICAgICAgaWYgKGRlbGl2ZXJlZC5sZW5ndGggPiAwKSBhd2FpdCBzcG9vbC5hY2soZGVsaXZlcmVkKTtcbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgZHJhaW5UaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICBpZiAoc3Bvb2wpIHtcbiAgICAvLyBSZWNsYWltIGFueSBiYXRjaCBzdHJhbmRlZCBvbiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdCBieSBhIHByaW9yIGNyYXNoLCB0aGVuXG4gICAgLy8gYXR0ZW1wdCB0byBmbHVzaCBpdC4gQm90aCBhcmUgYmVzdC1lZmZvcnQgKHRoZSBzcG9vbCBzd2FsbG93cyBpdHMgZXJyb3JzKS5cbiAgICB2b2lkIHNwb29sLnJlY292ZXIoKS50aGVuKCgpID0+IGRyYWluKCkpO1xuICAgIGRyYWluVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IHZvaWQgZHJhaW4oKTsgfSwgY29uZmlnLmRyYWluSW50ZXJ2YWxNcyA/PyAzMF8wMDApO1xuICAgIC8vIERvbid0IGxldCB0aGUgZHJhaW4gdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBzaHV0ZG93bi5cbiAgICAoZHJhaW5UaW1lciBhcyB1bmtub3duIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgLy8gU3RhbXAgd2hlbiB0aGUgYWN0aW9uIGFjdHVhbGx5IG9jY3VycmVkIChzdXJ2aXZlcyBzcG9vbCBkZWxheSkgYW5kIHBpbiBhXG4gICAgICAvLyBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgc3Bvb2xlZCByZXRyeSBkZWR1cC5cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFJlbW90ZUF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBvY2N1cnJlZEF0OiBldmVudC5vY2N1cnJlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICB2b2lkIGRlbGl2ZXIoc3RhbXBlZCwgc2VydmljZU5hbWUpLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9lbWl0dGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgb3V0Y29tZTogc3RhbXBlZC5vdXRjb21lID8/ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICBpZiAoc3Bvb2wpIHZvaWQgZHJhaW4oKTsgLy8gcGxhdGZvcm0gaXMgcmVhY2hhYmxlIOKAlCBmbHVzaCBhbnkgYmFja2xvZ1xuICAgICAgICB9IGVsc2UgaWYgKHNwb29sKSB7XG4gICAgICAgICAgdm9pZCBzcG9vbC5lbnF1ZXVlKHsgZXZlbnQ6IHN0YW1wZWQsIHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9zZSgpIHtcbiAgICAgIGlmIChkcmFpblRpbWVyKSB7IGNsZWFySW50ZXJ2YWwoZHJhaW5UaW1lcik7IGRyYWluVGltZXIgPSB1bmRlZmluZWQ7IH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBzdGFuZGFyZCBgYXV0aHouZGVuaWVkYCBzaW5rIHVzZWQgYnkgZXZlcnkgcmVtb3RlLWF1ZGl0IHNlcnZpY2VcbiAqIChwaXBlbGluZSwgcGx1Z2luLCBjb21wbGlhbmNlLCBxdW90YSwgbWVzc2FnZSwgYmlsbGluZywgcmVwb3J0aW5nLCDigKYpLlxuICpcbiAqIFRoZSBzaGFyZWQgYHJlcXVpcmVBdXRoYCBnYXRlIGZvcndhcmRzIGVhY2ggREVOSUVEIHN0YXRlLWNoYW5naW5nIHJlcXVlc3QgdG9cbiAqIHRoZSBhdWRpdG9yIHNldCB2aWEge0BsaW5rIHNldEF1dGh6RGVuaWFsQXVkaXRvcn07IHRoaXMgd2lyZXMgdGhhdCBob29rIHRvIHRoZVxuICogc2VydmljZSdzIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH0sIGZvcndhcmRpbmcgYSBgZmFpbHVyZWAtb3V0Y29tZVxuICogYGF1dGh6LmRlbmllZGAgZXZlbnQgc28gcHJvYmluZyAvIHByaXZpbGVnZS1lc2NhbGF0aW9uIGF0dGVtcHRzIGxlYXZlIGEgdHJhaWwuXG4gKiBFbWlzc2lvbiBpcyBmaXJlLWFuZC1mb3JnZXQgKHRoZSBjbGllbnQgbmV2ZXIgdGhyb3dzKS4gYGdldENsaWVudGAgaXMgYSBnZXR0ZXJcbiAqIHNvIHRoZSBjbGllbnQgc3RheXMgbGF6aWx5IGNvbnN0cnVjdGVkIChzZXJ2aWNlcyBtZW1vaXplIGl0IG9uIGZpcnN0IHVzZSkuXG4gKlxuICogUGxhdGZvcm0gaXMgaW50ZW50aW9uYWxseSBOT1QgYSBjYWxsZXIg4oCUIGl0IGlzIHRoZSBhdWRpdCBhdXRob3JpdHkgYW5kIHdyaXRlc1xuICogYGF1dGh6LmRlbmllZGAgc3RyYWlnaHQgdG8gaXRzIGxvY2FsIHN0b3JlICh3aXRoIGBhZmZlY3RlZE9yZ0lkYCksIG5vdCB0aHJvdWdoXG4gKiBhIFJlbW90ZUF1ZGl0Q2xpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZUF1dGh6RGVuaWFsQXVkaXRvcihzZXJ2aWNlTmFtZTogc3RyaW5nLCBnZXRDbGllbnQ6ICgpID0+IFJlbW90ZUF1ZGl0Q2xpZW50KTogdm9pZCB7XG4gIHNldEF1dGh6RGVuaWFsQXVkaXRvcigoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiBnZXRDbGllbnQoKS5yZWNvcmQoe1xuICAgIGFjdGlvbjogJ2F1dGh6LmRlbmllZCcsXG4gICAgYWN0b3JJZDogaW5mby5hY3RvcklkID8/ICdhbm9ueW1vdXMnLFxuICAgIGFjdG9yRW1haWw6IGluZm8uYWN0b3JFbWFpbCxcbiAgICBvcmdJZDogaW5mby5vcmdJZCxcbiAgICBvdXRjb21lOiAnZmFpbHVyZScsXG4gICAgZGV0YWlsczogeyBtZXRob2Q6IGluZm8ubWV0aG9kLCBwYXRoOiBpbmZvLnBhdGgsIHJlcXVpcmVkOiBpbmZvLnJlcXVpcmVkIH0sXG4gIH0sIHNlcnZpY2VOYW1lKSk7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlLXNjb3BlZCBhdWRpdCBjbGllbnQ6IGEgZHVyYWJsZS1zcG9vbC1iYWNrZWQge0BsaW5rIFJlbW90ZUF1ZGl0Q2xpZW50fVxuICogd2l0aCB0aGUgc2VydmljZSBuYW1lIHByZS1ib3VuZCBmb3IgZW1pc3Npb24uIFJlcGxhY2VzIHRoZSBwZXItc2VydmljZVxuICogYm9pbGVycGxhdGUgb2YgYGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgc3Bvb2w6IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZCB9KWBcbiAqIHBsdXMgYSBoYW5kLXJvbGxlZCBgZW1pdDxTZXJ2aWNlPkF1ZGl0YCB3cmFwcGVyIHRoYXQgcmVwZWF0cyB0aGUgc2VydmljZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIC8qKiBFbWl0IGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIHNlcnZpY2UgbmFtZSBib3VuZC4gRmlyZS1hbmQtZm9yZ2V0LiAqL1xuICBlbWl0KGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KTogdm9pZDtcbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHJlbW90ZSBjbGllbnQg4oCUIGZvciBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmAgKyBgY2xvc2UoKWAuICovXG4gIHJlYWRvbmx5IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBzZXJ2aWNlJ3MgYXVkaXQgY2xpZW50OiBhIFJlbW90ZUF1ZGl0Q2xpZW50IHdpcmVkIHRvIHRoZSBkdXJhYmxlIFJlZGlzXG4gKiBzcG9vbCAoZnJvbSBhbWJpZW50IGVudjsgbnVsbCDihpIgbm8gc3Bvb2wpIHdpdGggYHNlcnZpY2VOYW1lYCBib3VuZC4gQ29uc3RydWN0XG4gKiBPTkNFIHBlciBwcm9jZXNzIOKAlCBtZW1vaXplIGJlaGluZCBhIGxhenkgYGdldEF1ZGl0Q2xpZW50KClgIGluIHRoZSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AuIFBhc3MgYGNvbmZpZy5zcG9vbGAgdG8gb3ZlcnJpZGUgdGhlIGVudi1kZXJpdmVkIHNwb29sXG4gKiAoZS5nLiByZXVzZSBhIHNlcnZpY2UncyBleGlzdGluZyBpb3JlZGlzIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZzogUmVtb3RlQXVkaXRDbGllbnRDb25maWcgPSB7fSk6IFNlcnZpY2VBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sID8/IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCgpID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoeyAuLi5jb25maWcsIHNwb29sIH0pO1xuICByZXR1cm4ge1xuICAgIGVtaXQ6IChldmVudCkgPT4gY2xpZW50LnJlY29yZChldmVudCwgc2VydmljZU5hbWUpLFxuICAgIGNsaWVudCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMYXppbHktY29uc3RydWN0ZWQgcmVtb3RlLWF1ZGl0IGFjY2Vzc29yIGZvciBhIHNlcnZpY2UuIEV2ZXJ5IHNlcnZpY2Unc1xuICogYHNlcnZpY2VzL2F1ZGl0LnRzYCB1c2VkIHRvIGhhbmQtcm9sbCB0aGUgc2FtZSBtb2R1bGUgc2luZ2xldG9uIChhIGBsZXQgYXVkaXRgXG4gKiArIGBzdmMoKWAgdGhhdCBidWlsZHMgYSB7QGxpbmsgU2VydmljZUF1ZGl0Q2xpZW50fSBvbiBmaXJzdCB1c2UsIHRoZW4gYVxuICogYGdldEF1ZGl0Q2xpZW50KClgIHJldHVybmluZyBgLmNsaWVudGAgYW5kIGFuIGBlbWl0KGV2ZW50KWAgZm9yd2FyZGluZyB0b1xuICogYC5lbWl0YCkuIFRoaXMgcGFja2FnZXMgdGhhdCBwYXR0ZXJuIGluIE9ORSBwbGFjZSBzbyBlYWNoIHNlcnZpY2UncyBhdWRpdFxuICogd2lyaW5nIGlzIGEgb25lLWxpbmVyIGFuZCBjYW4ndCBkcmlmdC5cbiAqXG4gKiBMYXp5IG9uIHB1cnBvc2U6IHRoZSB1bmRlcmx5aW5nIGNsaWVudCB3aXJlcyBhbiBlbnYtUmVkaXMgYXVkaXQgc3Bvb2wsIHNvXG4gKiBidWlsZGluZyBpdCBhdCBpbXBvcnQgdGltZSB3b3VsZCBmb3JjZSB0aGF0IGNvbm5lY3Rpb24gd2hlcmV2ZXIgdGhlIG1vZHVsZSBpc1xuICogbWVyZWx5IGltcG9ydGVkIChlLmcuIHRlc3RzKS4gYGdldEF1ZGl0Q2xpZW50YCBpcyBwYXNzZWQgdG9cbiAqIGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYDsgYGVtaXRgIGJhY2tzIHRoZSBwZXItc2VydmljZSBgZW1pdFhBdWRpdGAgaGVscGVycy5cbiAqIEJvdGggc3RheSBGSVJFLUFORC1GT1JHRVQgKHJlY29yZCBuZXZlciB0aHJvd3MgLyBpcyBub3QgYXdhaXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdEFjY2Vzc29yKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB7XG4gIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudDtcbiAgZW1pdDogKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50KSA9PiB2b2lkO1xufSB7XG4gIGxldCBhdWRpdDogU2VydmljZUF1ZGl0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHN2YyA9ICgpOiBTZXJ2aWNlQXVkaXRDbGllbnQgPT4ge1xuICAgIGlmICghYXVkaXQpIGF1ZGl0ID0gY3JlYXRlU2VydmljZUF1ZGl0Q2xpZW50KHNlcnZpY2VOYW1lKTtcbiAgICByZXR1cm4gYXVkaXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgZ2V0QXVkaXRDbGllbnQ6ICgpID0+IHN2YygpLmNsaWVudCxcbiAgICBlbWl0OiAoZXZlbnQpID0+IHN2YygpLmVtaXQoZXZlbnQpLFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer-portal catalog metadata shared across catalog entities
|
|
3
|
+
* (pipelines and plugins today; any future catalogable entity next).
|
|
4
|
+
*
|
|
5
|
+
* These are the ownership/lifecycle/classification fields an internal
|
|
6
|
+
* developer portal keys its catalog, "my services" views, and scorecards
|
|
7
|
+
* off of — the counterpart to Backstage's `metadata`/`spec.owner`/
|
|
8
|
+
* `spec.lifecycle`. Kept here (not per-schema) so the DB schema, the Zod
|
|
9
|
+
* validation, and the API all draw from one source of truth.
|
|
10
|
+
*/
|
|
11
|
+
/** Lifecycle stage of a catalog entity. */
|
|
12
|
+
export declare const LIFECYCLE_STAGES: readonly ['experimental', 'production', 'deprecated'];
|
|
13
|
+
export type Lifecycle = (typeof LIFECYCLE_STAGES)[number];
|
|
14
|
+
/** Default lifecycle applied when none is supplied (matches the DB column default). */
|
|
15
|
+
export declare const DEFAULT_LIFECYCLE: Lifecycle;
|
|
16
|
+
/** Operational criticality of a catalog entity (optional/unset by default). */
|
|
17
|
+
export declare const CRITICALITY_LEVELS: readonly ['low', 'medium', 'high', 'critical'];
|
|
18
|
+
export type Criticality = (typeof CRITICALITY_LEVELS)[number];
|
|
19
|
+
/** Whether an owner reference points at an individual user or a team/org. */
|
|
20
|
+
export declare const OWNER_TYPES: readonly ['user', 'team'];
|
|
21
|
+
export type OwnerType = (typeof OWNER_TYPES)[number];
|
|
22
|
+
/** A titled external link attached to a catalog entity (docs, dashboard, runbook, …). */
|
|
23
|
+
export interface EntityLink {
|
|
24
|
+
readonly title: string;
|
|
25
|
+
readonly url: string;
|
|
26
|
+
/** Optional icon hint the UI may map to a glyph (e.g. 'docs', 'dashboard'). */
|
|
27
|
+
readonly icon?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Free-form typed classification labels: `{ team: 'payments', tier: 'gold' }`. */
|
|
30
|
+
export type EntityLabels = Record<string, string>;
|
|
31
|
+
/** Owner reference for a catalog entity. */
|
|
32
|
+
export interface CatalogOwnership {
|
|
33
|
+
/** User id (ownerType='user') or team/org id (ownerType='team'). */
|
|
34
|
+
readonly ownerId?: string | null;
|
|
35
|
+
readonly ownerType?: OwnerType | null;
|
|
36
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Developer-portal catalog metadata shared across catalog entities
|
|
5
|
+
* (pipelines and plugins today; any future catalogable entity next).
|
|
6
|
+
*
|
|
7
|
+
* These are the ownership/lifecycle/classification fields an internal
|
|
8
|
+
* developer portal keys its catalog, "my services" views, and scorecards
|
|
9
|
+
* off of — the counterpart to Backstage's `metadata`/`spec.owner`/
|
|
10
|
+
* `spec.lifecycle`. Kept here (not per-schema) so the DB schema, the Zod
|
|
11
|
+
* validation, and the API all draw from one source of truth.
|
|
12
|
+
*/
|
|
13
|
+
/** Lifecycle stage of a catalog entity. */
|
|
14
|
+
export const LIFECYCLE_STAGES = ['experimental', 'production', 'deprecated'];
|
|
15
|
+
/** Default lifecycle applied when none is supplied (matches the DB column default). */
|
|
16
|
+
export const DEFAULT_LIFECYCLE = 'production';
|
|
17
|
+
/** Operational criticality of a catalog entity (optional/unset by default). */
|
|
18
|
+
export const CRITICALITY_LEVELS = ['low', 'medium', 'high', 'critical'];
|
|
19
|
+
/** Whether an owner reference points at an individual user or a team/org. */
|
|
20
|
+
export const OWNER_TYPES = ['user', 'team'];
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9jYXRhbG9nLW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBRUgsMkNBQTJDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUd0Rix1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWMsWUFBWSxDQUFDO0FBRXpELCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBR2pGLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBEZXZlbG9wZXItcG9ydGFsIGNhdGFsb2cgbWV0YWRhdGEgc2hhcmVkIGFjcm9zcyBjYXRhbG9nIGVudGl0aWVzXG4gKiAocGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvZGF5OyBhbnkgZnV0dXJlIGNhdGFsb2dhYmxlIGVudGl0eSBuZXh0KS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIG93bmVyc2hpcC9saWZlY3ljbGUvY2xhc3NpZmljYXRpb24gZmllbGRzIGFuIGludGVybmFsXG4gKiBkZXZlbG9wZXIgcG9ydGFsIGtleXMgaXRzIGNhdGFsb2csIFwibXkgc2VydmljZXNcIiB2aWV3cywgYW5kIHNjb3JlY2FyZHNcbiAqIG9mZiBvZiDigJQgdGhlIGNvdW50ZXJwYXJ0IHRvIEJhY2tzdGFnZSdzIGBtZXRhZGF0YWAvYHNwZWMub3duZXJgL1xuICogYHNwZWMubGlmZWN5Y2xlYC4gS2VwdCBoZXJlIChub3QgcGVyLXNjaGVtYSkgc28gdGhlIERCIHNjaGVtYSwgdGhlIFpvZFxuICogdmFsaWRhdGlvbiwgYW5kIHRoZSBBUEkgYWxsIGRyYXcgZnJvbSBvbmUgc291cmNlIG9mIHRydXRoLlxuICovXG5cbi8qKiBMaWZlY3ljbGUgc3RhZ2Ugb2YgYSBjYXRhbG9nIGVudGl0eS4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfU1RBR0VTID0gWydleHBlcmltZW50YWwnLCAncHJvZHVjdGlvbicsICdkZXByZWNhdGVkJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBMaWZlY3ljbGUgPSAodHlwZW9mIExJRkVDWUNMRV9TVEFHRVMpW251bWJlcl07XG5cbi8qKiBEZWZhdWx0IGxpZmVjeWNsZSBhcHBsaWVkIHdoZW4gbm9uZSBpcyBzdXBwbGllZCAobWF0Y2hlcyB0aGUgREIgY29sdW1uIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElGRUNZQ0xFOiBMaWZlY3ljbGUgPSAncHJvZHVjdGlvbic7XG5cbi8qKiBPcGVyYXRpb25hbCBjcml0aWNhbGl0eSBvZiBhIGNhdGFsb2cgZW50aXR5IChvcHRpb25hbC91bnNldCBieSBkZWZhdWx0KS4gKi9cbmV4cG9ydCBjb25zdCBDUklUSUNBTElUWV9MRVZFTFMgPSBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ3JpdGljYWxpdHkgPSAodHlwZW9mIENSSVRJQ0FMSVRZX0xFVkVMUylbbnVtYmVyXTtcblxuLyoqIFdoZXRoZXIgYW4gb3duZXIgcmVmZXJlbmNlIHBvaW50cyBhdCBhbiBpbmRpdmlkdWFsIHVzZXIgb3IgYSB0ZWFtL29yZy4gKi9cbmV4cG9ydCBjb25zdCBPV05FUl9UWVBFUyA9IFsndXNlcicsICd0ZWFtJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBPd25lclR5cGUgPSAodHlwZW9mIE9XTkVSX1RZUEVTKVtudW1iZXJdO1xuXG4vKiogQSB0aXRsZWQgZXh0ZXJuYWwgbGluayBhdHRhY2hlZCB0byBhIGNhdGFsb2cgZW50aXR5IChkb2NzLCBkYXNoYm9hcmQsIHJ1bmJvb2ssIOKApikuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUxpbmsge1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGljb24gaGludCB0aGUgVUkgbWF5IG1hcCB0byBhIGdseXBoIChlLmcuICdkb2NzJywgJ2Rhc2hib2FyZCcpLiAqL1xuICByZWFkb25seSBpY29uPzogc3RyaW5nO1xufVxuXG4vKiogRnJlZS1mb3JtIHR5cGVkIGNsYXNzaWZpY2F0aW9uIGxhYmVsczogYHsgdGVhbTogJ3BheW1lbnRzJywgdGllcjogJ2dvbGQnIH1gLiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5TGFiZWxzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqIE93bmVyIHJlZmVyZW5jZSBmb3IgYSBjYXRhbG9nIGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0YWxvZ093bmVyc2hpcCB7XG4gIC8qKiBVc2VyIGlkIChvd25lclR5cGU9J3VzZXInKSBvciB0ZWFtL29yZyBpZCAob3duZXJUeXBlPSd0ZWFtJykuICovXG4gIHJlYWRvbmx5IG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBvd25lclR5cGU/OiBPd25lclR5cGUgfCBudWxsO1xufVxuIl19
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './error-codes.js';
|
|
2
2
|
export * from './common.js';
|
|
3
3
|
export * from './pipeline.js';
|
|
4
|
+
export * from './catalog-metadata.js';
|
|
5
|
+
export * from './pipeline-template.js';
|
|
4
6
|
export * from './http.js';
|
|
5
7
|
export * from './quota-tiers.js';
|
|
6
8
|
export * from './feature-flags.js';
|