@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.
Files changed (41) hide show
  1. package/lib/helpers/org-hierarchy-http.d.ts +3 -2
  2. package/lib/helpers/org-hierarchy-http.js +11 -5
  3. package/lib/middleware/index.d.ts +1 -1
  4. package/lib/middleware/index.js +2 -2
  5. package/lib/middleware/step-up.d.ts +4 -3
  6. package/lib/middleware/step-up.js +1 -1
  7. package/lib/services/index.d.ts +2 -2
  8. package/lib/services/index.js +2 -2
  9. package/lib/services/quota.d.ts +1 -2
  10. package/lib/services/quota.js +1 -1
  11. package/lib/services/version-vuln-policy.d.ts +1 -3
  12. package/lib/services/version-vuln-policy.js +2 -3
  13. package/lib/types/common.d.ts +13 -22
  14. package/lib/types/common.js +44 -5
  15. package/lib/types/ecosystem-notifications.d.ts +215 -24
  16. package/lib/types/ecosystem-notifications.js +18 -9
  17. package/lib/types/ecosystem.d.ts +1 -0
  18. package/lib/types/ecosystem.js +33 -23
  19. package/lib/types/feature-flags.d.ts +11 -4
  20. package/lib/types/feature-flags.js +51 -11
  21. package/lib/types/index.d.ts +1 -1
  22. package/lib/types/index.js +2 -2
  23. package/lib/types/permissions.d.ts +353 -22
  24. package/lib/types/permissions.js +257 -128
  25. package/lib/types/plugin-catalog.d.ts +25 -1
  26. package/lib/types/plugin-catalog.js +21 -2
  27. package/lib/types/quota-tiers.d.ts +6 -24
  28. package/lib/types/quota-tiers.js +6 -28
  29. package/lib/types/remote-audit-actions.d.ts +1 -1
  30. package/lib/types/remote-audit-actions.js +10 -1
  31. package/lib/types/tier-limits.d.ts +19 -0
  32. package/lib/types/tier-limits.js +27 -1
  33. package/lib/types/usage-projection.d.ts +0 -16
  34. package/lib/types/usage-projection.js +1 -20
  35. package/lib/types/wire-vocabulary.d.ts +81 -2
  36. package/lib/types/wire-vocabulary.js +89 -3
  37. package/lib/validation/index.d.ts +1 -1
  38. package/lib/validation/index.js +2 -2
  39. package/lib/validation/plugin-spec-schema.d.ts +0 -9
  40. package/lib/validation/plugin-spec-schema.js +2 -11
  41. package/package.json +8 -1
@@ -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 type TokenScope = 'reporting:ingest' | 'registry:push' | 'scim';
24
+ export declare const TOKEN_SCOPES: readonly ['reporting:ingest', 'registry:push', 'scim'];
24
25
  /**
25
- * Runtime catalog of {@link TokenScope} (a union is erased at runtime). This is
26
- * the ONE allowlist every mint path validates against — platform's key/token
27
- * issue routes included — so a new scope is added in exactly one place.
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 declare const TOKEN_SCOPES: readonly TokenScope[];
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 type PrincipalType = 'user' | 'service_account' | 'service';
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 type TokenUse = 'access' | 'api_key';
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 type AuthMethod = 'pwd' | 'oauth' | 'sso' | 'webauthn' | 'stepup' | 'mfa';
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 as `role === 'admin' || role === 'owner'`.
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;
@@ -2,14 +2,53 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { QUOTA_CATALOG } from './quota-catalog.js';
4
4
  /**
5
- * Runtime catalog of {@link TokenScope} (a union is erased at runtime). This is
6
- * the ONE allowlist every mint path validates against — platform's key/token
7
- * issue routes included — so a new scope is added in exactly one place.
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
- /** Runtime catalogs for the claim unions above (a union is erased at runtime). */
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
- /** A per-user EMAIL opt-out key. In-app is never optional. */
18
- export type EcosystemEmailPreference = 'ecosystem.reviews.email' | 'ecosystem.upgrades.email' | 'ecosystem.installs.email' | 'ecosystem.moderationDigest.email';
19
- /** The field each preference key is stored under in the user's per-org
20
- * `notifications.ecosystem` preferences (platform `UserPreferences`). */
21
- export declare const ECOSYSTEM_EMAIL_PREFERENCE_FIELDS: Readonly<Record<EcosystemEmailPreference, EcosystemEmailPreferenceField>>;
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 = 'reviewsEmail' | 'upgradesEmail' | 'installsEmail' | 'moderationDigestEmail';
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
- export type EcosystemDigestCadence = 'hourly' | 'daily' | 'weekly';
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
- export type EcosystemOrgRecipientPermission = 'publishers:manage' | 'plugin_installs:manage' | 'plugins:write' | 'pipelines:write' | 'toolchain:manage';
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
- export type EcosystemModeratorPermission = 'plugins:moderate' | 'publishers:verify';
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 {};