@pipeline-builder/api-core 3.4.107 → 3.4.108
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/services/compliance-client.js +31 -5
- package/lib/services/http-client.d.ts +26 -2
- package/lib/services/http-client.js +38 -20
- package/lib/services/index.d.ts +0 -1
- package/lib/services/index.js +1 -2
- package/lib/types/permissions.d.ts +1 -1
- package/lib/types/permissions.js +2 -2
- package/package.json +1 -1
- package/lib/services/compliance-queue.d.ts +0 -14
- package/lib/services/compliance-queue.js +0 -43
|
@@ -8,6 +8,13 @@ const logger = createLogger('compliance-client');
|
|
|
8
8
|
* (fail-open). Default is fail-closed (errors propagate and block the operation).
|
|
9
9
|
*/
|
|
10
10
|
const COMPLIANCE_BYPASS = process.env.COMPLIANCE_BYPASS === 'true';
|
|
11
|
+
/**
|
|
12
|
+
* Per-attempt timeout for a validation POST (env: `COMPLIANCE_VALIDATE_TIMEOUT_MS`).
|
|
13
|
+
* Deliberately TIGHTER than the 5s client default so the enforced retries (below)
|
|
14
|
+
* fit inside a bounded total budget rather than stacking three 5s stalls onto a
|
|
15
|
+
* single interactive request.
|
|
16
|
+
*/
|
|
17
|
+
const VALIDATE_TIMEOUT_MS = parseInt(process.env.COMPLIANCE_VALIDATE_TIMEOUT_MS ?? '4000', 10);
|
|
11
18
|
/**
|
|
12
19
|
* Return a pass-through result when COMPLIANCE_BYPASS is enabled and the
|
|
13
20
|
* compliance service is unreachable.
|
|
@@ -38,6 +45,25 @@ function buildHeaders(orgId, authHeader) {
|
|
|
38
45
|
headers.Authorization = authHeader;
|
|
39
46
|
return headers;
|
|
40
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Request options for a compliance validation POST.
|
|
50
|
+
*
|
|
51
|
+
* These calls are side-effect-free (they evaluate rules and return a verdict;
|
|
52
|
+
* any audit/notification the compliance service writes is derived, not a mutation
|
|
53
|
+
* the caller depends on being once-only), so they are marked `idempotent: true`.
|
|
54
|
+
* That lets the HTTP client auto-retry a transient 503 / connection reset /
|
|
55
|
+
* timeout instead of surfacing it as a hard failure — which, under the
|
|
56
|
+
* fail-closed default, would wrongly REJECT a legitimate plugin upload / pipeline
|
|
57
|
+
* create just because compliance briefly stalled. Paired with the tighter
|
|
58
|
+
* per-attempt timeout so the retries stay within a bounded total budget.
|
|
59
|
+
*/
|
|
60
|
+
function validateOptions(orgId, authHeader) {
|
|
61
|
+
return {
|
|
62
|
+
headers: buildHeaders(orgId, authHeader),
|
|
63
|
+
idempotent: true,
|
|
64
|
+
timeout: VALIDATE_TIMEOUT_MS,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
41
67
|
/**
|
|
42
68
|
* Create a compliance client.
|
|
43
69
|
*
|
|
@@ -72,7 +98,7 @@ export function createComplianceClient(config) {
|
|
|
72
98
|
return {
|
|
73
99
|
async validatePlugin(orgId, attributes, authHeader, entityId, entityName, action) {
|
|
74
100
|
try {
|
|
75
|
-
const response = await client.post('/compliance/validate/plugin', { attributes, entityId, entityName, action: action ?? 'upload' },
|
|
101
|
+
const response = await client.post('/compliance/validate/plugin', { attributes, entityId, entityName, action: action ?? 'upload' }, validateOptions(orgId, authHeader));
|
|
76
102
|
return unwrap(response, 'validatePlugin');
|
|
77
103
|
}
|
|
78
104
|
catch (error) {
|
|
@@ -83,7 +109,7 @@ export function createComplianceClient(config) {
|
|
|
83
109
|
},
|
|
84
110
|
async validatePipeline(orgId, attributes, authHeader, entityId, entityName, action) {
|
|
85
111
|
try {
|
|
86
|
-
const response = await client.post('/compliance/validate/pipeline', { attributes, entityId, entityName, action: action ?? 'create' },
|
|
112
|
+
const response = await client.post('/compliance/validate/pipeline', { attributes, entityId, entityName, action: action ?? 'create' }, validateOptions(orgId, authHeader));
|
|
87
113
|
return unwrap(response, 'validatePipeline');
|
|
88
114
|
}
|
|
89
115
|
catch (error) {
|
|
@@ -94,7 +120,7 @@ export function createComplianceClient(config) {
|
|
|
94
120
|
},
|
|
95
121
|
async dryRunPlugin(orgId, attributes, authHeader) {
|
|
96
122
|
try {
|
|
97
|
-
const response = await client.post('/compliance/validate/plugin/dry-run', { attributes },
|
|
123
|
+
const response = await client.post('/compliance/validate/plugin/dry-run', { attributes }, validateOptions(orgId, authHeader));
|
|
98
124
|
return unwrap(response, 'dryRunPlugin');
|
|
99
125
|
}
|
|
100
126
|
catch (error) {
|
|
@@ -105,7 +131,7 @@ export function createComplianceClient(config) {
|
|
|
105
131
|
},
|
|
106
132
|
async dryRunPipeline(orgId, attributes, authHeader) {
|
|
107
133
|
try {
|
|
108
|
-
const response = await client.post('/compliance/validate/pipeline/dry-run', { attributes },
|
|
134
|
+
const response = await client.post('/compliance/validate/pipeline/dry-run', { attributes }, validateOptions(orgId, authHeader));
|
|
109
135
|
return unwrap(response, 'dryRunPipeline');
|
|
110
136
|
}
|
|
111
137
|
catch (error) {
|
|
@@ -116,4 +142,4 @@ export function createComplianceClient(config) {
|
|
|
116
142
|
},
|
|
117
143
|
};
|
|
118
144
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY29tcGxpYW5jZS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFakQ7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixLQUFLLE1BQU0sQ0FBQztBQW1FbkU7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsT0FBZ0M7SUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsS0FBSztRQUNkLFVBQVUsRUFBRSxFQUFFO1FBQ2QsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxnREFBZ0QsRUFBRSxDQUFDO1FBQ3pMLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFlBQVksRUFBRSxDQUFDO1FBQ2YsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBYSxFQUFFLFVBQWtCO0lBQ3JELE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxVQUFVLEVBQUUs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b0JBQUUsT0FBTyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDNUYsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEludGVybmFsSHR0cENsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY29tcGxpYW5jZS1jbGllbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRydWUsIGNvbXBsaWFuY2UgY2hlY2tzIGFyZSBieXBhc3NlZCBpZiB0aGUgc2VydmljZSBpcyB1bmF2YWlsYWJsZVxuICogKGZhaWwtb3BlbikuIERlZmF1bHQgaXMgZmFpbC1jbG9zZWQgKGVycm9ycyBwcm9wYWdhdGUgYW5kIGJsb2NrIHRoZSBvcGVyYXRpb24pLlxuICovXG5jb25zdCBDT01QTElBTkNFX0JZUEFTUyA9IHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfQllQQVNTID09PSAndHJ1ZSc7XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgY29tcGxpYW5jZSB2YWxpZGF0aW9uIGNoZWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VDaGVja1Jlc3VsdCB7XG4gIHBhc3NlZDogYm9vbGVhbjtcbiAgdmlvbGF0aW9uczogQ29tcGxpYW5jZVZpb2xhdGlvbltdO1xuICB3YXJuaW5nczogQ29tcGxpYW5jZVZpb2xhdGlvbltdO1xuICBibG9ja2VkOiBib29sZWFuO1xuICBydWxlc0V2YWx1YXRlZDogbnVtYmVyO1xuICBydWxlc1NraXBwZWQ6IG51bWJlcjtcbiAgZXhlbXB0aW9uc0FwcGxpZWQ6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VWaW9sYXRpb24ge1xuICBydWxlSWQ6IHN0cmluZztcbiAgcnVsZU5hbWU6IHN0cmluZztcbiAgcG9saWN5SWQ/OiBzdHJpbmcgfCBudWxsO1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICBleHBlY3RlZFZhbHVlOiB1bmtub3duO1xuICBhY3R1YWxWYWx1ZTogdW5rbm93bjtcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBsaWFuY2Ugc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICogVXNlcyBmYWlsLWNsb3NlZCBkZXNpZ246IGVycm9ycyBwcm9wYWdhdGUgdG8gYmxvY2sgdGhlIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlQ2xpZW50IHtcbiAgLyoqIFZhbGlkYXRlIHBsdWdpbiBhdHRyaWJ1dGVzIGFnYWluc3Qgb3JnIHJ1bGVzLiBUaHJvd3Mgb24gc2VydmljZSBlcnJvciAoZmFpbC1jbG9zZWQpLiAqL1xuICB2YWxpZGF0ZVBsdWdpbihcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgICBlbnRpdHlJZD86IHN0cmluZyxcbiAgICBlbnRpdHlOYW1lPzogc3RyaW5nLFxuICAgIGFjdGlvbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb21wbGlhbmNlQ2hlY2tSZXN1bHQ+O1xuXG4gIC8qKiBWYWxpZGF0ZSBwaXBlbGluZSBhdHRyaWJ1dGVzIGFnYWluc3Qgb3JnIHJ1bGVzLiBUaHJvd3Mgb24gc2VydmljZSBlcnJvciAoZmFpbC1jbG9zZWQpLiAqL1xuICB2YWxpZGF0ZVBpcGVsaW5lKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICAgIGVudGl0eUlkPzogc3RyaW5nLFxuICAgIGVudGl0eU5hbWU/OiBzdHJpbmcsXG4gICAgYWN0aW9uPzogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbXBsaWFuY2VDaGVja1Jlc3VsdD47XG5cbiAgLyoqIFByZS1mbGlnaHQgY2hlY2sgZm9yIHBsdWdpbiAobm8gYXVkaXQsIG5vIG5vdGlmaWNhdGlvbikuICovXG4gIGRyeVJ1blBsdWdpbihcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb21wbGlhbmNlQ2hlY2tSZXN1bHQ+O1xuXG4gIC8qKiBQcmUtZmxpZ2h0IGNoZWNrIGZvciBwaXBlbGluZSAobm8gYXVkaXQsIG5vIG5vdGlmaWNhdGlvbikuICovXG4gIGRyeVJ1blBpcGVsaW5lKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbXBsaWFuY2VDaGVja1Jlc3VsdD47XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcGFzcy10aHJvdWdoIHJlc3VsdCB3aGVuIENPTVBMSUFOQ0VfQllQQVNTIGlzIGVuYWJsZWQgYW5kIHRoZVxuICogY29tcGxpYW5jZSBzZXJ2aWNlIGlzIHVucmVhY2hhYmxlLlxuICovXG5mdW5jdGlvbiBieXBhc3NSZXN1bHQoY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQge1xuICBsb2dnZXIud2FybignQ09NUExJQU5DRV9CWVBBU1M6IFNlcnZpY2UgdW5hdmFpbGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCBjb250ZXh0KTtcbiAgcmV0dXJuIHtcbiAgICBwYXNzZWQ6IHRydWUsXG4gICAgYmxvY2tlZDogZmFsc2UsXG4gICAgdmlvbGF0aW9uczogW10sXG4gICAgd2FybmluZ3M6IFt7IHJ1bGVJZDogJycsIHJ1bGVOYW1lOiAnJywgZmllbGQ6ICcnLCBvcGVyYXRvcjogJycsIGV4cGVjdGVkVmFsdWU6IG51bGwsIGFjdHVhbFZhbHVlOiBudWxsLCBzZXZlcml0eTogJ3dhcm5pbmcnLCBtZXNzYWdlOiAnQ29tcGxpYW5jZSBjaGVjayBza2lwcGVkIChzZXJ2aWNlIHVuYXZhaWxhYmxlKScgfV0sXG4gICAgcnVsZXNFdmFsdWF0ZWQ6IDAsXG4gICAgcnVsZXNTa2lwcGVkOiAwLFxuICAgIGV4ZW1wdGlvbnNBcHBsaWVkOiBbXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjb21tb24gcmVxdWVzdCBoZWFkZXJzIGZvciBjb21wbGlhbmNlIGNhbGxzLlxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ3gtb3JnLWlkJzogb3JnSWQsXG4gIH07XG4gIC8vIE5PVEU6IHRoZSBvbGQgYHgtaW50ZXJuYWwtc2VydmljZTogdHJ1ZWAgaGVhZGVyIHdhcyByZW1vdmVkIOKAlCBpdCBpcyB0cnVzdGVkXG4gIC8vIGJ5IG5vdGhpbmcgKGl0IHdhcyBzcG9vZmFibGUpOyBjb21wbGlhbmNlIHJvdXRlcyBhdXRoZW50aWNhdGUgdGhlIGNhbGxlciB2aWFcbiAgLy8gdGhlIGBBdXRob3JpemF0aW9uYCBzZXJ2aWNlIEpXVCAoYHJlcXVpcmVTZXJ2aWNlUHJpbmNpcGFsYCkuXG4gIGlmIChhdXRoSGVhZGVyKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBhdXRoSGVhZGVyO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wbGlhbmNlIGNsaWVudC5cbiAqXG4gKiBJTVBPUlRBTlQ6IFRoaXMgY2xpZW50IGlzIGZhaWwtY2xvc2VkIOKAlCBpZiB0aGUgY29tcGxpYW5jZSBzZXJ2aWNlIGlzXG4gKiB1bnJlYWNoYWJsZSBvciByZXR1cm5zIGFuIGVycm9yLCB0aGUgZXJyb3IgcHJvcGFnYXRlcyBhbmQgdGhlIGNhbGxpbmdcbiAqIG9wZXJhdGlvbiAocGx1Z2luIHVwbG9hZCwgcGlwZWxpbmUgY3JlYXRlKSBpcyByZWplY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQoY29uZmlnPzogUGFydGlhbDxTZXJ2aWNlQ29uZmlnPik6IENvbXBsaWFuY2VDbGllbnQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBwcm9jZXNzLmVudi5DT01QTElBTkNFX1NFUlZJQ0VfSE9TVCA/PyAnY29tcGxpYW5jZScsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHJlc3BvbnNlIHNoYXBlICsgc3RhdHVzLiBUaGUgSFRUUCBjbGllbnQgZG9lc24ndCB0aHJvdyBvbiBub24tMnh4XG4gICAqIChpdCBqdXN0IHJldHVybnMgdGhlIGJvZHkpLCBzbyB3aXRob3V0IHRoaXMgYW4gYXV0aCBmYWlsdXJlIC8gcm91dGUgbWlzc1xuICAgKiBzaWxlbnRseSBwcm9kdWNlZCBgcmVzcG9uc2UuYm9keS5kYXRhID09PSB1bmRlZmluZWRgIGFuZCB0aGUgY2FsbGVyXG4gICAqIGNyYXNoZWQgb24gYC5ibG9ja2VkYC4gTm93IG5vbi0yeHggc3VyZmFjZXMgYXMgYSB0aHJvd24gZXJyb3IgdGhhdCB0aGVcbiAgICogb3V0ZXIgdHJ5L2NhdGNoIGNhbiB0dXJuIGludG8gZWl0aGVyIGZhaWwtY2xvc2VkIChkZWZhdWx0KSBvclxuICAgKiBDT01QTElBTkNFX0JZUEFTUyAoZmFpbC1vcGVuKS5cbiAgICovXG4gIGZ1bmN0aW9uIHVud3JhcChcbiAgICByZXNwb25zZTogeyBzdGF0dXNDb2RlOiBudW1iZXI7IGJvZHk6IHsgc3VjY2Vzcz86IGJvb2xlYW47IGRhdGE/OiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQ7IG1lc3NhZ2U/OiBzdHJpbmcgfSB9LFxuICAgIG9wOiBzdHJpbmcsXG4gICk6IENvbXBsaWFuY2VDaGVja1Jlc3VsdCB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAzMDApIHtcbiAgICAgIGNvbnN0IG1zZyA9IHJlc3BvbnNlLmJvZHk/Lm1lc3NhZ2UgPz8gYEhUVFAgJHtyZXNwb25zZS5zdGF0dXNDb2RlfWA7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXBsaWFuY2UgJHtvcH0gZmFpbGVkOiAke21zZ31gKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ib2R5Py5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXBsaWFuY2UgJHtvcH0gcmV0dXJuZWQgbm8gZGF0YSAoc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0pYCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHZhbGlkYXRlUGx1Z2luKG9yZ0lkLCBhdHRyaWJ1dGVzLCBhdXRoSGVhZGVyLCBlbnRpdHlJZCwgZW50aXR5TmFtZSwgYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YTogQ29tcGxpYW5jZUNoZWNrUmVzdWx0OyBtZXNzYWdlPzogc3RyaW5nIH0+KFxuICAgICAgICAgICcvY29tcGxpYW5jZS92YWxpZGF0ZS9wbHVnaW4nLFxuICAgICAgICAgIHsgYXR0cmlidXRlcywgZW50aXR5SWQsIGVudGl0eU5hbWUsIGFjdGlvbjogYWN0aW9uID8/ICd1cGxvYWQnIH0sXG4gICAgICAgICAgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIpIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bndyYXAocmVzcG9uc2UsICd2YWxpZGF0ZVBsdWdpbicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKENPTVBMSUFOQ0VfQllQQVNTKSByZXR1cm4gYnlwYXNzUmVzdWx0KHsgb3JnSWQsIGVudGl0eVR5cGU6ICdwbHVnaW4nLCBlbnRpdHlJZCwgZW50aXR5TmFtZSB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHZhbGlkYXRlUGlwZWxpbmUob3JnSWQsIGF0dHJpYnV0ZXMsIGF1dGhIZWFkZXIsIGVudGl0eUlkLCBlbnRpdHlOYW1lLCBhY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhOiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQ7IG1lc3NhZ2U/OiBzdHJpbmcgfT4oXG4gICAgICAgICAgJy9jb21wbGlhbmNlL3ZhbGlkYXRlL3BpcGVsaW5lJyxcbiAgICAgICAgICB7IGF0dHJpYnV0ZXMsIGVudGl0eUlkLCBlbnRpdHlOYW1lLCBhY3Rpb246IGFjdGlvbiA/PyAnY3JlYXRlJyB9LFxuICAgICAgICAgIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyKSB9LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdW53cmFwKHJlc3BvbnNlLCAndmFsaWRhdGVQaXBlbGluZScpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKENPTVBMSUFOQ0VfQllQQVNTKSByZXR1cm4gYnlwYXNzUmVzdWx0KHsgb3JnSWQsIGVudGl0eVR5cGU6ICdwaXBlbGluZScsIGVudGl0eUlkLCBlbnRpdHlOYW1lIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZHJ5UnVuUGx1Z2luKG9yZ0lkLCBhdHRyaWJ1dGVzLCBhdXRoSGVhZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YTogQ29tcGxpYW5jZUNoZWNrUmVzdWx0OyBtZXNzYWdlPzogc3RyaW5nIH0+KFxuICAgICAgICAgICcvY29tcGxpYW5jZS92YWxpZGF0ZS9wbHVnaW4vZHJ5LXJ1bicsXG4gICAgICAgICAgeyBhdHRyaWJ1dGVzIH0sXG4gICAgICAgICAgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIpIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bndyYXAocmVzcG9uc2UsICdkcnlSdW5QbHVnaW4nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChDT01QTElBTkNFX0JZUEFTUykgcmV0dXJuIGJ5cGFzc1Jlc3VsdCh7IG9yZ0lkLCBlbnRpdHlUeXBlOiAncGx1Z2luJywgZHJ5UnVuOiB0cnVlIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZHJ5UnVuUGlwZWxpbmUob3JnSWQsIGF0dHJpYnV0ZXMsIGF1dGhIZWFkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhOiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQ7IG1lc3NhZ2U/OiBzdHJpbmcgfT4oXG4gICAgICAgICAgJy9jb21wbGlhbmNlL3ZhbGlkYXRlL3BpcGVsaW5lL2RyeS1ydW4nLFxuICAgICAgICAgIHsgYXR0cmlidXRlcyB9LFxuICAgICAgICAgIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyKSB9LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdW53cmFwKHJlc3BvbnNlLCAnZHJ5UnVuUGlwZWxpbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChDT01QTElBTkNFX0JZUEFTUykgcmV0dXJuIGJ5cGFzc1Jlc3VsdCh7IG9yZ0lkLCBlbnRpdHlUeXBlOiAncGlwZWxpbmUnLCBkcnlSdW46IHRydWUgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY29tcGxpYW5jZS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFFM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRWpEOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxNQUFNLENBQUM7QUFFbkU7Ozs7O0dBS0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQW1FL0Y7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsT0FBZ0M7SUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsS0FBSztRQUNkLFVBQVUsRUFBRSxFQUFFO1FBQ2QsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxnREFBZ0QsRUFBRSxDQUFDO1FBQ3pMLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFlBQVksRUFBRSxDQUFDO1FBQ2YsaUJBQWlCLEVBQUUsRUFBRTtL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TUFBTSxNQUFNLENBQUMsSUFBSSxDQUNoQyx1Q0FBdUMsRUFDdkMsRUFBRSxVQUFVLEVBQUUsRUFDZCxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUNuQyxDQUFDO2dCQUNGLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksaUJBQWlCO29CQUFFLE9BQU8sWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVGLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NvbXBsaWFuY2UtY2xpZW50Jyk7XG5cbi8qKlxuICogV2hlbiB0cnVlLCBjb21wbGlhbmNlIGNoZWNrcyBhcmUgYnlwYXNzZWQgaWYgdGhlIHNlcnZpY2UgaXMgdW5hdmFpbGFibGVcbiAqIChmYWlsLW9wZW4pLiBEZWZhdWx0IGlzIGZhaWwtY2xvc2VkIChlcnJvcnMgcHJvcGFnYXRlIGFuZCBibG9jayB0aGUgb3BlcmF0aW9uKS5cbiAqL1xuY29uc3QgQ09NUExJQU5DRV9CWVBBU1MgPSBwcm9jZXNzLmVudi5DT01QTElBTkNFX0JZUEFTUyA9PT0gJ3RydWUnO1xuXG4vKipcbiAqIFBlci1hdHRlbXB0IHRpbWVvdXQgZm9yIGEgdmFsaWRhdGlvbiBQT1NUIChlbnY6IGBDT01QTElBTkNFX1ZBTElEQVRFX1RJTUVPVVRfTVNgKS5cbiAqIERlbGliZXJhdGVseSBUSUdIVEVSIHRoYW4gdGhlIDVzIGNsaWVudCBkZWZhdWx0IHNvIHRoZSBlbmZvcmNlZCByZXRyaWVzIChiZWxvdylcbiAqIGZpdCBpbnNpZGUgYSBib3VuZGVkIHRvdGFsIGJ1ZGdldCByYXRoZXIgdGhhbiBzdGFja2luZyB0aHJlZSA1cyBzdGFsbHMgb250byBhXG4gKiBzaW5nbGUgaW50ZXJhY3RpdmUgcmVxdWVzdC5cbiAqL1xuY29uc3QgVkFMSURBVEVfVElNRU9VVF9NUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfVkFMSURBVEVfVElNRU9VVF9NUyA/PyAnNDAwMCcsIDEwKTtcblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBjb21wbGlhbmNlIHZhbGlkYXRpb24gY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUNoZWNrUmVzdWx0IHtcbiAgcGFzc2VkOiBib29sZWFuO1xuICB2aW9sYXRpb25zOiBDb21wbGlhbmNlVmlvbGF0aW9uW107XG4gIHdhcm5pbmdzOiBDb21wbGlhbmNlVmlvbGF0aW9uW107XG4gIGJsb2NrZWQ6IGJvb2xlYW47XG4gIHJ1bGVzRXZhbHVhdGVkOiBudW1iZXI7XG4gIHJ1bGVzU2tpcHBlZDogbnVtYmVyO1xuICBleGVtcHRpb25zQXBwbGllZDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVZpb2xhdGlvbiB7XG4gIHJ1bGVJZDogc3RyaW5nO1xuICBydWxlTmFtZTogc3RyaW5nO1xuICBwb2xpY3lJZD86IHN0cmluZyB8IG51bGw7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIGV4cGVjdGVkVmFsdWU6IHVua25vd247XG4gIGFjdHVhbFZhbHVlOiB1bmtub3duO1xuICBzZXZlcml0eTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29tcGxpYW5jZSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UuXG4gKiBVc2VzIGZhaWwtY2xvc2VkIGRlc2lnbjogZXJyb3JzIHByb3BhZ2F0ZSB0byBibG9jayB0aGUgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VDbGllbnQge1xuICAvKiogVmFsaWRhdGUgcGx1Z2luIGF0dHJpYnV0ZXMgYWdhaW5zdCBvcmcgcnVsZXMuIFRocm93cyBvbiBzZXJ2aWNlIGVycm9yIChmYWlsLWNsb3NlZCkuICovXG4gIHZhbGlkYXRlUGx1Z2luKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICAgIGVudGl0eUlkPzogc3RyaW5nLFxuICAgIGVudGl0eU5hbWU/OiBzdHJpbmcsXG4gICAgYWN0aW9uPzogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbXBsaWFuY2VDaGVja1Jlc3VsdD47XG5cbiAgLyoqIFZhbGlkYXRlIHBpcGVsaW5lIGF0dHJpYnV0ZXMgYWdhaW5zdCBvcmcgcnVsZXMuIFRocm93cyBvbiBzZXJ2aWNlIGVycm9yIChmYWlsLWNsb3NlZCkuICovXG4gIHZhbGlkYXRlUGlwZWxpbmUoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gICAgZW50aXR5SWQ/OiBzdHJpbmcsXG4gICAgZW50aXR5TmFtZT86IHN0cmluZyxcbiAgICBhY3Rpb24/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29tcGxpYW5jZUNoZWNrUmVzdWx0PjtcblxuICAvKiogUHJlLWZsaWdodCBjaGVjayBmb3IgcGx1Z2luIChubyBhdWRpdCwgbm8gbm90aWZpY2F0aW9uKS4gKi9cbiAgZHJ5UnVuUGx1Z2luKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbXBsaWFuY2VDaGVja1Jlc3VsdD47XG5cbiAgLyoqIFByZS1mbGlnaHQgY2hlY2sgZm9yIHBpcGVsaW5lIChubyBhdWRpdCwgbm8gbm90aWZpY2F0aW9uKS4gKi9cbiAgZHJ5UnVuUGlwZWxpbmUoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29tcGxpYW5jZUNoZWNrUmVzdWx0Pjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBwYXNzLXRocm91Z2ggcmVzdWx0IHdoZW4gQ09NUExJQU5DRV9CWVBBU1MgaXMgZW5hYmxlZCBhbmQgdGhlXG4gKiBjb21wbGlhbmNlIHNlcnZpY2UgaXMgdW5yZWFjaGFibGUuXG4gKi9cbmZ1bmN0aW9uIGJ5cGFzc1Jlc3VsdChjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IENvbXBsaWFuY2VDaGVja1Jlc3VsdCB7XG4gIGxvZ2dlci53YXJuKCdDT01QTElBTkNFX0JZUEFTUzogU2VydmljZSB1bmF2YWlsYWJsZSwgYWxsb3dpbmcgcmVxdWVzdCcsIGNvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIHBhc3NlZDogdHJ1ZSxcbiAgICBibG9ja2VkOiBmYWxzZSxcbiAgICB2aW9sYXRpb25zOiBbXSxcbiAgICB3YXJuaW5nczogW3sgcnVsZUlkOiAnJywgcnVsZU5hbWU6ICcnLCBmaWVsZDogJycsIG9wZXJhdG9yOiAnJywgZXhwZWN0ZWRWYWx1ZTogbnVsbCwgYWN0dWFsVmFsdWU6IG51bGwsIHNldmVyaXR5OiAnd2FybmluZycsIG1lc3NhZ2U6ICdDb21wbGlhbmNlIGNoZWNrIHNraXBwZWQgKHNlcnZpY2UgdW5hdmFpbGFibGUpJyB9XSxcbiAgICBydWxlc0V2YWx1YXRlZDogMCxcbiAgICBydWxlc1NraXBwZWQ6IDAsXG4gICAgZXhlbXB0aW9uc0FwcGxpZWQ6IFtdLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvbW1vbiByZXF1ZXN0IGhlYWRlcnMgZm9yIGNvbXBsaWFuY2UgY2FsbHMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAneC1vcmctaWQnOiBvcmdJZCxcbiAgfTtcbiAgLy8gTk9URTogdGhlIG9sZCBgeC1pbnRlcm5hbC1zZXJ2aWNlOiB0cnVlYCBoZWFkZXIgd2FzIHJlbW92ZWQg4oCUIGl0IGlzIHRydXN0ZWRcbiAgLy8gYnkgbm90aGluZyAoaXQgd2FzIHNwb29mYWJsZSk7IGNvbXBsaWFuY2Ugcm91dGVzIGF1dGhlbnRpY2F0ZSB0aGUgY2FsbGVyIHZpYVxuICAvLyB0aGUgYEF1dGhvcml6YXRpb25gIHNlcnZpY2UgSldUIChgcmVxdWlyZVNlcnZpY2VQcmluY2lwYWxgKS5cbiAgaWYgKGF1dGhIZWFkZXIpIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGF1dGhIZWFkZXI7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIFJlcXVlc3Qgb3B0aW9ucyBmb3IgYSBjb21wbGlhbmNlIHZhbGlkYXRpb24gUE9TVC5cbiAqXG4gKiBUaGVzZSBjYWxscyBhcmUgc2lkZS1lZmZlY3QtZnJlZSAodGhleSBldmFsdWF0ZSBydWxlcyBhbmQgcmV0dXJuIGEgdmVyZGljdDtcbiAqIGFueSBhdWRpdC9ub3RpZmljYXRpb24gdGhlIGNvbXBsaWFuY2Ugc2VydmljZSB3cml0ZXMgaXMgZGVyaXZlZCwgbm90IGEgbXV0YXRpb25cbiAqIHRoZSBjYWxsZXIgZGVwZW5kcyBvbiBiZWluZyBvbmNlLW9ubHkpLCBzbyB0aGV5IGFyZSBtYXJrZWQgYGlkZW1wb3RlbnQ6IHRydWVgLlxuICogVGhhdCBsZXRzIHRoZSBIVFRQIGNsaWVudCBhdXRvLXJldHJ5IGEgdHJhbnNpZW50IDUwMyAvIGNvbm5lY3Rpb24gcmVzZXQgL1xuICogdGltZW91dCBpbnN0ZWFkIG9mIHN1cmZhY2luZyBpdCBhcyBhIGhhcmQgZmFpbHVyZSDigJQgd2hpY2gsIHVuZGVyIHRoZVxuICogZmFpbC1jbG9zZWQgZGVmYXVsdCwgd291bGQgd3JvbmdseSBSRUpFQ1QgYSBsZWdpdGltYXRlIHBsdWdpbiB1cGxvYWQgLyBwaXBlbGluZVxuICogY3JlYXRlIGp1c3QgYmVjYXVzZSBjb21wbGlhbmNlIGJyaWVmbHkgc3RhbGxlZC4gUGFpcmVkIHdpdGggdGhlIHRpZ2h0ZXJcbiAqIHBlci1hdHRlbXB0IHRpbWVvdXQgc28gdGhlIHJldHJpZXMgc3RheSB3aXRoaW4gYSBib3VuZGVkIHRvdGFsIGJ1ZGdldC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZyk6IFJlcXVlc3RPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIpLFxuICAgIGlkZW1wb3RlbnQ6IHRydWUsXG4gICAgdGltZW91dDogVkFMSURBVEVfVElNRU9VVF9NUyxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wbGlhbmNlIGNsaWVudC5cbiAqXG4gKiBJTVBPUlRBTlQ6IFRoaXMgY2xpZW50IGlzIGZhaWwtY2xvc2VkIOKAlCBpZiB0aGUgY29tcGxpYW5jZSBzZXJ2aWNlIGlzXG4gKiB1bnJlYWNoYWJsZSBvciByZXR1cm5zIGFuIGVycm9yLCB0aGUgZXJyb3IgcHJvcGFnYXRlcyBhbmQgdGhlIGNhbGxpbmdcbiAqIG9wZXJhdGlvbiAocGx1Z2luIHVwbG9hZCwgcGlwZWxpbmUgY3JlYXRlKSBpcyByZWplY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQoY29uZmlnPzogUGFydGlhbDxTZXJ2aWNlQ29uZmlnPik6IENvbXBsaWFuY2VDbGllbnQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBwcm9jZXNzLmVudi5DT01QTElBTkNFX1NFUlZJQ0VfSE9TVCA/PyAnY29tcGxpYW5jZScsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHJlc3BvbnNlIHNoYXBlICsgc3RhdHVzLiBUaGUgSFRUUCBjbGllbnQgZG9lc24ndCB0aHJvdyBvbiBub24tMnh4XG4gICAqIChpdCBqdXN0IHJldHVybnMgdGhlIGJvZHkpLCBzbyB3aXRob3V0IHRoaXMgYW4gYXV0aCBmYWlsdXJlIC8gcm91dGUgbWlzc1xuICAgKiBzaWxlbnRseSBwcm9kdWNlZCBgcmVzcG9uc2UuYm9keS5kYXRhID09PSB1bmRlZmluZWRgIGFuZCB0aGUgY2FsbGVyXG4gICAqIGNyYXNoZWQgb24gYC5ibG9ja2VkYC4gTm93IG5vbi0yeHggc3VyZmFjZXMgYXMgYSB0aHJvd24gZXJyb3IgdGhhdCB0aGVcbiAgICogb3V0ZXIgdHJ5L2NhdGNoIGNhbiB0dXJuIGludG8gZWl0aGVyIGZhaWwtY2xvc2VkIChkZWZhdWx0KSBvclxuICAgKiBDT01QTElBTkNFX0JZUEFTUyAoZmFpbC1vcGVuKS5cbiAgICovXG4gIGZ1bmN0aW9uIHVud3JhcChcbiAgICByZXNwb25zZTogeyBzdGF0dXNDb2RlOiBudW1iZXI7IGJvZHk6IHsgc3VjY2Vzcz86IGJvb2xlYW47IGRhdGE/OiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQ7IG1lc3NhZ2U/OiBzdHJpbmcgfSB9LFxuICAgIG9wOiBzdHJpbmcsXG4gICk6IENvbXBsaWFuY2VDaGVja1Jlc3VsdCB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAzMDApIHtcbiAgICAgIGNvbnN0IG1zZyA9IHJlc3BvbnNlLmJvZHk/Lm1lc3NhZ2UgPz8gYEhUVFAgJHtyZXNwb25zZS5zdGF0dXNDb2RlfWA7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXBsaWFuY2UgJHtvcH0gZmFpbGVkOiAke21zZ31gKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ib2R5Py5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXBsaWFuY2UgJHtvcH0gcmV0dXJuZWQgbm8gZGF0YSAoc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0pYCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHZhbGlkYXRlUGx1Z2luKG9yZ0lkLCBhdHRyaWJ1dGVzLCBhdXRoSGVhZGVyLCBlbnRpdHlJZCwgZW50aXR5TmFtZSwgYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YTogQ29tcGxpYW5jZUNoZWNrUmVzdWx0OyBtZXNzYWdlPzogc3RyaW5nIH0+KFxuICAgICAgICAgICcvY29tcGxpYW5jZS92YWxpZGF0ZS9wbHVnaW4nLFxuICAgICAgICAgIHsgYXR0cmlidXRlcywgZW50aXR5SWQsIGVudGl0eU5hbWUsIGFjdGlvbjogYWN0aW9uID8/ICd1cGxvYWQnIH0sXG4gICAgICAgICAgdmFsaWRhdGVPcHRpb25zKG9yZ0lkLCBhdXRoSGVhZGVyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVud3JhcChyZXNwb25zZSwgJ3ZhbGlkYXRlUGx1Z2luJyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoQ09NUExJQU5DRV9CWVBBU1MpIHJldHVybiBieXBhc3NSZXN1bHQoeyBvcmdJZCwgZW50aXR5VHlwZTogJ3BsdWdpbicsIGVudGl0eUlkLCBlbnRpdHlOYW1lIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdmFsaWRhdGVQaXBlbGluZShvcmdJZCwgYXR0cmlidXRlcywgYXV0aEhlYWRlciwgZW50aXR5SWQsIGVudGl0eU5hbWUsIGFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE6IENvbXBsaWFuY2VDaGVja1Jlc3VsdDsgbWVzc2FnZT86IHN0cmluZyB9PihcbiAgICAgICAgICAnL2NvbXBsaWFuY2UvdmFsaWRhdGUvcGlwZWxpbmUnLFxuICAgICAgICAgIHsgYXR0cmlidXRlcywgZW50aXR5SWQsIGVudGl0eU5hbWUsIGFjdGlvbjogYWN0aW9uID8/ICdjcmVhdGUnIH0sXG4gICAgICAgICAgdmFsaWRhdGVPcHRpb25zKG9yZ0lkLCBhdXRoSGVhZGVyKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVud3JhcChyZXNwb25zZSwgJ3ZhbGlkYXRlUGlwZWxpbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChDT01QTElBTkNFX0JZUEFTUykgcmV0dXJuIGJ5cGFzc1Jlc3VsdCh7IG9yZ0lkLCBlbnRpdHlUeXBlOiAncGlwZWxpbmUnLCBlbnRpdHlJZCwgZW50aXR5TmFtZSB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGRyeVJ1blBsdWdpbihvcmdJZCwgYXR0cmlidXRlcywgYXV0aEhlYWRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE6IENvbXBsaWFuY2VDaGVja1Jlc3VsdDsgbWVzc2FnZT86IHN0cmluZyB9PihcbiAgICAgICAgICAnL2NvbXBsaWFuY2UvdmFsaWRhdGUvcGx1Z2luL2RyeS1ydW4nLFxuICAgICAgICAgIHsgYXR0cmlidXRlcyB9LFxuICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcmdJZCwgYXV0aEhlYWRlciksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bndyYXAocmVzcG9uc2UsICdkcnlSdW5QbHVnaW4nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChDT01QTElBTkNFX0JZUEFTUykgcmV0dXJuIGJ5cGFzc1Jlc3VsdCh7IG9yZ0lkLCBlbnRpdHlUeXBlOiAncGx1Z2luJywgZHJ5UnVuOiB0cnVlIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZHJ5UnVuUGlwZWxpbmUob3JnSWQsIGF0dHJpYnV0ZXMsIGF1dGhIZWFkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhOiBDb21wbGlhbmNlQ2hlY2tSZXN1bHQ7IG1lc3NhZ2U/OiBzdHJpbmcgfT4oXG4gICAgICAgICAgJy9jb21wbGlhbmNlL3ZhbGlkYXRlL3BpcGVsaW5lL2RyeS1ydW4nLFxuICAgICAgICAgIHsgYXR0cmlidXRlcyB9LFxuICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcmdJZCwgYXV0aEhlYWRlciksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bndyYXAocmVzcG9uc2UsICdkcnlSdW5QaXBlbGluZScpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKENPTVBMSUFOQ0VfQllQQVNTKSByZXR1cm4gYnlwYXNzUmVzdWx0KHsgb3JnSWQsIGVudGl0eVR5cGU6ICdwaXBlbGluZScsIGRyeVJ1bjogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -50,15 +50,37 @@ export interface HttpClientResponse<T = unknown> {
|
|
|
50
50
|
* const result = await client.post('/org123/increment', { quotaType: 'apiCalls' });
|
|
51
51
|
* ```
|
|
52
52
|
*/
|
|
53
|
+
/**
|
|
54
|
+
* Options controlling the client's connection pool.
|
|
55
|
+
*/
|
|
56
|
+
export interface HttpClientOptions {
|
|
57
|
+
/**
|
|
58
|
+
* A shared `http.Agent` to reuse across clients (pools sockets to the same
|
|
59
|
+
* host). When supplied, the client does NOT own it — {@link InternalHttpClient.destroy}
|
|
60
|
+
* leaves a borrowed agent untouched so other clients keep working.
|
|
61
|
+
*/
|
|
62
|
+
agent?: http.Agent;
|
|
63
|
+
/** Cap on concurrent keep-alive sockets when minting an agent (default 64). */
|
|
64
|
+
maxSockets?: number;
|
|
65
|
+
}
|
|
53
66
|
export declare class InternalHttpClient {
|
|
54
67
|
private config;
|
|
55
68
|
private agent;
|
|
69
|
+
/** True only when this client MINTED its agent (so destroy() may tear it down). */
|
|
70
|
+
private readonly ownsAgent;
|
|
56
71
|
/**
|
|
57
72
|
* Create a new HTTP client instance.
|
|
58
73
|
*
|
|
59
74
|
* @param config - Service configuration
|
|
75
|
+
* @param options - Optional connection-pool controls (shared agent / socket cap)
|
|
76
|
+
*/
|
|
77
|
+
constructor(config: ServiceConfig, options?: HttpClientOptions);
|
|
78
|
+
/**
|
|
79
|
+
* Release the keep-alive socket pool. Idempotent and safe to call on shutdown.
|
|
80
|
+
* A borrowed (caller-supplied) agent is left intact — only an agent this client
|
|
81
|
+
* created is destroyed, so tearing down one client can't sever another's pool.
|
|
60
82
|
*/
|
|
61
|
-
|
|
83
|
+
destroy(): void;
|
|
62
84
|
/**
|
|
63
85
|
* Make a GET request.
|
|
64
86
|
*/
|
|
@@ -98,7 +120,9 @@ export declare class InternalHttpClient {
|
|
|
98
120
|
* @param config - Service configuration
|
|
99
121
|
* @returns Client wrapper with safe methods
|
|
100
122
|
*/
|
|
101
|
-
export declare function createSafeClient(config: ServiceConfig): {
|
|
123
|
+
export declare function createSafeClient(config: ServiceConfig, options?: HttpClientOptions): {
|
|
124
|
+
/** Release the underlying keep-alive socket pool (no-op on a borrowed agent). */
|
|
125
|
+
destroy(): void;
|
|
102
126
|
/**
|
|
103
127
|
* Safe GET request - returns null on error.
|
|
104
128
|
*/
|
|
@@ -9,39 +9,53 @@ const logger = createLogger('http-client');
|
|
|
9
9
|
* Default request timeout in milliseconds (env: `HTTP_CLIENT_TIMEOUT`).
|
|
10
10
|
*/
|
|
11
11
|
const DEFAULT_TIMEOUT = parseInt(process.env.HTTP_CLIENT_TIMEOUT || '5000', 10);
|
|
12
|
+
/**
|
|
13
|
+
* Default cap on concurrent keep-alive sockets per client agent
|
|
14
|
+
* (env: `HTTP_CLIENT_MAX_SOCKETS`). Node's default is `Infinity`, which lets a
|
|
15
|
+
* burst of concurrent calls open unbounded sockets against a downstream service
|
|
16
|
+
* (fd exhaustion + connection-storm on the callee). 64 is ample for
|
|
17
|
+
* service-to-service fan-out while staying bounded.
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_MAX_SOCKETS = parseInt(process.env.HTTP_CLIENT_MAX_SOCKETS || '64', 10);
|
|
12
20
|
// HTTP methods that are idempotent by definition — safe to auto-retry on a
|
|
13
21
|
// 5xx/connection/timeout without risking a duplicate side effect.
|
|
14
22
|
const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
|
|
15
|
-
/**
|
|
16
|
-
* Internal HTTP client for service-to-service communication.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* const client = new InternalHttpClient({
|
|
21
|
-
* host: 'quota',
|
|
22
|
-
* port: 3000,
|
|
23
|
-
* timeout: 5000,
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* const response = await client.get('/org123/apiCalls');
|
|
27
|
-
* const result = await client.post('/org123/increment', { quotaType: 'apiCalls' });
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
23
|
export class InternalHttpClient {
|
|
31
24
|
config;
|
|
32
25
|
agent;
|
|
26
|
+
/** True only when this client MINTED its agent (so destroy() may tear it down). */
|
|
27
|
+
ownsAgent;
|
|
33
28
|
/**
|
|
34
29
|
* Create a new HTTP client instance.
|
|
35
30
|
*
|
|
36
31
|
* @param config - Service configuration
|
|
32
|
+
* @param options - Optional connection-pool controls (shared agent / socket cap)
|
|
37
33
|
*/
|
|
38
|
-
constructor(config) {
|
|
34
|
+
constructor(config, options) {
|
|
39
35
|
this.config = {
|
|
40
36
|
host: config.host,
|
|
41
37
|
port: config.port,
|
|
42
38
|
timeout: config.timeout ?? DEFAULT_TIMEOUT,
|
|
43
39
|
};
|
|
44
|
-
|
|
40
|
+
if (options?.agent) {
|
|
41
|
+
// Borrowed, caller-owned agent — pooled across clients, not ours to destroy.
|
|
42
|
+
this.agent = options.agent;
|
|
43
|
+
this.ownsAgent = false;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Own a keep-alive agent with a BOUNDED socket pool (no more Infinity).
|
|
47
|
+
this.agent = new http.Agent({ keepAlive: true, maxSockets: options?.maxSockets ?? DEFAULT_MAX_SOCKETS });
|
|
48
|
+
this.ownsAgent = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Release the keep-alive socket pool. Idempotent and safe to call on shutdown.
|
|
53
|
+
* A borrowed (caller-supplied) agent is left intact — only an agent this client
|
|
54
|
+
* created is destroyed, so tearing down one client can't sever another's pool.
|
|
55
|
+
*/
|
|
56
|
+
destroy() {
|
|
57
|
+
if (this.ownsAgent)
|
|
58
|
+
this.agent.destroy();
|
|
45
59
|
}
|
|
46
60
|
/**
|
|
47
61
|
* Make a GET request.
|
|
@@ -220,9 +234,13 @@ export class InternalHttpClient {
|
|
|
220
234
|
* @param config - Service configuration
|
|
221
235
|
* @returns Client wrapper with safe methods
|
|
222
236
|
*/
|
|
223
|
-
export function createSafeClient(config) {
|
|
224
|
-
const client = new InternalHttpClient(config);
|
|
237
|
+
export function createSafeClient(config, options) {
|
|
238
|
+
const client = new InternalHttpClient(config, options);
|
|
225
239
|
return {
|
|
240
|
+
/** Release the underlying keep-alive socket pool (no-op on a borrowed agent). */
|
|
241
|
+
destroy() {
|
|
242
|
+
client.destroy();
|
|
243
|
+
},
|
|
226
244
|
/**
|
|
227
245
|
* Safe GET request - returns null on error.
|
|
228
246
|
*/
|
|
@@ -274,4 +292,4 @@ export function createSafeClient(config) {
|
|
|
274
292
|
},
|
|
275
293
|
};
|
|
276
294
|
}
|
|
277
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWhGLDJFQUEyRTtBQUMzRSxrRUFBa0U7QUFDbEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQXVDL0Q7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLE1BQU0sQ0FBMEI7SUFDaEMsS0FBSyxDQUFhO0lBRTFCOzs7O09BSUc7SUFDSCxZQUFZLE1BQXFCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLGVBQWU7U0FDM0MsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBYyxJQUFZLEVBQUUsT0FBd0I7UUFDM0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUksS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FDUixJQUFZLEVBQ1osSUFBYyxFQUNkLE9BQXdCO1FBRXhCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFJLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBWSxFQUNaLElBQWMsRUFDZCxPQUF3QjtRQUV4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFjLElBQVksRUFBRSxPQUF3QjtRQUM5RCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLE1BQWMsRUFDZCxJQUFZLEVBQ1osSUFBYyxFQUNkLE9BQXdCO1FBRXhCLE1BQU0sV0FBVyxHQUFnQjtZQUMvQixVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsSUFBSSxtQkFBbUI7WUFDdEQsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixJQUFJLDhCQUE4QjtZQUNuRixZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxzQkFBc0I7U0FDOUQsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTNGLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLDZFQUE2RTtRQUM3RSw0RUFBNEU7UUFDNUUsOEVBQThFO1FBQzlFLE1BQU0sU0FBUyxHQUNiLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsT0FBTyxFQUFFLFVBQVUsS0FBSyxJQUFJO1lBQzVCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRyxJQUFJLFNBQTRCLENBQUM7UUFFakMsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBSSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFFcEUsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDL0Ysd0VBQXdFO2dCQUN4RSxvRUFBb0U7Z0JBQ3BFLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZFLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDaEgsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsU0FBUztnQkFDWCxDQUFDO2dCQUVELE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUV0RSxNQUFNLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzdELElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2RyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsbUVBQW1FO2dCQUNuRSxNQUFNLFNBQVMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBVSxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMsRUFBVTtRQUN0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNLLE9BQU8sQ0FDYixNQUFjLEVBQ2QsSUFBWSxFQUNaLElBQWMsRUFDZCxPQUF3QjtRQUV4QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLHFGQUFxRjtZQUNyRixNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFdEUsTUFBTSxPQUFPLEdBQTZCO2dCQUN4QyxjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxHQUFHLE9BQU8sRUFBRSxPQUFPO2FBQ3BCLENBQUM7WUFFRiwrQ0FBK0M7WUFDL0MsSUFBSSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQzlDLENBQUM7WUFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELGtFQUFrRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUVELE1BQU0sY0FBYyxHQUF3QjtnQkFDMUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtnQkFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtnQkFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlDLE1BQU07Z0JBQ04sT0FBTztnQkFDUCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2hELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUVkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksSUFBSSxLQUFLLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2dCQUVILEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtvQkFDakIsSUFBSSxDQUFDO3dCQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNoRCxPQUFPLENBQUM7NEJBQ04sVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLHFCQUFxQjs0QkFDOUQsSUFBSSxFQUFFLFVBQWU7NEJBQ3JCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzt5QkFDckIsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTs0QkFDM0MsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTs0QkFDdEIsSUFBSTs0QkFDSixLQUFLLEVBQUUsVUFBVSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzt5QkFDN0UsQ0FBQyxDQUFDO3dCQUNILE9BQU8sQ0FBQzs0QkFDTixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMscUJBQXFCOzRCQUM5RCxJQUFJLEVBQUUsRUFBTzs0QkFDYixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87eUJBQ3JCLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN4Qix1RUFBdUU7Z0JBQ3ZFLHFFQUFxRTtnQkFDckUsNENBQTRDO2dCQUM1QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFLLEtBQStCLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ3BGLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7b0JBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7b0JBQ3RCLElBQUk7b0JBQ0osTUFBTTtvQkFDTixLQUFLLEVBQUUsTUFBTTtpQkFDZCxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBRUgsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNyQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDbEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDdEIsSUFBSTtvQkFDSixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2lCQUM3QixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLENBQUM7WUFFRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFxQjtJQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU87UUFDTDs7V0FFRztRQUNILEtBQUssQ0FBQyxHQUFHLENBQUksSUFBWSxFQUFFLE9BQXdCO1lBQ2pELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVEOztXQUVHO1FBQ0gsS0FBSyxDQUFDLElBQUksQ0FDUixJQUFZLEVBQ1osSUFBYyxFQUNkLE9BQXdCO1lBRXhCLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBWSxFQUNaLElBQWMsRUFDZCxPQUF3QjtZQUV4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUksSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuSCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FDVixJQUFZLEVBQ1osT0FBd0I7WUFFeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFJLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0SCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFYX1JFVFJJRVMsXG4gIERFRkFVTFRfUkVUUllfREVMQVlfTVMsXG4gIERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyxcbiAgZ2V0UmV0cnlEZWNpc2lvbixcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxuICB0eXBlIFJldHJ5Q29uZmlnLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmltcG9ydCB7IEh0dHBTdGF0dXMgfSBmcm9tICcuLi9jb25zdGFudHMvaHR0cC1zdGF0dXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaHR0cC1jbGllbnQnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGVudjogYEhUVFBfQ0xJRU5UX1RJTUVPVVRgKS5cbiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfVElNRU9VVCB8fCAnNTAwMCcsIDEwKTtcblxuLy8gSFRUUCBtZXRob2RzIHRoYXQgYXJlIGlkZW1wb3RlbnQgYnkgZGVmaW5pdGlvbiDigJQgc2FmZSB0byBhdXRvLXJldHJ5IG9uIGFcbi8vIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgd2l0aG91dCByaXNraW5nIGEgZHVwbGljYXRlIHNpZGUgZWZmZWN0LlxuY29uc3QgSURFTVBPVEVOVF9NRVRIT0RTID0gbmV3IFNldChbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXSk7XG5cbi8qKlxuICogSFRUUCByZXF1ZXN0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnMge1xuICAvKiogUmVxdWVzdCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKSAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgc3BlY2lmaWNhbGx5IGZvciA0MjkgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDogNCkgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgKGFkZGVkIGFzIFgtUmVxdWVzdC1JZCBoZWFkZXIpICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyZWF0IHRoaXMgcmVxdWVzdCBhcyBzYWZlIHRvIGF1dG8tcmV0cnkgb24gNXh4L2Nvbm5lY3Rpb24vdGltZW91dCBldmVuXG4gICAqIHRob3VnaCB0aGUgbWV0aG9kIGlzIG5vbi1pZGVtcG90ZW50IChlLmcuIHRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50IGJ5IGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSwgb3IgdGhlIG9wZXJhdGlvbiBpcyBuYXR1cmFsbHkgaWRlbXBvdGVudCkuIERlZmF1bHQgZmFsc2U6XG4gICAqIG5vbi1pZGVtcG90ZW50IG1ldGhvZHMgYXJlIE5PVCByZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLCBvbmx5IG9uIDQyOS5cbiAgICovXG4gIGlkZW1wb3RlbnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IHJlc3BvbnNlIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudFJlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIC8qKiBIVFRQIHN0YXR1cyBjb2RlICovXG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgLyoqIFJlc3BvbnNlIGJvZHkgKHBhcnNlZCBKU09OKSAqL1xuICBib2R5OiBUO1xuICAvKiogUmVzcG9uc2UgaGVhZGVycyAqL1xuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgSFRUUCBjbGllbnQgZm9yIHNlcnZpY2UtdG8tc2VydmljZSBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAqICAgaG9zdDogJ3F1b3RhJyxcbiAqICAgcG9ydDogMzAwMCxcbiAqICAgdGltZW91dDogNTAwMCxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL29yZzEyMy9hcGlDYWxscycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBvc3QoJy9vcmcxMjMvaW5jcmVtZW50JywgeyBxdW90YVR5cGU6ICdhcGlDYWxscycgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsSHR0cENsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxTZXJ2aWNlQ29uZmlnPjtcbiAgcHJpdmF0ZSBhZ2VudDogaHR0cC5BZ2VudDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEhUVFAgY2xpZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgfTtcbiAgICB0aGlzLmFnZW50ID0gbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIEdFVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignR0VUJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgUE9TVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcG9zdDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQT1NUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBVVCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcHV0PFQgPSB1bmtub3duPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ1BVVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBERUxFVEUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0RFTEVURScsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB3aXRoIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXMuXG4gICAqXG4gICAqIC0gNDI5IChyYXRlIGxpbWl0KTogcmVzcGVjdHMgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIHVzZXMgbG9uZ2VyIGJhc2UgZGVsYXkgKDR4KSxcbiAgICogICByZXRyaWVzIHVwIHRvIGBtYXhSYXRlTGltaXRSZXRyaWVzYCB0aW1lcyAoZGVmYXVsdCA0KS5cbiAgICogLSA1MDIvNTAzLzUwNCAoc2VydmVyIGVycm9ycyk6IHN0YW5kYXJkIGV4cG9uZW50aWFsIGJhY2tvZmYsIHVwIHRvIGBtYXhSZXRyaWVzYCAoZGVmYXVsdCAyKS5cbiAgICogLSBDb25uZWN0aW9uIGVycm9ycyAvIHRpbWVvdXRzOiByZXRyaWVzIHVwIHRvIGBtYXhSZXRyaWVzYC5cbiAgICogLSBBbGwgZGVsYXlzIGluY2x1ZGUgwrEyNSUgaml0dGVyIHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0V2l0aFJldHJ5PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpO1xuXG4gICAgLy8gV2hldGhlciBpdCdzIHNhZmUgdG8gYXV0by1yZXRyeSB0aGlzIHJlcXVlc3Qgb24gYSA1eHgvY29ubmVjdGlvbi90aW1lb3V0LlxuICAgIC8vIEEgdGltZWQtb3V0IFBPU1QgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBzZXJ2ZXItc2lkZSwgc28gcmV0cnlpbmdcbiAgICAvLyBhIG5vbi1pZGVtcG90ZW50IHJlcXVlc3Qgcmlza3MgYSBEVVBMSUNBVEUgc2lkZSBlZmZlY3QgKGRvdWJsZS1jaGFyZ2UsXG4gICAgLy8gZG91YmxlLWNyZWF0ZSkuIE9ubHkgR0VUL0hFQUQvT1BUSU9OUywgYW4gZXhwbGljaXQgYGlkZW1wb3RlbnRgIG9wdC1pbiwgb3JcbiAgICAvLyBhIHJlcXVlc3QgY2FycnlpbmcgYW4gSWRlbXBvdGVuY3ktS2V5IGFyZSBhdXRvLXJldHJpZWQgb24gdGhvc2UgZmFpbHVyZXMuXG4gICAgLy8gKDQyOSBpcyBhbHdheXMgcmV0cmllZCDigJQgc2VlIGJlbG93IOKAlCBzaW5jZSBpdCB3YXMgcmVqZWN0ZWQsIG5vdCBwcm9jZXNzZWQuKVxuICAgIGNvbnN0IHJldHJ5U2FmZSA9XG4gICAgICBJREVNUE9URU5UX01FVEhPRFMuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSB8fFxuICAgICAgb3B0aW9ucz8uaWRlbXBvdGVudCA9PT0gdHJ1ZSB8fFxuICAgICAgISEob3B0aW9ucz8uaGVhZGVycyAmJiAob3B0aW9ucy5oZWFkZXJzWydJZGVtcG90ZW5jeS1LZXknXSB8fCBvcHRpb25zLmhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddKSk7XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IHRvdGFsTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8VD4obWV0aG9kLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldFJldHJ5RGVjaXNpb24ocmVzcG9uc2Uuc3RhdHVzQ29kZSwgcmVzcG9uc2UuaGVhZGVycywgYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICAvLyA0MjkgaXMgc2FmZSB0byByZXRyeSBmb3IgQU5ZIG1ldGhvZCAocmF0ZS1saW1pdGVkIOKGkiBub3QgcHJvY2Vzc2VkKTsgYVxuICAgICAgICAvLyA1eHgvZ2F0ZXdheSBlcnJvciBpcyBvbmx5IHJldHJpZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyByZXRyeS1zYWZlLlxuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSB8fCByZXRyeVNhZmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGRlY2lzaW9uLnJlYXNvbiArICcsIHJldHJ5aW5nJywgeyBtZXRob2QsIHBhdGgsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLCBkZWxheU1zOiBkZWNpc2lvbi5kZWxheU1zIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRFcnJvclJldHJ5RGVjaXNpb24oYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgcmV0cnlTYWZlKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXRyeWluZyBhZnRlciBlcnJvcicsIHsgbWV0aG9kLCBwYXRoLCBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHJldHJ5aW5nIChub24taWRlbXBvdGVudCwgb3IgYXR0ZW1wdHMgZXhoYXVzdGVkKSDigJQgZmFpbCBub3cuXG4gICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBsYXN0RXJyb3IhO1xuICB9XG5cbiAgcHJpdmF0ZSBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHJlcXVlc3QgbWV0aG9kLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFNlcmlhbGl6ZSB3aGVuIGJvZHkgaXMgZGVmaW5lZCAoaW5jbHVkaW5nIDAvZmFsc2UvJycgd2hpY2ggYXJlIHZhbGlkIEpTT04gdmFsdWVzKS5cbiAgICAgIGNvbnN0IGJvZHlTdHIgPSBib2R5ICE9PSB1bmRlZmluZWQgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgaGVhZGVyczogaHR0cC5PdXRnb2luZ0h0dHBIZWFkZXJzID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfTtcblxuICAgICAgLy8gUHJvcGFnYXRlIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmdcbiAgICAgIGlmIChvcHRpb25zPy5yZXF1ZXN0SWQpIHtcbiAgICAgICAgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSBvcHRpb25zLnJlcXVlc3RJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlTdHIpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHlTdHIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIHRvIHByZXZlbnQgcHJvdG9jb2wgaW5qZWN0aW9uIC8gcmVxdWVzdCBzbXVnZ2xpbmdcbiAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXF1ZXN0IHBhdGg6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGhvc3RuYW1lOiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICBwYXRoOiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiBgLyR7cGF0aH1gLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcblxuICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHBhcnNlZEJvZHkgYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGJvZHknLCB7XG4gICAgICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiBwYXJzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwYXJzZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocGFyc2VFcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keToge30gYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gTm9kZSBkdWFsLXN0YWNrIGNvbm5lY3QgZmFpbHVyZXMgYXJlIGFuIEFnZ3JlZ2F0ZUVycm9yIHdpdGggYW4gZW1wdHlcbiAgICAgICAgLy8gYC5tZXNzYWdlYDsgdGhlIGNhdXNlIGlzIGluIGAuY29kZWAgKEVDT05OUkVGVVNFRC9FVElNRURPVVQpLiBGYWxsXG4gICAgICAgIC8vIGJhY2sgc28gdGhlIGxvZyBpc24ndCBhIGJsYW5rIGBlcnJvcjpcIlwiYC5cbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyb3IubWVzc2FnZSB8fCAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGxvZ2dlci5lcnJvcignSFRUUCByZXF1ZXN0IGZhaWxlZCcsIHtcbiAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGRldGFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGhpcy5jb25maWcudGltZW91dH1tc2ApO1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogU2FmZSBHRVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXQ8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZ2V0PFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBHRVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUE9TVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIHBvc3Q8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucG9zdDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUE9TVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgREVMRVRFIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuIFVzZWQgYnkgZGVzdHJ1Y3RpdmVcbiAgICAgKiBjcm9zcy1zZXJ2aWNlIG9wZXJhdGlvbnMgKGUuZy4gb3JnLWNhc2NhZGUgZGVsZXRlIGluIHBsYXRmb3JtKS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGU8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmRlbGV0ZTxUPihwYXRoLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgREVMRVRFIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWhGOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXRGLDJFQUEyRTtBQUMzRSxrRUFBa0U7QUFDbEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQW9FL0QsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixNQUFNLENBQTBCO0lBQ2hDLEtBQUssQ0FBYTtJQUMxQixtRkFBbUY7SUFDbEUsU0FBUyxDQUFVO0lBRXBDOzs7OztPQUtHO0lBQ0gsWUFBWSxNQUFxQixFQUFFLE9BQTJCO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixJQUFJLEVBQUUsTUFB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aUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVEOzs7V0FHRztRQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsSUFBWSxFQUNaLE9BQXdCO1lBRXhCLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEgsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbiAgdHlwZSBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2h0dHAtY2xpZW50Jyk7XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChlbnY6IGBIVFRQX0NMSUVOVF9USU1FT1VUYCkuXG4gKi9cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX1RJTUVPVVQgfHwgJzUwMDAnLCAxMCk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgcGVyIGNsaWVudCBhZ2VudFxuICogKGVudjogYEhUVFBfQ0xJRU5UX01BWF9TT0NLRVRTYCkuIE5vZGUncyBkZWZhdWx0IGlzIGBJbmZpbml0eWAsIHdoaWNoIGxldHMgYVxuICogYnVyc3Qgb2YgY29uY3VycmVudCBjYWxscyBvcGVuIHVuYm91bmRlZCBzb2NrZXRzIGFnYWluc3QgYSBkb3duc3RyZWFtIHNlcnZpY2VcbiAqIChmZCBleGhhdXN0aW9uICsgY29ubmVjdGlvbi1zdG9ybSBvbiB0aGUgY2FsbGVlKS4gNjQgaXMgYW1wbGUgZm9yXG4gKiBzZXJ2aWNlLXRvLXNlcnZpY2UgZmFuLW91dCB3aGlsZSBzdGF5aW5nIGJvdW5kZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1NPQ0tFVFMgPSBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9NQVhfU09DS0VUUyB8fCAnNjQnLCAxMCk7XG5cbi8vIEhUVFAgbWV0aG9kcyB0aGF0IGFyZSBpZGVtcG90ZW50IGJ5IGRlZmluaXRpb24g4oCUIHNhZmUgdG8gYXV0by1yZXRyeSBvbiBhXG4vLyA1eHgvY29ubmVjdGlvbi90aW1lb3V0IHdpdGhvdXQgcmlza2luZyBhIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdC5cbmNvbnN0IElERU1QT1RFTlRfTUVUSE9EUyA9IG5ldyBTZXQoWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pO1xuXG4vKipcbiAqIEhUVFAgcmVxdWVzdCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFJlcXVlc3QgaGVhZGVycyAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMikgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIEJhc2UgZGVsYXkgYmV0d2VlbiByZXRyaWVzIGluIG1zIOKAlCBkb3VibGVzIGVhY2ggYXR0ZW1wdCAoZGVmYXVsdDogMjAwKSAqL1xuICByZXRyeURlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHNwZWNpZmljYWxseSBmb3IgNDI5IHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IDQpICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIChhZGRlZCBhcyBYLVJlcXVlc3QtSWQgaGVhZGVyKSAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcmVhdCB0aGlzIHJlcXVlc3QgYXMgc2FmZSB0byBhdXRvLXJldHJ5IG9uIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgZXZlblxuICAgKiB0aG91Z2ggdGhlIG1ldGhvZCBpcyBub24taWRlbXBvdGVudCAoZS5nLiB0aGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudCBieSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXksIG9yIHRoZSBvcGVyYXRpb24gaXMgbmF0dXJhbGx5IGlkZW1wb3RlbnQpLiBEZWZhdWx0IGZhbHNlOlxuICAgKiBub24taWRlbXBvdGVudCBtZXRob2RzIGFyZSBOT1QgcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcywgb25seSBvbiA0MjkuXG4gICAqL1xuICBpZGVtcG90ZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIVFRQIGNsaWVudCByZXNwb25zZSB3cmFwcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIC8qKiBSZXNwb25zZSBib2R5IChwYXJzZWQgSlNPTikgKi9cbiAgYm9keTogVDtcbiAgLyoqIFJlc3BvbnNlIGhlYWRlcnMgKi9cbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzO1xufVxuXG4vKipcbiAqIEludGVybmFsIEhUVFAgY2xpZW50IGZvciBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gKiAgIGhvc3Q6ICdxdW90YScsXG4gKiAgIHBvcnQ6IDMwMDAsXG4gKiAgIHRpbWVvdXQ6IDUwMDAsXG4gKiB9KTtcbiAqXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9vcmcxMjMvYXBpQ2FsbHMnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KCcvb3JnMTIzL2luY3JlbWVudCcsIHsgcXVvdGFUeXBlOiAnYXBpQ2FsbHMnIH0pO1xuICogYGBgXG4gKi9cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBwb29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgc2hhcmVkIGBodHRwLkFnZW50YCB0byByZXVzZSBhY3Jvc3MgY2xpZW50cyAocG9vbHMgc29ja2V0cyB0byB0aGUgc2FtZVxuICAgKiBob3N0KS4gV2hlbiBzdXBwbGllZCwgdGhlIGNsaWVudCBkb2VzIE5PVCBvd24gaXQg4oCUIHtAbGluayBJbnRlcm5hbEh0dHBDbGllbnQuZGVzdHJveX1cbiAgICogbGVhdmVzIGEgYm9ycm93ZWQgYWdlbnQgdW50b3VjaGVkIHNvIG90aGVyIGNsaWVudHMga2VlcCB3b3JraW5nLlxuICAgKi9cbiAgYWdlbnQ/OiBodHRwLkFnZW50O1xuICAvKiogQ2FwIG9uIGNvbmN1cnJlbnQga2VlcC1hbGl2ZSBzb2NrZXRzIHdoZW4gbWludGluZyBhbiBhZ2VudCAoZGVmYXVsdCA2NCkuICovXG4gIG1heFNvY2tldHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEh0dHBDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8U2VydmljZUNvbmZpZz47XG4gIHByaXZhdGUgYWdlbnQ6IGh0dHAuQWdlbnQ7XG4gIC8qKiBUcnVlIG9ubHkgd2hlbiB0aGlzIGNsaWVudCBNSU5URUQgaXRzIGFnZW50IChzbyBkZXN0cm95KCkgbWF5IHRlYXIgaXQgZG93bikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3duc0FnZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBTZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25uZWN0aW9uLXBvb2wgY29udHJvbHMgKHNoYXJlZCBhZ2VudCAvIHNvY2tldCBjYXApXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zPy5hZ2VudCkge1xuICAgICAgLy8gQm9ycm93ZWQsIGNhbGxlci1vd25lZCBhZ2VudCDigJQgcG9vbGVkIGFjcm9zcyBjbGllbnRzLCBub3Qgb3VycyB0byBkZXN0cm95LlxuICAgICAgdGhpcy5hZ2VudCA9IG9wdGlvbnMuYWdlbnQ7XG4gICAgICB0aGlzLm93bnNBZ2VudCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPd24gYSBrZWVwLWFsaXZlIGFnZW50IHdpdGggYSBCT1VOREVEIHNvY2tldCBwb29sIChubyBtb3JlIEluZmluaXR5KS5cbiAgICAgIHRoaXMuYWdlbnQgPSBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogdHJ1ZSwgbWF4U29ja2V0czogb3B0aW9ucz8ubWF4U29ja2V0cyA/PyBERUZBVUxUX01BWF9TT0NLRVRTIH0pO1xuICAgICAgdGhpcy5vd25zQWdlbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBrZWVwLWFsaXZlIHNvY2tldCBwb29sLiBJZGVtcG90ZW50IGFuZCBzYWZlIHRvIGNhbGwgb24gc2h1dGRvd24uXG4gICAqIEEgYm9ycm93ZWQgKGNhbGxlci1zdXBwbGllZCkgYWdlbnQgaXMgbGVmdCBpbnRhY3Qg4oCUIG9ubHkgYW4gYWdlbnQgdGhpcyBjbGllbnRcbiAgICogY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHNvIHRlYXJpbmcgZG93biBvbmUgY2xpZW50IGNhbid0IHNldmVyIGFub3RoZXIncyBwb29sLlxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vd25zQWdlbnQpIHRoaXMuYWdlbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBHRVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBPU1QgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUE9TVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQVVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQVVQnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdERUxFVEUnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiAtIDQyOSAocmF0ZSBsaW1pdCk6IHJlc3BlY3RzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLCB1c2VzIGxvbmdlciBiYXNlIGRlbGF5ICg0eCksXG4gICAqICAgcmV0cmllcyB1cCB0byBgbWF4UmF0ZUxpbWl0UmV0cmllc2AgdGltZXMgKGRlZmF1bHQgNCkuXG4gICAqIC0gNTAyLzUwMy81MDQgKHNlcnZlciBlcnJvcnMpOiBzdGFuZGFyZCBleHBvbmVudGlhbCBiYWNrb2ZmLCB1cCB0byBgbWF4UmV0cmllc2AgKGRlZmF1bHQgMikuXG4gICAqIC0gQ29ubmVjdGlvbiBlcnJvcnMgLyB0aW1lb3V0czogcmV0cmllcyB1cCB0byBgbWF4UmV0cmllc2AuXG4gICAqIC0gQWxsIGRlbGF5cyBpbmNsdWRlIMKxMjUlIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdFdpdGhSZXRyeTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IHJldHJ5Q29uZmlnOiBSZXRyeUNvbmZpZyA9IHtcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnM/Lm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIG1heFJhdGVMaW1pdFJldHJpZXM6IG9wdGlvbnM/Lm1heFJhdGVMaW1pdFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICAgICAgcmV0cnlEZWxheU1zOiBvcHRpb25zPy5yZXRyeURlbGF5TXMgPz8gREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgICB9O1xuICAgIGNvbnN0IHRvdGFsTWF4QXR0ZW1wdHMgPSBNYXRoLm1heChyZXRyeUNvbmZpZy5tYXhSZXRyaWVzLCByZXRyeUNvbmZpZy5tYXhSYXRlTGltaXRSZXRyaWVzKTtcblxuICAgIC8vIFdoZXRoZXIgaXQncyBzYWZlIHRvIGF1dG8tcmV0cnkgdGhpcyByZXF1ZXN0IG9uIGEgNXh4L2Nvbm5lY3Rpb24vdGltZW91dC5cbiAgICAvLyBBIHRpbWVkLW91dCBQT1NUIG1heSBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgc2VydmVyLXNpZGUsIHNvIHJldHJ5aW5nXG4gICAgLy8gYSBub24taWRlbXBvdGVudCByZXF1ZXN0IHJpc2tzIGEgRFVQTElDQVRFIHNpZGUgZWZmZWN0IChkb3VibGUtY2hhcmdlLFxuICAgIC8vIGRvdWJsZS1jcmVhdGUpLiBPbmx5IEdFVC9IRUFEL09QVElPTlMsIGFuIGV4cGxpY2l0IGBpZGVtcG90ZW50YCBvcHQtaW4sIG9yXG4gICAgLy8gYSByZXF1ZXN0IGNhcnJ5aW5nIGFuIElkZW1wb3RlbmN5LUtleSBhcmUgYXV0by1yZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLlxuICAgIC8vICg0MjkgaXMgYWx3YXlzIHJldHJpZWQg4oCUIHNlZSBiZWxvdyDigJQgc2luY2UgaXQgd2FzIHJlamVjdGVkLCBub3QgcHJvY2Vzc2VkLilcbiAgICBjb25zdCByZXRyeVNhZmUgPVxuICAgICAgSURFTVBPVEVOVF9NRVRIT0RTLmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSkgfHxcbiAgICAgIG9wdGlvbnM/LmlkZW1wb3RlbnQgPT09IHRydWUgfHxcbiAgICAgICEhKG9wdGlvbnM/LmhlYWRlcnMgJiYgKG9wdGlvbnMuaGVhZGVyc1snSWRlbXBvdGVuY3ktS2V5J10gfHwgb3B0aW9ucy5oZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSkpO1xuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSB0b3RhbE1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PFQ+KG1ldGhvZCwgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRSZXRyeURlY2lzaW9uKHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMsIGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgLy8gNDI5IGlzIHNhZmUgdG8gcmV0cnkgZm9yIEFOWSBtZXRob2QgKHJhdGUtbGltaXRlZCDihpIgbm90IHByb2Nlc3NlZCk7IGFcbiAgICAgICAgLy8gNXh4L2dhdGV3YXkgZXJyb3IgaXMgb25seSByZXRyaWVkIHdoZW4gdGhlIHJlcXVlc3QgaXMgcmV0cnktc2FmZS5cbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5ICYmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkgfHwgcmV0cnlTYWZlKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhkZWNpc2lvbi5yZWFzb24gKyAnLCByZXRyeWluZycsIHsgbWV0aG9kLCBwYXRoLCBhdHRlbXB0OiBhdHRlbXB0ICsgMSwgZGVsYXlNczogZGVjaXNpb24uZGVsYXlNcyB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0RXJyb3JSZXRyeURlY2lzaW9uKGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5ICYmIHJldHJ5U2FmZSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0cnlpbmcgYWZ0ZXIgZXJyb3InLCB7IG1ldGhvZCwgcGF0aCwgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLCBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCByZXRyeWluZyAobm9uLWlkZW1wb3RlbnQsIG9yIGF0dGVtcHRzIGV4aGF1c3RlZCkg4oCUIGZhaWwgbm93LlxuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbGFzdEVycm9yITtcbiAgfVxuXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZXF1ZXN0IG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTZXJpYWxpemUgd2hlbiBib2R5IGlzIGRlZmluZWQgKGluY2x1ZGluZyAwL2ZhbHNlLycnIHdoaWNoIGFyZSB2YWxpZCBKU09OIHZhbHVlcykuXG4gICAgICBjb25zdCBib2R5U3RyID0gYm9keSAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IGh0dHAuT3V0Z29pbmdIdHRwSGVhZGVycyA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nXG4gICAgICBpZiAob3B0aW9ucz8ucmVxdWVzdElkKSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtUmVxdWVzdC1JZCddID0gb3B0aW9ucy5yZXF1ZXN0SWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcGF0aCB0byBwcmV2ZW50IHByb3RvY29sIGluamVjdGlvbiAvIHJlcXVlc3Qgc211Z2dsaW5nXG4gICAgICBpZiAocGF0aC5pbmNsdWRlcygnOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IC9bXFxyXFxuXFwwXS8udGVzdChwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBodHRwLlJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBob3N0bmFtZTogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5jb25maWcucG9ydCxcbiAgICAgICAgcGF0aDogcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoIDogYC8ke3BhdGh9YCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIGFnZW50OiB0aGlzLmFnZW50LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCAocmVzKSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG5cbiAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IHt9O1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBwYXJzZSByZXNwb25zZSBib2R5Jywge1xuICAgICAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogcGFyc2VFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcGFyc2VFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBhcnNlRXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHt9IGFzIFQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIE5vZGUgZHVhbC1zdGFjayBjb25uZWN0IGZhaWx1cmVzIGFyZSBhbiBBZ2dyZWdhdGVFcnJvciB3aXRoIGFuIGVtcHR5XG4gICAgICAgIC8vIGAubWVzc2FnZWA7IHRoZSBjYXVzZSBpcyBpbiBgLmNvZGVgIChFQ09OTlJFRlVTRUQvRVRJTUVET1VUKS4gRmFsbFxuICAgICAgICAvLyBiYWNrIHNvIHRoZSBsb2cgaXNuJ3QgYSBibGFuayBgZXJyb3I6XCJcImAuXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGVycm9yLm1lc3NhZ2UgfHwgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSB8fCBlcnJvci5uYW1lO1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0hUVFAgcmVxdWVzdCBmYWlsZWQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGVycm9yOiBkZXRhaWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dCBhZnRlciAke3RoaXMuY29uZmlnLnRpbWVvdXR9bXNgKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0Jywge1xuICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICByZXEud3JpdGUoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBIVFRQIGNsaWVudCB3aXRoIGVycm9yIGhhbmRsaW5nIHRoYXQgcmV0dXJucyBudWxsIG9uIGZhaWx1cmUuXG4gKiBVc2VmdWwgZm9yIGZhaWwtb3BlbiBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xpZW50IHdyYXBwZXIgd2l0aCBzYWZlIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNhZmVDbGllbnQoY29uZmlnOiBTZXJ2aWNlQ29uZmlnLCBvcHRpb25zPzogSHR0cENsaWVudE9wdGlvbnMpIHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChjb25maWcsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqIFJlbGVhc2UgdGhlIHVuZGVybHlpbmcga2VlcC1hbGl2ZSBzb2NrZXQgcG9vbCAobm8tb3Agb24gYSBib3Jyb3dlZCBhZ2VudCkuICovXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIGNsaWVudC5kZXN0cm95KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgR0VUIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmdldDxUPihwYXRoLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgR0VUIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNhZmUgUFVUIHJlcXVlc3QgLSByZXR1cm5zIG51bGwgb24gZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgcHV0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnB1dDxUPihwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NhZmUgUFVUIGZhaWxlZCwgcmV0dXJuaW5nIG51bGwnLCB7IHBhdGgsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIERFTEVURSByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLiBVc2VkIGJ5IGRlc3RydWN0aXZlXG4gICAgICogY3Jvc3Mtc2VydmljZSBvcGVyYXRpb25zIChlLmcuIG9yZy1jYXNjYWRlIGRlbGV0ZSBpbiBwbGF0Zm9ybSkuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlPFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICAgICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5kZWxldGU8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIERFTEVURSBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
|
package/lib/services/index.d.ts
CHANGED
|
@@ -12,4 +12,3 @@ export * from './remote-audit-client.js';
|
|
|
12
12
|
export * from './audit-spool.js';
|
|
13
13
|
export * from './env-redis.js';
|
|
14
14
|
export * from './token-revocation.js';
|
|
15
|
-
export { enqueueComplianceEvent, registerComplianceQueueBackend, type ComplianceEvent } from './compliance-queue.js';
|
package/lib/services/index.js
CHANGED
|
@@ -13,5 +13,4 @@ export * from './remote-audit-client.js';
|
|
|
13
13
|
export * from './audit-spool.js';
|
|
14
14
|
export * from './env-redis.js';
|
|
15
15
|
export * from './token-revocation.js';
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQXdCLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGNhbGN1bGF0ZUJhY2tvZmYsXG4gIGlzVHJhbnNpZW50U3RhdHVzQ29kZSxcbiAgaXNSYXRlTGltaXRlZCxcbiAgZ2V0UmV0cnlEZWNpc2lvbixcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcsIFJldHJ5RGVjaXNpb24gfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90b2tlbi1yZXZvY2F0aW9uLmpzJztcbmV4cG9ydCB7IGVucXVldWVDb21wbGlhbmNlRXZlbnQsIHJlZ2lzdGVyQ29tcGxpYW5jZVF1ZXVlQmFja2VuZCwgdHlwZSBDb21wbGlhbmNlRXZlbnQgfSBmcm9tICcuL2NvbXBsaWFuY2UtcXVldWUuanMnO1xuIl19
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLXNlcnZpY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVkdWxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtY2xpZW50LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmV4cG9ydCB7XG4gIERFRkFVTFRfTUFYX1JFVFJJRVMsXG4gIERFRkFVTFRfUkVUUllfREVMQVlfTVMsXG4gIERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyxcbiAgY2FsY3VsYXRlQmFja29mZixcbiAgaXNUcmFuc2llbnRTdGF0dXNDb2RlLFxuICBpc1JhdGVMaW1pdGVkLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHR5cGUgeyBSZXRyeUNvbmZpZywgUmV0cnlEZWNpc2lvbiB9IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuIl19
|
|
@@ -12,7 +12,7 @@ import type { OrgRole } from './common.js';
|
|
|
12
12
|
* global `isSuperAdmin` flag, not a per-org permission; and `requireStepUp`
|
|
13
13
|
* (MFA) / `requireFeature` (plan entitlements) remain orthogonal gates.
|
|
14
14
|
*/
|
|
15
|
-
export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings';
|
|
15
|
+
export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms';
|
|
16
16
|
/** All valid permissions (order determines display order in the picker). */
|
|
17
17
|
export declare const ALL_PERMISSIONS: readonly Permission[];
|
|
18
18
|
/** Check whether a string is a valid Permission. */
|
package/lib/types/permissions.js
CHANGED
|
@@ -13,7 +13,7 @@ export const ALL_PERMISSIONS = [
|
|
|
13
13
|
'billing:read', 'billing:manage',
|
|
14
14
|
'quotas:read',
|
|
15
15
|
'registry:read', 'registry:write',
|
|
16
|
-
'org:settings',
|
|
16
|
+
'org:settings', 'org:idp', 'org:kms',
|
|
17
17
|
];
|
|
18
18
|
/** Check whether a string is a valid Permission. */
|
|
19
19
|
export function isValidPermission(value) {
|
|
@@ -125,4 +125,4 @@ export function hasPermission(granted, permission, isSuperAdmin) {
|
|
|
125
125
|
return true;
|
|
126
126
|
return !!granted && granted.includes(permission);
|
|
127
127
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTBEdEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3hELGNBQWMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xELGlCQUFpQixFQUFFLGtCQUFrQjtJQUNyQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CO0lBQ3RELGlCQUFpQixFQUFFLGtCQUFrQjtJQUNyQyxvQkFBb0IsRUFBRSxxQkFBcUI7SUFDM0MsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxlQUFlLEVBQUUsZ0JBQWdCO0lBQ2pDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYTtJQUNiLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYztDQUNmLENBQUM7QUFFRixvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsT0FBUSxlQUFxQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQTBCO0lBQ2hFLGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FDckMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRSwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQXNCO0lBQzlELE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELGdGQUFnRjtBQUNoRiw2QkFBNkI7QUFDN0IsZ0ZBQWdGO0FBRWhGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sa0JBQWtCLEdBQTBCO0lBQ2hELGdCQUFnQixFQUFFLGlCQUFpQjtJQUNuQyxjQUFjLEVBQUUsZUFBZTtJQUMvQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2QsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxjQUFjO0lBQ2QsYUFBYTtDQUNkLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUEwQixDQUFDLEdBQUcsMEJBQTBCLENBQUMsQ0FBQztBQUVqRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUEyQztJQUN0RSxNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLEtBQUssRUFBRSxpQkFBaUI7SUFDeEIsS0FBSyxFQUFFLGlCQUFpQjtDQUN6QixDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGFBQWE7QUFDYixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLG1CQUE4QyxFQUM5QyxZQUFzQjtJQUV0QixJQUFJLFlBQVk7UUFBRSxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQ3BDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDcEMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQTZDLEVBQzdDLFVBQXNCLEVBQ3RCLFlBQXNCO0lBRXRCLElBQUksWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gUGx1Z2luc1xuICB8ICdwbHVnaW5zOnJlYWQnXG4gIHwgJ3BsdWdpbnM6d3JpdGUnXG4gIHwgJ3BsdWdpbnM6cHVibGlzaCdcbiAgLy8gQ29tcGxpYW5jZVxuICB8ICdjb21wbGlhbmNlOnJlYWQnXG4gIHwgJ2NvbXBsaWFuY2U6d3JpdGUnXG4gIC8vIE1lbWJlcnMgJiBhY2Nlc3NcbiAgfCAnbWVtYmVyczptYW5hZ2UnXG4gIHwgJ3JvbGVzOm1hbmFnZSdcbiAgfCAnaW52aXRhdGlvbnM6bWFuYWdlJ1xuICAvLyBPYnNlcnZhYmlsaXR5XG4gIHwgJ2Rhc2hib2FyZHM6cmVhZCdcbiAgfCAnZGFzaGJvYXJkczp3cml0ZSdcbiAgfCAnb2JzZXJ2YWJpbGl0eTpyZWFkJ1xuICB8ICdvYnNlcnZhYmlsaXR5OndyaXRlJ1xuICAvLyBJbnNpZ2h0c1xuICB8ICdyZXBvcnRzOnJlYWQnXG4gIHwgJ3JlcG9ydHM6cm9sbHVwJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIFJlZ2lzdHJ5XG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MgKElkUCwgS01TLCBBSSBjb25maWcsIGdlbmVyYWwgc2V0dGluZ3MpXG4gIHwgJ29yZzpzZXR0aW5ncyc7XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZXM6cHVibGlzaCcsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAnbWVtYmVyczptYW5hZ2UnLCAncm9sZXM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsXG4gICdkYXNoYm9hcmRzOnJlYWQnLCAnZGFzaGJvYXJkczp3cml0ZScsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLCAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsXG4gICdvcmc6c2V0dGluZ3MnLFxuXTtcblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBQZXJtaXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQZXJtaXNzaW9uKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBQZXJtaXNzaW9uIHtcbiAgcmV0dXJuIChBTExfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IG11c3QgTkVWRVIgYmUgZ3JhbnRhYmxlIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIENVU1RPTSBSb2xlIOKAlFxuICogdGhleSBnYXRlIHBsYXRmb3JtLW9wZXJhdG9yIHN1cmZhY2VzICh0aGUgc2hhcmVkIGltYWdlIHJlZ2lzdHJ5KSwgc28gYWxsb3dpbmdcbiAqIGFuIG9yZyBhZG1pbiB0byBtaW50IGEgUm9sZSBjYXJyeWluZyB0aGVtIHdvdWxkIGJlIGEgbGF0ZW50IHByaXZpbGVnZVxuICogZXNjYWxhdGlvbi4gVGhleSBhcmUgTk9UIHNlZWRlZCBpbnRvIEFOWSBidWlsdC1pbiBSb2xlIGJ1bmRsZSAobmVpdGhlclxuICogYG1lbWJlcmAgbm9yIGBhZG1pbmApLCBzbyB0aGUgb25seSBob2xkZXIgaXMgYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpIOKAlFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaW1hZ2UtcmVnaXN0cnkgZ2F0ZXMgdGhhdCByZXF1aXJlIHRoZW0gZWZmZWN0aXZlbHlcbiAqIHN1cGVyYWRtaW4tb25seS4gVGhpcyBsaXN0IEFMU08gYmxvY2tzIGN1c3RvbS1Sb2xlIGF1dGhvcmluZyBmcm9tIHJlcXVlc3RpbmdcbiAqIHRoZW0gKHNlZSBwbGF0Zm9ybSBgc2FuaXRpemVQZXJtaXNzaW9uc2ApLlxuICovXG5leHBvcnQgY29uc3QgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30uIEN1c3RvbS1Sb2xlIGNyZWF0ZS91cGRhdGUgdmFsaWRhdGVzIHRoZVxuICogcmVxdWVzdGVkIHBlcm1pc3Npb24gc2V0IGFnYWluc3QgdGhpcyAoc2VlIHBsYXRmb3JtIHJvbGVzLXNlcnZpY2UpLlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+ICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocCkpO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGdyYW50ZWQgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgY3VzdG9tIFJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy9wbHVnaW5zLCByZWFkXG4gKiAgIGVsc2V3aGVyZS4gTm8gbWVtYmVyL3JvbGUvYmlsbGluZyBtYW5hZ2VtZW50LCBubyBjb21wbGlhbmNlL2FsZXJ0IGF1dGhvcmluZy5cbiAqIC0gYGFkbWluYCAgIOKAlCBmdWxsIG9yZyBhZG1pbmlzdHJhdGlvbjogZXZlcnkgT1JHLUFTU0lHTkFCTEUgcGVybWlzc2lvbiAoaS5lLlxuICogICBBTExfUEVSTUlTU0lPTlMgbWludXMgdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LCBzbyBgcmVnaXN0cnk6KmBcbiAqICAgc3RheSBzdXBlcmFkbWluLWltcGxpY2l0LW9ubHkgYW5kIGFyZSBOT1QgZ3JhbnRlZCB0byBvcmcgYWRtaW5zKS5cbiAqIC0gYG93bmVyYCAgIOKAlCBzYW1lIGFzIGFkbWluIChvd25lcnNoaXAgaXRzZWxmIOKAlCB0cmFuc2Zlci9kZWxldGUg4oCUIGlzIGdhdGVkXG4gKiAgIHNlcGFyYXRlbHksIG5vdCB2aWEgYSBwZXJtaXNzaW9uKS5cbiAqL1xuY29uc3QgTUVNQkVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgb3JnIHBlcm1pc3Npb25zIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uXG4gKlxuICogU2luZ2xlLXNvdXJjZSBtb2RlbDogYSB1c2VyJ3MgYWJpbGl0aWVzIGFyZSBFWEFDVExZIHRoZSB1bmlvbiBvZiB0aGVcbiAqIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgdGhlIFJvbGVzIHRoZXkgaG9sZCAoYSBSb2xlID0gYSBuYW1lZCBwZXJtaXNzaW9uIHNldDtcbiAqIGJ1aWx0LWluIFJvbGVzIGNhcnJ5IHRoZWlyIGJ1bmRsZSBleHBsaWNpdGx5LCBzZWVkZWQgZnJvbVxuICoge0BsaW5rIFJPTEVfUEVSTUlTU0lPTlN9KS4gVGhlcmUgaXMgbm8gc2VwYXJhdGUgcm9sZS1kZXJpdmVkIGJhc2VsaW5lIOKAlCB0aGVcbiAqIGNvYXJzZSBgcm9sZWAgbGFiZWwgbm8gbG9uZ2VyIGdyYW50cyBhbnl0aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIDEuIFBsYXRmb3JtIHN1cGVyYWRtaW5zIChgaXNTdXBlckFkbWluYCkgYWx3YXlzIGdldCBBTEwgcGVybWlzc2lvbnMuXG4gKiAyLiBPdGhlcndpc2UsIHVuaW9uIGV2ZXJ5IHBlcm1pc3Npb24gZ3JhbnRlZCBieSB0aGUgdXNlcidzIGFzc2lnbmVkIFJvbGVzLlxuICogMy4gSW52YWxpZC91bmtub3duIHBlcm1pc3Npb24gc3RyaW5ncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRQZXJtaXNzaW9ucyAtIEZsYXR0ZW5lZCBwZXJtaXNzaW9ucyBmcm9tIGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaG9sZHNcbiAqIEBwYXJhbSBpc1N1cGVyQWRtaW4gLSBXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqIEByZXR1cm5zIEVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBpbiBjYW5vbmljYWwgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVc2VyUGVybWlzc2lvbnMoXG4gIGFzc2lnbmVkUGVybWlzc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gWy4uLkFMTF9QRVJNSVNTSU9OU107XG5cbiAgY29uc3QgcGVybXMgPSBuZXcgU2V0PFBlcm1pc3Npb24+KCk7XG4gIGlmIChhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICAgIGlmIChpc1ZhbGlkUGVybWlzc2lvbihwKSkgcGVybXMuYWRkKHApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcihwID0+IHBlcm1zLmhhcyhwKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IGdyYW50cyBgcGVybWlzc2lvbmAgKHN1cGVyYWRtaW4g4oeSIGFsd2F5cykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVybWlzc2lvbihcbiAgZ3JhbnRlZDogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiB0cnVlO1xuICByZXR1cm4gISFncmFudGVkICYmIGdyYW50ZWQuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG4iXX0=
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQW9FdEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3hELGNBQWMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xELGlCQUFpQixFQUFFLGtCQUFrQjtJQUNyQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CO0lBQ3RELGlCQUFpQixFQUFFLGtCQUFrQjtJQUNyQyxvQkFBb0IsRUFBRSxxQkFBcUI7SUFDM0MsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxlQUFlLEVBQUUsZ0JBQWdCO0lBQ2pDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYTtJQUNiLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYyxFQUFFLFNBQVMsRUFBRSxTQUFTO0NBQ3JDLENBQUM7QUFFRixvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsT0FBUSxlQUFxQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQTBCO0lBQ2hFLGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FDckMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRSwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQXNCO0lBQzlELE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELGdGQUFnRjtBQUNoRiw2QkFBNkI7QUFDN0IsZ0ZBQWdGO0FBRWhGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sa0JBQWtCLEdBQTBCO0lBQ2hELGdCQUFnQixFQUFFLGlCQUFpQjtJQUNuQyxjQUFjLEVBQUUsZUFBZTtJQUMvQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2QsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxjQUFjO0lBQ2QsYUFBYTtDQUNkLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUEwQixDQUFDLEdBQUcsMEJBQTBCLENBQUMsQ0FBQztBQUVqRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUEyQztJQUN0RSxNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLEtBQUssRUFBRSxpQkFBaUI7SUFDeEIsS0FBSyxFQUFFLGlCQUFpQjtDQUN6QixDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGFBQWE7QUFDYixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLG1CQUE4QyxFQUM5QyxZQUFzQjtJQUV0QixJQUFJLFlBQVk7UUFBRSxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQ3BDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDcEMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQTZDLEVBQzdDLFVBQXNCLEVBQ3RCLFlBQXNCO0lBRXRCLElBQUksWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gUGx1Z2luc1xuICB8ICdwbHVnaW5zOnJlYWQnXG4gIHwgJ3BsdWdpbnM6d3JpdGUnXG4gIHwgJ3BsdWdpbnM6cHVibGlzaCdcbiAgLy8gQ29tcGxpYW5jZVxuICB8ICdjb21wbGlhbmNlOnJlYWQnXG4gIHwgJ2NvbXBsaWFuY2U6d3JpdGUnXG4gIC8vIE1lbWJlcnMgJiBhY2Nlc3NcbiAgfCAnbWVtYmVyczptYW5hZ2UnXG4gIHwgJ3JvbGVzOm1hbmFnZSdcbiAgfCAnaW52aXRhdGlvbnM6bWFuYWdlJ1xuICAvLyBPYnNlcnZhYmlsaXR5XG4gIHwgJ2Rhc2hib2FyZHM6cmVhZCdcbiAgfCAnZGFzaGJvYXJkczp3cml0ZSdcbiAgfCAnb2JzZXJ2YWJpbGl0eTpyZWFkJ1xuICB8ICdvYnNlcnZhYmlsaXR5OndyaXRlJ1xuICAvLyBJbnNpZ2h0c1xuICB8ICdyZXBvcnRzOnJlYWQnXG4gIHwgJ3JlcG9ydHM6cm9sbHVwJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIFJlZ2lzdHJ5XG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuXG4gIC8vICAtIGBvcmc6c2V0dGluZ3NgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZzppZHBgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZzprbXNgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6XG4gIC8vICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vIGBvcmc6aWRwYC9gb3JnOmttc2Agd2VyZSBzcGxpdCBPVVQgb2YgYG9yZzpzZXR0aW5nc2Agc28gYSBjdXN0b20gcm9sZSBjYW5cbiAgLy8gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSB0d28gc2Vuc2l0aXZlIHN1cmZhY2VzLiBCb3RoIHJlbWFpblxuICAvLyBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZSBhZG1pbi9vd25lciBidW5kbGVzICh2aWFcbiAgLy8gT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwIGZ1bGwgYWNjZXNzLlxuICB8ICdvcmc6c2V0dGluZ3MnXG4gIHwgJ29yZzppZHAnXG4gIHwgJ29yZzprbXMnO1xuXG4vKiogQWxsIHZhbGlkIHBlcm1pc3Npb25zIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIgaW4gdGhlIHBpY2tlcikuICovXG5leHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAncmVwb3J0czpyZWFkJywgJ3JlcG9ydHM6cm9sbHVwJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJyxcbiAgJ3F1b3RhczpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OnJlYWQnLCAncmVnaXN0cnk6d3JpdGUnLFxuICAnb3JnOnNldHRpbmdzJywgJ29yZzppZHAnLCAnb3JnOmttcycsXG5dO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFBlcm1pc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBlcm1pc3Npb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFBlcm1pc3Npb24ge1xuICByZXR1cm4gKEFMTF9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgbXVzdCBORVZFUiBiZSBncmFudGFibGUgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgQ1VTVE9NIFJvbGUg4oCUXG4gKiB0aGV5IGdhdGUgcGxhdGZvcm0tb3BlcmF0b3Igc3VyZmFjZXMgKHRoZSBzaGFyZWQgaW1hZ2UgcmVnaXN0cnkpLCBzbyBhbGxvd2luZ1xuICogYW4gb3JnIGFkbWluIHRvIG1pbnQgYSBSb2xlIGNhcnJ5aW5nIHRoZW0gd291bGQgYmUgYSBsYXRlbnQgcHJpdmlsZWdlXG4gKiBlc2NhbGF0aW9uLiBUaGV5IGFyZSBOT1Qgc2VlZGVkIGludG8gQU5ZIGJ1aWx0LWluIFJvbGUgYnVuZGxlIChuZWl0aGVyXG4gKiBgbWVtYmVyYCBub3IgYGFkbWluYCksIHNvIHRoZSBvbmx5IGhvbGRlciBpcyBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCkg4oCUXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBpbWFnZS1yZWdpc3RyeSBnYXRlcyB0aGF0IHJlcXVpcmUgdGhlbSBlZmZlY3RpdmVseVxuICogc3VwZXJhZG1pbi1vbmx5LiBUaGlzIGxpc3QgQUxTTyBibG9ja3MgY3VzdG9tLVJvbGUgYXV0aG9yaW5nIGZyb20gcmVxdWVzdGluZ1xuICogdGhlbSAoc2VlIHBsYXRmb3JtIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuICAncmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBQZXJtaXNzaW9ucyBhbiBvcmcgbWF5IGFzc2lnbiB2aWEgYSBDVVNUT00gUm9sZSDigJQgZXZlcnkgcGVybWlzc2lvbiBleGNlcHQgdGhlXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfS4gQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlXG4gKiByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzZXQgYWdhaW5zdCB0aGlzIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gIVNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUy5pbmNsdWRlcyhwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsdC1pbiBSb2xlIHNlZWQgYnVuZGxlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQZXJtaXNzaW9uIGJ1bmRsZXMgdXNlZCB0byBTRUVEIHRoZSBidWlsdC1pbiBSb2xlcyAoXCJBZG1pblwiLCBcIk1lbWJlclwiKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbiBvZiB3aGF0IHRob3NlIGJ1aWx0LWluIFJvbGVzIGdyYW50IOKAlCBpdCBpcyB1c2VkXG4gKiB3aGVuIGEgUm9sZSByZWNvcmQgaXMgY3JlYXRlZCAoYW5kIGJ5IHRoZSBzdGFydHVwIGJhY2tmaWxsKSB0byBwb3B1bGF0ZSB0aGF0XG4gKiBSb2xlJ3Mgb3duIGBwZXJtaXNzaW9uc1tdYC4gSXQgaXMgTk9UIGEgcnVudGltZSBwZXJtaXNzaW9uIHNvdXJjZTogYSB1c2VyJ3NcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBjb21lIE9OTFkgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbSAoc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30pLiBUaGUgY29hcnNlIGByb2xlYCBsYWJlbCAob3duZXIvYWRtaW4vbWVtYmVyKVxuICogc3Vydml2ZXMgb25seSBmb3IgYGlzQWRtaW5gL293bmVyc2hpcC9kaXNwbGF5LCBuZXZlciB0byBncmFudCBwZXJtaXNzaW9ucy5cbiAqXG4gKiAtIGBtZW1iZXJgICDigJQgZGF5LXRvLWRheSBidWlsZGVyOiByZWFkICsgd3JpdGUgb24gcGlwZWxpbmVzL3BsdWdpbnMsIHJlYWRcbiAqICAgZWxzZXdoZXJlLiBObyBtZW1iZXIvcm9sZS9iaWxsaW5nIG1hbmFnZW1lbnQsIG5vIGNvbXBsaWFuY2UvYWxlcnQgYXV0aG9yaW5nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30sIHNvIGByZWdpc3RyeToqYFxuICogICBzdGF5IHN1cGVyYWRtaW4taW1wbGljaXQtb25seSBhbmQgYXJlIE5PVCBncmFudGVkIHRvIG9yZyBhZG1pbnMpLlxuICogLSBgb3duZXJgICAg4oCUIHNhbWUgYXMgYWRtaW4gKG93bmVyc2hpcCBpdHNlbGYg4oCUIHRyYW5zZmVyL2RlbGV0ZSDigJQgaXMgZ2F0ZWRcbiAqICAgc2VwYXJhdGVseSwgbm90IHZpYSBhIHBlcm1pc3Npb24pLlxuICovXG5jb25zdCBNRU1CRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdjb21wbGlhbmNlOnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLFxuICAncXVvdGFzOnJlYWQnLFxuXTtcblxuY29uc3QgQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFsuLi5PUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU107XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIGVhY2ggYnVpbHQtaW4gUm9sZSwga2V5ZWQgYnkgdGhlIGNvYXJzZSByb2xlIGl0IGdyYW50cy5cbiAqIENvbnN1bWVkIGJ5IHRoZSBSb2xlIHNlZWRlciArIHRoZSBzdGFydHVwIGJhY2tmaWxsIHRvIHBvcHVsYXRlIGEgYnVpbHQtaW5cbiAqIFJvbGUncyBgcGVybWlzc2lvbnNbXWAuIE5PVCBjb25zdWx0ZWQgYXQgcmVxdWVzdCB0aW1lIOKAlCBzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJPTEVfUEVSTUlTU0lPTlM6IFJlY29yZDxPcmdSb2xlLCByZWFkb25seSBQZXJtaXNzaW9uW10+ID0ge1xuICBtZW1iZXI6IE1FTUJFUl9QRVJNSVNTSU9OUyxcbiAgYWRtaW46IEFETUlOX1BFUk1JU1NJT05TLFxuICBvd25lcjogQURNSU5fUEVSTUlTU0lPTlMsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdXNlcidzIGVmZmVjdGl2ZSBvcmcgcGVybWlzc2lvbnMgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbS5cbiAqXG4gKiBTaW5nbGUtc291cmNlIG1vZGVsOiBhIHVzZXIncyBhYmlsaXRpZXMgYXJlIEVYQUNUTFkgdGhlIHVuaW9uIG9mIHRoZVxuICogcGVybWlzc2lvbnMgY2FycmllZCBieSB0aGUgUm9sZXMgdGhleSBob2xkIChhIFJvbGUgPSBhIG5hbWVkIHBlcm1pc3Npb24gc2V0O1xuICogYnVpbHQtaW4gUm9sZXMgY2FycnkgdGhlaXIgYnVuZGxlIGV4cGxpY2l0bHksIHNlZWRlZCBmcm9tXG4gKiB7QGxpbmsgUk9MRV9QRVJNSVNTSU9OU30pLiBUaGVyZSBpcyBubyBzZXBhcmF0ZSByb2xlLWRlcml2ZWQgYmFzZWxpbmUg4oCUIHRoZVxuICogY29hcnNlIGByb2xlYCBsYWJlbCBubyBsb25nZXIgZ3JhbnRzIGFueXRoaW5nIG9uIGl0cyBvd24uXG4gKlxuICogMS4gUGxhdGZvcm0gc3VwZXJhZG1pbnMgKGBpc1N1cGVyQWRtaW5gKSBhbHdheXMgZ2V0IEFMTCBwZXJtaXNzaW9ucy5cbiAqIDIuIE90aGVyd2lzZSwgdW5pb24gZXZlcnkgcGVybWlzc2lvbiBncmFudGVkIGJ5IHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMuXG4gKiAzLiBJbnZhbGlkL3Vua25vd24gcGVybWlzc2lvbiBzdHJpbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSBhc3NpZ25lZFBlcm1pc3Npb25zIC0gRmxhdHRlbmVkIHBlcm1pc3Npb25zIGZyb20gZXZlcnkgUm9sZSB0aGUgdXNlciBob2xkc1xuICogQHBhcmFtIGlzU3VwZXJBZG1pbiAtIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgc3VwZXItYWRtaW4gZmxhZ1xuICogQHJldHVybnMgRWZmZWN0aXZlIHBlcm1pc3Npb25zIGluIGNhbm9uaWNhbCBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyhcbiAgYXNzaWduZWRQZXJtaXNzaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IFBlcm1pc3Npb25bXSB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiBbLi4uQUxMX1BFUk1JU1NJT05TXTtcblxuICBjb25zdCBwZXJtcyA9IG5ldyBTZXQ8UGVybWlzc2lvbj4oKTtcbiAgaWYgKGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgICAgaWYgKGlzVmFsaWRQZXJtaXNzaW9uKHApKSBwZXJtcy5hZGQocCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKHAgPT4gcGVybXMuaGFzKHApKTtcbn1cblxuLyoqIFdoZXRoZXIgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgZ3JhbnRzIGBwZXJtaXNzaW9uYCAoc3VwZXJhZG1pbiDih5IgYWx3YXlzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZXJtaXNzaW9uKFxuICBncmFudGVkOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIWdyYW50ZWQgJiYgZ3JhbnRlZC5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface ComplianceEvent {
|
|
2
|
-
eventType: 'validate' | 'scan' | 'notify';
|
|
3
|
-
target: 'plugin' | 'pipeline';
|
|
4
|
-
entityId: string;
|
|
5
|
-
orgId: string;
|
|
6
|
-
/** Owning org's parent (present only when `orgId` is a team) so the async
|
|
7
|
-
* worker evaluates parent `propagateToChildren` rules like the live path. */
|
|
8
|
-
parentOrgId?: string;
|
|
9
|
-
userId: string;
|
|
10
|
-
attributes: Record<string, unknown>;
|
|
11
|
-
timestamp: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function registerComplianceQueueBackend(fn: (event: ComplianceEvent) => Promise<void>): void;
|
|
14
|
-
export declare function enqueueComplianceEvent(event: ComplianceEvent): Promise<void>;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { createLogger } from '../utils/logger.js';
|
|
4
|
-
const logger = createLogger('compliance-queue');
|
|
5
|
-
/**
|
|
6
|
-
* Pluggable compliance event queue.
|
|
7
|
-
* Services register a backend (BullMQ, SQS, or in-memory) at startup.
|
|
8
|
-
* If no backend is registered, events are logged and discarded.
|
|
9
|
-
*
|
|
10
|
-
* NOTE (2026-07): currently has NO producer. The entity-event path was the only
|
|
11
|
-
* caller of {@link enqueueComplianceEvent}, but it only ever ran in the
|
|
12
|
-
* plugin/pipeline processes — which register NO backend — so every enqueue was a
|
|
13
|
-
* silent no-op there (the "durable async re-validation" it advertised never
|
|
14
|
-
* existed). That dead call was removed; post-mutation re-validation now rides the
|
|
15
|
-
* retriable HTTP notify in `compliance-event-subscriber.ts` (primary enforcement
|
|
16
|
-
* is the fail-closed live validate path regardless). This queue machinery is
|
|
17
|
-
* retained for a future real durable producer; until one is wired it is inert.
|
|
18
|
-
*/
|
|
19
|
-
let enqueueFn = null;
|
|
20
|
-
export function registerComplianceQueueBackend(fn) {
|
|
21
|
-
enqueueFn = fn;
|
|
22
|
-
logger.info('Compliance queue backend registered');
|
|
23
|
-
}
|
|
24
|
-
export async function enqueueComplianceEvent(event) {
|
|
25
|
-
if (!enqueueFn) {
|
|
26
|
-
logger.debug('Compliance event discarded (no queue backend registered)', {
|
|
27
|
-
eventType: event.eventType, target: event.target, entityId: event.entityId,
|
|
28
|
-
});
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
try {
|
|
32
|
-
await enqueueFn(event);
|
|
33
|
-
logger.debug('Compliance event enqueued', { eventType: event.eventType, target: event.target, entityId: event.entityId });
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
logger.warn('Failed to enqueue compliance event', {
|
|
37
|
-
eventType: event.eventType,
|
|
38
|
-
entityId: event.entityId,
|
|
39
|
-
error: err instanceof Error ? err.message : String(err),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jb21wbGlhbmNlLXF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBZWhEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxJQUFJLFNBQVMsR0FBdUQsSUFBSSxDQUFDO0FBRXpFLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxFQUE2QztJQUMxRixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEtBQXNCO0lBQ2pFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMERBQTBELEVBQUU7WUFDdkUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1NBQzNFLENBQUMsQ0FBQztRQUNILE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEVBQUU7WUFDaEQsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUN4RCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NvbXBsaWFuY2UtcXVldWUnKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlRXZlbnQge1xuICBldmVudFR5cGU6ICd2YWxpZGF0ZScgfCAnc2NhbicgfCAnbm90aWZ5JztcbiAgdGFyZ2V0OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBPd25pbmcgb3JnJ3MgcGFyZW50IChwcmVzZW50IG9ubHkgd2hlbiBgb3JnSWRgIGlzIGEgdGVhbSkgc28gdGhlIGFzeW5jXG4gICAqICB3b3JrZXIgZXZhbHVhdGVzIHBhcmVudCBgcHJvcGFnYXRlVG9DaGlsZHJlbmAgcnVsZXMgbGlrZSB0aGUgbGl2ZSBwYXRoLiAqL1xuICBwYXJlbnRPcmdJZD86IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQbHVnZ2FibGUgY29tcGxpYW5jZSBldmVudCBxdWV1ZS5cbiAqIFNlcnZpY2VzIHJlZ2lzdGVyIGEgYmFja2VuZCAoQnVsbE1RLCBTUVMsIG9yIGluLW1lbW9yeSkgYXQgc3RhcnR1cC5cbiAqIElmIG5vIGJhY2tlbmQgaXMgcmVnaXN0ZXJlZCwgZXZlbnRzIGFyZSBsb2dnZWQgYW5kIGRpc2NhcmRlZC5cbiAqXG4gKiBOT1RFICgyMDI2LTA3KTogY3VycmVudGx5IGhhcyBOTyBwcm9kdWNlci4gVGhlIGVudGl0eS1ldmVudCBwYXRoIHdhcyB0aGUgb25seVxuICogY2FsbGVyIG9mIHtAbGluayBlbnF1ZXVlQ29tcGxpYW5jZUV2ZW50fSwgYnV0IGl0IG9ubHkgZXZlciByYW4gaW4gdGhlXG4gKiBwbHVnaW4vcGlwZWxpbmUgcHJvY2Vzc2VzIOKAlCB3aGljaCByZWdpc3RlciBOTyBiYWNrZW5kIOKAlCBzbyBldmVyeSBlbnF1ZXVlIHdhcyBhXG4gKiBzaWxlbnQgbm8tb3AgdGhlcmUgKHRoZSBcImR1cmFibGUgYXN5bmMgcmUtdmFsaWRhdGlvblwiIGl0IGFkdmVydGlzZWQgbmV2ZXJcbiAqIGV4aXN0ZWQpLiBUaGF0IGRlYWQgY2FsbCB3YXMgcmVtb3ZlZDsgcG9zdC1tdXRhdGlvbiByZS12YWxpZGF0aW9uIG5vdyByaWRlcyB0aGVcbiAqIHJldHJpYWJsZSBIVFRQIG5vdGlmeSBpbiBgY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLnRzYCAocHJpbWFyeSBlbmZvcmNlbWVudFxuICogaXMgdGhlIGZhaWwtY2xvc2VkIGxpdmUgdmFsaWRhdGUgcGF0aCByZWdhcmRsZXNzKS4gVGhpcyBxdWV1ZSBtYWNoaW5lcnkgaXNcbiAqIHJldGFpbmVkIGZvciBhIGZ1dHVyZSByZWFsIGR1cmFibGUgcHJvZHVjZXI7IHVudGlsIG9uZSBpcyB3aXJlZCBpdCBpcyBpbmVydC5cbiAqL1xubGV0IGVucXVldWVGbjogKChldmVudDogQ29tcGxpYW5jZUV2ZW50KSA9PiBQcm9taXNlPHZvaWQ+KSB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21wbGlhbmNlUXVldWVCYWNrZW5kKGZuOiAoZXZlbnQ6IENvbXBsaWFuY2VFdmVudCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBlbnF1ZXVlRm4gPSBmbjtcbiAgbG9nZ2VyLmluZm8oJ0NvbXBsaWFuY2UgcXVldWUgYmFja2VuZCByZWdpc3RlcmVkJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnF1ZXVlQ29tcGxpYW5jZUV2ZW50KGV2ZW50OiBDb21wbGlhbmNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbnF1ZXVlRm4pIHtcbiAgICBsb2dnZXIuZGVidWcoJ0NvbXBsaWFuY2UgZXZlbnQgZGlzY2FyZGVkIChubyBxdWV1ZSBiYWNrZW5kIHJlZ2lzdGVyZWQpJywge1xuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsIHRhcmdldDogZXZlbnQudGFyZ2V0LCBlbnRpdHlJZDogZXZlbnQuZW50aXR5SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZW5xdWV1ZUZuKGV2ZW50KTtcbiAgICBsb2dnZXIuZGVidWcoJ0NvbXBsaWFuY2UgZXZlbnQgZW5xdWV1ZWQnLCB7IGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCwgZW50aXR5SWQ6IGV2ZW50LmVudGl0eUlkIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGVucXVldWUgY29tcGxpYW5jZSBldmVudCcsIHtcbiAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgZW50aXR5SWQ6IGV2ZW50LmVudGl0eUlkLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|