@pipeline-builder/api-core 5.2.11 → 5.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/helpers/org-hierarchy-http.d.ts +3 -2
- package/lib/helpers/org-hierarchy-http.js +11 -5
- package/lib/middleware/index.d.ts +1 -1
- package/lib/middleware/index.js +2 -2
- package/lib/middleware/step-up.d.ts +4 -3
- package/lib/middleware/step-up.js +1 -1
- package/lib/services/index.d.ts +2 -2
- package/lib/services/index.js +2 -2
- package/lib/services/quota.d.ts +1 -2
- package/lib/services/quota.js +1 -1
- package/lib/services/version-vuln-policy.d.ts +1 -3
- package/lib/services/version-vuln-policy.js +2 -3
- package/lib/types/common.d.ts +13 -22
- package/lib/types/common.js +44 -5
- package/lib/types/ecosystem-notifications.d.ts +215 -24
- package/lib/types/ecosystem-notifications.js +18 -9
- package/lib/types/ecosystem.d.ts +1 -0
- package/lib/types/ecosystem.js +33 -23
- package/lib/types/feature-flags.d.ts +11 -4
- package/lib/types/feature-flags.js +51 -11
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.js +2 -2
- package/lib/types/permissions.d.ts +353 -22
- package/lib/types/permissions.js +257 -128
- package/lib/types/plugin-catalog.d.ts +25 -1
- package/lib/types/plugin-catalog.js +21 -2
- package/lib/types/quota-tiers.d.ts +6 -24
- package/lib/types/quota-tiers.js +6 -28
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +10 -1
- package/lib/types/tier-limits.d.ts +19 -0
- package/lib/types/tier-limits.js +27 -1
- package/lib/types/usage-projection.d.ts +0 -16
- package/lib/types/usage-projection.js +1 -20
- package/lib/types/wire-vocabulary.d.ts +81 -2
- package/lib/types/wire-vocabulary.js +89 -3
- package/lib/validation/index.d.ts +1 -1
- package/lib/validation/index.js +2 -2
- package/lib/validation/plugin-spec-schema.d.ts +0 -9
- package/lib/validation/plugin-spec-schema.js +2 -11
- package/package.json +8 -1
package/lib/types/common.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Permission } from './permissions.js';
|
|
2
2
|
import type { QuotaTier } from './quota-tiers.js';
|
|
3
|
+
import type { OrgRole } from './wire-vocabulary.js';
|
|
3
4
|
/**
|
|
4
5
|
* Capability scope catalog for machine/automation tokens. A scoped token carries
|
|
5
6
|
* exactly one of these instead of role-based permissions; endpoints that accept a
|
|
@@ -20,13 +21,13 @@ import type { QuotaTier } from './quota-tiers.js';
|
|
|
20
21
|
* no permissions — it cannot author the group → Role rules its syncs resolve
|
|
21
22
|
* through. Only a service-account key may carry it; a person's token never does.
|
|
22
23
|
*/
|
|
23
|
-
export
|
|
24
|
+
export declare const TOKEN_SCOPES: readonly ['reporting:ingest', 'registry:push', 'scim'];
|
|
24
25
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* A token scope. {@link TOKEN_SCOPES} is the ONE allowlist every mint path
|
|
27
|
+
* validates against — platform's key/token issue routes included — so a new
|
|
28
|
+
* scope is added in exactly one place.
|
|
28
29
|
*/
|
|
29
|
-
export
|
|
30
|
+
export type TokenScope = (typeof TOKEN_SCOPES)[number];
|
|
30
31
|
/**
|
|
31
32
|
* What kind of principal a token speaks for. Auth decisions branch on this claim
|
|
32
33
|
* — never on the shape of `sub` or on which optional claims happen to be present.
|
|
@@ -37,14 +38,16 @@ export declare const TOKEN_SCOPES: readonly TokenScope[];
|
|
|
37
38
|
* platform. Never satisfies an assurance/step-up gate.
|
|
38
39
|
* - `service` — an internal Pipeline Builder service ({@link signServiceToken}).
|
|
39
40
|
*/
|
|
40
|
-
export
|
|
41
|
+
export declare const PRINCIPAL_TYPES: readonly ['user', 'service_account', 'service'];
|
|
42
|
+
export type PrincipalType = (typeof PRINCIPAL_TYPES)[number];
|
|
41
43
|
/**
|
|
42
44
|
* How a token is used. `access` is a session-style access token (interactive,
|
|
43
45
|
* machine-session or service); `api_key` is a standalone credential tracked by
|
|
44
46
|
* its own record — a Personal Access Token or a service-account key, named by
|
|
45
47
|
* `jti`.
|
|
46
48
|
*/
|
|
47
|
-
export
|
|
49
|
+
export declare const TOKEN_USES: readonly ['access', 'api_key'];
|
|
50
|
+
export type TokenUse = (typeof TOKEN_USES)[number];
|
|
48
51
|
/**
|
|
49
52
|
* Authentication methods (`amr`, RFC 8176 style) that established a user's
|
|
50
53
|
* session. `pwd` password sign-in; `oauth` social sign-in (Google, GitHub …);
|
|
@@ -54,7 +57,8 @@ export type TokenUse = 'access' | 'api_key';
|
|
|
54
57
|
* or one of its recovery codes, so it appears ALONGSIDE the method that
|
|
55
58
|
* identified the user (`['pwd', 'mfa']`), never on its own.
|
|
56
59
|
*/
|
|
57
|
-
export
|
|
60
|
+
export declare const AUTH_METHODS: readonly ['pwd', 'oauth', 'sso', 'webauthn', 'stepup', 'mfa'];
|
|
61
|
+
export type AuthMethod = (typeof AUTH_METHODS)[number];
|
|
58
62
|
/**
|
|
59
63
|
* Authenticator assurance level of the session a token speaks for.
|
|
60
64
|
*
|
|
@@ -70,10 +74,6 @@ export type AuthMethod = 'pwd' | 'oauth' | 'sso' | 'webauthn' | 'stepup' | 'mfa'
|
|
|
70
74
|
* earning aal 2 always means authenticating again with a second factor.
|
|
71
75
|
*/
|
|
72
76
|
export type AssuranceLevel = 1 | 2;
|
|
73
|
-
/** Runtime catalogs for the claim unions above (a union is erased at runtime). */
|
|
74
|
-
export declare const PRINCIPAL_TYPES: readonly PrincipalType[];
|
|
75
|
-
export declare const TOKEN_USES: readonly TokenUse[];
|
|
76
|
-
export declare const AUTH_METHODS: readonly AuthMethod[];
|
|
77
77
|
/**
|
|
78
78
|
* Quota type identifiers.
|
|
79
79
|
*
|
|
@@ -209,20 +209,11 @@ export type ApiResponse<T = unknown> = ApiSuccessResponse<T> | ApiErrorResponse;
|
|
|
209
209
|
* Users can belong to multiple organizations. The token is scoped to one
|
|
210
210
|
* active organization at a time. The `role` field is the user's per-org
|
|
211
211
|
* role in that organization (from the UserOrganization junction collection),
|
|
212
|
-
* and `isAdmin` is derived
|
|
212
|
+
* and `isAdmin` is derived from it (`isAdminOrgRole`, wire-vocabulary.ts).
|
|
213
213
|
*
|
|
214
214
|
* Use `POST /auth/switch-org` to change the active organization, which
|
|
215
215
|
* re-issues tokens with the new org's role and context.
|
|
216
216
|
*/
|
|
217
|
-
/**
|
|
218
|
-
* Coarse per-org membership label, DERIVED from the Roles a user is assigned
|
|
219
|
-
* (the highest `grantsRole` among them; `owner` is set only by ownership
|
|
220
|
-
* transfer). It is a display/authority label — driving `isAdmin`, ownership,
|
|
221
|
-
* and seat accounting — NOT a permission source. Effective permissions come
|
|
222
|
-
* solely from the user's assigned Roles (see `resolveUserPermissions`). Not a
|
|
223
|
-
* global role.
|
|
224
|
-
*/
|
|
225
|
-
export type OrgRole = 'owner' | 'admin' | 'member';
|
|
226
217
|
export interface JwtPayload {
|
|
227
218
|
/** User ID (subject) */
|
|
228
219
|
sub: string;
|
package/lib/types/common.js
CHANGED
|
@@ -2,14 +2,53 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { QUOTA_CATALOG } from './quota-catalog.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Capability scope catalog for machine/automation tokens. A scoped token carries
|
|
6
|
+
* exactly one of these instead of role-based permissions; endpoints that accept a
|
|
7
|
+
* scoped identity check it via `hasScope`. Kept a closed union (mirroring
|
|
8
|
+
* {@link Permission}) so a typo on either the mint or the check side is a compile
|
|
9
|
+
* error. Add a value here when introducing a new scoped-token surface.
|
|
10
|
+
*
|
|
11
|
+
* - `reporting:ingest` — the AWS event-ingestion Lambda's writes (`/reports/events`,
|
|
12
|
+
* `/reports/ingest-health`) and the incident webhook.
|
|
13
|
+
* - `registry:push` — `docker push` into the owning org's own namespace via
|
|
14
|
+
* image-registry's `/token` endpoint. Grants the raw-image write that
|
|
15
|
+
* `plugins:write` grants a person, and nothing else: a scoped token carries no
|
|
16
|
+
* permissions, so it can neither read the API nor push outside its org.
|
|
17
|
+
* - `scim` — an identity provider's SCIM 2.0 client (3b) driving
|
|
18
|
+
* `/scim/v2/Users` and `/scim/v2/Groups` for the key's OWN org. It provisions
|
|
19
|
+
* and deactivates memberships and moves people between directory groups; it
|
|
20
|
+
* can never read or write anything else, and — because a scoped token carries
|
|
21
|
+
* no permissions — it cannot author the group → Role rules its syncs resolve
|
|
22
|
+
* through. Only a service-account key may carry it; a person's token never does.
|
|
8
23
|
*/
|
|
9
24
|
export const TOKEN_SCOPES = ['reporting:ingest', 'registry:push', 'scim'];
|
|
10
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* What kind of principal a token speaks for. Auth decisions branch on this claim
|
|
27
|
+
* — never on the shape of `sub` or on which optional claims happen to be present.
|
|
28
|
+
*
|
|
29
|
+
* - `user` — a person (session, machine session, PAT or impersonation).
|
|
30
|
+
* - `service_account` — a non-human account owned by ONE org, holding org Roles
|
|
31
|
+
* and authenticating with a `pb_sa_…` key exchanged at
|
|
32
|
+
* platform. Never satisfies an assurance/step-up gate.
|
|
33
|
+
* - `service` — an internal Pipeline Builder service ({@link signServiceToken}).
|
|
34
|
+
*/
|
|
11
35
|
export const PRINCIPAL_TYPES = ['user', 'service_account', 'service'];
|
|
36
|
+
/**
|
|
37
|
+
* How a token is used. `access` is a session-style access token (interactive,
|
|
38
|
+
* machine-session or service); `api_key` is a standalone credential tracked by
|
|
39
|
+
* its own record — a Personal Access Token or a service-account key, named by
|
|
40
|
+
* `jti`.
|
|
41
|
+
*/
|
|
12
42
|
export const TOKEN_USES = ['access', 'api_key'];
|
|
43
|
+
/**
|
|
44
|
+
* Authentication methods (`amr`, RFC 8176 style) that established a user's
|
|
45
|
+
* session. `pwd` password sign-in; `oauth` social sign-in (Google, GitHub …);
|
|
46
|
+
* `sso` per-org OIDC single sign-on; `webauthn` a passkey (WebAuthn assertion
|
|
47
|
+
* with user verification); `stepup` a step-up re-verification token; `mfa` a
|
|
48
|
+
* second factor was presented as well — today an authenticator-app code (TOTP)
|
|
49
|
+
* or one of its recovery codes, so it appears ALONGSIDE the method that
|
|
50
|
+
* identified the user (`['pwd', 'mfa']`), never on its own.
|
|
51
|
+
*/
|
|
13
52
|
export const AUTH_METHODS = ['pwd', 'oauth', 'sso', 'webauthn', 'stepup', 'mfa'];
|
|
14
53
|
/**
|
|
15
54
|
* Valid quota type values.
|
|
@@ -67,4 +106,4 @@ export function isValidQuotaType(value) {
|
|
|
67
106
|
export function effectiveRootOrgId(payload) {
|
|
68
107
|
return payload.rootOrganizationId ?? payload.organizationId;
|
|
69
108
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBeUJuRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUEwQixDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQWlEakcsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBNkIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQTBCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQWdEeEc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsY0FBYztJQUNoRixZQUFZO0lBQ1osWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxZQUFZO0lBQzdELFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBd0MsTUFBTSxDQUFDLFdBQVcsQ0FDckYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQTJDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUM1RSxDQUFDO0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYztJQUM3QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBa0IsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUEyUEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQWtFO0lBRWxFLE9BQU8sT0FBTyxDQUFDLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB7IFFVT1RBX0NBVEFMT0cgfSBmcm9tICcuL3F1b3RhLWNhdGFsb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBRdW90YVRpZXIgfSBmcm9tICcuL3F1b3RhLXRpZXJzLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXR5IHNjb3BlIGNhdGFsb2cgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMuIEEgc2NvcGVkIHRva2VuIGNhcnJpZXNcbiAqIGV4YWN0bHkgb25lIG9mIHRoZXNlIGluc3RlYWQgb2Ygcm9sZS1iYXNlZCBwZXJtaXNzaW9uczsgZW5kcG9pbnRzIHRoYXQgYWNjZXB0IGFcbiAqIHNjb3BlZCBpZGVudGl0eSBjaGVjayBpdCB2aWEgYGhhc1Njb3BlYC4gS2VwdCBhIGNsb3NlZCB1bmlvbiAobWlycm9yaW5nXG4gKiB7QGxpbmsgUGVybWlzc2lvbn0pIHNvIGEgdHlwbyBvbiBlaXRoZXIgdGhlIG1pbnQgb3IgdGhlIGNoZWNrIHNpZGUgaXMgYSBjb21waWxlXG4gKiBlcnJvci4gQWRkIGEgdmFsdWUgaGVyZSB3aGVuIGludHJvZHVjaW5nIGEgbmV3IHNjb3BlZC10b2tlbiBzdXJmYWNlLlxuICpcbiAqIC0gYHJlcG9ydGluZzppbmdlc3RgIOKAlCB0aGUgQVdTIGV2ZW50LWluZ2VzdGlvbiBMYW1iZGEncyB3cml0ZXMgKGAvcmVwb3J0cy9ldmVudHNgLFxuICogICBgL3JlcG9ydHMvaW5nZXN0LWhlYWx0aGApIGFuZCB0aGUgaW5jaWRlbnQgd2ViaG9vay5cbiAqIC0gYHJlZ2lzdHJ5OnB1c2hgICAgIOKAlCBgZG9ja2VyIHB1c2hgIGludG8gdGhlIG93bmluZyBvcmcncyBvd24gbmFtZXNwYWNlIHZpYVxuICogICBpbWFnZS1yZWdpc3RyeSdzIGAvdG9rZW5gIGVuZHBvaW50LiBHcmFudHMgdGhlIHJhdy1pbWFnZSB3cml0ZSB0aGF0XG4gKiAgIGBwbHVnaW5zOndyaXRlYCBncmFudHMgYSBwZXJzb24sIGFuZCBub3RoaW5nIGVsc2U6IGEgc2NvcGVkIHRva2VuIGNhcnJpZXMgbm9cbiAqICAgcGVybWlzc2lvbnMsIHNvIGl0IGNhbiBuZWl0aGVyIHJlYWQgdGhlIEFQSSBub3IgcHVzaCBvdXRzaWRlIGl0cyBvcmcuXG4gKiAtIGBzY2ltYCAgICAgICAgICAgICDigJQgYW4gaWRlbnRpdHkgcHJvdmlkZXIncyBTQ0lNIDIuMCBjbGllbnQgKDNiKSBkcml2aW5nXG4gKiAgIGAvc2NpbS92Mi9Vc2Vyc2AgYW5kIGAvc2NpbS92Mi9Hcm91cHNgIGZvciB0aGUga2V5J3MgT1dOIG9yZy4gSXQgcHJvdmlzaW9uc1xuICogICBhbmQgZGVhY3RpdmF0ZXMgbWVtYmVyc2hpcHMgYW5kIG1vdmVzIHBlb3BsZSBiZXR3ZWVuIGRpcmVjdG9yeSBncm91cHM7IGl0XG4gKiAgIGNhbiBuZXZlciByZWFkIG9yIHdyaXRlIGFueXRoaW5nIGVsc2UsIGFuZCDigJQgYmVjYXVzZSBhIHNjb3BlZCB0b2tlbiBjYXJyaWVzXG4gKiAgIG5vIHBlcm1pc3Npb25zIOKAlCBpdCBjYW5ub3QgYXV0aG9yIHRoZSBncm91cCDihpIgUm9sZSBydWxlcyBpdHMgc3luY3MgcmVzb2x2ZVxuICogICB0aHJvdWdoLiBPbmx5IGEgc2VydmljZS1hY2NvdW50IGtleSBtYXkgY2FycnkgaXQ7IGEgcGVyc29uJ3MgdG9rZW4gbmV2ZXIgZG9lcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5TY29wZSA9ICdyZXBvcnRpbmc6aW5nZXN0JyB8ICdyZWdpc3RyeTpwdXNoJyB8ICdzY2ltJztcblxuLyoqXG4gKiBSdW50aW1lIGNhdGFsb2cgb2Yge0BsaW5rIFRva2VuU2NvcGV9IChhIHVuaW9uIGlzIGVyYXNlZCBhdCBydW50aW1lKS4gVGhpcyBpc1xuICogdGhlIE9ORSBhbGxvd2xpc3QgZXZlcnkgbWludCBwYXRoIHZhbGlkYXRlcyBhZ2FpbnN0IOKAlCBwbGF0Zm9ybSdzIGtleS90b2tlblxuICogaXNzdWUgcm91dGVzIGluY2x1ZGVkIOKAlCBzbyBhIG5ldyBzY29wZSBpcyBhZGRlZCBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1NDT1BFUzogcmVhZG9ubHkgVG9rZW5TY29wZVtdID0gWydyZXBvcnRpbmc6aW5nZXN0JywgJ3JlZ2lzdHJ5OnB1c2gnLCAnc2NpbSddO1xuXG4vKipcbiAqIFdoYXQga2luZCBvZiBwcmluY2lwYWwgYSB0b2tlbiBzcGVha3MgZm9yLiBBdXRoIGRlY2lzaW9ucyBicmFuY2ggb24gdGhpcyBjbGFpbVxuICog4oCUIG5ldmVyIG9uIHRoZSBzaGFwZSBvZiBgc3ViYCBvciBvbiB3aGljaCBvcHRpb25hbCBjbGFpbXMgaGFwcGVuIHRvIGJlIHByZXNlbnQuXG4gKlxuICogLSBgdXNlcmAgICAgICAgICAgICDigJQgYSBwZXJzb24gKHNlc3Npb24sIG1hY2hpbmUgc2Vzc2lvbiwgUEFUIG9yIGltcGVyc29uYXRpb24pLlxuICogLSBgc2VydmljZV9hY2NvdW50YCDigJQgYSBub24taHVtYW4gYWNjb3VudCBvd25lZCBieSBPTkUgb3JnLCBob2xkaW5nIG9yZyBSb2xlc1xuICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdXRoZW50aWNhdGluZyB3aXRoIGEgYHBiX3NhX+KApmAga2V5IGV4Y2hhbmdlZCBhdFxuICogICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLiBOZXZlciBzYXRpc2ZpZXMgYW4gYXNzdXJhbmNlL3N0ZXAtdXAgZ2F0ZS5cbiAqIC0gYHNlcnZpY2VgICAgICAgICAg4oCUIGFuIGludGVybmFsIFBpcGVsaW5lIEJ1aWxkZXIgc2VydmljZSAoe0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59KS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJpbmNpcGFsVHlwZSA9ICd1c2VyJyB8ICdzZXJ2aWNlX2FjY291bnQnIHwgJ3NlcnZpY2UnO1xuXG4vKipcbiAqIEhvdyBhIHRva2VuIGlzIHVzZWQuIGBhY2Nlc3NgIGlzIGEgc2Vzc2lvbi1zdHlsZSBhY2Nlc3MgdG9rZW4gKGludGVyYWN0aXZlLFxuICogbWFjaGluZS1zZXNzaW9uIG9yIHNlcnZpY2UpOyBgYXBpX2tleWAgaXMgYSBzdGFuZGFsb25lIGNyZWRlbnRpYWwgdHJhY2tlZCBieVxuICogaXRzIG93biByZWNvcmQg4oCUIGEgUGVyc29uYWwgQWNjZXNzIFRva2VuIG9yIGEgc2VydmljZS1hY2NvdW50IGtleSwgbmFtZWQgYnlcbiAqIGBqdGlgLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblVzZSA9ICdhY2Nlc3MnIHwgJ2FwaV9rZXknO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGBhbXJgLCBSRkMgODE3NiBzdHlsZSkgdGhhdCBlc3RhYmxpc2hlZCBhIHVzZXInc1xuICogc2Vzc2lvbi4gYHB3ZGAgcGFzc3dvcmQgc2lnbi1pbjsgYG9hdXRoYCBzb2NpYWwgc2lnbi1pbiAoR29vZ2xlLCBHaXRIdWIg4oCmKTtcbiAqIGBzc29gIHBlci1vcmcgT0lEQyBzaW5nbGUgc2lnbi1vbjsgYHdlYmF1dGhuYCBhIHBhc3NrZXkgKFdlYkF1dGhuIGFzc2VydGlvblxuICogd2l0aCB1c2VyIHZlcmlmaWNhdGlvbik7IGBzdGVwdXBgIGEgc3RlcC11cCByZS12ZXJpZmljYXRpb24gdG9rZW47IGBtZmFgIGFcbiAqIHNlY29uZCBmYWN0b3Igd2FzIHByZXNlbnRlZCBhcyB3ZWxsIOKAlCB0b2RheSBhbiBhdXRoZW50aWNhdG9yLWFwcCBjb2RlIChUT1RQKVxuICogb3Igb25lIG9mIGl0cyByZWNvdmVyeSBjb2Rlcywgc28gaXQgYXBwZWFycyBBTE9OR1NJREUgdGhlIG1ldGhvZCB0aGF0XG4gKiBpZGVudGlmaWVkIHRoZSB1c2VyIChgWydwd2QnLCAnbWZhJ11gKSwgbmV2ZXIgb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0aE1ldGhvZCA9ICdwd2QnIHwgJ29hdXRoJyB8ICdzc28nIHwgJ3dlYmF1dGhuJyB8ICdzdGVwdXAnIHwgJ21mYSc7XG5cbi8qKlxuICogQXV0aGVudGljYXRvciBhc3N1cmFuY2UgbGV2ZWwgb2YgdGhlIHNlc3Npb24gYSB0b2tlbiBzcGVha3MgZm9yLlxuICpcbiAqIC0gYDFgIOKAlCBvbmUgZmFjdG9yOiBhIHBhc3N3b3JkLCBhIHNvY2lhbCBzaWduLWluLCBvciBTU08gdGhyb3VnaCBhbiBJZFAgdGhlXG4gKiAgIG9yZyBoYXMgTk9UIG1hcmtlZCBhcyBlbmZvcmNpbmcgTUZBLlxuICogLSBgMmAg4oCUIE1GQS1ncmFkZTogYSBwYXNza2V5IGFzc2VydGVkIHdpdGggdXNlciB2ZXJpZmljYXRpb24sIGEgcGFzc3dvcmQgcGx1c1xuICogICBhbiBhdXRoZW50aWNhdG9yLWFwcCBjb2RlLCBvciBTU08gdGhyb3VnaCBhbiBJZFAgdGhlIG9yZyBIQVMgbWFya2VkIGFzXG4gKiAgIGVuZm9yY2luZyBNRkEgKHByb3ZpZGVycyBkb24ndCBzZW5kIGBhbXJgIHJlbGlhYmx5LCBzbyB0aGUgb3JnJ3Mgb3duXG4gKiAgIHN0YXRlbWVudCBhYm91dCBpdHMgSWRQIGlzIHRoZSBzaWduYWwpLlxuICpcbiAqIEZpeGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgb3BlbmVkIGFuZCBzdG9yZWQgb24gaXRzIHJlZnJlc2gtc2Vzc2lvbiBzbG90LCBzb1xuICogcmVmcmVzaCAvIHJlbmV3YWwgLyBzd2l0Y2gtb3JnIGNvcHkgaXQgdmVyYmF0aW0gYW5kIGNhbiBuZXZlciBSQUlTRSBpdCDigJRcbiAqIGVhcm5pbmcgYWFsIDIgYWx3YXlzIG1lYW5zIGF1dGhlbnRpY2F0aW5nIGFnYWluIHdpdGggYSBzZWNvbmQgZmFjdG9yLlxuICovXG5leHBvcnQgdHlwZSBBc3N1cmFuY2VMZXZlbCA9IDEgfCAyO1xuXG4vKiogUnVudGltZSBjYXRhbG9ncyBmb3IgdGhlIGNsYWltIHVuaW9ucyBhYm92ZSAoYSB1bmlvbiBpcyBlcmFzZWQgYXQgcnVudGltZSkuICovXG5leHBvcnQgY29uc3QgUFJJTkNJUEFMX1RZUEVTOiByZWFkb25seSBQcmluY2lwYWxUeXBlW10gPSBbJ3VzZXInLCAnc2VydmljZV9hY2NvdW50JywgJ3NlcnZpY2UnXTtcbmV4cG9ydCBjb25zdCBUT0tFTl9VU0VTOiByZWFkb25seSBUb2tlblVzZVtdID0gWydhY2Nlc3MnLCAnYXBpX2tleSddO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUSE9EUzogcmVhZG9ubHkgQXV0aE1ldGhvZFtdID0gWydwd2QnLCAnb2F1dGgnLCAnc3NvJywgJ3dlYmF1dGhuJywgJ3N0ZXB1cCcsICdtZmEnXTtcblxuLyoqXG4gKiBRdW90YSB0eXBlIGlkZW50aWZpZXJzLlxuICpcbiAqIC0gYHBsdWdpbnNgIC8gYHBpcGVsaW5lc2Ag4oCUIGNvdW50IG9mIGNyZWF0ZWQgZW50aXRpZXNcbiAqIC0gYGFwaUNhbGxzYCDigJQgZ2VuZXJpYyBBUEkgY2FsbCBjb3VudCAocmVhZC1oZWF2eSBwYXRocykgbWFkZSBieSBQRU9QTEUgaW5cbiAqICAgSU5URVJBQ1RJVkUgU0VTU0lPTlMuIFBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgYXJlIE5PVCBoZXJlOiB0aGlzIGVudHJ5IHVzZWRcbiAqICAgdG8gc2F5IHRoZXkgd2VyZSwgYW5kIHtAbGluayBtZXRlcmVkUXVvdGFUeXBlRm9yfSBzYXlzIG90aGVyd2lzZS5cbiAqIC0gYGF1dG9tYXRpb25DYWxsc2Ag4oCUIHRoZSBzYW1lIG1ldGVyZWQgQVBJIGNhbGxzIHdoZW4gdGhlIGNhbGxlciBpcyBub3QgYW5cbiAqICAgaW50ZXJhY3RpdmUgc2Vzc2lvbjogYW4gT1JHIFNFUlZJQ0UgQUNDT1VOVFxuICogICAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlX2FjY291bnQnYCDigJQgcGxhdGZvcm0tYXV0b21hdGlvbixcbiAqICAgcGlwZWxpbmUtcmVnaXN0ZXIsIHJlcG9ydGluZy1pbmdlc3QgYW5kIHJlZ2lzdHJ5LXB1c2gga2V5cyksIGEgUEVSU09OQUxcbiAqICAgQUNDRVNTIEtFWSAoYHRva2VuX3VzZTogJ2FwaV9rZXknYCksIG9yIGFueSB0b2tlbiBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmVcbiAqICAgKGBwYXJlbnRLZXlJZGApLiBDb3VudGVkIElOU1RFQUQgb2YgYGFwaUNhbGxzYCwgbmV2ZXIgYXMgd2VsbCwgc28gYVxuICogICBzZWxmLW11dGF0aW5nIHBpcGVsaW5lIGRvaW5nIG9uZSBwbHVnaW4gbG9va3VwIHBlciBzdGVwIHBlciBydW4gY2Fubm90IGxvY2tcbiAqICAgaXRzIG93biBodW1hbnMgb3V0IG9mIHRoZSBjb25zb2xlIChzZWUge0BsaW5rIG1ldGVyZWRRdW90YVR5cGVGb3J9LCB3aGljaCBpc1xuICogICB0aGUgYXV0aG9yaXR5IGZvciB0aGUgc3BsaXQg4oCUIGBkb2NzL3F1b3Rhcy5tZGAgYWdyZWVzIHdpdGggaXQpLiBTaXplZCBmb3JcbiAqICAgdGhhdCB0cmFmZmljIHBlciB0aWVyLlxuICogLSBgYWlDYWxsc2Ag4oCUIEFJIHByb3ZpZGVyIGludm9jYXRpb25zIChjb3VudGVkIHNlcGFyYXRlbHkgYmVjYXVzZSBlYWNoIGNhbGxcbiAqICAgaGFzIGV4dGVybmFsIGRvbGxhciBjb3N0OyBzaXplZCBzbWFsbGVyIHRoYW4gYXBpQ2FsbHMgcGVyIHRpZXIpXG4gKiAtIGBzdG9yYWdlQnl0ZXNgIOKAlCByZWdpc3RyeSBzdG9yYWdlIGJ1ZGdldCBwZXIgb3JnLiBVbmxpa2UgdGhlIG90aGVyc1xuICogICAod2hpY2ggY291bnQgZGlzY3JldGUgZXZlbnRzKSwgdGhpcyBpcyBhIG1lYXN1cmVkIHRvdGFsIHJlY29tcHV0ZWRcbiAqICAgb24gZGVtYW5kLiBJbmNyZW1lbnRlZCBieSB0aGUgaW1hZ2UtcmVnaXN0cnkncyBwdXNoLWdhdGUgYmVmb3JlXG4gKiAgIGlzc3VpbmcgYSB0b2tlbiB3aG9zZSBzY29wZSBpbmNsdWRlcyBgcHVzaGA7IHRoZSBHQyBzY2hlZHVsZXJcbiAqICAgZXZlbnR1YWxseSBmcmVlcyB0aGUgYnl0ZXMsIHRoZW4gdGhlIG5leHQgcHVzaC1nYXRlIGNoZWNrIHJlYWRzXG4gKiAgIHRoZSBsb3dlciB2YWx1ZS4gTk9UIGEgY291bnRlci1zdHlsZSBxdW90YSBpbiB0aGUgc2Vuc2Ugb2ZcbiAqICAgYGluY3JlbWVudFVzYWdlYCDigJQgdGhlIHJlZ2lzdHJ5IHB1c2hlcyB0aGUgbWVhc3VyZWQgdG90YWwgdmlhXG4gKiAgIGB1cGRhdGVMaW1pdHNgL2ByZXNldFVzYWdlYCBmbG93cy4gVGllciBsaW1pdHMgYXJlIGJ5dGVzLlxuICogLSBgZGFzaGJvYXJkc2AgLyBgYWxlcnRSdWxlc2AgLyBgYWxlcnREZXN0aW5hdGlvbnNgIC8gYGlkcENvbmZpZ3NgIOKAlFxuICogICByZXNvdXJjZS1jb3VudCBxdW90YXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZyBEb1Mgc3VyZmFjZXMgaW4gdGhlXG4gKiAgIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMuIFdpdGhvdXQgdGhlc2UgY2FwcyBhIHNpbmdsZSBvcmcgY291bGRcbiAqICAgc3BhbSB0aG91c2FuZHMgb2YgZGFzaGJvYXJkcyAvIHJ1bGVzIGFuZCBibG9hdCB0aGUgc2hhcmVkIFBvc3RncmVzIC9cbiAqICAgTW9uZ28gd29ya2luZyBzZXRzLiBDb3VudGVkIGF0IGNyZWF0ZSB0aW1lOyBkZWNyZW1lbnRlZCBvbiBkZWxldGUuXG4gKiAtIGBsaXN0aW5nc2Ag4oCUIGFjdGl2ZSwgbm9uLXN1c3BlbmRlZCBwbHVnaW4tZWNvc3lzdGVtIGxpc3RpbmdzIGEgKHJvb3QpIG9yZ1xuICogICBwdWJsaXNoZXMgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBBIENPVU5UIHF1b3RhIGxpa2VcbiAqICAgYHBsdWdpbnNgOiBjaGVja2VkIGF0IHB1Ymxpc2gtcmVxdWVzdCBzdWJtaXQgYW5kIHJlLWNoZWNrZWQgYXQgYXBwcm92YWw7XG4gKiAgIGluc3RhbGxzIG5ldmVyIGNvdW50LlxuICovXG4vLyBOT1RFOiBgc2VhdHNgIGlzIGludGVudGlvbmFsbHkgTk9UIGhlcmUuIEl0J3MgYSB0aWVyIGxpbWl0IChRdW90YVRpZXJMaW1pdHMpXG4vLyBlbmZvcmNlZCBieSBjb21wYXJpbmcgdGhlIG9yZydzIExJVkUgbWVtYmVyIGNvdW50IGF0IGludml0ZSB0aW1lIOKAlCBub3QgYW5cbi8vIGluY3JlbWVudGluZyBwZXItcGVyaW9kIGNvdW50ZXIgbGlrZSB0aGUgY29uc3VtYWJsZSBxdW90YXMgYmVsb3cuXG5leHBvcnQgdHlwZSBRdW90YVR5cGUgPVxuICB8ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJyB8ICdhdXRvbWF0aW9uQ2FsbHMnIHwgJ2FpQ2FsbHMnIHwgJ3N0b3JhZ2VCeXRlcydcbiAgfCAnY3B1Q3JlZGl0cydcbiAgfCAnZGFzaGJvYXJkcycgfCAnYWxlcnRSdWxlcycgfCAnYWxlcnREZXN0aW5hdGlvbnMnIHwgJ2lkcENvbmZpZ3MnXG4gIHwgJ2xpc3RpbmdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYXV0b21hdGlvbkNhbGxzJywgJ2FpQ2FsbHMnLCAnc3RvcmFnZUJ5dGVzJyxcbiAgJ2NwdUNyZWRpdHMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuICAnbGlzdGluZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBIdW1hbiBsYWJlbCBmb3IgZWFjaCBxdW90YSB0eXBlLCBzaW5ndWxhciDigJQgdGhlIG9uZSBzcGVsbGluZyBldmVyeSA0MjkgYm9keSxcbiAqIG5vdGlmaWNhdGlvbiBhbmQgZGFzaGJvYXJkIHVzZXMgKFwiQVBJIGNhbGwgcXVvdGEgcmVhY2hlZCDigKZcIikuXG4gKlxuICogREVSSVZFRCBmcm9tIGB0eXBlcy9xdW90YS1jYXRhbG9nLnRzYCwgd2hpY2ggaXMgdGhlIG9uZSBwbGFjZSBhIHF1b3RhIHR5cGUnc1xuICogZGlzcGxheSBmYWN0cyBsaXZlIGFuZCB0aGUgb25lIHRoZSBicm93c2VyIGltcG9ydHMgZGlyZWN0bHkuIFRoaXMgc3RheXMgaGVyZVxuICogYXMgdGhlIHNlcnZlci1zaWRlIG5hbWUgYmVjYXVzZSBldmVyeSBzZXJ2aWNlIGFscmVhZHkgcmVhZHMgaXQgZnJvbSB0aGVcbiAqIGJhcnJlbDsgaXQgaXMgYSBwcm9qZWN0aW9uIG9mIHRoZSBjYXRhbG9nLCBub3QgYSBzZWNvbmQgY29weSBvZiBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX1RZUEVfTEFCRUxTOiBSZWFkb25seTxSZWNvcmQ8UXVvdGFUeXBlLCBzdHJpbmc+PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgKE9iamVjdC5lbnRyaWVzKFFVT1RBX0NBVEFMT0cpIGFzIEFycmF5PFtRdW90YVR5cGUsIHsgbGFiZWw6IHN0cmluZyB9XT4pLm1hcCgoW3R5cGUsIG1ldGFdKSA9PiBbdHlwZSwgbWV0YS5sYWJlbF0pLFxuKSBhcyBSZWFkb25seTxSZWNvcmQ8UXVvdGFUeXBlLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBXaGVyZSBhIHBlcnNvbiBnb2VzIHRvIHJhaXNlIGEgbGltaXQuIFJlbGF0aXZlIG9uIHB1cnBvc2U6IHRoZSBkYXNoYm9hcmQgYW5kXG4gKiB0aGUgQVBJIHNoYXJlIGFuIG9yaWdpbiBiZWhpbmQgbmdpbngsIGFuZCBhIENMSSAvIExhbWJkYSB0aGF0IHJlbmRlcnMgYSA0MjlcbiAqIHByZWZpeGVzIGl0IHdpdGggdGhlIHBsYXRmb3JtIFVSTCBpdCBhbHJlYWR5IHRhbGtzIHRvLlxuICovXG5leHBvcnQgY29uc3QgUVVPVEFfVVBHUkFERV9QQVRIID0gJy9kYXNoYm9hcmQvYmlsbGluZyc7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgUXVvdGFUeXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbHVlIGlzIGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1ZhbGlkUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSkpIHtcbiAqICAgLy8gcXVvdGFUeXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgUXVvdGFUeXBlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRRdW90YVR5cGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBRdW90YVR5cGUge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBWQUxJRF9RVU9UQV9UWVBFUy5pbmNsdWRlcyh2YWx1ZSBhcyBRdW90YVR5cGUpO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIHF1b3RhIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUNoZWNrUmVzdWx0IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgYWxsb3dlZCAqL1xuICBhbGxvd2VkOiBib29sZWFuO1xuICAvKiogTWF4aW11bSBxdW90YSBsaW1pdCAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgbGltaXQ6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgdXNhZ2UgY291bnQgKi9cbiAgdXNlZDogbnVtYmVyO1xuICAvKiogUmVtYWluaW5nIHF1b3RhICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbiAgLyoqIElTTyB0aW1lc3RhbXAgd2hlbiBxdW90YSByZXNldHMgKi9cbiAgcmVzZXRBdDogc3RyaW5nO1xuICAvKiogV2hldGhlciBxdW90YSBpcyB1bmxpbWl0ZWQgKi9cbiAgdW5saW1pdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogVHJ1ZSBPTkxZIHdoZW4gdGhpcyByZXN1bHQgaXMgdGhlIGZhaWwtb3BlbiBzZW50aW5lbCByZXR1cm5lZCBiZWNhdXNlIHRoZVxuICAgKiBxdW90YSBzZXJ2aWNlIHdhcyB1bnJlYWNoYWJsZSAvIHJldHVybmVkIG5vbi1vayAobm90IGEgcmVhbCBxdW90YSByZWFkaW5nKS5cbiAgICogTGV0cyBmYWlsLWNsb3NlZCBjYWxsZXJzIChlLmcuIHRoZSByZWdpc3RyeSBzdG9yYWdlIHB1c2gtZ2F0ZSkgZGlzdGluZ3Vpc2hcbiAgICogYW4gb3V0YWdlIGZyb20gYSBnZW51aW5lIGBsaW1pdDogLTFgICh1bmxpbWl0ZWQpIG9yZy4gQWJzZW50IG9uIHJlYWwgcmVzdWx0cy5cbiAgICovXG4gIGZhaWxPcGVuPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdW90YSBpbmZvcm1hdGlvbiBmb3IgZXJyb3IgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhSW5mbyB7XG4gIHR5cGU6IFF1b3RhVHlwZTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdXNlZDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgc3VjY2VzcyByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgc3VjY2VzczogdHJ1ZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBkYXRhPzogVDtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgZXJyb3IgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3JSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGZhbHNlO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgZGV0YWlscz86IHVua25vd247XG4gIHF1b3RhPzogUXVvdGFJbmZvO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIEFQSSByZXNwb25zZSB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZTxUID0gdW5rbm93bj4gPSBBcGlTdWNjZXNzUmVzcG9uc2U8VD4gfCBBcGlFcnJvclJlc3BvbnNlO1xuXG4vKipcbiAqIEpXVCBwYXlsb2FkIGZyb20gYWNjZXNzIHRva2Vucy5cbiAqXG4gKiBVc2VycyBjYW4gYmVsb25nIHRvIG11bHRpcGxlIG9yZ2FuaXphdGlvbnMuIFRoZSB0b2tlbiBpcyBzY29wZWQgdG8gb25lXG4gKiBhY3RpdmUgb3JnYW5pemF0aW9uIGF0IGEgdGltZS4gVGhlIGByb2xlYCBmaWVsZCBpcyB0aGUgdXNlcidzIHBlci1vcmdcbiAqIHJvbGUgaW4gdGhhdCBvcmdhbml6YXRpb24gKGZyb20gdGhlIFVzZXJPcmdhbml6YXRpb24ganVuY3Rpb24gY29sbGVjdGlvbiksXG4gKiBhbmQgYGlzQWRtaW5gIGlzIGRlcml2ZWQgYXMgYHJvbGUgPT09ICdhZG1pbicgfHwgcm9sZSA9PT0gJ293bmVyJ2AuXG4gKlxuICogVXNlIGBQT1NUIC9hdXRoL3N3aXRjaC1vcmdgIHRvIGNoYW5nZSB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiwgd2hpY2hcbiAqIHJlLWlzc3VlcyB0b2tlbnMgd2l0aCB0aGUgbmV3IG9yZydzIHJvbGUgYW5kIGNvbnRleHQuXG4gKi9cbi8qKlxuICogQ29hcnNlIHBlci1vcmcgbWVtYmVyc2hpcCBsYWJlbCwgREVSSVZFRCBmcm9tIHRoZSBSb2xlcyBhIHVzZXIgaXMgYXNzaWduZWRcbiAqICh0aGUgaGlnaGVzdCBgZ3JhbnRzUm9sZWAgYW1vbmcgdGhlbTsgYG93bmVyYCBpcyBzZXQgb25seSBieSBvd25lcnNoaXBcbiAqIHRyYW5zZmVyKS4gSXQgaXMgYSBkaXNwbGF5L2F1dGhvcml0eSBsYWJlbCDigJQgZHJpdmluZyBgaXNBZG1pbmAsIG93bmVyc2hpcCxcbiAqIGFuZCBzZWF0IGFjY291bnRpbmcg4oCUIE5PVCBhIHBlcm1pc3Npb24gc291cmNlLiBFZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZVxuICogc29sZWx5IGZyb20gdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcyAoc2VlIGByZXNvbHZlVXNlclBlcm1pc3Npb25zYCkuIE5vdCBhXG4gKiBnbG9iYWwgcm9sZS5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnUm9sZSA9ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XG4gIC8qKiBVc2VyIElEIChzdWJqZWN0KSAqL1xuICBzdWI6IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lICovXG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKiBVc2VyIGVtYWlsICovXG4gIGVtYWlsOiBzdHJpbmc7XG4gIC8qKiBXaGljaCBraW5kIG9mIHByaW5jaXBhbCB0aGlzIHRva2VuIHNwZWFrcyBmb3IgKHNlZSB7QGxpbmsgUHJpbmNpcGFsVHlwZX0pLiAqL1xuICBwcmluY2lwYWxUeXBlOiBQcmluY2lwYWxUeXBlO1xuICAvKiogSG93IHRoZSB0b2tlbiBpcyB1c2VkIChzZWUge0BsaW5rIFRva2VuVXNlfSk7IFBBVHMgYXJlIGBhcGlfa2V5YC4gKi9cbiAgdG9rZW5fdXNlOiBUb2tlblVzZTtcbiAgLyoqXG4gICAqIE1ldGhvZHMgdGhhdCBhdXRoZW50aWNhdGVkIHRoZSBzZXNzaW9uICh1c2VyIHByaW5jaXBhbHMpLiBLZXB0IG9uIHRoZVxuICAgKiByZWZyZXNoLXNlc3Npb24gc2xvdCwgc28gcmVmcmVzaCAvIHJlbmV3IC8gc3dpdGNoLW9yZyBjYXJyeSBpdCB1bmNoYW5nZWQuXG4gICAqIEFic2VudCBvbiBzZXJ2aWNlIHRva2Vucy5cbiAgICovXG4gIGFtcj86IEF1dGhNZXRob2RbXTtcbiAgLyoqIEFzc3VyYW5jZSBsZXZlbCAodXNlciBwcmluY2lwYWxzKS4gTmV2ZXIgcmFpc2VkIGJ5IHJlZnJlc2ggLyByZW5ldyAvIHN3aXRjaC1vcmcuICovXG4gIGFhbD86IEFzc3VyYW5jZUxldmVsO1xuICAvKiogRXBvY2ggc2Vjb25kcyBvZiB0aGUgc2lnbi1pbiB0aGF0IGVzdGFibGlzaGVkIHRoZSBzZXNzaW9uICh1c2VyIHByaW5jaXBhbHMpLlxuICAgKiAgTmV2ZXIgcmVzZXQgYnkgcmVmcmVzaCAvIHJlbmV3IC8gc3dpdGNoLW9yZy4gKi9cbiAgYXV0aF90aW1lPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjdGl2ZSBvcmcgUkVRVUlSRVMgTUZBIGFuZCBpdHMgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQuXG4gICAqXG4gICAqIENhcnJpZWQgYXMgYSBjbGFpbSBzbyBubyBzZXJ2aWNlIGhhcyB0byBsb29rIHRoZSBwb2xpY3kgdXA6IHRoZSBvcmcgcG9saWN5XG4gICAqIGlzIGVuZm9yY2VkIHdoZXJlIHRoZSB0b2tlbiBpcyBJU1NVRUQgKGEgc2Vzc2lvbiBzY29wZWQgdG8gc3VjaCBhbiBvcmcgZ2V0c1xuICAgKiBgYWFsOiAyYCBvciBpcyByZWZ1c2VkKSwgYW5kIHRoaXMgY2xhaW0gaXMgdGhlIHJlY29yZCBvZiB0aGF0IGRlY2lzaW9uLCBmb3JcbiAgICogVUkgY29weSBhbmQgYXVkaXQgcmF0aGVyIHRoYW4gZm9yIGEgc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LlxuICAgKi9cbiAgbWZhUmVxdWlyZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGFjdGl2ZSBvcmcncyBcImFkbWluaXN0cmF0aXZlIGFjdGlvbnMgcmVxdWlyZSBNRkFcIiBwb2xpY3lcbiAgICogKGBhZG1pbkFjdGlvbnNSZXF1aXJlTWZhYCwgc3RyaWN0ZXN0IGFjcm9zcyB0aGUgb3JnIGFuZCBpdHMgYW5jZXN0b3JzKS5cbiAgICogUHJlc2VudCDigJQgYW5kIGFsd2F5cyBgMmAg4oCUIG9ubHkgd2hlbiB0aGUgcG9saWN5IGlzIG9uLiBJdCBpcyByZXNvbHZlZCB3aGVuXG4gICAqIHRoZSB0b2tlbiBpcyBJU1NVRUQsIHNvIHNlcnZpY2VzIHRoYXQgY2FuJ3QgcmVhZCB0aGUgb3JnIGRvY3VtZW50IHN0aWxsIGtub3dcbiAgICogdGhlIHBvbGljeTogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgcmVmdXNlcyBhbiBgYWFsOiAxYCBzZXNzaW9uIG9uIGFuXG4gICAqIGFkbWluaXN0cmF0aXZlIHJvdXRlIHdoZW4gdGhpcyBjbGFpbSBpcyBwcmVzZW50LiBDaGFuZ2luZyB0aGUgcG9saWN5IGJ1bXBzXG4gICAqIGV2ZXJ5IGFmZmVjdGVkIG1lbWJlcidzIGB0b2tlblZlcnNpb25gLCBzbyB0aGUgY2xhaW0gY2FuJ3QgZ28gc3RhbGUuXG4gICAqL1xuICBvcmdfYWRtaW5fYWFsPzogMjtcbiAgLyoqXG4gICAqIEJPT1RTVFJBUC1BRE1JTiBFWENFUFRJT04uIFNldCBvbmx5IG9uIGEgc2Vzc2lvbiBvcGVuZWQgYnlcbiAgICogdGhlIGluc3RhbGwncyBib290c3RyYXAgYWRtaW4gKGBCT09UU1RSQVBfU1VQRVJBRE1JTl9FTUFJTFNgLCBzeXN0ZW0gb3JnKVxuICAgKiB3aGlsZSB0aGV5IHN0aWxsIGhhdmUgbm8gZW5yb2xsZWQgZmFjdG9yLiBTdWNoIGEgc2Vzc2lvbiBpcyBgYWFsOiAxYCBhbmQgbWF5XG4gICAqIHJlYWNoIE9OTFkgZW5yb2xtZW50LCBzaWduLW91dCBhbmQgdGhlIHJvdXRlcyBgaW5pdC1wbGF0Zm9ybS5zaGAgY2FsbHM7XG4gICAqIGV2ZXJ5IG90aGVyIHNlcnZpY2UgcmVmdXNlcyBpdCBvdXRyaWdodCAoc2VlIGByZXF1aXJlQXV0aGApLiBUaGUgZXhjZXB0aW9uXG4gICAqIGNsb3NlcyBwZXJtYW5lbnRseSBhdCB0aGUgZmlyc3QgZW5yb2xtZW50IGFuZCBuZXZlciByZW9wZW5zLlxuICAgKi9cbiAgbWZhRW5yb2xsbWVudFBlbmRpbmc/OiBib29sZWFuO1xuICAvKiogUGVyLW9yZyByb2xlIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICgnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInKS4gTm90IGEgZ2xvYmFsIHJvbGUuICovXG4gIHJvbGU6IE9yZ1JvbGU7XG4gIC8qKiBEZXJpdmVkOiB0cnVlIHdoZW4gcm9sZSBpcyAnYWRtaW4nIG9yICdvd25lcicgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKi9cbiAgaXNBZG1pbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXNvbHZlZCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBhY3RpdmUgb3JnL3RlYW0g4oCUIHRoZSB1bmlvbiBvZlxuICAgKiB0aGUgcGVybWlzc2lvbnMgY2FycmllZCBieSBldmVyeSBSb2xlIHRoZSB1c2VyIGlzIGFzc2lnbmVkIChzZWVcbiAgICogYHJlc29sdmVVc2VyUGVybWlzc2lvbnNgKS4gQWJzZW50IG9uIG1hY2hpbmUvc2NvcGVkIHRva2Vucy4gU3VwZXJhZG1pbnMgYXJlXG4gICAqIGdyYW50ZWQgYWxsIHBlcm1pc3Npb25zIGltcGxpY2l0bHkgYW5kIG1heSBvbWl0IHRoaXMuIEVuZHBvaW50cyBlbmZvcmNlIHZpYVxuICAgKiBgcmVxdWlyZVBlcm1pc3Npb24oLi4uKWAuXG4gICAqL1xuICBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXTtcbiAgLyoqXG4gICAqIEdsb2JhbCBzdXBlci1hZG1pbiBmbGFnIChjcm9zcy1vcmcpLiBXaGVuIGB0cnVlYCwgdGhlIHVzZXIgaXMgdHJlYXRlZFxuICAgKiBhcyBhIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb3JnIHRoZXkncmUgY3VycmVudGx5XG4gICAqIGFjdGluZyB1bmRlci4gVGhpcyBpcyB0aGUgU09MRSBzaWduYWwgZm9yIHN5c2FkbWluIGF1dGhvcml0eSDigJQgbWVtYmVyc2hpcCBpblxuICAgKiB0aGUgd2VsbC1rbm93biBcInN5c3RlbVwiIG9yZyBncmFudHMgbm90aGluZywgYmVjYXVzZSB0aGF0IHdvdWxkIGNvbmZsYXRlXG4gICAqIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGggXCJjdXN0b21lciB0ZW5hbnRcIiBpbiB0aGUgZGF0YSBtb2RlbC5cbiAgICovXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW47XG4gIC8qKiBPcmdhbml6YXRpb24ncyBxdW90YSB0aWVyLiAqL1xuICB0aWVyPzogUXVvdGFUaWVyO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTmFycm93IGNhcGFiaWxpdHkgc2NvcGUgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMgKGUuZy5cbiAgICogYCdyZXBvcnRpbmc6aW5nZXN0J2ApLiBBYnNlbnQgb24gbm9ybWFsIGludGVyYWN0aXZlIHVzZXIgdG9rZW5zLiBFbmRwb2ludHNcbiAgICogdGhhdCBhY2NlcHQgYSBzY29wZWQgaWRlbnRpdHkgY2hlY2sgdGhpcyAoc2VlIGBoYXNTY29wZWApIGluc3RlYWQgb2Ygcm9sZTtcbiAgICogYSBzY29wZWQgdG9rZW4gaXMgbWludGVkIHdpdGggbWluaW1hbCByb2xlIGZvciBsZWFzdC1wcml2aWxlZ2UuXG4gICAqL1xuICBzY29wZT86IFRva2VuU2NvcGU7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4ncyBgcGVybWlzc2lvbnNgIHdlcmUgTkFSUk9XRUQgdG8gYSBjYXRhbG9nIHN1YnNldCBjaG9zZW4gd2hlbiB0aGVcbiAgICogY3JlZGVudGlhbCB3YXMgY3JlYXRlZCAoYSBwZXJtaXNzaW9uLXNjb3BlZCBwZXJzb25hbCBhY2Nlc3Mga2V5IG9yIG1hY2hpbmVcbiAgICogdG9rZW4pLiBUaGUgY2xhaW0gaXMgdGhlIHJlY29yZCB0aGF0IGBwZXJtaXNzaW9uc2AgaXMgdGhlIElOVEVSU0VDVElPTiBvZlxuICAgKiB0aGF0IHN1YnNldCB3aXRoIHRoZSBob2xkZXIncyBjdXJyZW50IFJvbGVzIOKAlCBub3QgdGhlaXIgZnVsbCBhdXRob3JpdHkg4oCUIHNvXG4gICAqIGFueXRoaW5nIHRoZSB0b2tlbiBtaW50cyBjYW4gb25seSBiZSBuYXJyb3dlciBzdGlsbCwgYW5kIGl0IG5ldmVyIGNhcnJpZXNcbiAgICogYGlzU3VwZXJBZG1pbmAgb3IgYW4gYWRtaW4gYHJvbGVgIChib3RoIHdvdWxkIGJ5cGFzcyB0aGUgc3Vic2V0KS4gT25seSBldmVyXG4gICAqIGB0cnVlYDsgYWJzZW50IG9uIHVucmVzdHJpY3RlZCB0b2tlbnMuXG4gICAqL1xuICBwZXJtaXNzaW9uc1Jlc3RyaWN0ZWQ/OiBib29sZWFuO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IChvcmctdGVhbS1oaWVyYXJjaHkgcHJvcG9zYWwsIHBoYXNlIDEpLlxuICAgKiBgcGFyZW50T3JnYW5pemF0aW9uSWRgIGlzIHRoZSBhY3RpdmUgb3JnJ3MgZGlyZWN0IHBhcmVudDsgYHJvb3RPcmdhbml6YXRpb25JZGBcbiAgICogaXMgdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEJvdGggYXJlICoqb21pdHRlZCBmb3IgZmxhdCAocm9vdCkgb3JncyoqIOKAlFxuICAgKiBjb25zdW1lcnMgc2hvdWxkIHRyZWF0IHRoZSBlZmZlY3RpdmUgcm9vdCBhcyBgcm9vdE9yZ2FuaXphdGlvbklkID8/IG9yZ2FuaXphdGlvbklkYFxuICAgKiAodXNlIHRoZSBzaGFyZWQge0BsaW5rIGVmZmVjdGl2ZVJvb3RPcmdJZH0gYWNjZXNzb3IgcmF0aGVyIHRoYW4gY29hbGVzY2luZyBpbmxpbmUpLlxuICAgKiBDdXJyZW50bHkgZXZlcnkgb3JnIGlzIGZsYXQsIHNvIHRoZXNlIGFyZSBhYnNlbnQgb24gYWxsIHRva2VucyB0b2RheS5cbiAgICovXG4gIHBhcmVudE9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogUm9vdCBvcmdhbml6YXRpb24gSUQgb2YgdGhlIGFjdGl2ZSBvcmcncyBhbmNlc3RyeSBjaGFpbiAoc2VlIGBwYXJlbnRPcmdhbml6YXRpb25JZGApLiAqL1xuICByb290T3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXQgb24gdG9rZW5zIGlzc3VlZCBieSB0aGUgc3lzYWRtaW4gaW1wZXJzb25hdGlvbiBmbG93XG4gICAqIChgUE9TVCAvYWRtaW4vaW1wZXJzb25hdGUvOnVzZXJJZGApLiBDYXJyaWVzIHRoZSBvcmlnaW5hbCBzeXNhZG1pbidzXG4gICAqIHVzZXIgaWQgc28gYXVkaXQgZXZlbnRzIHN0aWxsIGF0dHJpYnV0ZSBhY3Rpb25zIGNvcnJlY3RseS5cbiAgICovXG4gIGltcGVyc29uYXRvcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogVW5pcXVlIHRva2VuIGlkLiBPbiBhbiBpbXBlcnNvbmF0aW9uIHRva2VuIGl0IGlkZW50aWZpZXMgdGhlIFNFU1NJT04sIHNvIGl0XG4gICAqIGNhbiBiZSByZXZva2VkIG9uIGl0cyBvd24gYWNyb3NzIGV2ZXJ5IHNlcnZpY2UgKHNlZVxuICAgKiBgVG9rZW5SZXZvY2F0aW9uU3RvcmUuZ2V0U2Vzc2lvblJldm9jYXRpb25gKS4gUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xuICAgKiAoYHRva2VuX3VzZTogJ2FwaV9rZXknYCkgY2Fycnkgb25lIHRvbywgdmFsaWRhdGVkIGFnYWluc3QgdGhlaXIgb3duIHJlY29yZC5cbiAgICogQSBganRpYCBhbG9uZSBuZXZlciBjbGFzc2lmaWVzIGEgdG9rZW4g4oCUIGB0b2tlbl91c2VgIGFuZCBgaW1wZXJzb25hdG9ySWRgIGRvLlxuICAgKi9cbiAganRpPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgdG9rZW4gaXMgcmVhZC1vbmx5IOKAlCBhbnkgbm9uLUdFVCByZXF1ZXN0IGlzIHJlamVjdGVkXG4gICAqIHVwc3RyZWFtIGJ5IHRoZSBwbGF0Zm9ybSdzIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIGdhdGUuIExldHNcbiAgICogc3lzYWRtaW5zIFwidmlldyBhcyB1c2VyIFhcIiB3aXRob3V0IHJpc2tpbmcgYSBkZXN0cnVjdGl2ZSBhY3Rpb24uXG4gICAqL1xuICBpbXBlcnNvbmF0aW9uUmVhZE9ubHk/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJlZnJlc2gtc2Vzc2lvbiBzbG90IChpbnRlcmFjdGl2ZSBvciBtYWNoaW5lKSB0aGlzIGFjY2VzcyB0b2tlbiB3YXNcbiAgICogbWludGVkIHdpdGguIFJldm9raW5nIHRoYXQgT05FIHNsb3QgcHVibGlzaGVzIGByZXZva2U6c2lkOjxzaWQ+YCAoc2VlXG4gICAqIGBjcmVkZW50aWFsUmV2b2NhdGlvbktleWApLCB3aGljaCBldmVyeSBzZXJ2aWNlIGNoZWNrcyBpbiBgcmVxdWlyZUF1dGhgLCBzb1xuICAgKiBhIHNpbmdsZSBzaWduZWQtb3V0IGRldmljZSAvIG1hY2hpbmUgY3JlZGVudGlhbCBzdG9wcyB3b3JraW5nIGV2ZXJ5d2hlcmVcbiAgICogaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiBhdCBuYXR1cmFsIGV4cGlyeS4gQWJzZW50IG9uIFBBVHMgYW5kIGltcGVyc29uYXRpb24uXG4gICAqL1xuICBzaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIGtleSAoUEFUIC8gc2VydmljZS1hY2NvdW50IGtleSBpZCkgdGhpcyB0b2tlbiB3YXMgREVSSVZFRCBmcm9tLFxuICAgKiB3aGVuIGl0IGlzIG5vdCBpdHNlbGYgdGhlIGV4Y2hhbmdlZCBrZXkgdG9rZW4gKHdob3NlIGtleSBpZCBpcyBpdHMgYGp0aWApIOKAlFxuICAgKiBlLmcuIGEgc3dpdGNoLW9yZyBvciBnZW5lcmF0ZS10b2tlbiBtaW50IG1hZGUgd2hpbGUgaG9sZGluZyBhbiBleGNoYW5nZWRcbiAgICoga2V5IHRva2VuLiBSZXZva2luZyB0aGUga2V5IHB1Ymxpc2hlcyBgcmV2b2tlOmtleTo8a2V5SWQ+YCwgd2hpY2ggcmVqZWN0c1xuICAgKiBldmVyeSB0b2tlbiB0aGF0IG5hbWVzIGl0IGhlcmUgb3IgYXMgaXRzIGBqdGlgLlxuICAgKi9cbiAgcGFyZW50S2V5SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTRVJWSUNFIHRva2VucyBvbmx5OiB0aGlzIGF1ZGl0IGRlbGl2ZXJ5IG1heSByZWNvcmQgYW4gYGFmZmVjdGVkT3JnSWRgXG4gICAqIG91dHNpZGUgdGhlIHRva2VuJ3Mgb3JnIChzZWUgYFNlcnZpY2VUb2tlbk9wdGlvbnMuYXVkaXRDcm9zc09yZ2ApLiBIb25vdXJlZFxuICAgKiBieSBwbGF0Zm9ybSdzIGAvYXVkaXQvZXZlbnRzYCBpbmdlc3QgYWxvbmUuXG4gICAqL1xuICBhdWRpdENyb3NzT3JnPzogdHJ1ZTtcbiAgLyoqXG4gICAqIFRoZSB1c2VyJ3MgQUNDRVNTIHZlcnNpb24gYXQgdGhlIG1vbWVudCB0aGlzIHRva2VuIHdhcyBpc3N1ZWQ6IHRoZSBoYXJkXG4gICAqIGB0b2tlblZlcnNpb25gIChkZWFjdGl2YXRlIC8gcGFzc3dvcmQgY2hhbmdlIC8gbG9nb3V0LWFsbCDigJQgY2xlYXJzIHNsb3RzKVxuICAgKiBwbHVzIGBjbGFpbXNWZXJzaW9uYCAocm9sZSwgdGllciwgbWVtYmVyc2hpcCBvciBvd25lcnNoaXAgY2hhbmdlcyDigJQgcmUtbWludGVkXG4gICAqIG9uIHJlZnJlc2gpLiBCb3RoIG9ubHkgZ3Jvdywgc28gYSB0b2tlbiB3aG9zZSBlbWJlZGRlZCB2ZXJzaW9uIGlzIGJlaGluZCB0aGVcbiAgICogY3VycmVudCBvbmUgaGFzIGJlZW4gUkVWT0tFRC4gUGxhdGZvcm0gdmFsaWRhdGVzIHRoaXMgYWdhaW5zdCBNb25nbzsgdGhlXG4gICAqIHN0YXRlbGVzcyBzZXJ2aWNlcyB2YWxpZGF0ZSBpdCBhZ2FpbnN0IGEgUmVkaXMtcHVibGlzaGVkIGN1cnJlbnQtdmVyc2lvblxuICAgKiBzdG9yZSAoc2VlIGBzZXRUb2tlblJldm9jYXRpb25TdG9yZWApLiBBYnNlbnQgb24gbWFjaGluZS9zZXJ2aWNlIHRva2Vucy5cbiAgICovXG4gIHRva2VuVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqIFRva2VuIHR5cGUgKi9cbiAgdHlwZTogJ2FjY2VzcycgfCAncmVmcmVzaCc7XG4gIC8qKiBJc3N1ZWQgYXQgdGltZXN0YW1wICovXG4gIGlhdD86IG51bWJlcjtcbiAgLyoqIEV4cGlyYXRpb24gdGltZXN0YW1wICovXG4gIGV4cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWNjb3VudCBib3VuZGFyeSAocm9vdCBvcmcpIGZvciBhIHRva2VuJ3MgYWN0aXZlIG9yZy5cbiAqXG4gKiBUaGUgYWNjb3VudCByb290IGlzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgOiBhIGZsYXQgKHJvb3QpIG9yZ1xuICogb21pdHMgYHJvb3RPcmdhbml6YXRpb25JZGAsIHNvIGl0IElTIGl0cyBvd24gcm9vdDsgYSB0ZWFtIChjaGlsZCkgb3JnIGNhcnJpZXNcbiAqIHRoZSB0b3Agb2YgaXRzIGFuY2VzdHJ5IGNoYWluLiBFdmVyeSBhY2NvdW50LXNjb3BlZCByZWFkIChxdW90YS9zZWF0L2JpbGxpbmdcbiAqIHBvb2xpbmcpIG11c3QgcmVzb2x2ZSB0aHJvdWdoIHRoaXMgY29hbGVzY2UgcmF0aGVyIHRoYW4gcmVhZGluZ1xuICogYG9yZ2FuaXphdGlvbklkYCBkaXJlY3RseSDigJQgdGhlIGxhdHRlciBzaWxlbnRseSB3b3JrcyB0b2RheSAoYWxsIG9yZ3MgZmxhdClcbiAqIGJ1dCB3b3VsZCBiaW5kIHRvIHRoZSB0ZWFtIGluc3RlYWQgb2YgdGhlIGFjY291bnQgb25jZSB0ZWFtcyBleGlzdC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgZWZmZWN0aXZlIHJvb3Qgb3JnIGlkLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgZmllbGQgaXMgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlUm9vdE9yZ0lkKFxuICBwYXlsb2FkOiBQaWNrPEp3dFBheWxvYWQsICdvcmdhbml6YXRpb25JZCcgfCAncm9vdE9yZ2FuaXphdGlvbklkJz4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcGF5bG9hZC5yb290T3JnYW5pemF0aW9uSWQgPz8gcGF5bG9hZC5vcmdhbml6YXRpb25JZDtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBFeHByZXNzIFJlcXVlc3Qgd2l0aCB1c2VyIHByb3BlcnR5LlxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIG5hbWVzcGFjZSBFeHByZXNzIHtcbiAgICBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gICAgICB1c2VyPzogSnd0UGF5bG9hZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIEhUVFAgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBob3N0bmFtZSAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIHBvcnQgKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnaGVhbHRoeScgfCAndW5oZWFsdGh5JztcbiAgc2VydmljZTogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdXB0aW1lOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+O1xufVxuIl19
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBVSxDQUFDO0FBUW5GOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUcvRTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUd6RDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFVLENBQUM7QUFpRTFGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGNBQWM7SUFDaEYsWUFBWTtJQUNaLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsWUFBWTtJQUM3RCxVQUFVO0NBQ0YsQ0FBQztBQUVYOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQXdDLE1BQU0sQ0FBQyxXQUFXLENBQ3JGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUEyQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDNUUsQ0FBQztBQUV6Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7QUFFdkQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQWtCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBa1BEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFrRTtJQUVsRSxPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBRVU9UQV9DQVRBTE9HIH0gZnJvbSAnLi9xdW90YS1jYXRhbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUaWVyIH0gZnJvbSAnLi9xdW90YS10aWVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9yZ1JvbGUgfSBmcm9tICcuL3dpcmUtdm9jYWJ1bGFyeS5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSBzY29wZSBjYXRhbG9nIGZvciBtYWNoaW5lL2F1dG9tYXRpb24gdG9rZW5zLiBBIHNjb3BlZCB0b2tlbiBjYXJyaWVzXG4gKiBleGFjdGx5IG9uZSBvZiB0aGVzZSBpbnN0ZWFkIG9mIHJvbGUtYmFzZWQgcGVybWlzc2lvbnM7IGVuZHBvaW50cyB0aGF0IGFjY2VwdCBhXG4gKiBzY29wZWQgaWRlbnRpdHkgY2hlY2sgaXQgdmlhIGBoYXNTY29wZWAuIEtlcHQgYSBjbG9zZWQgdW5pb24gKG1pcnJvcmluZ1xuICoge0BsaW5rIFBlcm1pc3Npb259KSBzbyBhIHR5cG8gb24gZWl0aGVyIHRoZSBtaW50IG9yIHRoZSBjaGVjayBzaWRlIGlzIGEgY29tcGlsZVxuICogZXJyb3IuIEFkZCBhIHZhbHVlIGhlcmUgd2hlbiBpbnRyb2R1Y2luZyBhIG5ldyBzY29wZWQtdG9rZW4gc3VyZmFjZS5cbiAqXG4gKiAtIGByZXBvcnRpbmc6aW5nZXN0YCDigJQgdGhlIEFXUyBldmVudC1pbmdlc3Rpb24gTGFtYmRhJ3Mgd3JpdGVzIChgL3JlcG9ydHMvZXZlbnRzYCxcbiAqICAgYC9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgKSBhbmQgdGhlIGluY2lkZW50IHdlYmhvb2suXG4gKiAtIGByZWdpc3RyeTpwdXNoYCAgICDigJQgYGRvY2tlciBwdXNoYCBpbnRvIHRoZSBvd25pbmcgb3JnJ3Mgb3duIG5hbWVzcGFjZSB2aWFcbiAqICAgaW1hZ2UtcmVnaXN0cnkncyBgL3Rva2VuYCBlbmRwb2ludC4gR3JhbnRzIHRoZSByYXctaW1hZ2Ugd3JpdGUgdGhhdFxuICogICBgcGx1Z2luczp3cml0ZWAgZ3JhbnRzIGEgcGVyc29uLCBhbmQgbm90aGluZyBlbHNlOiBhIHNjb3BlZCB0b2tlbiBjYXJyaWVzIG5vXG4gKiAgIHBlcm1pc3Npb25zLCBzbyBpdCBjYW4gbmVpdGhlciByZWFkIHRoZSBBUEkgbm9yIHB1c2ggb3V0c2lkZSBpdHMgb3JnLlxuICogLSBgc2NpbWAgICAgICAgICAgICAg4oCUIGFuIGlkZW50aXR5IHByb3ZpZGVyJ3MgU0NJTSAyLjAgY2xpZW50ICgzYikgZHJpdmluZ1xuICogICBgL3NjaW0vdjIvVXNlcnNgIGFuZCBgL3NjaW0vdjIvR3JvdXBzYCBmb3IgdGhlIGtleSdzIE9XTiBvcmcuIEl0IHByb3Zpc2lvbnNcbiAqICAgYW5kIGRlYWN0aXZhdGVzIG1lbWJlcnNoaXBzIGFuZCBtb3ZlcyBwZW9wbGUgYmV0d2VlbiBkaXJlY3RvcnkgZ3JvdXBzOyBpdFxuICogICBjYW4gbmV2ZXIgcmVhZCBvciB3cml0ZSBhbnl0aGluZyBlbHNlLCBhbmQg4oCUIGJlY2F1c2UgYSBzY29wZWQgdG9rZW4gY2Fycmllc1xuICogICBubyBwZXJtaXNzaW9ucyDigJQgaXQgY2Fubm90IGF1dGhvciB0aGUgZ3JvdXAg4oaSIFJvbGUgcnVsZXMgaXRzIHN5bmNzIHJlc29sdmVcbiAqICAgdGhyb3VnaC4gT25seSBhIHNlcnZpY2UtYWNjb3VudCBrZXkgbWF5IGNhcnJ5IGl0OyBhIHBlcnNvbidzIHRva2VuIG5ldmVyIGRvZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBUT0tFTl9TQ09QRVMgPSBbJ3JlcG9ydGluZzppbmdlc3QnLCAncmVnaXN0cnk6cHVzaCcsICdzY2ltJ10gYXMgY29uc3Q7XG4vKipcbiAqIEEgdG9rZW4gc2NvcGUuIHtAbGluayBUT0tFTl9TQ09QRVN9IGlzIHRoZSBPTkUgYWxsb3dsaXN0IGV2ZXJ5IG1pbnQgcGF0aFxuICogdmFsaWRhdGVzIGFnYWluc3Qg4oCUIHBsYXRmb3JtJ3Mga2V5L3Rva2VuIGlzc3VlIHJvdXRlcyBpbmNsdWRlZCDigJQgc28gYSBuZXdcbiAqIHNjb3BlIGlzIGFkZGVkIGluIGV4YWN0bHkgb25lIHBsYWNlLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblNjb3BlID0gKHR5cGVvZiBUT0tFTl9TQ09QRVMpW251bWJlcl07XG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHByaW5jaXBhbCBhIHRva2VuIHNwZWFrcyBmb3IuIEF1dGggZGVjaXNpb25zIGJyYW5jaCBvbiB0aGlzIGNsYWltXG4gKiDigJQgbmV2ZXIgb24gdGhlIHNoYXBlIG9mIGBzdWJgIG9yIG9uIHdoaWNoIG9wdGlvbmFsIGNsYWltcyBoYXBwZW4gdG8gYmUgcHJlc2VudC5cbiAqXG4gKiAtIGB1c2VyYCAgICAgICAgICAgIOKAlCBhIHBlcnNvbiAoc2Vzc2lvbiwgbWFjaGluZSBzZXNzaW9uLCBQQVQgb3IgaW1wZXJzb25hdGlvbikuXG4gKiAtIGBzZXJ2aWNlX2FjY291bnRgIOKAlCBhIG5vbi1odW1hbiBhY2NvdW50IG93bmVkIGJ5IE9ORSBvcmcsIGhvbGRpbmcgb3JnIFJvbGVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGF1dGhlbnRpY2F0aW5nIHdpdGggYSBgcGJfc2Ff4oCmYCBrZXkgZXhjaGFuZ2VkIGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0uIE5ldmVyIHNhdGlzZmllcyBhbiBhc3N1cmFuY2Uvc3RlcC11cCBnYXRlLlxuICogLSBgc2VydmljZWAgICAgICAgICDigJQgYW4gaW50ZXJuYWwgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlICh7QGxpbmsgc2lnblNlcnZpY2VUb2tlbn0pLlxuICovXG5leHBvcnQgY29uc3QgUFJJTkNJUEFMX1RZUEVTID0gWyd1c2VyJywgJ3NlcnZpY2VfYWNjb3VudCcsICdzZXJ2aWNlJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQcmluY2lwYWxUeXBlID0gKHR5cGVvZiBQUklOQ0lQQUxfVFlQRVMpW251bWJlcl07XG5cbi8qKlxuICogSG93IGEgdG9rZW4gaXMgdXNlZC4gYGFjY2Vzc2AgaXMgYSBzZXNzaW9uLXN0eWxlIGFjY2VzcyB0b2tlbiAoaW50ZXJhY3RpdmUsXG4gKiBtYWNoaW5lLXNlc3Npb24gb3Igc2VydmljZSk7IGBhcGlfa2V5YCBpcyBhIHN0YW5kYWxvbmUgY3JlZGVudGlhbCB0cmFja2VkIGJ5XG4gKiBpdHMgb3duIHJlY29yZCDigJQgYSBQZXJzb25hbCBBY2Nlc3MgVG9rZW4gb3IgYSBzZXJ2aWNlLWFjY291bnQga2V5LCBuYW1lZCBieVxuICogYGp0aWAuXG4gKi9cbmV4cG9ydCBjb25zdCBUT0tFTl9VU0VTID0gWydhY2Nlc3MnLCAnYXBpX2tleSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVG9rZW5Vc2UgPSAodHlwZW9mIFRPS0VOX1VTRVMpW251bWJlcl07XG5cbi8qKlxuICogQXV0aGVudGljYXRpb24gbWV0aG9kcyAoYGFtcmAsIFJGQyA4MTc2IHN0eWxlKSB0aGF0IGVzdGFibGlzaGVkIGEgdXNlcidzXG4gKiBzZXNzaW9uLiBgcHdkYCBwYXNzd29yZCBzaWduLWluOyBgb2F1dGhgIHNvY2lhbCBzaWduLWluIChHb29nbGUsIEdpdEh1YiDigKYpO1xuICogYHNzb2AgcGVyLW9yZyBPSURDIHNpbmdsZSBzaWduLW9uOyBgd2ViYXV0aG5gIGEgcGFzc2tleSAoV2ViQXV0aG4gYXNzZXJ0aW9uXG4gKiB3aXRoIHVzZXIgdmVyaWZpY2F0aW9uKTsgYHN0ZXB1cGAgYSBzdGVwLXVwIHJlLXZlcmlmaWNhdGlvbiB0b2tlbjsgYG1mYWAgYVxuICogc2Vjb25kIGZhY3RvciB3YXMgcHJlc2VudGVkIGFzIHdlbGwg4oCUIHRvZGF5IGFuIGF1dGhlbnRpY2F0b3ItYXBwIGNvZGUgKFRPVFApXG4gKiBvciBvbmUgb2YgaXRzIHJlY292ZXJ5IGNvZGVzLCBzbyBpdCBhcHBlYXJzIEFMT05HU0lERSB0aGUgbWV0aG9kIHRoYXRcbiAqIGlkZW50aWZpZWQgdGhlIHVzZXIgKGBbJ3B3ZCcsICdtZmEnXWApLCBuZXZlciBvbiBpdHMgb3duLlxuICovXG5leHBvcnQgY29uc3QgQVVUSF9NRVRIT0RTID0gWydwd2QnLCAnb2F1dGgnLCAnc3NvJywgJ3dlYmF1dGhuJywgJ3N0ZXB1cCcsICdtZmEnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEF1dGhNZXRob2QgPSAodHlwZW9mIEFVVEhfTUVUSE9EUylbbnVtYmVyXTtcblxuLyoqXG4gKiBBdXRoZW50aWNhdG9yIGFzc3VyYW5jZSBsZXZlbCBvZiB0aGUgc2Vzc2lvbiBhIHRva2VuIHNwZWFrcyBmb3IuXG4gKlxuICogLSBgMWAg4oCUIG9uZSBmYWN0b3I6IGEgcGFzc3dvcmQsIGEgc29jaWFsIHNpZ24taW4sIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGVcbiAqICAgb3JnIGhhcyBOT1QgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuXG4gKiAtIGAyYCDigJQgTUZBLWdyYWRlOiBhIHBhc3NrZXkgYXNzZXJ0ZWQgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzXG4gKiAgIGFuIGF1dGhlbnRpY2F0b3ItYXBwIGNvZGUsIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGUgb3JnIEhBUyBtYXJrZWQgYXNcbiAqICAgZW5mb3JjaW5nIE1GQSAocHJvdmlkZXJzIGRvbid0IHNlbmQgYGFtcmAgcmVsaWFibHksIHNvIHRoZSBvcmcncyBvd25cbiAqICAgc3RhdGVtZW50IGFib3V0IGl0cyBJZFAgaXMgdGhlIHNpZ25hbCkuXG4gKlxuICogRml4ZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBvcGVuZWQgYW5kIHN0b3JlZCBvbiBpdHMgcmVmcmVzaC1zZXNzaW9uIHNsb3QsIHNvXG4gKiByZWZyZXNoIC8gcmVuZXdhbCAvIHN3aXRjaC1vcmcgY29weSBpdCB2ZXJiYXRpbSBhbmQgY2FuIG5ldmVyIFJBSVNFIGl0IOKAlFxuICogZWFybmluZyBhYWwgMiBhbHdheXMgbWVhbnMgYXV0aGVudGljYXRpbmcgYWdhaW4gd2l0aCBhIHNlY29uZCBmYWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc3VyYW5jZUxldmVsID0gMSB8IDI7XG5cbi8qKlxuICogUXVvdGEgdHlwZSBpZGVudGlmaWVycy5cbiAqXG4gKiAtIGBwbHVnaW5zYCAvIGBwaXBlbGluZXNgIOKAlCBjb3VudCBvZiBjcmVhdGVkIGVudGl0aWVzXG4gKiAtIGBhcGlDYWxsc2Ag4oCUIGdlbmVyaWMgQVBJIGNhbGwgY291bnQgKHJlYWQtaGVhdnkgcGF0aHMpIG1hZGUgYnkgUEVPUExFIGluXG4gKiAgIElOVEVSQUNUSVZFIFNFU1NJT05TLiBQZXJzb25hbCBhY2Nlc3MgdG9rZW5zIGFyZSBOT1QgaGVyZTogdGhpcyBlbnRyeSB1c2VkXG4gKiAgIHRvIHNheSB0aGV5IHdlcmUsIGFuZCB7QGxpbmsgbWV0ZXJlZFF1b3RhVHlwZUZvcn0gc2F5cyBvdGhlcndpc2UuXG4gKiAtIGBhdXRvbWF0aW9uQ2FsbHNgIOKAlCB0aGUgc2FtZSBtZXRlcmVkIEFQSSBjYWxscyB3aGVuIHRoZSBjYWxsZXIgaXMgbm90IGFuXG4gKiAgIGludGVyYWN0aXZlIHNlc3Npb246IGFuIE9SRyBTRVJWSUNFIEFDQ09VTlRcbiAqICAgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZV9hY2NvdW50J2Ag4oCUIHBsYXRmb3JtLWF1dG9tYXRpb24sXG4gKiAgIHBpcGVsaW5lLXJlZ2lzdGVyLCByZXBvcnRpbmctaW5nZXN0IGFuZCByZWdpc3RyeS1wdXNoIGtleXMpLCBhIFBFUlNPTkFMXG4gKiAgIEFDQ0VTUyBLRVkgKGB0b2tlbl91c2U6ICdhcGlfa2V5J2ApLCBvciBhbnkgdG9rZW4gbWludGVkIHdoaWxlIGhvbGRpbmcgb25lXG4gKiAgIChgcGFyZW50S2V5SWRgKS4gQ291bnRlZCBJTlNURUFEIG9mIGBhcGlDYWxsc2AsIG5ldmVyIGFzIHdlbGwsIHNvIGFcbiAqICAgc2VsZi1tdXRhdGluZyBwaXBlbGluZSBkb2luZyBvbmUgcGx1Z2luIGxvb2t1cCBwZXIgc3RlcCBwZXIgcnVuIGNhbm5vdCBsb2NrXG4gKiAgIGl0cyBvd24gaHVtYW5zIG91dCBvZiB0aGUgY29uc29sZSAoc2VlIHtAbGluayBtZXRlcmVkUXVvdGFUeXBlRm9yfSwgd2hpY2ggaXNcbiAqICAgdGhlIGF1dGhvcml0eSBmb3IgdGhlIHNwbGl0IOKAlCBgZG9jcy9xdW90YXMubWRgIGFncmVlcyB3aXRoIGl0KS4gU2l6ZWQgZm9yXG4gKiAgIHRoYXQgdHJhZmZpYyBwZXIgdGllci5cbiAqIC0gYGFpQ2FsbHNgIOKAlCBBSSBwcm92aWRlciBpbnZvY2F0aW9ucyAoY291bnRlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgZWFjaCBjYWxsXG4gKiAgIGhhcyBleHRlcm5hbCBkb2xsYXIgY29zdDsgc2l6ZWQgc21hbGxlciB0aGFuIGFwaUNhbGxzIHBlciB0aWVyKVxuICogLSBgc3RvcmFnZUJ5dGVzYCDigJQgcmVnaXN0cnkgc3RvcmFnZSBidWRnZXQgcGVyIG9yZy4gVW5saWtlIHRoZSBvdGhlcnNcbiAqICAgKHdoaWNoIGNvdW50IGRpc2NyZXRlIGV2ZW50cyksIHRoaXMgaXMgYSBtZWFzdXJlZCB0b3RhbCByZWNvbXB1dGVkXG4gKiAgIG9uIGRlbWFuZC4gSW5jcmVtZW50ZWQgYnkgdGhlIGltYWdlLXJlZ2lzdHJ5J3MgcHVzaC1nYXRlIGJlZm9yZVxuICogICBpc3N1aW5nIGEgdG9rZW4gd2hvc2Ugc2NvcGUgaW5jbHVkZXMgYHB1c2hgOyB0aGUgR0Mgc2NoZWR1bGVyXG4gKiAgIGV2ZW50dWFsbHkgZnJlZXMgdGhlIGJ5dGVzLCB0aGVuIHRoZSBuZXh0IHB1c2gtZ2F0ZSBjaGVjayByZWFkc1xuICogICB0aGUgbG93ZXIgdmFsdWUuIE5PVCBhIGNvdW50ZXItc3R5bGUgcXVvdGEgaW4gdGhlIHNlbnNlIG9mXG4gKiAgIGBpbmNyZW1lbnRVc2FnZWAg4oCUIHRoZSByZWdpc3RyeSBwdXNoZXMgdGhlIG1lYXN1cmVkIHRvdGFsIHZpYVxuICogICBgdXBkYXRlTGltaXRzYC9gcmVzZXRVc2FnZWAgZmxvd3MuIFRpZXIgbGltaXRzIGFyZSBieXRlcy5cbiAqIC0gYGRhc2hib2FyZHNgIC8gYGFsZXJ0UnVsZXNgIC8gYGFsZXJ0RGVzdGluYXRpb25zYCAvIGBpZHBDb25maWdzYCDigJRcbiAqICAgcmVzb3VyY2UtY291bnQgcXVvdGFzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmcgRG9TIHN1cmZhY2VzIGluIHRoZVxuICogICB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzLiBXaXRob3V0IHRoZXNlIGNhcHMgYSBzaW5nbGUgb3JnIGNvdWxkXG4gKiAgIHNwYW0gdGhvdXNhbmRzIG9mIGRhc2hib2FyZHMgLyBydWxlcyBhbmQgYmxvYXQgdGhlIHNoYXJlZCBQb3N0Z3JlcyAvXG4gKiAgIE1vbmdvIHdvcmtpbmcgc2V0cy4gQ291bnRlZCBhdCBjcmVhdGUgdGltZTsgZGVjcmVtZW50ZWQgb24gZGVsZXRlLlxuICogLSBgbGlzdGluZ3NgIOKAlCBhY3RpdmUsIG5vbi1zdXNwZW5kZWQgcGx1Z2luLWVjb3N5c3RlbSBsaXN0aW5ncyBhIChyb290KSBvcmdcbiAqICAgcHVibGlzaGVzIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gQSBDT1VOVCBxdW90YSBsaWtlXG4gKiAgIGBwbHVnaW5zYDogY2hlY2tlZCBhdCBwdWJsaXNoLXJlcXVlc3Qgc3VibWl0IGFuZCByZS1jaGVja2VkIGF0IGFwcHJvdmFsO1xuICogICBpbnN0YWxscyBuZXZlciBjb3VudC5cbiAqL1xuLy8gTk9URTogYHNlYXRzYCBpcyBpbnRlbnRpb25hbGx5IE5PVCBoZXJlLiBJdCdzIGEgdGllciBsaW1pdCAoUXVvdGFUaWVyTGltaXRzKVxuLy8gZW5mb3JjZWQgYnkgY29tcGFyaW5nIHRoZSBvcmcncyBMSVZFIG1lbWJlciBjb3VudCBhdCBpbnZpdGUgdGltZSDigJQgbm90IGFuXG4vLyBpbmNyZW1lbnRpbmcgcGVyLXBlcmlvZCBjb3VudGVyIGxpa2UgdGhlIGNvbnN1bWFibGUgcXVvdGFzIGJlbG93LlxuZXhwb3J0IHR5cGUgUXVvdGFUeXBlID1cbiAgfCAncGx1Z2lucycgfCAncGlwZWxpbmVzJyB8ICdhcGlDYWxscycgfCAnYXV0b21hdGlvbkNhbGxzJyB8ICdhaUNhbGxzJyB8ICdzdG9yYWdlQnl0ZXMnXG4gIHwgJ2NwdUNyZWRpdHMnXG4gIHwgJ2Rhc2hib2FyZHMnIHwgJ2FsZXJ0UnVsZXMnIHwgJ2FsZXJ0RGVzdGluYXRpb25zJyB8ICdpZHBDb25maWdzJ1xuICB8ICdsaXN0aW5ncyc7XG5cbi8qKlxuICogVmFsaWQgcXVvdGEgdHlwZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRF9RVU9UQV9UWVBFUyA9IFtcbiAgJ3BsdWdpbnMnLCAncGlwZWxpbmVzJywgJ2FwaUNhbGxzJywgJ2F1dG9tYXRpb25DYWxscycsICdhaUNhbGxzJywgJ3N0b3JhZ2VCeXRlcycsXG4gICdjcHVDcmVkaXRzJyxcbiAgJ2Rhc2hib2FyZHMnLCAnYWxlcnRSdWxlcycsICdhbGVydERlc3RpbmF0aW9ucycsICdpZHBDb25maWdzJyxcbiAgJ2xpc3RpbmdzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogSHVtYW4gbGFiZWwgZm9yIGVhY2ggcXVvdGEgdHlwZSwgc2luZ3VsYXIg4oCUIHRoZSBvbmUgc3BlbGxpbmcgZXZlcnkgNDI5IGJvZHksXG4gKiBub3RpZmljYXRpb24gYW5kIGRhc2hib2FyZCB1c2VzIChcIkFQSSBjYWxsIHF1b3RhIHJlYWNoZWQg4oCmXCIpLlxuICpcbiAqIERFUklWRUQgZnJvbSBgdHlwZXMvcXVvdGEtY2F0YWxvZy50c2AsIHdoaWNoIGlzIHRoZSBvbmUgcGxhY2UgYSBxdW90YSB0eXBlJ3NcbiAqIGRpc3BsYXkgZmFjdHMgbGl2ZSBhbmQgdGhlIG9uZSB0aGUgYnJvd3NlciBpbXBvcnRzIGRpcmVjdGx5LiBUaGlzIHN0YXlzIGhlcmVcbiAqIGFzIHRoZSBzZXJ2ZXItc2lkZSBuYW1lIGJlY2F1c2UgZXZlcnkgc2VydmljZSBhbHJlYWR5IHJlYWRzIGl0IGZyb20gdGhlXG4gKiBiYXJyZWw7IGl0IGlzIGEgcHJvamVjdGlvbiBvZiB0aGUgY2F0YWxvZywgbm90IGEgc2Vjb25kIGNvcHkgb2YgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9UWVBFX0xBQkVMUzogUmVhZG9ubHk8UmVjb3JkPFF1b3RhVHlwZSwgc3RyaW5nPj4gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIChPYmplY3QuZW50cmllcyhRVU9UQV9DQVRBTE9HKSBhcyBBcnJheTxbUXVvdGFUeXBlLCB7IGxhYmVsOiBzdHJpbmcgfV0+KS5tYXAoKFt0eXBlLCBtZXRhXSkgPT4gW3R5cGUsIG1ldGEubGFiZWxdKSxcbikgYXMgUmVhZG9ubHk8UmVjb3JkPFF1b3RhVHlwZSwgc3RyaW5nPj47XG5cbi8qKlxuICogV2hlcmUgYSBwZXJzb24gZ29lcyB0byByYWlzZSBhIGxpbWl0LiBSZWxhdGl2ZSBvbiBwdXJwb3NlOiB0aGUgZGFzaGJvYXJkIGFuZFxuICogdGhlIEFQSSBzaGFyZSBhbiBvcmlnaW4gYmVoaW5kIG5naW54LCBhbmQgYSBDTEkgLyBMYW1iZGEgdGhhdCByZW5kZXJzIGEgNDI5XG4gKiBwcmVmaXhlcyBpdCB3aXRoIHRoZSBwbGF0Zm9ybSBVUkwgaXQgYWxyZWFkeSB0YWxrcyB0by5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX1VQR1JBREVfUEFUSCA9ICcvZGFzaGJvYXJkL2JpbGxpbmcnO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNWYWxpZFF1b3RhVHlwZShyZXEuYm9keS5xdW90YVR5cGUpKSB7XG4gKiAgIC8vIHF1b3RhVHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIFF1b3RhVHlwZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUXVvdGFUeXBlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfUVVPVEFfVFlQRVMuaW5jbHVkZXModmFsdWUgYXMgUXVvdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBxdW90YSBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFDaGVja1Jlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgKi9cbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gcXVvdGEgbGltaXQgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIGxpbWl0OiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHVzYWdlIGNvdW50ICovXG4gIHVzZWQ6IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyBxdW90YSAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gcXVvdGEgcmVzZXRzICovXG4gIHJlc2V0QXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcXVvdGEgaXMgdW5saW1pdGVkICovXG4gIHVubGltaXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgT05MWSB3aGVuIHRoaXMgcmVzdWx0IGlzIHRoZSBmYWlsLW9wZW4gc2VudGluZWwgcmV0dXJuZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSB3YXMgdW5yZWFjaGFibGUgLyByZXR1cm5lZCBub24tb2sgKG5vdCBhIHJlYWwgcXVvdGEgcmVhZGluZykuXG4gICAqIExldHMgZmFpbC1jbG9zZWQgY2FsbGVycyAoZS5nLiB0aGUgcmVnaXN0cnkgc3RvcmFnZSBwdXNoLWdhdGUpIGRpc3Rpbmd1aXNoXG4gICAqIGFuIG91dGFnZSBmcm9tIGEgZ2VudWluZSBgbGltaXQ6IC0xYCAodW5saW1pdGVkKSBvcmcuIEFic2VudCBvbiByZWFsIHJlc3VsdHMuXG4gICAqL1xuICBmYWlsT3Blbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gaXQgKGBpc0FkbWluT3JnUm9sZWAsIHdpcmUtdm9jYWJ1bGFyeS50cykuXG4gKlxuICogVXNlIGBQT1NUIC9hdXRoL3N3aXRjaC1vcmdgIHRvIGNoYW5nZSB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiwgd2hpY2hcbiAqIHJlLWlzc3VlcyB0b2tlbnMgd2l0aCB0aGUgbmV3IG9yZydzIHJvbGUgYW5kIGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBKd3RQYXlsb2FkIHtcbiAgLyoqIFVzZXIgSUQgKHN1YmplY3QpICovXG4gIHN1Yjogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgKi9cbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgLyoqIFVzZXIgZW1haWwgKi9cbiAgZW1haWw6IHN0cmluZztcbiAgLyoqIFdoaWNoIGtpbmQgb2YgcHJpbmNpcGFsIHRoaXMgdG9rZW4gc3BlYWtzIGZvciAoc2VlIHtAbGluayBQcmluY2lwYWxUeXBlfSkuICovXG4gIHByaW5jaXBhbFR5cGU6IFByaW5jaXBhbFR5cGU7XG4gIC8qKiBIb3cgdGhlIHRva2VuIGlzIHVzZWQgKHNlZSB7QGxpbmsgVG9rZW5Vc2V9KTsgUEFUcyBhcmUgYGFwaV9rZXlgLiAqL1xuICB0b2tlbl91c2U6IFRva2VuVXNlO1xuICAvKipcbiAgICogTWV0aG9kcyB0aGF0IGF1dGhlbnRpY2F0ZWQgdGhlIHNlc3Npb24gKHVzZXIgcHJpbmNpcGFscykuIEtlcHQgb24gdGhlXG4gICAqIHJlZnJlc2gtc2Vzc2lvbiBzbG90LCBzbyByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnIGNhcnJ5IGl0IHVuY2hhbmdlZC5cbiAgICogQWJzZW50IG9uIHNlcnZpY2UgdG9rZW5zLlxuICAgKi9cbiAgYW1yPzogQXV0aE1ldGhvZFtdO1xuICAvKiogQXNzdXJhbmNlIGxldmVsICh1c2VyIHByaW5jaXBhbHMpLiBOZXZlciByYWlzZWQgYnkgcmVmcmVzaCAvIHJlbmV3IC8gc3dpdGNoLW9yZy4gKi9cbiAgYWFsPzogQXNzdXJhbmNlTGV2ZWw7XG4gIC8qKiBFcG9jaCBzZWNvbmRzIG9mIHRoZSBzaWduLWluIHRoYXQgZXN0YWJsaXNoZWQgdGhlIHNlc3Npb24gKHVzZXIgcHJpbmNpcGFscykuXG4gICAqICBOZXZlciByZXNldCBieSByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnLiAqL1xuICBhdXRoX3RpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIG9yZyBSRVFVSVJFUyBNRkEgYW5kIGl0cyBncmFjZSBwZXJpb2QgaGFzIHBhc3NlZC5cbiAgICpcbiAgICogQ2FycmllZCBhcyBhIGNsYWltIHNvIG5vIHNlcnZpY2UgaGFzIHRvIGxvb2sgdGhlIHBvbGljeSB1cDogdGhlIG9yZyBwb2xpY3lcbiAgICogaXMgZW5mb3JjZWQgd2hlcmUgdGhlIHRva2VuIGlzIElTU1VFRCAoYSBzZXNzaW9uIHNjb3BlZCB0byBzdWNoIGFuIG9yZyBnZXRzXG4gICAqIGBhYWw6IDJgIG9yIGlzIHJlZnVzZWQpLCBhbmQgdGhpcyBjbGFpbSBpcyB0aGUgcmVjb3JkIG9mIHRoYXQgZGVjaXNpb24sIGZvclxuICAgKiBVSSBjb3B5IGFuZCBhdWRpdCByYXRoZXIgdGhhbiBmb3IgYSBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuXG4gICAqL1xuICBtZmFSZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIG9yZydzIFwiYWRtaW5pc3RyYXRpdmUgYWN0aW9ucyByZXF1aXJlIE1GQVwiIHBvbGljeVxuICAgKiAoYGFkbWluQWN0aW9uc1JlcXVpcmVNZmFgLCBzdHJpY3Rlc3QgYWNyb3NzIHRoZSBvcmcgYW5kIGl0cyBhbmNlc3RvcnMpLlxuICAgKiBQcmVzZW50IOKAlCBhbmQgYWx3YXlzIGAyYCDigJQgb25seSB3aGVuIHRoZSBwb2xpY3kgaXMgb24uIEl0IGlzIHJlc29sdmVkIHdoZW5cbiAgICogdGhlIHRva2VuIGlzIElTU1VFRCwgc28gc2VydmljZXMgdGhhdCBjYW4ndCByZWFkIHRoZSBvcmcgZG9jdW1lbnQgc3RpbGwga25vd1xuICAgKiB0aGUgcG9saWN5OiBgcmVxdWlyZU9yZ0FkbWluQXNzdXJhbmNlYCByZWZ1c2VzIGFuIGBhYWw6IDFgIHNlc3Npb24gb24gYW5cbiAgICogYWRtaW5pc3RyYXRpdmUgcm91dGUgd2hlbiB0aGlzIGNsYWltIGlzIHByZXNlbnQuIENoYW5naW5nIHRoZSBwb2xpY3kgYnVtcHNcbiAgICogZXZlcnkgYWZmZWN0ZWQgbWVtYmVyJ3MgYHRva2VuVmVyc2lvbmAsIHNvIHRoZSBjbGFpbSBjYW4ndCBnbyBzdGFsZS5cbiAgICovXG4gIG9yZ19hZG1pbl9hYWw/OiAyO1xuICAvKipcbiAgICogQk9PVFNUUkFQLUFETUlOIEVYQ0VQVElPTi4gU2V0IG9ubHkgb24gYSBzZXNzaW9uIG9wZW5lZCBieVxuICAgKiB0aGUgaW5zdGFsbCdzIGJvb3RzdHJhcCBhZG1pbiAoYEJPT1RTVFJBUF9TVVBFUkFETUlOX0VNQUlMU2AsIHN5c3RlbSBvcmcpXG4gICAqIHdoaWxlIHRoZXkgc3RpbGwgaGF2ZSBubyBlbnJvbGxlZCBmYWN0b3IuIFN1Y2ggYSBzZXNzaW9uIGlzIGBhYWw6IDFgIGFuZCBtYXlcbiAgICogcmVhY2ggT05MWSBlbnJvbG1lbnQsIHNpZ24tb3V0IGFuZCB0aGUgcm91dGVzIGBpbml0LXBsYXRmb3JtLnNoYCBjYWxscztcbiAgICogZXZlcnkgb3RoZXIgc2VydmljZSByZWZ1c2VzIGl0IG91dHJpZ2h0IChzZWUgYHJlcXVpcmVBdXRoYCkuIFRoZSBleGNlcHRpb25cbiAgICogY2xvc2VzIHBlcm1hbmVudGx5IGF0IHRoZSBmaXJzdCBlbnJvbG1lbnQgYW5kIG5ldmVyIHJlb3BlbnMuXG4gICAqL1xuICBtZmFFbnJvbGxtZW50UGVuZGluZz86IGJvb2xlYW47XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogT3JnUm9sZTtcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlc29sdmVkIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjdGl2ZSBvcmcvdGVhbSDigJQgdGhlIHVuaW9uIG9mXG4gICAqIHRoZSBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaXMgYXNzaWduZWQgKHNlZVxuICAgKiBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBBYnNlbnQgb24gbWFjaGluZS9zY29wZWQgdG9rZW5zLiBTdXBlcmFkbWlucyBhcmVcbiAgICogZ3JhbnRlZCBhbGwgcGVybWlzc2lvbnMgaW1wbGljaXRseSBhbmQgbWF5IG9taXQgdGhpcy4gRW5kcG9pbnRzIGVuZm9yY2UgdmlhXG4gICAqIGByZXF1aXJlUGVybWlzc2lvbiguLi4pYC5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogR2xvYmFsIHN1cGVyLWFkbWluIGZsYWcgKGNyb3NzLW9yZykuIFdoZW4gYHRydWVgLCB0aGUgdXNlciBpcyB0cmVhdGVkXG4gICAqIGFzIGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgcmVnYXJkbGVzcyBvZiB3aGljaCBvcmcgdGhleSdyZSBjdXJyZW50bHlcbiAgICogYWN0aW5nIHVuZGVyLiBUaGlzIGlzIHRoZSBTT0xFIHNpZ25hbCBmb3Igc3lzYWRtaW4gYXV0aG9yaXR5IOKAlCBtZW1iZXJzaGlwIGluXG4gICAqIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnIGdyYW50cyBub3RoaW5nLCBiZWNhdXNlIHRoYXQgd291bGQgY29uZmxhdGVcbiAgICogXCJQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXCIgd2l0aCBcImN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLlxuICAgKi9cbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbjtcbiAgLyoqIE9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXIuICovXG4gIHRpZXI/OiBRdW90YVRpZXI7XG4gIC8qKiBSZXNvbHZlZCBmZWF0dXJlIGZsYWdzIGZvciB0aGlzIHVzZXIvb3JnICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBOYXJyb3cgY2FwYWJpbGl0eSBzY29wZSBmb3IgbWFjaGluZS9hdXRvbWF0aW9uIHRva2VucyAoZS5nLlxuICAgKiBgJ3JlcG9ydGluZzppbmdlc3QnYCkuIEFic2VudCBvbiBub3JtYWwgaW50ZXJhY3RpdmUgdXNlciB0b2tlbnMuIEVuZHBvaW50c1xuICAgKiB0aGF0IGFjY2VwdCBhIHNjb3BlZCBpZGVudGl0eSBjaGVjayB0aGlzIChzZWUgYGhhc1Njb3BlYCkgaW5zdGVhZCBvZiByb2xlO1xuICAgKiBhIHNjb3BlZCB0b2tlbiBpcyBtaW50ZWQgd2l0aCBtaW5pbWFsIHJvbGUgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNjb3BlPzogVG9rZW5TY29wZTtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbidzIGBwZXJtaXNzaW9uc2Agd2VyZSBOQVJST1dFRCB0byBhIGNhdGFsb2cgc3Vic2V0IGNob3NlbiB3aGVuIHRoZVxuICAgKiBjcmVkZW50aWFsIHdhcyBjcmVhdGVkIChhIHBlcm1pc3Npb24tc2NvcGVkIHBlcnNvbmFsIGFjY2VzcyBrZXkgb3IgbWFjaGluZVxuICAgKiB0b2tlbikuIFRoZSBjbGFpbSBpcyB0aGUgcmVjb3JkIHRoYXQgYHBlcm1pc3Npb25zYCBpcyB0aGUgSU5URVJTRUNUSU9OIG9mXG4gICAqIHRoYXQgc3Vic2V0IHdpdGggdGhlIGhvbGRlcidzIGN1cnJlbnQgUm9sZXMg4oCUIG5vdCB0aGVpciBmdWxsIGF1dGhvcml0eSDigJQgc29cbiAgICogYW55dGhpbmcgdGhlIHRva2VuIG1pbnRzIGNhbiBvbmx5IGJlIG5hcnJvd2VyIHN0aWxsLCBhbmQgaXQgbmV2ZXIgY2Fycmllc1xuICAgKiBgaXNTdXBlckFkbWluYCBvciBhbiBhZG1pbiBgcm9sZWAgKGJvdGggd291bGQgYnlwYXNzIHRoZSBzdWJzZXQpLiBPbmx5IGV2ZXJcbiAgICogYHRydWVgOyBhYnNlbnQgb24gdW5yZXN0cmljdGVkIHRva2Vucy5cbiAgICovXG4gIHBlcm1pc3Npb25zUmVzdHJpY3RlZD86IGJvb2xlYW47XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIElEIChmcm9tIFVzZXJPcmdhbml6YXRpb24gbWVtYmVyc2hpcCkgKi9cbiAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIG5hbWUgKi9cbiAgb3JnYW5pemF0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHkgKG9yZy10ZWFtLWhpZXJhcmNoeSBwcm9wb3NhbCwgcGhhc2UgMSkuXG4gICAqIGBwYXJlbnRPcmdhbml6YXRpb25JZGAgaXMgdGhlIGFjdGl2ZSBvcmcncyBkaXJlY3QgcGFyZW50OyBgcm9vdE9yZ2FuaXphdGlvbklkYFxuICAgKiBpcyB0aGUgdG9wIG9mIGl0cyBhbmNlc3RyeSBjaGFpbi4gQm90aCBhcmUgKipvbWl0dGVkIGZvciBmbGF0IChyb290KSBvcmdzKiog4oCUXG4gICAqIGNvbnN1bWVycyBzaG91bGQgdHJlYXQgdGhlIGVmZmVjdGl2ZSByb290IGFzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgXG4gICAqICh1c2UgdGhlIHNoYXJlZCB7QGxpbmsgZWZmZWN0aXZlUm9vdE9yZ0lkfSBhY2Nlc3NvciByYXRoZXIgdGhhbiBjb2FsZXNjaW5nIGlubGluZSkuXG4gICAqIEN1cnJlbnRseSBldmVyeSBvcmcgaXMgZmxhdCwgc28gdGhlc2UgYXJlIGFic2VudCBvbiBhbGwgdG9rZW5zIHRvZGF5LlxuICAgKi9cbiAgcGFyZW50T3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBSb290IG9yZ2FuaXphdGlvbiBJRCBvZiB0aGUgYWN0aXZlIG9yZydzIGFuY2VzdHJ5IGNoYWluIChzZWUgYHBhcmVudE9yZ2FuaXphdGlvbklkYCkuICovXG4gIHJvb3RPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNldCBvbiB0b2tlbnMgaXNzdWVkIGJ5IHRoZSBzeXNhZG1pbiBpbXBlcnNvbmF0aW9uIGZsb3dcbiAgICogKGBQT1NUIC9hZG1pbi9pbXBlcnNvbmF0ZS86dXNlcklkYCkuIENhcnJpZXMgdGhlIG9yaWdpbmFsIHN5c2FkbWluJ3NcbiAgICogdXNlciBpZCBzbyBhdWRpdCBldmVudHMgc3RpbGwgYXR0cmlidXRlIGFjdGlvbnMgY29ycmVjdGx5LlxuICAgKi9cbiAgaW1wZXJzb25hdG9ySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVbmlxdWUgdG9rZW4gaWQuIE9uIGFuIGltcGVyc29uYXRpb24gdG9rZW4gaXQgaWRlbnRpZmllcyB0aGUgU0VTU0lPTiwgc28gaXRcbiAgICogY2FuIGJlIHJldm9rZWQgb24gaXRzIG93biBhY3Jvc3MgZXZlcnkgc2VydmljZSAoc2VlXG4gICAqIGBUb2tlblJldm9jYXRpb25TdG9yZS5nZXRTZXNzaW9uUmV2b2NhdGlvbmApLiBQZXJzb25hbCBBY2Nlc3MgVG9rZW5zXG4gICAqIChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBjYXJyeSBvbmUgdG9vLCB2YWxpZGF0ZWQgYWdhaW5zdCB0aGVpciBvd24gcmVjb3JkLlxuICAgKiBBIGBqdGlgIGFsb25lIG5ldmVyIGNsYXNzaWZpZXMgYSB0b2tlbiDigJQgYHRva2VuX3VzZWAgYW5kIGBpbXBlcnNvbmF0b3JJZGAgZG8uXG4gICAqL1xuICBqdGk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSB0b2tlbiBpcyByZWFkLW9ubHkg4oCUIGFueSBub24tR0VUIHJlcXVlc3QgaXMgcmVqZWN0ZWRcbiAgICogdXBzdHJlYW0gYnkgdGhlIHBsYXRmb3JtJ3MgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gZ2F0ZS4gTGV0c1xuICAgKiBzeXNhZG1pbnMgXCJ2aWV3IGFzIHVzZXIgWFwiIHdpdGhvdXQgcmlza2luZyBhIGRlc3RydWN0aXZlIGFjdGlvbi5cbiAgICovXG4gIGltcGVyc29uYXRpb25SZWFkT25seT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmVmcmVzaC1zZXNzaW9uIHNsb3QgKGludGVyYWN0aXZlIG9yIG1hY2hpbmUpIHRoaXMgYWNjZXNzIHRva2VuIHdhc1xuICAgKiBtaW50ZWQgd2l0aC4gUmV2b2tpbmcgdGhhdCBPTkUgc2xvdCBwdWJsaXNoZXMgYHJldm9rZTpzaWQ6PHNpZD5gIChzZWVcbiAgICogYGNyZWRlbnRpYWxSZXZvY2F0aW9uS2V5YCksIHdoaWNoIGV2ZXJ5IHNlcnZpY2UgY2hlY2tzIGluIGByZXF1aXJlQXV0aGAsIHNvXG4gICAqIGEgc2luZ2xlIHNpZ25lZC1vdXQgZGV2aWNlIC8gbWFjaGluZSBjcmVkZW50aWFsIHN0b3BzIHdvcmtpbmcgZXZlcnl3aGVyZVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGF0IG5hdHVyYWwgZXhwaXJ5LiBBYnNlbnQgb24gUEFUcyBhbmQgaW1wZXJzb25hdGlvbi5cbiAgICovXG4gIHNpZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhY2Nlc3Mga2V5IChQQVQgLyBzZXJ2aWNlLWFjY291bnQga2V5IGlkKSB0aGlzIHRva2VuIHdhcyBERVJJVkVEIGZyb20sXG4gICAqIHdoZW4gaXQgaXMgbm90IGl0c2VsZiB0aGUgZXhjaGFuZ2VkIGtleSB0b2tlbiAod2hvc2Uga2V5IGlkIGlzIGl0cyBganRpYCkg4oCUXG4gICAqIGUuZy4gYSBzd2l0Y2gtb3JnIG9yIGdlbmVyYXRlLXRva2VuIG1pbnQgbWFkZSB3aGlsZSBob2xkaW5nIGFuIGV4Y2hhbmdlZFxuICAgKiBrZXkgdG9rZW4uIFJldm9raW5nIHRoZSBrZXkgcHVibGlzaGVzIGByZXZva2U6a2V5OjxrZXlJZD5gLCB3aGljaCByZWplY3RzXG4gICAqIGV2ZXJ5IHRva2VuIHRoYXQgbmFtZXMgaXQgaGVyZSBvciBhcyBpdHMgYGp0aWAuXG4gICAqL1xuICBwYXJlbnRLZXlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNFUlZJQ0UgdG9rZW5zIG9ubHk6IHRoaXMgYXVkaXQgZGVsaXZlcnkgbWF5IHJlY29yZCBhbiBgYWZmZWN0ZWRPcmdJZGBcbiAgICogb3V0c2lkZSB0aGUgdG9rZW4ncyBvcmcgKHNlZSBgU2VydmljZVRva2VuT3B0aW9ucy5hdWRpdENyb3NzT3JnYCkuIEhvbm91cmVkXG4gICAqIGJ5IHBsYXRmb3JtJ3MgYC9hdWRpdC9ldmVudHNgIGluZ2VzdCBhbG9uZS5cbiAgICovXG4gIGF1ZGl0Q3Jvc3NPcmc/OiB0cnVlO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBBQ0NFU1MgdmVyc2lvbiBhdCB0aGUgbW9tZW50IHRoaXMgdG9rZW4gd2FzIGlzc3VlZDogdGhlIGhhcmRcbiAgICogYHRva2VuVmVyc2lvbmAgKGRlYWN0aXZhdGUgLyBwYXNzd29yZCBjaGFuZ2UgLyBsb2dvdXQtYWxsIOKAlCBjbGVhcnMgc2xvdHMpXG4gICAqIHBsdXMgYGNsYWltc1ZlcnNpb25gIChyb2xlLCB0aWVyLCBtZW1iZXJzaGlwIG9yIG93bmVyc2hpcCBjaGFuZ2VzIOKAlCByZS1taW50ZWRcbiAgICogb24gcmVmcmVzaCkuIEJvdGggb25seSBncm93LCBzbyBhIHRva2VuIHdob3NlIGVtYmVkZGVkIHZlcnNpb24gaXMgYmVoaW5kIHRoZVxuICAgKiBjdXJyZW50IG9uZSBoYXMgYmVlbiBSRVZPS0VELiBQbGF0Zm9ybSB2YWxpZGF0ZXMgdGhpcyBhZ2FpbnN0IE1vbmdvOyB0aGVcbiAgICogc3RhdGVsZXNzIHNlcnZpY2VzIHZhbGlkYXRlIGl0IGFnYWluc3QgYSBSZWRpcy1wdWJsaXNoZWQgY3VycmVudC12ZXJzaW9uXG4gICAqIHN0b3JlIChzZWUgYHNldFRva2VuUmV2b2NhdGlvblN0b3JlYCkuIEFic2VudCBvbiBtYWNoaW5lL3NlcnZpY2UgdG9rZW5zLlxuICAgKi9cbiAgdG9rZW5WZXJzaW9uPzogbnVtYmVyO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBhY2NvdW50IGJvdW5kYXJ5IChyb290IG9yZykgZm9yIGEgdG9rZW4ncyBhY3RpdmUgb3JnLlxuICpcbiAqIFRoZSBhY2NvdW50IHJvb3QgaXMgYHJvb3RPcmdhbml6YXRpb25JZCA/PyBvcmdhbml6YXRpb25JZGA6IGEgZmxhdCAocm9vdCkgb3JnXG4gKiBvbWl0cyBgcm9vdE9yZ2FuaXphdGlvbklkYCwgc28gaXQgSVMgaXRzIG93biByb290OyBhIHRlYW0gKGNoaWxkKSBvcmcgY2Fycmllc1xuICogdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEV2ZXJ5IGFjY291bnQtc2NvcGVkIHJlYWQgKHF1b3RhL3NlYXQvYmlsbGluZ1xuICogcG9vbGluZykgbXVzdCByZXNvbHZlIHRocm91Z2ggdGhpcyBjb2FsZXNjZSByYXRoZXIgdGhhbiByZWFkaW5nXG4gKiBgb3JnYW5pemF0aW9uSWRgIGRpcmVjdGx5IOKAlCB0aGUgbGF0dGVyIHNpbGVudGx5IHdvcmtzIHRvZGF5IChhbGwgb3JncyBmbGF0KVxuICogYnV0IHdvdWxkIGJpbmQgdG8gdGhlIHRlYW0gaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBvbmNlIHRlYW1zIGV4aXN0LlxuICpcbiAqIEByZXR1cm5zIHRoZSBlZmZlY3RpdmUgcm9vdCBvcmcgaWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBmaWVsZCBpcyBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVSb290T3JnSWQoXG4gIHBheWxvYWQ6IFBpY2s8Snd0UGF5bG9hZCwgJ29yZ2FuaXphdGlvbklkJyB8ICdyb290T3JnYW5pemF0aW9uSWQnPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwYXlsb2FkLnJvb3RPcmdhbml6YXRpb25JZCA/PyBwYXlsb2FkLm9yZ2FuaXphdGlvbklkO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
|
|
@@ -1,30 +1,29 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The plugin-ecosystem notification contract (docs/plugin-publishing.md),
|
|
3
|
-
* shared by the sender (the plugin service's enqueue API and digest
|
|
4
|
-
* dispatcher) and the relay (platform `POST /internal/notify-email`).
|
|
5
|
-
*
|
|
6
|
-
* Recipients travel as RULES, never as lists: platform resolves each
|
|
7
|
-
* {@link EcosystemRecipientSpec} against its user/Role directory AT SEND TIME,
|
|
8
|
-
* so a digest that flushes tomorrow reaches tomorrow's moderators, the plugin
|
|
9
|
-
* service never handles an email address or a membership list, and a publisher
|
|
10
|
-
* can never learn who installed their plugin (the relay mails each recipient
|
|
11
|
-
* individually — no shared To: line).
|
|
12
|
-
*/
|
|
13
|
-
/** A notification event number. */
|
|
14
|
-
export type EcosystemNotificationEventId = 'N1' | 'N2' | 'N3' | 'N4' | 'N5' | 'N6' | 'N7' | 'N8' | 'N9' | 'N10' | 'N11' | 'N12' | 'N13' | 'N14' | 'N15' | 'N16' | 'N17' | 'N18' | 'N19' | 'N20' | 'N21' | 'N22' | 'N23' | 'N24' | 'N25' | 'N26' | 'N27' | 'N28' | 'N29' | 'N30' | 'N31' | 'N32' | 'N33' | 'N34';
|
|
15
1
|
/** A delivery channel. In-app is the source of truth; email is the courtesy copy. */
|
|
16
2
|
export type EcosystemNotificationChannel = 'in_app' | 'email';
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Per-user EMAIL opt-out keys (in-app is never optional), each mapped to the
|
|
5
|
+
* field it is stored under in the user's per-org `notifications.ecosystem`
|
|
6
|
+
* preferences (platform `UserPreferences`).
|
|
7
|
+
*/
|
|
8
|
+
export declare const ECOSYSTEM_EMAIL_PREFERENCE_FIELDS: {
|
|
9
|
+
readonly 'ecosystem.reviews.email': 'reviewsEmail';
|
|
10
|
+
readonly 'ecosystem.upgrades.email': 'upgradesEmail';
|
|
11
|
+
readonly 'ecosystem.installs.email': 'installsEmail';
|
|
12
|
+
readonly 'ecosystem.moderationDigest.email': 'moderationDigestEmail';
|
|
13
|
+
};
|
|
14
|
+
/** A per-user EMAIL opt-out key. */
|
|
15
|
+
export type EcosystemEmailPreference = keyof typeof ECOSYSTEM_EMAIL_PREFERENCE_FIELDS;
|
|
22
16
|
/** Stored field names of the ecosystem email preferences (all default `true`). */
|
|
23
|
-
export type EcosystemEmailPreferenceField =
|
|
17
|
+
export type EcosystemEmailPreferenceField = (typeof ECOSYSTEM_EMAIL_PREFERENCE_FIELDS)[EcosystemEmailPreference];
|
|
24
18
|
/** Every stored ecosystem email-preference field. */
|
|
25
19
|
export declare const ECOSYSTEM_EMAIL_PREFERENCE_FIELD_NAMES: readonly EcosystemEmailPreferenceField[];
|
|
26
|
-
/** How often a batched email is flushed. */
|
|
27
|
-
|
|
20
|
+
/** How often a batched email is flushed, with the digest subject's label. */
|
|
21
|
+
declare const DIGEST_CADENCE_LABEL: {
|
|
22
|
+
readonly hourly: 'Hourly';
|
|
23
|
+
readonly daily: 'Daily';
|
|
24
|
+
readonly weekly: 'Weekly';
|
|
25
|
+
};
|
|
26
|
+
export type EcosystemDigestCadence = keyof typeof DIGEST_CADENCE_LABEL;
|
|
28
27
|
/** One event's delivery rules. */
|
|
29
28
|
export interface EcosystemEventSpec {
|
|
30
29
|
/** One-line description (docs, logs). */
|
|
@@ -43,14 +42,205 @@ export interface EcosystemEventSpec {
|
|
|
43
42
|
* security address (the plugin security notices N30–N33). */
|
|
44
43
|
allowsAddress?: boolean;
|
|
45
44
|
}
|
|
45
|
+
/** The notification event table, as data (keyed by event number). */
|
|
46
|
+
declare const EVENTS: {
|
|
47
|
+
N1: {
|
|
48
|
+
description: string;
|
|
49
|
+
channels: "email"[];
|
|
50
|
+
preference: null;
|
|
51
|
+
allowsAddress: true;
|
|
52
|
+
};
|
|
53
|
+
N2: {
|
|
54
|
+
description: string;
|
|
55
|
+
channels: ("email" | "in_app")[];
|
|
56
|
+
preference: "ecosystem.moderationDigest.email";
|
|
57
|
+
digest: "daily";
|
|
58
|
+
};
|
|
59
|
+
N3: {
|
|
60
|
+
description: string;
|
|
61
|
+
channels: "email"[];
|
|
62
|
+
preference: null;
|
|
63
|
+
allowsAddress: true;
|
|
64
|
+
};
|
|
65
|
+
N4: {
|
|
66
|
+
description: string;
|
|
67
|
+
channels: "email"[];
|
|
68
|
+
preference: null;
|
|
69
|
+
allowsAddress: true;
|
|
70
|
+
};
|
|
71
|
+
N5: {
|
|
72
|
+
description: string;
|
|
73
|
+
channels: ("email" | "in_app")[];
|
|
74
|
+
preference: null;
|
|
75
|
+
};
|
|
76
|
+
N6: {
|
|
77
|
+
description: string;
|
|
78
|
+
channels: ("email" | "in_app")[];
|
|
79
|
+
preference: "ecosystem.moderationDigest.email";
|
|
80
|
+
digest: "daily";
|
|
81
|
+
};
|
|
82
|
+
N7: {
|
|
83
|
+
description: string;
|
|
84
|
+
channels: ("email" | "in_app")[];
|
|
85
|
+
preference: null;
|
|
86
|
+
};
|
|
87
|
+
N8: {
|
|
88
|
+
description: string;
|
|
89
|
+
channels: ("email" | "in_app")[];
|
|
90
|
+
preference: null;
|
|
91
|
+
};
|
|
92
|
+
N9: {
|
|
93
|
+
description: string;
|
|
94
|
+
channels: ("email" | "in_app")[];
|
|
95
|
+
preference: null;
|
|
96
|
+
};
|
|
97
|
+
N10: {
|
|
98
|
+
description: string;
|
|
99
|
+
channels: ("email" | "in_app")[];
|
|
100
|
+
preference: null;
|
|
101
|
+
};
|
|
102
|
+
N11: {
|
|
103
|
+
description: string;
|
|
104
|
+
channels: ("email" | "in_app")[];
|
|
105
|
+
preference: "ecosystem.installs.email";
|
|
106
|
+
};
|
|
107
|
+
N12: {
|
|
108
|
+
description: string;
|
|
109
|
+
channels: ("email" | "in_app")[];
|
|
110
|
+
preference: "ecosystem.installs.email";
|
|
111
|
+
};
|
|
112
|
+
N13: {
|
|
113
|
+
description: string;
|
|
114
|
+
channels: ("email" | "in_app")[];
|
|
115
|
+
preference: "ecosystem.upgrades.email";
|
|
116
|
+
digest: "weekly";
|
|
117
|
+
};
|
|
118
|
+
N14: {
|
|
119
|
+
description: string;
|
|
120
|
+
channels: ("email" | "in_app")[];
|
|
121
|
+
preference: "ecosystem.upgrades.email";
|
|
122
|
+
};
|
|
123
|
+
N15: {
|
|
124
|
+
description: string;
|
|
125
|
+
channels: ("email" | "in_app")[];
|
|
126
|
+
preference: "ecosystem.reviews.email";
|
|
127
|
+
digest: "hourly";
|
|
128
|
+
};
|
|
129
|
+
N16: {
|
|
130
|
+
description: string;
|
|
131
|
+
channels: ("email" | "in_app")[];
|
|
132
|
+
preference: "ecosystem.reviews.email";
|
|
133
|
+
};
|
|
134
|
+
N17: {
|
|
135
|
+
description: string;
|
|
136
|
+
channels: ("email" | "in_app")[];
|
|
137
|
+
preference: "ecosystem.moderationDigest.email";
|
|
138
|
+
digest: "daily";
|
|
139
|
+
};
|
|
140
|
+
N18: {
|
|
141
|
+
description: string;
|
|
142
|
+
channels: ("email" | "in_app")[];
|
|
143
|
+
preference: null;
|
|
144
|
+
};
|
|
145
|
+
N19: {
|
|
146
|
+
description: string;
|
|
147
|
+
channels: ("email" | "in_app")[];
|
|
148
|
+
preference: null;
|
|
149
|
+
};
|
|
150
|
+
N20: {
|
|
151
|
+
description: string;
|
|
152
|
+
channels: ("email" | "in_app")[];
|
|
153
|
+
preference: null;
|
|
154
|
+
};
|
|
155
|
+
N21: {
|
|
156
|
+
description: string;
|
|
157
|
+
channels: ("email" | "in_app")[];
|
|
158
|
+
preference: null;
|
|
159
|
+
};
|
|
160
|
+
N22: {
|
|
161
|
+
description: string;
|
|
162
|
+
channels: "email"[];
|
|
163
|
+
preference: null;
|
|
164
|
+
};
|
|
165
|
+
N23: {
|
|
166
|
+
description: string;
|
|
167
|
+
channels: ("email" | "in_app")[];
|
|
168
|
+
preference: null;
|
|
169
|
+
};
|
|
170
|
+
N24: {
|
|
171
|
+
description: string;
|
|
172
|
+
channels: ("email" | "in_app")[];
|
|
173
|
+
preference: "ecosystem.moderationDigest.email";
|
|
174
|
+
digest: "daily";
|
|
175
|
+
};
|
|
176
|
+
N25: {
|
|
177
|
+
description: string;
|
|
178
|
+
channels: ("email" | "in_app")[];
|
|
179
|
+
preference: null;
|
|
180
|
+
};
|
|
181
|
+
N26: {
|
|
182
|
+
description: string;
|
|
183
|
+
channels: "in_app"[];
|
|
184
|
+
preference: "ecosystem.upgrades.email";
|
|
185
|
+
};
|
|
186
|
+
N27: {
|
|
187
|
+
description: string;
|
|
188
|
+
channels: ("email" | "in_app")[];
|
|
189
|
+
preference: "ecosystem.upgrades.email";
|
|
190
|
+
digest: "weekly";
|
|
191
|
+
};
|
|
192
|
+
N28: {
|
|
193
|
+
description: string;
|
|
194
|
+
channels: ("email" | "in_app")[];
|
|
195
|
+
preference: null;
|
|
196
|
+
};
|
|
197
|
+
N29: {
|
|
198
|
+
description: string;
|
|
199
|
+
channels: ("email" | "in_app")[];
|
|
200
|
+
preference: null;
|
|
201
|
+
};
|
|
202
|
+
N30: {
|
|
203
|
+
description: string;
|
|
204
|
+
channels: ("email" | "in_app")[];
|
|
205
|
+
preference: null;
|
|
206
|
+
allowsAddress: true;
|
|
207
|
+
};
|
|
208
|
+
N31: {
|
|
209
|
+
description: string;
|
|
210
|
+
channels: ("email" | "in_app")[];
|
|
211
|
+
preference: null;
|
|
212
|
+
allowsAddress: true;
|
|
213
|
+
};
|
|
214
|
+
N32: {
|
|
215
|
+
description: string;
|
|
216
|
+
channels: ("email" | "in_app")[];
|
|
217
|
+
preference: null;
|
|
218
|
+
allowsAddress: true;
|
|
219
|
+
};
|
|
220
|
+
N33: {
|
|
221
|
+
description: string;
|
|
222
|
+
channels: ("email" | "in_app")[];
|
|
223
|
+
preference: null;
|
|
224
|
+
allowsAddress: true;
|
|
225
|
+
};
|
|
226
|
+
N34: {
|
|
227
|
+
description: string;
|
|
228
|
+
channels: ("email" | "in_app")[];
|
|
229
|
+
preference: null;
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
/** A notification event number. */
|
|
233
|
+
export type EcosystemNotificationEventId = keyof typeof EVENTS;
|
|
46
234
|
/** The notification event table, as data. */
|
|
47
235
|
export declare const ECOSYSTEM_NOTIFICATION_EVENTS: Readonly<Record<EcosystemNotificationEventId, EcosystemEventSpec>>;
|
|
48
236
|
/** Whether `value` is a notification event number. */
|
|
49
237
|
export declare function isEcosystemNotificationEvent(value: unknown): value is EcosystemNotificationEventId;
|
|
50
238
|
/** Org-local permissions an {@link EcosystemRecipientSpec} `org_permission` rule may name. */
|
|
51
|
-
|
|
239
|
+
declare const ORG_RECIPIENT_PERMISSIONS: readonly ["publishers:manage", "plugin_installs:manage", "plugins:write", "pipelines:write", "toolchain:manage"];
|
|
240
|
+
export type EcosystemOrgRecipientPermission = (typeof ORG_RECIPIENT_PERMISSIONS)[number];
|
|
52
241
|
/** System-org permissions a `moderators` rule may name. */
|
|
53
|
-
|
|
242
|
+
declare const MODERATOR_PERMISSIONS: readonly ["plugins:moderate", "publishers:verify"];
|
|
243
|
+
export type EcosystemModeratorPermission = (typeof MODERATOR_PERMISSIONS)[number];
|
|
54
244
|
/**
|
|
55
245
|
* A recipient RULE, resolved by platform at send time:
|
|
56
246
|
*
|
|
@@ -162,3 +352,4 @@ export declare function renderEcosystemManagerChange(input: {
|
|
|
162
352
|
* subject and one line per item (each item's subject), oldest first.
|
|
163
353
|
*/
|
|
164
354
|
export declare function renderEcosystemDigest(event: EcosystemNotificationEventId, items: readonly EcosystemNotificationContent[]): EcosystemNotificationContent;
|
|
355
|
+
export {};
|