@pipeline-builder/api-core 3.4.58 → 3.4.60
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/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +2 -1
- package/lib/helpers/org-hierarchy.d.ts +57 -0
- package/lib/helpers/org-hierarchy.js +118 -0
- package/lib/middleware/auth.d.ts +9 -0
- package/lib/middleware/auth.js +5 -3
- package/lib/types/audit-events.d.ts +15 -2
- package/lib/types/audit-events.js +1 -1
- package/lib/types/common.d.ts +10 -0
- package/lib/types/common.js +1 -1
- package/lib/utils/crash-handlers.d.ts +18 -0
- package/lib/utils/crash-handlers.js +39 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/package.json +2 -2
package/lib/helpers/index.d.ts
CHANGED
package/lib/helpers/index.js
CHANGED
|
@@ -20,4 +20,5 @@ __exportStar(require("./crud-helpers"), exports);
|
|
|
20
20
|
__exportStar(require("./access-helpers"), exports);
|
|
21
21
|
__exportStar(require("./mask-helpers"), exports);
|
|
22
22
|
__exportStar(require("./sse-helpers"), exports);
|
|
23
|
-
|
|
23
|
+
__exportStar(require("./org-hierarchy"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUV0QyxpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLGlEQUErQjtBQUMvQixnREFBOEI7QUFDOUIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYXNrLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2UtaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL29yZy1oaWVyYXJjaHknO1xuIl19
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org → team hierarchy traversal (org-team-hierarchy proposal).
|
|
3
|
+
*
|
|
4
|
+
* A "team" is an organization whose `parentOrgId` points at another org; a root
|
|
5
|
+
* org has `parentOrgId = null`. These helpers walk that single self-referential
|
|
6
|
+
* column, but hold **no database dependency** of their own: each takes a query
|
|
7
|
+
* callback so every service (platform, quota, …) can share the cycle-safe,
|
|
8
|
+
* depth-capped traversal logic while reading its own Mongoose model with its own
|
|
9
|
+
* `_id` casting rules.
|
|
10
|
+
*
|
|
11
|
+
* - {@link resolveOrgLineageWith} — UP: direct parent + root of the chain.
|
|
12
|
+
* - {@link resolveRootOrgIdWith} — UP: just the root id.
|
|
13
|
+
* - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
|
|
14
|
+
* - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
|
|
15
|
+
*
|
|
16
|
+
* Every org is flat today (`parentOrgId` null on all rows), so lineage resolves
|
|
17
|
+
* to `{ rootOrgId: self }` and scope to `[self]` — i.e. these are no-ops until
|
|
18
|
+
* orgs get parents.
|
|
19
|
+
*/
|
|
20
|
+
/** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
|
|
21
|
+
export declare const MAX_ORG_DEPTH = 16;
|
|
22
|
+
/** Fetch an org's direct `parentOrgId`, or undefined for a root/missing org. */
|
|
23
|
+
export type GetParentOrgId = (orgId: string) => Promise<string | undefined>;
|
|
24
|
+
/** Fetch the direct child org ids of every org in `frontier` (one round of BFS). */
|
|
25
|
+
export type GetChildOrgIds = (frontier: string[]) => Promise<string[]>;
|
|
26
|
+
/** Normalize a Mixed/ObjectId/string org id to a non-empty string, or undefined. */
|
|
27
|
+
export declare function toOrgIdString(v: unknown): string | undefined;
|
|
28
|
+
export interface OrgLineage {
|
|
29
|
+
/** The org's direct parent id, or `undefined` when it's a root org. */
|
|
30
|
+
parentOrgId?: string;
|
|
31
|
+
/** Top of the ancestry chain. Equals the input `orgId` for a root org. */
|
|
32
|
+
rootOrgId: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Walk `parentOrgId` from `orgId` up to the root. Returns the direct parent (if
|
|
36
|
+
* any) and the root org id (the input itself when the org has no parent). On a
|
|
37
|
+
* detected cycle, a missing org, or the depth cap, traversal stops and the last
|
|
38
|
+
* reached id is treated as the root.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveOrgLineageWith(orgId: string, getParent: GetParentOrgId): Promise<OrgLineage>;
|
|
41
|
+
/** Walk `parentOrgId` up to the root and return just the root id. */
|
|
42
|
+
export declare function resolveRootOrgIdWith(orgId: string, getParent: GetParentOrgId): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
|
|
45
|
+
* `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.
|
|
46
|
+
* Walks `candidateOrgId`'s parent chain upward, depth-capped and cycle-safe.
|
|
47
|
+
* Returns `false` when the two are equal (an org is not its own ancestor) or
|
|
48
|
+
* unrelated.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isAncestorOrgWith(ancestorOrgId: string, candidateOrgId: string, getParent: GetParentOrgId): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Expand `orgId` to itself plus every descendant org id (breadth-first over
|
|
53
|
+
* `parentOrgId`). This is the scope a parent org "sees" for visibility and
|
|
54
|
+
* analytics rollups: `[self, ...descendants]`. Returns `[orgId]` when the org
|
|
55
|
+
* has no children. Cycle-safe and depth-capped.
|
|
56
|
+
*/
|
|
57
|
+
export declare function expandOrgScopeWith(orgId: string, getChildren: GetChildOrgIds): Promise<string[]>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.MAX_ORG_DEPTH = void 0;
|
|
6
|
+
exports.toOrgIdString = toOrgIdString;
|
|
7
|
+
exports.resolveOrgLineageWith = resolveOrgLineageWith;
|
|
8
|
+
exports.resolveRootOrgIdWith = resolveRootOrgIdWith;
|
|
9
|
+
exports.isAncestorOrgWith = isAncestorOrgWith;
|
|
10
|
+
exports.expandOrgScopeWith = expandOrgScopeWith;
|
|
11
|
+
/**
|
|
12
|
+
* Org → team hierarchy traversal (org-team-hierarchy proposal).
|
|
13
|
+
*
|
|
14
|
+
* A "team" is an organization whose `parentOrgId` points at another org; a root
|
|
15
|
+
* org has `parentOrgId = null`. These helpers walk that single self-referential
|
|
16
|
+
* column, but hold **no database dependency** of their own: each takes a query
|
|
17
|
+
* callback so every service (platform, quota, …) can share the cycle-safe,
|
|
18
|
+
* depth-capped traversal logic while reading its own Mongoose model with its own
|
|
19
|
+
* `_id` casting rules.
|
|
20
|
+
*
|
|
21
|
+
* - {@link resolveOrgLineageWith} — UP: direct parent + root of the chain.
|
|
22
|
+
* - {@link resolveRootOrgIdWith} — UP: just the root id.
|
|
23
|
+
* - {@link isAncestorOrgWith} — UP: is A an ancestor of B?
|
|
24
|
+
* - {@link expandOrgScopeWith} — DOWN: self + all descendant org ids.
|
|
25
|
+
*
|
|
26
|
+
* Every org is flat today (`parentOrgId` null on all rows), so lineage resolves
|
|
27
|
+
* to `{ rootOrgId: self }` and scope to `[self]` — i.e. these are no-ops until
|
|
28
|
+
* orgs get parents.
|
|
29
|
+
*/
|
|
30
|
+
/** Hard ceiling on ancestry/descendant traversal — cycle + abuse guard. */
|
|
31
|
+
exports.MAX_ORG_DEPTH = 16;
|
|
32
|
+
/** Normalize a Mixed/ObjectId/string org id to a non-empty string, or undefined. */
|
|
33
|
+
function toOrgIdString(v) {
|
|
34
|
+
if (v === null || v === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
const s = String(v);
|
|
37
|
+
return s && s !== 'null' && s !== 'undefined' ? s : undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Walk `parentOrgId` from `orgId` up to the root. Returns the direct parent (if
|
|
41
|
+
* any) and the root org id (the input itself when the org has no parent). On a
|
|
42
|
+
* detected cycle, a missing org, or the depth cap, traversal stops and the last
|
|
43
|
+
* reached id is treated as the root.
|
|
44
|
+
*/
|
|
45
|
+
async function resolveOrgLineageWith(orgId, getParent) {
|
|
46
|
+
const seen = new Set([orgId]);
|
|
47
|
+
let currentId = orgId;
|
|
48
|
+
let parentOrgId;
|
|
49
|
+
for (let depth = 0; depth < exports.MAX_ORG_DEPTH; depth++) {
|
|
50
|
+
const parent = toOrgIdString(await getParent(currentId));
|
|
51
|
+
if (!parent)
|
|
52
|
+
break; // currentId is the root
|
|
53
|
+
// Record the direct parent only when it isn't a self-loop, so a malformed
|
|
54
|
+
// A→A org isn't reported as its own parent.
|
|
55
|
+
if (depth === 0 && parent !== orgId)
|
|
56
|
+
parentOrgId = parent;
|
|
57
|
+
if (seen.has(parent))
|
|
58
|
+
break; // cycle — treat currentId as the root
|
|
59
|
+
seen.add(parent);
|
|
60
|
+
currentId = parent;
|
|
61
|
+
}
|
|
62
|
+
return { rootOrgId: currentId, ...(parentOrgId && { parentOrgId }) };
|
|
63
|
+
}
|
|
64
|
+
/** Walk `parentOrgId` up to the root and return just the root id. */
|
|
65
|
+
async function resolveRootOrgIdWith(orgId, getParent) {
|
|
66
|
+
return (await resolveOrgLineageWith(orgId, getParent)).rootOrgId;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* True when `ancestorOrgId` is an ancestor of `candidateOrgId` — i.e.
|
|
70
|
+
* `candidateOrgId` lives somewhere in the subtree rooted at `ancestorOrgId`.
|
|
71
|
+
* Walks `candidateOrgId`'s parent chain upward, depth-capped and cycle-safe.
|
|
72
|
+
* Returns `false` when the two are equal (an org is not its own ancestor) or
|
|
73
|
+
* unrelated.
|
|
74
|
+
*/
|
|
75
|
+
async function isAncestorOrgWith(ancestorOrgId, candidateOrgId, getParent) {
|
|
76
|
+
if (ancestorOrgId === candidateOrgId)
|
|
77
|
+
return false;
|
|
78
|
+
const seen = new Set([candidateOrgId]);
|
|
79
|
+
let currentId = candidateOrgId;
|
|
80
|
+
for (let depth = 0; depth < exports.MAX_ORG_DEPTH; depth++) {
|
|
81
|
+
const parent = toOrgIdString(await getParent(currentId));
|
|
82
|
+
if (!parent)
|
|
83
|
+
return false; // reached a root without matching
|
|
84
|
+
if (parent === ancestorOrgId)
|
|
85
|
+
return true;
|
|
86
|
+
if (seen.has(parent))
|
|
87
|
+
return false; // cycle
|
|
88
|
+
seen.add(parent);
|
|
89
|
+
currentId = parent;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Expand `orgId` to itself plus every descendant org id (breadth-first over
|
|
95
|
+
* `parentOrgId`). This is the scope a parent org "sees" for visibility and
|
|
96
|
+
* analytics rollups: `[self, ...descendants]`. Returns `[orgId]` when the org
|
|
97
|
+
* has no children. Cycle-safe and depth-capped.
|
|
98
|
+
*/
|
|
99
|
+
async function expandOrgScopeWith(orgId, getChildren) {
|
|
100
|
+
const result = [orgId];
|
|
101
|
+
const seen = new Set([orgId]);
|
|
102
|
+
let frontier = [orgId];
|
|
103
|
+
for (let depth = 0; depth < exports.MAX_ORG_DEPTH && frontier.length > 0; depth++) {
|
|
104
|
+
const children = await getChildren(frontier);
|
|
105
|
+
const next = [];
|
|
106
|
+
for (const raw of children) {
|
|
107
|
+
const id = toOrgIdString(raw);
|
|
108
|
+
if (!id || seen.has(id))
|
|
109
|
+
continue;
|
|
110
|
+
seen.add(id);
|
|
111
|
+
result.push(id);
|
|
112
|
+
next.push(id);
|
|
113
|
+
}
|
|
114
|
+
frontier = next;
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWhpZXJhcmNoeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL29yZy1oaWVyYXJjaHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQWdDdEMsc0NBSUM7QUFlRCxzREFpQkM7QUFHRCxvREFFQztBQVNELDhDQW9CQztBQVFELGdEQW1CQztBQS9IRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsMkVBQTJFO0FBQzlELFFBQUEsYUFBYSxHQUFHLEVBQUUsQ0FBQztBQVFoQyxvRkFBb0Y7QUFDcEYsU0FBZ0IsYUFBYSxDQUFDLENBQVU7SUFDdEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEUsQ0FBQztBQVNEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxTQUF5QjtJQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksV0FBK0IsQ0FBQztJQUVwQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcscUJBQWEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxDQUFD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R0FBRyxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IHRyYXZlcnNhbCAob3JnLXRlYW0taGllcmFyY2h5IHByb3Bvc2FsKS5cbiAqXG4gKiBBIFwidGVhbVwiIGlzIGFuIG9yZ2FuaXphdGlvbiB3aG9zZSBgcGFyZW50T3JnSWRgIHBvaW50cyBhdCBhbm90aGVyIG9yZzsgYSByb290XG4gKiBvcmcgaGFzIGBwYXJlbnRPcmdJZCA9IG51bGxgLiBUaGVzZSBoZWxwZXJzIHdhbGsgdGhhdCBzaW5nbGUgc2VsZi1yZWZlcmVudGlhbFxuICogY29sdW1uLCBidXQgaG9sZCAqKm5vIGRhdGFiYXNlIGRlcGVuZGVuY3kqKiBvZiB0aGVpciBvd246IGVhY2ggdGFrZXMgYSBxdWVyeVxuICogY2FsbGJhY2sgc28gZXZlcnkgc2VydmljZSAocGxhdGZvcm0sIHF1b3RhLCDigKYpIGNhbiBzaGFyZSB0aGUgY3ljbGUtc2FmZSxcbiAqIGRlcHRoLWNhcHBlZCB0cmF2ZXJzYWwgbG9naWMgd2hpbGUgcmVhZGluZyBpdHMgb3duIE1vbmdvb3NlIG1vZGVsIHdpdGggaXRzIG93blxuICogYF9pZGAgY2FzdGluZyBydWxlcy5cbiAqXG4gKiAgIC0ge0BsaW5rIHJlc29sdmVPcmdMaW5lYWdlV2l0aH0g4oCUIFVQOiBkaXJlY3QgcGFyZW50ICsgcm9vdCBvZiB0aGUgY2hhaW4uXG4gKiAgIC0ge0BsaW5rIHJlc29sdmVSb290T3JnSWRXaXRofSAgIOKAlCBVUDoganVzdCB0aGUgcm9vdCBpZC5cbiAqICAgLSB7QGxpbmsgaXNBbmNlc3Rvck9yZ1dpdGh9ICAgICAg4oCUIFVQOiBpcyBBIGFuIGFuY2VzdG9yIG9mIEI/XG4gKiAgIC0ge0BsaW5rIGV4cGFuZE9yZ1Njb3BlV2l0aH0gICAgIOKAlCBET1dOOiBzZWxmICsgYWxsIGRlc2NlbmRhbnQgb3JnIGlkcy5cbiAqXG4gKiBFdmVyeSBvcmcgaXMgZmxhdCB0b2RheSAoYHBhcmVudE9yZ0lkYCBudWxsIG9uIGFsbCByb3dzKSwgc28gbGluZWFnZSByZXNvbHZlc1xuICogdG8gYHsgcm9vdE9yZ0lkOiBzZWxmIH1gIGFuZCBzY29wZSB0byBgW3NlbGZdYCDigJQgaS5lLiB0aGVzZSBhcmUgbm8tb3BzIHVudGlsXG4gKiBvcmdzIGdldCBwYXJlbnRzLlxuICovXG5cbi8qKiBIYXJkIGNlaWxpbmcgb24gYW5jZXN0cnkvZGVzY2VuZGFudCB0cmF2ZXJzYWwg4oCUIGN5Y2xlICsgYWJ1c2UgZ3VhcmQuICovXG5leHBvcnQgY29uc3QgTUFYX09SR19ERVBUSCA9IDE2O1xuXG4vKiogRmV0Y2ggYW4gb3JnJ3MgZGlyZWN0IGBwYXJlbnRPcmdJZGAsIG9yIHVuZGVmaW5lZCBmb3IgYSByb290L21pc3Npbmcgb3JnLiAqL1xuZXhwb3J0IHR5cGUgR2V0UGFyZW50T3JnSWQgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4vKiogRmV0Y2ggdGhlIGRpcmVjdCBjaGlsZCBvcmcgaWRzIG9mIGV2ZXJ5IG9yZyBpbiBgZnJvbnRpZXJgIChvbmUgcm91bmQgb2YgQkZTKS4gKi9cbmV4cG9ydCB0eXBlIEdldENoaWxkT3JnSWRzID0gKGZyb250aWVyOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmdbXT47XG5cbi8qKiBOb3JtYWxpemUgYSBNaXhlZC9PYmplY3RJZC9zdHJpbmcgb3JnIGlkIHRvIGEgbm9uLWVtcHR5IHN0cmluZywgb3IgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3JnSWRTdHJpbmcodjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcyA9IFN0cmluZyh2KTtcbiAgcmV0dXJuIHMgJiYgcyAhPT0gJ251bGwnICYmIHMgIT09ICd1bmRlZmluZWQnID8gcyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdMaW5lYWdlIHtcbiAgLyoqIFRoZSBvcmcncyBkaXJlY3QgcGFyZW50IGlkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0J3MgYSByb290IG9yZy4gKi9cbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBUb3Agb2YgdGhlIGFuY2VzdHJ5IGNoYWluLiBFcXVhbHMgdGhlIGlucHV0IGBvcmdJZGAgZm9yIGEgcm9vdCBvcmcuICovXG4gIHJvb3RPcmdJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdhbGsgYHBhcmVudE9yZ0lkYCBmcm9tIGBvcmdJZGAgdXAgdG8gdGhlIHJvb3QuIFJldHVybnMgdGhlIGRpcmVjdCBwYXJlbnQgKGlmXG4gKiBhbnkpIGFuZCB0aGUgcm9vdCBvcmcgaWQgKHRoZSBpbnB1dCBpdHNlbGYgd2hlbiB0aGUgb3JnIGhhcyBubyBwYXJlbnQpLiBPbiBhXG4gKiBkZXRlY3RlZCBjeWNsZSwgYSBtaXNzaW5nIG9yZywgb3IgdGhlIGRlcHRoIGNhcCwgdHJhdmVyc2FsIHN0b3BzIGFuZCB0aGUgbGFzdFxuICogcmVhY2hlZCBpZCBpcyB0cmVhdGVkIGFzIHRoZSByb290LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9yZ0xpbmVhZ2VXaXRoKG9yZ0lkOiBzdHJpbmcsIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQpOiBQcm9taXNlPE9yZ0xpbmVhZ2U+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPihbb3JnSWRdKTtcbiAgbGV0IGN1cnJlbnRJZCA9IG9yZ0lkO1xuICBsZXQgcGFyZW50T3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTUFYX09SR19ERVBUSDsgZGVwdGgrKykge1xuICAgIGNvbnN0IHBhcmVudCA9IHRvT3JnSWRTdHJpbmcoYXdhaXQgZ2V0UGFyZW50KGN1cnJlbnRJZCkpO1xuICAgIGlmICghcGFyZW50KSBicmVhazsgLy8gY3VycmVudElkIGlzIHRoZSByb290XG4gICAgLy8gUmVjb3JkIHRoZSBkaXJlY3QgcGFyZW50IG9ubHkgd2hlbiBpdCBpc24ndCBhIHNlbGYtbG9vcCwgc28gYSBtYWxmb3JtZWRcbiAgICAvLyBB4oaSQSBvcmcgaXNuJ3QgcmVwb3J0ZWQgYXMgaXRzIG93biBwYXJlbnQuXG4gICAgaWYgKGRlcHRoID09PSAwICYmIHBhcmVudCAhPT0gb3JnSWQpIHBhcmVudE9yZ0lkID0gcGFyZW50O1xuICAgIGlmIChzZWVuLmhhcyhwYXJlbnQpKSBicmVhazsgLy8gY3ljbGUg4oCUIHRyZWF0IGN1cnJlbnRJZCBhcyB0aGUgcm9vdFxuICAgIHNlZW4uYWRkKHBhcmVudCk7XG4gICAgY3VycmVudElkID0gcGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIHsgcm9vdE9yZ0lkOiBjdXJyZW50SWQsIC4uLihwYXJlbnRPcmdJZCAmJiB7IHBhcmVudE9yZ0lkIH0pIH07XG59XG5cbi8qKiBXYWxrIGBwYXJlbnRPcmdJZGAgdXAgdG8gdGhlIHJvb3QgYW5kIHJldHVybiBqdXN0IHRoZSByb290IGlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVSb290T3JnSWRXaXRoKG9yZ0lkOiBzdHJpbmcsIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IHJlc29sdmVPcmdMaW5lYWdlV2l0aChvcmdJZCwgZ2V0UGFyZW50KSkucm9vdE9yZ0lkO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBgYW5jZXN0b3JPcmdJZGAgaXMgYW4gYW5jZXN0b3Igb2YgYGNhbmRpZGF0ZU9yZ0lkYCDigJQgaS5lLlxuICogYGNhbmRpZGF0ZU9yZ0lkYCBsaXZlcyBzb21ld2hlcmUgaW4gdGhlIHN1YnRyZWUgcm9vdGVkIGF0IGBhbmNlc3Rvck9yZ0lkYC5cbiAqIFdhbGtzIGBjYW5kaWRhdGVPcmdJZGAncyBwYXJlbnQgY2hhaW4gdXB3YXJkLCBkZXB0aC1jYXBwZWQgYW5kIGN5Y2xlLXNhZmUuXG4gKiBSZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGUgdHdvIGFyZSBlcXVhbCAoYW4gb3JnIGlzIG5vdCBpdHMgb3duIGFuY2VzdG9yKSBvclxuICogdW5yZWxhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBbmNlc3Rvck9yZ1dpdGgoXG4gIGFuY2VzdG9yT3JnSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlT3JnSWQ6IHN0cmluZyxcbiAgZ2V0UGFyZW50OiBHZXRQYXJlbnRPcmdJZCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYW5jZXN0b3JPcmdJZCA9PT0gY2FuZGlkYXRlT3JnSWQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KFtjYW5kaWRhdGVPcmdJZF0pO1xuICBsZXQgY3VycmVudElkID0gY2FuZGlkYXRlT3JnSWQ7XG5cbiAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IE1BWF9PUkdfREVQVEg7IGRlcHRoKyspIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0b09yZ0lkU3RyaW5nKGF3YWl0IGdldFBhcmVudChjdXJyZW50SWQpKTtcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlOyAvLyByZWFjaGVkIGEgcm9vdCB3aXRob3V0IG1hdGNoaW5nXG4gICAgaWYgKHBhcmVudCA9PT0gYW5jZXN0b3JPcmdJZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNlZW4uaGFzKHBhcmVudCkpIHJldHVybiBmYWxzZTsgLy8gY3ljbGVcbiAgICBzZWVuLmFkZChwYXJlbnQpO1xuICAgIGN1cnJlbnRJZCA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYG9yZ0lkYCB0byBpdHNlbGYgcGx1cyBldmVyeSBkZXNjZW5kYW50IG9yZyBpZCAoYnJlYWR0aC1maXJzdCBvdmVyXG4gKiBgcGFyZW50T3JnSWRgKS4gVGhpcyBpcyB0aGUgc2NvcGUgYSBwYXJlbnQgb3JnIFwic2Vlc1wiIGZvciB2aXNpYmlsaXR5IGFuZFxuICogYW5hbHl0aWNzIHJvbGx1cHM6IGBbc2VsZiwgLi4uZGVzY2VuZGFudHNdYC4gUmV0dXJucyBgW29yZ0lkXWAgd2hlbiB0aGUgb3JnXG4gKiBoYXMgbm8gY2hpbGRyZW4uIEN5Y2xlLXNhZmUgYW5kIGRlcHRoLWNhcHBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE9yZ1Njb3BlV2l0aChvcmdJZDogc3RyaW5nLCBnZXRDaGlsZHJlbjogR2V0Q2hpbGRPcmdJZHMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbb3JnSWRdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KFtvcmdJZF0pO1xuICBsZXQgZnJvbnRpZXI6IHN0cmluZ1tdID0gW29yZ0lkXTtcblxuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTUFYX09SR19ERVBUSCAmJiBmcm9udGllci5sZW5ndGggPiAwOyBkZXB0aCsrKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRDaGlsZHJlbihmcm9udGllcik7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhdyBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3QgaWQgPSB0b09yZ0lkU3RyaW5nKHJhdyk7XG4gICAgICBpZiAoIWlkIHx8IHNlZW4uaGFzKGlkKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChpZCk7XG4gICAgICByZXN1bHQucHVzaChpZCk7XG4gICAgICBuZXh0LnB1c2goaWQpO1xuICAgIH1cbiAgICBmcm9udGllciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
|
package/lib/middleware/auth.d.ts
CHANGED
|
@@ -66,10 +66,19 @@ export interface ServiceTokenOptions {
|
|
|
66
66
|
orgName?: string;
|
|
67
67
|
/** TTL in seconds (default 300). */
|
|
68
68
|
ttlSeconds?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Role the token carries. Defaults to `'owner'` for backward compatibility —
|
|
71
|
+
* many existing inter-service calls hit admin-gated endpoints. **Pass the
|
|
72
|
+
* LOWEST role the call actually needs** (`'member'` for read / data-plane
|
|
73
|
+
* calls) so a leaked service token can't perform admin actions in the target
|
|
74
|
+
* org. `isAdmin` is derived from this (admin|owner → true).
|
|
75
|
+
*/
|
|
76
|
+
role?: 'owner' | 'admin' | 'member';
|
|
69
77
|
}
|
|
70
78
|
/**
|
|
71
79
|
* Mint a JWT identifying the calling service. Used for inter-service HTTP calls.
|
|
72
80
|
* The token satisfies `requireAuth` and (when orgId is present) `requireOrganization`.
|
|
81
|
+
* Scope it with `opts.role` — least privilege keeps a leaked token low-value.
|
|
73
82
|
*/
|
|
74
83
|
export declare function signServiceToken(opts: ServiceTokenOptions): string;
|
|
75
84
|
/** Convenience: returns a `Bearer <token>` header value for fetch/axios calls. */
|
package/lib/middleware/auth.js
CHANGED
|
@@ -198,14 +198,16 @@ const DEFAULT_SERVICE_TOKEN_TTL_SECONDS = 300;
|
|
|
198
198
|
/**
|
|
199
199
|
* Mint a JWT identifying the calling service. Used for inter-service HTTP calls.
|
|
200
200
|
* The token satisfies `requireAuth` and (when orgId is present) `requireOrganization`.
|
|
201
|
+
* Scope it with `opts.role` — least privilege keeps a leaked token low-value.
|
|
201
202
|
*/
|
|
202
203
|
function signServiceToken(opts) {
|
|
204
|
+
const role = opts.role ?? 'owner';
|
|
203
205
|
const payload = {
|
|
204
206
|
sub: `service:${opts.serviceName}`,
|
|
205
207
|
username: `${opts.serviceName}-service`,
|
|
206
208
|
email: `${opts.serviceName}@internal`,
|
|
207
|
-
role
|
|
208
|
-
isAdmin:
|
|
209
|
+
role,
|
|
210
|
+
isAdmin: role === 'owner' || role === 'admin',
|
|
209
211
|
type: 'access',
|
|
210
212
|
organizationId: opts.orgId,
|
|
211
213
|
organizationName: opts.orgName ?? opts.orgId,
|
|
@@ -230,4 +232,4 @@ function getServiceAuthHeader(opts) {
|
|
|
230
232
|
function isServicePrincipal(req) {
|
|
231
233
|
return req.user?.sub?.startsWith('service:') ?? false;
|
|
232
234
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7OztBQTJEdEMsa0NBYUM7QUFrRUQsb0NBY0M7QUFXRCxzQ0FFQztBQWFELHNDQUVDO0FBR0QsZ0RBYUM7QUFPRCx3Q0FzQkM7QUFRRCxzREFLQztBQWtDRCw0Q0FvQkM7QUFHRCxvREFFQztBQUdELGdEQUVDO0FBM1NELGdFQUErQjtBQUMvQiwwREFBc0Q7QUFFdEQsc0RBQWlEO0FBQ2pELDhDQUFtRDtBQUNuRCw0Q0FBK0M7QUFDL0MsZ0RBQThDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRS9DLDREQUE0RDtBQUM1RCxJQUFJLFVBQThCLENBQUM7QUFDbkMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSw4QkFBOEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxZQUFZO0FBRTVELFNBQVMsWUFBWTtJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxHQUFHLEdBQUcscUJBQXFCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztRQUNoRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BD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Q0FBQyxJQUF5QjtJQUM1RCxPQUFPLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUM1QyxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLFNBQWdCLGtCQUFrQixDQUFDLEdBQVk7SUFDN0MsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cyc7XG5pbXBvcnQgeyBKd3RQYXlsb2FkIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdXRoLW1pZGRsZXdhcmUnKTtcblxuLyoqIENhY2hlZCBKV1Qgc2VjcmV0IHdpdGggcGVyaW9kaWMgcmVmcmVzaCBmcm9tIGVudiB2YXIuICovXG5sZXQgX2p3dFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IDA7XG5jb25zdCBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMgPSAzMDBfMDAwOyAvLyA1IG1pbnV0ZXNcblxuZnVuY3Rpb24gZ2V0Snd0U2VjcmV0KCk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmICghX2p3dFNlY3JldCB8fCBub3cgLSBfand0U2VjcmV0UmVmcmVzaGVkQXQgPiBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMpIHtcbiAgICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5KV1RfU0VDUkVUO1xuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChfand0U2VjcmV0ICYmIF9qd3RTZWNyZXQgIT09IHNlY3JldCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0pXVCBzZWNyZXQgcm90YXRlZCcpO1xuICAgIH1cbiAgICBfand0U2VjcmV0ID0gc2VjcmV0O1xuICAgIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IG5vdztcbiAgfVxuICByZXR1cm4gX2p3dFNlY3JldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiAqKlNFQ1VSSVRZIFdBUk5JTkc6KiogV2hlbiBlbmFibGVkLCBhIGNhbGxlciBjYW4gc2V0IGB4LW9yZy1pZGAgdG8gQU5ZXG4gICAqIG9yZ2FuaXphdGlvbiBJRCwgZWZmZWN0aXZlbHkgaW1wZXJzb25hdGluZyB0aGF0IG9yZy4gVGhpcyBNVVNUIG9ubHkgYmVcbiAgICogdXNlZCBvbiByb3V0ZXMgdGhhdCBhcmU6XG4gICAqICAgMS4gSW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIHJvdXRlcyAobm90IGV4cG9zZWQgdG8gZW5kIHVzZXJzKVxuICAgKiAgIDIuIEJlaGluZCBuZXR3b3JrIGlzb2xhdGlvbiAoY29udGFpbmVyIG5ldHdvcmssIFZQQywgZXRjLilcbiAgICpcbiAgICogTkVWRVIgZW5hYmxlIHRoaXMgb24gdXNlci1mYWNpbmcgQVBJIHJvdXRlcy4gSWYgdW5zdXJlLCBsZWF2ZSBpdCBkaXNhYmxlZC5cbiAgICovXG4gIGFsbG93T3JnSGVhZGVyT3ZlcnJpZGU/OiBib29sZWFuO1xufVxuXG4vKiogSldUIGF1dGggbWlkZGxld2FyZS4gVXNlIGRpcmVjdGx5IG9yIGNhbGwgd2l0aCBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM/OiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4pOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcU9yT3B0aW9ucz86IFJlcXVlc3QgfCBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJlcz86IFJlc3BvbnNlLFxuICBuZXh0PzogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB8ICgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQpIHtcbiAgaWYgKHJlcU9yT3B0aW9ucyAmJiByZXMgJiYgbmV4dCAmJiAnaGVhZGVycycgaW4gcmVxT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9yZXF1aXJlQXV0aCh7fSwgcmVxT3JPcHRpb25zIGFzIFJlcXVlc3QsIHJlcywgbmV4dCk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gKHJlcU9yT3B0aW9ucyBhcyBSZXF1aXJlQXV0aE9wdGlvbnMpIHx8IHt9O1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBQYXNzIHRocm91Z2ggb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlIHZlcmlmaWNhdGlvbiB3aGVuIGVudi1jb25maWd1cmVkLlxuICAgIC8vIFdpdGhvdXQgdGhlc2UsIGEgSldUIHNpZ25lZCBieSBhbnkgc3lzdGVtIHRoYXQgaGFwcGVucyB0byBzaGFyZSB0aGVcbiAgICAvLyBzYW1lIEpXVF9TRUNSRVQgd291bGQgYmUgYWNjZXB0ZWQg4oCUIGRlZmVuY2UtaW4tZGVwdGggZm9yIHNoYXJlZC1zZWNyZXRcbiAgICAvLyBtaXNjb25maWd1cmF0aW9ucyBhY3Jvc3Mgc2VydmljZXMgLyBlbnZpcm9ubWVudHMuXG4gICAgY29uc3QgdmVyaWZ5T3B0aW9uczogand0LlZlcmlmeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBleHBlY3RlZElzc3VlciA9IHByb2Nlc3MuZW52LkpXVF9JU1NVRVI7XG4gICAgY29uc3QgZXhwZWN0ZWRBdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgICBpZiAoZXhwZWN0ZWRJc3N1ZXIpIHZlcmlmeU9wdGlvbnMuaXNzdWVyID0gZXhwZWN0ZWRJc3N1ZXI7XG4gICAgaWYgKGV4cGVjdGVkQXVkaWVuY2UpIHZlcmlmeU9wdGlvbnMuYXVkaWVuY2UgPSBleHBlY3RlZEF1ZGllbmNlO1xuICAgIGNvbnN0IGRlY29kZWQgPSBqd3QudmVyaWZ5KHBhcnRzWzFdLCBnZXRKd3RTZWNyZXQoKSwgdmVyaWZ5T3B0aW9ucykgYXMgSnd0UGF5bG9hZDtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFkbWluIHJvbGUuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIFBlcm1pdHMgdXNlcnMgd2hvc2UgcGVyLW9yZyByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cblxuICBpZiAocmVxLnVzZXIucm9sZSAhPT0gJ2FkbWluJyAmJiByZXEudXNlci5yb2xlICE9PSAnb3duZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnQWRtaW4gYWNjZXNzIHJlcXVpcmVkJywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gIH1cblxuICBuZXh0KCk7XG59XG5cbi8qKiBPcmdhbml6YXRpb24gSUQvbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHN5c3RlbSAoc3VwZXItYWRtaW4pIHRlbmFudC4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX0lEID0gKHByb2Nlc3MuZW52LlNZU1RFTV9PUkdfSUQgfHwgJ3N5c3RlbScpLnRvTG93ZXJDYXNlKCk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gb3JnSWQgb3Igb3JnTmFtZSBtYXRjaGVzIHRoZSBzeXN0ZW0gb3JnLlxuICogVXNlIHRoaXMgaW5zdGVhZCBvZiBjb21wYXJpbmcgZGlyZWN0bHkgYWdhaW5zdCBTWVNURU1fT1JHX0lELFxuICogYmVjYXVzZSB0aGUgSldUIG9yZ0lkIGlzIGEgZGF0YWJhc2UgSUQgKGUuZy4gTW9uZ29EQiBPYmplY3RJZClcbiAqIHdoaWxlIFNZU1RFTV9PUkdfSUQgaXMgdGhlIHdlbGwta25vd24gbmFtZSBcInN5c3RlbVwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdJZChvcmdJZD86IHN0cmluZywgb3JnTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3JnSWQ/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQgfHwgb3JnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gU1lTVEVNX09SR19JRDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGEgc3lzdGVtIGFkbWluLlxuICpcbiAqIEF1dGhvcml0eSBpcyBncmFudGVkIHNvbGVseSBieSB0aGUgdXNlci1sZXZlbCBgaXNTdXBlckFkbWluYCBmbGFnIGNhcnJpZWRcbiAqIGluIHRoZSBKV1QuIFRoZSBcIm1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gJ3N5c3RlbScgb3JnIHdpdGggcm9sZVxuICogYWRtaW4vb3duZXJcIiBwYXRoIHdhcyByZW1vdmVkIOKAlCBpdCBjb25mbGF0ZWQgYSBQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXG4gKiB3aXRoIGEgcmVhbCBjdXN0b21lciB0ZW5hbnQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCBtZWFudCBhbnkgdW5pbnRlbmRlZFxuICogd3JpdGUgdGhhdCBjcmVhdGVkIGEgJ3N5c3RlbSctbmFtZWQgb3JnIGNvdWxkIHF1aWV0bHkgZ3JhbnQgY3Jvc3Mtb3JnXG4gKiBhdXRob3JpdHkuIFRoZSBgc3lzdGVtYCBvcmcgc3RpbGwgZXhpc3RzIGFzIGEgKmNvbnRlbnQgaG9sZGVyKiBmb3Igc2hhcmVkXG4gKiBzYW1wbGUgZGF0YTsgaXQganVzdCBubyBsb25nZXIgY29uZmVycyBwcml2aWxlZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbUFkbWluKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZTtcbn1cblxuLyoqIFJlcXVpcmVzIHN5c3RlbSBhZG1pbiAoYWRtaW4gcm9sZSArIHN5c3RlbSBvcmdhbml6YXRpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTeXN0ZW1BZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFpc1N5c3RlbUFkbWluKHJlcSkpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICdBY2Nlc3MgZGVuaWVkLiBPbmx5IHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gcGVyZm9ybSB0aGlzIGFjdGlvbi4nLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9XG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlIGEgc3BlY2lmaWMgZmVhdHVyZSBmbGFnLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBDaGVja3MgdGhlIGBmZWF0dXJlc2AgYXJyYXkgaW4gdGhlIEpXVCBwYXlsb2FkIChzZXQgYXQgdG9rZW4gaXNzdWFuY2UpLlxuICogU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGJ5cGFzcyDigJQgdGhleSBhbHdheXMgaGF2ZSBldmVyeSBmZWF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKSB7XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cblxuICAgIC8vIFN5c2FkbWlucyBnZXQgYWxsIGZlYXR1cmVzOyB0aGUgYGZlYXR1cmVzYCBhcnJheSBvbiB0aGVpciB0b2tlbiBpc1xuICAgIC8vIHBvcHVsYXRlZCB3aXRoIGV2ZXJ5IGZsYWcgYXQgaXNzdWFuY2UgdGltZSBidXQgdGhlIGJ5cGFzcyBoZXJlIGtlZXBzXG4gICAgLy8gdGhlIHJ1bGUgZXhwbGljaXQgYW5kIHN1cnZpdmVzIGEgdG9rZW4gaXNzdWVkIGJlZm9yZSBhIG5ldyBmZWF0dXJlXG4gICAgLy8gZmxhZyB3YXMgYWRkZWQuXG4gICAgaWYgKHJlcS51c2VyLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkgcmV0dXJuIG5leHQoKTtcblxuICAgIGlmICghcmVxLnVzZXIuZmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICBgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIGEgaGlnaGVyIHBsYW4gKCR7ZmVhdHVyZX0pYCxcbiAgICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBhY2Nlc3MgbW9kaWZpZXIgZm9yIGFuIGVudGl0eSBiZWluZyBjcmVhdGVkL3VwZGF0ZWQuXG4gKiAncHVibGljJyBpcyBwZXJtaXR0ZWQgZm9yIGFueSBhZG1pbiBvciBvd25lciByb2xlIChzeXN0ZW0gYWRtaW5zIGNyZWF0ZVxuICogY2F0YWxvZy13aWRlIHB1YmxpYyBlbnRpdGllczsgb3JnIGFkbWlucyBjcmVhdGUgb3JnLXdpZGUgcHVibGljIGVudGl0aWVzKS5cbiAqIEV2ZXJ5b25lIGVsc2UgKG1lbWJlciByb2xlLCBubyByb2xlKSBnZXRzICdwcml2YXRlJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY2Nlc3NNb2RpZmllcihyZXE6IFJlcXVlc3QsIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogJ3B1YmxpYycgfCAncHJpdmF0ZScge1xuICBpZiAocmVxdWVzdGVkID09PSAncHVibGljJyAmJiAocmVxLnVzZXI/LnJvbGUgPT09ICdhZG1pbicgfHwgcmVxLnVzZXI/LnJvbGUgPT09ICdvd25lcicpKSB7XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiAncHJpdmF0ZSc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBKV1Qgc2lnbmVkIHdpdGggdGhlIHNoYXJlZFxuLy8gSldUX1NFQ1JFVCwgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuXG4vLyBgcmVxdWlyZUF1dGhgIGFjY2VwdHMgdGhlc2UgdG9rZW5zIHRyYW5zcGFyZW50bHkg4oCUIHRoZXkgcGFzcyBgZGVjb2RlZC5zdWJgXG4vLyBhbmQgYGRlY29kZWQucm9sZWAgY2hlY2tzLCBhbmQgZG93bnN0cmVhbSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAgL1xuLy8gYHJlcXVpcmVBZG1pbmAgcmVseSBvbiB0aGUgb3JnL3JvbGUgZW1iZWRkZWQgaW4gdGhlIHRva2VuLlxuLy9cbi8vIFRva2VucyBkZWZhdWx0IHRvIDUtbWludXRlIFRUTCDigJQgbG9uZyBlbm91Z2ggdG8gc3Vydml2ZSBhIGJhY2tlbmQgaG9wLFxuLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBsZWFrZWQgdG9rZW4gaXMgbG93LXZhbHVlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyA9IDMwMDtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVG9rZW5PcHRpb25zIHtcbiAgLyoqIENhbGxpbmcgc2VydmljZSBpZGVudGlmaWVyIChlLmcuICdiaWxsaW5nJywgJ3BsYXRmb3JtJykuIEVtYmVkZGVkIGFzIGBzdWI6IHNlcnZpY2U6PG5hbWU+YC4gKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgY29udGV4dCBmb3IgdGhlIGNhbGwuIFVzZSB0aGUgdGFyZ2V0IHRlbmFudCdzIG9yZyBJRCwgb3IgJ3N5c3RlbScgZm9yIHN5c3RlbS13aWRlIG9wcy4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBNaW50IGEgSldUIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UuIFVzZWQgZm9yIGludGVyLXNlcnZpY2UgSFRUUCBjYWxscy5cbiAqIFRoZSB0b2tlbiBzYXRpc2ZpZXMgYHJlcXVpcmVBdXRoYCBhbmQgKHdoZW4gb3JnSWQgaXMgcHJlc2VudCkgYHJlcXVpcmVPcmdhbml6YXRpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcGF5bG9hZDogSnd0UGF5bG9hZCA9IHtcbiAgICBzdWI6IGBzZXJ2aWNlOiR7b3B0cy5zZXJ2aWNlTmFtZX1gLFxuICAgIHVzZXJuYW1lOiBgJHtvcHRzLnNlcnZpY2VOYW1lfS1zZXJ2aWNlYCxcbiAgICBlbWFpbDogYCR7b3B0cy5zZXJ2aWNlTmFtZX1AaW50ZXJuYWxgLFxuICAgIHJvbGU6ICdvd25lcicsXG4gICAgaXNBZG1pbjogdHJ1ZSxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgfTtcbiAgLy8gTWF0Y2ggdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoIHZlcmlmaWVzLCB3aGVuXG4gIC8vIGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhlc2UsIGEgc2VydmljZSB0b2tlbiBzaWduZWQgaGVyZSB3b3VsZCBmYWlsXG4gIC8vIHJlcXVpcmVBdXRoIGluIGEgZGVwbG95bWVudCB0aGF0IGhhcyBzZXQgSldUX0lTU1VFUi9KV1RfQVVESUVOQ0UuXG4gIGNvbnN0IHNpZ25PcHRpb25zOiBqd3QuU2lnbk9wdGlvbnMgPSB7XG4gICAgZXhwaXJlc0luOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICB9O1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0lTU1VFUikgc2lnbk9wdGlvbnMuaXNzdWVyID0gcHJvY2Vzcy5lbnYuSldUX0lTU1VFUjtcbiAgaWYgKHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRSkgc2lnbk9wdGlvbnMuYXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gIHJldHVybiBqd3Quc2lnbihwYXlsb2FkLCBnZXRKd3RTZWNyZXQoKSwgc2lnbk9wdGlvbnMpO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlci5zdWJgIHdhcyBpc3N1ZWQgYnkgYHNpZ25TZXJ2aWNlVG9rZW5gIChpLmUuIHN0YXJ0cyB3aXRoIGBzZXJ2aWNlOmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5zdWI/LnN0YXJ0c1dpdGgoJ3NlcnZpY2U6JykgPz8gZmFsc2U7XG59XG4iXX0=
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7OztBQTJEdEMsa0NBYUM7QUFrRUQsb0NBY0M7QUFXRCxzQ0FFQztBQWFELHNDQUVDO0FBR0QsZ0RBYUM7QUFPRCx3Q0FzQkM7QUFRRCxzREFLQztBQTJDRCw0Q0FxQkM7QUFHRCxvREFFQztBQUdELGdEQUVDO0FBclRELGdFQUErQjtBQUMvQiwwREFBc0Q7QUFFdEQsc0RBQWlEO0FBQ2pELDhDQUFtRDtBQUNuRCw0Q0FBK0M7QUFDL0MsZ0RBQThDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRS9DLDREQUE0RDtBQUM1RCxJQUFJLFVBQThCLENBQUM7QUFDbkMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSw4QkFBOEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxZQUFZO0FBRTVELFNBQVMsWUFBWTtJQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxHQUFHLEdBQUcscUJBQXFCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztRQUNoRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQTBCRCxTQUFnQixXQUFXLENBQ3pCLFlBQTJDLEVBQzNDLEdBQWMsRUFDZCxJQUFtQjtJQUVuQixJQUFJLFlBQVksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxPQUFPLFlBQVksQ0FBQyxFQUFFLEVBQUUsWUFBdUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFJLFlBQW1DLElBQUksRUFBRSxDQUFDO0lBQzNELE9BQU8sQ0FBQyxHQUFZLEVBQUUsUUFBa0IsRUFBRSxTQUF1QixFQUFFLEVBQUU7UUFDbkUsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsT0FBMkIsRUFDM0IsR0FBWSxFQUNaLEdBQWEsRUFDYixJQUFrQjtJQUVsQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUU3QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxJQUFBLG9CQUFTLEVBQUMsR0FBRyxFQUFFLHdCQUFVLENBQUMsWUFBWSxFQUFFLCtCQUErQixFQUFFLHVCQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEQsT0FBTyxJQUFBLG9CQUFTLEVBQUMsR0FBRyxFQUFFLHdCQUFVLENBQUMsWUFBWSxFQUFFLG1EQUFtRCxFQUFFLHVCQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLG9EQUFvRDtRQUNwRCxNQUFNLGFBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDbEQsSUFBSSxjQUFjO1lBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDMUQsSUFBSSxnQkFBZ0I7WUFBRSxhQUFhLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLHNCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxhQUFhLENBQWUsQ0FBQztRQUVsRixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFBLG9CQUFTLEVBQUMsR0FBRyxFQUFFLHdCQUFVLENBQUMsWUFBWSxFQUFFLGlEQUFpRCxFQUFFLHVCQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0gsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBQSxvQkFBUyxFQUFDLEdBQUcsRUFBRSx3QkFBVSxDQUFDLFlBQVksRUFBRSwrQkFBK0IsRUFBRSx1QkFBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUUxQixJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUEseUJBQWUsRUFBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsTUFBTSxhQUFhLEdBQUcsSUFBQSx5QkFBZSxFQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLFdBQVc7Z0JBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDO1lBQ3ZELElBQUksYUFBYTtnQkFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztRQUMvRCxDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLHNCQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUEsb0JBQVMsRUFBQyxHQUFHLEVBQUUsd0JBQVUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsdUJBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsSUFBSSxLQUFLLFlBQVksc0JBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBQSxvQkFBUyxFQUFDLEdBQUcsRUFBRSx3QkFBVSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsdUJBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQsT0FBTyxJQUFBLG9CQUFTLEVBQUMsR0FBRyxFQUFFLHdCQUFVLENBQUMsWUFBWSxFQUFFLHVCQUF1QixFQUFFLHVCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEcsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQzFCLEdBQVksRUFDWixHQUFhLEVBQ2IsSUFBa0I7SUFFbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBQSxvQkFBUyxFQUFDLEdBQUcsRUFBRSx3QkFBVSxDQUFDLFlBQVksRUFBRSx5QkFBeUIsRUFBRSx1QkFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMzRCxPQUFPLElBQUEsb0JBQVMsRUFBQyxHQUFHLEVBQUUsd0JBQVUsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsdUJBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCw0RUFBNEU7QUFDL0QsUUFBQSxhQUFhLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxLQUFjLEVBQUUsT0FBZ0I7SUFDNUQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUsscUJBQWEsSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUsscUJBQWEsQ0FBQztBQUM1RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxHQUFZO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEtBQUssSUFBSSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxnRUFBZ0U7QUFDaEUsU0FBZ0Isa0JBQWtCLENBQ2hDLEdBQVksRUFDWixHQUFhLEVBQ2IsSUFBa0I7SUFFbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBQSxvQkFBUyxFQUNkLEdBQUcsRUFBRSx3QkFBVSxDQUFDLFNBQVMsRUFDekIsb0VBQW9FLEVBQ3BFLHVCQUFTLENBQUMsd0JBQXdCLENBQ25DLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLE9BQU8sQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQVEsRUFBRTtRQUMvRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFBLG9CQUFTLEVBQUMsR0FBRyxFQUFFLHdCQUFVLENBQUMsWUFBWSxFQUFFLHlCQUF5QixFQUFFLHVCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLGtCQUFrQjtRQUNsQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUEsb0JBQVMsRUFDZCxHQUFHLEVBQUUsd0JBQVUsQ0FBQyxTQUFTLEVBQ3pCLHdDQUF3QyxPQUFPLEdBQUcsRUFDbEQsdUJBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLEdBQVksRUFBRSxTQUE2QjtJQUMvRSxJQUFJLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN6RixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSw0QkFBNEI7QUFDNUIsRUFBRTtBQUNGLDRFQUE0RTtBQUM1RSxzRUFBc0U7QUFDdEUsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSw2RUFBNkU7QUFDN0Usb0VBQW9FO0FBQ3BFLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGlEQUFpRDtBQUNqRCw4RUFBOEU7QUFFOUUsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUM7QUFxQjlDOzs7O0dBSUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUF5QjtJQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQztJQUNsQyxNQUFNLE9BQU8sR0FBZTtRQUMxQixHQUFHLEVBQUUsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2xDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLFVBQVU7UUFDdkMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsV0FBVztRQUNyQyxJQUFJO1FBQ0osT0FBTyxFQUFFLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLE9BQU87UUFDN0MsSUFBSSxFQUFFLFFBQVE7UUFDZCxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDMUIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSztLQUM3QyxDQUFDO0lBQ0YscUVBQXFFO0lBQ3JFLG9FQUFvRTtJQUNwRSxvRUFBb0U7SUFDcEUsTUFBTSxXQUFXLEdBQW9CO1FBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLGlDQUFpQztLQUNoRSxDQUFDO0lBQ0YsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7UUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQ3hFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZO1FBQUUsV0FBVyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUM5RSxPQUFPLHNCQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLFNBQWdCLG9CQUFvQixDQUFDLElBQXlCO0lBQzVELE9BQU8sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzVDLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsU0FBZ0Isa0JBQWtCLENBQUMsR0FBWTtJQUM3QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzJztcbmltcG9ydCB7IEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24nO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuXG4vKiogQ2FjaGVkIEpXVCBzZWNyZXQgd2l0aCBwZXJpb2RpYyByZWZyZXNoIGZyb20gZW52IHZhci4gKi9cbmxldCBfand0U2VjcmV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgX2p3dFNlY3JldFJlZnJlc2hlZEF0ID0gMDtcbmNvbnN0IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG5mdW5jdGlvbiBnZXRKd3RTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFfand0U2VjcmV0IHx8IG5vdyAtIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA+IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIGNvbnN0IHNlY3JldCA9IHByb2Nlc3MuZW52LkpXVF9TRUNSRVQ7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSldUX1NFQ1JFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKF9qd3RTZWNyZXQgJiYgX2p3dFNlY3JldCAhPT0gc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuaW5mbygnSldUIHNlY3JldCByb3RhdGVkJyk7XG4gICAgfVxuICAgIF9qd3RTZWNyZXQgPSBzZWNyZXQ7XG4gICAgX2p3dFNlY3JldFJlZnJlc2hlZEF0ID0gbm93O1xuICB9XG4gIHJldHVybiBfand0U2VjcmV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqICoqU0VDVVJJVFkgV0FSTklORzoqKiBXaGVuIGVuYWJsZWQsIGEgY2FsbGVyIGNhbiBzZXQgYHgtb3JnLWlkYCB0byBBTllcbiAgICogb3JnYW5pemF0aW9uIElELCBlZmZlY3RpdmVseSBpbXBlcnNvbmF0aW5nIHRoYXQgb3JnLiBUaGlzIE1VU1Qgb25seSBiZVxuICAgKiB1c2VkIG9uIHJvdXRlcyB0aGF0IGFyZTpcbiAgICogICAxLiBJbnRlcm5hbCBzZXJ2aWNlLXRvLXNlcnZpY2Ugcm91dGVzIChub3QgZXhwb3NlZCB0byBlbmQgdXNlcnMpXG4gICAqICAgMi4gQmVoaW5kIG5ldHdvcmsgaXNvbGF0aW9uIChjb250YWluZXIgbmV0d29yaywgVlBDLCBldGMuKVxuICAgKlxuICAgKiBORVZFUiBlbmFibGUgdGhpcyBvbiB1c2VyLWZhY2luZyBBUEkgcm91dGVzLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgX3JlcXVpcmVBdXRoKG9wdGlvbnMsIHJlcSwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFBhc3MgdGhyb3VnaCBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2UgdmVyaWZpY2F0aW9uIHdoZW4gZW52LWNvbmZpZ3VyZWQuXG4gICAgLy8gV2l0aG91dCB0aGVzZSwgYSBKV1Qgc2lnbmVkIGJ5IGFueSBzeXN0ZW0gdGhhdCBoYXBwZW5zIHRvIHNoYXJlIHRoZVxuICAgIC8vIHNhbWUgSldUX1NFQ1JFVCB3b3VsZCBiZSBhY2NlcHRlZCDigJQgZGVmZW5jZS1pbi1kZXB0aCBmb3Igc2hhcmVkLXNlY3JldFxuICAgIC8vIG1pc2NvbmZpZ3VyYXRpb25zIGFjcm9zcyBzZXJ2aWNlcyAvIGVudmlyb25tZW50cy5cbiAgICBjb25zdCB2ZXJpZnlPcHRpb25zOiBqd3QuVmVyaWZ5T3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IGV4cGVjdGVkSXNzdWVyID0gcHJvY2Vzcy5lbnYuSldUX0lTU1VFUjtcbiAgICBjb25zdCBleHBlY3RlZEF1ZGllbmNlID0gcHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFO1xuICAgIGlmIChleHBlY3RlZElzc3VlcikgdmVyaWZ5T3B0aW9ucy5pc3N1ZXIgPSBleHBlY3RlZElzc3VlcjtcbiAgICBpZiAoZXhwZWN0ZWRBdWRpZW5jZSkgdmVyaWZ5T3B0aW9ucy5hdWRpZW5jZSA9IGV4cGVjdGVkQXVkaWVuY2U7XG4gICAgY29uc3QgZGVjb2RlZCA9IGp3dC52ZXJpZnkocGFydHNbMV0sIGdldEp3dFNlY3JldCgpLCB2ZXJpZnlPcHRpb25zKSBhcyBKd3RQYXlsb2FkO1xuXG4gICAgaWYgKGRlY29kZWQudHlwZSAhPT0gJ2FjY2VzcycpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ09ubHkgYWNjZXNzIHRva2VucyBjYW4gYmUgdXNlZCBmb3IgQVBJIHJlcXVlc3RzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIGlmICghZGVjb2RlZC5zdWIgfHwgIWRlY29kZWQucm9sZSkge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmVxLnVzZXIgPSB7IC4uLmRlY29kZWQgfTtcblxuICAgIGlmIChvcHRpb25zLmFsbG93T3JnSGVhZGVyT3ZlcnJpZGUpIHtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ0lkID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1pZCddKTtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ05hbWUgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLW5hbWUnXSk7XG4gICAgICBpZiAoaGVhZGVyT3JnSWQpIHJlcS51c2VyLm9yZ2FuaXphdGlvbklkID0gaGVhZGVyT3JnSWQ7XG4gICAgICBpZiAoaGVhZGVyT3JnTmFtZSkgcmVxLnVzZXIub3JnYW5pemF0aW9uTmFtZSA9IGhlYWRlck9yZ05hbWU7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Ub2tlbkV4cGlyZWRFcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gaGFzIGV4cGlyZWQnLCBFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygand0Lkpzb25XZWJUb2tlbkVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIHRva2VuJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgYWRtaW4gcm9sZS4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLlxuICogUGVybWl0cyB1c2VycyB3aG9zZSBwZXItb3JnIHJvbGUgaXMgJ2FkbWluJyBvciAnb3duZXInLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFkbWluKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBpZiAoIXJlcS51c2VyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxuXG4gIGlmIChyZXEudXNlci5yb2xlICE9PSAnYWRtaW4nICYmIHJlcS51c2VyLnJvbGUgIT09ICdvd25lcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sICdBZG1pbiBhY2Nlc3MgcmVxdWlyZWQnLCBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TKTtcbiAgfVxuXG4gIG5leHQoKTtcbn1cblxuLyoqIE9yZ2FuaXphdGlvbiBJRC9uYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgc3lzdGVtIChzdXBlci1hZG1pbikgdGVuYW50LiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfSUQgPSAocHJvY2Vzcy5lbnYuU1lTVEVNX09SR19JRCB8fCAnc3lzdGVtJykudG9Mb3dlckNhc2UoKTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBvcmdJZCBvciBvcmdOYW1lIG1hdGNoZXMgdGhlIHN5c3RlbSBvcmcuXG4gKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGNvbXBhcmluZyBkaXJlY3RseSBhZ2FpbnN0IFNZU1RFTV9PUkdfSUQsXG4gKiBiZWNhdXNlIHRoZSBKV1Qgb3JnSWQgaXMgYSBkYXRhYmFzZSBJRCAoZS5nLiBNb25nb0RCIE9iamVjdElkKVxuICogd2hpbGUgU1lTVEVNX09SR19JRCBpcyB0aGUgd2VsbC1rbm93biBuYW1lIFwic3lzdGVtXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ0lkKG9yZ0lkPzogc3RyaW5nLCBvcmdOYW1lPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcmdJZD8udG9Mb3dlckNhc2UoKSA9PT0gU1lTVEVNX09SR19JRCB8fCBvcmdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gYSBzeXN0ZW0gYWRtaW4uXG4gKlxuICogQXV0aG9yaXR5IGlzIGdyYW50ZWQgc29sZWx5IGJ5IHRoZSB1c2VyLWxldmVsIGBpc1N1cGVyQWRtaW5gIGZsYWcgY2FycmllZFxuICogaW4gdGhlIEpXVC4gVGhlIFwibWVtYmVyc2hpcCBpbiB0aGUgd2VsbC1rbm93biAnc3lzdGVtJyBvcmcgd2l0aCByb2xlXG4gKiBhZG1pbi9vd25lclwiIHBhdGggd2FzIHJlbW92ZWQg4oCUIGl0IGNvbmZsYXRlZCBhIFBpcGVsaW5lIEJ1aWxkZXIgb3BlcmF0b3JcbiAqIHdpdGggYSByZWFsIGN1c3RvbWVyIHRlbmFudCBpbiB0aGUgZGF0YSBtb2RlbCwgYW5kIG1lYW50IGFueSB1bmludGVuZGVkXG4gKiB3cml0ZSB0aGF0IGNyZWF0ZWQgYSAnc3lzdGVtJy1uYW1lZCBvcmcgY291bGQgcXVpZXRseSBncmFudCBjcm9zcy1vcmdcbiAqIGF1dGhvcml0eS4gVGhlIGBzeXN0ZW1gIG9yZyBzdGlsbCBleGlzdHMgYXMgYSAqY29udGVudCBob2xkZXIqIGZvciBzaGFyZWRcbiAqIHNhbXBsZSBkYXRhOyBpdCBqdXN0IG5vIGxvbmdlciBjb25mZXJzIHByaXZpbGVnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtQWRtaW4ocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8uaXNTdXBlckFkbWluID09PSB0cnVlO1xufVxuXG4vKiogUmVxdWlyZXMgc3lzdGVtIGFkbWluIChhZG1pbiByb2xlICsgc3lzdGVtIG9yZ2FuaXphdGlvbikuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVN5c3RlbUFkbWluKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBpZiAoIWlzU3lzdGVtQWRtaW4ocmVxKSkge1xuICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgJ0FjY2VzcyBkZW5pZWQuIE9ubHkgc3lzdGVtIGFkbWluaXN0cmF0b3JzIGNhbiBwZXJmb3JtIHRoaXMgYWN0aW9uLicsXG4gICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICk7XG4gIH1cbiAgbmV4dCgpO1xufVxuXG4vKipcbiAqIFJlcXVpcmUgYSBzcGVjaWZpYyBmZWF0dXJlIGZsYWcuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIENoZWNrcyB0aGUgYGZlYXR1cmVzYCBhcnJheSBpbiB0aGUgSldUIHBheWxvYWQgKHNldCBhdCB0b2tlbiBpc3N1YW5jZSkuXG4gKiBTeXNhZG1pbnMgKGlzU3VwZXJBZG1pbikgYnlwYXNzIOKAlCB0aGV5IGFsd2F5cyBoYXZlIGV2ZXJ5IGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlRmVhdHVyZShmZWF0dXJlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuXG4gICAgLy8gU3lzYWRtaW5zIGdldCBhbGwgZmVhdHVyZXM7IHRoZSBgZmVhdHVyZXNgIGFycmF5IG9uIHRoZWlyIHRva2VuIGlzXG4gICAgLy8gcG9wdWxhdGVkIHdpdGggZXZlcnkgZmxhZyBhdCBpc3N1YW5jZSB0aW1lIGJ1dCB0aGUgYnlwYXNzIGhlcmUga2VlcHNcbiAgICAvLyB0aGUgcnVsZSBleHBsaWNpdCBhbmQgc3Vydml2ZXMgYSB0b2tlbiBpc3N1ZWQgYmVmb3JlIGEgbmV3IGZlYXR1cmVcbiAgICAvLyBmbGFnIHdhcyBhZGRlZC5cbiAgICBpZiAocmVxLnVzZXIuaXNTdXBlckFkbWluID09PSB0cnVlKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgaWYgKCFyZXEudXNlci5mZWF0dXJlcz8uaW5jbHVkZXMoZmVhdHVyZSkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgIGBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgYSBoaWdoZXIgcGxhbiAoJHtmZWF0dXJlfSlgLFxuICAgICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIGFjY2VzcyBtb2RpZmllciBmb3IgYW4gZW50aXR5IGJlaW5nIGNyZWF0ZWQvdXBkYXRlZC5cbiAqICdwdWJsaWMnIGlzIHBlcm1pdHRlZCBmb3IgYW55IGFkbWluIG9yIG93bmVyIHJvbGUgKHN5c3RlbSBhZG1pbnMgY3JlYXRlXG4gKiBjYXRhbG9nLXdpZGUgcHVibGljIGVudGl0aWVzOyBvcmcgYWRtaW5zIGNyZWF0ZSBvcmctd2lkZSBwdWJsaWMgZW50aXRpZXMpLlxuICogRXZlcnlvbmUgZWxzZSAobWVtYmVyIHJvbGUsIG5vIHJvbGUpIGdldHMgJ3ByaXZhdGUnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFjY2Vzc01vZGlmaWVyKHJlcTogUmVxdWVzdCwgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiAncHVibGljJyB8ICdwcml2YXRlJyB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnICYmIChyZXEudXNlcj8ucm9sZSA9PT0gJ2FkbWluJyB8fCByZXEudXNlcj8ucm9sZSA9PT0gJ293bmVyJykpIHtcbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zXG4vL1xuLy8gSW50ZXItc2VydmljZSBIVFRQIGNhbGxzIChiaWxsaW5nIOKGkiBtZXNzYWdlLCBwbGF0Zm9ybSDihpIgY29tcGxpYW5jZSwgZXRjLilcbi8vIG5lZWQgdG8gc2F0aXNmeSB0aGUgc2FtZSBgcmVxdWlyZUF1dGhgIG1pZGRsZXdhcmUgYXMgdXNlciByZXF1ZXN0cy5cbi8vIGBzaWduU2VydmljZVRva2VuYCBtaW50cyBhIHNob3J0LWxpdmVkIEpXVCBzaWduZWQgd2l0aCB0aGUgc2hhcmVkXG4vLyBKV1RfU0VDUkVULCBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBzZXJ2aWNlIHZpYSBgc3ViOiAnc2VydmljZTo8bmFtZT4nYC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCBkb3duc3RyZWFtIGByZXF1aXJlT3JnYW5pemF0aW9uYCAvXG4vLyBgcmVxdWlyZUFkbWluYCByZWx5IG9uIHRoZSBvcmcvcm9sZSBlbWJlZGRlZCBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gVG9rZW5zIGRlZmF1bHQgdG8gNS1taW51dGUgVFRMIOKAlCBsb25nIGVub3VnaCB0byBzdXJ2aXZlIGEgYmFja2VuZCBob3AsXG4vLyBzaG9ydCBlbm91Z2ggdGhhdCBhIGxlYWtlZCB0b2tlbiBpcyBsb3ctdmFsdWUuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTID0gMzAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VUb2tlbk9wdGlvbnMge1xuICAvKiogQ2FsbGluZyBzZXJ2aWNlIGlkZW50aWZpZXIgKGUuZy4gJ2JpbGxpbmcnLCAncGxhdGZvcm0nKS4gRW1iZWRkZWQgYXMgYHN1Yjogc2VydmljZTo8bmFtZT5gLiAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZyBjb250ZXh0IGZvciB0aGUgY2FsbC4gVXNlIHRoZSB0YXJnZXQgdGVuYW50J3Mgb3JnIElELCBvciAnc3lzdGVtJyBmb3Igc3lzdGVtLXdpZGUgb3BzLiAqL1xuICBvcmdJZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgbmFtZS4gRGVmYXVsdHMgdG8gb3JnSWQuICovXG4gIG9yZ05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDApLiAqL1xuICB0dGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogUm9sZSB0aGUgdG9rZW4gY2Fycmllcy4gRGVmYXVsdHMgdG8gYCdvd25lcidgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IOKAlFxuICAgKiBtYW55IGV4aXN0aW5nIGludGVyLXNlcnZpY2UgY2FsbHMgaGl0IGFkbWluLWdhdGVkIGVuZHBvaW50cy4gKipQYXNzIHRoZVxuICAgKiBMT1dFU1Qgcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZVxuICAgKiBjYWxscykgc28gYSBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldFxuICAgKiBvcmcuIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZT86ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG59XG5cbi8qKlxuICogTWludCBhIEpXVCBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBzZXJ2aWNlLiBVc2VkIGZvciBpbnRlci1zZXJ2aWNlIEhUVFAgY2FsbHMuXG4gKiBUaGUgdG9rZW4gc2F0aXNmaWVzIGByZXF1aXJlQXV0aGAgYW5kICh3aGVuIG9yZ0lkIGlzIHByZXNlbnQpIGByZXF1aXJlT3JnYW5pemF0aW9uYC5cbiAqIFNjb3BlIGl0IHdpdGggYG9wdHMucm9sZWAg4oCUIGxlYXN0IHByaXZpbGVnZSBrZWVwcyBhIGxlYWtlZCB0b2tlbiBsb3ctdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduU2VydmljZVRva2VuKG9wdHM6IFNlcnZpY2VUb2tlbk9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCByb2xlID0gb3B0cy5yb2xlID8/ICdvd25lcic7XG4gIGNvbnN0IHBheWxvYWQ6IEp3dFBheWxvYWQgPSB7XG4gICAgc3ViOiBgc2VydmljZToke29wdHMuc2VydmljZU5hbWV9YCxcbiAgICB1c2VybmFtZTogYCR7b3B0cy5zZXJ2aWNlTmFtZX0tc2VydmljZWAsXG4gICAgZW1haWw6IGAke29wdHMuc2VydmljZU5hbWV9QGludGVybmFsYCxcbiAgICByb2xlLFxuICAgIGlzQWRtaW46IHJvbGUgPT09ICdvd25lcicgfHwgcm9sZSA9PT0gJ2FkbWluJyxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgfTtcbiAgLy8gTWF0Y2ggdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoIHZlcmlmaWVzLCB3aGVuXG4gIC8vIGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhlc2UsIGEgc2VydmljZSB0b2tlbiBzaWduZWQgaGVyZSB3b3VsZCBmYWlsXG4gIC8vIHJlcXVpcmVBdXRoIGluIGEgZGVwbG95bWVudCB0aGF0IGhhcyBzZXQgSldUX0lTU1VFUi9KV1RfQVVESUVOQ0UuXG4gIGNvbnN0IHNpZ25PcHRpb25zOiBqd3QuU2lnbk9wdGlvbnMgPSB7XG4gICAgZXhwaXJlc0luOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICB9O1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0lTU1VFUikgc2lnbk9wdGlvbnMuaXNzdWVyID0gcHJvY2Vzcy5lbnYuSldUX0lTU1VFUjtcbiAgaWYgKHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRSkgc2lnbk9wdGlvbnMuYXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gIHJldHVybiBqd3Quc2lnbihwYXlsb2FkLCBnZXRKd3RTZWNyZXQoKSwgc2lnbk9wdGlvbnMpO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlci5zdWJgIHdhcyBpc3N1ZWQgYnkgYHNpZ25TZXJ2aWNlVG9rZW5gIChpLmUuIHN0YXJ0cyB3aXRoIGBzZXJ2aWNlOmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5zdWI/LnN0YXJ0c1dpdGgoJ3NlcnZpY2U6JykgPz8gZmFsc2U7XG59XG4iXX0=
|
|
@@ -14,8 +14,21 @@
|
|
|
14
14
|
* doc lives) including any payload-specific fields.
|
|
15
15
|
* 3. Emit via `emitAudit(logger, 'event.name', { … })` from the route.
|
|
16
16
|
*/
|
|
17
|
+
/**
|
|
18
|
+
* Correlation context shared by every cross-service audit event. Optional so
|
|
19
|
+
* existing emit sites compile unchanged; when populated, these let an operator
|
|
20
|
+
* pivot a Loki audit line to the originating HTTP request (`requestId`) or the
|
|
21
|
+
* end-to-end distributed trace (`traceId`) — and line them up with platform's
|
|
22
|
+
* MongoDB audit events, which carry the same two fields.
|
|
23
|
+
*/
|
|
24
|
+
export interface AuditCorrelation {
|
|
25
|
+
/** Originating request id (propagated `x-request-id`). */
|
|
26
|
+
requestId?: string;
|
|
27
|
+
/** OpenTelemetry trace id of the active span, when tracing is enabled. */
|
|
28
|
+
traceId?: string;
|
|
29
|
+
}
|
|
17
30
|
/** Tag-copy emitted from image-registry's POST /api/images/copy. */
|
|
18
|
-
export interface RegistryTagCopyAudit {
|
|
31
|
+
export interface RegistryTagCopyAudit extends AuditCorrelation {
|
|
19
32
|
event: 'registry.tag.copy';
|
|
20
33
|
actor: string;
|
|
21
34
|
source: string;
|
|
@@ -30,7 +43,7 @@ export interface RegistryTagCopyAudit {
|
|
|
30
43
|
};
|
|
31
44
|
}
|
|
32
45
|
/** Tag-delete emitted from image-registry's DELETE /api/images/:name/manifests/:reference. */
|
|
33
|
-
export interface RegistryTagDeleteAudit {
|
|
46
|
+
export interface RegistryTagDeleteAudit extends AuditCorrelation {
|
|
34
47
|
event: 'registry.tag.delete';
|
|
35
48
|
actor: string;
|
|
36
49
|
repo: string;
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
3
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2F1ZGl0LWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIENyb3NzLXNlcnZpY2UgYXVkaXQgZXZlbnRzIGVtaXR0ZWQgdmlhIHN0cnVjdHVyZWQgbG9ncy5cbiAqXG4gKiBQbGF0Zm9ybSdzIG93biBhdWRpdCBldmVudHMgKHVzZXIubG9naW4sIG9yZy5jcmVhdGUsIOKApikgbGl2ZSBpbiBNb25nb0RCXG4gKiB2aWEgdGhlIEF1ZGl0RXZlbnQgbW9kZWwg4oCUIHRoYXQncyBhIHNlcGFyYXRlIHBlcnNpc3RlbmNlIHBhdGggc2NvcGVkIHRvXG4gKiB0aGUgcGxhdGZvcm0gc2VydmljZS4gVGhlIGV2ZW50cyBiZWxvdyBhcmUgZW1pdHRlZCBieSBvdGhlciBzZXJ2aWNlc1xuICogKGltYWdlLXJlZ2lzdHJ5LCBldGMuKSB2aWEgdGhlIGBlbWl0QXVkaXRgIGhlbHBlciBhcyBzdHJ1Y3R1cmVkIGxvZ1xuICogbGluZXMgd2l0aCBgZXZlbnRDYXRlZ29yeTogJ2F1ZGl0J2AsIHNjcmFwZWQgYnkgTG9raSBmb3IgcXVlcnlhYmxlXG4gKiBhdWRpdCBoaXN0b3J5LlxuICpcbiAqIEFkZCBhIG5ldyBldmVudDpcbiAqICAgMS4gRXh0ZW5kIHRoZSB1bmlvbiB0eXBlIGJlbG93LlxuICogICAyLiBEb2N1bWVudCBpdCBpbiBgZG9jcy9hdWRpdC1ldmVudHMubWRgIChvciB3aGVyZXZlciB0aGUgYXVkaXQtZXZlbnRzXG4gKiAgICAgIGRvYyBsaXZlcykgaW5jbHVkaW5nIGFueSBwYXlsb2FkLXNwZWNpZmljIGZpZWxkcy5cbiAqICAgMy4gRW1pdCB2aWEgYGVtaXRBdWRpdChsb2dnZXIsICdldmVudC5uYW1lJywgeyDigKYgfSlgIGZyb20gdGhlIHJvdXRlLlxuICovXG5cbi8qKlxuICogQ29ycmVsYXRpb24gY29udGV4dCBzaGFyZWQgYnkgZXZlcnkgY3Jvc3Mtc2VydmljZSBhdWRpdCBldmVudC4gT3B0aW9uYWwgc29cbiAqIGV4aXN0aW5nIGVtaXQgc2l0ZXMgY29tcGlsZSB1bmNoYW5nZWQ7IHdoZW4gcG9wdWxhdGVkLCB0aGVzZSBsZXQgYW4gb3BlcmF0b3JcbiAqIHBpdm90IGEgTG9raSBhdWRpdCBsaW5lIHRvIHRoZSBvcmlnaW5hdGluZyBIVFRQIHJlcXVlc3QgKGByZXF1ZXN0SWRgKSBvciB0aGVcbiAqIGVuZC10by1lbmQgZGlzdHJpYnV0ZWQgdHJhY2UgKGB0cmFjZUlkYCkg4oCUIGFuZCBsaW5lIHRoZW0gdXAgd2l0aCBwbGF0Zm9ybSdzXG4gKiBNb25nb0RCIGF1ZGl0IGV2ZW50cywgd2hpY2ggY2FycnkgdGhlIHNhbWUgdHdvIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdENvcnJlbGF0aW9uIHtcbiAgLyoqIE9yaWdpbmF0aW5nIHJlcXVlc3QgaWQgKHByb3BhZ2F0ZWQgYHgtcmVxdWVzdC1pZGApLiAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKiBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIG9mIHRoZSBhY3RpdmUgc3Bhbiwgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuICovXG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBUYWctY29weSBlbWl0dGVkIGZyb20gaW1hZ2UtcmVnaXN0cnkncyBQT1NUIC9hcGkvaW1hZ2VzL2NvcHkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5VGFnQ29weUF1ZGl0IGV4dGVuZHMgQXVkaXRDb3JyZWxhdGlvbiB7XG4gIGV2ZW50OiAncmVnaXN0cnkudGFnLmNvcHknO1xuICBhY3Rvcjogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbiAgdGFyZ2V0OiBzdHJpbmc7XG4gIHNvdXJjZURpZ2VzdDogc3RyaW5nO1xuICB0YXJnZXREaWdlc3Q6IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0YXJnZXQncyByZXBvIHN0YXJ0cyB3aXRoIGBzeXN0ZW0vYCDigJQgdGhlIGhpZ2hlc3QtcHJpdmlsZWdlIGNhc2UuICovXG4gIGlzUHJvbW90aW9uVG9TeXN0ZW06IGJvb2xlYW47XG4gIG1vdW50ZWQ6IHsgbWFuaWZlc3RzOiBudW1iZXI7IGJsb2JzOiBudW1iZXIgfTtcbn1cblxuLyoqIFRhZy1kZWxldGUgZW1pdHRlZCBmcm9tIGltYWdlLXJlZ2lzdHJ5J3MgREVMRVRFIC9hcGkvaW1hZ2VzLzpuYW1lL21hbmlmZXN0cy86cmVmZXJlbmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVRhZ0RlbGV0ZUF1ZGl0IGV4dGVuZHMgQXVkaXRDb3JyZWxhdGlvbiB7XG4gIGV2ZW50OiAncmVnaXN0cnkudGFnLmRlbGV0ZSc7XG4gIGFjdG9yOiBzdHJpbmc7XG4gIHJlcG86IHN0cmluZztcbiAgcmVmOiBzdHJpbmc7XG4gIGRpZ2VzdDogc3RyaW5nO1xufVxuXG4vKiogVW5pb24gb2YgZXZlcnkgY3Jvc3Mtc2VydmljZSBhdWRpdCBldmVudCBjdXJyZW50bHkgZW1pdHRlZC4gKi9cbmV4cG9ydCB0eXBlIEF1ZGl0RXZlbnQgPSBSZWdpc3RyeVRhZ0NvcHlBdWRpdCB8IFJlZ2lzdHJ5VGFnRGVsZXRlQXVkaXQ7XG4iXX0=
|
package/lib/types/common.d.ts
CHANGED
|
@@ -148,6 +148,16 @@ export interface JwtPayload {
|
|
|
148
148
|
organizationId?: string;
|
|
149
149
|
/** Active organization name */
|
|
150
150
|
organizationName?: string;
|
|
151
|
+
/**
|
|
152
|
+
* Org → team hierarchy (org-team-hierarchy proposal, phase 1).
|
|
153
|
+
* `parentOrganizationId` is the active org's direct parent; `rootOrganizationId`
|
|
154
|
+
* is the top of its ancestry chain. Both are **omitted for flat (root) orgs** —
|
|
155
|
+
* consumers should treat the effective root as `rootOrganizationId ?? organizationId`.
|
|
156
|
+
* Currently every org is flat, so these are absent on all tokens today.
|
|
157
|
+
*/
|
|
158
|
+
parentOrganizationId?: string;
|
|
159
|
+
/** Root organization ID of the active org's ancestry chain (see `parentOrganizationId`). */
|
|
160
|
+
rootOrganizationId?: string;
|
|
151
161
|
/**
|
|
152
162
|
* Set on tokens issued by the sysadmin impersonation flow
|
|
153
163
|
* (`POST /admin/impersonate/:userId`). Carries the original sysadmin's
|
package/lib/types/common.js
CHANGED
|
@@ -53,4 +53,4 @@ function validateQuotaType(value, fieldName = 'quotaType') {
|
|
|
53
53
|
}
|
|
54
54
|
return value;
|
|
55
55
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBZ0R0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQW5ERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWM7SUFDN0QsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0NBQ3JELENBQUM7QUFFWDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLHlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLFdBQVc7SUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLFNBQVMsTUFBTSxLQUFLLHNCQUFzQix5QkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBRdW90YSB0eXBlIGlkZW50aWZpZXJzLlxuICpcbiAqIC0gYHBsdWdpbnNgIC8gYHBpcGVsaW5lc2Ag4oCUIGNvdW50IG9mIGNyZWF0ZWQgZW50aXRpZXNcbiAqIC0gYGFwaUNhbGxzYCDigJQgZ2VuZXJpYyBBUEkgY2FsbCBjb3VudCAocmVhZC1oZWF2eSBwYXRocylcbiAqIC0gYGFpQ2FsbHNgIOKAlCBBSSBwcm92aWRlciBpbnZvY2F0aW9ucyAoY291bnRlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgZWFjaCBjYWxsXG4gKiAgIGhhcyBleHRlcm5hbCBkb2xsYXIgY29zdDsgc2l6ZWQgc21hbGxlciB0aGFuIGFwaUNhbGxzIHBlciB0aWVyKVxuICogLSBgc3RvcmFnZUJ5dGVzYCDigJQgcmVnaXN0cnkgc3RvcmFnZSBidWRnZXQgcGVyIG9yZy4gVW5saWtlIHRoZSBvdGhlcnNcbiAqICAgKHdoaWNoIGNvdW50IGRpc2NyZXRlIGV2ZW50cyksIHRoaXMgaXMgYSBtZWFzdXJlZCB0b3RhbCByZWNvbXB1dGVkXG4gKiAgIG9uIGRlbWFuZC4gSW5jcmVtZW50ZWQgYnkgdGhlIGltYWdlLXJlZ2lzdHJ5J3MgcHVzaC1nYXRlIGJlZm9yZVxuICogICBpc3N1aW5nIGEgdG9rZW4gd2hvc2Ugc2NvcGUgaW5jbHVkZXMgYHB1c2hgOyB0aGUgR0Mgc2NoZWR1bGVyXG4gKiAgIGV2ZW50dWFsbHkgZnJlZXMgdGhlIGJ5dGVzLCB0aGVuIHRoZSBuZXh0IHB1c2gtZ2F0ZSBjaGVjayByZWFkc1xuICogICB0aGUgbG93ZXIgdmFsdWUuIE5PVCBhIGNvdW50ZXItc3R5bGUgcXVvdGEgaW4gdGhlIHNlbnNlIG9mXG4gKiAgIGBpbmNyZW1lbnRVc2FnZWAg4oCUIHRoZSByZWdpc3RyeSBwdXNoZXMgdGhlIG1lYXN1cmVkIHRvdGFsIHZpYVxuICogICBgdXBkYXRlTGltaXRzYC9gcmVzZXRVc2FnZWAgZmxvd3MuIFRpZXIgbGltaXRzIGFyZSBieXRlcy5cbiAqIC0gYGRhc2hib2FyZHNgIC8gYGFsZXJ0UnVsZXNgIC8gYGFsZXJ0RGVzdGluYXRpb25zYCAvIGBpZHBDb25maWdzYCDigJRcbiAqICAgcmVzb3VyY2UtY291bnQgcXVvdGFzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmcgRG9TIHN1cmZhY2VzIGluIHRoZVxuICogICB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzLiBXaXRob3V0IHRoZXNlIGNhcHMgYSBzaW5nbGUgb3JnIGNvdWxkXG4gKiAgIHNwYW0gdGhvdXNhbmRzIG9mIGRhc2hib2FyZHMgLyBydWxlcyBhbmQgYmxvYXQgdGhlIHNoYXJlZCBQb3N0Z3JlcyAvXG4gKiAgIE1vbmdvIHdvcmtpbmcgc2V0cy4gQ291bnRlZCBhdCBjcmVhdGUgdGltZTsgZGVjcmVtZW50ZWQgb24gZGVsZXRlLlxuICovXG5leHBvcnQgdHlwZSBRdW90YVR5cGUgPVxuICB8ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJyB8ICdhaUNhbGxzJyB8ICdzdG9yYWdlQnl0ZXMnXG4gIHwgJ2Rhc2hib2FyZHMnIHwgJ2FsZXJ0UnVsZXMnIHwgJ2FsZXJ0RGVzdGluYXRpb25zJyB8ICdpZHBDb25maWdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYWlDYWxscycsICdzdG9yYWdlQnl0ZXMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVmFsaWRRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlKSkge1xuICogICAvLyBxdW90YVR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBRdW90YVR5cGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFF1b3RhVHlwZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFF1b3RhVHlwZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFZBTElEX1FVT1RBX1RZUEVTLmluY2x1ZGVzKHZhbHVlIGFzIFF1b3RhVHlwZSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGFzc2VydCB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBRdW90YVR5cGVcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHF1b3RhVHlwZSA9IHZhbGlkYXRlUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSwgJ3F1b3RhVHlwZScpO1xuICogICAvLyBVc2UgcXVvdGFUeXBlIHNhZmVseVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIHJldHVybiBzZW5kRXJyb3IocmVzLCA0MDAsIGVyci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVRdW90YVR5cGUodmFsdWU6IHVua25vd24sIGZpZWxkTmFtZSA9ICdxdW90YVR5cGUnKTogUXVvdGFUeXBlIHtcbiAgaWYgKCFpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkICR7ZmllbGROYW1lfTogXCIke3ZhbHVlfVwiLiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9RVU9UQV9UWVBFUy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gcXVvdGEgY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhQ2hlY2tSZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkICovXG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIC8qKiBNYXhpbXVtIHF1b3RhIGxpbWl0ICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogQ3VycmVudCB1c2FnZSBjb3VudCAqL1xuICB1c2VkOiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgcXVvdGEgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHF1b3RhIHJlc2V0cyAqL1xuICByZXNldEF0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHF1b3RhIGlzIHVubGltaXRlZCAqL1xuICB1bmxpbWl0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogUGVyLW9yZyByb2xlIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICgnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInKS4gTm90IGEgZ2xvYmFsIHJvbGUuICovXG4gIHJvbGU6ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG4gIC8qKiBEZXJpdmVkOiB0cnVlIHdoZW4gcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKi9cbiAgaXNBZG1pbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHbG9iYWwgc3VwZXItYWRtaW4gZmxhZyAoY3Jvc3Mtb3JnKS4gV2hlbiBgdHJ1ZWAsIHRoZSB1c2VyIGlzIHRyZWF0ZWRcbiAgICogYXMgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvciByZWdhcmRsZXNzIG9mIHdoaWNoIG9yZyB0aGV5J3JlIGN1cnJlbnRseVxuICAgKiBhY3RpbmcgdW5kZXIuIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzaWduYWwgZm9yIHN5c2FkbWluIGF1dGhvcml0eSDigJRcbiAgICogcHJldmlvdXNseSB0aGUgb25seSBwYXRoIHdhcyBtZW1iZXJzaGlwIGluIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnXG4gICAqIHdpdGggcm9sZSBhZG1pbi9vd25lciwgd2hpY2ggY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGhcbiAgICogXCJyZWFsIGN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBFaXRoZXIgcGF0aCBzdGlsbCB3b3Jrc1xuICAgKiBkdXJpbmcgdGhlIHJvbGxvdXQ7IG5ldyB1c2VycyBzaG91bGQgYmUgZ3JhbnRlZCB2aWEgYGlzU3VwZXJBZG1pbmAuXG4gICAqL1xuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAvKiogT3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllciAoJ2RldmVsb3BlcicgfCAncHJvJyB8ICd1bmxpbWl0ZWQnKSAqL1xuICB0aWVyPzogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXQgb24gdG9rZW5zIGlzc3VlZCBieSB0aGUgc3lzYWRtaW4gaW1wZXJzb25hdGlvbiBmbG93XG4gICAqIChgUE9TVCAvYWRtaW4vaW1wZXJzb25hdGUvOnVzZXJJZGApLiBDYXJyaWVzIHRoZSBvcmlnaW5hbCBzeXNhZG1pbidzXG4gICAqIHVzZXIgaWQgc28gYXVkaXQgZXZlbnRzIHN0aWxsIGF0dHJpYnV0ZSBhY3Rpb25zIGNvcnJlY3RseS5cbiAgICovXG4gIGltcGVyc29uYXRvcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgdG9rZW4gaXMgcmVhZC1vbmx5IOKAlCBhbnkgbm9uLUdFVCByZXF1ZXN0IGlzIHJlamVjdGVkXG4gICAqIHVwc3RyZWFtIGJ5IHRoZSBwbGF0Zm9ybSdzIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIGdhdGUuIExldHNcbiAgICogc3lzYWRtaW5zIFwidmlldyBhcyB1c2VyIFhcIiB3aXRob3V0IHJpc2tpbmcgYSBkZXN0cnVjdGl2ZSBhY3Rpb24uXG4gICAqL1xuICBpbXBlcnNvbmF0aW9uUmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBZ0R0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQW5ERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWM7SUFDN0QsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0NBQ3JELENBQUM7QUFFWDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLHlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLFdBQVc7SUFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLFNBQVMsTUFBTSxLQUFLLHNCQUFzQix5QkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBRdW90YSB0eXBlIGlkZW50aWZpZXJzLlxuICpcbiAqIC0gYHBsdWdpbnNgIC8gYHBpcGVsaW5lc2Ag4oCUIGNvdW50IG9mIGNyZWF0ZWQgZW50aXRpZXNcbiAqIC0gYGFwaUNhbGxzYCDigJQgZ2VuZXJpYyBBUEkgY2FsbCBjb3VudCAocmVhZC1oZWF2eSBwYXRocylcbiAqIC0gYGFpQ2FsbHNgIOKAlCBBSSBwcm92aWRlciBpbnZvY2F0aW9ucyAoY291bnRlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgZWFjaCBjYWxsXG4gKiAgIGhhcyBleHRlcm5hbCBkb2xsYXIgY29zdDsgc2l6ZWQgc21hbGxlciB0aGFuIGFwaUNhbGxzIHBlciB0aWVyKVxuICogLSBgc3RvcmFnZUJ5dGVzYCDigJQgcmVnaXN0cnkgc3RvcmFnZSBidWRnZXQgcGVyIG9yZy4gVW5saWtlIHRoZSBvdGhlcnNcbiAqICAgKHdoaWNoIGNvdW50IGRpc2NyZXRlIGV2ZW50cyksIHRoaXMgaXMgYSBtZWFzdXJlZCB0b3RhbCByZWNvbXB1dGVkXG4gKiAgIG9uIGRlbWFuZC4gSW5jcmVtZW50ZWQgYnkgdGhlIGltYWdlLXJlZ2lzdHJ5J3MgcHVzaC1nYXRlIGJlZm9yZVxuICogICBpc3N1aW5nIGEgdG9rZW4gd2hvc2Ugc2NvcGUgaW5jbHVkZXMgYHB1c2hgOyB0aGUgR0Mgc2NoZWR1bGVyXG4gKiAgIGV2ZW50dWFsbHkgZnJlZXMgdGhlIGJ5dGVzLCB0aGVuIHRoZSBuZXh0IHB1c2gtZ2F0ZSBjaGVjayByZWFkc1xuICogICB0aGUgbG93ZXIgdmFsdWUuIE5PVCBhIGNvdW50ZXItc3R5bGUgcXVvdGEgaW4gdGhlIHNlbnNlIG9mXG4gKiAgIGBpbmNyZW1lbnRVc2FnZWAg4oCUIHRoZSByZWdpc3RyeSBwdXNoZXMgdGhlIG1lYXN1cmVkIHRvdGFsIHZpYVxuICogICBgdXBkYXRlTGltaXRzYC9gcmVzZXRVc2FnZWAgZmxvd3MuIFRpZXIgbGltaXRzIGFyZSBieXRlcy5cbiAqIC0gYGRhc2hib2FyZHNgIC8gYGFsZXJ0UnVsZXNgIC8gYGFsZXJ0RGVzdGluYXRpb25zYCAvIGBpZHBDb25maWdzYCDigJRcbiAqICAgcmVzb3VyY2UtY291bnQgcXVvdGFzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmcgRG9TIHN1cmZhY2VzIGluIHRoZVxuICogICB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzLiBXaXRob3V0IHRoZXNlIGNhcHMgYSBzaW5nbGUgb3JnIGNvdWxkXG4gKiAgIHNwYW0gdGhvdXNhbmRzIG9mIGRhc2hib2FyZHMgLyBydWxlcyBhbmQgYmxvYXQgdGhlIHNoYXJlZCBQb3N0Z3JlcyAvXG4gKiAgIE1vbmdvIHdvcmtpbmcgc2V0cy4gQ291bnRlZCBhdCBjcmVhdGUgdGltZTsgZGVjcmVtZW50ZWQgb24gZGVsZXRlLlxuICovXG5leHBvcnQgdHlwZSBRdW90YVR5cGUgPVxuICB8ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJyB8ICdhaUNhbGxzJyB8ICdzdG9yYWdlQnl0ZXMnXG4gIHwgJ2Rhc2hib2FyZHMnIHwgJ2FsZXJ0UnVsZXMnIHwgJ2FsZXJ0RGVzdGluYXRpb25zJyB8ICdpZHBDb25maWdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYWlDYWxscycsICdzdG9yYWdlQnl0ZXMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVmFsaWRRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlKSkge1xuICogICAvLyBxdW90YVR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBRdW90YVR5cGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFF1b3RhVHlwZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFF1b3RhVHlwZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFZBTElEX1FVT1RBX1RZUEVTLmluY2x1ZGVzKHZhbHVlIGFzIFF1b3RhVHlwZSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIGFzc2VydCB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBRdW90YVR5cGVcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHF1b3RhVHlwZSA9IHZhbGlkYXRlUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSwgJ3F1b3RhVHlwZScpO1xuICogICAvLyBVc2UgcXVvdGFUeXBlIHNhZmVseVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIHJldHVybiBzZW5kRXJyb3IocmVzLCA0MDAsIGVyci5tZXNzYWdlKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVRdW90YVR5cGUodmFsdWU6IHVua25vd24sIGZpZWxkTmFtZSA9ICdxdW90YVR5cGUnKTogUXVvdGFUeXBlIHtcbiAgaWYgKCFpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkICR7ZmllbGROYW1lfTogXCIke3ZhbHVlfVwiLiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9RVU9UQV9UWVBFUy5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gcXVvdGEgY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhQ2hlY2tSZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkICovXG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIC8qKiBNYXhpbXVtIHF1b3RhIGxpbWl0ICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogQ3VycmVudCB1c2FnZSBjb3VudCAqL1xuICB1c2VkOiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgcXVvdGEgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHF1b3RhIHJlc2V0cyAqL1xuICByZXNldEF0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHF1b3RhIGlzIHVubGltaXRlZCAqL1xuICB1bmxpbWl0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogUGVyLW9yZyByb2xlIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICgnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInKS4gTm90IGEgZ2xvYmFsIHJvbGUuICovXG4gIHJvbGU6ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG4gIC8qKiBEZXJpdmVkOiB0cnVlIHdoZW4gcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKi9cbiAgaXNBZG1pbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHbG9iYWwgc3VwZXItYWRtaW4gZmxhZyAoY3Jvc3Mtb3JnKS4gV2hlbiBgdHJ1ZWAsIHRoZSB1c2VyIGlzIHRyZWF0ZWRcbiAgICogYXMgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvciByZWdhcmRsZXNzIG9mIHdoaWNoIG9yZyB0aGV5J3JlIGN1cnJlbnRseVxuICAgKiBhY3RpbmcgdW5kZXIuIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzaWduYWwgZm9yIHN5c2FkbWluIGF1dGhvcml0eSDigJRcbiAgICogcHJldmlvdXNseSB0aGUgb25seSBwYXRoIHdhcyBtZW1iZXJzaGlwIGluIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnXG4gICAqIHdpdGggcm9sZSBhZG1pbi9vd25lciwgd2hpY2ggY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGhcbiAgICogXCJyZWFsIGN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBFaXRoZXIgcGF0aCBzdGlsbCB3b3Jrc1xuICAgKiBkdXJpbmcgdGhlIHJvbGxvdXQ7IG5ldyB1c2VycyBzaG91bGQgYmUgZ3JhbnRlZCB2aWEgYGlzU3VwZXJBZG1pbmAuXG4gICAqL1xuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAvKiogT3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllciAoJ2RldmVsb3BlcicgfCAncHJvJyB8ICd1bmxpbWl0ZWQnKSAqL1xuICB0aWVyPzogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IChvcmctdGVhbS1oaWVyYXJjaHkgcHJvcG9zYWwsIHBoYXNlIDEpLlxuICAgKiBgcGFyZW50T3JnYW5pemF0aW9uSWRgIGlzIHRoZSBhY3RpdmUgb3JnJ3MgZGlyZWN0IHBhcmVudDsgYHJvb3RPcmdhbml6YXRpb25JZGBcbiAgICogaXMgdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEJvdGggYXJlICoqb21pdHRlZCBmb3IgZmxhdCAocm9vdCkgb3JncyoqIOKAlFxuICAgKiBjb25zdW1lcnMgc2hvdWxkIHRyZWF0IHRoZSBlZmZlY3RpdmUgcm9vdCBhcyBgcm9vdE9yZ2FuaXphdGlvbklkID8/IG9yZ2FuaXphdGlvbklkYC5cbiAgICogQ3VycmVudGx5IGV2ZXJ5IG9yZyBpcyBmbGF0LCBzbyB0aGVzZSBhcmUgYWJzZW50IG9uIGFsbCB0b2tlbnMgdG9kYXkuXG4gICAqL1xuICBwYXJlbnRPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIFJvb3Qgb3JnYW5pemF0aW9uIElEIG9mIHRoZSBhY3RpdmUgb3JnJ3MgYW5jZXN0cnkgY2hhaW4gKHNlZSBgcGFyZW50T3JnYW5pemF0aW9uSWRgKS4gKi9cbiAgcm9vdE9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogU2V0IG9uIHRva2VucyBpc3N1ZWQgYnkgdGhlIHN5c2FkbWluIGltcGVyc29uYXRpb24gZmxvd1xuICAgKiAoYFBPU1QgL2FkbWluL2ltcGVyc29uYXRlLzp1c2VySWRgKS4gQ2FycmllcyB0aGUgb3JpZ2luYWwgc3lzYWRtaW4nc1xuICAgKiB1c2VyIGlkIHNvIGF1ZGl0IGV2ZW50cyBzdGlsbCBhdHRyaWJ1dGUgYWN0aW9ucyBjb3JyZWN0bHkuXG4gICAqL1xuICBpbXBlcnNvbmF0b3JJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIHRva2VuIGlzIHJlYWQtb25seSDigJQgYW55IG5vbi1HRVQgcmVxdWVzdCBpcyByZWplY3RlZFxuICAgKiB1cHN0cmVhbSBieSB0aGUgcGxhdGZvcm0ncyByZWFkLW9ubHkgaW1wZXJzb25hdGlvbiBnYXRlLiBMZXRzXG4gICAqIHN5c2FkbWlucyBcInZpZXcgYXMgdXNlciBYXCIgd2l0aG91dCByaXNraW5nIGEgZGVzdHJ1Y3RpdmUgYWN0aW9uLlxuICAgKi9cbiAgaW1wZXJzb25hdGlvblJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIFRva2VuIHR5cGUgKi9cbiAgdHlwZTogJ2FjY2VzcycgfCAncmVmcmVzaCc7XG4gIC8qKiBJc3N1ZWQgYXQgdGltZXN0YW1wICovXG4gIGlhdD86IG51bWJlcjtcbiAgLyoqIEV4cGlyYXRpb24gdGltZXN0YW1wICovXG4gIGV4cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBFeHByZXNzIFJlcXVlc3Qgd2l0aCB1c2VyIHByb3BlcnR5LlxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIG5hbWVzcGFjZSBFeHByZXNzIHtcbiAgICBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gICAgICB1c2VyPzogSnd0UGF5bG9hZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIEhUVFAgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBob3N0bmFtZSAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIHBvcnQgKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnaGVhbHRoeScgfCAndW5oZWFsdGh5JztcbiAgc2VydmljZTogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdXB0aW1lOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+O1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Logger } from 'winston';
|
|
2
|
+
/**
|
|
3
|
+
* Install last-resort process-level fault handlers.
|
|
4
|
+
*
|
|
5
|
+
* Without these, an uncaught exception or an unhandled promise rejection in a
|
|
6
|
+
* fire-and-forget async path crashes the container with NO structured log line
|
|
7
|
+
* (and on modern Node terminates the process by default). That makes incidents
|
|
8
|
+
* undebuggable from logs. This logs the fault through the service logger, then
|
|
9
|
+
* exits non-zero so the orchestrator restarts a CLEAN process — a faulted
|
|
10
|
+
* process is in an undefined state and must not keep serving.
|
|
11
|
+
*
|
|
12
|
+
* This is orthogonal to graceful SIGTERM shutdown (handled in api-server /
|
|
13
|
+
* platform): that drains on a normal stop; this is the abnormal-fault path.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent — call once at process start; repeat calls are no-ops. Skipped
|
|
16
|
+
* under NODE_ENV=test so it never competes with the test runner's own handlers.
|
|
17
|
+
*/
|
|
18
|
+
export declare function installCrashHandlers(log?: Logger): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.installCrashHandlers = installCrashHandlers;
|
|
6
|
+
const logger_1 = require("./logger");
|
|
7
|
+
let installed = false;
|
|
8
|
+
/**
|
|
9
|
+
* Install last-resort process-level fault handlers.
|
|
10
|
+
*
|
|
11
|
+
* Without these, an uncaught exception or an unhandled promise rejection in a
|
|
12
|
+
* fire-and-forget async path crashes the container with NO structured log line
|
|
13
|
+
* (and on modern Node terminates the process by default). That makes incidents
|
|
14
|
+
* undebuggable from logs. This logs the fault through the service logger, then
|
|
15
|
+
* exits non-zero so the orchestrator restarts a CLEAN process — a faulted
|
|
16
|
+
* process is in an undefined state and must not keep serving.
|
|
17
|
+
*
|
|
18
|
+
* This is orthogonal to graceful SIGTERM shutdown (handled in api-server /
|
|
19
|
+
* platform): that drains on a normal stop; this is the abnormal-fault path.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent — call once at process start; repeat calls are no-ops. Skipped
|
|
22
|
+
* under NODE_ENV=test so it never competes with the test runner's own handlers.
|
|
23
|
+
*/
|
|
24
|
+
function installCrashHandlers(log = (0, logger_1.createLogger)('process')) {
|
|
25
|
+
if (installed || process.env.NODE_ENV === 'test')
|
|
26
|
+
return;
|
|
27
|
+
installed = true;
|
|
28
|
+
const fatal = (kind, error, extra = {}) => {
|
|
29
|
+
log.error(`${kind} — exiting for restart`, { error: error.message, stack: error.stack, ...extra });
|
|
30
|
+
// Give winston a tick to flush async transports, then exit. `unref` so this
|
|
31
|
+
// timer never keeps an otherwise-idle process alive.
|
|
32
|
+
setTimeout(() => process.exit(1), 100).unref();
|
|
33
|
+
};
|
|
34
|
+
process.on('uncaughtException', (error, origin) => fatal('Uncaught exception', error, { origin }));
|
|
35
|
+
process.on('unhandledRejection', (reason) => {
|
|
36
|
+
fatal('Unhandled promise rejection', reason instanceof Error ? reason : new Error(String(reason)));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jhc2gtaGFuZGxlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvY3Jhc2gtaGFuZGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBdUJ0QyxvREFlQztBQW5DRCxxQ0FBd0M7QUFFeEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXRCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE1BQWMsSUFBQSxxQkFBWSxFQUFDLFNBQVMsQ0FBQztJQUN4RSxJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNO1FBQUUsT0FBTztJQUN6RCxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBRWpCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBWSxFQUFFLEtBQVksRUFBRSxRQUFpQyxFQUFFLEVBQVEsRUFBRTtRQUN0RixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSx3QkFBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuRyw0RUFBNEU7UUFDNUUscURBQXFEO1FBQ3JELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pELENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFZLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xILE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFlLEVBQUUsRUFBRTtRQUNuRCxLQUFLLENBQUMsNkJBQTZCLEVBQUUsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ3dpbnN0b24nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5sZXQgaW5zdGFsbGVkID0gZmFsc2U7XG5cbi8qKlxuICogSW5zdGFsbCBsYXN0LXJlc29ydCBwcm9jZXNzLWxldmVsIGZhdWx0IGhhbmRsZXJzLlxuICpcbiAqIFdpdGhvdXQgdGhlc2UsIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBvciBhbiB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gaW4gYVxuICogZmlyZS1hbmQtZm9yZ2V0IGFzeW5jIHBhdGggY3Jhc2hlcyB0aGUgY29udGFpbmVyIHdpdGggTk8gc3RydWN0dXJlZCBsb2cgbGluZVxuICogKGFuZCBvbiBtb2Rlcm4gTm9kZSB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIGJ5IGRlZmF1bHQpLiBUaGF0IG1ha2VzIGluY2lkZW50c1xuICogdW5kZWJ1Z2dhYmxlIGZyb20gbG9ncy4gVGhpcyBsb2dzIHRoZSBmYXVsdCB0aHJvdWdoIHRoZSBzZXJ2aWNlIGxvZ2dlciwgdGhlblxuICogZXhpdHMgbm9uLXplcm8gc28gdGhlIG9yY2hlc3RyYXRvciByZXN0YXJ0cyBhIENMRUFOIHByb2Nlc3Mg4oCUIGEgZmF1bHRlZFxuICogcHJvY2VzcyBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUgYW5kIG11c3Qgbm90IGtlZXAgc2VydmluZy5cbiAqXG4gKiBUaGlzIGlzIG9ydGhvZ29uYWwgdG8gZ3JhY2VmdWwgU0lHVEVSTSBzaHV0ZG93biAoaGFuZGxlZCBpbiBhcGktc2VydmVyIC9cbiAqIHBsYXRmb3JtKTogdGhhdCBkcmFpbnMgb24gYSBub3JtYWwgc3RvcDsgdGhpcyBpcyB0aGUgYWJub3JtYWwtZmF1bHQgcGF0aC5cbiAqXG4gKiBJZGVtcG90ZW50IOKAlCBjYWxsIG9uY2UgYXQgcHJvY2VzcyBzdGFydDsgcmVwZWF0IGNhbGxzIGFyZSBuby1vcHMuIFNraXBwZWRcbiAqIHVuZGVyIE5PREVfRU5WPXRlc3Qgc28gaXQgbmV2ZXIgY29tcGV0ZXMgd2l0aCB0aGUgdGVzdCBydW5uZXIncyBvd24gaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ3Jhc2hIYW5kbGVycyhsb2c6IExvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncHJvY2VzcycpKTogdm9pZCB7XG4gIGlmIChpbnN0YWxsZWQgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgcmV0dXJuO1xuICBpbnN0YWxsZWQgPSB0cnVlO1xuXG4gIGNvbnN0IGZhdGFsID0gKGtpbmQ6IHN0cmluZywgZXJyb3I6IEVycm9yLCBleHRyYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IHZvaWQgPT4ge1xuICAgIGxvZy5lcnJvcihgJHtraW5kfSDigJQgZXhpdGluZyBmb3IgcmVzdGFydGAsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFjaywgLi4uZXh0cmEgfSk7XG4gICAgLy8gR2l2ZSB3aW5zdG9uIGEgdGljayB0byBmbHVzaCBhc3luYyB0cmFuc3BvcnRzLCB0aGVuIGV4aXQuIGB1bnJlZmAgc28gdGhpc1xuICAgIC8vIHRpbWVyIG5ldmVyIGtlZXBzIGFuIG90aGVyd2lzZS1pZGxlIHByb2Nlc3MgYWxpdmUuXG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoMSksIDEwMCkudW5yZWYoKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IsIG9yaWdpbjogc3RyaW5nKSA9PiBmYXRhbCgnVW5jYXVnaHQgZXhjZXB0aW9uJywgZXJyb3IsIHsgb3JpZ2luIH0pKTtcbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbjogdW5rbm93bikgPT4ge1xuICAgIGZhdGFsKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbiA6IG5ldyBFcnJvcihTdHJpbmcocmVhc29uKSkpO1xuICB9KTtcbn1cbiJdfQ==
|
package/lib/utils/index.d.ts
CHANGED
package/lib/utils/index.js
CHANGED
|
@@ -17,6 +17,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
};
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
__exportStar(require("./logger"), exports);
|
|
20
|
+
__exportStar(require("./crash-handlers"), exports);
|
|
20
21
|
__exportStar(require("./response"), exports);
|
|
21
22
|
__exportStar(require("./params"), exports);
|
|
22
23
|
__exportStar(require("./headers"), exports);
|
|
@@ -28,4 +29,4 @@ __exportStar(require("./audit"), exports);
|
|
|
28
29
|
__exportStar(require("./secret-encryption"), exports);
|
|
29
30
|
__exportStar(require("./org-aws-credentials"), exports);
|
|
30
31
|
__exportStar(require("./metric-emitter"), exports);
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEMsMkNBQXlCO0FBQ3pCLG1EQUFpQztBQUNqQyw2Q0FBMkI7QUFDM0IsMkNBQXlCO0FBQ3pCLDRDQUEwQjtBQUMxQiw2Q0FBMkI7QUFDM0IsMkNBQXlCO0FBQ3pCLG1EQUFpQztBQUNqQyxnREFBOEI7QUFDOUIsMENBQXdCO0FBQ3hCLHNEQUFvQztBQUNwQyx3REFBc0M7QUFDdEMsbURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vY3Jhc2gtaGFuZGxlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNwb25zZSc7XG5leHBvcnQgKiBmcm9tICcuL3BhcmFtcyc7XG5leHBvcnQgKiBmcm9tICcuL2hlYWRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pZGVudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL29iamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL2FsaWFzLXJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29uY3VycmVuY3knO1xuZXhwb3J0ICogZnJvbSAnLi9hdWRpdCc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3JldC1lbmNyeXB0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vb3JnLWF3cy1jcmVkZW50aWFscyc7XG5leHBvcnQgKiBmcm9tICcuL21ldHJpYy1lbWl0dGVyJztcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"plugins",
|
|
50
50
|
"typescript",
|
|
51
51
|
"self-service",
|
|
52
|
-
"multi-
|
|
52
|
+
"multi-team",
|
|
53
53
|
"compliance",
|
|
54
54
|
"automation",
|
|
55
55
|
"infrastructure-as-code",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"access": "public",
|
|
74
74
|
"registry": "https://registry.npmjs.org/"
|
|
75
75
|
},
|
|
76
|
-
"version": "3.4.
|
|
76
|
+
"version": "3.4.60",
|
|
77
77
|
"bugs": {
|
|
78
78
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
79
79
|
},
|