@pipeline-builder/api-core 5.2.3 → 5.2.4
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/constants/ai-providers.d.ts +3 -22
- package/lib/constants/ai-providers.js +6 -56
- package/lib/errors/app-errors.d.ts +14 -0
- package/lib/errors/app-errors.js +21 -1
- package/lib/helpers/sse-helpers.d.ts +33 -3
- package/lib/helpers/sse-helpers.js +91 -19
- package/lib/middleware/auth.js +6 -3
- package/lib/middleware/deferred-quota-check.d.ts +5 -0
- package/lib/middleware/deferred-quota-check.js +33 -0
- package/lib/middleware/ecosystem-guard.d.ts +3 -3
- package/lib/middleware/ecosystem-guard.js +5 -5
- package/lib/middleware/index.d.ts +5 -2
- package/lib/middleware/index.js +6 -3
- package/lib/middleware/on-behalf.d.ts +37 -0
- package/lib/middleware/on-behalf.js +143 -0
- package/lib/middleware/permission-gates.d.ts +11 -0
- package/lib/middleware/permission-gates.js +7 -1
- package/lib/middleware/quota-exempt-routes.d.ts +36 -0
- package/lib/middleware/quota-exempt-routes.js +47 -0
- package/lib/middleware/route-table.d.ts +104 -0
- package/lib/middleware/route-table.js +72 -2
- package/lib/middleware/service-tokens.d.ts +8 -0
- package/lib/middleware/service-tokens.js +2 -1
- package/lib/middleware/step-up.js +11 -1
- package/lib/services/ai-call-weight.d.ts +24 -0
- package/lib/services/ai-call-weight.js +77 -0
- package/lib/services/audit-context.d.ts +105 -0
- package/lib/services/audit-context.js +134 -0
- package/lib/services/index.d.ts +7 -2
- package/lib/services/index.js +7 -2
- package/lib/services/org-ai-client.d.ts +61 -0
- package/lib/services/org-ai-client.js +112 -0
- package/lib/services/quota-increment-batcher.d.ts +81 -0
- package/lib/services/quota-increment-batcher.js +166 -0
- package/lib/services/quota.d.ts +158 -14
- package/lib/services/quota.js +252 -22
- package/lib/services/remote-audit-client.d.ts +44 -1
- package/lib/services/remote-audit-client.js +106 -20
- package/lib/services/version-vuln-policy.d.ts +174 -0
- package/lib/services/version-vuln-policy.js +242 -0
- package/lib/types/ai-catalog.d.ts +63 -0
- package/lib/types/ai-catalog.js +82 -0
- package/lib/types/ask-proposals.js +6 -6
- package/lib/types/build-catalog.d.ts +154 -0
- package/lib/types/build-catalog.js +158 -0
- package/lib/types/common.d.ts +37 -3
- package/lib/types/common.js +20 -2
- package/lib/types/ecosystem-notifications.d.ts +5 -5
- package/lib/types/ecosystem-notifications.js +9 -3
- package/lib/types/error-codes.d.ts +13 -6
- package/lib/types/error-codes.js +18 -8
- package/lib/types/feature-flags.d.ts +6 -4
- package/lib/types/feature-flags.js +11 -6
- package/lib/types/index.d.ts +6 -4
- package/lib/types/index.js +12 -5
- package/lib/types/metadata-keys.d.ts +6 -0
- package/lib/types/metadata-keys.js +4 -1
- package/lib/types/permissions.d.ts +344 -3
- package/lib/types/permissions.js +596 -21
- package/lib/types/pipeline.d.ts +39 -0
- package/lib/types/pipeline.js +57 -1
- package/lib/types/plugin-health.d.ts +0 -2
- package/lib/types/plugin-health.js +1 -11
- package/lib/types/plugin-scan.d.ts +192 -42
- package/lib/types/plugin-scan.js +159 -43
- package/lib/types/quota-catalog.d.ts +247 -0
- package/lib/types/quota-catalog.js +122 -0
- package/lib/types/quota-tiers.d.ts +118 -0
- package/lib/types/quota-tiers.js +153 -2
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +131 -1
- package/lib/types/wire-vocabulary.js +8 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/response.d.ts +35 -2
- package/lib/utils/response.js +42 -3
- package/lib/validation/ai-schemas.d.ts +27 -0
- package/lib/validation/ai-schemas.js +31 -5
- package/lib/validation/plugin-schemas.d.ts +15 -0
- package/lib/validation/plugin-schemas.js +28 -1
- package/package.json +31 -2
package/lib/types/permissions.js
CHANGED
|
@@ -1,24 +1,58 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* The CLOSED set of actions a permission id may end in — the second half of the
|
|
5
|
+
* `resource:action` strategy the docs describe.
|
|
6
|
+
*
|
|
7
|
+
* It is closed for one concrete reason: `isMutationPermission` (frontend
|
|
8
|
+
* `lib/auth-helpers.ts`) classifies read vs write BY SUFFIX, and that is what
|
|
9
|
+
* disables every write affordance during a read-only impersonation session. A
|
|
10
|
+
* noun-shaped action (the former `org:settings` and `consoles:datastore`) cannot be classified
|
|
11
|
+
* by name, so each one had to be hand-listed — and a permission added without
|
|
12
|
+
* remembering that list renders an enabled control that dead-ends on a 403.
|
|
13
|
+
*
|
|
14
|
+
* Reads are `:read` and `:rollup` (a read-VISIBILITY scope). Everything else is
|
|
15
|
+
* a write. The five domain verbs are kept because each names an action with no
|
|
16
|
+
* synonym in this vocabulary — `:export` is egress rather than mutation,
|
|
17
|
+
* `:install` is consumption rather than authoring, `:moderate` and `:verify` are
|
|
18
|
+
* ecosystem decisions, and `:operate` moves another tenant's money.
|
|
19
|
+
*
|
|
20
|
+
* `PERMISSION_ID_SHAPE` and this list are asserted over the whole catalog in
|
|
21
|
+
* api-core's `test/permissions.test.ts`, so adding an off-strategy id fails
|
|
22
|
+
* there rather than at a 403.
|
|
23
|
+
*/
|
|
24
|
+
export const PERMISSION_ACTIONS = [
|
|
25
|
+
'read', 'rollup',
|
|
26
|
+
'write', 'manage', 'publish', 'open',
|
|
27
|
+
'export', 'install', 'moderate', 'verify', 'operate', 'purge', 'approve',
|
|
28
|
+
];
|
|
29
|
+
/** `resource:action`, where resource is `snake_case` and action is in {@link PERMISSION_ACTIONS}. */
|
|
30
|
+
export const PERMISSION_ID_SHAPE = /^[a-z][a-z0-9_]*:[a-z]+$/;
|
|
3
31
|
/** All valid permissions (order determines display order in the picker). */
|
|
4
32
|
export const ALL_PERMISSIONS = [
|
|
5
|
-
'pipelines:read', 'pipelines:write', 'pipelines:publish',
|
|
33
|
+
'pipelines:read', 'pipelines:write', 'pipelines:publish', 'pipeline_registry:write',
|
|
6
34
|
'templates:read', 'templates:write', 'templates:publish',
|
|
7
35
|
'plugins:read', 'plugins:write', 'plugins:publish',
|
|
8
36
|
'plugins:install', 'plugin_installs:manage', 'publishers:manage',
|
|
9
37
|
'plugins:moderate', 'publishers:verify',
|
|
38
|
+
'platform:read', 'orgs:read', 'billing:operate',
|
|
39
|
+
'observability_console:open', 'database_console:open', 'objectstore_console:open',
|
|
10
40
|
'oncall:manage',
|
|
41
|
+
'support_cases:write', 'support_content:write',
|
|
42
|
+
'subscriptions:read', 'subscriptions:manage',
|
|
43
|
+
'orgs:manage', 'quotas:manage', 'plugin_queue:manage',
|
|
11
44
|
'compliance:read', 'compliance:write',
|
|
12
45
|
'members:manage', 'roles:manage', 'invitations:manage', 'service_accounts:manage',
|
|
13
46
|
'dashboards:read', 'dashboards:write',
|
|
14
47
|
'observability:read', 'observability:write',
|
|
15
|
-
'logs:export',
|
|
16
|
-
'reports:read', 'reports:rollup', 'reports:
|
|
48
|
+
'logs:export', 'audit:read',
|
|
49
|
+
'reports:read', 'reports:rollup', 'reports:write', 'reports:publish',
|
|
17
50
|
'messages:read', 'messages:write',
|
|
18
51
|
'billing:read', 'billing:manage',
|
|
19
52
|
'quotas:read',
|
|
20
|
-
'registry:read', 'registry:write',
|
|
21
|
-
'
|
|
53
|
+
'registry:read', 'registry:write', 'registry:purge',
|
|
54
|
+
'impersonation:open', 'impersonation:approve', 'team_access:open',
|
|
55
|
+
'org_settings:write', 'org_idp:write', 'org_kms:write', 'org_impersonation:write',
|
|
22
56
|
];
|
|
23
57
|
/**
|
|
24
58
|
* The CLOSED set of functions that take a {@link Permission} and decide access.
|
|
@@ -44,7 +78,7 @@ export const PERMISSION_GATES = [
|
|
|
44
78
|
'requireAllPermissions',
|
|
45
79
|
'requirePermissionOrService',
|
|
46
80
|
// The plugin-ecosystem governance chain (system org + permission + aal2).
|
|
47
|
-
'
|
|
81
|
+
'requireSystemOrgPermission',
|
|
48
82
|
// The single runtime primitive every gate above delegates to; also called
|
|
49
83
|
// directly where a controller branches on a capability rather than rejecting.
|
|
50
84
|
'userHasPermission',
|
|
@@ -53,6 +87,11 @@ export const PERMISSION_GATES = [
|
|
|
53
87
|
'requireVisibilityWriteAccess',
|
|
54
88
|
'checkVisibilityWriteAccess',
|
|
55
89
|
'resolveVisibility',
|
|
90
|
+
// quota's own wrapper. It delegates to `requirePermission`, but it takes the
|
|
91
|
+
// id as an OPTION (`authorizeOrg({ permission: 'quotas:manage' })`) because it
|
|
92
|
+
// also canonicalizes the `:orgId` param, which the route cannot drop. Without
|
|
93
|
+
// this entry the coverage scan reported `quotas:manage` as enforced nowhere.
|
|
94
|
+
'authorizeOrg',
|
|
56
95
|
];
|
|
57
96
|
/**
|
|
58
97
|
* The permission catalog with display metadata, in picker order.
|
|
@@ -67,6 +106,7 @@ export const PERMISSION_CATALOG = [
|
|
|
67
106
|
{ id: 'pipelines:read', label: 'View pipelines', description: 'View pipelines and their executions', category: 'Pipelines' },
|
|
68
107
|
{ id: 'pipelines:write', label: 'Manage pipelines', description: 'Create, edit, and delete pipelines', category: 'Pipelines' },
|
|
69
108
|
{ id: 'pipelines:publish', label: 'Publish pipelines', description: 'Make pipelines public (org-wide/catalog visibility)', category: 'Pipelines' },
|
|
109
|
+
{ id: 'pipeline_registry:write', label: 'Register deployments', description: 'Record and remove the deployed stack and step manifest behind a pipeline (the pipeline registry)', category: 'Pipelines' },
|
|
70
110
|
{ id: 'templates:read', label: 'View templates', description: 'View the golden-path template catalog', category: 'Templates' },
|
|
71
111
|
{ id: 'templates:write', label: 'Manage templates', description: 'Author, edit, and delete pipeline templates', category: 'Templates' },
|
|
72
112
|
{ id: 'templates:publish', label: 'Publish templates', description: 'Share a template beyond your org (public visibility)', category: 'Templates' },
|
|
@@ -78,7 +118,20 @@ export const PERMISSION_CATALOG = [
|
|
|
78
118
|
{ id: 'publishers:manage', label: 'Manage publisher profile', description: "Manage your org's publisher profile and submit publish, verification, transfer, and advisory requests", category: 'Plugin Ecosystem' },
|
|
79
119
|
{ id: 'plugins:moderate', label: 'Moderate the plugin ecosystem', description: 'Decide publish requests, moderate submissions and reviews, yank versions, and publish advisories (system org only)', category: 'Plugin Ecosystem' },
|
|
80
120
|
{ id: 'publishers:verify', label: 'Verify publishers', description: 'Approve Verified applications, publisher tier and profile changes, and ownership transfers (system org only)', category: 'Plugin Ecosystem' },
|
|
121
|
+
{ id: 'platform:read', label: 'View platform operations', description: 'Read the platform settings and the cross-tenant organization list (system org only)', category: 'Platform operations' },
|
|
122
|
+
{ id: 'orgs:read', label: 'View all organizations', description: 'List and open every organization on the deployment \u2014 the roster the operator surfaces work from (system org only)', category: 'Platform operations' },
|
|
123
|
+
{ id: 'billing:operate', label: 'Operate discounts and promotions', description: 'Create, apply and revoke discount tokens and promotion campaigns across tenants (system org only)', category: 'Platform operations' },
|
|
124
|
+
{ id: 'observability_console:open', label: 'Open the observability consoles', description: 'Open Grafana and Kiali — dashboards, traffic and mesh health across every tenant (system org only)', category: 'Platform operations' },
|
|
125
|
+
{ id: 'database_console:open', label: 'Open the database consoles', description: 'Open pgAdmin and mongo-express — a direct read/write shell over every tenant\u2019s rows (system org only)', category: 'Platform operations' },
|
|
126
|
+
{ id: 'objectstore_console:open', label: 'Open the object-store console', description: 'Open the RustFS (S3) console — list and delete objects in every bucket, including the audit chain (system org only)', category: 'Platform operations' },
|
|
81
127
|
{ id: 'oncall:manage', label: 'Manage on-call paging', description: 'Read the paging posture and send a test page (system org only; the rota lives with the provider)', category: 'On-call' },
|
|
128
|
+
{ id: 'support_cases:write', label: 'Work the support desk', description: 'Triage the support queue, assign and re-prioritise cases, write internal notes, and record incidents against a support contract (system org only)', category: 'Support desk' },
|
|
129
|
+
{ id: 'support_content:write', label: 'Author canned replies', description: 'Write and retire the reusable support replies offered to every customer (system org only)', category: 'Support desk' },
|
|
130
|
+
{ id: 'subscriptions:read', label: 'View all subscriptions', description: 'View every organization\u2019s subscription, plan mix and billing events (system org only)', category: 'Platform operations' },
|
|
131
|
+
{ id: 'subscriptions:manage', label: 'Change any subscription', description: 'Change a plan, set a support floor, and cancel an organization\u2019s subscription (system org only)', category: 'Platform operations' },
|
|
132
|
+
{ id: 'orgs:manage', label: 'Administer any organization', description: 'Rename, re-tier, move and delete any organization (system org only)', category: 'Platform operations' },
|
|
133
|
+
{ id: 'quotas:manage', label: 'Change any quota', description: 'Raise, reset and clear another organization\u2019s quotas (system org only; viewing them rides platform:read)', category: 'Platform operations' },
|
|
134
|
+
{ id: 'plugin_queue:manage', label: 'Run the plugin build queue', description: 'Read build-queue depth and purge the dead-letter queue (system org only)', category: 'Platform operations' },
|
|
82
135
|
{ id: 'compliance:read', label: 'View compliance', description: 'View compliance rules, policies, and scans', category: 'Compliance' },
|
|
83
136
|
{ id: 'compliance:write', label: 'Manage compliance', description: 'Create and edit rules, policies, and exemptions', category: 'Compliance' },
|
|
84
137
|
{ id: 'members:manage', label: 'Manage members', description: 'Add, remove, and change roles of org members', category: 'Members & Access' },
|
|
@@ -90,21 +143,26 @@ export const PERMISSION_CATALOG = [
|
|
|
90
143
|
{ id: 'observability:read', label: 'View alerting', description: 'View alert rules and destinations', category: 'Observability' },
|
|
91
144
|
{ id: 'observability:write', label: 'Manage alerting', description: 'Create and edit alert rules and destinations', category: 'Observability' },
|
|
92
145
|
{ id: 'logs:export', label: 'Download logs', description: "Download your organization's log entries as a file (viewing logs only needs 'View alerting')", category: 'Observability' },
|
|
146
|
+
{ id: 'audit:read', label: 'View the audit log', description: "Read the organization's own tamper-evident audit trail", category: 'Observability' },
|
|
93
147
|
{ id: 'reports:read', label: 'View reports', description: 'View analytics and reports', category: 'Insights' },
|
|
94
148
|
{ id: 'reports:rollup', label: 'Roll up team reports', description: 'Include descendant teams when viewing reports', category: 'Insights' },
|
|
95
|
-
{ id: 'reports:
|
|
96
|
-
{ id: 'reports:
|
|
149
|
+
{ id: 'reports:write', label: 'Author stakeholder reports', description: 'Create, schedule and draft scheduled reports for managers', category: 'Insights' },
|
|
150
|
+
{ id: 'reports:publish', label: 'Publish reports externally', description: 'Publish a report and mint expiring share links for people outside the platform', category: 'Insights' },
|
|
97
151
|
{ id: 'messages:read', label: 'View messages', description: 'View messages and announcements', category: 'Messaging' },
|
|
98
152
|
{ id: 'messages:write', label: 'Send messages', description: 'Send messages and announcements', category: 'Messaging' },
|
|
99
153
|
{ id: 'billing:read', label: 'View billing', description: 'View subscriptions and usage', category: 'Billing & Quotas' },
|
|
100
154
|
{ id: 'billing:manage', label: 'Manage billing', description: 'Manage subscriptions, add-ons, and the billing portal', category: 'Billing & Quotas' },
|
|
101
155
|
{ id: 'quotas:read', label: 'View quotas', description: 'View organization quotas and usage', category: 'Billing & Quotas' },
|
|
102
156
|
{ id: 'registry:read', label: 'View registry', description: 'View the container image registry', category: 'Registry' },
|
|
103
|
-
{ id: 'registry:write', label: '
|
|
104
|
-
{ id: '
|
|
105
|
-
{ id: '
|
|
106
|
-
{ id: '
|
|
107
|
-
{ id: '
|
|
157
|
+
{ id: 'registry:write', label: 'Copy container images', description: 'Copy and promote a container image into another repository', category: 'Registry' },
|
|
158
|
+
{ id: 'registry:purge', label: 'Delete container images', description: 'Delete images and repositories, and run registry garbage collection', category: 'Registry' },
|
|
159
|
+
{ id: 'impersonation:open', label: 'Open an impersonation session', description: "View a customer's account as one of its users, with that organization's consent", category: 'Impersonation' },
|
|
160
|
+
{ id: 'impersonation:approve', label: 'Answer impersonation requests', description: 'Approve or deny a request to view a member of this organization as that member', category: 'Impersonation' },
|
|
161
|
+
{ id: 'team_access:open', label: "View a team member's account", description: "View a member of one of this organization's teams as that member (read-only)", category: 'Impersonation' },
|
|
162
|
+
{ id: 'org_settings:write', label: 'Organization settings', description: 'Manage general org settings and AI config', category: 'Organization' },
|
|
163
|
+
{ id: 'org_idp:write', label: 'Manage SSO/IdP', description: 'Configure single sign-on and identity providers', category: 'Organization' },
|
|
164
|
+
{ id: 'org_kms:write', label: 'Manage encryption keys', description: 'Configure customer-managed KMS encryption keys', category: 'Organization' },
|
|
165
|
+
{ id: 'org_impersonation:write', label: 'Manage impersonation policy', description: 'Control whether platform operators may view the organization as one of its members', category: 'Organization' },
|
|
108
166
|
];
|
|
109
167
|
const PERMISSION_LABELS = new Map(PERMISSION_CATALOG.map((p) => [p.id, p.label]));
|
|
110
168
|
/** Human label for a permission id (falls back to the raw id for an unknown one). */
|
|
@@ -139,8 +197,13 @@ export function isValidPermission(value) {
|
|
|
139
197
|
* them (see platform `sanitizePermissions`).
|
|
140
198
|
*/
|
|
141
199
|
export const SUPERADMIN_ONLY_PERMISSIONS = [
|
|
142
|
-
|
|
143
|
-
|
|
200
|
+
// `registry:read` and `registry:write` were both here. What stays is the
|
|
201
|
+
// destructive rung alone: deleting a manifest or a whole repository, and the
|
|
202
|
+
// GC prune, each of which can remove an image a tenant's pipeline still
|
|
203
|
+
// resolves — including the digest-pinned plugin images the supply chain
|
|
204
|
+
// verifies against. That is the one registry action with no undo, so it keeps
|
|
205
|
+
// the narrowest possible audience: the flag, and never a Role.
|
|
206
|
+
'registry:purge',
|
|
144
207
|
];
|
|
145
208
|
/**
|
|
146
209
|
* Permissions that govern the PLUGIN ECOSYSTEM and may be held only inside the
|
|
@@ -162,11 +225,63 @@ export const SUPERADMIN_ONLY_PERMISSIONS = [
|
|
|
162
225
|
export const SYSTEM_ORG_ONLY_PERMISSIONS = [
|
|
163
226
|
'plugins:moderate',
|
|
164
227
|
'publishers:verify',
|
|
228
|
+
// The cross-tenant operator surfaces, system-org-only for the same reason the
|
|
229
|
+
// consoles are: they read and move things belonging to organisations the
|
|
230
|
+
// holder is not a member of, so they must never be grantable inside a tenant.
|
|
231
|
+
'platform:read',
|
|
232
|
+
'orgs:read',
|
|
233
|
+
// Reading the image registry: repository names, tags, manifests, blobs and the
|
|
234
|
+
// storage rollup. Promoted out of SUPERADMIN_ONLY because the registry browser
|
|
235
|
+
// was invisible to every Role, so a Platform Operator debugging a failed
|
|
236
|
+
// plugin build could see the build queue and its dead letters but not the
|
|
237
|
+
// images the build produced — and the only way to look was the superadmin
|
|
238
|
+
// flag. It stays system-org-only (no tenant Role may carry it) and is paired
|
|
239
|
+
// with a per-repo org-ownership filter that runs AFTER it, so widening the
|
|
240
|
+
// permission does not widen which repositories a holder can reach: a
|
|
241
|
+
// system-org member who is not a superadmin sees `system/*`, `library/*` and
|
|
242
|
+
// `public/*` — this deployment's own base and plugin images — and no tenant's
|
|
243
|
+
// `org-*` repositories at all (`canReadRepo` in the image-registry service).
|
|
244
|
+
'registry:read',
|
|
245
|
+
// Copying/promoting an image. System-org-only rather than superadmin-only
|
|
246
|
+
// because it is ADDITIVE: it writes a new tag and makes nothing stop
|
|
247
|
+
// resolving, and `canWriteRepo` confines a non-superadmin system-org caller
|
|
248
|
+
// to `system/*` regardless. Deliberately carried by NO built-in bundle today
|
|
249
|
+
// — promoting an image is a job, not a side effect of running the deployment,
|
|
250
|
+
// so it waits for a Role of its own rather than riding along with
|
|
251
|
+
// `platform:read`.
|
|
252
|
+
'registry:write',
|
|
253
|
+
'billing:operate',
|
|
254
|
+
'observability_console:open',
|
|
255
|
+
'database_console:open',
|
|
256
|
+
'objectstore_console:open',
|
|
257
|
+
// Opening a cross-tenant impersonation session. System-org-only for the
|
|
258
|
+
// obvious reason — it views an organisation the holder is not a member of —
|
|
259
|
+
// and it is the ONE permission in this list that also has to clear a gate the
|
|
260
|
+
// permission system does not own: the target organisation's consent (its
|
|
261
|
+
// `org_impersonation:write` policy), plus aal2 and a strong step-up. The
|
|
262
|
+
// permission says who may ASK; the tenant still answers.
|
|
263
|
+
//
|
|
264
|
+
// It does NOT cover emergency access. `POST /:userId/breakglass` bypasses
|
|
265
|
+
// tenant consent and so stays on the superadmin flag alone, approved by a
|
|
266
|
+
// SECOND superadmin (four-eyes). A permission that could be delegated must not
|
|
267
|
+
// be able to walk past consent.
|
|
268
|
+
'impersonation:open',
|
|
165
269
|
// Paging is the vendor's own operational concern and grants NO tenant access
|
|
166
270
|
// — `isSystemOrgId` is a content-owner check, not a privilege gate — so a
|
|
167
271
|
// tenant role must never be able to carry it, and a tenant must never be able
|
|
168
272
|
// to make this deployment send a page.
|
|
169
273
|
'oncall:manage',
|
|
274
|
+
// The vendor's own operational tasks. Each one replaced a `requireSystemAdmin`
|
|
275
|
+
// gate, so the point of listing them here is the same as the point of adding
|
|
276
|
+
// them at all: a Role composed in the system org can carry exactly one job,
|
|
277
|
+
// and no Role in any tenant can carry it at all.
|
|
278
|
+
'support_cases:write',
|
|
279
|
+
'support_content:write',
|
|
280
|
+
'subscriptions:read',
|
|
281
|
+
'subscriptions:manage',
|
|
282
|
+
'orgs:manage',
|
|
283
|
+
'quotas:manage',
|
|
284
|
+
'plugin_queue:manage',
|
|
170
285
|
];
|
|
171
286
|
/** Whether `permission` may be held only inside the system org. */
|
|
172
287
|
export function isSystemOrgOnlyPermission(permission) {
|
|
@@ -252,7 +367,7 @@ export function intersectPermissions(effective, subset) {
|
|
|
252
367
|
* separately, not via a permission).
|
|
253
368
|
*/
|
|
254
369
|
const MEMBER_PERMISSIONS = [
|
|
255
|
-
'pipelines:read', 'pipelines:write',
|
|
370
|
+
'pipelines:read', 'pipelines:write', 'pipeline_registry:write',
|
|
256
371
|
'templates:read', 'templates:write',
|
|
257
372
|
'plugins:read', 'plugins:write',
|
|
258
373
|
'plugins:install',
|
|
@@ -284,6 +399,339 @@ export const ROLE_PERMISSIONS = {
|
|
|
284
399
|
* tenant-facing: no `registry:*`, no `members:manage`. The Role grants the
|
|
285
400
|
* coarse `member` label and never sets `isSuperAdmin`.
|
|
286
401
|
*/
|
|
402
|
+
/**
|
|
403
|
+
* The PLATFORM OPERATOR bundle — the third rung of the system org's ladder.
|
|
404
|
+
*
|
|
405
|
+
* Before it the ladder had two rungs and a gap: Ecosystem Manager (plugin
|
|
406
|
+
* moderation) and Super Admin (implicit-all, which also carries impersonation,
|
|
407
|
+
* pgAdmin and mongo-express). Anything in between — read the platform settings,
|
|
408
|
+
* run a promotion campaign, check whether the pager is configured — had to be
|
|
409
|
+
* done by making somebody a full superadmin.
|
|
410
|
+
*
|
|
411
|
+
* It is a BUNDLE rather than a grantable list because `SYSTEM_ORG_ONLY_PERMISSIONS`
|
|
412
|
+
* can never be carried by a custom Role in any org: without a seeded bundle
|
|
413
|
+
* these permissions had no grant path at all and were superadmin-only in
|
|
414
|
+
* practice, which is exactly the thing they were added to avoid.
|
|
415
|
+
*
|
|
416
|
+
* Deliberately NOT carrying `plugins:moderate` / `publishers:verify`: ecosystem
|
|
417
|
+
* moderation is a different job with its own Role, and a reviewer of plugins
|
|
418
|
+
* should not acquire the ability to move another tenant's money by being handed
|
|
419
|
+
* the operator Role.
|
|
420
|
+
*/
|
|
421
|
+
export const PLATFORM_OPERATOR_PERMISSIONS = [
|
|
422
|
+
// BOTH halves of the old `platform:read`: this is the one job that genuinely
|
|
423
|
+
// wants the deploy's own configuration AND the customer roster.
|
|
424
|
+
'platform:read',
|
|
425
|
+
'orgs:read',
|
|
426
|
+
'oncall:manage',
|
|
427
|
+
'observability_console:open',
|
|
428
|
+
// RUNNING the deployment: raise a quota during an incident, watch the build
|
|
429
|
+
// queue and purge its dead-letter queue.
|
|
430
|
+
'quotas:manage',
|
|
431
|
+
'plugin_queue:manage',
|
|
432
|
+
// Reads that make the operator views usable: the dashboards the posture panels
|
|
433
|
+
// live on, the cross-tenant log view, and the customer's plan when a limit is
|
|
434
|
+
// the thing being debugged.
|
|
435
|
+
'observability:read',
|
|
436
|
+
'dashboards:read',
|
|
437
|
+
'subscriptions:read',
|
|
438
|
+
// The registry browser: repository names, tags and manifests for the images
|
|
439
|
+
// this deployment's builds produce. It was withheld while `registry:read` was
|
|
440
|
+
// superadmin-only — a seeded bundle carrying a superadmin-only permission
|
|
441
|
+
// would make that list a lie, since bundles bypass `sanitizePermissions`. The
|
|
442
|
+
// permission was promoted to system-org-only deliberately rather than smuggled
|
|
443
|
+
// in here, which is the order those two changes have to happen in.
|
|
444
|
+
'registry:read',
|
|
445
|
+
];
|
|
446
|
+
/**
|
|
447
|
+
* ACCOUNT MANAGER — the commercial relationship with a customer, as opposed to
|
|
448
|
+
* running the deployment.
|
|
449
|
+
*
|
|
450
|
+
* Split from {@link PLATFORM_OPERATOR_PERMISSIONS} rather than piled onto it,
|
|
451
|
+
* because the two jobs diverge at exactly the permissions added alongside this
|
|
452
|
+
* bundle. `billing:operate` MOVED here from the operator bundle for that reason:
|
|
453
|
+
* minting a discount token is a commercial act, not an operational one, and the
|
|
454
|
+
* person who restarts a stuck build queue has no reason to hold it.
|
|
455
|
+
*
|
|
456
|
+
* The destructive half of the catalogue lives here — `orgs:manage` can DELETE
|
|
457
|
+
* an organisation and `subscriptions:manage` can cancel its subscription — so
|
|
458
|
+
* this is deliberately the smaller, more rarely-assigned of the two.
|
|
459
|
+
*/
|
|
460
|
+
export const ACCOUNT_MANAGER_PERMISSIONS = [
|
|
461
|
+
'subscriptions:read',
|
|
462
|
+
'subscriptions:manage',
|
|
463
|
+
'orgs:manage',
|
|
464
|
+
'billing:operate',
|
|
465
|
+
// A quota bump is as often a commercial concession as an operational one, so
|
|
466
|
+
// both bundles carry it.
|
|
467
|
+
'quotas:manage',
|
|
468
|
+
// The all-organizations list, which is the surface this job works from — and
|
|
469
|
+
// only that. It used to take `platform:read`, which also handed over the
|
|
470
|
+
// deploy's RLS mode, KMS posture and rendered alert rules: internals a
|
|
471
|
+
// commercial role has no use for.
|
|
472
|
+
'orgs:read',
|
|
473
|
+
];
|
|
474
|
+
/**
|
|
475
|
+
* CONSOLE ADMINISTRATOR — the operator consoles, as a Role.
|
|
476
|
+
*
|
|
477
|
+
* WHY THIS EXISTS even though each console permission is grantable by hand: with
|
|
478
|
+
* no seeded Role, the only path to pgAdmin was a superadmin composing a custom
|
|
479
|
+
* Role for it, and the observed outcome of asking people to do that is that they
|
|
480
|
+
* reach for the superadmin FLAG instead — the exact failure these permissions
|
|
481
|
+
* were added to remove. A named Role also makes "who can open a data shell?" one
|
|
482
|
+
* query instead of an audit of every custom Role.
|
|
483
|
+
*
|
|
484
|
+
* It carries all three consoles, which is the whole job for the person who holds
|
|
485
|
+
* it. ONE CONSEQUENCE WORTH KNOWING: `database_console:open` and
|
|
486
|
+
* `objectstore_console:open` are the two halves of the audit tamper-evidence
|
|
487
|
+
* design — a Mongo shell can truncate a hash chain's tail, and the object store
|
|
488
|
+
* holds the signed heads that would expose the truncation — so a holder of this
|
|
489
|
+
* Role can do both. The permissions stay SEPARATE for exactly that reason: a
|
|
490
|
+
* deployment that wants them held by different people composes a narrower Role
|
|
491
|
+
* by hand (a superadmin may include any system-org-only permission in a Role
|
|
492
|
+
* authored in the system org) and assigns this one to nobody.
|
|
493
|
+
*/
|
|
494
|
+
/**
|
|
495
|
+
* PLATFORM OBSERVER — look, don't touch. The ladder's missing bottom rung.
|
|
496
|
+
*
|
|
497
|
+
* Every other system-org bundle grants a write. The one that does not —
|
|
498
|
+
* Console Administrator — grants a read that IS a database shell. So somebody
|
|
499
|
+
* who should see the deployment and change nothing (a new operator shadowing, an
|
|
500
|
+
* auditor, an on-call engineer during a handover) had two options: Super Admin,
|
|
501
|
+
* or nothing. The usual outcome of a choice like that is the flag.
|
|
502
|
+
*
|
|
503
|
+
* Strictly read-only by construction: every permission here ends `:read`, which
|
|
504
|
+
* `isMutationPermission` classifies as a read, so the dashboard disables every
|
|
505
|
+
* write affordance for a holder rather than offering controls that 403.
|
|
506
|
+
*
|
|
507
|
+
* NOT `audit:read`. It would be the obvious addition and it is the wrong one:
|
|
508
|
+
* `listAuditEvents` pins every non-superadmin to their OWN org, so a system-org
|
|
509
|
+
* observer holding it would see the system org's audit trail and nothing else —
|
|
510
|
+
* an affordance that looks like fleet-wide audit access and is not. Reading
|
|
511
|
+
* another tenant's trail is deliberately the flag's alone.
|
|
512
|
+
*/
|
|
513
|
+
export const PLATFORM_OBSERVER_PERMISSIONS = [
|
|
514
|
+
'platform:read',
|
|
515
|
+
'orgs:read',
|
|
516
|
+
'subscriptions:read',
|
|
517
|
+
'observability:read',
|
|
518
|
+
'dashboards:read',
|
|
519
|
+
// A read, and this Role is reads — the registry browser with neither of the
|
|
520
|
+
// two write rungs (`registry:write` copies, `registry:purge` deletes).
|
|
521
|
+
'registry:read',
|
|
522
|
+
];
|
|
523
|
+
export const CONSOLE_ADMIN_PERMISSIONS = [
|
|
524
|
+
'observability_console:open',
|
|
525
|
+
'database_console:open',
|
|
526
|
+
'objectstore_console:open',
|
|
527
|
+
// The all-organizations list, so a holder can find the org they were asked
|
|
528
|
+
// about without a second Role — and nothing more. This was `platform:read`,
|
|
529
|
+
// which meant opening a database console also granted the deploy's own
|
|
530
|
+
// configuration, for no reason beyond the two sharing a gate.
|
|
531
|
+
'orgs:read',
|
|
532
|
+
];
|
|
533
|
+
/**
|
|
534
|
+
* REGISTRY OPERATOR — moves container images around, and nothing else.
|
|
535
|
+
*
|
|
536
|
+
* THE GAP IT FILLS. Promoting an image — copying a built tag from one repository
|
|
537
|
+
* to the one a release resolves — is a job somebody does, and until now the only
|
|
538
|
+
* identity that could do it was a superadmin. `registry:write` has no other
|
|
539
|
+
* carrier, and a system-org-only permission with no seeded carrier is
|
|
540
|
+
* superadmin-only in practice (the `platform:read` failure, pinned by the
|
|
541
|
+
* "at least one seeded carrier" assertion in api-core's `test/permissions.test.ts`).
|
|
542
|
+
* So splitting `registry:purge` out of `registry:write` is only half the change:
|
|
543
|
+
* the additive half needs a Role or the split buys nothing.
|
|
544
|
+
*
|
|
545
|
+
* WHY IT IS NOT PART OF PLATFORM OPERATOR. That Role runs the deployment and
|
|
546
|
+
* already reads the registry. Promoting an image is a release decision, not an
|
|
547
|
+
* operational side effect, and rolling it into the Role everyone on call holds
|
|
548
|
+
* would mean the pager rotation can retag a release at 3am. The two Roles
|
|
549
|
+
* compose instead — a member may hold any number, and permissions are the union.
|
|
550
|
+
*
|
|
551
|
+
* WHY IT IS ONLY TWO PERMISSIONS. Deliberately nothing else: no `platform:read`,
|
|
552
|
+
* no console, no `orgs:read`. `canReadRepo`/`canWriteRepo` confine a
|
|
553
|
+
* non-superadmin system-org holder to `system/*`, `library/*` and `public/*` —
|
|
554
|
+
* this deployment's own base and plugin images — so the Role cannot reach a
|
|
555
|
+
* tenant's repositories at all, and a holder who also needs the operator views
|
|
556
|
+
* gets the operator Role too. It does NOT carry `registry:purge`, which is in
|
|
557
|
+
* {@link SUPERADMIN_ONLY_PERMISSIONS} and in no bundle by design: an image
|
|
558
|
+
* promoter has no business deleting the image a tenant's pipeline resolves.
|
|
559
|
+
*/
|
|
560
|
+
export const REGISTRY_OPERATOR_PERMISSIONS = [
|
|
561
|
+
'registry:read',
|
|
562
|
+
'registry:write',
|
|
563
|
+
];
|
|
564
|
+
/**
|
|
565
|
+
* SUPPORT AGENT — the support desk, and nothing else.
|
|
566
|
+
*
|
|
567
|
+
* Deliberately carries no `platform:read`, no console and no billing write: an
|
|
568
|
+
* agent answers cases and writes the canned replies. `subscriptions:read` is
|
|
569
|
+
* here because the first question on any case is what the customer is entitled
|
|
570
|
+
* to, and without it an agent would have to ask someone else to look.
|
|
571
|
+
*/
|
|
572
|
+
export const SUPPORT_AGENT_PERMISSIONS = [
|
|
573
|
+
'support_cases:write',
|
|
574
|
+
'support_content:write',
|
|
575
|
+
'subscriptions:read',
|
|
576
|
+
// NEW, and the gap the split exposed: an agent triaging a case needs to find
|
|
577
|
+
// the customer's organization. The only permission that listed orgs was
|
|
578
|
+
// `platform:read`, which would also have handed a support agent the deploy's
|
|
579
|
+
// internals — so they had neither, and had to ask someone else to look.
|
|
580
|
+
'orgs:read',
|
|
581
|
+
// Reading and answering the case itself rides the ordinary messaging
|
|
582
|
+
// permissions — a support case IS a message thread.
|
|
583
|
+
'messages:read',
|
|
584
|
+
'messages:write',
|
|
585
|
+
];
|
|
586
|
+
/**
|
|
587
|
+
* SUPPORT LEAD — the support desk, plus the authority to look.
|
|
588
|
+
*
|
|
589
|
+
* THE GAP IT FILLS. `impersonation:open` is system-org-only, and a system-org-only
|
|
590
|
+
* permission with no seeded carrier is superadmin-only in practice — the
|
|
591
|
+
* invariant api-core's `test/permissions.test.ts` asserts, and the reason
|
|
592
|
+
* `platform:read` shipped unusable. Without this Role, splitting impersonation
|
|
593
|
+
* out of the flag would change nothing: the only way to let somebody view a
|
|
594
|
+
* customer's account would still be to make them a full Super Admin, handing
|
|
595
|
+
* over `/admin/users/:id/grants`, the single-person MFA reset, the database
|
|
596
|
+
* console and `registry:purge` at the same time.
|
|
597
|
+
*
|
|
598
|
+
* WHY IT IS THE SUPPORT DESK AND NOT THE OPERATOR. The question impersonation
|
|
599
|
+
* answers is "what is this customer actually seeing?", which is a support
|
|
600
|
+
* question. Platform Operator runs the deployment and is held by whoever is on
|
|
601
|
+
* call; adding this to it would hand every rota member the ability to become any
|
|
602
|
+
* customer's user at 3am. Support Agent's bundle plus the one permission is the
|
|
603
|
+
* narrower, more honest shape — and a lead who also runs the deployment holds
|
|
604
|
+
* both Roles.
|
|
605
|
+
*
|
|
606
|
+
* WHAT IT STILL CANNOT DO. Emergency access: `breakglass` bypasses tenant
|
|
607
|
+
* consent and stays on the flag, approved by a second Super Admin. And the
|
|
608
|
+
* tenant can refuse — `impersonation:open` is permission to ASK.
|
|
609
|
+
*/
|
|
610
|
+
export const SUPPORT_LEAD_PERMISSIONS = [
|
|
611
|
+
...SUPPORT_AGENT_PERMISSIONS,
|
|
612
|
+
'impersonation:open',
|
|
613
|
+
];
|
|
614
|
+
export const ROLE_TEMPLATES = [
|
|
615
|
+
{
|
|
616
|
+
// Was a SEEDED Role in every org until it became a template. It is the only
|
|
617
|
+
// built-in that was a job description rather than a structural requirement:
|
|
618
|
+
// Super Admin is where `isSuperAdmin` is derived from, Admin and Member are
|
|
619
|
+
// the floor an org is unusable without, and the system-org Roles carry
|
|
620
|
+
// permissions no custom Role may hold. Team Lead was none of those — it is
|
|
621
|
+
// `member` plus two report permissions, and an org that does not delegate
|
|
622
|
+
// report authoring had an undeletable row for it anyway.
|
|
623
|
+
//
|
|
624
|
+
// CONSEQUENCE, stated rather than discovered: a new org no longer has a Role
|
|
625
|
+
// that grants `reports:write` to a non-admin. An admin holds both permissions
|
|
626
|
+
// (they are in the admin bundle) and instantiates this template to delegate
|
|
627
|
+
// them — the same shape as the four below. Orgs that already have the seeded
|
|
628
|
+
// Role keep it, and the backfill keeps its bundle current.
|
|
629
|
+
id: 'team-lead',
|
|
630
|
+
name: 'Team Lead',
|
|
631
|
+
description: 'Authors and shares stakeholder reports for a team, without org-admin access.',
|
|
632
|
+
permissions: [...MEMBER_PERMISSIONS, 'reports:write', 'reports:publish'],
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
/**
|
|
636
|
+
* MEMBER ALREADY IS THE DEVELOPER ROLE — this template exists for what it
|
|
637
|
+
* does NOT cover.
|
|
638
|
+
*
|
|
639
|
+
* Everything in a developer's loop is `pipelines:read` + `pipelines:write`,
|
|
640
|
+
* both in the member bundle: create, edit, validate, run, stop, the bulk
|
|
641
|
+
* ops, AI generation (`/pipelines/generate`, incl. from-url and streaming),
|
|
642
|
+
* the pipeline registry, plus `templates:read` to instantiate and
|
|
643
|
+
* `plugins:install` to add a plugin. A template restating that would buy
|
|
644
|
+
* nothing.
|
|
645
|
+
*
|
|
646
|
+
* What a developer hits the cliff on is the SELF-SERVICE operate pair: they
|
|
647
|
+
* can read their service's dashboards and metrics and cannot change either,
|
|
648
|
+
* because both writes sit in the admin bundle. So the person who owns a
|
|
649
|
+
* pipeline files a ticket to get an alert on it.
|
|
650
|
+
*
|
|
651
|
+
* DELIBERATELY NOT HERE. `logs:export` — viewing logs rides
|
|
652
|
+
* `observability:read`, but downloading them is bulk egress an org may
|
|
653
|
+
* withhold from members (docs/permissions.md), and a template aimed at every
|
|
654
|
+
* engineer would reverse that. `pipelines:publish` — sharing beyond the
|
|
655
|
+
* author is a release decision, which is Release Manager's below; somebody
|
|
656
|
+
* who does both holds both Roles.
|
|
657
|
+
*/
|
|
658
|
+
id: 'developer',
|
|
659
|
+
name: 'Developer',
|
|
660
|
+
description: 'Builds and runs pipelines, and owns the dashboards and alerts for what they build.',
|
|
661
|
+
permissions: [...MEMBER_PERMISSIONS, 'dashboards:write', 'observability:write'],
|
|
662
|
+
},
|
|
663
|
+
{
|
|
664
|
+
id: 'release-manager',
|
|
665
|
+
name: 'Release Manager',
|
|
666
|
+
description: 'Decides what becomes shared beyond its author, and approves plugin installs.',
|
|
667
|
+
permissions: [
|
|
668
|
+
'pipelines:read', 'pipelines:publish',
|
|
669
|
+
'templates:read', 'templates:publish',
|
|
670
|
+
'plugins:read', 'plugins:publish',
|
|
671
|
+
'plugin_installs:manage',
|
|
672
|
+
],
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
id: 'security-officer',
|
|
676
|
+
name: 'Security Officer',
|
|
677
|
+
description: 'Identity, encryption keys and the evidence trail — the surface an auditor asks about.',
|
|
678
|
+
permissions: [
|
|
679
|
+
'audit:read', 'logs:export',
|
|
680
|
+
'compliance:read', 'compliance:write',
|
|
681
|
+
'org_idp:write', 'org_kms:write', 'org_impersonation:write',
|
|
682
|
+
// Owning the impersonation POLICY (`org_impersonation:write`) without
|
|
683
|
+
// being able to answer a REQUEST was the asymmetry the consent flow left
|
|
684
|
+
// behind: the lesser act had a permission of its own and the greater one
|
|
685
|
+
// had none. Whoever decides whether consent is required should be able to
|
|
686
|
+
// give or withhold it.
|
|
687
|
+
'impersonation:approve',
|
|
688
|
+
],
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
id: 'people-manager',
|
|
692
|
+
name: 'People Manager',
|
|
693
|
+
description: 'The roster and its machine credentials, across the account\u2019s teams — without the org\u2019s settings or its money.',
|
|
694
|
+
permissions: [
|
|
695
|
+
'members:manage', 'invitations:manage', 'service_accounts:manage',
|
|
696
|
+
// The same job, one level down: entering a descendant team to work on its
|
|
697
|
+
// roster, and viewing one of its members as that member. Without it a
|
|
698
|
+
// people manager in a parent org can administer the account's teams on
|
|
699
|
+
// paper and not reach them.
|
|
700
|
+
'team_access:open',
|
|
701
|
+
],
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
id: 'billing-manager',
|
|
705
|
+
name: 'Billing Manager',
|
|
706
|
+
description: 'The subscription, seats and invoices for this organization.',
|
|
707
|
+
permissions: [
|
|
708
|
+
'billing:read', 'billing:manage', 'quotas:read',
|
|
709
|
+
],
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
/**
|
|
713
|
+
* The job the impersonation consent flow created INSIDE the tenant: the
|
|
714
|
+
* named person who answers "may a support engineer view this account?" and
|
|
715
|
+
* can afterwards read what happened.
|
|
716
|
+
*
|
|
717
|
+
* It exists as a template because `impersonation:approve` is in the admin
|
|
718
|
+
* and owner bundles — so by default every admin may consent — and the whole
|
|
719
|
+
* point of splitting it out was to let an org say "this decision is one
|
|
720
|
+
* person's". Doing that means authoring a Role that holds it and taking it
|
|
721
|
+
* off the others, and hand-composing was the only route.
|
|
722
|
+
*
|
|
723
|
+
* Two permissions and no more: approving is not administering. `audit:read`
|
|
724
|
+
* is here because consenting without being able to check what the session
|
|
725
|
+
* then did is consent in name only.
|
|
726
|
+
*/
|
|
727
|
+
id: 'access-approver',
|
|
728
|
+
name: 'Access Approver',
|
|
729
|
+
description: 'Answers requests to view this organization\u2019s accounts, and reads the trail of what happened.',
|
|
730
|
+
permissions: [
|
|
731
|
+
'impersonation:approve', 'audit:read',
|
|
732
|
+
],
|
|
733
|
+
},
|
|
734
|
+
];
|
|
287
735
|
export const ECOSYSTEM_MANAGER_PERMISSIONS = [
|
|
288
736
|
'plugins:read',
|
|
289
737
|
'plugins:moderate',
|
|
@@ -295,9 +743,9 @@ export const ECOSYSTEM_MANAGER_PERMISSIONS = [
|
|
|
295
743
|
* Seed bundle for the built-in "Team Lead" Role — the person who reports UPWARD.
|
|
296
744
|
*
|
|
297
745
|
* Exists because the target user for stakeholder reports is a lead, not an admin,
|
|
298
|
-
* and granting `reports:
|
|
746
|
+
* and granting `reports:write` only through the admin bundle would have forced
|
|
299
747
|
* every reporting lead to be an org admin (members:manage, roles:manage,
|
|
300
|
-
*
|
|
748
|
+
* org_settings:write, billing) to send their manager a weekly summary.
|
|
301
749
|
*
|
|
302
750
|
* Deliberately NOT included: `reports:rollup`. Rolling a report up over descendant
|
|
303
751
|
* teams is downward visibility across the org tree, which is a granted capability
|
|
@@ -307,8 +755,43 @@ export const ECOSYSTEM_MANAGER_PERMISSIONS = [
|
|
|
307
755
|
*/
|
|
308
756
|
export const TEAM_LEAD_PERMISSIONS = [
|
|
309
757
|
...MEMBER_PERMISSIONS,
|
|
310
|
-
'reports:
|
|
311
|
-
'reports:
|
|
758
|
+
'reports:write',
|
|
759
|
+
'reports:publish',
|
|
760
|
+
];
|
|
761
|
+
/**
|
|
762
|
+
* Seed bundle for the built-in "Pipeline Automation" Role — what the org's
|
|
763
|
+
* unscoped stored credential (the `platform-automation` service account that
|
|
764
|
+
* `pipeline-manager infra store-token` provisions) needs, and nothing more.
|
|
765
|
+
*
|
|
766
|
+
* Derived by tracing every call made with that key, not by guessing:
|
|
767
|
+
* - `pipelines:read` — the CodeBuild synth (and `pipeline deploy --store-tokens`)
|
|
768
|
+
* fetching the pipeline it builds (`GET /pipelines/:id`);
|
|
769
|
+
* - `plugins:read` — plugin resolution at synth/deploy and in the plugin-lookup
|
|
770
|
+
* Lambda (`POST /plugins/lookup`), and the run-time vulnerability check step
|
|
771
|
+
* (`POST /plugins/runtime-check`).
|
|
772
|
+
*
|
|
773
|
+
* What it deliberately does NOT carry, and where that work went:
|
|
774
|
+
* - registry writes (`pipeline_registry:write`) — the synth registers its step
|
|
775
|
+
* manifest with the separate `pipeline-register` key (Pipeline Registration);
|
|
776
|
+
* - image pushes and pulls — CodeBuild authenticates to the image registry with
|
|
777
|
+
* the `registry-push` scoped key, never this one;
|
|
778
|
+
* - reporting writes — the events Lambda and step report uploads use the
|
|
779
|
+
* `reporting:ingest` scoped key.
|
|
780
|
+
*
|
|
781
|
+
* It used to be the org ADMIN Role, so a leaked synth credential could rewrite
|
|
782
|
+
* every pipeline, Role and member of the org.
|
|
783
|
+
*/
|
|
784
|
+
export const PIPELINE_AUTOMATION_PERMISSIONS = [
|
|
785
|
+
'pipelines:read',
|
|
786
|
+
'plugins:read',
|
|
787
|
+
];
|
|
788
|
+
/**
|
|
789
|
+
* Seed bundle for the built-in "Pipeline Registration" Role, held by the
|
|
790
|
+
* `pipeline-register` service account: `POST`/`DELETE /pipelines/registry` for
|
|
791
|
+
* its own org and nothing else — not even a read.
|
|
792
|
+
*/
|
|
793
|
+
export const PIPELINE_REGISTRATION_PERMISSIONS = [
|
|
794
|
+
'pipeline_registry:write',
|
|
312
795
|
];
|
|
313
796
|
// =============================================================================
|
|
314
797
|
// Resolution
|
|
@@ -365,4 +848,96 @@ export function hasPermission(granted, permission, isSuperAdmin) {
|
|
|
365
848
|
return true;
|
|
366
849
|
return !!granted && granted.includes(permission);
|
|
367
850
|
}
|
|
368
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXNIdEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3hELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUI7SUFDaEUsa0JBQWtCLEVBQUUsbUJBQW1CO0lBQ3ZDLGVBQWU7SUFDZixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUscUJBQXFCO0lBQzNDLGFBQWE7SUFDYixjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZTtJQUNuRSxlQUFlLEVBQUUsZ0JBQWdCO0lBQ2pDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYTtJQUNiLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CO0NBQzFELENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBc0I7SUFDakQsNEVBQTRFO0lBQzVFLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsNEJBQTRCO0lBQzVCLDBFQUEwRTtJQUMxRSw0QkFBNEI7SUFDNUIsMEVBQTBFO0lBQzFFLDhFQUE4RTtJQUM5RSxtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGtFQUFrRTtJQUNsRSw4QkFBOEI7SUFDOUIs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LE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gIHwgJ3RlbXBsYXRlczpyZWFkJ1xuICB8ICd0ZW1wbGF0ZXM6d3JpdGUnXG4gIHwgJ3RlbXBsYXRlczpwdWJsaXNoJ1xuICAvLyBQbHVnaW5zXG4gIHwgJ3BsdWdpbnM6cmVhZCdcbiAgfCAncGx1Z2luczp3cml0ZSdcbiAgfCAncGx1Z2luczpwdWJsaXNoJ1xuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gIHwgJ3BsdWdpbnM6aW5zdGFsbCdcbiAgfCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZSdcbiAgfCAncHVibGlzaGVyczptYW5hZ2UnXG4gIHwgJ3BsdWdpbnM6bW9kZXJhdGUnXG4gIHwgJ3B1Ymxpc2hlcnM6dmVyaWZ5J1xuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgfCAnb25jYWxsOm1hbmFnZSdcbiAgLy8gQ29tcGxpYW5jZVxuICB8ICdjb21wbGlhbmNlOnJlYWQnXG4gIHwgJ2NvbXBsaWFuY2U6d3JpdGUnXG4gIC8vIE1lbWJlcnMgJiBhY2Nlc3NcbiAgfCAnbWVtYmVyczptYW5hZ2UnXG4gIHwgJ3JvbGVzOm1hbmFnZSdcbiAgfCAnaW52aXRhdGlvbnM6bWFuYWdlJ1xuICAvLyBPcmctc2NvcGVkIHNlcnZpY2UgYWNjb3VudHMgKG5vbi1odW1hbiBwcmluY2lwYWxzKSBhbmQgdGhlaXIgYWNjZXNzIGtleXMuXG4gIC8vIFNwbGl0IG91dCBvZiBgbWVtYmVyczptYW5hZ2VgIGJlY2F1c2UgYSBzZXJ2aWNlIGFjY291bnQgaXMgYSBDUkVERU5USUFMXG4gIC8vIGhvbGRlciwgbm90IGEgcGVyc29uOiBncmFudGluZyBzb21lb25lIHRoZSBhYmlsaXR5IHRvIG1pbnQgbG9uZy1saXZlZFxuICAvLyBtYWNoaW5lIGtleXMgaXMgYSBkaWZmZXJlbnQgZGVjaXNpb24gZnJvbSBsZXR0aW5nIHRoZW0gbWFuYWdlIHRoZSByb3N0ZXIuXG4gIHwgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJ1xuICAvLyBPYnNlcnZhYmlsaXR5XG4gIHwgJ2Rhc2hib2FyZHM6cmVhZCdcbiAgfCAnZGFzaGJvYXJkczp3cml0ZSdcbiAgfCAnb2JzZXJ2YWJpbGl0eTpyZWFkJ1xuICB8ICdvYnNlcnZhYmlsaXR5OndyaXRlJ1xuICAvLyBgbG9nczpleHBvcnRgIGlzIHNwbGl0IE9VVCBvZiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCBkZWxpYmVyYXRlbHkuIFJlYWRpbmdcbiAgLy8gbG9ncyBpbiB0aGUgVUkgaXMgcGFnZWQgYW5kIGVwaGVtZXJhbDsgRVhQT1JUSU5HIHRoZW0gaXMgYnVsayBlZ3Jlc3MgdGhhdFxuICAvLyBsZWF2ZXMgdGhlIGJ1aWxkaW5nIGFuZCBvdXRsaXZlcyBhIHJldm9rZWQgc2Vzc2lvbiwgc28gYW4gb3JnIGFkbWluIG11c3QgYmVcbiAgLy8gYWJsZSB0byBncmFudCBsb2cgdmlld2luZyB3aXRob3V0IGdyYW50aW5nIGRvd25sb2Fkcy5cbiAgfCAnbG9nczpleHBvcnQnXG4gIC8vIEluc2lnaHRzXG4gIHwgJ3JlcG9ydHM6cmVhZCdcbiAgfCAncmVwb3J0czpyb2xsdXAnXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHMuIGByZXBvcnRzOnJlYWRgIHN0YXlzIHRoZSBGUkVFIG9uLWRlbWFuZCBkYXNoYm9hcmQgcmVhZDtcbiAgLy8gdGhlc2UgdHdvIGFyZSB0aGUgYWRkLW9uJ3Mgd3JpdGUgc3VyZmFjZSDigJQgYGF1dGhvcmAgc2F2ZXMvc2NoZWR1bGVzL2RyYWZ0cyBhXG4gIC8vIHJlcG9ydCwgYHNoYXJlYCBwdWJsaXNoZXMgaXQgYmV5b25kIHRoZSBwbGF0Zm9ybSAoUERGLCBlbWFpbCwgc2hhcmUgbGlua3MpLlxuICAvLyBTcGxpdCBiZWNhdXNlIHB1Ymxpc2hpbmcgZXh0ZXJuYWxseSBpcyBhIGRpZmZlcmVudCByaXNrIGZyb20gY29tcG9zaW5nOlxuICAvLyBhIGxlYWQgY2FuIGJlIGFsbG93ZWQgdG8gYnVpbGQgcmVwb3J0cyB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZW1haWwgdGhlbSBvdXQuXG4gIHwgJ3JlcG9ydHM6YXV0aG9yJ1xuICB8ICdyZXBvcnRzOnNoYXJlJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIFJlZ2lzdHJ5XG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuXG4gIC8vICAtIGBvcmc6c2V0dGluZ3NgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZzppZHBgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZzprbXNgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6XG4gIC8vICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmc6aW1wZXJzb25hdGlvbmAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9scyB3aG9cbiAgLy8gICAgICAgICAgICAgICAgICAgICBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBvbmUgb2YgaXRzIG1lbWJlcnMpLlxuICAvLyBgb3JnOmlkcGAvYG9yZzprbXNgL2Bvcmc6aW1wZXJzb25hdGlvbmAgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZzpzZXR0aW5nc2Agc28gYVxuICAvLyBjdXN0b20gcm9sZSBjYW4gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGFcbiAgLy8gXCJzZXR0aW5ncyBtYW5hZ2VyXCIgcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvXG4gIC8vIHN3aXRjaCB0aGUgb3JnIHRvIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZVxuICAvLyBhZG1pbi9vd25lciBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwXG4gIC8vIGZ1bGwgYWNjZXNzLlxuICB8ICdvcmc6c2V0dGluZ3MnXG4gIHwgJ29yZzppZHAnXG4gIHwgJ29yZzprbXMnXG4gIHwgJ29yZzppbXBlcnNvbmF0aW9uJztcblxuLyoqIEFsbCB2YWxpZCBwZXJtaXNzaW9ucyAob3JkZXIgZGV0ZXJtaW5lcyBkaXNwbGF5IG9yZGVyIGluIHRoZSBwaWNrZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lczpwdWJsaXNoJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsICd0ZW1wbGF0ZXM6cHVibGlzaCcsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAncGx1Z2luczppbnN0YWxsJywgJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnLCAncHVibGlzaGVyczptYW5hZ2UnLFxuICAncGx1Z2luczptb2RlcmF0ZScsICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLFxuICAncmVwb3J0czpyZWFkJywgJ3JlcG9ydHM6cm9sbHVwJywgJ3JlcG9ydHM6YXV0aG9yJywgJ3JlcG9ydHM6c2hhcmUnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsXG4gICdvcmc6c2V0dGluZ3MnLCAnb3JnOmlkcCcsICdvcmc6a21zJywgJ29yZzppbXBlcnNvbmF0aW9uJyxcbl07XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHtAbGluayBQZXJtaXNzaW9ufSBhbmQgZGVjaWRlIGFjY2Vzcy5cbiAqXG4gKiBcIklzIHBlcm1pc3Npb24gWCBlbmZvcmNlZCBhbnl3aGVyZT9cIiBoYXMgdG8gYmUgYW5zd2VyYWJsZSBzdGF0aWNhbGx5LCB3aGljaFxuICogYSBncmVwIGNhbid0IGRvOiBmb3VyIGRpZmZlcmVudCBjYWxsIHNoYXBlcyBjb25zdW1lIGEgcGVybWlzc2lvbiBpZFxuICogKGByZXF1aXJlUGVybWlzc2lvbigneCcpYCBhdCBhIHJvdXRlLCBgdXNlckhhc1Blcm1pc3Npb24ocmVxLCAneCcpYCBpbnNpZGUgYVxuICogY29udHJvbGxlciwgYW5kIGByZXNvbHZlVmlzaWJpbGl0eShyZXEsIHYsICd4JylgIC9cbiAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKOKApiwgJ3gnKWAgaW4gdGhlIHZpc2liaWxpdHkgaGVscGVycyksIHNvIGEgbmFpdmVcbiAqIGdyZXAgZm9yIGEgcm91dGUtbGV2ZWwgZ2F0ZSByZXBvcnRzIGB0ZW1wbGF0ZXM6cHVibGlzaGAgYXMgVU5FTkZPUkNFRCB3aGVuIGl0XG4gKiBpcyBpbiBmYWN0IGVuZm9yY2VkIG9uIGV2ZXJ5IHRlbXBsYXRlIHB1Ymxpc2guXG4gKlxuICogVGhleSBhbGwgYm90dG9tIG91dCBpbiBgdXNlckhhc1Blcm1pc3Npb25gLCBzbyB0aGUgUlVOVElNRSBwcmltaXRpdmUgd2FzXG4gKiBhbHJlYWR5IG9uZS4gVGhpcyBjb25zdGFudCBtYWtlcyB0aGUgU1RBVElDIHN1cmZhY2Ugb25lIGFzIHdlbGw6IGl0IG5hbWVzXG4gKiBldmVyeSBlbnRyeSBwb2ludCwgc28gYHBlcm1pc3Npb24tY292ZXJhZ2UudGVzdC50c2AgY2FuIGVudW1lcmF0ZSB0aGUgY2F0YWxvZ1xuICogYW5kIHJlcG9ydCBlYWNoIHBlcm1pc3Npb24ncyBlbmZvcmNlbWVudCBzaXRlcyB3aXRob3V0IGd1ZXNzaW5nLiBBIG5ldyBnYXRlXG4gKiB0aGF0IHRha2VzIGEgYFBlcm1pc3Npb25gIG11c3QgYmUgbGlzdGVkIGhlcmUsIG9yIHRoZSBjb3ZlcmFnZSByZXBvcnQgc3RhcnRzXG4gKiBseWluZyBhYm91dCB0aGUgcGVybWlzc2lvbnMgb25seSB0aGF0IGdhdGUgZW5mb3JjZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0dBVEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLy8gTWlkZGxld2FyZSBnYXRlcyAocm91dGUgbGV2ZWwpIOKAlCBhbGwgYW55LW9mIGV4Y2VwdCByZXF1aXJlQWxsUGVybWlzc2lvbnMuXG4gICdyZXF1aXJlUGVybWlzc2lvbicsXG4gICdyZXF1aXJlQWxsUGVybWlzc2lvbnMnLFxuICAncmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UnLFxuICAvLyBUaGUgcGx1Z2luLWVjb3N5c3RlbSBnb3Zlcm5hbmNlIGNoYWluIChzeXN0ZW0gb3JnICsgcGVybWlzc2lvbiArIGFhbDIpLlxuICAncmVxdWlyZUVjb3N5c3RlbVBlcm1pc3Npb24nLFxuICAvLyBUaGUgc2luZ2xlIHJ1bnRpbWUgcHJpbWl0aXZlIGV2ZXJ5IGdhdGUgYWJvdmUgZGVsZWdhdGVzIHRvOyBhbHNvIGNhbGxlZFxuICAvLyBkaXJlY3RseSB3aGVyZSBhIGNvbnRyb2xsZXIgYnJhbmNoZXMgb24gYSBjYXBhYmlsaXR5IHJhdGhlciB0aGFuIHJlamVjdGluZy5cbiAgJ3VzZXJIYXNQZXJtaXNzaW9uJyxcbiAgJ2hhc1Blcm1pc3Npb24nLFxuICAvLyBWaXNpYmlsaXR5IGhlbHBlcnMg4oCUIHRoZXkgdGFrZSB0aGUgZW50aXR5J3MgUFVCTElTSCBwZXJtaXNzaW9uLlxuICAncmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdyZXNvbHZlVmlzaWJpbGl0eScsXG5dO1xuXG4vKipcbiAqIERpc3BsYXkgbWV0YWRhdGEgZm9yIG9uZSBwZXJtaXNzaW9uOiB0aGUgbGFiZWwgKyBkZXNjcmlwdGlvbiB0aGVcbiAqIHBlcm1pc3Npb24tcGlja2VyIFVJIHNob3dzLCBhbmQgdGhlIGNhdGVnb3J5IGl0IGdyb3VwcyB1bmRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uTWV0YSB7XG4gIGlkOiBQZXJtaXNzaW9uO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwZXJtaXNzaW9uIGNhdGFsb2cgd2l0aCBkaXNwbGF5IG1ldGFkYXRhLCBpbiBwaWNrZXIgb3JkZXIuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIFNJTkdMRSBjYXRhbG9nIGZvciBiYWNrZW5kIGFuZCBicm93c2VyIGFsaWtlOiBpdCBoYXMgbm9cbiAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzICh0aGUgb25seSBpbXBvcnQgaXMgYSB0eXBlKSwgc28gdGhlIGZyb250ZW5kIGltcG9ydHMgaXRcbiAqIHRocm91Z2ggdGhlIGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9wZXJtaXNzaW9uc2Agc3VicGF0aCBpbnN0ZWFkIG9mIGtlZXBpbmdcbiAqIGEgaGFuZC1tYWludGFpbmVkIG1pcnJvci4gRXZlcnkgaWQgaW4ge0BsaW5rIEFMTF9QRVJNSVNTSU9OU30gbXVzdCBhcHBlYXIgaGVyZVxuICogZXhhY3RseSBvbmNlIChhc3NlcnRlZCBieSBgcGVybWlzc2lvbnMudGVzdC50c2ApLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9DQVRBTE9HOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdID0gW1xuICB7IGlkOiAncGlwZWxpbmVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdWaWV3IHBpcGVsaW5lcyBhbmQgdGhlaXIgZXhlY3V0aW9ucycsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAncGlwZWxpbmVzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmVzJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ01ha2UgcGlwZWxpbmVzIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBnb2xkZW4tcGF0aCB0ZW1wbGF0ZSBjYXRhbG9nJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnU2hhcmUgYSB0ZW1wbGF0ZSBiZXlvbmQgeW91ciBvcmcgKHB1YmxpYyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAncGx1Z2luczpyZWFkJywgbGFiZWw6ICdWaWV3IHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGx1Z2lucyBhbmQgYnVpbGRzJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwbHVnaW5zIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6aW5zdGFsbCcsIGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2luIGluc3RhbGxzJywgZGVzY3JpcHRpb246IFwiU2V0IHlvdXIgb3JnJ3MgcGx1Z2luIGNvbnN1bXB0aW9uIHBvbGljeSBhbmQgYXBwcm92ZSBvciBkZW55IGluc3RhbGwgcmVxdWVzdHMgd2l0aGluIHRoZSBvcmdcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwdWJsaXNoZXIgcHJvZmlsZScsIGRlc2NyaXB0aW9uOiBcIk1hbmFnZSB5b3VyIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlIGFuZCBzdWJtaXQgcHVibGlzaCwgdmVyaWZpY2F0aW9uLCB0cmFuc2ZlciwgYW5kIGFkdmlzb3J5IHJlcXVlc3RzXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbnM6bW9kZXJhdGUnLCBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOnZlcmlmeScsIGxhYmVsOiAnVmVyaWZ5IHB1Ymxpc2hlcnMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgVmVyaWZpZWQgYXBwbGljYXRpb25zLCBwdWJsaXNoZXIgdGllciBhbmQgcHJvZmlsZSBjaGFuZ2VzLCBhbmQgb3duZXJzaGlwIHRyYW5zZmVycyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ29uY2FsbDptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBvbi1jYWxsIHBhZ2luZycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGFnaW5nIHBvc3R1cmUgYW5kIHNlbmQgYSB0ZXN0IHBhZ2UgKHN5c3RlbSBvcmcgb25seTsgdGhlIHJvdGEgbGl2ZXMgd2l0aCB0aGUgcHJvdmlkZXIpJywgY2F0ZWdvcnk6ICdPbi1jYWxsJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAncmVwb3J0czpyZWFkJywgbGFiZWw6ICdWaWV3IHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYW5hbHl0aWNzIGFuZCByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cm9sbHVwJywgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6YXV0aG9yJywgbGFiZWw6ICdBdXRob3Igc3Rha2Vob2xkZXIgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBzY2hlZHVsZSBhbmQgZHJhZnQgc2NoZWR1bGVkIHJlcG9ydHMgZm9yIG1hbmFnZXJzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6c2hhcmUnLCBsYWJlbDogJ1B1Ymxpc2ggcmVwb3J0cyBleHRlcm5hbGx5JywgZGVzY3JpcHRpb246ICdQdWJsaXNoIGEgcmVwb3J0IGFuZCBtaW50IGV4cGlyaW5nIHNoYXJlIGxpbmtzIGZvciBwZW9wbGUgb3V0c2lkZSB0aGUgcGxhdGZvcm0nLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnVmlldyBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6d3JpdGUnLCBsYWJlbDogJ1NlbmQgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1NlbmQgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6cmVhZCcsIGxhYmVsOiAnVmlldyBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdWaWV3IHN1YnNjcmlwdGlvbnMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAnYmlsbGluZzptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdNYW5hZ2Ugc3Vic2NyaXB0aW9ucywgYWRkLW9ucywgYW5kIHRoZSBiaWxsaW5nIHBvcnRhbCcsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3F1b3RhczpyZWFkJywgbGFiZWw6ICdWaWV3IHF1b3RhcycsIGRlc2NyaXB0aW9uOiAnVmlldyBvcmdhbml6YXRpb24gcXVvdGFzIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OnJlYWQnLCBsYWJlbDogJ1ZpZXcgcmVnaXN0cnknLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHJlZ2lzdHJ5JywgZGVzY3JpcHRpb246ICdEZWxldGUgYW5kIGNvcHkgY29udGFpbmVyIGltYWdlcycsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdvcmc6c2V0dGluZ3MnLCBsYWJlbDogJ09yZ2FuaXphdGlvbiBzZXR0aW5ncycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIGdlbmVyYWwgb3JnIHNldHRpbmdzIGFuZCBBSSBjb25maWcnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZzppZHAnLCBsYWJlbDogJ01hbmFnZSBTU08vSWRQJywgZGVzY3JpcHRpb246ICdDb25maWd1cmUgc2luZ2xlIHNpZ24tb24gYW5kIGlkZW50aXR5IHByb3ZpZGVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnOmttcycsIGxhYmVsOiAnTWFuYWdlIGVuY3J5cHRpb24ga2V5cycsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb24ga2V5cycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnOmltcGVyc29uYXRpb24nLCBsYWJlbDogJ01hbmFnZSBpbXBlcnNvbmF0aW9uIHBvbGljeScsIGRlc2NyaXB0aW9uOiAnQ29udHJvbCB3aGV0aGVyIHBsYXRmb3JtIG9wZXJhdG9ycyBtYXkgdmlldyB0aGUgb3JnYW5pemF0aW9uIGFzIG9uZSBvZiBpdHMgbWVtYmVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuXTtcblxuY29uc3QgUEVSTUlTU0lPTl9MQUJFTFMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihQRVJNSVNTSU9OX0NBVEFMT0cubWFwKChwKSA9PiBbcC5pZCwgcC5sYWJlbF0pKTtcblxuLyoqIEh1bWFuIGxhYmVsIGZvciBhIHBlcm1pc3Npb24gaWQgKGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBpZCBmb3IgYW4gdW5rbm93biBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25MYWJlbChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBFUk1JU1NJT05fTEFCRUxTLmdldChpZCkgPz8gaWQ7XG59XG5cbi8qKiBPbmUgcGlja2VyIHNlY3Rpb246IGEgY2F0ZWdvcnkgYW5kIHRoZSBwZXJtaXNzaW9ucyBpdCBjb250YWlucywgaW4gY2F0YWxvZyBvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25NZXRhW107XG59XG5cbi8qKiBHcm91cCBhIHBlcm1pc3Npb24gbGlzdCBpbnRvIGNhdGVnb3JpZXMsIHByZXNlcnZpbmcgY2F0YWxvZyBvcmRlci4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlDYXRlZ29yeShwZXJtczogcmVhZG9ubHkgUGVybWlzc2lvbk1ldGFbXSk6IFBlcm1pc3Npb25DYXRlZ29yeVtdIHtcbiAgY29uc3Qgb3JkZXI6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHN0cmluZywgUGVybWlzc2lvbk1ldGFbXT4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHBlcm1zKSB7XG4gICAgaWYgKCFieUNhdGVnb3J5LmhhcyhwLmNhdGVnb3J5KSkgeyBieUNhdGVnb3J5LnNldChwLmNhdGVnb3J5LCBbXSk7IG9yZGVyLnB1c2gocC5jYXRlZ29yeSk7IH1cbiAgICBieUNhdGVnb3J5LmdldChwLmNhdGVnb3J5KSEucHVzaChwKTtcbiAgfVxuICByZXR1cm4gb3JkZXIubWFwKChjYXRlZ29yeSkgPT4gKHsgY2F0ZWdvcnksIHBlcm1pc3Npb25zOiBieUNhdGVnb3J5LmdldChjYXRlZ29yeSkhIH0pKTtcbn1cblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBQZXJtaXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQZXJtaXNzaW9uKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBQZXJtaXNzaW9uIHtcbiAgcmV0dXJuIChBTExfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IG11c3QgTkVWRVIgYmUgZ3JhbnRhYmxlIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIENVU1RPTSBSb2xlIOKAlFxuICogdGhleSBnYXRlIHBsYXRmb3JtLW9wZXJhdG9yIHN1cmZhY2VzICh0aGUgc2hhcmVkIGltYWdlIHJlZ2lzdHJ5KSwgc28gYWxsb3dpbmdcbiAqIGFuIG9yZyBhZG1pbiB0byBtaW50IGEgUm9sZSBjYXJyeWluZyB0aGVtIHdvdWxkIGJlIGEgbGF0ZW50IHByaXZpbGVnZVxuICogZXNjYWxhdGlvbi4gVGhleSBhcmUgTk9UIHNlZWRlZCBpbnRvIEFOWSBidWlsdC1pbiBSb2xlIGJ1bmRsZSAobmVpdGhlclxuICogYG1lbWJlcmAgbm9yIGBhZG1pbmApLCBzbyB0aGUgb25seSBob2xkZXIgaXMgYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpIOKAlFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaW1hZ2UtcmVnaXN0cnkgZ2F0ZXMgdGhhdCByZXF1aXJlIHRoZW0gZWZmZWN0aXZlbHlcbiAqIHN1cGVyYWRtaW4tb25seS4gVGhpcyBsaXN0IEFMU08gYmxvY2tzIGN1c3RvbS1Sb2xlIGF1dGhvcmluZyBmcm9tIHJlcXVlc3RpbmdcbiAqIHRoZW0gKHNlZSBwbGF0Zm9ybSBgc2FuaXRpemVQZXJtaXNzaW9uc2ApLlxuICovXG5leHBvcnQgY29uc3QgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBnb3Zlcm4gdGhlIFBMVUdJTiBFQ09TWVNURU0gYW5kIG1heSBiZSBoZWxkIG9ubHkgaW5zaWRlIHRoZVxuICogc3lzdGVtIG9yZyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIExpa2VcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IHRoZXkgYXJlIGluIG5vIG1lbWJlci9hZG1pbi9vd25lciBidW5kbGVcbiAqIGFuZCBhcmUgbmV2ZXIgZ3JhbnRhYmxlIHRocm91Z2ggYSBjdXN0b20gUm9sZSBpbiBBTlkgb3JnIChwbGF0Zm9ybVxuICogYHNhbml0aXplUGVybWlzc2lvbnNgIHJlZnVzZXMgdGhlbSkuIFRoZSBvbmx5IGhvbGRlcnMgYXJlIHN1cGVyYWRtaW5zXG4gKiAoaW1wbGljaXQtYWxsKSBhbmQgbWVtYmVycyBvZiB0aGUgYnVpbHQtaW4gXCJFY29zeXN0ZW0gTWFuYWdlclwiIFJvbGUsIHdoaWNoIGlzXG4gKiBzZWVkZWQgaW4gdGhlIHN5c3RlbSBvcmcgYWxvbmUgZnJvbSB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9IGFuZFxuICogYXNzaWduYWJsZSBvbmx5IGJ5IGEgc3VwZXJhZG1pbi5cbiAqXG4gKiBgb25jYWxsOm1hbmFnZWAgaXMgaW4gTkVJVEhFUiBuYW1lZCByb2xlLCB3aGljaCBtYWtlcyBpdCBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLiBUaGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb3ZlcnNpZ2h0OiBwYWdpbmcgaXMgdGhlIHZlbmRvcidzXG4gKiBvd24gb3BlcmF0aW9uYWwgY29uY2VybiBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBlY29zeXN0ZW0gbW9kZXJhdGlvbiwgc29cbiAqIHdpZGVuaW5nIHRoZSBFY29zeXN0ZW0gTWFuYWdlciByb2xlIHRvIGNhcnJ5IGl0IHdvdWxkIGhhbmQgdGhlIHBhZ2VyIHRvXG4gKiBwZW9wbGUgaGlyZWQgdG8gcmV2aWV3IHBsdWdpbnMuIEl0IGlzIG5vdCBhIHBsYWNlaG9sZGVyIOKAlCBpdCBnYXRlcyB0d28gbGl2ZVxuICogcm91dGVzICh0aGUgcGFnaW5nIHBvc3R1cmUgcmVhZCBhbmQgdGhlIHRlc3QgcGFnZSksIHVubGlrZSBgcmVnaXN0cnk6KmAuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG5dO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlIHN5c3RlbSBvcmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIGFuIG9yZyBtYXkgYXNzaWduIHZpYSBhIENVU1RPTSBSb2xlIOKAlCBldmVyeSBwZXJtaXNzaW9uIGV4Y2VwdCB0aGVcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfS5cbiAqIEN1c3RvbS1Sb2xlIGNyZWF0ZS91cGRhdGUgdmFsaWRhdGVzIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzZXQgYWdhaW5zdCB0aGlzXG4gKiAoc2VlIHBsYXRmb3JtIHJvbGVzLXNlcnZpY2UpLlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocCkpO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGdyYW50ZWQgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgY3VzdG9tIFJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHBlcm1pc3Npb24pICYmICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIENhdGVnb3J5IOKGkiBwZXJtaXNzaW9ucyBmb3IgdGhlIGN1c3RvbS1Sb2xlIEFVVEhPUklORyBwaWNrZXI6IHRoZSBjYXRhbG9nIG1pbnVzXG4gKiB0aGUgbm9uLWFzc2lnbmFibGUgcGVybWlzc2lvbnMsIHdpdGggYW55IG5vdy1lbXB0eSBjYXRlZ29yeSBkcm9wcGVkXG4gKiAoc28gXCJSZWdpc3RyeVwiIGRpc2FwcGVhcnMpLiBUaGUgZ3JvdXBlZCB2aWV3IG9mXG4gKiB7QGxpbmsgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlN9LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfQ0FURUdPUklFUzogcmVhZG9ubHkgUGVybWlzc2lvbkNhdGVnb3J5W10gPVxuICBncm91cEJ5Q2F0ZWdvcnkoUEVSTUlTU0lPTl9DQVRBTE9HLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwLmlkKSkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbHMgKHBlcnNvbmFsIGFjY2VzcyBrZXlzIC8gbWFjaGluZSB0b2tlbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEV2ZXJ5IGA6cmVhZGAgcGVybWlzc2lvbiDigJQgdGhlIFwicmVhZC1vbmx5XCIgcHJlc2V0IGEgbmV3IHBlcnNvbmFsIGFjY2VzcyBrZXlcbiAqIHN0YXJ0cyBmcm9tLiBEZXJpdmVkIGZyb20gdGhlIGNhdGFsb2cgc28gYSBuZXcgcmVzb3VyY2UncyByZWFkIHBlcm1pc3Npb25cbiAqIGpvaW5zIHRoZSBwcmVzZXQgd2l0aG91dCBhIHNlY29uZCBlZGl0LlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPVxuICBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKCc6cmVhZCcpKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzdWJzZXQ6IGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBjYXRhbG9nIGlkXG4gKiAoYW55dGhpbmcgZWxzZSDihpIgYG51bGxgLCB0aGUgY2FsbGVyJ3MgNDAwKSwgZHVwbGljYXRlcyBjb2xsYXBzZSwgYW5kIHRoZVxuICogcmVzdWx0IGlzIGluIGNhbm9uaWNhbCBjYXRhbG9nIG9yZGVyIHNvIGEgc3RvcmVkIHN1YnNldCBjb21wYXJlcyBzdGFibHkuXG4gKiBBbiBFTVBUWSBhcnJheSBpcyB2YWxpZCDigJQgYSBrZXkgdGhhdCBjYW4gYXV0aGVudGljYXRlIGJ1dCBkbyBub3RoaW5nIOKAlCBhbmRcbiAqIGlzIGRpc3RpbmN0IGZyb20gXCJubyBzdWJzZXRcIiAoYHVuZGVmaW5lZGApLCB3aGljaCBtZWFucyBmdWxsIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBlcm1pc3Npb25TdWJzZXQocmVxdWVzdGVkOiByZWFkb25seSB1bmtub3duW10pOiBQZXJtaXNzaW9uW10gfCBudWxsIHtcbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcCBvZiByZXF1ZXN0ZWQpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnIHx8ICFpc1ZhbGlkUGVybWlzc2lvbihwKSkgcmV0dXJuIG51bGw7XG4gICAgd2FudGVkLmFkZChwKTtcbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gd2FudGVkLmhhcyhwKSk7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb25zIGEgcGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbCBhY3R1YWxseSBjYXJyaWVzOiB0aGVcbiAqIElOVEVSU0VDVElPTiBvZiB0aGUgc3Vic2V0IGl0IHdhcyBjcmVhdGVkIHdpdGggYW5kIHRoZSBob2xkZXIncyBDVVJSRU5UXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMsIGluIGNhdGFsb2cgb3JkZXIuIFJlLWV2YWx1YXRlZCBhdCBldmVyeSBpc3N1ZSwgc29cbiAqIGxvc2luZyBhIFJvbGUgc2hyaW5rcyB0aGUgY3JlZGVudGlhbCBhbmQgbm90aGluZyBjYW4gZXZlciBncm93IGl0IHBhc3QgdGhlXG4gKiBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdFBlcm1pc3Npb25zKFxuICBlZmZlY3RpdmU6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWJzZXQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUGVybWlzc2lvbltdIHtcbiAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoc3Vic2V0KTtcbiAgY29uc3QgaGVsZCA9IG5ldyBTZXQoZWZmZWN0aXZlKTtcbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGFsbG93ZWQuaGFzKHApICYmIGhlbGQuaGFzKHApKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBlcm1pc3Npb24gYnVuZGxlcyB1c2VkIHRvIFNFRUQgdGhlIGJ1aWx0LWluIFJvbGVzIChcIkFkbWluXCIsIFwiTWVtYmVyXCIpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBkZWZpbml0aW9uIG9mIHdoYXQgdGhvc2UgYnVpbHQtaW4gUm9sZXMgZ3JhbnQg4oCUIGl0IGlzIHVzZWRcbiAqIHdoZW4gYSBSb2xlIHJlY29yZCBpcyBjcmVhdGVkIChhbmQgYnkgdGhlIHN0YXJ0dXAgYmFja2ZpbGwpIHRvIHBvcHVsYXRlIHRoYXRcbiAqIFJvbGUncyBvd24gYHBlcm1pc3Npb25zW11gLiBJdCBpcyBOT1QgYSBydW50aW1lIHBlcm1pc3Npb24gc291cmNlOiBhIHVzZXInc1xuICogZWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWUgT05MWSBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtIChzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSkuIFRoZSBjb2Fyc2UgYHJvbGVgIGxhYmVsIChvd25lci9hZG1pbi9tZW1iZXIpXG4gKiBzdXJ2aXZlcyBvbmx5IGZvciBgaXNBZG1pbmAvb3duZXJzaGlwL2Rpc3BsYXksIG5ldmVyIHRvIGdyYW50IHBlcm1pc3Npb25zLlxuICpcbiAqIC0gYG1lbWJlcmAgIOKAlCBkYXktdG8tZGF5IGJ1aWxkZXI6IHJlYWQgKyB3cml0ZSBvbiBwaXBlbGluZXMvdGVtcGxhdGVzL3BsdWdpbnMsXG4gKiAgIHJlYWQgZWxzZXdoZXJlLiBObyBtZW1iZXIvcm9sZS9iaWxsaW5nIG1hbmFnZW1lbnQsIG5vIGNvbXBsaWFuY2UvYWxlcnRcbiAqICAgYXV0aG9yaW5nLCBhbmQgbm8gYDpwdWJsaXNoYCBvbiBhbnkgY2F0YWxvZy5cbiAqIC0gYGFkbWluYCAgIOKAlCBmdWxsIG9yZyBhZG1pbmlzdHJhdGlvbjogZXZlcnkgT1JHLUFTU0lHTkFCTEUgcGVybWlzc2lvbiAoaS5lLlxuICogICBBTExfUEVSTUlTU0lPTlMgbWludXMgdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB0aGVcbiAqICAge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30sIHNvIGByZWdpc3RyeToqYCBzdGF5XG4gKiAgIHN1cGVyYWRtaW4taW1wbGljaXQtb25seSBhbmQgZWNvc3lzdGVtIG1vZGVyYXRpb24gc3RheXMgd2l0aCB0aGUgc3lzdGVtXG4gKiAgIG9yZydzIEVjb3N5c3RlbSBNYW5hZ2VycyDigJQgbmVpdGhlciBpcyBncmFudGVkIHRvIG9yZyBhZG1pbnMpLlxuICogLSBgb3duZXJgICAg4oCUIHNhbWUgYXMgYWRtaW4gKG93bmVyc2hpcCBpdHNlbGYg4oCUIHRyYW5zZmVyL2RlbGV0ZSDigJQgaXMgZ2F0ZWRcbiAqICAgc2VwYXJhdGVseSwgbm90IHZpYSBhIHBlcm1pc3Npb24pLlxuICovXG5jb25zdCBNRU1CRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLFxuICAncGx1Z2luczppbnN0YWxsJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ3JlcG9ydHM6cmVhZCcsXG4gICdtZXNzYWdlczpyZWFkJywgJ21lc3NhZ2VzOndyaXRlJyxcbiAgJ2JpbGxpbmc6cmVhZCcsXG4gICdxdW90YXM6cmVhZCcsXG5dO1xuXG5jb25zdCBBRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gWy4uLk9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgZWFjaCBidWlsdC1pbiBSb2xlLCBrZXllZCBieSB0aGUgY29hcnNlIHJvbGUgaXQgZ3JhbnRzLlxuICogQ29uc3VtZWQgYnkgdGhlIFJvbGUgc2VlZGVyICsgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgdG8gcG9wdWxhdGUgYSBidWlsdC1pblxuICogUm9sZSdzIGBwZXJtaXNzaW9uc1tdYC4gTk9UIGNvbnN1bHRlZCBhdCByZXF1ZXN0IHRpbWUg4oCUIHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9LlxuICovXG5leHBvcnQgY29uc3QgUk9MRV9QRVJNSVNTSU9OUzogUmVjb3JkPE9yZ1JvbGUsIHJlYWRvbmx5IFBlcm1pc3Npb25bXT4gPSB7XG4gIG1lbWJlcjogTUVNQkVSX1BFUk1JU1NJT05TLFxuICBhZG1pbjogQURNSU5fUEVSTUlTU0lPTlMsXG4gIG93bmVyOiBBRE1JTl9QRVJNSVNTSU9OUyxcbn07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSDigJQgc2VlZGVkIE9OTFkgaW4gdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gSXQgY2FycmllcyB0aGVcbiAqIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IHBsdXMgdGhlIHJlYWRzIGEgbW9kZXJhdG9yIG5lZWRzICh0aGVcbiAqIGluLWFwcCBjYXRhbG9nLCBpbi1hcHAgbm90aWNlcywgdGhlIG1vZGVyYXRpb24tU0xBIGRhc2hib2FyZCkgYW5kIG5vdGhpbmdcbiAqIHRlbmFudC1mYWNpbmc6IG5vIGByZWdpc3RyeToqYCwgbm8gYG1lbWJlcnM6bWFuYWdlYC4gVGhlIFJvbGUgZ3JhbnRzIHRoZVxuICogY29hcnNlIGBtZW1iZXJgIGxhYmVsIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG5leHBvcnQgY29uc3QgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6cmVhZCcsXG4gICdwbHVnaW5zOm1vZGVyYXRlJyxcbiAgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlRlYW0gTGVhZFwiIFJvbGUg4oCUIHRoZSBwZXJzb24gd2hvIHJlcG9ydHMgVVBXQVJELlxuICpcbiAqIEV4aXN0cyBiZWNhdXNlIHRoZSB0YXJnZXQgdXNlciBmb3Igc3Rha2Vob2xkZXIgcmVwb3J0cyBpcyBhIGxlYWQsIG5vdCBhbiBhZG1pbixcbiAqIGFuZCBncmFudGluZyBgcmVwb3J0czphdXRob3JgIG9ubHkgdGhyb3VnaCB0aGUgYWRtaW4gYnVuZGxlIHdvdWxkIGhhdmUgZm9yY2VkXG4gKiBldmVyeSByZXBvcnRpbmcgbGVhZCB0byBiZSBhbiBvcmcgYWRtaW4gKG1lbWJlcnM6bWFuYWdlLCByb2xlczptYW5hZ2UsXG4gKiBvcmc6c2V0dGluZ3MsIGJpbGxpbmcpIHRvIHNlbmQgdGhlaXIgbWFuYWdlciBhIHdlZWtseSBzdW1tYXJ5LlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IGByZXBvcnRzOnJvbGx1cGAuIFJvbGxpbmcgYSByZXBvcnQgdXAgb3ZlciBkZXNjZW5kYW50XG4gKiB0ZWFtcyBpcyBkb3dud2FyZCB2aXNpYmlsaXR5IGFjcm9zcyB0aGUgb3JnIHRyZWUsIHdoaWNoIGlzIGEgZ3JhbnRlZCBjYXBhYmlsaXR5XG4gKiBpbiB0aGlzIG1vZGVsLCBub3Qgc29tZXRoaW5nIGEgdGVhbSdzIG93biBsZWFkIGdldHMgYnkgZGVmYXVsdCDigJQgYSBsZWFkIG9mIGFcbiAqIFBBUkVOVCBvcmcgaXMgZ3JhbnRlZCBpdCBleHBsaWNpdGx5LiBUaGUgUm9sZSBncmFudHMgdGhlIGNvYXJzZSBgbWVtYmVyYCBsYWJlbFxuICogYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBURUFNX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uTUVNQkVSX1BFUk1JU1NJT05TLFxuICAncmVwb3J0czphdXRob3InLFxuICAncmVwb3J0czpzaGFyZScsXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdXNlcidzIGVmZmVjdGl2ZSBvcmcgcGVybWlzc2lvbnMgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbS5cbiAqXG4gKiBTaW5nbGUtc291cmNlIG1vZGVsOiBhIHVzZXIncyBhYmlsaXRpZXMgYXJlIEVYQUNUTFkgdGhlIHVuaW9uIG9mIHRoZVxuICogcGVybWlzc2lvbnMgY2FycmllZCBieSB0aGUgUm9sZXMgdGhleSBob2xkIChhIFJvbGUgPSBhIG5hbWVkIHBlcm1pc3Npb24gc2V0O1xuICogYnVpbHQtaW4gUm9sZXMgY2FycnkgdGhlaXIgYnVuZGxlIGV4cGxpY2l0bHksIHNlZWRlZCBmcm9tXG4gKiB7QGxpbmsgUk9MRV9QRVJNSVNTSU9OU30pLiBUaGVyZSBpcyBubyBzZXBhcmF0ZSByb2xlLWRlcml2ZWQgYmFzZWxpbmUg4oCUIHRoZVxuICogY29hcnNlIGByb2xlYCBsYWJlbCBncmFudHMgbm90aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIDEuIFBsYXRmb3JtIHN1cGVyYWRtaW5zIChgaXNTdXBlckFkbWluYCkgYWx3YXlzIGdldCBBTEwgcGVybWlzc2lvbnMuXG4gKiAyLiBPdGhlcndpc2UsIHVuaW9uIGV2ZXJ5IHBlcm1pc3Npb24gZ3JhbnRlZCBieSB0aGUgdXNlcidzIGFzc2lnbmVkIFJvbGVzLlxuICogMy4gSW52YWxpZC91bmtub3duIHBlcm1pc3Npb24gc3RyaW5ncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRQZXJtaXNzaW9ucyAtIEZsYXR0ZW5lZCBwZXJtaXNzaW9ucyBmcm9tIGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaG9sZHNcbiAqIEBwYXJhbSBpc1N1cGVyQWRtaW4gLSBXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqIEByZXR1cm5zIEVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBpbiBjYW5vbmljYWwgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVc2VyUGVybWlzc2lvbnMoXG4gIGFzc2lnbmVkUGVybWlzc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gWy4uLkFMTF9QRVJNSVNTSU9OU107XG5cbiAgY29uc3QgcGVybXMgPSBuZXcgU2V0PFBlcm1pc3Npb24+KCk7XG4gIGlmIChhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICAgIGlmIChpc1ZhbGlkUGVybWlzc2lvbihwKSkgcGVybXMuYWRkKHApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcihwID0+IHBlcm1zLmhhcyhwKSk7XG59XG5cbi8qKlxuICogQ29uZmluZSBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCB0byB3aGF0IG1heSBiZSBoZWxkIGluIHRoZSB0b2tlbidzIEFDVElWRVxuICogb3JnOiBvdXRzaWRlIHRoZSBzeXN0ZW0gb3JnIGV2ZXJ5IHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IGVudHJ5IGlzXG4gKiBkcm9wcGVkIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gQXBwbGllZCBhdCB0b2tlbiBpc3N1ZSBvblxuICogdG9wIG9mIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSDigJQgaW5jbHVkaW5nIGEgc3VwZXJhZG1pbidzIGltcGxpY2l0LWFsbCDigJRcbiAqIHNvIGEgdG9rZW4gbWludGVkIGluIGEgdGVuYW50IG9yZyBuZXZlciBDTEFJTVMgYHBsdWdpbnM6bW9kZXJhdGVgIC9cbiAqIGBwdWJsaXNoZXJzOnZlcmlmeWAsIGV2ZW4gaWYgYSBoYW5kLXdyaXR0ZW4gUm9sZSBkb2N1bWVudCBzb21laG93IGNhcnJpZWRcbiAqIHRoZW0gdGhlcmUuIChTdXBlcmFkbWlucyBzdGlsbCBwYXNzIGBoYXNQZXJtaXNzaW9uYCB2aWEgdGhlIGZsYWc7IHRoZVxuICogZWNvc3lzdGVtIHJvdXRlIGdhdGUgYWRkaXRpb25hbGx5IHJlcXVpcmVzIHRoZSBzeXN0ZW0gb3JnLCBzbyB0aGF0IGJ5cGFzc1xuICogbmV2ZXIgcmVhY2hlcyBhIGdvdmVybmFuY2Ugcm91dGUgZnJvbSBhIHRlbmFudCBvcmcgZWl0aGVyLilcbiAqXG4gKiBUYWtlcyBhIGJvb2xlYW4gcmF0aGVyIHRoYW4gYW4gb3JnIGlkIHNvIHRoaXMgbW9kdWxlIHN0YXlzIGRlcGVuZGVuY3ktZnJlZVxuICogKHRoZSBmcm9udGVuZCBpbXBvcnRzIGl0KTsgY2FsbGVycyBkZWNpZGUgd2l0aCBhcGktY29yZSBgaXNTeXN0ZW1PcmdJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maW5lUGVybWlzc2lvbnNUb09yZzxQIGV4dGVuZHMgc3RyaW5nPihcbiAgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBbXSxcbiAgYWN0aXZlT3JnSXNTeXN0ZW1Pcmc6IGJvb2xlYW4sXG4pOiBQW10ge1xuICByZXR1cm4gYWN0aXZlT3JnSXNTeXN0ZW1PcmcgPyBbLi4ucGVybWlzc2lvbnNdIDogcGVybWlzc2lvbnMuZmlsdGVyKChwKSA9PiAhaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IGdyYW50cyBgcGVybWlzc2lvbmAgKHN1cGVyYWRtaW4g4oeSIGFsd2F5cykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVybWlzc2lvbihcbiAgZ3JhbnRlZDogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiB0cnVlO1xuICByZXR1cm4gISFncmFudGVkICYmIGdyYW50ZWQuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG4iXX0=
|
|
851
|
+
// =============================================================================
|
|
852
|
+
// Built-in Role seed bundles, as a TABLE
|
|
853
|
+
// =============================================================================
|
|
854
|
+
/**
|
|
855
|
+
* The named permission bundles a built-in Role may carry, and the Role NAME each
|
|
856
|
+
* one is seeded under. One table, because the three facts about a job Role —
|
|
857
|
+
* its id, its permissions and its display name — were previously three
|
|
858
|
+
* independent lists in three places, and nothing held them together.
|
|
859
|
+
*
|
|
860
|
+
* WHAT WENT WRONG WITHOUT IT. The platform resolved a bundle through a
|
|
861
|
+
* nine-branch `if` chain with a fall-through to the coarse `grantsRole` bundle.
|
|
862
|
+
* Every job Role grants `member`, so a bundle added to the id list WITHOUT its
|
|
863
|
+
* branch did not fail — it silently seeded the plain Member bundle, and the
|
|
864
|
+
* startup backfill then re-synced it to that wrong value on every boot. The
|
|
865
|
+
* Role existed, was assignable from the staffing panel, and granted fifteen
|
|
866
|
+
* tenant permissions instead of its job. Nothing anywhere exercised the
|
|
867
|
+
* resolver per bundle.
|
|
868
|
+
*
|
|
869
|
+
* Keyed access plus `satisfies` makes a missing entry a COMPILE error, and an
|
|
870
|
+
* extra one too — in both directions, with no runtime check to forget.
|
|
871
|
+
*
|
|
872
|
+
* The NAME lives here for the same reason. The platform seeded names from its
|
|
873
|
+
* own constants while the frontend's staffing roster hard-coded its own copy,
|
|
874
|
+
* each pinned by a test against itself — so renaming a Role passed both suites
|
|
875
|
+
* and the roster silently rendered "Role not found", which is the grant path for
|
|
876
|
+
* that Role's permissions disappearing. Both sides read this now.
|
|
877
|
+
*/
|
|
878
|
+
export const SEED_BUNDLES = {
|
|
879
|
+
ecosystem_manager: { name: 'Ecosystem Manager', permissions: ECOSYSTEM_MANAGER_PERMISSIONS },
|
|
880
|
+
team_lead: { name: 'Team Lead', permissions: TEAM_LEAD_PERMISSIONS },
|
|
881
|
+
platform_observer: { name: 'Platform Observer', permissions: PLATFORM_OBSERVER_PERMISSIONS },
|
|
882
|
+
platform_operator: { name: 'Platform Operator', permissions: PLATFORM_OPERATOR_PERMISSIONS },
|
|
883
|
+
account_manager: { name: 'Account Manager', permissions: ACCOUNT_MANAGER_PERMISSIONS },
|
|
884
|
+
console_admin: { name: 'Console Administrator', permissions: CONSOLE_ADMIN_PERMISSIONS },
|
|
885
|
+
support_agent: { name: 'Support Agent', permissions: SUPPORT_AGENT_PERMISSIONS },
|
|
886
|
+
support_lead: { name: 'Support Lead', permissions: SUPPORT_LEAD_PERMISSIONS },
|
|
887
|
+
registry_operator: { name: 'Registry Operator', permissions: REGISTRY_OPERATOR_PERMISSIONS },
|
|
888
|
+
pipeline_automation: { name: 'Pipeline Automation', permissions: PIPELINE_AUTOMATION_PERMISSIONS },
|
|
889
|
+
pipeline_registration: { name: 'Pipeline Registration', permissions: PIPELINE_REGISTRATION_PERMISSIONS },
|
|
890
|
+
};
|
|
891
|
+
/** Every seed-bundle id. The platform's `Role.seedBundle` enum is this list. */
|
|
892
|
+
export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
|
|
893
|
+
/**
|
|
894
|
+
* The SYSTEM ORG's job Roles, in staffing order — the subset of
|
|
895
|
+
* {@link SEED_BUNDLES} seeded there, which is every bundle except `team_lead`
|
|
896
|
+
* (a tenant job, and a template rather than a seeded Role since it stopped
|
|
897
|
+
* being structural).
|
|
898
|
+
*
|
|
899
|
+
* `ecosystem_manager` IS one of them; it is listed here even though its roster
|
|
900
|
+
* lives on the Ecosystem console rather than the staffing panel, because what
|
|
901
|
+
* this list answers is "which Roles does the system org seed", not "which panel
|
|
902
|
+
* renders them".
|
|
903
|
+
*/
|
|
904
|
+
export const SYSTEM_ORG_JOB_BUNDLES = [
|
|
905
|
+
'ecosystem_manager',
|
|
906
|
+
'platform_observer',
|
|
907
|
+
'platform_operator',
|
|
908
|
+
'account_manager',
|
|
909
|
+
'console_admin',
|
|
910
|
+
'support_agent',
|
|
911
|
+
'support_lead',
|
|
912
|
+
'registry_operator',
|
|
913
|
+
];
|
|
914
|
+
/**
|
|
915
|
+
* The MACHINE Roles every org seeds — the subset of {@link SEED_BUNDLES} held by
|
|
916
|
+
* the service accounts `pipeline-manager infra store-token` provisions.
|
|
917
|
+
*
|
|
918
|
+
* Seeded rather than offered as a {@link ROLE_TEMPLATES} entry, unlike the
|
|
919
|
+
* tenant job presets, because they are structural: the CLI grants one to the
|
|
920
|
+
* account it creates and the startup backfill moves existing accounts onto it,
|
|
921
|
+
* and both have to find it in EVERY org by a stable identity. A template leaves
|
|
922
|
+
* nothing to find until somebody instantiates it.
|
|
923
|
+
*/
|
|
924
|
+
export const ORG_AUTOMATION_BUNDLES = [
|
|
925
|
+
'pipeline_automation',
|
|
926
|
+
'pipeline_registration',
|
|
927
|
+
];
|
|
928
|
+
/**
|
|
929
|
+
* The service accounts `pipeline-manager infra store-token` provisions, keyed by
|
|
930
|
+
* account name, and the built-in Role each holds — `null` for an account whose
|
|
931
|
+
* key carries a capability SCOPE (a `TokenScope`) and so needs no Role at all.
|
|
932
|
+
*
|
|
933
|
+
* One table for the CLI (which Role to grant a NEW account) and the platform's
|
|
934
|
+
* startup backfill (which Role to move an EXISTING account onto, off the org
|
|
935
|
+
* admin Role these accounts were once given). A rename here moves both.
|
|
936
|
+
*/
|
|
937
|
+
export const AUTOMATION_ACCOUNT_BUNDLES = {
|
|
938
|
+
'platform-automation': 'pipeline_automation',
|
|
939
|
+
'pipeline-register': 'pipeline_registration',
|
|
940
|
+
'reporting-ingest': null,
|
|
941
|
+
'registry-push': null,
|
|
942
|
+
};
|
|
943
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQWtQdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXNCO0lBQ25ELE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU07SUFDcEMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUztDQUN6RSxDQUFDO0FBRUYscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDBCQUEwQixDQUFDO0FBRTlELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTBCO0lBQ3BELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLHlCQUF5QjtJQUNuRixnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDeEQsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEQsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CO0lBQ2hFLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQjtJQUMvQyw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEI7SUFDakYsZUFBZTtJQUNmLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxvQkFBb0IsRUFBRSxzQkFBc0I7SUFDNUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxxQkFBcUI7SUFDckQsaUJBQWlCLEVBQUUsa0JBQWtCO0lBQ3JDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDakYsaUJBQWlCLEVBQUUsa0JBQWtCO0lB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cEIsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUE0QjtJQUM3RCxxQkFBcUI7SUFDckIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLHFCQUFxQixFQUFFLHFCQUFxQjtJQUM1QyxtQkFBbUIsRUFBRSx1QkFBdUI7SUFDNUMsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixlQUFlLEVBQUUsSUFBSTtDQUNpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgT3JnUm9sZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBlcm1pc3Npb24gaWRlbnRpZmllcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2Fub25pY2FsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGlkZW50aWZpZXJzLCBpbiBgcmVzb3VyY2U6YWN0aW9uYCBmb3JtLlxuICpcbiAqIFRoZXNlIGFyZSB0aGUgT1JHLVNDT1BFRCBjYXBhYmlsaXRpZXMgYSBSb2xlIGNhbiBncmFudCAoUkJBQykuIENvYXJzZSBieVxuICogZGVzaWduIOKAlCBgOndyaXRlYCBjb3ZlcnMgY3JlYXRlL3VwZGF0ZS9kZWxldGUgZm9yIGEgcmVzb3VyY2Ug4oCUIHNvIHRoZSBjYXRhbG9nXG4gKiBhbmQgcGVybWlzc2lvbi1waWNrZXIgVUkgc3RheSBzbWFsbDsgc3BsaXQgYSBgOndyaXRlYCBpbnRvIGA6Y3JlYXRlYC9gOmRlbGV0ZWBcbiAqIGxhdGVyIGlmIGEgcmVzb3VyY2UgbmVlZHMgaXQuXG4gKlxuICogTk9UIG1vZGVsZWQgaGVyZSAoaW50ZW50aW9uYWxseSk6IHBsYXRmb3JtLW9wZXJhdG9yIGFjdGlvbnMgKG9yZyBkZWxldGUsIHRpZXIvXG4gKiBxdW90YSBvdmVycmlkZSwgdXNlciBhZG1pbiwgaW1wZXJzb25hdGlvbiwgcGxhdGZvcm0gc2V0dGluZ3MpIHN0YXkgYmVoaW5kIHRoZVxuICogZ2xvYmFsIGBpc1N1cGVyQWRtaW5gIGZsYWcsIG5vdCBhIHBlci1vcmcgcGVybWlzc2lvbjsgYW5kIGByZXF1aXJlU3RlcFVwYFxuICogKE1GQSkgLyBgcmVxdWlyZUZlYXR1cmVgIChwbGFuIGVudGl0bGVtZW50cykgcmVtYWluIG9ydGhvZ29uYWwgZ2F0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPVxuICAvLyBQaXBlbGluZXNcbiAgfCAncGlwZWxpbmVzOnJlYWQnXG4gIHwgJ3BpcGVsaW5lczp3cml0ZSdcbiAgfCAncGlwZWxpbmVzOnB1Ymxpc2gnXG4gIC8vIFRoZSBwaXBlbGluZSBSRUdJU1RSWSAoYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWApOiB3aGljaCBkZXBsb3llZFxuICAvLyBzdGFjayBiYWNrcyBhIHBpcGVsaW5lLCBhbmQgdGhlIHN0ZXAgbWFuaWZlc3Qgb2YgcGx1Z2luIGRpZ2VzdHMgaXQgcnVucy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6d3JpdGVgIHNvIHRoZSBDb2RlQnVpbGQgc3ludGggY2FuIGtlZXAgdGhhdCByZWNvcmRcbiAgLy8gY3VycmVudCB3aXRoIGEgY3JlZGVudGlhbCB0aGF0IGNhbiBkbyBub3RoaW5nIGVsc2Ug4oCUIGEga2V5IGhvbGRpbmdcbiAgLy8gYHBpcGVsaW5lczp3cml0ZWAgY291bGQgcmV3cml0ZSBldmVyeSBwaXBlbGluZSB0aGUgb3JnIG93bnMuIFBlb3BsZSBnZXQgaXRcbiAgLy8gYmVzaWRlIGBwaXBlbGluZXM6d3JpdGVgICh0aGUgTWVtYmVyIGJ1bmRsZSk7IHRoZSBgcGlwZWxpbmUtcmVnaXN0ZXJgXG4gIC8vIHNlcnZpY2UgYWNjb3VudCBob2xkcyBpdCBhbG9uZS5cbiAgfCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnXG4gIC8vIEdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcy4gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6KmAgc28gYSBwbGF0Zm9ybVxuICAvLyB0ZWFtIGNhbiBjdXJhdGUgdGhlIHN0YXJ0ZXIgY2F0YWxvZyBXSVRIT1VUIHdyaXRlIGFjY2VzcyB0byBldmVyeSBwaXBlbGluZVxuICAvLyAoYW5kIHZpY2UgdmVyc2EpLiBgOnB1Ymxpc2hgIG1hcHMgdG8gdGhlXG4gIC8vIHRlbXBsYXRlIGxhZGRlcidzIGBwdWJsaWNgIHJ1bmc7IGBvcmdgIGFuZCBgcHJpdmF0ZWAgbmVlZCBvbmx5IGA6d3JpdGVgLlxuICB8ICd0ZW1wbGF0ZXM6cmVhZCdcbiAgfCAndGVtcGxhdGVzOndyaXRlJ1xuICB8ICd0ZW1wbGF0ZXM6cHVibGlzaCdcbiAgLy8gUGx1Z2luc1xuICB8ICdwbHVnaW5zOnJlYWQnXG4gIHwgJ3BsdWdpbnM6d3JpdGUnXG4gIHwgJ3BsdWdpbnM6cHVibGlzaCdcbiAgLy8gUGx1Z2luIGVjb3N5c3RlbSAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIE9yZy1hc3NpZ25hYmxlOlxuICAvLyAgLSBgcGx1Z2luczppbnN0YWxsYCAgICAgICAg4oCUIGluc3RhbGwvdXBncmFkZS91bmluc3RhbGwgbGlzdGluZ3MgKG9yIFJFUVVFU1RcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5zdGFsbCB3aGVuIHRoZSBvcmcncyBwb2xpY3kgbmVlZHMgYXBwcm92YWwpLlxuICAvLyAgLSBgcGx1Z2luX2luc3RhbGxzOm1hbmFnZWAg4oCUIHRoZSBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgKyBkZWNpZGluZyBpbnN0YWxsXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzIFdJVEhJTiB0aGUgb3JnIChvcmctbG9jYWwgb25seSkuXG4gIC8vICAtIGBwdWJsaXNoZXJzOm1hbmFnZWAgICAgICDigJQgdGhlIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlICsgc3VibWl0dGluZ1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY29zeXN0ZW0gcmVxdWVzdHMgKGV2ZXJ5IGRlY2lzaW9uIGlzIHN5c3RlbS1vcmcpLlxuICAvLyBTeXN0ZW0tb3JnLW9ubHkgKHNlZSBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlMpOlxuICAvLyAgLSBgcGx1Z2luczptb2RlcmF0ZWAgICAgICAg4oCUIGRlY2lkZSBwdWJsaXNoIHJlcXVlc3RzLCBtb2RlcmF0ZSwgeWFuaywgYWR2aXNvcmllcy5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6dmVyaWZ5YCAgICAgIOKAlCBwdWJsaXNoZXIgdGllcnMsIHByb2ZpbGUgY2hhbmdlcywgdHJhbnNmZXJzLlxuICB8ICdwbHVnaW5zOmluc3RhbGwnXG4gIHwgJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnXG4gIHwgJ3B1Ymxpc2hlcnM6bWFuYWdlJ1xuICB8ICdwbHVnaW5zOm1vZGVyYXRlJ1xuICB8ICdwdWJsaXNoZXJzOnZlcmlmeSdcbiAgLy8gUGxhdGZvcm0gb3BlcmF0aW9ucyAoc3lzdGVtLW9yZyBvbmx5KS4gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlc1xuICAvLyB0aGF0IHVzZWQgdG8gcmVxdWlyZSB0aGUgc3VwZXJhZG1pbiBGTEFHLCBzbyBhIGRlcGxveW1lbnQgY2FuIHN0YWZmIHRoZW1cbiAgLy8gd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiBoYW5kaW5nIG91dCBpbXBsaWNpdC1hbGwuIFNwbGl0IGJlY2F1c2UgdGhlIHR3byBjYXJyeVxuICAvLyBkaWZmZXJlbnQgcmlzazogcmVhZGluZyB3aGF0IGEgZGVwbG95IGNvbmZpZ3VyZWQgaXMgbm90IHRoZSBzYW1lIGFzIG1vdmluZ1xuICAvLyBhbm90aGVyIG9yZ2FuaXNhdGlvbidzIG1vbmV5LlxuICB8ICdwbGF0Zm9ybTpyZWFkJ1xuICAvLyBUaGUgY3Jvc3MtdGVuYW50IE9SRyBMSVNULCBzcGxpdCBvdXQgb2YgYHBsYXRmb3JtOnJlYWRgIGJlY2F1c2UgdGhhdCBvbmVcbiAgLy8gcGVybWlzc2lvbiB3YXMgZG9pbmcgdHdvIGpvYnMgd2l0aCBkaWZmZXJlbnQgYmxhc3QgcmFkaWk6IHJlYWRpbmcgd2hhdCBhXG4gIC8vIERFUExPWSB3YXMgY29uZmlndXJlZCB0byBkbyAoUkxTIG1vZGUsIEtNUyBwb3N0dXJlLCB0aGUgcmVuZGVyZWQgYWxlcnRcbiAgLy8gcnVsZXMpIGFuZCByZWFkaW5nIHRoZSByb3N0ZXIgb2YgZXZlcnkgQ1VTVE9NRVIuIFRocmVlIG9mIHRoZSBmb3VyIGpvYlxuICAvLyBidW5kbGVzIGNhcnJpZWQgaXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIHdhbnRlZCB0aGUgZGVwbG95IGludGVybmFscyDigJRcbiAgLy8gQ29uc29sZSBBZG1pbmlzdHJhdG9yIGFuZCBTdXBwb3J0IEFnZW50IGdvdCB0aGVtIHB1cmVseSBiZWNhdXNlIHRoZXkgbmVlZGVkXG4gIC8vIHRvIGZpbmQgYW4gb3JnIGJ5IG5hbWUuXG4gIC8vXG4gIC8vIFNhbWUgbWlzdGFrZSwgYW5kIHNhbWUgZml4LCBhcyBgY29uc29sZXM6ZGF0YXN0b3JlYCBiZWZvcmUgaXQgd2FzIHNwbGl0IGJ5XG4gIC8vIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cy5cbiAgfCAnb3JnczpyZWFkJ1xuICB8ICdiaWxsaW5nOm9wZXJhdGUnXG4gIC8vIFRoZSBvcGVyYXRvciBjb25zb2xlcywgc3BsaXQgYnkgQkxBU1QgUkFESVVTIHJhdGhlciB0aGFuIGJ5IHByb2R1Y3QuIFRocmVlXG4gIC8vIHBlcm1pc3Npb25zIGZvciBmaXZlIGNvbnNvbGVzLCBiZWNhdXNlIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cyBkaWZmZXJzXG4gIC8vIGJ5IGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBhdCBlYWNoIHN0ZXA6XG4gIC8vXG4gIC8vICAtIGBvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbmAg4oCUIEdyYWZhbmEgYW5kIEtpYWxpLiBSZWFkLW9ubHkgdmlld3M7IHRoZSB3b3JzdFxuICAvLyAgICBvdXRjb21lIG9mIGEgbWlzdGFrZW4gZ3JhbnQgaXMgc2VlaW5nIHRlbGVtZXRyeS5cbiAgLy8gIC0gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgICAgIOKAlCBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzLiBBIGRhdGFiYXNlIHNoZWxsXG4gIC8vICAgIG92ZXIgZXZlcnkgdGVuYW50J3Mgcm93czogaXQgY2FuIHJlYWQgYW5kIHJld3JpdGUgdGVuYW50IGRhdGEsIGJ1dCB0aGVcbiAgLy8gICAgYXVkaXQgY2hhaW4gbGl2ZXMgZWxzZXdoZXJlLCBzbyB0aGUgZGFtYWdlIGlzIHJlY29yZGVkLlxuICAvLyAgLSBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCAgIOKAlCB0aGUgUnVzdEZTIChTMykgY29uc29sZS4gSXQgY2FuIExJU1QgYW5kXG4gIC8vICAgIERFTEVURSBvYmplY3RzIGluIHRoZSByZWdpc3RyeSwgTG9raSwgVGhhbm9zLCBwbHVnaW4tYnVpbGQgYW5kXG4gIC8vICAgIGF1ZGl0LWNoYWluIGJ1Y2tldHMuIFNwbGl0IGZyb20gdGhlIHBhaXIgYWJvdmUgYmVjYXVzZSB0aGUgdHdvIGFyZSB0aGVcbiAgLy8gICAgdHdvIEhBTFZFUyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlIGRlc2lnbjogdGhlIGNoYWluJ3MgSE1BQyBrZXlcbiAgLy8gICAgbGl2ZXMgb3V0c2lkZSB0aGUgREIsIHNvIGEgTW9uZ28gc2hlbGwgY2FuIHRhbXBlciBidXQgY2Fubm90IGZvcmdlIGFcbiAgLy8gICAgY29uc2lzdGVudCBjaGFpbiDigJQgZXhjZXB0IGJ5IHRydW5jYXRpbmcgdGhlIHRhaWwsIHdoaWNoIGEgY2hhaW4gY2Fubm90XG4gIC8vICAgIHNlZSBmcm9tIHRoZSBpbnNpZGUsIGFuZCB0aGUgZGVmZW5jZSBhZ2FpbnN0IFRIQVQgaXMgdGhlIHNpZ25lZFxuICAvLyAgICBjaGFpbi1oZWFkIGV4cG9ydCB0byBvYmplY3Qgc3RvcmFnZS4gT25lIHNoZWxsIGNhbiB0cnVuY2F0ZTsgdGhlIG90aGVyXG4gIC8vICAgIGNhbiBkZWxldGUgdGhlIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uLlxuICAvL1xuICAvLyBBbGwgdGhyZWUgYXJlIHN5c3RlbS1vcmctb25seSwgc28gbm9uZSBjYW4gYmUgaGVsZCBpbnNpZGUgYSB0ZW5hbnQsIGFuZCBvbmx5XG4gIC8vIHRoZSBmaXJzdCBpcyBpbiB0aGUgUGxhdGZvcm0gT3BlcmF0b3IgYnVuZGxlOiBzdGFmZmluZyBhbiBvcGVyYXRvciBtdXN0IG5ldmVyXG4gIC8vIGhhbmQgb3ZlciBhIGRhdGEgc2hlbGwgYXMgYSBzaWRlIGVmZmVjdC4gR3JhbnRpbmcgZWl0aGVyIG9mIHRoZSBvdGhlciB0d28gaXNcbiAgLy8gYSBzZXBhcmF0ZSwgZXhwbGljaXQgYWN0IGJ5IGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBSb2xlIGZvciBleGFjdGx5IHRoYXRcbiAgLy8gcHVycG9zZS5cbiAgLy9cbiAgLy8gV0hBVCBUSEUgU1BMSVQgRE9FUyBOT1QgRE8sIHNvIG5vYm9keSBidWlsZHMgb24gaXQ6IGl0IGlzIG5vdCBhIGNvbnRhaW5tZW50XG4gIC8vIGJvdW5kYXJ5LiBSb2xlcyBsaXZlIGluIE1vbmdvIChgY29sbGVjdGlvbjogJ3JvbGVzJ2ApLCBzbyBhXG4gIC8vIGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGhvbGRlciBjYW4gd3JpdGUgdGhhdCBjb2xsZWN0aW9uIGFuZCBncmFudCB0aGVtc2VsdmVzXG4gIC8vIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIOKAlCBkYXRhc3RvcmUgY29udGFpbnMgb2JqZWN0c3RvcmUgYnkgZXNjYWxhdGlvbi4gVGhlXG4gIC8vIHNwbGl0IGV4cHJlc3NlcyBpbnRlbnQsIGtlZXBzIHRoZSBkZWZhdWx0IGdyYW50IHNtYWxsIGFuZCBnaXZlcyBlYWNoIGNsYXNzXG4gIC8vIGl0cyBvd24gcmVmdXNhbCBzaWduYWwuIFdoYXQgYWN0dWFsbHkgcHJvdGVjdHMgdGhlIGF1ZGl0IGhlYWRzIGZyb20gd2hvZXZlclxuICAvLyBvcGVucyB0aGF0IGNvbnNvbGUgaXMgUzMgT2JqZWN0IExvY2sgd2l0aCBhIHJldGFpbi11bnRpbC1kYXRlXG4gIC8vIChgcGxhdGZvcm0vc3JjL3NlcnZpY2VzL2F1ZGl0LWhlYWQtZXhwb3J0LnRzYCksIHdoaWNoIGhvbGRzIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gYW55IHBlcm1pc3Npb24gaGVyZS5cbiAgfCAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nXG4gIHwgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbidcbiAgfCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJ1xuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgfCAnb25jYWxsOm1hbmFnZSdcbiAgLy8gVGhlIHZlbmRvcidzIG90aGVyIG9wZXJhdGlvbmFsIFRBU0tTIChzeXN0ZW0gb3JnIG9ubHkpLiBFYWNoIGV4aXN0cyBzbyBhXG4gIC8vIHN1cGVyYWRtaW4gY2FuIHN0YWZmIG9uZSBqb2Igd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiB0aGUgc3VwZXJhZG1pbiBmbGFnIOKAlFxuICAvLyBiZWZvcmUgdGhlc2UsIDM0IHJvdXRlcyB3ZXJlIHJlYWNoYWJsZSBvbmx5IGJ5IHNvbWVvbmUgd2hvIGFsc28gaGVsZFxuICAvLyBpbXBlcnNvbmF0aW9uLCBhIGRhdGFiYXNlIHNoZWxsIGFuZCB0aGUgYWJpbGl0eSB0byBtaW50IGFub3RoZXIgc3VwZXJhZG1pbi5cbiAgLy9cbiAgLy8gU3VwcG9ydCBkZXNrLCBzcGxpdCBpbiB0d28gYmVjYXVzZSB0aGUgY29udGVudCBpcyByZXVzZWQgYWNyb3NzIGV2ZXJ5XG4gIC8vIGN1c3RvbWVyIHdoaWxlIGEgY2FzZSBiZWxvbmdzIHRvIG9uZTogYHN1cHBvcnRfY2FzZXM6d3JpdGVgIGlzIHRoZSBkZXNrJ3NcbiAgLy8gb3duIHdvcmsgKHRyaWFnZSwgYXNzaWdubWVudCwgc2V2ZXJpdHksIGludGVybmFsIG5vdGVzLCByZWNvcmRpbmcgYW5cbiAgLy8gaW5jaWRlbnQgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QpLCBgc3VwcG9ydF9jb250ZW50OndyaXRlYCBpcyBhdXRob3JpbmdcbiAgLy8gdGhlIGNhbm5lZCByZXBsaWVzLiBFYWNoIGdhdGVzIGl0cyB0YXNrJ3MgUkVBRFMgYXMgd2VsbCBhcyBpdHMgd3JpdGVzLFxuICAvLyBhZ2FpbnN0IHRoZSB1c3VhbCBjb252ZW50aW9uLCBiZWNhdXNlIHRoZXNlIHRhYmxlcyBjYXJyeSBubyBgb3JnX2lkYCDigJQgdGhlcmVcbiAgLy8gaXMgbm8gdGVuYW5jeSBib3VuZGFyeSB1bmRlcm5lYXRoIHRvIGZhbGwgYmFjayBvbi5cbiAgfCAnc3VwcG9ydF9jYXNlczp3cml0ZSdcbiAgfCAnc3VwcG9ydF9jb250ZW50OndyaXRlJ1xuICAvLyBDcm9zcy10ZW5hbnQgc3Vic2NyaXB0aW9ucy4gUmVhZCBpcyBzcGxpdCBmcm9tIHdyaXRlIGJlY2F1c2UgYSByZWFkLW9ubHlcbiAgLy8gaG9sZGVyIGlzIGEgcmVhbCBqb2IgaGVyZTogc29tZW9uZSB3aG8gcmVwb3J0cyBvbiByZXZlbnVlIGFuZCBwbGFuIG1peFxuICAvLyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hhbmdlIGEgcGxhbiBvciBjYW5jZWwgb25lLlxuICB8ICdzdWJzY3JpcHRpb25zOnJlYWQnXG4gIHwgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJ1xuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gIHwgJ29yZ3M6bWFuYWdlJ1xuICAvLyBDcm9zcy10ZW5hbnQgcXVvdGEgd3JpdGVzLiBUaGUgbWF0Y2hpbmcgcmVhZHMgKGAvcXVvdGFzL2FsbGAsIGAvYXQtcmlza2ApXG4gIC8vIHJpZGUgYHBsYXRmb3JtOnJlYWRgIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdG9yIGRhc2hib2FyZCwgc28gc29tZW9uZVxuICAvLyB3YXRjaGluZyBmb3IgZXhoYXVzdGlvbiBkb2VzIG5vdCBuZWVkIHRoZSBhYmlsaXR5IHRvIHJhaXNlIGEgbGltaXQuXG4gIHwgJ3F1b3RhczptYW5hZ2UnXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICB8ICdwbHVnaW5fcXVldWU6bWFuYWdlJ1xuICAvLyBDb21wbGlhbmNlXG4gIHwgJ2NvbXBsaWFuY2U6cmVhZCdcbiAgfCAnY29tcGxpYW5jZTp3cml0ZSdcbiAgLy8gTWVtYmVycyAmIGFjY2Vzc1xuICB8ICdtZW1iZXJzOm1hbmFnZSdcbiAgfCAncm9sZXM6bWFuYWdlJ1xuICB8ICdpbnZpdGF0aW9uczptYW5hZ2UnXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgfCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnXG4gIC8vIE9ic2VydmFiaWxpdHlcbiAgfCAnZGFzaGJvYXJkczpyZWFkJ1xuICB8ICdkYXNoYm9hcmRzOndyaXRlJ1xuICB8ICdvYnNlcnZhYmlsaXR5OnJlYWQnXG4gIHwgJ29ic2VydmFiaWxpdHk6d3JpdGUnXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICB8ICdsb2dzOmV4cG9ydCdcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gIHwgJ2F1ZGl0OnJlYWQnXG4gIC8vIEluc2lnaHRzXG4gIHwgJ3JlcG9ydHM6cmVhZCdcbiAgfCAncmVwb3J0czpyb2xsdXAnXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHMuIGByZXBvcnRzOnJlYWRgIHN0YXlzIHRoZSBGUkVFIG9uLWRlbWFuZCBkYXNoYm9hcmQgcmVhZDtcbiAgLy8gdGhlc2UgdHdvIGFyZSB0aGUgYWRkLW9uJ3Mgd3JpdGUgc3VyZmFjZSDigJQgYGF1dGhvcmAgc2F2ZXMvc2NoZWR1bGVzL2RyYWZ0cyBhXG4gIC8vIHJlcG9ydCwgYHNoYXJlYCBwdWJsaXNoZXMgaXQgYmV5b25kIHRoZSBwbGF0Zm9ybSAoUERGLCBlbWFpbCwgc2hhcmUgbGlua3MpLlxuICAvLyBTcGxpdCBiZWNhdXNlIHB1Ymxpc2hpbmcgZXh0ZXJuYWxseSBpcyBhIGRpZmZlcmVudCByaXNrIGZyb20gY29tcG9zaW5nOlxuICAvLyBhIGxlYWQgY2FuIGJlIGFsbG93ZWQgdG8gYnVpbGQgcmVwb3J0cyB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZW1haWwgdGhlbSBvdXQuXG4gIHwgJ3JlcG9ydHM6d3JpdGUnXG4gIHwgJ3JlcG9ydHM6cHVibGlzaCdcbiAgLy8gTWVzc2FnaW5nXG4gIHwgJ21lc3NhZ2VzOnJlYWQnXG4gIHwgJ21lc3NhZ2VzOndyaXRlJ1xuICAvLyBCaWxsaW5nICYgcXVvdGFzXG4gIHwgJ2JpbGxpbmc6cmVhZCdcbiAgfCAnYmlsbGluZzptYW5hZ2UnXG4gIHwgJ3F1b3RhczpyZWFkJ1xuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgfCAnaW1wZXJzb25hdGlvbjpvcGVuJ1xuICB8ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnXG4gIHwgJ3RlYW1fYWNjZXNzOm9wZW4nXG4gIC8vIFJlZ2lzdHJ5LiBUaHJlZSBydW5ncywgYmVjYXVzZSB0aGUgd3JpdGUgaGFsZiBoYXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gIC8vIGJsYXN0IHJhZGlpOiBgd3JpdGVgIENPUElFUyBhIG1hbmlmZXN0IChhZGRpdGl2ZSDigJQgaXQgY3JlYXRlcyBhIHRhZyxcbiAgLy8gbm90aGluZyBzdG9wcyByZXNvbHZpbmcpLCBgcHVyZ2VgIERFTEVURVMgb25lIChhIHRlbmFudCdzIHBpcGVsaW5lIG9yIGFcbiAgLy8gZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2UgY2FuIHN0b3AgcmVzb2x2aW5nLCB3aXRoIG5vIHVuZG8pLlxuICB8ICdyZWdpc3RyeTpyZWFkJ1xuICB8ICdyZWdpc3RyeTp3cml0ZSdcbiAgfCAncmVnaXN0cnk6cHVyZ2UnXG4gIC8vIE9yZ2FuaXphdGlvbiBzZXR0aW5ncy4gRm91ciBSRVNPVVJDRVMsIGVhY2ggd2l0aCB0aGUgYDp3cml0ZWAgYWN0aW9uLCByYXRoZXJcbiAgLy8gdGhhbiBvbmUgYG9yZ2AgcmVzb3VyY2Ugd2l0aCBmb3VyIG5vdW4tc2hhcGVkIGFjdGlvbnMg4oCUIHRoZXNlIGFyZSB0aGUgb3JnJ3NcbiAgLy8gb3duIGNvbmZpZ3VyYXRpb24gc3RhdGUsIHdoaWNoIGlzIHdoYXQgYDp3cml0ZWAgbWVhbnMgaGVyZSAoYDptYW5hZ2VgIGlzXG4gIC8vIHJlc2VydmVkIGZvciBhZG1pbmlzdGVyaW5nIGEgY29sbGVjdGlvbiBvZiBvdGhlciBlbnRpdGllczogbWVtYmVycywgcm9sZXMsXG4gIC8vIGludml0YXRpb25zLCBzZXJ2aWNlIGFjY291bnRzLCBiaWxsaW5nKS5cbiAgLy9cbiAgLy8gIC0gYG9yZ19zZXR0aW5nczp3cml0ZWAgICAgICDigJQgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgKyBBSSBjb25maWcuXG4gIC8vICAtIGBvcmdfaWRwOndyaXRlYCAgICAgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZ19rbXM6d3JpdGVgICAgICAgICAgICDigJQgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IGNvbmZpZ3VyYXRpb25cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5zaXRpdmU6IGNvbnRyb2xzIGVuY3J5cHRpb24gb2Ygb3JnIGRhdGEpLlxuICAvLyAgLSBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIOKAlCB0aGUgaW1wZXJzb25hdGlvbiBwb2xpY3kgKHNlbnNpdGl2ZTogY29udHJvbHNcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobyBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBhIG1lbWJlcikuXG4gIC8vXG4gIC8vIFRoZSBsYXN0IHRocmVlIHdlcmUgc3BsaXQgT1VUIG9mIGBvcmdfc2V0dGluZ3M6d3JpdGVgIHNvIGEgY3VzdG9tIHJvbGUgY2FuXG4gIC8vIGdyYW50IGdlbmVyYWwgc2V0dGluZ3MgV0lUSE9VVCB0aGUgc2Vuc2l0aXZlIHN1cmZhY2VzIOKAlCBhIFwic2V0dGluZ3MgbWFuYWdlclwiXG4gIC8vIHJvbGUgZm9yIG9yZyBuYW1lIG9yIEFJIHByb3ZpZGVyIG11c3Qgbm90IGFsc28gYmUgYWJsZSB0byBzd2l0Y2ggdGhlIG9yZyB0b1xuICAvLyBgb3BlbmAuIEFsbCByZW1haW4gb3JnLWFzc2lnbmFibGUgYW5kIGFyZSBzZWVkZWQgaW50byB0aGUgYWRtaW4vb3duZXJcbiAgLy8gYnVuZGxlcyAodmlhIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TKSBzbyBleGlzdGluZyBhZG1pbnMga2VlcCBmdWxsXG4gIC8vIGFjY2Vzcy5cbiAgfCAnb3JnX3NldHRpbmdzOndyaXRlJ1xuICB8ICdvcmdfaWRwOndyaXRlJ1xuICB8ICdvcmdfa21zOndyaXRlJ1xuICB8ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZSc7XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgYWN0aW9ucyBhIHBlcm1pc3Npb24gaWQgbWF5IGVuZCBpbiDigJQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZVxuICogYHJlc291cmNlOmFjdGlvbmAgc3RyYXRlZ3kgdGhlIGRvY3MgZGVzY3JpYmUuXG4gKlxuICogSXQgaXMgY2xvc2VkIGZvciBvbmUgY29uY3JldGUgcmVhc29uOiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIChmcm9udGVuZFxuICogYGxpYi9hdXRoLWhlbHBlcnMudHNgKSBjbGFzc2lmaWVzIHJlYWQgdnMgd3JpdGUgQlkgU1VGRklYLCBhbmQgdGhhdCBpcyB3aGF0XG4gKiBkaXNhYmxlcyBldmVyeSB3cml0ZSBhZmZvcmRhbmNlIGR1cmluZyBhIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIEFcbiAqIG5vdW4tc2hhcGVkIGFjdGlvbiAodGhlIGZvcm1lciBgb3JnOnNldHRpbmdzYCBhbmQgYGNvbnNvbGVzOmRhdGFzdG9yZWApIGNhbm5vdCBiZSBjbGFzc2lmaWVkXG4gKiBieSBuYW1lLCBzbyBlYWNoIG9uZSBoYWQgdG8gYmUgaGFuZC1saXN0ZWQg4oCUIGFuZCBhIHBlcm1pc3Npb24gYWRkZWQgd2l0aG91dFxuICogcmVtZW1iZXJpbmcgdGhhdCBsaXN0IHJlbmRlcnMgYW4gZW5hYmxlZCBjb250cm9sIHRoYXQgZGVhZC1lbmRzIG9uIGEgNDAzLlxuICpcbiAqIFJlYWRzIGFyZSBgOnJlYWRgIGFuZCBgOnJvbGx1cGAgKGEgcmVhZC1WSVNJQklMSVRZIHNjb3BlKS4gRXZlcnl0aGluZyBlbHNlIGlzXG4gKiBhIHdyaXRlLiBUaGUgZml2ZSBkb21haW4gdmVyYnMgYXJlIGtlcHQgYmVjYXVzZSBlYWNoIG5hbWVzIGFuIGFjdGlvbiB3aXRoIG5vXG4gKiBzeW5vbnltIGluIHRoaXMgdm9jYWJ1bGFyeSDigJQgYDpleHBvcnRgIGlzIGVncmVzcyByYXRoZXIgdGhhbiBtdXRhdGlvbixcbiAqIGA6aW5zdGFsbGAgaXMgY29uc3VtcHRpb24gcmF0aGVyIHRoYW4gYXV0aG9yaW5nLCBgOm1vZGVyYXRlYCBhbmQgYDp2ZXJpZnlgIGFyZVxuICogZWNvc3lzdGVtIGRlY2lzaW9ucywgYW5kIGA6b3BlcmF0ZWAgbW92ZXMgYW5vdGhlciB0ZW5hbnQncyBtb25leS5cbiAqXG4gKiBgUEVSTUlTU0lPTl9JRF9TSEFQRWAgYW5kIHRoaXMgbGlzdCBhcmUgYXNzZXJ0ZWQgb3ZlciB0aGUgd2hvbGUgY2F0YWxvZyBpblxuICogYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCwgc28gYWRkaW5nIGFuIG9mZi1zdHJhdGVneSBpZCBmYWlsc1xuICogdGhlcmUgcmF0aGVyIHRoYW4gYXQgYSA0MDMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0FDVElPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAncmVhZCcsICdyb2xsdXAnLFxuICAnd3JpdGUnLCAnbWFuYWdlJywgJ3B1Ymxpc2gnLCAnb3BlbicsXG4gICdleHBvcnQnLCAnaW5zdGFsbCcsICdtb2RlcmF0ZScsICd2ZXJpZnknLCAnb3BlcmF0ZScsICdwdXJnZScsICdhcHByb3ZlJyxcbl07XG5cbi8qKiBgcmVzb3VyY2U6YWN0aW9uYCwgd2hlcmUgcmVzb3VyY2UgaXMgYHNuYWtlX2Nhc2VgIGFuZCBhY3Rpb24gaXMgaW4ge0BsaW5rIFBFUk1JU1NJT05fQUNUSU9OU30uICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9JRF9TSEFQRSA9IC9eW2Etel1bYS16MC05X10qOlthLXpdKyQvO1xuXG4vKiogQWxsIHZhbGlkIHBlcm1pc3Npb25zIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIgaW4gdGhlIHBpY2tlcikuICovXG5leHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuICAndGVtcGxhdGVzOnJlYWQnLCAndGVtcGxhdGVzOndyaXRlJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6cmVhZCcsICdwbHVnaW5zOndyaXRlJywgJ3BsdWdpbnM6cHVibGlzaCcsXG4gICdwbHVnaW5zOmluc3RhbGwnLCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsICdwdWJsaXNoZXJzOm1hbmFnZScsXG4gICdwbHVnaW5zOm1vZGVyYXRlJywgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgJ3BsYXRmb3JtOnJlYWQnLCAnb3JnczpyZWFkJywgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgJ29uY2FsbDptYW5hZ2UnLFxuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJywgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJywgJ3F1b3RhczptYW5hZ2UnLCAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gICdjb21wbGlhbmNlOnJlYWQnLCAnY29tcGxpYW5jZTp3cml0ZScsXG4gICdtZW1iZXJzOm1hbmFnZScsICdyb2xlczptYW5hZ2UnLCAnaW52aXRhdGlvbnM6bWFuYWdlJywgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsICdkYXNoYm9hcmRzOndyaXRlJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsICdvYnNlcnZhYmlsaXR5OndyaXRlJyxcbiAgJ2xvZ3M6ZXhwb3J0JywgJ2F1ZGl0OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJywgJ3JlcG9ydHM6cm9sbHVwJywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJyxcbiAgJ3F1b3RhczpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OnJlYWQnLCAncmVnaXN0cnk6d3JpdGUnLCAncmVnaXN0cnk6cHVyZ2UnLFxuICAnaW1wZXJzb25hdGlvbjpvcGVuJywgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgJ29yZ19zZXR0aW5nczp3cml0ZScsICdvcmdfaWRwOndyaXRlJywgJ29yZ19rbXM6d3JpdGUnLCAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBmdW5jdGlvbnMgdGhhdCB0YWtlIGEge0BsaW5rIFBlcm1pc3Npb259IGFuZCBkZWNpZGUgYWNjZXNzLlxuICpcbiAqIFwiSXMgcGVybWlzc2lvbiBYIGVuZm9yY2VkIGFueXdoZXJlP1wiIGhhcyB0byBiZSBhbnN3ZXJhYmxlIHN0YXRpY2FsbHksIHdoaWNoXG4gKiBhIGdyZXAgY2FuJ3QgZG86IGZvdXIgZGlmZmVyZW50IGNhbGwgc2hhcGVzIGNvbnN1bWUgYSBwZXJtaXNzaW9uIGlkXG4gKiAoYHJlcXVpcmVQZXJtaXNzaW9uKCd4JylgIGF0IGEgcm91dGUsIGB1c2VySGFzUGVybWlzc2lvbihyZXEsICd4JylgIGluc2lkZSBhXG4gKiBjb250cm9sbGVyLCBhbmQgYHJlc29sdmVWaXNpYmlsaXR5KHJlcSwgdiwgJ3gnKWAgL1xuICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3Mo4oCmLCAneCcpYCBpbiB0aGUgdmlzaWJpbGl0eSBoZWxwZXJzKSwgc28gYSBuYWl2ZVxuICogZ3JlcCBmb3IgYSByb3V0ZS1sZXZlbCBnYXRlIHJlcG9ydHMgYHRlbXBsYXRlczpwdWJsaXNoYCBhcyBVTkVORk9SQ0VEIHdoZW4gaXRcbiAqIGlzIGluIGZhY3QgZW5mb3JjZWQgb24gZXZlcnkgdGVtcGxhdGUgcHVibGlzaC5cbiAqXG4gKiBUaGV5IGFsbCBib3R0b20gb3V0IGluIGB1c2VySGFzUGVybWlzc2lvbmAsIHNvIHRoZSBSVU5USU1FIHByaW1pdGl2ZSB3YXNcbiAqIGFscmVhZHkgb25lLiBUaGlzIGNvbnN0YW50IG1ha2VzIHRoZSBTVEFUSUMgc3VyZmFjZSBvbmUgYXMgd2VsbDogaXQgbmFtZXNcbiAqIGV2ZXJ5IGVudHJ5IHBvaW50LCBzbyBgcGVybWlzc2lvbi1jb3ZlcmFnZS50ZXN0LnRzYCBjYW4gZW51bWVyYXRlIHRoZSBjYXRhbG9nXG4gKiBhbmQgcmVwb3J0IGVhY2ggcGVybWlzc2lvbidzIGVuZm9yY2VtZW50IHNpdGVzIHdpdGhvdXQgZ3Vlc3NpbmcuIEEgbmV3IGdhdGVcbiAqIHRoYXQgdGFrZXMgYSBgUGVybWlzc2lvbmAgbXVzdCBiZSBsaXN0ZWQgaGVyZSwgb3IgdGhlIGNvdmVyYWdlIHJlcG9ydCBzdGFydHNcbiAqIGx5aW5nIGFib3V0IHRoZSBwZXJtaXNzaW9ucyBvbmx5IHRoYXQgZ2F0ZSBlbmZvcmNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fR0FURVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAvLyBNaWRkbGV3YXJlIGdhdGVzIChyb3V0ZSBsZXZlbCkg4oCUIGFsbCBhbnktb2YgZXhjZXB0IHJlcXVpcmVBbGxQZXJtaXNzaW9ucy5cbiAgJ3JlcXVpcmVQZXJtaXNzaW9uJyxcbiAgJ3JlcXVpcmVBbGxQZXJtaXNzaW9ucycsXG4gICdyZXF1aXJlUGVybWlzc2lvbk9yU2VydmljZScsXG4gIC8vIFRoZSBwbHVnaW4tZWNvc3lzdGVtIGdvdmVybmFuY2UgY2hhaW4gKHN5c3RlbSBvcmcgKyBwZXJtaXNzaW9uICsgYWFsMikuXG4gICdyZXF1aXJlU3lzdGVtT3JnUGVybWlzc2lvbicsXG4gIC8vIFRoZSBzaW5nbGUgcnVudGltZSBwcmltaXRpdmUgZXZlcnkgZ2F0ZSBhYm92ZSBkZWxlZ2F0ZXMgdG87IGFsc28gY2FsbGVkXG4gIC8vIGRpcmVjdGx5IHdoZXJlIGEgY29udHJvbGxlciBicmFuY2hlcyBvbiBhIGNhcGFiaWxpdHkgcmF0aGVyIHRoYW4gcmVqZWN0aW5nLlxuICAndXNlckhhc1Blcm1pc3Npb24nLFxuICAnaGFzUGVybWlzc2lvbicsXG4gIC8vIFZpc2liaWxpdHkgaGVscGVycyDigJQgdGhleSB0YWtlIHRoZSBlbnRpdHkncyBQVUJMSVNIIHBlcm1pc3Npb24uXG4gICdyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ2NoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ3Jlc29sdmVWaXNpYmlsaXR5JyxcbiAgLy8gcXVvdGEncyBvd24gd3JhcHBlci4gSXQgZGVsZWdhdGVzIHRvIGByZXF1aXJlUGVybWlzc2lvbmAsIGJ1dCBpdCB0YWtlcyB0aGVcbiAgLy8gaWQgYXMgYW4gT1BUSU9OIChgYXV0aG9yaXplT3JnKHsgcGVybWlzc2lvbjogJ3F1b3RhczptYW5hZ2UnIH0pYCkgYmVjYXVzZSBpdFxuICAvLyBhbHNvIGNhbm9uaWNhbGl6ZXMgdGhlIGA6b3JnSWRgIHBhcmFtLCB3aGljaCB0aGUgcm91dGUgY2Fubm90IGRyb3AuIFdpdGhvdXRcbiAgLy8gdGhpcyBlbnRyeSB0aGUgY292ZXJhZ2Ugc2NhbiByZXBvcnRlZCBgcXVvdGFzOm1hbmFnZWAgYXMgZW5mb3JjZWQgbm93aGVyZS5cbiAgJ2F1dGhvcml6ZU9yZycsXG5dO1xuXG4vKipcbiAqIERpc3BsYXkgbWV0YWRhdGEgZm9yIG9uZSBwZXJtaXNzaW9uOiB0aGUgbGFiZWwgKyBkZXNjcmlwdGlvbiB0aGVcbiAqIHBlcm1pc3Npb24tcGlja2VyIFVJIHNob3dzLCBhbmQgdGhlIGNhdGVnb3J5IGl0IGdyb3VwcyB1bmRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uTWV0YSB7XG4gIGlkOiBQZXJtaXNzaW9uO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwZXJtaXNzaW9uIGNhdGFsb2cgd2l0aCBkaXNwbGF5IG1ldGFkYXRhLCBpbiBwaWNrZXIgb3JkZXIuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIFNJTkdMRSBjYXRhbG9nIGZvciBiYWNrZW5kIGFuZCBicm93c2VyIGFsaWtlOiBpdCBoYXMgbm9cbiAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzICh0aGUgb25seSBpbXBvcnQgaXMgYSB0eXBlKSwgc28gdGhlIGZyb250ZW5kIGltcG9ydHMgaXRcbiAqIHRocm91Z2ggdGhlIGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9wZXJtaXNzaW9uc2Agc3VicGF0aCBpbnN0ZWFkIG9mIGtlZXBpbmdcbiAqIGEgaGFuZC1tYWludGFpbmVkIG1pcnJvci4gRXZlcnkgaWQgaW4ge0BsaW5rIEFMTF9QRVJNSVNTSU9OU30gbXVzdCBhcHBlYXIgaGVyZVxuICogZXhhY3RseSBvbmNlIChhc3NlcnRlZCBieSBgcGVybWlzc2lvbnMudGVzdC50c2ApLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9DQVRBTE9HOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdID0gW1xuICB7IGlkOiAncGlwZWxpbmVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdWaWV3IHBpcGVsaW5lcyBhbmQgdGhlaXIgZXhlY3V0aW9ucycsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAncGlwZWxpbmVzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmVzJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ01ha2UgcGlwZWxpbmVzIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ1JlZ2lzdGVyIGRlcGxveW1lbnRzJywgZGVzY3JpcHRpb246ICdSZWNvcmQgYW5kIHJlbW92ZSB0aGUgZGVwbG95ZWQgc3RhY2sgYW5kIHN0ZXAgbWFuaWZlc3QgYmVoaW5kIGEgcGlwZWxpbmUgKHRoZSBwaXBlbGluZSByZWdpc3RyeSknLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpyZWFkJywgbGFiZWw6ICdWaWV3IHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgZ29sZGVuLXBhdGggdGVtcGxhdGUgY2F0YWxvZycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdBdXRob3IsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmUgdGVtcGxhdGVzJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1NoYXJlIGEgdGVtcGxhdGUgYmV5b25kIHlvdXIgb3JnIChwdWJsaWMgdmlzaWJpbGl0eSknLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cmVhZCcsIGxhYmVsOiAnVmlldyBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdWaWV3IHBsdWdpbnMgYW5kIGJ1aWxkcycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIHVwbG9hZCwgZWRpdCwgYW5kIGRlbGV0ZSBwbHVnaW5zJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ01ha2UgcGx1Z2lucyBwdWJsaWMgKG9yZy13aWRlL2NhdGFsb2cgdmlzaWJpbGl0eSknLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOmluc3RhbGwnLCBsYWJlbDogJ0luc3RhbGwgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnSW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBlY29zeXN0ZW0gcGx1Z2lucyAob3IgcmVxdWVzdCBhbiBpbnN0YWxsIHdoZW4geW91ciBvcmcgcmVxdWlyZXMgYXBwcm92YWwpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbiBpbnN0YWxscycsIGRlc2NyaXB0aW9uOiBcIlNldCB5b3VyIG9yZydzIHBsdWdpbiBjb25zdW1wdGlvbiBwb2xpY3kgYW5kIGFwcHJvdmUgb3IgZGVueSBpbnN0YWxsIHJlcXVlc3RzIHdpdGhpbiB0aGUgb3JnXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3B1Ymxpc2hlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcHVibGlzaGVyIHByb2ZpbGUnLCBkZXNjcmlwdGlvbjogXCJNYW5hZ2UgeW91ciBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSBhbmQgc3VibWl0IHB1Ymxpc2gsIHZlcmlmaWNhdGlvbiwgdHJhbnNmZXIsIGFuZCBhZHZpc29yeSByZXF1ZXN0c1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOm1vZGVyYXRlJywgbGFiZWw6ICdNb2RlcmF0ZSB0aGUgcGx1Z2luIGVjb3N5c3RlbScsIGRlc2NyaXB0aW9uOiAnRGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlIHN1Ym1pc3Npb25zIGFuZCByZXZpZXdzLCB5YW5rIHZlcnNpb25zLCBhbmQgcHVibGlzaCBhZHZpc29yaWVzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczp2ZXJpZnknLCBsYWJlbDogJ1ZlcmlmeSBwdWJsaXNoZXJzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIFZlcmlmaWVkIGFwcGxpY2F0aW9ucywgcHVibGlzaGVyIHRpZXIgYW5kIHByb2ZpbGUgY2hhbmdlcywgYW5kIG93bmVyc2hpcCB0cmFuc2ZlcnMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbGF0Zm9ybTpyZWFkJywgbGFiZWw6ICdWaWV3IHBsYXRmb3JtIG9wZXJhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1JlYWQgdGhlIHBsYXRmb3JtIHNldHRpbmdzIGFuZCB0aGUgY3Jvc3MtdGVuYW50IG9yZ2FuaXphdGlvbiBsaXN0IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb3JnczpyZWFkJywgbGFiZWw6ICdWaWV3IGFsbCBvcmdhbml6YXRpb25zJywgZGVzY3JpcHRpb246ICdMaXN0IGFuZCBvcGVuIGV2ZXJ5IG9yZ2FuaXphdGlvbiBvbiB0aGUgZGVwbG95bWVudCBcXHUyMDE0IHRoZSByb3N0ZXIgdGhlIG9wZXJhdG9yIHN1cmZhY2VzIHdvcmsgZnJvbSAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6b3BlcmF0ZScsIGxhYmVsOiAnT3BlcmF0ZSBkaXNjb3VudHMgYW5kIHByb21vdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgYXBwbHkgYW5kIHJldm9rZSBkaXNjb3VudCB0b2tlbnMgYW5kIHByb21vdGlvbiBjYW1wYWlnbnMgYWNyb3NzIHRlbmFudHMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgb2JzZXJ2YWJpbGl0eSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBHcmFmYW5hIGFuZCBLaWFsaSDigJQgZGFzaGJvYXJkcywgdHJhZmZpYyBhbmQgbWVzaCBoZWFsdGggYWNyb3NzIGV2ZXJ5IHRlbmFudCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgZGF0YWJhc2UgY29uc29sZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gcGdBZG1pbiBhbmQgbW9uZ28tZXhwcmVzcyDigJQgYSBkaXJlY3QgcmVhZC93cml0ZSBzaGVsbCBvdmVyIGV2ZXJ5IHRlbmFudFxcdTIwMTlzIHJvd3MgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIG9iamVjdC1zdG9yZSBjb25zb2xlJywgZGVzY3JpcHRpb246ICdPcGVuIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlIOKAlCBsaXN0IGFuZCBkZWxldGUgb2JqZWN0cyBpbiBldmVyeSBidWNrZXQsIGluY2x1ZGluZyB0aGUgYXVkaXQgY2hhaW4gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvbmNhbGw6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugb24tY2FsbCBwYWdpbmcnLCBkZXNjcmlwdGlvbjogJ1JlYWQgdGhlIHBhZ2luZyBwb3N0dXJlIGFuZCBzZW5kIGEgdGVzdCBwYWdlIChzeXN0ZW0gb3JnIG9ubHk7IHRoZSByb3RhIGxpdmVzIHdpdGggdGhlIHByb3ZpZGVyKScsIGNhdGVnb3J5OiAnT24tY2FsbCcgfSxcbiAgeyBpZDogJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLCBsYWJlbDogJ1dvcmsgdGhlIHN1cHBvcnQgZGVzaycsIGRlc2NyaXB0aW9uOiAnVHJpYWdlIHRoZSBzdXBwb3J0IHF1ZXVlLCBhc3NpZ24gYW5kIHJlLXByaW9yaXRpc2UgY2FzZXMsIHdyaXRlIGludGVybmFsIG5vdGVzLCBhbmQgcmVjb3JkIGluY2lkZW50cyBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICB7IGlkOiAnc3VwcG9ydF9jb250ZW50OndyaXRlJywgbGFiZWw6ICdBdXRob3IgY2FubmVkIHJlcGxpZXMnLCBkZXNjcmlwdGlvbjogJ1dyaXRlIGFuZCByZXRpcmUgdGhlIHJldXNhYmxlIHN1cHBvcnQgcmVwbGllcyBvZmZlcmVkIHRvIGV2ZXJ5IGN1c3RvbWVyIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdTdXBwb3J0IGRlc2snIH0sXG4gIHsgaWQ6ICdzdWJzY3JpcHRpb25zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxsIHN1YnNjcmlwdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgZXZlcnkgb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uLCBwbGFuIG1peCBhbmQgYmlsbGluZyBldmVudHMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdzdWJzY3JpcHRpb25zOm1hbmFnZScsIGxhYmVsOiAnQ2hhbmdlIGFueSBzdWJzY3JpcHRpb24nLCBkZXNjcmlwdGlvbjogJ0NoYW5nZSBhIHBsYW4sIHNldCBhIHN1cHBvcnQgZmxvb3IsIGFuZCBjYW5jZWwgYW4gb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb3JnczptYW5hZ2UnLCBsYWJlbDogJ0FkbWluaXN0ZXIgYW55IG9yZ2FuaXphdGlvbicsIGRlc2NyaXB0aW9uOiAnUmVuYW1lLCByZS10aWVyLCBtb3ZlIGFuZCBkZWxldGUgYW55IG9yZ2FuaXphdGlvbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3F1b3RhczptYW5hZ2UnLCBsYWJlbDogJ0NoYW5nZSBhbnkgcXVvdGEnLCBkZXNjcmlwdGlvbjogJ1JhaXNlLCByZXNldCBhbmQgY2xlYXIgYW5vdGhlciBvcmdhbml6YXRpb25cXHUyMDE5cyBxdW90YXMgKHN5c3RlbSBvcmcgb25seTsgdmlld2luZyB0aGVtIHJpZGVzIHBsYXRmb3JtOnJlYWQpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAncGx1Z2luX3F1ZXVlOm1hbmFnZScsIGxhYmVsOiAnUnVuIHRoZSBwbHVnaW4gYnVpbGQgcXVldWUnLCBkZXNjcmlwdGlvbjogJ1JlYWQgYnVpbGQtcXVldWUgZGVwdGggYW5kIHB1cmdlIHRoZSBkZWFkLWxldHRlciBxdWV1ZSAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6cmVhZCcsIGxhYmVsOiAnVmlldyBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdWaWV3IGNvbXBsaWFuY2UgcnVsZXMsIHBvbGljaWVzLCBhbmQgc2NhbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gIHsgaWQ6ICdjb21wbGlhbmNlOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IHJ1bGVzLCBwb2xpY2llcywgYW5kIGV4ZW1wdGlvbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gIHsgaWQ6ICdtZW1iZXJzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIG1lbWJlcnMnLCBkZXNjcmlwdGlvbjogJ0FkZCwgcmVtb3ZlLCBhbmQgY2hhbmdlIHJvbGVzIG9mIG9yZyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAncm9sZXM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugcm9sZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSByb2xlcycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2ludml0YXRpb25zOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIGludml0YXRpb25zJywgZGVzY3JpcHRpb246ICdTZW5kLCByZXNlbmQsIGFuZCByZXZva2UgaW52aXRhdGlvbnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHNlcnZpY2UgYWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBvcmcgc2VydmljZSBhY2NvdW50cywgYXNzaWduIHRoZWlyIHJvbGVzLCBhbmQgaXNzdWUgb3IgcmV2b2tlIHRoZWlyIGtleXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdkYXNoYm9hcmRzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnVmlldyBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgY3VzdG9tIGRhc2hib2FyZHMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5OnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxlcnRpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdsb2dzOmV4cG9ydCcsIGxhYmVsOiAnRG93bmxvYWQgbG9ncycsIGRlc2NyaXB0aW9uOiBcIkRvd25sb2FkIHlvdXIgb3JnYW5pemF0aW9uJ3MgbG9nIGVudHJpZXMgYXMgYSBmaWxlICh2aWV3aW5nIGxvZ3Mgb25seSBuZWVkcyAnVmlldyBhbGVydGluZycpXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2F1ZGl0OnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGhlIGF1ZGl0IGxvZycsIGRlc2NyaXB0aW9uOiBcIlJlYWQgdGhlIG9yZ2FuaXphdGlvbidzIG93biB0YW1wZXItZXZpZGVudCBhdWRpdCB0cmFpbFwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbmFseXRpY3MgYW5kIHJlcG9ydHMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czpyb2xsdXAnLCBsYWJlbDogJ1JvbGwgdXAgdGVhbSByZXBvcnRzJywgZGVzY3JpcHRpb246ICdJbmNsdWRlIGRlc2NlbmRhbnQgdGVhbXMgd2hlbiB2aWV3aW5nIHJlcG9ydHMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czp3cml0ZScsIGxhYmVsOiAnQXV0aG9yIHN0YWtlaG9sZGVyIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgc2NoZWR1bGUgYW5kIGRyYWZ0IHNjaGVkdWxlZCByZXBvcnRzIGZvciBtYW5hZ2VycycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcmVwb3J0cyBleHRlcm5hbGx5JywgZGVzY3JpcHRpb246ICdQdWJsaXNoIGEgcmVwb3J0IGFuZCBtaW50IGV4cGlyaW5nIHNoYXJlIGxpbmtzIGZvciBwZW9wbGUgb3V0c2lkZSB0aGUgcGxhdGZvcm0nLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnVmlldyBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6d3JpdGUnLCBsYWJlbDogJ1NlbmQgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1NlbmQgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6cmVhZCcsIGxhYmVsOiAnVmlldyBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdWaWV3IHN1YnNjcmlwdGlvbnMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAnYmlsbGluZzptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdNYW5hZ2Ugc3Vic2NyaXB0aW9ucywgYWRkLW9ucywgYW5kIHRoZSBiaWxsaW5nIHBvcnRhbCcsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3F1b3RhczpyZWFkJywgbGFiZWw6ICdWaWV3IHF1b3RhcycsIGRlc2NyaXB0aW9uOiAnVmlldyBvcmdhbml6YXRpb24gcXVvdGFzIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OnJlYWQnLCBsYWJlbDogJ1ZpZXcgcmVnaXN0cnknLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnQ29weSBjb250YWluZXIgaW1hZ2VzJywgZGVzY3JpcHRpb246ICdDb3B5IGFuZCBwcm9tb3RlIGEgY29udGFpbmVyIGltYWdlIGludG8gYW5vdGhlciByZXBvc2l0b3J5JywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OnB1cmdlJywgbGFiZWw6ICdEZWxldGUgY29udGFpbmVyIGltYWdlcycsIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGltYWdlcyBhbmQgcmVwb3NpdG9yaWVzLCBhbmQgcnVuIHJlZ2lzdHJ5IGdhcmJhZ2UgY29sbGVjdGlvbicsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdpbXBlcnNvbmF0aW9uOm9wZW4nLCBsYWJlbDogJ09wZW4gYW4gaW1wZXJzb25hdGlvbiBzZXNzaW9uJywgZGVzY3JpcHRpb246IFwiVmlldyBhIGN1c3RvbWVyJ3MgYWNjb3VudCBhcyBvbmUgb2YgaXRzIHVzZXJzLCB3aXRoIHRoYXQgb3JnYW5pemF0aW9uJ3MgY29uc2VudFwiLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLCBsYWJlbDogJ0Fuc3dlciBpbXBlcnNvbmF0aW9uIHJlcXVlc3RzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIG9yIGRlbnkgYSByZXF1ZXN0IHRvIHZpZXcgYSBtZW1iZXIgb2YgdGhpcyBvcmdhbml6YXRpb24gYXMgdGhhdCBtZW1iZXInLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICd0ZWFtX2FjY2VzczpvcGVuJywgbGFiZWw6IFwiVmlldyBhIHRlYW0gbWVtYmVyJ3MgYWNjb3VudFwiLCBkZXNjcmlwdGlvbjogXCJWaWV3IGEgbWVtYmVyIG9mIG9uZSBvZiB0aGlzIG9yZ2FuaXphdGlvbidzIHRlYW1zIGFzIHRoYXQgbWVtYmVyIChyZWFkLW9ubHkpXCIsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ29yZ19zZXR0aW5nczp3cml0ZScsIGxhYmVsOiAnT3JnYW5pemF0aW9uIHNldHRpbmdzJywgZGVzY3JpcHRpb246ICdNYW5hZ2UgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgYW5kIEFJIGNvbmZpZycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2lkcDp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIFNTTy9JZFAnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBzaW5nbGUgc2lnbi1vbiBhbmQgaWRlbnRpdHkgcHJvdmlkZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfa21zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgZW5jcnlwdGlvbiBrZXlzJywgZGVzY3JpcHRpb246ICdDb25maWd1cmUgY3VzdG9tZXItbWFuYWdlZCBLTVMgZW5jcnlwdGlvbiBrZXlzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGltcGVyc29uYXRpb24gcG9saWN5JywgZGVzY3JpcHRpb246ICdDb250cm9sIHdoZXRoZXIgcGxhdGZvcm0gb3BlcmF0b3JzIG1heSB2aWV3IHRoZSBvcmdhbml6YXRpb24gYXMgb25lIG9mIGl0cyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG5dO1xuXG5jb25zdCBQRVJNSVNTSU9OX0xBQkVMUyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFBFUk1JU1NJT05fQ0FUQUxPRy5tYXAoKHApID0+IFtwLmlkLCBwLmxhYmVsXSkpO1xuXG4vKiogSHVtYW4gbGFiZWwgZm9yIGEgcGVybWlzc2lvbiBpZCAoZmFsbHMgYmFjayB0byB0aGUgcmF3IGlkIGZvciBhbiB1bmtub3duIG9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGVybWlzc2lvbkxhYmVsKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gUEVSTUlTU0lPTl9MQUJFTFMuZ2V0KGlkKSA/PyBpZDtcbn1cblxuLyoqIE9uZSBwaWNrZXIgc2VjdGlvbjogYSBjYXRlZ29yeSBhbmQgdGhlIHBlcm1pc3Npb25zIGl0IGNvbnRhaW5zLCBpbiBjYXRhbG9nIG9yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogUGVybWlzc2lvbk1ldGFbXTtcbn1cblxuLyoqIEdyb3VwIGEgcGVybWlzc2lvbiBsaXN0IGludG8gY2F0ZWdvcmllcywgcHJlc2VydmluZyBjYXRhbG9nIG9yZGVyLiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUNhdGVnb3J5KHBlcm1zOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdKTogUGVybWlzc2lvbkNhdGVnb3J5W10ge1xuICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8c3RyaW5nLCBQZXJtaXNzaW9uTWV0YVtdPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcGVybXMpIHtcbiAgICBpZiAoIWJ5Q2F0ZWdvcnkuaGFzKHAuY2F0ZWdvcnkpKSB7IGJ5Q2F0ZWdvcnkuc2V0KHAuY2F0ZWdvcnksIFtdKTsgb3JkZXIucHVzaChwLmNhdGVnb3J5KTsgfVxuICAgIGJ5Q2F0ZWdvcnkuZ2V0KHAuY2F0ZWdvcnkpIS5wdXNoKHApO1xuICB9XG4gIHJldHVybiBvcmRlci5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeSwgcGVybWlzc2lvbnM6IGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSEgfSkpO1xufVxuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFBlcm1pc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBlcm1pc3Npb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFBlcm1pc3Npb24ge1xuICByZXR1cm4gKEFMTF9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgbXVzdCBORVZFUiBiZSBncmFudGFibGUgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgQ1VTVE9NIFJvbGUg4oCUXG4gKiB0aGV5IGdhdGUgcGxhdGZvcm0tb3BlcmF0b3Igc3VyZmFjZXMgKHRoZSBzaGFyZWQgaW1hZ2UgcmVnaXN0cnkpLCBzbyBhbGxvd2luZ1xuICogYW4gb3JnIGFkbWluIHRvIG1pbnQgYSBSb2xlIGNhcnJ5aW5nIHRoZW0gd291bGQgYmUgYSBsYXRlbnQgcHJpdmlsZWdlXG4gKiBlc2NhbGF0aW9uLiBUaGV5IGFyZSBOT1Qgc2VlZGVkIGludG8gQU5ZIGJ1aWx0LWluIFJvbGUgYnVuZGxlIChuZWl0aGVyXG4gKiBgbWVtYmVyYCBub3IgYGFkbWluYCksIHNvIHRoZSBvbmx5IGhvbGRlciBpcyBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCkg4oCUXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBpbWFnZS1yZWdpc3RyeSBnYXRlcyB0aGF0IHJlcXVpcmUgdGhlbSBlZmZlY3RpdmVseVxuICogc3VwZXJhZG1pbi1vbmx5LiBUaGlzIGxpc3QgQUxTTyBibG9ja3MgY3VzdG9tLVJvbGUgYXV0aG9yaW5nIGZyb20gcmVxdWVzdGluZ1xuICogdGhlbSAoc2VlIHBsYXRmb3JtIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gYHJlZ2lzdHJ5OnJlYWRgIGFuZCBgcmVnaXN0cnk6d3JpdGVgIHdlcmUgYm90aCBoZXJlLiBXaGF0IHN0YXlzIGlzIHRoZVxuICAvLyBkZXN0cnVjdGl2ZSBydW5nIGFsb25lOiBkZWxldGluZyBhIG1hbmlmZXN0IG9yIGEgd2hvbGUgcmVwb3NpdG9yeSwgYW5kIHRoZVxuICAvLyBHQyBwcnVuZSwgZWFjaCBvZiB3aGljaCBjYW4gcmVtb3ZlIGFuIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgc3RpbGxcbiAgLy8gcmVzb2x2ZXMg4oCUIGluY2x1ZGluZyB0aGUgZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2VzIHRoZSBzdXBwbHkgY2hhaW5cbiAgLy8gdmVyaWZpZXMgYWdhaW5zdC4gVGhhdCBpcyB0aGUgb25lIHJlZ2lzdHJ5IGFjdGlvbiB3aXRoIG5vIHVuZG8sIHNvIGl0IGtlZXBzXG4gIC8vIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgYXVkaWVuY2U6IHRoZSBmbGFnLCBhbmQgbmV2ZXIgYSBSb2xlLlxuICAncmVnaXN0cnk6cHVyZ2UnLFxuXTtcblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IGdvdmVybiB0aGUgUExVR0lOIEVDT1NZU1RFTSBhbmQgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gTGlrZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gdGhleSBhcmUgaW4gbm8gbWVtYmVyL2FkbWluL293bmVyIGJ1bmRsZVxuICogYW5kIGFyZSBuZXZlciBncmFudGFibGUgdGhyb3VnaCBhIGN1c3RvbSBSb2xlIGluIEFOWSBvcmcgKHBsYXRmb3JtXG4gKiBgc2FuaXRpemVQZXJtaXNzaW9uc2AgcmVmdXNlcyB0aGVtKS4gVGhlIG9ubHkgaG9sZGVycyBhcmUgc3VwZXJhZG1pbnNcbiAqIChpbXBsaWNpdC1hbGwpIGFuZCBtZW1iZXJzIG9mIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSwgd2hpY2ggaXNcbiAqIHNlZWRlZCBpbiB0aGUgc3lzdGVtIG9yZyBhbG9uZSBmcm9tIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU30gYW5kXG4gKiBhc3NpZ25hYmxlIG9ubHkgYnkgYSBzdXBlcmFkbWluLlxuICpcbiAqIGBvbmNhbGw6bWFuYWdlYCBpcyBpbiBORUlUSEVSIG5hbWVkIHJvbGUsIHdoaWNoIG1ha2VzIGl0IHN1cGVyYWRtaW4tb25seSBpblxuICogcHJhY3RpY2UuIFRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQ6IHBhZ2luZyBpcyB0aGUgdmVuZG9yJ3NcbiAqIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIGVjb3N5c3RlbSBtb2RlcmF0aW9uLCBzb1xuICogd2lkZW5pbmcgdGhlIEVjb3N5c3RlbSBNYW5hZ2VyIHJvbGUgdG8gY2FycnkgaXQgd291bGQgaGFuZCB0aGUgcGFnZXIgdG9cbiAqIHBlb3BsZSBoaXJlZCB0byByZXZpZXcgcGx1Z2lucy4gSXQgaXMgbm90IGEgcGxhY2Vob2xkZXIg4oCUIGl0IGdhdGVzIHR3byBsaXZlXG4gKiByb3V0ZXMgKHRoZSBwYWdpbmcgcG9zdHVyZSByZWFkIGFuZCB0aGUgdGVzdCBwYWdlKSwgdW5saWtlIGByZWdpc3RyeToqYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgb3BlcmF0b3Igc3VyZmFjZXMsIHN5c3RlbS1vcmctb25seSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZVxuICAvLyBjb25zb2xlcyBhcmU6IHRoZXkgcmVhZCBhbmQgbW92ZSB0aGluZ3MgYmVsb25naW5nIHRvIG9yZ2FuaXNhdGlvbnMgdGhlXG4gIC8vIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2YsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBncmFudGFibGUgaW5zaWRlIGEgdGVuYW50LlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIHRoZSBpbWFnZSByZWdpc3RyeTogcmVwb3NpdG9yeSBuYW1lcywgdGFncywgbWFuaWZlc3RzLCBibG9icyBhbmQgdGhlXG4gIC8vIHN0b3JhZ2Ugcm9sbHVwLiBQcm9tb3RlZCBvdXQgb2YgU1VQRVJBRE1JTl9PTkxZIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGJyb3dzZXJcbiAgLy8gd2FzIGludmlzaWJsZSB0byBldmVyeSBSb2xlLCBzbyBhIFBsYXRmb3JtIE9wZXJhdG9yIGRlYnVnZ2luZyBhIGZhaWxlZFxuICAvLyBwbHVnaW4gYnVpbGQgY291bGQgc2VlIHRoZSBidWlsZCBxdWV1ZSBhbmQgaXRzIGRlYWQgbGV0dGVycyBidXQgbm90IHRoZVxuICAvLyBpbWFnZXMgdGhlIGJ1aWxkIHByb2R1Y2VkIOKAlCBhbmQgdGhlIG9ubHkgd2F5IHRvIGxvb2sgd2FzIHRoZSBzdXBlcmFkbWluXG4gIC8vIGZsYWcuIEl0IHN0YXlzIHN5c3RlbS1vcmctb25seSAobm8gdGVuYW50IFJvbGUgbWF5IGNhcnJ5IGl0KSBhbmQgaXMgcGFpcmVkXG4gIC8vIHdpdGggYSBwZXItcmVwbyBvcmctb3duZXJzaGlwIGZpbHRlciB0aGF0IHJ1bnMgQUZURVIgaXQsIHNvIHdpZGVuaW5nIHRoZVxuICAvLyBwZXJtaXNzaW9uIGRvZXMgbm90IHdpZGVuIHdoaWNoIHJlcG9zaXRvcmllcyBhIGhvbGRlciBjYW4gcmVhY2g6IGFcbiAgLy8gc3lzdGVtLW9yZyBtZW1iZXIgd2hvIGlzIG5vdCBhIHN1cGVyYWRtaW4gc2VlcyBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmRcbiAgLy8gYHB1YmxpYy8qYCDigJQgdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIGFuZCBubyB0ZW5hbnQnc1xuICAvLyBgb3JnLSpgIHJlcG9zaXRvcmllcyBhdCBhbGwgKGBjYW5SZWFkUmVwb2AgaW4gdGhlIGltYWdlLXJlZ2lzdHJ5IHNlcnZpY2UpLlxuICAncmVnaXN0cnk6cmVhZCcsXG4gIC8vIENvcHlpbmcvcHJvbW90aW5nIGFuIGltYWdlLiBTeXN0ZW0tb3JnLW9ubHkgcmF0aGVyIHRoYW4gc3VwZXJhZG1pbi1vbmx5XG4gIC8vIGJlY2F1c2UgaXQgaXMgQURESVRJVkU6IGl0IHdyaXRlcyBhIG5ldyB0YWcgYW5kIG1ha2VzIG5vdGhpbmcgc3RvcFxuICAvLyByZXNvbHZpbmcsIGFuZCBgY2FuV3JpdGVSZXBvYCBjb25maW5lcyBhIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgY2FsbGVyXG4gIC8vIHRvIGBzeXN0ZW0vKmAgcmVnYXJkbGVzcy4gRGVsaWJlcmF0ZWx5IGNhcnJpZWQgYnkgTk8gYnVpbHQtaW4gYnVuZGxlIHRvZGF5XG4gIC8vIOKAlCBwcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSBqb2IsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQsXG4gIC8vIHNvIGl0IHdhaXRzIGZvciBhIFJvbGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiByaWRpbmcgYWxvbmcgd2l0aFxuICAvLyBgcGxhdGZvcm06cmVhZGAuXG4gICdyZWdpc3RyeTp3cml0ZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIE9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgaW1wZXJzb25hdGlvbiBzZXNzaW9uLiBTeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZVxuICAvLyBvYnZpb3VzIHJlYXNvbiDigJQgaXQgdmlld3MgYW4gb3JnYW5pc2F0aW9uIHRoZSBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mIOKAlFxuICAvLyBhbmQgaXQgaXMgdGhlIE9ORSBwZXJtaXNzaW9uIGluIHRoaXMgbGlzdCB0aGF0IGFsc28gaGFzIHRvIGNsZWFyIGEgZ2F0ZSB0aGVcbiAgLy8gcGVybWlzc2lvbiBzeXN0ZW0gZG9lcyBub3Qgb3duOiB0aGUgdGFyZ2V0IG9yZ2FuaXNhdGlvbidzIGNvbnNlbnQgKGl0c1xuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIHBvbGljeSksIHBsdXMgYWFsMiBhbmQgYSBzdHJvbmcgc3RlcC11cC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gc2F5cyB3aG8gbWF5IEFTSzsgdGhlIHRlbmFudCBzdGlsbCBhbnN3ZXJzLlxuICAvL1xuICAvLyBJdCBkb2VzIE5PVCBjb3ZlciBlbWVyZ2VuY3kgYWNjZXNzLiBgUE9TVCAvOnVzZXJJZC9icmVha2dsYXNzYCBieXBhc3Nlc1xuICAvLyB0ZW5hbnQgY29uc2VudCBhbmQgc28gc3RheXMgb24gdGhlIHN1cGVyYWRtaW4gZmxhZyBhbG9uZSwgYXBwcm92ZWQgYnkgYVxuICAvLyBTRUNPTkQgc3VwZXJhZG1pbiAoZm91ci1leWVzKS4gQSBwZXJtaXNzaW9uIHRoYXQgY291bGQgYmUgZGVsZWdhdGVkIG11c3Qgbm90XG4gIC8vIGJlIGFibGUgdG8gd2FsayBwYXN0IGNvbnNlbnQuXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG4gIC8vIFRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgdGFza3MuIEVhY2ggb25lIHJlcGxhY2VkIGEgYHJlcXVpcmVTeXN0ZW1BZG1pbmBcbiAgLy8gZ2F0ZSwgc28gdGhlIHBvaW50IG9mIGxpc3RpbmcgdGhlbSBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludCBvZiBhZGRpbmdcbiAgLy8gdGhlbSBhdCBhbGw6IGEgUm9sZSBjb21wb3NlZCBpbiB0aGUgc3lzdGVtIG9yZyBjYW4gY2FycnkgZXhhY3RseSBvbmUgam9iLFxuICAvLyBhbmQgbm8gUm9sZSBpbiBhbnkgdGVuYW50IGNhbiBjYXJyeSBpdCBhdCBhbGwuXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gUmVhZHMgdGhhdCBtYWtlIHRoZSBvcGVyYXRvciB2aWV3cyB1c2FibGU6IHRoZSBkYXNoYm9hcmRzIHRoZSBwb3N0dXJlIHBhbmVsc1xuICAvLyBsaXZlIG9uLCB0aGUgY3Jvc3MtdGVuYW50IGxvZyB2aWV3LCBhbmQgdGhlIGN1c3RvbWVyJ3MgcGxhbiB3aGVuIGEgbGltaXQgaXNcbiAgLy8gdGhlIHRoaW5nIGJlaW5nIGRlYnVnZ2VkLlxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBUaGUgcmVnaXN0cnkgYnJvd3NlcjogcmVwb3NpdG9yeSBuYW1lcywgdGFncyBhbmQgbWFuaWZlc3RzIGZvciB0aGUgaW1hZ2VzXG4gIC8vIHRoaXMgZGVwbG95bWVudCdzIGJ1aWxkcyBwcm9kdWNlLiBJdCB3YXMgd2l0aGhlbGQgd2hpbGUgYHJlZ2lzdHJ5OnJlYWRgIHdhc1xuICAvLyBzdXBlcmFkbWluLW9ubHkg4oCUIGEgc2VlZGVkIGJ1bmRsZSBjYXJyeWluZyBhIHN1cGVyYWRtaW4tb25seSBwZXJtaXNzaW9uXG4gIC8vIHdvdWxkIG1ha2UgdGhhdCBsaXN0IGEgbGllLCBzaW5jZSBidW5kbGVzIGJ5cGFzcyBgc2FuaXRpemVQZXJtaXNzaW9uc2AuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBwcm9tb3RlZCB0byBzeXN0ZW0tb3JnLW9ubHkgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIHNtdWdnbGVkXG4gIC8vIGluIGhlcmUsIHdoaWNoIGlzIHRoZSBvcmRlciB0aG9zZSB0d28gY2hhbmdlcyBoYXZlIHRvIGhhcHBlbiBpbi5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBBQ0NPVU5UIE1BTkFHRVIg4oCUIHRoZSBjb21tZXJjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIGEgY3VzdG9tZXIsIGFzIG9wcG9zZWQgdG9cbiAqIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gKlxuICogU3BsaXQgZnJvbSB7QGxpbmsgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlN9IHJhdGhlciB0aGFuIHBpbGVkIG9udG8gaXQsXG4gKiBiZWNhdXNlIHRoZSB0d28gam9icyBkaXZlcmdlIGF0IGV4YWN0bHkgdGhlIHBlcm1pc3Npb25zIGFkZGVkIGFsb25nc2lkZSB0aGlzXG4gKiBidW5kbGUuIGBiaWxsaW5nOm9wZXJhdGVgIE1PVkVEIGhlcmUgZnJvbSB0aGUgb3BlcmF0b3IgYnVuZGxlIGZvciB0aGF0IHJlYXNvbjpcbiAqIG1pbnRpbmcgYSBkaXNjb3VudCB0b2tlbiBpcyBhIGNvbW1lcmNpYWwgYWN0LCBub3QgYW4gb3BlcmF0aW9uYWwgb25lLCBhbmQgdGhlXG4gKiBwZXJzb24gd2hvIHJlc3RhcnRzIGEgc3R1Y2sgYnVpbGQgcXVldWUgaGFzIG5vIHJlYXNvbiB0byBob2xkIGl0LlxuICpcbiAqIFRoZSBkZXN0cnVjdGl2ZSBoYWxmIG9mIHRoZSBjYXRhbG9ndWUgbGl2ZXMgaGVyZSDigJQgYG9yZ3M6bWFuYWdlYCBjYW4gREVMRVRFXG4gKiBhbiBvcmdhbmlzYXRpb24gYW5kIGBzdWJzY3JpcHRpb25zOm1hbmFnZWAgY2FuIGNhbmNlbCBpdHMgc3Vic2NyaXB0aW9uIOKAlCBzb1xuICogdGhpcyBpcyBkZWxpYmVyYXRlbHkgdGhlIHNtYWxsZXIsIG1vcmUgcmFyZWx5LWFzc2lnbmVkIG9mIHRoZSB0d28uXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAvLyBBIHF1b3RhIGJ1bXAgaXMgYXMgb2Z0ZW4gYSBjb21tZXJjaWFsIGNvbmNlc3Npb24gYXMgYW4gb3BlcmF0aW9uYWwgb25lLCBzb1xuICAvLyBib3RoIGJ1bmRsZXMgY2FycnkgaXQuXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHdoaWNoIGlzIHRoZSBzdXJmYWNlIHRoaXMgam9iIHdvcmtzIGZyb20g4oCUIGFuZFxuICAvLyBvbmx5IHRoYXQuIEl0IHVzZWQgdG8gdGFrZSBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIGFsc28gaGFuZGVkIG92ZXIgdGhlXG4gIC8vIGRlcGxveSdzIFJMUyBtb2RlLCBLTVMgcG9zdHVyZSBhbmQgcmVuZGVyZWQgYWxlcnQgcnVsZXM6IGludGVybmFscyBhXG4gIC8vIGNvbW1lcmNpYWwgcm9sZSBoYXMgbm8gdXNlIGZvci5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIENPTlNPTEUgQURNSU5JU1RSQVRPUiDigJQgdGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBhcyBhIFJvbGUuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTIGV2ZW4gdGhvdWdoIGVhY2ggY29uc29sZSBwZXJtaXNzaW9uIGlzIGdyYW50YWJsZSBieSBoYW5kOiB3aXRoXG4gKiBubyBzZWVkZWQgUm9sZSwgdGhlIG9ubHkgcGF0aCB0byBwZ0FkbWluIHdhcyBhIHN1cGVyYWRtaW4gY29tcG9zaW5nIGEgY3VzdG9tXG4gKiBSb2xlIGZvciBpdCwgYW5kIHRoZSBvYnNlcnZlZCBvdXRjb21lIG9mIGFza2luZyBwZW9wbGUgdG8gZG8gdGhhdCBpcyB0aGF0IHRoZXlcbiAqIHJlYWNoIGZvciB0aGUgc3VwZXJhZG1pbiBGTEFHIGluc3RlYWQg4oCUIHRoZSBleGFjdCBmYWlsdXJlIHRoZXNlIHBlcm1pc3Npb25zXG4gKiB3ZXJlIGFkZGVkIHRvIHJlbW92ZS4gQSBuYW1lZCBSb2xlIGFsc28gbWFrZXMgXCJ3aG8gY2FuIG9wZW4gYSBkYXRhIHNoZWxsP1wiIG9uZVxuICogcXVlcnkgaW5zdGVhZCBvZiBhbiBhdWRpdCBvZiBldmVyeSBjdXN0b20gUm9sZS5cbiAqXG4gKiBJdCBjYXJyaWVzIGFsbCB0aHJlZSBjb25zb2xlcywgd2hpY2ggaXMgdGhlIHdob2xlIGpvYiBmb3IgdGhlIHBlcnNvbiB3aG8gaG9sZHNcbiAqIGl0LiBPTkUgQ09OU0VRVUVOQ0UgV09SVEggS05PV0lORzogYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgYW5kXG4gKiBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCBhcmUgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIGF1ZGl0IHRhbXBlci1ldmlkZW5jZVxuICogZGVzaWduIOKAlCBhIE1vbmdvIHNoZWxsIGNhbiB0cnVuY2F0ZSBhIGhhc2ggY2hhaW4ncyB0YWlsLCBhbmQgdGhlIG9iamVjdCBzdG9yZVxuICogaG9sZHMgdGhlIHNpZ25lZCBoZWFkcyB0aGF0IHdvdWxkIGV4cG9zZSB0aGUgdHJ1bmNhdGlvbiDigJQgc28gYSBob2xkZXIgb2YgdGhpc1xuICogUm9sZSBjYW4gZG8gYm90aC4gVGhlIHBlcm1pc3Npb25zIHN0YXkgU0VQQVJBVEUgZm9yIGV4YWN0bHkgdGhhdCByZWFzb246IGFcbiAqIGRlcGxveW1lbnQgdGhhdCB3YW50cyB0aGVtIGhlbGQgYnkgZGlmZmVyZW50IHBlb3BsZSBjb21wb3NlcyBhIG5hcnJvd2VyIFJvbGVcbiAqIGJ5IGhhbmQgKGEgc3VwZXJhZG1pbiBtYXkgaW5jbHVkZSBhbnkgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gaW4gYSBSb2xlXG4gKiBhdXRob3JlZCBpbiB0aGUgc3lzdGVtIG9yZykgYW5kIGFzc2lnbnMgdGhpcyBvbmUgdG8gbm9ib2R5LlxuICovXG4vKipcbiAqIFBMQVRGT1JNIE9CU0VSVkVSIOKAlCBsb29rLCBkb24ndCB0b3VjaC4gVGhlIGxhZGRlcidzIG1pc3NpbmcgYm90dG9tIHJ1bmcuXG4gKlxuICogRXZlcnkgb3RoZXIgc3lzdGVtLW9yZyBidW5kbGUgZ3JhbnRzIGEgd3JpdGUuIFRoZSBvbmUgdGhhdCBkb2VzIG5vdCDigJRcbiAqIENvbnNvbGUgQWRtaW5pc3RyYXRvciDigJQgZ3JhbnRzIGEgcmVhZCB0aGF0IElTIGEgZGF0YWJhc2Ugc2hlbGwuIFNvIHNvbWVib2R5XG4gKiB3aG8gc2hvdWxkIHNlZSB0aGUgZGVwbG95bWVudCBhbmQgY2hhbmdlIG5vdGhpbmcgKGEgbmV3IG9wZXJhdG9yIHNoYWRvd2luZywgYW5cbiAqIGF1ZGl0b3IsIGFuIG9uLWNhbGwgZW5naW5lZXIgZHVyaW5nIGEgaGFuZG92ZXIpIGhhZCB0d28gb3B0aW9uczogU3VwZXIgQWRtaW4sXG4gKiBvciBub3RoaW5nLiBUaGUgdXN1YWwgb3V0Y29tZSBvZiBhIGNob2ljZSBsaWtlIHRoYXQgaXMgdGhlIGZsYWcuXG4gKlxuICogU3RyaWN0bHkgcmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjogZXZlcnkgcGVybWlzc2lvbiBoZXJlIGVuZHMgYDpyZWFkYCwgd2hpY2hcbiAqIGBpc011dGF0aW9uUGVybWlzc2lvbmAgY2xhc3NpZmllcyBhcyBhIHJlYWQsIHNvIHRoZSBkYXNoYm9hcmQgZGlzYWJsZXMgZXZlcnlcbiAqIHdyaXRlIGFmZm9yZGFuY2UgZm9yIGEgaG9sZGVyIHJhdGhlciB0aGFuIG9mZmVyaW5nIGNvbnRyb2xzIHRoYXQgNDAzLlxuICpcbiAqIE5PVCBgYXVkaXQ6cmVhZGAuIEl0IHdvdWxkIGJlIHRoZSBvYnZpb3VzIGFkZGl0aW9uIGFuZCBpdCBpcyB0aGUgd3Jvbmcgb25lOlxuICogYGxpc3RBdWRpdEV2ZW50c2AgcGlucyBldmVyeSBub24tc3VwZXJhZG1pbiB0byB0aGVpciBPV04gb3JnLCBzbyBhIHN5c3RlbS1vcmdcbiAqIG9ic2VydmVyIGhvbGRpbmcgaXQgd291bGQgc2VlIHRoZSBzeXN0ZW0gb3JnJ3MgYXVkaXQgdHJhaWwgYW5kIG5vdGhpbmcgZWxzZSDigJRcbiAqIGFuIGFmZm9yZGFuY2UgdGhhdCBsb29rcyBsaWtlIGZsZWV0LXdpZGUgYXVkaXQgYWNjZXNzIGFuZCBpcyBub3QuIFJlYWRpbmdcbiAqIGFub3RoZXIgdGVuYW50J3MgdHJhaWwgaXMgZGVsaWJlcmF0ZWx5IHRoZSBmbGFnJ3MgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAvLyBBIHJlYWQsIGFuZCB0aGlzIFJvbGUgaXMgcmVhZHMg4oCUIHRoZSByZWdpc3RyeSBicm93c2VyIHdpdGggbmVpdGhlciBvZiB0aGVcbiAgLy8gdHdvIHdyaXRlIHJ1bmdzIChgcmVnaXN0cnk6d3JpdGVgIGNvcGllcywgYHJlZ2lzdHJ5OnB1cmdlYCBkZWxldGVzKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgc28gYSBob2xkZXIgY2FuIGZpbmQgdGhlIG9yZyB0aGV5IHdlcmUgYXNrZWRcbiAgLy8gYWJvdXQgd2l0aG91dCBhIHNlY29uZCBSb2xlIOKAlCBhbmQgbm90aGluZyBtb3JlLiBUaGlzIHdhcyBgcGxhdGZvcm06cmVhZGAsXG4gIC8vIHdoaWNoIG1lYW50IG9wZW5pbmcgYSBkYXRhYmFzZSBjb25zb2xlIGFsc28gZ3JhbnRlZCB0aGUgZGVwbG95J3Mgb3duXG4gIC8vIGNvbmZpZ3VyYXRpb24sIGZvciBubyByZWFzb24gYmV5b25kIHRoZSB0d28gc2hhcmluZyBhIGdhdGUuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBSRUdJU1RSWSBPUEVSQVRPUiDigJQgbW92ZXMgY29udGFpbmVyIGltYWdlcyBhcm91bmQsIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gUHJvbW90aW5nIGFuIGltYWdlIOKAlCBjb3B5aW5nIGEgYnVpbHQgdGFnIGZyb20gb25lIHJlcG9zaXRvcnlcbiAqIHRvIHRoZSBvbmUgYSByZWxlYXNlIHJlc29sdmVzIOKAlCBpcyBhIGpvYiBzb21lYm9keSBkb2VzLCBhbmQgdW50aWwgbm93IHRoZSBvbmx5XG4gKiBpZGVudGl0eSB0aGF0IGNvdWxkIGRvIGl0IHdhcyBhIHN1cGVyYWRtaW4uIGByZWdpc3RyeTp3cml0ZWAgaGFzIG5vIG90aGVyXG4gKiBjYXJyaWVyLCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzXG4gKiBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2UgKHRoZSBgcGxhdGZvcm06cmVhZGAgZmFpbHVyZSwgcGlubmVkIGJ5IHRoZVxuICogXCJhdCBsZWFzdCBvbmUgc2VlZGVkIGNhcnJpZXJcIiBhc3NlcnRpb24gaW4gYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKiBTbyBzcGxpdHRpbmcgYHJlZ2lzdHJ5OnB1cmdlYCBvdXQgb2YgYHJlZ2lzdHJ5OndyaXRlYCBpcyBvbmx5IGhhbGYgdGhlIGNoYW5nZTpcbiAqIHRoZSBhZGRpdGl2ZSBoYWxmIG5lZWRzIGEgUm9sZSBvciB0aGUgc3BsaXQgYnV5cyBub3RoaW5nLlxuICpcbiAqIFdIWSBJVCBJUyBOT1QgUEFSVCBPRiBQTEFURk9STSBPUEVSQVRPUi4gVGhhdCBSb2xlIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kXG4gKiBhbHJlYWR5IHJlYWRzIHRoZSByZWdpc3RyeS4gUHJvbW90aW5nIGFuIGltYWdlIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgbm90IGFuXG4gKiBvcGVyYXRpb25hbCBzaWRlIGVmZmVjdCwgYW5kIHJvbGxpbmcgaXQgaW50byB0aGUgUm9sZSBldmVyeW9uZSBvbiBjYWxsIGhvbGRzXG4gKiB3b3VsZCBtZWFuIHRoZSBwYWdlciByb3RhdGlvbiBjYW4gcmV0YWcgYSByZWxlYXNlIGF0IDNhbS4gVGhlIHR3byBSb2xlc1xuICogY29tcG9zZSBpbnN0ZWFkIOKAlCBhIG1lbWJlciBtYXkgaG9sZCBhbnkgbnVtYmVyLCBhbmQgcGVybWlzc2lvbnMgYXJlIHRoZSB1bmlvbi5cbiAqXG4gKiBXSFkgSVQgSVMgT05MWSBUV08gUEVSTUlTU0lPTlMuIERlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6IG5vIGBwbGF0Zm9ybTpyZWFkYCxcbiAqIG5vIGNvbnNvbGUsIG5vIGBvcmdzOnJlYWRgLiBgY2FuUmVhZFJlcG9gL2BjYW5Xcml0ZVJlcG9gIGNvbmZpbmUgYVxuICogbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBob2xkZXIgdG8gYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kIGBwdWJsaWMvKmAg4oCUXG4gKiB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgc28gdGhlIFJvbGUgY2Fubm90IHJlYWNoIGFcbiAqIHRlbmFudCdzIHJlcG9zaXRvcmllcyBhdCBhbGwsIGFuZCBhIGhvbGRlciB3aG8gYWxzbyBuZWVkcyB0aGUgb3BlcmF0b3Igdmlld3NcbiAqIGdldHMgdGhlIG9wZXJhdG9yIFJvbGUgdG9vLiBJdCBkb2VzIE5PVCBjYXJyeSBgcmVnaXN0cnk6cHVyZ2VgLCB3aGljaCBpcyBpblxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIGluIG5vIGJ1bmRsZSBieSBkZXNpZ246IGFuIGltYWdlXG4gKiBwcm9tb3RlciBoYXMgbm8gYnVzaW5lc3MgZGVsZXRpbmcgdGhlIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgQUdFTlQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gYHBsYXRmb3JtOnJlYWRgLCBubyBjb25zb2xlIGFuZCBubyBiaWxsaW5nIHdyaXRlOiBhblxuICogYWdlbnQgYW5zd2VycyBjYXNlcyBhbmQgd3JpdGVzIHRoZSBjYW5uZWQgcmVwbGllcy4gYHN1YnNjcmlwdGlvbnM6cmVhZGAgaXNcbiAqIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgcXVlc3Rpb24gb24gYW55IGNhc2UgaXMgd2hhdCB0aGUgY3VzdG9tZXIgaXMgZW50aXRsZWRcbiAqIHRvLCBhbmQgd2l0aG91dCBpdCBhbiBhZ2VudCB3b3VsZCBoYXZlIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIE5FVywgYW5kIHRoZSBnYXAgdGhlIHNwbGl0IGV4cG9zZWQ6IGFuIGFnZW50IHRyaWFnaW5nIGEgY2FzZSBuZWVkcyB0byBmaW5kXG4gIC8vIHRoZSBjdXN0b21lcidzIG9yZ2FuaXphdGlvbi4gVGhlIG9ubHkgcGVybWlzc2lvbiB0aGF0IGxpc3RlZCBvcmdzIHdhc1xuICAvLyBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIHdvdWxkIGFsc28gaGF2ZSBoYW5kZWQgYSBzdXBwb3J0IGFnZW50IHRoZSBkZXBsb3knc1xuICAvLyBpbnRlcm5hbHMg4oCUIHNvIHRoZXkgaGFkIG5laXRoZXIsIGFuZCBoYWQgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyBhbmQgYW5zd2VyaW5nIHRoZSBjYXNlIGl0c2VsZiByaWRlcyB0aGUgb3JkaW5hcnkgbWVzc2FnaW5nXG4gIC8vIHBlcm1pc3Npb25zIOKAlCBhIHN1cHBvcnQgY2FzZSBJUyBhIG1lc3NhZ2UgdGhyZWFkLlxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdtZXNzYWdlczp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgTEVBRCDigJQgdGhlIHN1cHBvcnQgZGVzaywgcGx1cyB0aGUgYXV0aG9yaXR5IHRvIGxvb2suXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gYGltcGVyc29uYXRpb246b3BlbmAgaXMgc3lzdGVtLW9yZy1vbmx5LCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHlcbiAqIHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpcyBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2Ug4oCUIHRoZVxuICogaW52YXJpYW50IGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2AgYXNzZXJ0cywgYW5kIHRoZSByZWFzb25cbiAqIGBwbGF0Zm9ybTpyZWFkYCBzaGlwcGVkIHVudXNhYmxlLiBXaXRob3V0IHRoaXMgUm9sZSwgc3BsaXR0aW5nIGltcGVyc29uYXRpb25cbiAqIG91dCBvZiB0aGUgZmxhZyB3b3VsZCBjaGFuZ2Ugbm90aGluZzogdGhlIG9ubHkgd2F5IHRvIGxldCBzb21lYm9keSB2aWV3IGFcbiAqIGN1c3RvbWVyJ3MgYWNjb3VudCB3b3VsZCBzdGlsbCBiZSB0byBtYWtlIHRoZW0gYSBmdWxsIFN1cGVyIEFkbWluLCBoYW5kaW5nXG4gKiBvdmVyIGAvYWRtaW4vdXNlcnMvOmlkL2dyYW50c2AsIHRoZSBzaW5nbGUtcGVyc29uIE1GQSByZXNldCwgdGhlIGRhdGFiYXNlXG4gKiBjb25zb2xlIGFuZCBgcmVnaXN0cnk6cHVyZ2VgIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogV0hZIElUIElTIFRIRSBTVVBQT1JUIERFU0sgQU5EIE5PVCBUSEUgT1BFUkFUT1IuIFRoZSBxdWVzdGlvbiBpbXBlcnNvbmF0aW9uXG4gKiBhbnN3ZXJzIGlzIFwid2hhdCBpcyB0aGlzIGN1c3RvbWVyIGFjdHVhbGx5IHNlZWluZz9cIiwgd2hpY2ggaXMgYSBzdXBwb3J0XG4gKiBxdWVzdGlvbi4gUGxhdGZvcm0gT3BlcmF0b3IgcnVucyB0aGUgZGVwbG95bWVudCBhbmQgaXMgaGVsZCBieSB3aG9ldmVyIGlzIG9uXG4gKiBjYWxsOyBhZGRpbmcgdGhpcyB0byBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHJvdGEgbWVtYmVyIHRoZSBhYmlsaXR5IHRvIGJlY29tZSBhbnlcbiAqIGN1c3RvbWVyJ3MgdXNlciBhdCAzYW0uIFN1cHBvcnQgQWdlbnQncyBidW5kbGUgcGx1cyB0aGUgb25lIHBlcm1pc3Npb24gaXMgdGhlXG4gKiBuYXJyb3dlciwgbW9yZSBob25lc3Qgc2hhcGUg4oCUIGFuZCBhIGxlYWQgd2hvIGFsc28gcnVucyB0aGUgZGVwbG95bWVudCBob2xkc1xuICogYm90aCBSb2xlcy5cbiAqXG4gKiBXSEFUIElUIFNUSUxMIENBTk5PVCBETy4gRW1lcmdlbmN5IGFjY2VzczogYGJyZWFrZ2xhc3NgIGJ5cGFzc2VzIHRlbmFudFxuICogY29uc2VudCBhbmQgc3RheXMgb24gdGhlIGZsYWcsIGFwcHJvdmVkIGJ5IGEgc2Vjb25kIFN1cGVyIEFkbWluLiBBbmQgdGhlXG4gKiB0ZW5hbnQgY2FuIHJlZnVzZSDigJQgYGltcGVyc29uYXRpb246b3BlbmAgaXMgcGVybWlzc2lvbiB0byBBU0suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyxcbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG5dO1xuXG4vKipcbiAqIFNUQVJUSU5HIFBPSU5UUyBmb3IgYSBjdXN0b20gUm9sZSBpbiBhIHRlbmFudCBvcmcg4oCUIHRlbXBsYXRlcywgbm90IFJvbGVzLlxuICpcbiAqIFRIRSBHQVAgVEhFWSBGSUxMLiBBbiBvcmcgc2VlZHMgZXhhY3RseSBUV08gUm9sZXMg4oCUIE1lbWJlciBhbmQgQWRtaW4g4oCUIGFuZFxuICogQWRtaW4gaXMgZXZlcnkgb3JnLWFzc2lnbmFibGUgcGVybWlzc2lvbi4gU28gcHJvbW90aW5nIGFueW9uZSBwYXN0IFwiYXV0aG9yIGFuZFxuICogcmVhZFwiIGhhbmRzIG92ZXIgdGhlIHdob2xlIHJlbWFpbmRlciBhdCBvbmNlOiBgb3JnX2ttczp3cml0ZWAsXG4gKiBgb3JnX2lkcDp3cml0ZWAsIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAsIGBiaWxsaW5nOm1hbmFnZWAsIGByb2xlczptYW5hZ2VgXG4gKiBhbmQgYGF1ZGl0OnJlYWRgIGFtb25nIHRoZW0uIFRoZSBwcm9kdWN0J3MgYW5zd2VyIGlzIFwiYXV0aG9yIGEgY3VzdG9tIFJvbGVcIixcbiAqIGFuZCB0aGUgc2FmZXR5IGlzIGFscmVhZHkgcmlnaHQgKGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBib3VuZHMgYSBjdXN0b20gUm9sZSBieVxuICogaXRzIGF1dGhvcidzIG93biBjZWlsaW5nKS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogVGhlIGV4YWN0IHNpemVzIG9mIHRoYXQgY2xpZmYgYXJlIGFzc2VydGVkIGluIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgXG4gKiByYXRoZXIgdGhhbiB3cml0dGVuIGhlcmUuIFRoaXMgcGFyYWdyYXBoIHVzZWQgdG8gY2FycnkgdGhlbSBpbmxpbmUg4oCUIFwidGhyZWVcbiAqIFJvbGVzOiBNZW1iZXIgKDE1KSwgVGVhbSBMZWFkICgxNykgYW5kIEFkbWluICgzNylcIiDigJQgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZVxuICogbnVtYmVycyB3ZW50IHN0YWxlOiBgVGVhbSBMZWFkYCBzdG9wcGVkIGJlaW5nIHNlZWRlZCB3aGVuIGl0IGJlY2FtZSB0aGUgZmlyc3RcbiAqIHRlbXBsYXRlIGJlbG93LCBhbmQgdGhlIHR3byBidW5kbGVzIGhhdmUgZ3Jvd24gc2luY2UuIEEgY291bnQgbm90aGluZyBjaGVja3NcbiAqIGlzIGEgY2xhaW0gdGhhdCBkZWNheXMsIGFuZCB0aGlzIG9uZSB3YXMgdGhlIHN0YXRlZCByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLlxuICpcbiAqIFdIWSBURU1QTEFURVMgQU5EIE5PVCBTRUVERUQgUk9MRVMuIEEgc2VlZGVkIGJ1aWx0LWluIGlzIGBzeXN0ZW06IHRydWVgIGFuZFxuICogdGhlcmVmb3JlIGltbXV0YWJsZSwgc28gc2VlZGluZyB0aGVzZSB3b3VsZCBwdXQgZm91ciB1bmRlbGV0YWJsZSByb3dzIGluIGV2ZXJ5XG4gKiBvcmcgd2hldGhlciBpdCB3YW50cyB0aGVtLiBBIHRlbXBsYXRlIGxlYXZlcyBubyB0cmFjZSB1bnRpbCBzb21lb25lIHVzZXMgaXQsXG4gKiBhbmQgd2hhdCBpdCBwcm9kdWNlcyBpcyBhbiBvcmRpbmFyeSBjdXN0b20gUm9sZSB0aGUgb3JnIGZ1bGx5IG93bnMg4oCUIGVkaXRhYmxlLFxuICogZGVsZXRhYmxlLCBhbmQgYm91bmRlZCBieSB0aGUgYXV0aG9yJ3MgY2VpbGluZyBsaWtlIGFueSBvdGhlci5cbiAqXG4gKiBXSEFUIFRIRVkgREVMSUJFUkFURUxZIEVYQ0xVREUuIGByb2xlczptYW5hZ2VgIGlzIGluIG5vbmUgb2YgdGhlbS4gSXQgaXMgdGhlXG4gKiBvbmUgcGVybWlzc2lvbiB0aGF0IGNvbXBvdW5kcyDigJQgdGhlIGhvbGRlciBjYW4gbWludCBmdXJ0aGVyIFJvbGVzLCB1cCB0byB0aGVpclxuICogb3duIGNlaWxpbmcg4oCUIHNvIGFjcXVpcmluZyBpdCBzaG91bGQgc3RheSBhIGNvbnNjaW91cyBhY3QgcmF0aGVyIHRoYW4gYSBzaWRlXG4gKiBlZmZlY3Qgb2YgcGlja2luZyBhIHByZXNldC4gRXZlcnkgcGVybWlzc2lvbiBoZXJlIGlzIG9yZy1hc3NpZ25hYmxlLCBzbyBhXG4gKiB0ZW1wbGF0ZSBpcyB2YWxpZCBpbiBhbnkgb3JnIGFuZCBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWNjZXB0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlVGVtcGxhdGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBqb2IgaXMg4oCUIHNob3duIG5leHQgdG8gdGhlIHRlbXBsYXRlLCBhbmQgYSBzZW5zaWJsZSBSb2xlIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xufVxuXG5leHBvcnQgY29uc3QgUk9MRV9URU1QTEFURVM6IHJlYWRvbmx5IFJvbGVUZW1wbGF0ZVtdID0gW1xuICB7XG4gICAgLy8gV2FzIGEgU0VFREVEIFJvbGUgaW4gZXZlcnkgb3JnIHVudGlsIGl0IGJlY2FtZSBhIHRlbXBsYXRlLiBJdCBpcyB0aGUgb25seVxuICAgIC8vIGJ1aWx0LWluIHRoYXQgd2FzIGEgam9iIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGEgc3RydWN0dXJhbCByZXF1aXJlbWVudDpcbiAgICAvLyBTdXBlciBBZG1pbiBpcyB3aGVyZSBgaXNTdXBlckFkbWluYCBpcyBkZXJpdmVkIGZyb20sIEFkbWluIGFuZCBNZW1iZXIgYXJlXG4gICAgLy8gdGhlIGZsb29yIGFuIG9yZyBpcyB1bnVzYWJsZSB3aXRob3V0LCBhbmQgdGhlIHN5c3RlbS1vcmcgUm9sZXMgY2FycnlcbiAgICAvLyBwZXJtaXNzaW9ucyBubyBjdXN0b20gUm9sZSBtYXkgaG9sZC4gVGVhbSBMZWFkIHdhcyBub25lIG9mIHRob3NlIOKAlCBpdCBpc1xuICAgIC8vIGBtZW1iZXJgIHBsdXMgdHdvIHJlcG9ydCBwZXJtaXNzaW9ucywgYW5kIGFuIG9yZyB0aGF0IGRvZXMgbm90IGRlbGVnYXRlXG4gICAgLy8gcmVwb3J0IGF1dGhvcmluZyBoYWQgYW4gdW5kZWxldGFibGUgcm93IGZvciBpdCBhbnl3YXkuXG4gICAgLy9cbiAgICAvLyBDT05TRVFVRU5DRSwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGEgbmV3IG9yZyBubyBsb25nZXIgaGFzIGEgUm9sZVxuICAgIC8vIHRoYXQgZ3JhbnRzIGByZXBvcnRzOndyaXRlYCB0byBhIG5vbi1hZG1pbi4gQW4gYWRtaW4gaG9sZHMgYm90aCBwZXJtaXNzaW9uc1xuICAgIC8vICh0aGV5IGFyZSBpbiB0aGUgYWRtaW4gYnVuZGxlKSBhbmQgaW5zdGFudGlhdGVzIHRoaXMgdGVtcGxhdGUgdG8gZGVsZWdhdGVcbiAgICAvLyB0aGVtIOKAlCB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZm91ciBiZWxvdy4gT3JncyB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgc2VlZGVkXG4gICAgLy8gUm9sZSBrZWVwIGl0LCBhbmQgdGhlIGJhY2tmaWxsIGtlZXBzIGl0cyBidW5kbGUgY3VycmVudC5cbiAgICBpZDogJ3RlYW0tbGVhZCcsXG4gICAgbmFtZTogJ1RlYW0gTGVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdBdXRob3JzIGFuZCBzaGFyZXMgc3Rha2Vob2xkZXIgcmVwb3J0cyBmb3IgYSB0ZWFtLCB3aXRob3V0IG9yZy1hZG1pbiBhY2Nlc3MuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJ10sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBNRU1CRVIgQUxSRUFEWSBJUyBUSEUgREVWRUxPUEVSIFJPTEUg4oCUIHRoaXMgdGVtcGxhdGUgZXhpc3RzIGZvciB3aGF0IGl0XG4gICAgICogZG9lcyBOT1QgY292ZXIuXG4gICAgICpcbiAgICAgKiBFdmVyeXRoaW5nIGluIGEgZGV2ZWxvcGVyJ3MgbG9vcCBpcyBgcGlwZWxpbmVzOnJlYWRgICsgYHBpcGVsaW5lczp3cml0ZWAsXG4gICAgICogYm90aCBpbiB0aGUgbWVtYmVyIGJ1bmRsZTogY3JlYXRlLCBlZGl0LCB2YWxpZGF0ZSwgcnVuLCBzdG9wLCB0aGUgYnVsa1xuICAgICAqIG9wcywgQUkgZ2VuZXJhdGlvbiAoYC9waXBlbGluZXMvZ2VuZXJhdGVgLCBpbmNsLiBmcm9tLXVybCBhbmQgc3RyZWFtaW5nKSxcbiAgICAgKiB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHBsdXMgYHRlbXBsYXRlczpyZWFkYCB0byBpbnN0YW50aWF0ZSBhbmRcbiAgICAgKiBgcGx1Z2luczppbnN0YWxsYCB0byBhZGQgYSBwbHVnaW4uIEEgdGVtcGxhdGUgcmVzdGF0aW5nIHRoYXQgd291bGQgYnV5XG4gICAgICogbm90aGluZy5cbiAgICAgKlxuICAgICAqIFdoYXQgYSBkZXZlbG9wZXIgaGl0cyB0aGUgY2xpZmYgb24gaXMgdGhlIFNFTEYtU0VSVklDRSBvcGVyYXRlIHBhaXI6IHRoZXlcbiAgICAgKiBjYW4gcmVhZCB0aGVpciBzZXJ2aWNlJ3MgZGFzaGJvYXJkcyBhbmQgbWV0cmljcyBhbmQgY2Fubm90IGNoYW5nZSBlaXRoZXIsXG4gICAgICogYmVjYXVzZSBib3RoIHdyaXRlcyBzaXQgaW4gdGhlIGFkbWluIGJ1bmRsZS4gU28gdGhlIHBlcnNvbiB3aG8gb3ducyBhXG4gICAgICogcGlwZWxpbmUgZmlsZXMgYSB0aWNrZXQgdG8gZ2V0IGFuIGFsZXJ0IG9uIGl0LlxuICAgICAqXG4gICAgICogREVMSUJFUkFURUxZIE5PVCBIRVJFLiBgbG9nczpleHBvcnRgIOKAlCB2aWV3aW5nIGxvZ3MgcmlkZXNcbiAgICAgKiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCwgYnV0IGRvd25sb2FkaW5nIHRoZW0gaXMgYnVsayBlZ3Jlc3MgYW4gb3JnIG1heVxuICAgICAqIHdpdGhob2xkIGZyb20gbWVtYmVycyAoZG9jcy9wZXJtaXNzaW9ucy5tZCksIGFuZCBhIHRlbXBsYXRlIGFpbWVkIGF0IGV2ZXJ5XG4gICAgICogZW5naW5lZXIgd291bGQgcmV2ZXJzZSB0aGF0LiBgcGlwZWxpbmVzOnB1Ymxpc2hgIOKAlCBzaGFyaW5nIGJleW9uZCB0aGVcbiAgICAgKiBhdXRob3IgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCB3aGljaCBpcyBSZWxlYXNlIE1hbmFnZXIncyBiZWxvdzsgc29tZWJvZHlcbiAgICAgKiB3aG8gZG9lcyBib3RoIGhvbGRzIGJvdGggUm9sZXMuXG4gICAgICovXG4gICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgIG5hbWU6ICdEZXZlbG9wZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGRzIGFuZCBydW5zIHBpcGVsaW5lcywgYW5kIG93bnMgdGhlIGRhc2hib2FyZHMgYW5kIGFsZXJ0cyBmb3Igd2hhdCB0aGV5IGJ1aWxkLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdkYXNoYm9hcmRzOndyaXRlJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncmVsZWFzZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUmVsZWFzZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgd2hhdCBiZWNvbWVzIHNoYXJlZCBiZXlvbmQgaXRzIGF1dGhvciwgYW5kIGFwcHJvdmVzIHBsdWdpbiBpbnN0YWxscy4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAgICAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdzZWN1cml0eS1vZmZpY2VyJyxcbiAgICBuYW1lOiAnU2VjdXJpdHkgT2ZmaWNlcicsXG4gICAgZGVzY3JpcHRpb246ICdJZGVudGl0eSwgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgZXZpZGVuY2UgdHJhaWwg4oCUIHRoZSBzdXJmYWNlIGFuIGF1ZGl0b3IgYXNrcyBhYm91dC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYXVkaXQ6cmVhZCcsICdsb2dzOmV4cG9ydCcsXG4gICAgICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgICAgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG4gICAgICAvLyBPd25pbmcgdGhlIGltcGVyc29uYXRpb24gUE9MSUNZIChgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgKSB3aXRob3V0XG4gICAgICAvLyBiZWluZyBhYmxlIHRvIGFuc3dlciBhIFJFUVVFU1Qgd2FzIHRoZSBhc3ltbWV0cnkgdGhlIGNvbnNlbnQgZmxvdyBsZWZ0XG4gICAgICAvLyBiZWhpbmQ6IHRoZSBsZXNzZXIgYWN0IGhhZCBhIHBlcm1pc3Npb24gb2YgaXRzIG93biBhbmQgdGhlIGdyZWF0ZXIgb25lXG4gICAgICAvLyBoYWQgbm9uZS4gV2hvZXZlciBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyByZXF1aXJlZCBzaG91bGQgYmUgYWJsZSB0b1xuICAgICAgLy8gZ2l2ZSBvciB3aXRoaG9sZCBpdC5cbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Blb3BsZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUGVvcGxlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvc3RlciBhbmQgaXRzIG1hY2hpbmUgY3JlZGVudGlhbHMsIGFjcm9zcyB0aGUgYWNjb3VudFxcdTIwMTlzIHRlYW1zIOKAlCB3aXRob3V0IHRoZSBvcmdcXHUyMDE5cyBzZXR0aW5ncyBvciBpdHMgbW9uZXkuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ21lbWJlcnM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICAgICAvLyBUaGUgc2FtZSBqb2IsIG9uZSBsZXZlbCBkb3duOiBlbnRlcmluZyBhIGRlc2NlbmRhbnQgdGVhbSB0byB3b3JrIG9uIGl0c1xuICAgICAgLy8gcm9zdGVyLCBhbmQgdmlld2luZyBvbmUgb2YgaXRzIG1lbWJlcnMgYXMgdGhhdCBtZW1iZXIuIFdpdGhvdXQgaXQgYVxuICAgICAgLy8gcGVvcGxlIG1hbmFnZXIgaW4gYSBwYXJlbnQgb3JnIGNhbiBhZG1pbmlzdGVyIHRoZSBhY2NvdW50J3MgdGVhbXMgb25cbiAgICAgIC8vIHBhcGVyIGFuZCBub3QgcmVhY2ggdGhlbS5cbiAgICAgICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdiaWxsaW5nLW1hbmFnZXInLFxuICAgIG5hbWU6ICdCaWxsaW5nIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHN1YnNjcmlwdGlvbiwgc2VhdHMgYW5kIGludm9pY2VzIGZvciB0aGlzIG9yZ2FuaXphdGlvbi4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJywgJ3F1b3RhczpyZWFkJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIGpvYiB0aGUgaW1wZXJzb25hdGlvbiBjb25zZW50IGZsb3cgY3JlYXRlZCBJTlNJREUgdGhlIHRlbmFudDogdGhlXG4gICAgICogbmFtZWQgcGVyc29uIHdobyBhbnN3ZXJzIFwibWF5IGEgc3VwcG9ydCBlbmdpbmVlciB2aWV3IHRoaXMgYWNjb3VudD9cIiBhbmRcbiAgICAgKiBjYW4gYWZ0ZXJ3YXJkcyByZWFkIHdoYXQgaGFwcGVuZWQuXG4gICAgICpcbiAgICAgKiBJdCBleGlzdHMgYXMgYSB0ZW1wbGF0ZSBiZWNhdXNlIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIGlzIGluIHRoZSBhZG1pblxuICAgICAqIGFuZCBvd25lciBidW5kbGVzIOKAlCBzbyBieSBkZWZhdWx0IGV2ZXJ5IGFkbWluIG1heSBjb25zZW50IOKAlCBhbmQgdGhlIHdob2xlXG4gICAgICogcG9pbnQgb2Ygc3BsaXR0aW5nIGl0IG91dCB3YXMgdG8gbGV0IGFuIG9yZyBzYXkgXCJ0aGlzIGRlY2lzaW9uIGlzIG9uZVxuICAgICAqIHBlcnNvbidzXCIuIERvaW5nIHRoYXQgbWVhbnMgYXV0aG9yaW5nIGEgUm9sZSB0aGF0IGhvbGRzIGl0IGFuZCB0YWtpbmcgaXRcbiAgICAgKiBvZmYgdGhlIG90aGVycywgYW5kIGhhbmQtY29tcG9zaW5nIHdhcyB0aGUgb25seSByb3V0ZS5cbiAgICAgKlxuICAgICAqIFR3byBwZXJtaXNzaW9ucyBhbmQgbm8gbW9yZTogYXBwcm92aW5nIGlzIG5vdCBhZG1pbmlzdGVyaW5nLiBgYXVkaXQ6cmVhZGBcbiAgICAgKiBpcyBoZXJlIGJlY2F1c2UgY29uc2VudGluZyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2sgd2hhdCB0aGUgc2Vzc2lvblxuICAgICAqIHRoZW4gZGlkIGlzIGNvbnNlbnQgaW4gbmFtZSBvbmx5LlxuICAgICAqL1xuICAgIGlkOiAnYWNjZXNzLWFwcHJvdmVyJyxcbiAgICBuYW1lOiAnQWNjZXNzIEFwcHJvdmVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Fuc3dlcnMgcmVxdWVzdHMgdG8gdmlldyB0aGlzIG9yZ2FuaXphdGlvblxcdTIwMTlzIGFjY291bnRzLCBhbmQgcmVhZHMgdGhlIHRyYWlsIG9mIHdoYXQgaGFwcGVuZWQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICdhdWRpdDpyZWFkJyxcbiAgICBdLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJUZWFtIExlYWRcIiBSb2xlIOKAlCB0aGUgcGVyc29uIHdobyByZXBvcnRzIFVQV0FSRC5cbiAqXG4gKiBFeGlzdHMgYmVjYXVzZSB0aGUgdGFyZ2V0IHVzZXIgZm9yIHN0YWtlaG9sZGVyIHJlcG9ydHMgaXMgYSBsZWFkLCBub3QgYW4gYWRtaW4sXG4gKiBhbmQgZ3JhbnRpbmcgYHJlcG9ydHM6d3JpdGVgIG9ubHkgdGhyb3VnaCB0aGUgYWRtaW4gYnVuZGxlIHdvdWxkIGhhdmUgZm9yY2VkXG4gKiBldmVyeSByZXBvcnRpbmcgbGVhZCB0byBiZSBhbiBvcmcgYWRtaW4gKG1lbWJlcnM6bWFuYWdlLCByb2xlczptYW5hZ2UsXG4gKiBvcmdfc2V0dGluZ3M6d3JpdGUsIGJpbGxpbmcpIHRvIHNlbmQgdGhlaXIgbWFuYWdlciBhIHdlZWtseSBzdW1tYXJ5LlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IGByZXBvcnRzOnJvbGx1cGAuIFJvbGxpbmcgYSByZXBvcnQgdXAgb3ZlciBkZXNjZW5kYW50XG4gKiB0ZWFtcyBpcyBkb3dud2FyZCB2aXNpYmlsaXR5IGFjcm9zcyB0aGUgb3JnIHRyZWUsIHdoaWNoIGlzIGEgZ3JhbnRlZCBjYXBhYmlsaXR5XG4gKiBpbiB0aGlzIG1vZGVsLCBub3Qgc29tZXRoaW5nIGEgdGVhbSdzIG93biBsZWFkIGdldHMgYnkgZGVmYXVsdCDigJQgYSBsZWFkIG9mIGFcbiAqIFBBUkVOVCBvcmcgaXMgZ3JhbnRlZCBpdCBleHBsaWNpdGx5LiBUaGUgUm9sZSBncmFudHMgdGhlIGNvYXJzZSBgbWVtYmVyYCBsYWJlbFxuICogYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBURUFNX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uTUVNQkVSX1BFUk1JU1NJT05TLFxuICAncmVwb3J0czp3cml0ZScsXG4gICdyZXBvcnRzOnB1Ymxpc2gnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgQXV0b21hdGlvblwiIFJvbGUg4oCUIHdoYXQgdGhlIG9yZydzXG4gKiB1bnNjb3BlZCBzdG9yZWQgY3JlZGVudGlhbCAodGhlIGBwbGF0Zm9ybS1hdXRvbWF0aW9uYCBzZXJ2aWNlIGFjY291bnQgdGhhdFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gIHByb3Zpc2lvbnMpIG5lZWRzLCBhbmQgbm90aGluZyBtb3JlLlxuICpcbiAqIERlcml2ZWQgYnkgdHJhY2luZyBldmVyeSBjYWxsIG1hZGUgd2l0aCB0aGF0IGtleSwgbm90IGJ5IGd1ZXNzaW5nOlxuICogIC0gYHBpcGVsaW5lczpyZWFkYCDigJQgdGhlIENvZGVCdWlsZCBzeW50aCAoYW5kIGBwaXBlbGluZSBkZXBsb3kgLS1zdG9yZS10b2tlbnNgKVxuICogICAgZmV0Y2hpbmcgdGhlIHBpcGVsaW5lIGl0IGJ1aWxkcyAoYEdFVCAvcGlwZWxpbmVzLzppZGApO1xuICogIC0gYHBsdWdpbnM6cmVhZGAgICDigJQgcGx1Z2luIHJlc29sdXRpb24gYXQgc3ludGgvZGVwbG95IGFuZCBpbiB0aGUgcGx1Z2luLWxvb2t1cFxuICogICAgTGFtYmRhIChgUE9TVCAvcGx1Z2lucy9sb29rdXBgKSwgYW5kIHRoZSBydW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIHN0ZXBcbiAqICAgIChgUE9TVCAvcGx1Z2lucy9ydW50aW1lLWNoZWNrYCkuXG4gKlxuICogV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgY2FycnksIGFuZCB3aGVyZSB0aGF0IHdvcmsgd2VudDpcbiAqICAtIHJlZ2lzdHJ5IHdyaXRlcyAoYHBpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlYCkg4oCUIHRoZSBzeW50aCByZWdpc3RlcnMgaXRzIHN0ZXBcbiAqICAgIG1hbmlmZXN0IHdpdGggdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5IChQaXBlbGluZSBSZWdpc3RyYXRpb24pO1xuICogIC0gaW1hZ2UgcHVzaGVzIGFuZCBwdWxscyDigJQgQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5IHdpdGhcbiAqICAgIHRoZSBgcmVnaXN0cnktcHVzaGAgc2NvcGVkIGtleSwgbmV2ZXIgdGhpcyBvbmU7XG4gKiAgLSByZXBvcnRpbmcgd3JpdGVzIOKAlCB0aGUgZXZlbnRzIExhbWJkYSBhbmQgc3RlcCByZXBvcnQgdXBsb2FkcyB1c2UgdGhlXG4gKiAgICBgcmVwb3J0aW5nOmluZ2VzdGAgc2NvcGVkIGtleS5cbiAqXG4gKiBJdCB1c2VkIHRvIGJlIHRoZSBvcmcgQURNSU4gUm9sZSwgc28gYSBsZWFrZWQgc3ludGggY3JlZGVudGlhbCBjb3VsZCByZXdyaXRlXG4gKiBldmVyeSBwaXBlbGluZSwgUm9sZSBhbmQgbWVtYmVyIG9mIHRoZSBvcmcuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsXG4gICdwbHVnaW5zOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgUmVnaXN0cmF0aW9uXCIgUm9sZSwgaGVsZCBieSB0aGVcbiAqIGBwaXBlbGluZS1yZWdpc3RlcmAgc2VydmljZSBhY2NvdW50OiBgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCBmb3JcbiAqIGl0cyBvd24gb3JnIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vdCBldmVuIGEgcmVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgb3JnIHBlcm1pc3Npb25zIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uXG4gKlxuICogU2luZ2xlLXNvdXJjZSBtb2RlbDogYSB1c2VyJ3MgYWJpbGl0aWVzIGFyZSBFWEFDVExZIHRoZSB1bmlvbiBvZiB0aGVcbiAqIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgdGhlIFJvbGVzIHRoZXkgaG9sZCAoYSBSb2xlID0gYSBuYW1lZCBwZXJtaXNzaW9uIHNldDtcbiAqIGJ1aWx0LWluIFJvbGVzIGNhcnJ5IHRoZWlyIGJ1bmRsZSBleHBsaWNpdGx5LCBzZWVkZWQgZnJvbVxuICoge0BsaW5rIFJPTEVfUEVSTUlTU0lPTlN9KS4gVGhlcmUgaXMgbm8gc2VwYXJhdGUgcm9sZS1kZXJpdmVkIGJhc2VsaW5lIOKAlCB0aGVcbiAqIGNvYXJzZSBgcm9sZWAgbGFiZWwgZ3JhbnRzIG5vdGhpbmcgb24gaXRzIG93bi5cbiAqXG4gKiAxLiBQbGF0Zm9ybSBzdXBlcmFkbWlucyAoYGlzU3VwZXJBZG1pbmApIGFsd2F5cyBnZXQgQUxMIHBlcm1pc3Npb25zLlxuICogMi4gT3RoZXJ3aXNlLCB1bmlvbiBldmVyeSBwZXJtaXNzaW9uIGdyYW50ZWQgYnkgdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcy5cbiAqIDMuIEludmFsaWQvdW5rbm93biBwZXJtaXNzaW9uIHN0cmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkUGVybWlzc2lvbnMgLSBGbGF0dGVuZWQgcGVybWlzc2lvbnMgZnJvbSBldmVyeSBSb2xlIHRoZSB1c2VyIGhvbGRzXG4gKiBAcGFyYW0gaXNTdXBlckFkbWluIC0gV2hldGhlciB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBzdXBlci1hZG1pbiBmbGFnXG4gKiBAcmV0dXJucyBFZmZlY3RpdmUgcGVybWlzc2lvbnMgaW4gY2Fub25pY2FsIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlclBlcm1pc3Npb25zKFxuICBhc3NpZ25lZFBlcm1pc3Npb25zPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogUGVybWlzc2lvbltdIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfUEVSTUlTU0lPTlNdO1xuXG4gIGNvbnN0IHBlcm1zID0gbmV3IFNldDxQZXJtaXNzaW9uPigpO1xuICBpZiAoYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3QgcCBvZiBhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoaXNWYWxpZFBlcm1pc3Npb24ocCkpIHBlcm1zLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIocCA9PiBwZXJtcy5oYXMocCkpO1xufVxuXG4vKipcbiAqIENvbmZpbmUgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgdG8gd2hhdCBtYXkgYmUgaGVsZCBpbiB0aGUgdG9rZW4ncyBBQ1RJVkVcbiAqIG9yZzogb3V0c2lkZSB0aGUgc3lzdGVtIG9yZyBldmVyeSB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSBlbnRyeSBpc1xuICogZHJvcHBlZCAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIEFwcGxpZWQgYXQgdG9rZW4gaXNzdWUgb25cbiAqIHRvcCBvZiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30g4oCUIGluY2x1ZGluZyBhIHN1cGVyYWRtaW4ncyBpbXBsaWNpdC1hbGwg4oCUXG4gKiBzbyBhIHRva2VuIG1pbnRlZCBpbiBhIHRlbmFudCBvcmcgbmV2ZXIgQ0xBSU1TIGBwbHVnaW5zOm1vZGVyYXRlYCAvXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgLCBldmVuIGlmIGEgaGFuZC13cml0dGVuIFJvbGUgZG9jdW1lbnQgc29tZWhvdyBjYXJyaWVkXG4gKiB0aGVtIHRoZXJlLiAoU3VwZXJhZG1pbnMgc3RpbGwgcGFzcyBgaGFzUGVybWlzc2lvbmAgdmlhIHRoZSBmbGFnOyB0aGVcbiAqIGVjb3N5c3RlbSByb3V0ZSBnYXRlIGFkZGl0aW9uYWxseSByZXF1aXJlcyB0aGUgc3lzdGVtIG9yZywgc28gdGhhdCBieXBhc3NcbiAqIG5ldmVyIHJlYWNoZXMgYSBnb3Zlcm5hbmNlIHJvdXRlIGZyb20gYSB0ZW5hbnQgb3JnIGVpdGhlci4pXG4gKlxuICogVGFrZXMgYSBib29sZWFuIHJhdGhlciB0aGFuIGFuIG9yZyBpZCBzbyB0aGlzIG1vZHVsZSBzdGF5cyBkZXBlbmRlbmN5LWZyZWVcbiAqICh0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdCk7IGNhbGxlcnMgZGVjaWRlIHdpdGggYXBpLWNvcmUgYGlzU3lzdGVtT3JnSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmluZVBlcm1pc3Npb25zVG9Pcmc8UCBleHRlbmRzIHN0cmluZz4oXG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQW10sXG4gIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnOiBib29sZWFuLFxuKTogUFtdIHtcbiAgcmV0dXJuIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnID8gWy4uLnBlcm1pc3Npb25zXSA6IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocCkpO1xufVxuXG4vKiogV2hldGhlciBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCBncmFudHMgYHBlcm1pc3Npb25gIChzdXBlcmFkbWluIOKHkiBhbHdheXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24oXG4gIGdyYW50ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhZ3JhbnRlZCAmJiBncmFudGVkLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXMsIGFzIGEgVEFCTEVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVGhlIG5hbWVkIHBlcm1pc3Npb24gYnVuZGxlcyBhIGJ1aWx0LWluIFJvbGUgbWF5IGNhcnJ5LCBhbmQgdGhlIFJvbGUgTkFNRSBlYWNoXG4gKiBvbmUgaXMgc2VlZGVkIHVuZGVyLiBPbmUgdGFibGUsIGJlY2F1c2UgdGhlIHRocmVlIGZhY3RzIGFib3V0IGEgam9iIFJvbGUg4oCUXG4gKiBpdHMgaWQsIGl0cyBwZXJtaXNzaW9ucyBhbmQgaXRzIGRpc3BsYXkgbmFtZSDigJQgd2VyZSBwcmV2aW91c2x5IHRocmVlXG4gKiBpbmRlcGVuZGVudCBsaXN0cyBpbiB0aHJlZSBwbGFjZXMsIGFuZCBub3RoaW5nIGhlbGQgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBXSEFUIFdFTlQgV1JPTkcgV0lUSE9VVCBJVC4gVGhlIHBsYXRmb3JtIHJlc29sdmVkIGEgYnVuZGxlIHRocm91Z2ggYVxuICogbmluZS1icmFuY2ggYGlmYCBjaGFpbiB3aXRoIGEgZmFsbC10aHJvdWdoIHRvIHRoZSBjb2Fyc2UgYGdyYW50c1JvbGVgIGJ1bmRsZS5cbiAqIEV2ZXJ5IGpvYiBSb2xlIGdyYW50cyBgbWVtYmVyYCwgc28gYSBidW5kbGUgYWRkZWQgdG8gdGhlIGlkIGxpc3QgV0lUSE9VVCBpdHNcbiAqIGJyYW5jaCBkaWQgbm90IGZhaWwg4oCUIGl0IHNpbGVudGx5IHNlZWRlZCB0aGUgcGxhaW4gTWVtYmVyIGJ1bmRsZSwgYW5kIHRoZVxuICogc3RhcnR1cCBiYWNrZmlsbCB0aGVuIHJlLXN5bmNlZCBpdCB0byB0aGF0IHdyb25nIHZhbHVlIG9uIGV2ZXJ5IGJvb3QuIFRoZVxuICogUm9sZSBleGlzdGVkLCB3YXMgYXNzaWduYWJsZSBmcm9tIHRoZSBzdGFmZmluZyBwYW5lbCwgYW5kIGdyYW50ZWQgZmlmdGVlblxuICogdGVuYW50IHBlcm1pc3Npb25zIGluc3RlYWQgb2YgaXRzIGpvYi4gTm90aGluZyBhbnl3aGVyZSBleGVyY2lzZWQgdGhlXG4gKiByZXNvbHZlciBwZXIgYnVuZGxlLlxuICpcbiAqIEtleWVkIGFjY2VzcyBwbHVzIGBzYXRpc2ZpZXNgIG1ha2VzIGEgbWlzc2luZyBlbnRyeSBhIENPTVBJTEUgZXJyb3IsIGFuZCBhblxuICogZXh0cmEgb25lIHRvbyDigJQgaW4gYm90aCBkaXJlY3Rpb25zLCB3aXRoIG5vIHJ1bnRpbWUgY2hlY2sgdG8gZm9yZ2V0LlxuICpcbiAqIFRoZSBOQU1FIGxpdmVzIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbi4gVGhlIHBsYXRmb3JtIHNlZWRlZCBuYW1lcyBmcm9tIGl0c1xuICogb3duIGNvbnN0YW50cyB3aGlsZSB0aGUgZnJvbnRlbmQncyBzdGFmZmluZyByb3N0ZXIgaGFyZC1jb2RlZCBpdHMgb3duIGNvcHksXG4gKiBlYWNoIHBpbm5lZCBieSBhIHRlc3QgYWdhaW5zdCBpdHNlbGYg4oCUIHNvIHJlbmFtaW5nIGEgUm9sZSBwYXNzZWQgYm90aCBzdWl0ZXNcbiAqIGFuZCB0aGUgcm9zdGVyIHNpbGVudGx5IHJlbmRlcmVkIFwiUm9sZSBub3QgZm91bmRcIiwgd2hpY2ggaXMgdGhlIGdyYW50IHBhdGggZm9yXG4gKiB0aGF0IFJvbGUncyBwZXJtaXNzaW9ucyBkaXNhcHBlYXJpbmcuIEJvdGggc2lkZXMgcmVhZCB0aGlzIG5vdy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFUyA9IHtcbiAgZWNvc3lzdGVtX21hbmFnZXI6IHsgbmFtZTogJ0Vjb3N5c3RlbSBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIHRlYW1fbGVhZDogeyBuYW1lOiAnVGVhbSBMZWFkJywgcGVybWlzc2lvbnM6IFRFQU1fTEVBRF9QRVJNSVNTSU9OUyB9LFxuICBwbGF0Zm9ybV9vYnNlcnZlcjogeyBuYW1lOiAnUGxhdGZvcm0gT2JzZXJ2ZXInLCBwZXJtaXNzaW9uczogUExBVEZPUk1fT0JTRVJWRVJfUEVSTUlTU0lPTlMgfSxcbiAgcGxhdGZvcm1fb3BlcmF0b3I6IHsgbmFtZTogJ1BsYXRmb3JtIE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFBMQVRGT1JNX09QRVJBVE9SX1BFUk1JU1NJT05TIH0sXG4gIGFjY291bnRfbWFuYWdlcjogeyBuYW1lOiAnQWNjb3VudCBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUyB9LFxuICBjb25zb2xlX2FkbWluOiB7IG5hbWU6ICdDb25zb2xlIEFkbWluaXN0cmF0b3InLCBwZXJtaXNzaW9uczogQ09OU09MRV9BRE1JTl9QRVJNSVNTSU9OUyB9LFxuICBzdXBwb3J0X2FnZW50OiB7IG5hbWU6ICdTdXBwb3J0IEFnZW50JywgcGVybWlzc2lvbnM6IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlMgfSxcbiAgc3VwcG9ydF9sZWFkOiB7IG5hbWU6ICdTdXBwb3J0IExlYWQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TIH0sXG4gIHJlZ2lzdHJ5X29wZXJhdG9yOiB7IG5hbWU6ICdSZWdpc3RyeSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUyB9LFxuICBwaXBlbGluZV9hdXRvbWF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBBdXRvbWF0aW9uJywgcGVybWlzc2lvbnM6IFBJUEVMSU5FX0FVVE9NQVRJT05fUEVSTUlTU0lPTlMgfSxcbiAgcGlwZWxpbmVfcmVnaXN0cmF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBSZWdpc3RyYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogRXZlcnkgc2VlZC1idW5kbGUgaWQuIFRoZSBwbGF0Zm9ybSdzIGBSb2xlLnNlZWRCdW5kbGVgIGVudW0gaXMgdGhpcyBsaXN0LiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFX0lEUyA9IE9iamVjdC5rZXlzKFNFRURfQlVORExFUykgYXMgQXJyYXk8a2V5b2YgdHlwZW9mIFNFRURfQlVORExFUz47XG5leHBvcnQgdHlwZSBTZWVkQnVuZGxlSWQgPSBrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTO1xuXG4vKipcbiAqIFRoZSBTWVNURU0gT1JHJ3Mgam9iIFJvbGVzLCBpbiBzdGFmZmluZyBvcmRlciDigJQgdGhlIHN1YnNldCBvZlxuICoge0BsaW5rIFNFRURfQlVORExFU30gc2VlZGVkIHRoZXJlLCB3aGljaCBpcyBldmVyeSBidW5kbGUgZXhjZXB0IGB0ZWFtX2xlYWRgXG4gKiAoYSB0ZW5hbnQgam9iLCBhbmQgYSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhIHNlZWRlZCBSb2xlIHNpbmNlIGl0IHN0b3BwZWRcbiAqIGJlaW5nIHN0cnVjdHVyYWwpLlxuICpcbiAqIGBlY29zeXN0ZW1fbWFuYWdlcmAgSVMgb25lIG9mIHRoZW07IGl0IGlzIGxpc3RlZCBoZXJlIGV2ZW4gdGhvdWdoIGl0cyByb3N0ZXJcbiAqIGxpdmVzIG9uIHRoZSBFY29zeXN0ZW0gY29uc29sZSByYXRoZXIgdGhhbiB0aGUgc3RhZmZpbmcgcGFuZWwsIGJlY2F1c2Ugd2hhdFxuICogdGhpcyBsaXN0IGFuc3dlcnMgaXMgXCJ3aGljaCBSb2xlcyBkb2VzIHRoZSBzeXN0ZW0gb3JnIHNlZWRcIiwgbm90IFwid2hpY2ggcGFuZWxcbiAqIHJlbmRlcnMgdGhlbVwiLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19KT0JfQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBbXG4gICdlY29zeXN0ZW1fbWFuYWdlcicsXG4gICdwbGF0Zm9ybV9vYnNlcnZlcicsXG4gICdwbGF0Zm9ybV9vcGVyYXRvcicsXG4gICdhY2NvdW50X21hbmFnZXInLFxuICAnY29uc29sZV9hZG1pbicsXG4gICdzdXBwb3J0X2FnZW50JyxcbiAgJ3N1cHBvcnRfbGVhZCcsXG4gICdyZWdpc3RyeV9vcGVyYXRvcicsXG5dO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyDigJQgdGhlIHN1YnNldCBvZiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBoZWxkIGJ5XG4gKiB0aGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucy5cbiAqXG4gKiBTZWVkZWQgcmF0aGVyIHRoYW4gb2ZmZXJlZCBhcyBhIHtAbGluayBST0xFX1RFTVBMQVRFU30gZW50cnksIHVubGlrZSB0aGVcbiAqIHRlbmFudCBqb2IgcHJlc2V0cywgYmVjYXVzZSB0aGV5IGFyZSBzdHJ1Y3R1cmFsOiB0aGUgQ0xJIGdyYW50cyBvbmUgdG8gdGhlXG4gKiBhY2NvdW50IGl0IGNyZWF0ZXMgYW5kIHRoZSBzdGFydHVwIGJhY2tmaWxsIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIG9udG8gaXQsXG4gKiBhbmQgYm90aCBoYXZlIHRvIGZpbmQgaXQgaW4gRVZFUlkgb3JnIGJ5IGEgc3RhYmxlIGlkZW50aXR5LiBBIHRlbXBsYXRlIGxlYXZlc1xuICogbm90aGluZyB0byBmaW5kIHVudGlsIHNvbWVib2R5IGluc3RhbnRpYXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BVVRPTUFUSU9OX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAncGlwZWxpbmVfYXV0b21hdGlvbicsXG4gICdwaXBlbGluZV9yZWdpc3RyYXRpb24nLFxuXTtcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucywga2V5ZWQgYnlcbiAqIGFjY291bnQgbmFtZSwgYW5kIHRoZSBidWlsdC1pbiBSb2xlIGVhY2ggaG9sZHMg4oCUIGBudWxsYCBmb3IgYW4gYWNjb3VudCB3aG9zZVxuICoga2V5IGNhcnJpZXMgYSBjYXBhYmlsaXR5IFNDT1BFIChhIGBUb2tlblNjb3BlYCkgYW5kIHNvIG5lZWRzIG5vIFJvbGUgYXQgYWxsLlxuICpcbiAqIE9uZSB0YWJsZSBmb3IgdGhlIENMSSAod2hpY2ggUm9sZSB0byBncmFudCBhIE5FVyBhY2NvdW50KSBhbmQgdGhlIHBsYXRmb3JtJ3NcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgKHdoaWNoIFJvbGUgdG8gbW92ZSBhbiBFWElTVElORyBhY2NvdW50IG9udG8sIG9mZiB0aGUgb3JnXG4gKiBhZG1pbiBSb2xlIHRoZXNlIGFjY291bnRzIHdlcmUgb25jZSBnaXZlbikuIEEgcmVuYW1lIGhlcmUgbW92ZXMgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTID0ge1xuICAncGxhdGZvcm0tYXV0b21hdGlvbic6ICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lLXJlZ2lzdGVyJzogJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG4gICdyZXBvcnRpbmctaW5nZXN0JzogbnVsbCxcbiAgJ3JlZ2lzdHJ5LXB1c2gnOiBudWxsLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2VlZEJ1bmRsZUlkIHwgbnVsbD47XG4iXX0=
|