@pipeline-builder/api-core 5.2.11 → 5.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/helpers/org-hierarchy-http.d.ts +3 -2
- package/lib/helpers/org-hierarchy-http.js +11 -5
- package/lib/middleware/index.d.ts +1 -1
- package/lib/middleware/index.js +2 -2
- package/lib/middleware/step-up.d.ts +4 -3
- package/lib/middleware/step-up.js +1 -1
- package/lib/services/index.d.ts +2 -2
- package/lib/services/index.js +2 -2
- package/lib/services/quota.d.ts +1 -2
- package/lib/services/quota.js +1 -1
- package/lib/services/version-vuln-policy.d.ts +1 -3
- package/lib/services/version-vuln-policy.js +2 -3
- package/lib/types/common.d.ts +13 -22
- package/lib/types/common.js +44 -5
- package/lib/types/ecosystem-notifications.d.ts +215 -24
- package/lib/types/ecosystem-notifications.js +18 -9
- package/lib/types/ecosystem.d.ts +1 -0
- package/lib/types/ecosystem.js +33 -23
- package/lib/types/feature-flags.d.ts +11 -4
- package/lib/types/feature-flags.js +51 -11
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.js +2 -2
- package/lib/types/permissions.d.ts +353 -22
- package/lib/types/permissions.js +257 -128
- package/lib/types/plugin-catalog.d.ts +25 -1
- package/lib/types/plugin-catalog.js +21 -2
- package/lib/types/quota-tiers.d.ts +6 -24
- package/lib/types/quota-tiers.js +6 -28
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +10 -1
- package/lib/types/tier-limits.d.ts +19 -0
- package/lib/types/tier-limits.js +27 -1
- package/lib/types/usage-projection.d.ts +0 -16
- package/lib/types/usage-projection.js +1 -20
- package/lib/types/wire-vocabulary.d.ts +81 -2
- package/lib/types/wire-vocabulary.js +89 -3
- package/lib/validation/index.d.ts +1 -1
- package/lib/validation/index.js +2 -2
- package/lib/validation/plugin-spec-schema.d.ts +0 -9
- package/lib/validation/plugin-spec-schema.js +2 -11
- package/package.json +8 -1
package/lib/types/permissions.js
CHANGED
|
@@ -28,33 +28,6 @@ export const PERMISSION_ACTIONS = [
|
|
|
28
28
|
];
|
|
29
29
|
/** `resource:action`, where resource is `snake_case` and action is in {@link PERMISSION_ACTIONS}. */
|
|
30
30
|
export const PERMISSION_ID_SHAPE = /^[a-z][a-z0-9_]*:[a-z]+$/;
|
|
31
|
-
/** All valid permissions (order determines display order in the picker). */
|
|
32
|
-
export const ALL_PERMISSIONS = [
|
|
33
|
-
'pipelines:read', 'pipelines:write', 'pipelines:publish', 'pipeline_registry:write',
|
|
34
|
-
'toolchain:manage',
|
|
35
|
-
'templates:read', 'templates:write', 'templates:publish',
|
|
36
|
-
'plugins:read', 'plugins:write', 'plugins:publish',
|
|
37
|
-
'plugins:install', 'plugin_installs:manage', 'publishers:manage',
|
|
38
|
-
'plugins:moderate', 'publishers:verify',
|
|
39
|
-
'platform:read', 'orgs:read', 'toolchain:operate', 'billing:operate',
|
|
40
|
-
'observability_console:open', 'database_console:open', 'objectstore_console:open',
|
|
41
|
-
'oncall:manage',
|
|
42
|
-
'support_cases:write', 'support_content:write',
|
|
43
|
-
'subscriptions:read', 'subscriptions:manage',
|
|
44
|
-
'orgs:manage', 'quotas:manage', 'plugin_queue:manage',
|
|
45
|
-
'compliance:read', 'compliance:write',
|
|
46
|
-
'members:manage', 'roles:manage', 'invitations:manage', 'service_accounts:manage',
|
|
47
|
-
'dashboards:read', 'dashboards:write',
|
|
48
|
-
'observability:read', 'observability:write',
|
|
49
|
-
'logs:export', 'audit:read',
|
|
50
|
-
'reports:read', 'reports:rollup', 'reports:write', 'reports:publish',
|
|
51
|
-
'messages:read', 'messages:write',
|
|
52
|
-
'billing:read', 'billing:manage',
|
|
53
|
-
'quotas:read',
|
|
54
|
-
'registry:read', 'registry:write', 'registry:purge',
|
|
55
|
-
'impersonation:open', 'impersonation:approve', 'team_access:open',
|
|
56
|
-
'org_settings:write', 'org_idp:write', 'org_kms:write', 'org_impersonation:write',
|
|
57
|
-
];
|
|
58
31
|
/**
|
|
59
32
|
* The CLOSED set of functions that take a {@link Permission} and decide access.
|
|
60
33
|
*
|
|
@@ -95,82 +68,251 @@ export const PERMISSION_GATES = [
|
|
|
95
68
|
'authorizeOrg',
|
|
96
69
|
];
|
|
97
70
|
/**
|
|
98
|
-
*
|
|
71
|
+
* Every permission, keyed by id, with the display metadata the permission-picker
|
|
72
|
+
* UI shows (label, description, the category it groups under), in picker order.
|
|
73
|
+
* The comment above an entry is that permission's design note.
|
|
99
74
|
*
|
|
100
75
|
* This module is the SINGLE catalog for backend and browser alike: it has no
|
|
101
76
|
* runtime dependencies (the only import is a type), so the frontend imports it
|
|
102
77
|
* through the `@pipeline-builder/api-core/permissions` subpath instead of keeping
|
|
103
|
-
* a hand-maintained mirror.
|
|
104
|
-
* exactly once (asserted by `permissions.test.ts`).
|
|
78
|
+
* a hand-maintained mirror.
|
|
105
79
|
*/
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
80
|
+
const PERMISSION_DEFS = {
|
|
81
|
+
'pipelines:read': { label: 'View pipelines', description: 'View pipelines and their executions', category: 'Pipelines' },
|
|
82
|
+
'pipelines:write': { label: 'Manage pipelines', description: 'Create, edit, and delete pipelines', category: 'Pipelines' },
|
|
83
|
+
'pipelines:publish': { label: 'Publish pipelines', description: 'Make pipelines public (org-wide/catalog visibility)', category: 'Pipelines' },
|
|
84
|
+
// The pipeline REGISTRY (`POST`/`DELETE /pipelines/registry`): which deployed
|
|
85
|
+
// stack backs a pipeline, and the step manifest of plugin digests it runs.
|
|
86
|
+
// Split out of `pipelines:write` so the CodeBuild synth can keep that record
|
|
87
|
+
// current with a credential that can do nothing else — a key holding
|
|
88
|
+
// `pipelines:write` could rewrite every pipeline the org owns. People get it
|
|
89
|
+
// beside `pipelines:write` (the Member bundle); the `pipeline-register`
|
|
90
|
+
// service account holds it alone.
|
|
91
|
+
'pipeline_registry:write': { label: 'Register deployments', description: 'Record and remove the deployed stack and step manifest behind a pipeline (the pipeline registry)', category: 'Pipelines' },
|
|
92
|
+
// The org's managed-toolchain DEFAULT (docs/plans/bootstrap-image-versioning.md
|
|
93
|
+
// D13): which toolchain release every unpinned pipeline in the org (and its
|
|
94
|
+
// teams that set none) synthesizes with on its next run. Org-assignable, so
|
|
95
|
+
// Admin and Owner hold it; NOT in Member or any pipeline-editor bundle. Split
|
|
96
|
+
// by blast radius: `pipelines:write` moves ONE pipeline (its own
|
|
97
|
+
// `toolchain.release` pin), this moves ALL of them, and
|
|
98
|
+
// `plugin_installs:manage` governs future installs, not running pipelines.
|
|
99
|
+
// It never confers anything on the platform default, canary or catalog.
|
|
100
|
+
// Every write also needs `requireStepUp`.
|
|
101
|
+
'toolchain:manage': { label: 'Manage the org toolchain default', description: "Choose which managed toolchain release your org's unpinned pipelines (and teams without their own) build with, or follow the platform default", category: 'Pipelines' },
|
|
102
|
+
// Golden-path pipeline templates. Split out of `pipelines:*` so a platform
|
|
103
|
+
// team can curate the starter catalog WITHOUT write access to every pipeline
|
|
104
|
+
// (and vice versa). `:publish` maps to the
|
|
105
|
+
// template ladder's `public` rung; `org` and `private` need only `:write`.
|
|
106
|
+
'templates:read': { label: 'View templates', description: 'View the golden-path template catalog', category: 'Templates' },
|
|
107
|
+
'templates:write': { label: 'Manage templates', description: 'Author, edit, and delete pipeline templates', category: 'Templates' },
|
|
108
|
+
'templates:publish': { label: 'Publish templates', description: 'Share a template beyond your org (public visibility)', category: 'Templates' },
|
|
109
|
+
'plugins:read': { label: 'View plugins', description: 'View plugins and builds', category: 'Plugins' },
|
|
110
|
+
'plugins:write': { label: 'Manage plugins', description: 'Create, upload, edit, and delete plugins', category: 'Plugins' },
|
|
111
|
+
'plugins:publish': { label: 'Publish plugins', description: 'Make plugins public (org-wide/catalog visibility)', category: 'Plugins' },
|
|
112
|
+
// Plugin ecosystem (docs/plugin-publishing.md). Org-assignable:
|
|
113
|
+
// - `plugins:install` — install/upgrade/uninstall listings (or REQUEST
|
|
114
|
+
// an install when the org's policy needs approval).
|
|
115
|
+
// - `plugin_installs:manage` — the org's consumption policy + deciding install
|
|
116
|
+
// requests WITHIN the org (org-local only).
|
|
117
|
+
// - `publishers:manage` — the org's publisher profile + submitting
|
|
118
|
+
// ecosystem requests (every decision is system-org).
|
|
119
|
+
// System-org-only (see SYSTEM_ORG_ONLY_PERMISSIONS):
|
|
120
|
+
// - `plugins:moderate` — decide publish requests, moderate, yank, advisories.
|
|
121
|
+
// - `publishers:verify` — publisher tiers, profile changes, transfers.
|
|
122
|
+
'plugins:install': { label: 'Install plugins', description: 'Install, upgrade, and uninstall ecosystem plugins (or request an install when your org requires approval)', category: 'Plugin Ecosystem' },
|
|
123
|
+
'plugin_installs:manage': { label: 'Manage plugin installs', description: "Set your org's plugin consumption policy and approve or deny install requests within the org", category: 'Plugin Ecosystem' },
|
|
124
|
+
'publishers:manage': { label: 'Manage publisher profile', description: "Manage your org's publisher profile and submit publish, verification, transfer, and advisory requests", category: 'Plugin Ecosystem' },
|
|
125
|
+
'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' },
|
|
126
|
+
'publishers:verify': { label: 'Verify publishers', description: 'Approve Verified applications, publisher tier and profile changes, and ownership transfers (system org only)', category: 'Plugin Ecosystem' },
|
|
127
|
+
// Platform operations (system-org only). The cross-tenant operator surfaces
|
|
128
|
+
// that used to require the superadmin FLAG, so a deployment can staff them
|
|
129
|
+
// with a Role instead of handing out implicit-all. Split because the two carry
|
|
130
|
+
// different risk: reading what a deploy configured is not the same as moving
|
|
131
|
+
// another organisation's money.
|
|
132
|
+
'platform:read': { label: 'View platform operations', description: 'Read the platform settings and the cross-tenant organization list (system org only)', category: 'Platform operations' },
|
|
133
|
+
// The cross-tenant ORG LIST, split out of `platform:read` because that one
|
|
134
|
+
// permission was doing two jobs with different blast radii: reading what a
|
|
135
|
+
// DEPLOY was configured to do (RLS mode, KMS posture, the rendered alert
|
|
136
|
+
// rules) and reading the roster of every CUSTOMER. Three of the four job
|
|
137
|
+
// bundles carried it, and only one of them wanted the deploy internals —
|
|
138
|
+
// Console Administrator and Support Agent got them purely because they needed
|
|
139
|
+
// to find an org by name.
|
|
140
|
+
//
|
|
141
|
+
// Same mistake, and same fix, as `consoles:datastore` before it was split by
|
|
142
|
+
// what a mistaken grant costs.
|
|
143
|
+
'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' },
|
|
144
|
+
// The Toolchain CONSOLE (plan D9; named after `billing:operate`): publish
|
|
145
|
+
// lifecycle, canary membership and THE platform default — every org without
|
|
146
|
+
// its own default moves with it. System-org-only (otherwise ADMIN_PERMISSIONS,
|
|
147
|
+
// derived from ORG_ASSIGNABLE_PERMISSIONS, would hand it to every tenant
|
|
148
|
+
// Admin); carried by Platform Operator. Every write also needs `requireStepUp`.
|
|
149
|
+
'toolchain:operate': { label: 'Operate the platform toolchain', description: 'Run the Toolchain console: canary membership, release notes, deprecate / yank / delete releases, and set the platform default every org without its own follows (system org only)', category: 'Platform operations' },
|
|
150
|
+
'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' },
|
|
151
|
+
// The operator consoles, split by BLAST RADIUS rather than by product. Three
|
|
152
|
+
// permissions for five consoles, because what a mistaken grant costs differs
|
|
153
|
+
// by an order of magnitude at each step:
|
|
154
|
+
//
|
|
155
|
+
// - `observability_console:open` — Grafana and Kiali. Read-only views; the worst
|
|
156
|
+
// outcome of a mistaken grant is seeing telemetry.
|
|
157
|
+
// - `database_console:open` — pgAdmin and mongo-express. A database shell
|
|
158
|
+
// over every tenant's rows: it can read and rewrite tenant data, but the
|
|
159
|
+
// audit chain lives elsewhere, so the damage is recorded.
|
|
160
|
+
// - `objectstore_console:open` — the RustFS (S3) console. It can LIST and
|
|
161
|
+
// DELETE objects in the registry, Loki, Thanos, plugin-build and
|
|
162
|
+
// audit-chain buckets. Split from the pair above because the two are the
|
|
163
|
+
// two HALVES of the audit tamper-evidence design: the chain's HMAC key
|
|
164
|
+
// lives outside the DB, so a Mongo shell can tamper but cannot forge a
|
|
165
|
+
// consistent chain — except by truncating the tail, which a chain cannot
|
|
166
|
+
// see from the inside, and the defence against THAT is the signed
|
|
167
|
+
// chain-head export to object storage. One shell can truncate; the other
|
|
168
|
+
// can delete the heads that would expose the truncation.
|
|
169
|
+
//
|
|
170
|
+
// All three are system-org-only, so none can be held inside a tenant, and only
|
|
171
|
+
// the first is in the Platform Operator bundle: staffing an operator must never
|
|
172
|
+
// hand over a data shell as a side effect. Granting either of the other two is
|
|
173
|
+
// a separate, explicit act by a superadmin composing a Role for exactly that
|
|
174
|
+
// purpose.
|
|
175
|
+
//
|
|
176
|
+
// WHAT THE SPLIT DOES NOT DO, so nobody builds on it: it is not a containment
|
|
177
|
+
// boundary. Roles live in Mongo (`collection: 'roles'`), so a
|
|
178
|
+
// `database_console:open` holder can write that collection and grant themselves
|
|
179
|
+
// `objectstore_console:open` — datastore contains objectstore by escalation. The
|
|
180
|
+
// split expresses intent, keeps the default grant small and gives each class
|
|
181
|
+
// its own refusal signal. What actually protects the audit heads from whoever
|
|
182
|
+
// opens that console is S3 Object Lock with a retain-until-date
|
|
183
|
+
// (`platform/src/services/audit-head-export.ts`), which holds regardless of
|
|
184
|
+
// any permission here.
|
|
185
|
+
'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' },
|
|
186
|
+
'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' },
|
|
187
|
+
'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' },
|
|
188
|
+
// On-call (system-org only). Reads the paging POSTURE and sends a test page.
|
|
189
|
+
// Not a schedule editor — the provider owns the rota — and deliberately not a
|
|
190
|
+
// settings surface either, because every knob is operator-side env. What it
|
|
191
|
+
// grants is the one thing a product surface can give that a shell cannot:
|
|
192
|
+
// "will we actually be paged", answerable without cluster access.
|
|
193
|
+
'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' },
|
|
194
|
+
// The vendor's other operational TASKS (system org only). Each exists so a
|
|
195
|
+
// superadmin can staff one job with a Role instead of the superadmin flag —
|
|
196
|
+
// before these, 34 routes were reachable only by someone who also held
|
|
197
|
+
// impersonation, a database shell and the ability to mint another superadmin.
|
|
198
|
+
//
|
|
199
|
+
// Support desk, split in two because the content is reused across every
|
|
200
|
+
// customer while a case belongs to one: `support_cases:write` is the desk's
|
|
201
|
+
// own work (triage, assignment, severity, internal notes, recording an
|
|
202
|
+
// incident against a support contract), `support_content:write` is authoring
|
|
203
|
+
// the canned replies. Each gates its task's READS as well as its writes,
|
|
204
|
+
// against the usual convention, because these tables carry no `org_id` — there
|
|
205
|
+
// is no tenancy boundary underneath to fall back on.
|
|
206
|
+
'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' },
|
|
207
|
+
'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' },
|
|
208
|
+
// Cross-tenant subscriptions. Read is split from write because a read-only
|
|
209
|
+
// holder is a real job here: someone who reports on revenue and plan mix
|
|
210
|
+
// without being able to change a plan or cancel one.
|
|
211
|
+
'subscriptions:read': { label: 'View all subscriptions', description: 'View every organization\u2019s subscription, plan mix and billing events (system org only)', category: 'Platform operations' },
|
|
212
|
+
'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' },
|
|
213
|
+
// The org lifecycle ACROSS tenants: rename, delete, change tier, move under a
|
|
214
|
+
// new parent. Distinct from `org_settings:write`, which is an org acting on
|
|
215
|
+
// itself.
|
|
216
|
+
'orgs:manage': { label: 'Administer any organization', description: 'Rename, re-tier, move and delete any organization (system org only)', category: 'Platform operations' },
|
|
217
|
+
// Cross-tenant quota writes. The matching reads (`/quotas/all`, `/at-risk`)
|
|
218
|
+
// ride `platform:read` with the rest of the operator dashboard, so someone
|
|
219
|
+
// watching for exhaustion does not need the ability to raise a limit.
|
|
220
|
+
'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' },
|
|
221
|
+
// The plugin BUILD queue — depth, stalls, and purging the dead-letter queue.
|
|
222
|
+
// Distinct from `plugins:moderate`, which is ecosystem governance: this is
|
|
223
|
+
// infrastructure, and the people who run it are not the people who review
|
|
224
|
+
// submissions.
|
|
225
|
+
'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' },
|
|
226
|
+
'compliance:read': { label: 'View compliance', description: 'View compliance rules, policies, and scans', category: 'Compliance' },
|
|
227
|
+
'compliance:write': { label: 'Manage compliance', description: 'Create and edit rules, policies, and exemptions', category: 'Compliance' },
|
|
228
|
+
'members:manage': { label: 'Manage members', description: 'Add, remove, and change roles of org members', category: 'Members & Access' },
|
|
229
|
+
'roles:manage': { label: 'Manage roles', description: 'Create, edit, and delete roles', category: 'Members & Access' },
|
|
230
|
+
'invitations:manage': { label: 'Manage invitations', description: 'Send, resend, and revoke invitations', category: 'Members & Access' },
|
|
231
|
+
// Org-scoped service accounts (non-human principals) and their access keys.
|
|
232
|
+
// Split out of `members:manage` because a service account is a CREDENTIAL
|
|
233
|
+
// holder, not a person: granting someone the ability to mint long-lived
|
|
234
|
+
// machine keys is a different decision from letting them manage the roster.
|
|
235
|
+
'service_accounts:manage': { label: 'Manage service accounts', description: 'Create org service accounts, assign their roles, and issue or revoke their keys', category: 'Members & Access' },
|
|
236
|
+
'dashboards:read': { label: 'View dashboards', description: 'View custom dashboards', category: 'Observability' },
|
|
237
|
+
'dashboards:write': { label: 'Manage dashboards', description: 'Create and edit custom dashboards', category: 'Observability' },
|
|
238
|
+
'observability:read': { label: 'View alerting', description: 'View alert rules and destinations', category: 'Observability' },
|
|
239
|
+
'observability:write': { label: 'Manage alerting', description: 'Create and edit alert rules and destinations', category: 'Observability' },
|
|
240
|
+
// `logs:export` is split OUT of `observability:read` deliberately. Reading
|
|
241
|
+
// logs in the UI is paged and ephemeral; EXPORTING them is bulk egress that
|
|
242
|
+
// leaves the building and outlives a revoked session, so an org admin must be
|
|
243
|
+
// able to grant log viewing without granting downloads.
|
|
244
|
+
'logs:export': { label: 'Download logs', description: "Download your organization's log entries as a file (viewing logs only needs 'View alerting')", category: 'Observability' },
|
|
245
|
+
// The org's own hash-chained audit trail. ORG-ASSIGNABLE, unlike the platform
|
|
246
|
+
// operations pair: the rows an org reads are its own (the query predicate is
|
|
247
|
+
// `orgId` OR `affectedOrgId`), so delegating it is an org's decision — a
|
|
248
|
+
// compliance reviewer can be given the trail without being made an admin of
|
|
249
|
+
// everything that produced it. Read-only by construction; there is no write.
|
|
250
|
+
'audit:read': { label: 'View the audit log', description: "Read the organization's own tamper-evident audit trail", category: 'Observability' },
|
|
251
|
+
'reports:read': { label: 'View reports', description: 'View analytics and reports', category: 'Insights' },
|
|
252
|
+
'reports:rollup': { label: 'Roll up team reports', description: 'Include descendant teams when viewing reports', category: 'Insights' },
|
|
253
|
+
// Stakeholder reports. `reports:read` stays the FREE on-demand dashboard read;
|
|
254
|
+
// these two are the add-on's write surface — `author` saves/schedules/drafts a
|
|
255
|
+
// report, `share` publishes it beyond the platform (PDF, email, share links).
|
|
256
|
+
// Split because publishing externally is a different risk from composing:
|
|
257
|
+
// a lead can be allowed to build reports without being allowed to email them out.
|
|
258
|
+
'reports:write': { label: 'Author stakeholder reports', description: 'Create, schedule and draft scheduled reports for managers', category: 'Insights' },
|
|
259
|
+
'reports:publish': { label: 'Publish reports externally', description: 'Publish a report and mint expiring share links for people outside the platform', category: 'Insights' },
|
|
260
|
+
'messages:read': { label: 'View messages', description: 'View messages and announcements', category: 'Messaging' },
|
|
261
|
+
'messages:write': { label: 'Send messages', description: 'Send messages and announcements', category: 'Messaging' },
|
|
262
|
+
'billing:read': { label: 'View billing', description: 'View subscriptions and usage', category: 'Billing & Quotas' },
|
|
263
|
+
'billing:manage': { label: 'Manage billing', description: 'Manage subscriptions, add-ons, and the billing portal', category: 'Billing & Quotas' },
|
|
264
|
+
'quotas:read': { label: 'View quotas', description: 'View organization quotas and usage', category: 'Billing & Quotas' },
|
|
265
|
+
// Registry. Three rungs, because the write half has two very different
|
|
266
|
+
// blast radii: `write` COPIES a manifest (additive — it creates a tag,
|
|
267
|
+
// nothing stops resolving), `purge` DELETES one (a tenant's pipeline or a
|
|
268
|
+
// digest-pinned plugin image can stop resolving, with no undo).
|
|
269
|
+
'registry:read': { label: 'View registry', description: 'View the container image registry', category: 'Registry' },
|
|
270
|
+
'registry:write': { label: 'Copy container images', description: 'Copy and promote a container image into another repository', category: 'Registry' },
|
|
271
|
+
'registry:purge': { label: 'Delete container images', description: 'Delete images and repositories, and run registry garbage collection', category: 'Registry' },
|
|
272
|
+
// Impersonation — viewing the platform as somebody else. Three ids, because
|
|
273
|
+
// three different parties are involved and each decision belongs to a
|
|
274
|
+
// different one of them (docs/permissions.md#impersonation):
|
|
275
|
+
// - `impersonation:open` the VENDOR opening a cross-tenant session, which
|
|
276
|
+
// is system-org-only and still consent-gated;
|
|
277
|
+
// - `team_access:open` a PARENT org's admin viewing one of its own teams'
|
|
278
|
+
// members, which never leaves the tenant;
|
|
279
|
+
// - `impersonation:approve` the TENANT answering a consent request.
|
|
280
|
+
// `org_impersonation:write` below is a fourth thing again: the POLICY that
|
|
281
|
+
// decides whether consent is needed at all.
|
|
282
|
+
'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' },
|
|
283
|
+
'impersonation:approve': { label: 'Answer impersonation requests', description: 'Approve or deny a request to view a member of this organization as that member', category: 'Impersonation' },
|
|
284
|
+
'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' },
|
|
285
|
+
// Organization settings. Four RESOURCES, each with the `:write` action, rather
|
|
286
|
+
// than one `org` resource with four noun-shaped actions — these are the org's
|
|
287
|
+
// own configuration state, which is what `:write` means here (`:manage` is
|
|
288
|
+
// reserved for administering a collection of other entities: members, roles,
|
|
289
|
+
// invitations, service accounts, billing).
|
|
290
|
+
//
|
|
291
|
+
// - `org_settings:write` — general org settings + AI config.
|
|
292
|
+
// - `org_idp:write` — SSO / IdP configuration (sensitive: controls login).
|
|
293
|
+
// - `org_kms:write` — customer-managed KMS key configuration
|
|
294
|
+
// (sensitive: controls encryption of org data).
|
|
295
|
+
// - `org_impersonation:write` — the impersonation policy (sensitive: controls
|
|
296
|
+
// who may VIEW the org's data as a member).
|
|
297
|
+
//
|
|
298
|
+
// The last three were split OUT of `org_settings:write` so a custom role can
|
|
299
|
+
// grant general settings WITHOUT the sensitive surfaces — a "settings manager"
|
|
300
|
+
// role for org name or AI provider must not also be able to switch the org to
|
|
301
|
+
// `open`. All remain org-assignable and are seeded into the admin/owner
|
|
302
|
+
// bundles (via ORG_ASSIGNABLE_PERMISSIONS) so existing admins keep full
|
|
303
|
+
// access.
|
|
304
|
+
'org_settings:write': { label: 'Organization settings', description: 'Manage general org settings and AI config', category: 'Organization' },
|
|
305
|
+
'org_idp:write': { label: 'Manage SSO/IdP', description: 'Configure single sign-on and identity providers', category: 'Organization' },
|
|
306
|
+
'org_kms:write': { label: 'Manage encryption keys', description: 'Configure customer-managed KMS encryption keys', category: 'Organization' },
|
|
307
|
+
'org_impersonation:write': { label: 'Manage impersonation policy', description: 'Control whether platform operators may view the organization as one of its members', category: 'Organization' },
|
|
308
|
+
};
|
|
309
|
+
/** All valid permissions (order determines display order in the picker). */
|
|
310
|
+
export const ALL_PERMISSIONS = Object.keys(PERMISSION_DEFS);
|
|
311
|
+
/** The permission catalog with display metadata, in picker order. */
|
|
312
|
+
export const PERMISSION_CATALOG = ALL_PERMISSIONS.map((id) => ({ id, ...PERMISSION_DEFS[id] }));
|
|
171
313
|
/** Human label for a permission id (falls back to the raw id for an unknown one). */
|
|
172
314
|
export function permissionLabel(id) {
|
|
173
|
-
return
|
|
315
|
+
return isValidPermission(id) ? PERMISSION_DEFS[id].label : id;
|
|
174
316
|
}
|
|
175
317
|
/** Group a permission list into categories, preserving catalog order. */
|
|
176
318
|
function groupByCategory(perms) {
|
|
@@ -187,7 +329,7 @@ function groupByCategory(perms) {
|
|
|
187
329
|
}
|
|
188
330
|
/** Check whether a string is a valid Permission. */
|
|
189
331
|
export function isValidPermission(value) {
|
|
190
|
-
return
|
|
332
|
+
return Object.prototype.hasOwnProperty.call(PERMISSION_DEFS, value);
|
|
191
333
|
}
|
|
192
334
|
/**
|
|
193
335
|
* Permissions that must NEVER be grantable through a user-authored CUSTOM Role —
|
|
@@ -932,24 +1074,24 @@ export function hasPermission(granted, permission, isSuperAdmin) {
|
|
|
932
1074
|
* that Role's permissions disappearing. Both sides read this now.
|
|
933
1075
|
*/
|
|
934
1076
|
export const SEED_BUNDLES = {
|
|
935
|
-
ecosystem_manager: { name: 'Ecosystem Manager', permissions: ECOSYSTEM_MANAGER_PERMISSIONS },
|
|
936
|
-
publisher_verifier: { name: 'Publisher Verifier', permissions: PUBLISHER_VERIFIER_PERMISSIONS },
|
|
937
|
-
team_lead: { name: 'Team Lead', permissions: TEAM_LEAD_PERMISSIONS },
|
|
938
|
-
platform_observer: { name: 'Platform Observer', permissions: PLATFORM_OBSERVER_PERMISSIONS },
|
|
939
|
-
platform_operator: { name: 'Platform Operator', permissions: PLATFORM_OPERATOR_PERMISSIONS },
|
|
940
|
-
account_manager: { name: 'Account Manager', permissions: ACCOUNT_MANAGER_PERMISSIONS },
|
|
941
|
-
console_admin: { name: 'Console Administrator', permissions: CONSOLE_ADMIN_PERMISSIONS },
|
|
942
|
-
support_agent: { name: 'Support Agent', permissions: SUPPORT_AGENT_PERMISSIONS },
|
|
943
|
-
support_lead: { name: 'Support Lead', permissions: SUPPORT_LEAD_PERMISSIONS },
|
|
944
|
-
registry_operator: { name: 'Registry Operator', permissions: REGISTRY_OPERATOR_PERMISSIONS },
|
|
945
|
-
pipeline_automation: { name: 'Pipeline Automation', permissions: PIPELINE_AUTOMATION_PERMISSIONS },
|
|
946
|
-
pipeline_registration: { name: 'Pipeline Registration', permissions: PIPELINE_REGISTRATION_PERMISSIONS },
|
|
1077
|
+
ecosystem_manager: { name: 'Ecosystem Manager', permissions: ECOSYSTEM_MANAGER_PERMISSIONS, seededIn: 'system' },
|
|
1078
|
+
publisher_verifier: { name: 'Publisher Verifier', permissions: PUBLISHER_VERIFIER_PERMISSIONS, seededIn: 'system' },
|
|
1079
|
+
team_lead: { name: 'Team Lead', permissions: TEAM_LEAD_PERMISSIONS, seededIn: null },
|
|
1080
|
+
platform_observer: { name: 'Platform Observer', permissions: PLATFORM_OBSERVER_PERMISSIONS, seededIn: 'system' },
|
|
1081
|
+
platform_operator: { name: 'Platform Operator', permissions: PLATFORM_OPERATOR_PERMISSIONS, seededIn: 'system' },
|
|
1082
|
+
account_manager: { name: 'Account Manager', permissions: ACCOUNT_MANAGER_PERMISSIONS, seededIn: 'system' },
|
|
1083
|
+
console_admin: { name: 'Console Administrator', permissions: CONSOLE_ADMIN_PERMISSIONS, seededIn: 'system' },
|
|
1084
|
+
support_agent: { name: 'Support Agent', permissions: SUPPORT_AGENT_PERMISSIONS, seededIn: 'system' },
|
|
1085
|
+
support_lead: { name: 'Support Lead', permissions: SUPPORT_LEAD_PERMISSIONS, seededIn: 'system' },
|
|
1086
|
+
registry_operator: { name: 'Registry Operator', permissions: REGISTRY_OPERATOR_PERMISSIONS, seededIn: 'system' },
|
|
1087
|
+
pipeline_automation: { name: 'Pipeline Automation', permissions: PIPELINE_AUTOMATION_PERMISSIONS, seededIn: 'org' },
|
|
1088
|
+
pipeline_registration: { name: 'Pipeline Registration', permissions: PIPELINE_REGISTRATION_PERMISSIONS, seededIn: 'org' },
|
|
947
1089
|
};
|
|
948
1090
|
/** Every seed-bundle id. The platform's `Role.seedBundle` enum is this list. */
|
|
949
1091
|
export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
|
|
950
1092
|
/**
|
|
951
|
-
* The SYSTEM ORG's job Roles, in staffing order — the subset of
|
|
952
|
-
* {@link SEED_BUNDLES} seeded there, which is every bundle except `team_lead`
|
|
1093
|
+
* The SYSTEM ORG's job Roles, in staffing order (table order) — the subset of
|
|
1094
|
+
* {@link SEED_BUNDLES} seeded there (`seededIn: 'system'`), which is every bundle except `team_lead`
|
|
953
1095
|
* (a tenant job, and a template rather than a seeded Role since it stopped
|
|
954
1096
|
* being structural).
|
|
955
1097
|
*
|
|
@@ -958,19 +1100,9 @@ export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
|
|
|
958
1100
|
* this list answers is "which Roles does the system org seed", not "which panel
|
|
959
1101
|
* renders them".
|
|
960
1102
|
*/
|
|
961
|
-
export const SYSTEM_ORG_JOB_BUNDLES = [
|
|
962
|
-
'ecosystem_manager',
|
|
963
|
-
'publisher_verifier',
|
|
964
|
-
'platform_observer',
|
|
965
|
-
'platform_operator',
|
|
966
|
-
'account_manager',
|
|
967
|
-
'console_admin',
|
|
968
|
-
'support_agent',
|
|
969
|
-
'support_lead',
|
|
970
|
-
'registry_operator',
|
|
971
|
-
];
|
|
1103
|
+
export const SYSTEM_ORG_JOB_BUNDLES = SEED_BUNDLE_IDS.filter((id) => SEED_BUNDLES[id].seededIn === 'system');
|
|
972
1104
|
/**
|
|
973
|
-
* The MACHINE Roles every org seeds — the subset of {@link SEED_BUNDLES} held by
|
|
1105
|
+
* The MACHINE Roles every org seeds (`seededIn: 'org'`) — the subset of {@link SEED_BUNDLES} held by
|
|
974
1106
|
* the service accounts `pipeline-manager infra store-token` provisions.
|
|
975
1107
|
*
|
|
976
1108
|
* Seeded rather than offered as a {@link ROLE_TEMPLATES} entry, unlike the
|
|
@@ -979,10 +1111,7 @@ export const SYSTEM_ORG_JOB_BUNDLES = [
|
|
|
979
1111
|
* and both have to find it in EVERY org by a stable identity. A template leaves
|
|
980
1112
|
* nothing to find until somebody instantiates it.
|
|
981
1113
|
*/
|
|
982
|
-
export const ORG_AUTOMATION_BUNDLES = [
|
|
983
|
-
'pipeline_automation',
|
|
984
|
-
'pipeline_registration',
|
|
985
|
-
];
|
|
1114
|
+
export const ORG_AUTOMATION_BUNDLES = SEED_BUNDLE_IDS.filter((id) => SEED_BUNDLES[id].seededIn === 'org');
|
|
986
1115
|
/**
|
|
987
1116
|
* The service accounts `pipeline-manager infra store-token` provisions, keyed by
|
|
988
1117
|
* account name, and the built-in Role each holds — `null` for an account whose
|
|
@@ -998,4 +1127,4 @@ export const AUTOMATION_ACCOUNT_BUNDLES = {
|
|
|
998
1127
|
'reporting-ingest': null,
|
|
999
1128
|
'registry-push': null,
|
|
1000
1129
|
};
|
|
1001
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa1F0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ25GLGtCQUFrQjtJQUNsQixnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDeEQsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEQsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CO0lBQ2hFLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxlQUFlLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQjtJQUNwRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEI7SUFDakYsZUFBZTtJQUNmLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxvQkFBb0IsRUFBRSxzQkFBc0I7SUFDNUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxxQkFBcUI7SUFDckQsaUJBQWlCLEVBQUUsa0JBQWtCO0lBQ3JDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDakYsaUJBQWlCLEVBQUUs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RSxJQUFJLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRTtJQUM3RSxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsNkJBQTZCLEVBQUU7SUFDNUYsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLCtCQUErQixFQUFFO0lBQ2xHLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRTtDQUNoRyxDQUFDO0FBRVgsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBcUMsQ0FBQztBQUc3Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCO0lBQzdELG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBNEI7SUFDN0QscUJBQXFCO0lBQ3JCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxxQkFBcUIsRUFBRSxxQkFBcUI7SUFDNUMsbUJBQW1CLEVBQUUsdUJBQXVCO0lBQzVDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsZUFBZSxFQUFFLElBQUk7Q0FDaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IE9yZ1JvbGUgfSBmcm9tICcuL2NvbW1vbi5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uIGlkZW50aWZpZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENhbm9uaWNhbCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbiBpZGVudGlmaWVycywgaW4gYHJlc291cmNlOmFjdGlvbmAgZm9ybS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIE9SRy1TQ09QRUQgY2FwYWJpbGl0aWVzIGEgUm9sZSBjYW4gZ3JhbnQgKFJCQUMpLiBDb2Fyc2UgYnlcbiAqIGRlc2lnbiDigJQgYDp3cml0ZWAgY292ZXJzIGNyZWF0ZS91cGRhdGUvZGVsZXRlIGZvciBhIHJlc291cmNlIOKAlCBzbyB0aGUgY2F0YWxvZ1xuICogYW5kIHBlcm1pc3Npb24tcGlja2VyIFVJIHN0YXkgc21hbGw7IHNwbGl0IGEgYDp3cml0ZWAgaW50byBgOmNyZWF0ZWAvYDpkZWxldGVgXG4gKiBsYXRlciBpZiBhIHJlc291cmNlIG5lZWRzIGl0LlxuICpcbiAqIE5PVCBtb2RlbGVkIGhlcmUgKGludGVudGlvbmFsbHkpOiBwbGF0Zm9ybS1vcGVyYXRvciBhY3Rpb25zIChvcmcgZGVsZXRlLCB0aWVyL1xuICogcXVvdGEgb3ZlcnJpZGUsIHVzZXIgYWRtaW4sIGltcGVyc29uYXRpb24sIHBsYXRmb3JtIHNldHRpbmdzKSBzdGF5IGJlaGluZCB0aGVcbiAqIGdsb2JhbCBgaXNTdXBlckFkbWluYCBmbGFnLCBub3QgYSBwZXItb3JnIHBlcm1pc3Npb247IGFuZCBgcmVxdWlyZVN0ZXBVcGBcbiAqIChNRkEpIC8gYHJlcXVpcmVGZWF0dXJlYCAocGxhbiBlbnRpdGxlbWVudHMpIHJlbWFpbiBvcnRob2dvbmFsIGdhdGVzLlxuICovXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID1cbiAgLy8gUGlwZWxpbmVzXG4gIHwgJ3BpcGVsaW5lczpyZWFkJ1xuICB8ICdwaXBlbGluZXM6d3JpdGUnXG4gIHwgJ3BpcGVsaW5lczpwdWJsaXNoJ1xuICAvLyBUaGUgcGlwZWxpbmUgUkVHSVNUUlkgKGBQT1NUYC9gREVMRVRFIC9waXBlbGluZXMvcmVnaXN0cnlgKTogd2hpY2ggZGVwbG95ZWRcbiAgLy8gc3RhY2sgYmFja3MgYSBwaXBlbGluZSwgYW5kIHRoZSBzdGVwIG1hbmlmZXN0IG9mIHBsdWdpbiBkaWdlc3RzIGl0IHJ1bnMuXG4gIC8vIFNwbGl0IG91dCBvZiBgcGlwZWxpbmVzOndyaXRlYCBzbyB0aGUgQ29kZUJ1aWxkIHN5bnRoIGNhbiBrZWVwIHRoYXQgcmVjb3JkXG4gIC8vIGN1cnJlbnQgd2l0aCBhIGNyZWRlbnRpYWwgdGhhdCBjYW4gZG8gbm90aGluZyBlbHNlIOKAlCBhIGtleSBob2xkaW5nXG4gIC8vIGBwaXBlbGluZXM6d3JpdGVgIGNvdWxkIHJld3JpdGUgZXZlcnkgcGlwZWxpbmUgdGhlIG9yZyBvd25zLiBQZW9wbGUgZ2V0IGl0XG4gIC8vIGJlc2lkZSBgcGlwZWxpbmVzOndyaXRlYCAodGhlIE1lbWJlciBidW5kbGUpOyB0aGUgYHBpcGVsaW5lLXJlZ2lzdGVyYFxuICAvLyBzZXJ2aWNlIGFjY291bnQgaG9sZHMgaXQgYWxvbmUuXG4gIHwgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBHb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMuIFNwbGl0IG91dCBvZiBgcGlwZWxpbmVzOipgIHNvIGEgcGxhdGZvcm1cbiAgLy8gdGVhbSBjYW4gY3VyYXRlIHRoZSBzdGFydGVyIGNhdGFsb2cgV0lUSE9VVCB3cml0ZSBhY2Nlc3MgdG8gZXZlcnkgcGlwZWxpbmVcbiAgLy8gKGFuZCB2aWNlIHZlcnNhKS4gYDpwdWJsaXNoYCBtYXBzIHRvIHRoZVxuICAvLyB0ZW1wbGF0ZSBsYWRkZXIncyBgcHVibGljYCBydW5nOyBgb3JnYCBhbmQgYHByaXZhdGVgIG5lZWQgb25seSBgOndyaXRlYC5cbiAgfCAndGVtcGxhdGVzOnJlYWQnXG4gIHwgJ3RlbXBsYXRlczp3cml0ZSdcbiAgfCAndGVtcGxhdGVzOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbnNcbiAgfCAncGx1Z2luczpyZWFkJ1xuICB8ICdwbHVnaW5zOndyaXRlJ1xuICB8ICdwbHVnaW5zOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbiBlY29zeXN0ZW0gKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBPcmctYXNzaWduYWJsZTpcbiAgLy8gIC0gYHBsdWdpbnM6aW5zdGFsbGAgICAgICAgIOKAlCBpbnN0YWxsL3VwZ3JhZGUvdW5pbnN0YWxsIGxpc3RpbmdzIChvciBSRVFVRVNUXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluc3RhbGwgd2hlbiB0aGUgb3JnJ3MgcG9saWN5IG5lZWRzIGFwcHJvdmFsKS5cbiAgLy8gIC0gYHBsdWdpbl9pbnN0YWxsczptYW5hZ2VgIOKAlCB0aGUgb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5ICsgZGVjaWRpbmcgaW5zdGFsbFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyBXSVRISU4gdGhlIG9yZyAob3JnLWxvY2FsIG9ubHkpLlxuICAvLyAgLSBgcHVibGlzaGVyczptYW5hZ2VgICAgICAg4oCUIHRoZSBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSArIHN1Ym1pdHRpbmdcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvc3lzdGVtIHJlcXVlc3RzIChldmVyeSBkZWNpc2lvbiBpcyBzeXN0ZW0tb3JnKS5cbiAgLy8gU3lzdGVtLW9yZy1vbmx5IChzZWUgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TKTpcbiAgLy8gIC0gYHBsdWdpbnM6bW9kZXJhdGVgICAgICAgIOKAlCBkZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUsIHlhbmssIGFkdmlzb3JpZXMuXG4gIC8vICAtIGBwdWJsaXNoZXJzOnZlcmlmeWAgICAgICDigJQgcHVibGlzaGVyIHRpZXJzLCBwcm9maWxlIGNoYW5nZXMsIHRyYW5zZmVycy5cbiAgfCAncGx1Z2luczppbnN0YWxsJ1xuICB8ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJ1xuICB8ICdwdWJsaXNoZXJzOm1hbmFnZSdcbiAgfCAncGx1Z2luczptb2RlcmF0ZSdcbiAgfCAncHVibGlzaGVyczp2ZXJpZnknXG4gIC8vIFRoZSBvcmcncyBtYW5hZ2VkLXRvb2xjaGFpbiBERUZBVUxUIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kXG4gIC8vIEQxMyk6IHdoaWNoIHRvb2xjaGFpbiByZWxlYXNlIGV2ZXJ5IHVucGlubmVkIHBpcGVsaW5lIGluIHRoZSBvcmcgKGFuZCBpdHNcbiAgLy8gdGVhbXMgdGhhdCBzZXQgbm9uZSkgc3ludGhlc2l6ZXMgd2l0aCBvbiBpdHMgbmV4dCBydW4uIE9yZy1hc3NpZ25hYmxlLCBzb1xuICAvLyBBZG1pbiBhbmQgT3duZXIgaG9sZCBpdDsgTk9UIGluIE1lbWJlciBvciBhbnkgcGlwZWxpbmUtZWRpdG9yIGJ1bmRsZS4gU3BsaXRcbiAgLy8gYnkgYmxhc3QgcmFkaXVzOiBgcGlwZWxpbmVzOndyaXRlYCBtb3ZlcyBPTkUgcGlwZWxpbmUgKGl0cyBvd25cbiAgLy8gYHRvb2xjaGFpbi5yZWxlYXNlYCBwaW4pLCB0aGlzIG1vdmVzIEFMTCBvZiB0aGVtLCBhbmRcbiAgLy8gYHBsdWdpbl9pbnN0YWxsczptYW5hZ2VgIGdvdmVybnMgZnV0dXJlIGluc3RhbGxzLCBub3QgcnVubmluZyBwaXBlbGluZXMuXG4gIC8vIEl0IG5ldmVyIGNvbmZlcnMgYW55dGhpbmcgb24gdGhlIHBsYXRmb3JtIGRlZmF1bHQsIGNhbmFyeSBvciBjYXRhbG9nLlxuICAvLyBFdmVyeSB3cml0ZSBhbHNvIG5lZWRzIGByZXF1aXJlU3RlcFVwYC5cbiAgfCAndG9vbGNoYWluOm1hbmFnZSdcbiAgLy8gVGhlIFRvb2xjaGFpbiBDT05TT0xFIChwbGFuIEQ5OyBuYW1lZCBhZnRlciBgYmlsbGluZzpvcGVyYXRlYCk6IHB1Ymxpc2hcbiAgLy8gbGlmZWN5Y2xlLCBjYW5hcnkgbWVtYmVyc2hpcCBhbmQgVEhFIHBsYXRmb3JtIGRlZmF1bHQg4oCUIGV2ZXJ5IG9yZyB3aXRob3V0XG4gIC8vIGl0cyBvd24gZGVmYXVsdCBtb3ZlcyB3aXRoIGl0LiBTeXN0ZW0tb3JnLW9ubHkgKG90aGVyd2lzZSBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgLy8gZGVyaXZlZCBmcm9tIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TLCB3b3VsZCBoYW5kIGl0IHRvIGV2ZXJ5IHRlbmFudFxuICAvLyBBZG1pbik7IGNhcnJpZWQgYnkgUGxhdGZvcm0gT3BlcmF0b3IuIEV2ZXJ5IHdyaXRlIGFsc28gbmVlZHMgYHJlcXVpcmVTdGVwVXBgLlxuICB8ICd0b29sY2hhaW46b3BlcmF0ZSdcbiAgLy8gUGxhdGZvcm0gb3BlcmF0aW9ucyAoc3lzdGVtLW9yZyBvbmx5KS4gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlc1xuICAvLyB0aGF0IHVzZWQgdG8gcmVxdWlyZSB0aGUgc3VwZXJhZG1pbiBGTEFHLCBzbyBhIGRlcGxveW1lbnQgY2FuIHN0YWZmIHRoZW1cbiAgLy8gd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiBoYW5kaW5nIG91dCBpbXBsaWNpdC1hbGwuIFNwbGl0IGJlY2F1c2UgdGhlIHR3byBjYXJyeVxuICAvLyBkaWZmZXJlbnQgcmlzazogcmVhZGluZyB3aGF0IGEgZGVwbG95IGNvbmZpZ3VyZWQgaXMgbm90IHRoZSBzYW1lIGFzIG1vdmluZ1xuICAvLyBhbm90aGVyIG9yZ2FuaXNhdGlvbidzIG1vbmV5LlxuICB8ICdwbGF0Zm9ybTpyZWFkJ1xuICAvLyBUaGUgY3Jvc3MtdGVuYW50IE9SRyBMSVNULCBzcGxpdCBvdXQgb2YgYHBsYXRmb3JtOnJlYWRgIGJlY2F1c2UgdGhhdCBvbmVcbiAgLy8gcGVybWlzc2lvbiB3YXMgZG9pbmcgdHdvIGpvYnMgd2l0aCBkaWZmZXJlbnQgYmxhc3QgcmFkaWk6IHJlYWRpbmcgd2hhdCBhXG4gIC8vIERFUExPWSB3YXMgY29uZmlndXJlZCB0byBkbyAoUkxTIG1vZGUsIEtNUyBwb3N0dXJlLCB0aGUgcmVuZGVyZWQgYWxlcnRcbiAgLy8gcnVsZXMpIGFuZCByZWFkaW5nIHRoZSByb3N0ZXIgb2YgZXZlcnkgQ1VTVE9NRVIuIFRocmVlIG9mIHRoZSBmb3VyIGpvYlxuICAvLyBidW5kbGVzIGNhcnJpZWQgaXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIHdhbnRlZCB0aGUgZGVwbG95IGludGVybmFscyDigJRcbiAgLy8gQ29uc29sZSBBZG1pbmlzdHJhdG9yIGFuZCBTdXBwb3J0IEFnZW50IGdvdCB0aGVtIHB1cmVseSBiZWNhdXNlIHRoZXkgbmVlZGVkXG4gIC8vIHRvIGZpbmQgYW4gb3JnIGJ5IG5hbWUuXG4gIC8vXG4gIC8vIFNhbWUgbWlzdGFrZSwgYW5kIHNhbWUgZml4LCBhcyBgY29uc29sZXM6ZGF0YXN0b3JlYCBiZWZvcmUgaXQgd2FzIHNwbGl0IGJ5XG4gIC8vIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cy5cbiAgfCAnb3JnczpyZWFkJ1xuICB8ICdiaWxsaW5nOm9wZXJhdGUnXG4gIC8vIFRoZSBvcGVyYXRvciBjb25zb2xlcywgc3BsaXQgYnkgQkxBU1QgUkFESVVTIHJhdGhlciB0aGFuIGJ5IHByb2R1Y3QuIFRocmVlXG4gIC8vIHBlcm1pc3Npb25zIGZvciBmaXZlIGNvbnNvbGVzLCBiZWNhdXNlIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cyBkaWZmZXJzXG4gIC8vIGJ5IGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBhdCBlYWNoIHN0ZXA6XG4gIC8vXG4gIC8vICAtIGBvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbmAg4oCUIEdyYWZhbmEgYW5kIEtpYWxpLiBSZWFkLW9ubHkgdmlld3M7IHRoZSB3b3JzdFxuICAvLyAgICBvdXRjb21lIG9mIGEgbWlzdGFrZW4gZ3JhbnQgaXMgc2VlaW5nIHRlbGVtZXRyeS5cbiAgLy8gIC0gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgICAgIOKAlCBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzLiBBIGRhdGFiYXNlIHNoZWxsXG4gIC8vICAgIG92ZXIgZXZlcnkgdGVuYW50J3Mgcm93czogaXQgY2FuIHJlYWQgYW5kIHJld3JpdGUgdGVuYW50IGRhdGEsIGJ1dCB0aGVcbiAgLy8gICAgYXVkaXQgY2hhaW4gbGl2ZXMgZWxzZXdoZXJlLCBzbyB0aGUgZGFtYWdlIGlzIHJlY29yZGVkLlxuICAvLyAgLSBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCAgIOKAlCB0aGUgUnVzdEZTIChTMykgY29uc29sZS4gSXQgY2FuIExJU1QgYW5kXG4gIC8vICAgIERFTEVURSBvYmplY3RzIGluIHRoZSByZWdpc3RyeSwgTG9raSwgVGhhbm9zLCBwbHVnaW4tYnVpbGQgYW5kXG4gIC8vICAgIGF1ZGl0LWNoYWluIGJ1Y2tldHMuIFNwbGl0IGZyb20gdGhlIHBhaXIgYWJvdmUgYmVjYXVzZSB0aGUgdHdvIGFyZSB0aGVcbiAgLy8gICAgdHdvIEhBTFZFUyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlIGRlc2lnbjogdGhlIGNoYWluJ3MgSE1BQyBrZXlcbiAgLy8gICAgbGl2ZXMgb3V0c2lkZSB0aGUgREIsIHNvIGEgTW9uZ28gc2hlbGwgY2FuIHRhbXBlciBidXQgY2Fubm90IGZvcmdlIGFcbiAgLy8gICAgY29uc2lzdGVudCBjaGFpbiDigJQgZXhjZXB0IGJ5IHRydW5jYXRpbmcgdGhlIHRhaWwsIHdoaWNoIGEgY2hhaW4gY2Fubm90XG4gIC8vICAgIHNlZSBmcm9tIHRoZSBpbnNpZGUsIGFuZCB0aGUgZGVmZW5jZSBhZ2FpbnN0IFRIQVQgaXMgdGhlIHNpZ25lZFxuICAvLyAgICBjaGFpbi1oZWFkIGV4cG9ydCB0byBvYmplY3Qgc3RvcmFnZS4gT25lIHNoZWxsIGNhbiB0cnVuY2F0ZTsgdGhlIG90aGVyXG4gIC8vICAgIGNhbiBkZWxldGUgdGhlIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uLlxuICAvL1xuICAvLyBBbGwgdGhyZWUgYXJlIHN5c3RlbS1vcmctb25seSwgc28gbm9uZSBjYW4gYmUgaGVsZCBpbnNpZGUgYSB0ZW5hbnQsIGFuZCBvbmx5XG4gIC8vIHRoZSBmaXJzdCBpcyBpbiB0aGUgUGxhdGZvcm0gT3BlcmF0b3IgYnVuZGxlOiBzdGFmZmluZyBhbiBvcGVyYXRvciBtdXN0IG5ldmVyXG4gIC8vIGhhbmQgb3ZlciBhIGRhdGEgc2hlbGwgYXMgYSBzaWRlIGVmZmVjdC4gR3JhbnRpbmcgZWl0aGVyIG9mIHRoZSBvdGhlciB0d28gaXNcbiAgLy8gYSBzZXBhcmF0ZSwgZXhwbGljaXQgYWN0IGJ5IGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBSb2xlIGZvciBleGFjdGx5IHRoYXRcbiAgLy8gcHVycG9zZS5cbiAgLy9cbiAgLy8gV0hBVCBUSEUgU1BMSVQgRE9FUyBOT1QgRE8sIHNvIG5vYm9keSBidWlsZHMgb24gaXQ6IGl0IGlzIG5vdCBhIGNvbnRhaW5tZW50XG4gIC8vIGJvdW5kYXJ5LiBSb2xlcyBsaXZlIGluIE1vbmdvIChgY29sbGVjdGlvbjogJ3JvbGVzJ2ApLCBzbyBhXG4gIC8vIGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGhvbGRlciBjYW4gd3JpdGUgdGhhdCBjb2xsZWN0aW9uIGFuZCBncmFudCB0aGVtc2VsdmVzXG4gIC8vIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIOKAlCBkYXRhc3RvcmUgY29udGFpbnMgb2JqZWN0c3RvcmUgYnkgZXNjYWxhdGlvbi4gVGhlXG4gIC8vIHNwbGl0IGV4cHJlc3NlcyBpbnRlbnQsIGtlZXBzIHRoZSBkZWZhdWx0IGdyYW50IHNtYWxsIGFuZCBnaXZlcyBlYWNoIGNsYXNzXG4gIC8vIGl0cyBvd24gcmVmdXNhbCBzaWduYWwuIFdoYXQgYWN0dWFsbHkgcHJvdGVjdHMgdGhlIGF1ZGl0IGhlYWRzIGZyb20gd2hvZXZlclxuICAvLyBvcGVucyB0aGF0IGNvbnNvbGUgaXMgUzMgT2JqZWN0IExvY2sgd2l0aCBhIHJldGFpbi11bnRpbC1kYXRlXG4gIC8vIChgcGxhdGZvcm0vc3JjL3NlcnZpY2VzL2F1ZGl0LWhlYWQtZXhwb3J0LnRzYCksIHdoaWNoIGhvbGRzIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gYW55IHBlcm1pc3Npb24gaGVyZS5cbiAgfCAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nXG4gIHwgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbidcbiAgfCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJ1xuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgfCAnb25jYWxsOm1hbmFnZSdcbiAgLy8gVGhlIHZlbmRvcidzIG90aGVyIG9wZXJhdGlvbmFsIFRBU0tTIChzeXN0ZW0gb3JnIG9ubHkpLiBFYWNoIGV4aXN0cyBzbyBhXG4gIC8vIHN1cGVyYWRtaW4gY2FuIHN0YWZmIG9uZSBqb2Igd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiB0aGUgc3VwZXJhZG1pbiBmbGFnIOKAlFxuICAvLyBiZWZvcmUgdGhlc2UsIDM0IHJvdXRlcyB3ZXJlIHJlYWNoYWJsZSBvbmx5IGJ5IHNvbWVvbmUgd2hvIGFsc28gaGVsZFxuICAvLyBpbXBlcnNvbmF0aW9uLCBhIGRhdGFiYXNlIHNoZWxsIGFuZCB0aGUgYWJpbGl0eSB0byBtaW50IGFub3RoZXIgc3VwZXJhZG1pbi5cbiAgLy9cbiAgLy8gU3VwcG9ydCBkZXNrLCBzcGxpdCBpbiB0d28gYmVjYXVzZSB0aGUgY29udGVudCBpcyByZXVzZWQgYWNyb3NzIGV2ZXJ5XG4gIC8vIGN1c3RvbWVyIHdoaWxlIGEgY2FzZSBiZWxvbmdzIHRvIG9uZTogYHN1cHBvcnRfY2FzZXM6d3JpdGVgIGlzIHRoZSBkZXNrJ3NcbiAgLy8gb3duIHdvcmsgKHRyaWFnZSwgYXNzaWdubWVudCwgc2V2ZXJpdHksIGludGVybmFsIG5vdGVzLCByZWNvcmRpbmcgYW5cbiAgLy8gaW5jaWRlbnQgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QpLCBgc3VwcG9ydF9jb250ZW50OndyaXRlYCBpcyBhdXRob3JpbmdcbiAgLy8gdGhlIGNhbm5lZCByZXBsaWVzLiBFYWNoIGdhdGVzIGl0cyB0YXNrJ3MgUkVBRFMgYXMgd2VsbCBhcyBpdHMgd3JpdGVzLFxuICAvLyBhZ2FpbnN0IHRoZSB1c3VhbCBjb252ZW50aW9uLCBiZWNhdXNlIHRoZXNlIHRhYmxlcyBjYXJyeSBubyBgb3JnX2lkYCDigJQgdGhlcmVcbiAgLy8gaXMgbm8gdGVuYW5jeSBib3VuZGFyeSB1bmRlcm5lYXRoIHRvIGZhbGwgYmFjayBvbi5cbiAgfCAnc3VwcG9ydF9jYXNlczp3cml0ZSdcbiAgfCAnc3VwcG9ydF9jb250ZW50OndyaXRlJ1xuICAvLyBDcm9zcy10ZW5hbnQgc3Vic2NyaXB0aW9ucy4gUmVhZCBpcyBzcGxpdCBmcm9tIHdyaXRlIGJlY2F1c2UgYSByZWFkLW9ubHlcbiAgLy8gaG9sZGVyIGlzIGEgcmVhbCBqb2IgaGVyZTogc29tZW9uZSB3aG8gcmVwb3J0cyBvbiByZXZlbnVlIGFuZCBwbGFuIG1peFxuICAvLyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hhbmdlIGEgcGxhbiBvciBjYW5jZWwgb25lLlxuICB8ICdzdWJzY3JpcHRpb25zOnJlYWQnXG4gIHwgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJ1xuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gIHwgJ29yZ3M6bWFuYWdlJ1xuICAvLyBDcm9zcy10ZW5hbnQgcXVvdGEgd3JpdGVzLiBUaGUgbWF0Y2hpbmcgcmVhZHMgKGAvcXVvdGFzL2FsbGAsIGAvYXQtcmlza2ApXG4gIC8vIHJpZGUgYHBsYXRmb3JtOnJlYWRgIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdG9yIGRhc2hib2FyZCwgc28gc29tZW9uZVxuICAvLyB3YXRjaGluZyBmb3IgZXhoYXVzdGlvbiBkb2VzIG5vdCBuZWVkIHRoZSBhYmlsaXR5IHRvIHJhaXNlIGEgbGltaXQuXG4gIHwgJ3F1b3RhczptYW5hZ2UnXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICB8ICdwbHVnaW5fcXVldWU6bWFuYWdlJ1xuICAvLyBDb21wbGlhbmNlXG4gIHwgJ2NvbXBsaWFuY2U6cmVhZCdcbiAgfCAnY29tcGxpYW5jZTp3cml0ZSdcbiAgLy8gTWVtYmVycyAmIGFjY2Vzc1xuICB8ICdtZW1iZXJzOm1hbmFnZSdcbiAgfCAncm9sZXM6bWFuYWdlJ1xuICB8ICdpbnZpdGF0aW9uczptYW5hZ2UnXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgfCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnXG4gIC8vIE9ic2VydmFiaWxpdHlcbiAgfCAnZGFzaGJvYXJkczpyZWFkJ1xuICB8ICdkYXNoYm9hcmRzOndyaXRlJ1xuICB8ICdvYnNlcnZhYmlsaXR5OnJlYWQnXG4gIHwgJ29ic2VydmFiaWxpdHk6d3JpdGUnXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICB8ICdsb2dzOmV4cG9ydCdcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gIHwgJ2F1ZGl0OnJlYWQnXG4gIC8vIEluc2lnaHRzXG4gIHwgJ3JlcG9ydHM6cmVhZCdcbiAgfCAncmVwb3J0czpyb2xsdXAnXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHMuIGByZXBvcnRzOnJlYWRgIHN0YXlzIHRoZSBGUkVFIG9uLWRlbWFuZCBkYXNoYm9hcmQgcmVhZDtcbiAgLy8gdGhlc2UgdHdvIGFyZSB0aGUgYWRkLW9uJ3Mgd3JpdGUgc3VyZmFjZSDigJQgYGF1dGhvcmAgc2F2ZXMvc2NoZWR1bGVzL2RyYWZ0cyBhXG4gIC8vIHJlcG9ydCwgYHNoYXJlYCBwdWJsaXNoZXMgaXQgYmV5b25kIHRoZSBwbGF0Zm9ybSAoUERGLCBlbWFpbCwgc2hhcmUgbGlua3MpLlxuICAvLyBTcGxpdCBiZWNhdXNlIHB1Ymxpc2hpbmcgZXh0ZXJuYWxseSBpcyBhIGRpZmZlcmVudCByaXNrIGZyb20gY29tcG9zaW5nOlxuICAvLyBhIGxlYWQgY2FuIGJlIGFsbG93ZWQgdG8gYnVpbGQgcmVwb3J0cyB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZW1haWwgdGhlbSBvdXQuXG4gIHwgJ3JlcG9ydHM6d3JpdGUnXG4gIHwgJ3JlcG9ydHM6cHVibGlzaCdcbiAgLy8gTWVzc2FnaW5nXG4gIHwgJ21lc3NhZ2VzOnJlYWQnXG4gIHwgJ21lc3NhZ2VzOndyaXRlJ1xuICAvLyBCaWxsaW5nICYgcXVvdGFzXG4gIHwgJ2JpbGxpbmc6cmVhZCdcbiAgfCAnYmlsbGluZzptYW5hZ2UnXG4gIHwgJ3F1b3RhczpyZWFkJ1xuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgfCAnaW1wZXJzb25hdGlvbjpvcGVuJ1xuICB8ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnXG4gIHwgJ3RlYW1fYWNjZXNzOm9wZW4nXG4gIC8vIFJlZ2lzdHJ5LiBUaHJlZSBydW5ncywgYmVjYXVzZSB0aGUgd3JpdGUgaGFsZiBoYXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gIC8vIGJsYXN0IHJhZGlpOiBgd3JpdGVgIENPUElFUyBhIG1hbmlmZXN0IChhZGRpdGl2ZSDigJQgaXQgY3JlYXRlcyBhIHRhZyxcbiAgLy8gbm90aGluZyBzdG9wcyByZXNvbHZpbmcpLCBgcHVyZ2VgIERFTEVURVMgb25lIChhIHRlbmFudCdzIHBpcGVsaW5lIG9yIGFcbiAgLy8gZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2UgY2FuIHN0b3AgcmVzb2x2aW5nLCB3aXRoIG5vIHVuZG8pLlxuICB8ICdyZWdpc3RyeTpyZWFkJ1xuICB8ICdyZWdpc3RyeTp3cml0ZSdcbiAgfCAncmVnaXN0cnk6cHVyZ2UnXG4gIC8vIE9yZ2FuaXphdGlvbiBzZXR0aW5ncy4gRm91ciBSRVNPVVJDRVMsIGVhY2ggd2l0aCB0aGUgYDp3cml0ZWAgYWN0aW9uLCByYXRoZXJcbiAgLy8gdGhhbiBvbmUgYG9yZ2AgcmVzb3VyY2Ugd2l0aCBmb3VyIG5vdW4tc2hhcGVkIGFjdGlvbnMg4oCUIHRoZXNlIGFyZSB0aGUgb3JnJ3NcbiAgLy8gb3duIGNvbmZpZ3VyYXRpb24gc3RhdGUsIHdoaWNoIGlzIHdoYXQgYDp3cml0ZWAgbWVhbnMgaGVyZSAoYDptYW5hZ2VgIGlzXG4gIC8vIHJlc2VydmVkIGZvciBhZG1pbmlzdGVyaW5nIGEgY29sbGVjdGlvbiBvZiBvdGhlciBlbnRpdGllczogbWVtYmVycywgcm9sZXMsXG4gIC8vIGludml0YXRpb25zLCBzZXJ2aWNlIGFjY291bnRzLCBiaWxsaW5nKS5cbiAgLy9cbiAgLy8gIC0gYG9yZ19zZXR0aW5nczp3cml0ZWAgICAgICDigJQgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgKyBBSSBjb25maWcuXG4gIC8vICAtIGBvcmdfaWRwOndyaXRlYCAgICAgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZ19rbXM6d3JpdGVgICAgICAgICAgICDigJQgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IGNvbmZpZ3VyYXRpb25cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5zaXRpdmU6IGNvbnRyb2xzIGVuY3J5cHRpb24gb2Ygb3JnIGRhdGEpLlxuICAvLyAgLSBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIOKAlCB0aGUgaW1wZXJzb25hdGlvbiBwb2xpY3kgKHNlbnNpdGl2ZTogY29udHJvbHNcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobyBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBhIG1lbWJlcikuXG4gIC8vXG4gIC8vIFRoZSBsYXN0IHRocmVlIHdlcmUgc3BsaXQgT1VUIG9mIGBvcmdfc2V0dGluZ3M6d3JpdGVgIHNvIGEgY3VzdG9tIHJvbGUgY2FuXG4gIC8vIGdyYW50IGdlbmVyYWwgc2V0dGluZ3MgV0lUSE9VVCB0aGUgc2Vuc2l0aXZlIHN1cmZhY2VzIOKAlCBhIFwic2V0dGluZ3MgbWFuYWdlclwiXG4gIC8vIHJvbGUgZm9yIG9yZyBuYW1lIG9yIEFJIHByb3ZpZGVyIG11c3Qgbm90IGFsc28gYmUgYWJsZSB0byBzd2l0Y2ggdGhlIG9yZyB0b1xuICAvLyBgb3BlbmAuIEFsbCByZW1haW4gb3JnLWFzc2lnbmFibGUgYW5kIGFyZSBzZWVkZWQgaW50byB0aGUgYWRtaW4vb3duZXJcbiAgLy8gYnVuZGxlcyAodmlhIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TKSBzbyBleGlzdGluZyBhZG1pbnMga2VlcCBmdWxsXG4gIC8vIGFjY2Vzcy5cbiAgfCAnb3JnX3NldHRpbmdzOndyaXRlJ1xuICB8ICdvcmdfaWRwOndyaXRlJ1xuICB8ICdvcmdfa21zOndyaXRlJ1xuICB8ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZSc7XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgYWN0aW9ucyBhIHBlcm1pc3Npb24gaWQgbWF5IGVuZCBpbiDigJQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZVxuICogYHJlc291cmNlOmFjdGlvbmAgc3RyYXRlZ3kgdGhlIGRvY3MgZGVzY3JpYmUuXG4gKlxuICogSXQgaXMgY2xvc2VkIGZvciBvbmUgY29uY3JldGUgcmVhc29uOiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIChmcm9udGVuZFxuICogYGxpYi9hdXRoLWhlbHBlcnMudHNgKSBjbGFzc2lmaWVzIHJlYWQgdnMgd3JpdGUgQlkgU1VGRklYLCBhbmQgdGhhdCBpcyB3aGF0XG4gKiBkaXNhYmxlcyBldmVyeSB3cml0ZSBhZmZvcmRhbmNlIGR1cmluZyBhIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIEFcbiAqIG5vdW4tc2hhcGVkIGFjdGlvbiAodGhlIGZvcm1lciBgb3JnOnNldHRpbmdzYCBhbmQgYGNvbnNvbGVzOmRhdGFzdG9yZWApIGNhbm5vdCBiZSBjbGFzc2lmaWVkXG4gKiBieSBuYW1lLCBzbyBlYWNoIG9uZSBoYWQgdG8gYmUgaGFuZC1saXN0ZWQg4oCUIGFuZCBhIHBlcm1pc3Npb24gYWRkZWQgd2l0aG91dFxuICogcmVtZW1iZXJpbmcgdGhhdCBsaXN0IHJlbmRlcnMgYW4gZW5hYmxlZCBjb250cm9sIHRoYXQgZGVhZC1lbmRzIG9uIGEgNDAzLlxuICpcbiAqIFJlYWRzIGFyZSBgOnJlYWRgIGFuZCBgOnJvbGx1cGAgKGEgcmVhZC1WSVNJQklMSVRZIHNjb3BlKS4gRXZlcnl0aGluZyBlbHNlIGlzXG4gKiBhIHdyaXRlLiBUaGUgZml2ZSBkb21haW4gdmVyYnMgYXJlIGtlcHQgYmVjYXVzZSBlYWNoIG5hbWVzIGFuIGFjdGlvbiB3aXRoIG5vXG4gKiBzeW5vbnltIGluIHRoaXMgdm9jYWJ1bGFyeSDigJQgYDpleHBvcnRgIGlzIGVncmVzcyByYXRoZXIgdGhhbiBtdXRhdGlvbixcbiAqIGA6aW5zdGFsbGAgaXMgY29uc3VtcHRpb24gcmF0aGVyIHRoYW4gYXV0aG9yaW5nLCBgOm1vZGVyYXRlYCBhbmQgYDp2ZXJpZnlgIGFyZVxuICogZWNvc3lzdGVtIGRlY2lzaW9ucywgYW5kIGA6b3BlcmF0ZWAgbW92ZXMgYW5vdGhlciB0ZW5hbnQncyBtb25leS5cbiAqXG4gKiBgUEVSTUlTU0lPTl9JRF9TSEFQRWAgYW5kIHRoaXMgbGlzdCBhcmUgYXNzZXJ0ZWQgb3ZlciB0aGUgd2hvbGUgY2F0YWxvZyBpblxuICogYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCwgc28gYWRkaW5nIGFuIG9mZi1zdHJhdGVneSBpZCBmYWlsc1xuICogdGhlcmUgcmF0aGVyIHRoYW4gYXQgYSA0MDMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0FDVElPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAncmVhZCcsICdyb2xsdXAnLFxuICAnd3JpdGUnLCAnbWFuYWdlJywgJ3B1Ymxpc2gnLCAnb3BlbicsXG4gICdleHBvcnQnLCAnaW5zdGFsbCcsICdtb2RlcmF0ZScsICd2ZXJpZnknLCAnb3BlcmF0ZScsICdwdXJnZScsICdhcHByb3ZlJyxcbl07XG5cbi8qKiBgcmVzb3VyY2U6YWN0aW9uYCwgd2hlcmUgcmVzb3VyY2UgaXMgYHNuYWtlX2Nhc2VgIGFuZCBhY3Rpb24gaXMgaW4ge0BsaW5rIFBFUk1JU1NJT05fQUNUSU9OU30uICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9JRF9TSEFQRSA9IC9eW2Etel1bYS16MC05X10qOlthLXpdKyQvO1xuXG4vKiogQWxsIHZhbGlkIHBlcm1pc3Npb25zIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIgaW4gdGhlIHBpY2tlcikuICovXG5leHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuICAndG9vbGNoYWluOm1hbmFnZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6aW5zdGFsbCcsICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgJ3B1Ymxpc2hlcnM6bWFuYWdlJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLCAncHVibGlzaGVyczp2ZXJpZnknLFxuICAncGxhdGZvcm06cmVhZCcsICdvcmdzOnJlYWQnLCAndG9vbGNoYWluOm9wZXJhdGUnLCAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLCAncXVvdGFzOm1hbmFnZScsICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLCAnYXVkaXQ6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsICdyZWdpc3RyeTpwdXJnZScsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLCAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAnb3JnX3NldHRpbmdzOndyaXRlJywgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFRoZSBDTE9TRUQgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB7QGxpbmsgUGVybWlzc2lvbn0gYW5kIGRlY2lkZSBhY2Nlc3MuXG4gKlxuICogXCJJcyBwZXJtaXNzaW9uIFggZW5mb3JjZWQgYW55d2hlcmU/XCIgaGFzIHRvIGJlIGFuc3dlcmFibGUgc3RhdGljYWxseSwgd2hpY2hcbiAqIGEgZ3JlcCBjYW4ndCBkbzogZm91ciBkaWZmZXJlbnQgY2FsbCBzaGFwZXMgY29uc3VtZSBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGFzIFVORU5GT1JDRUQgd2hlbiBpdFxuICogaXMgaW4gZmFjdCBlbmZvcmNlZCBvbiBldmVyeSB0ZW1wbGF0ZSBwdWJsaXNoLlxuICpcbiAqIFRoZXkgYWxsIGJvdHRvbSBvdXQgaW4gYHVzZXJIYXNQZXJtaXNzaW9uYCwgc28gdGhlIFJVTlRJTUUgcHJpbWl0aXZlIHdhc1xuICogYWxyZWFkeSBvbmUuIFRoaXMgY29uc3RhbnQgbWFrZXMgdGhlIFNUQVRJQyBzdXJmYWNlIG9uZSBhcyB3ZWxsOiBpdCBuYW1lc1xuICogZXZlcnkgZW50cnkgcG9pbnQsIHNvIGBwZXJtaXNzaW9uLWNvdmVyYWdlLnRlc3QudHNgIGNhbiBlbnVtZXJhdGUgdGhlIGNhdGFsb2dcbiAqIGFuZCByZXBvcnQgZWFjaCBwZXJtaXNzaW9uJ3MgZW5mb3JjZW1lbnQgc2l0ZXMgd2l0aG91dCBndWVzc2luZy4gQSBuZXcgZ2F0ZVxuICogdGhhdCB0YWtlcyBhIGBQZXJtaXNzaW9uYCBtdXN0IGJlIGxpc3RlZCBoZXJlLCBvciB0aGUgY292ZXJhZ2UgcmVwb3J0IHN0YXJ0c1xuICogbHlpbmcgYWJvdXQgdGhlIHBlcm1pc3Npb25zIG9ubHkgdGhhdCBnYXRlIGVuZm9yY2VzLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9HQVRFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIE1pZGRsZXdhcmUgZ2F0ZXMgKHJvdXRlIGxldmVsKSDigJQgYWxsIGFueS1vZiBleGNlcHQgcmVxdWlyZUFsbFBlcm1pc3Npb25zLlxuICAncmVxdWlyZVBlcm1pc3Npb24nLFxuICAncmVxdWlyZUFsbFBlcm1pc3Npb25zJyxcbiAgJ3JlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlJyxcbiAgLy8gVGhlIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBjaGFpbiAoc3lzdGVtIG9yZyArIHBlcm1pc3Npb24gKyBhYWwyKS5cbiAgJ3JlcXVpcmVTeXN0ZW1PcmdQZXJtaXNzaW9uJyxcbiAgLy8gVGhlIHNpbmdsZSBydW50aW1lIHByaW1pdGl2ZSBldmVyeSBnYXRlIGFib3ZlIGRlbGVnYXRlcyB0bzsgYWxzbyBjYWxsZWRcbiAgLy8gZGlyZWN0bHkgd2hlcmUgYSBjb250cm9sbGVyIGJyYW5jaGVzIG9uIGEgY2FwYWJpbGl0eSByYXRoZXIgdGhhbiByZWplY3RpbmcuXG4gICd1c2VySGFzUGVybWlzc2lvbicsXG4gICdoYXNQZXJtaXNzaW9uJyxcbiAgLy8gVmlzaWJpbGl0eSBoZWxwZXJzIOKAlCB0aGV5IHRha2UgdGhlIGVudGl0eSdzIFBVQkxJU0ggcGVybWlzc2lvbi5cbiAgJ3JlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAnY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAncmVzb2x2ZVZpc2liaWxpdHknLFxuICAvLyBxdW90YSdzIG93biB3cmFwcGVyLiBJdCBkZWxlZ2F0ZXMgdG8gYHJlcXVpcmVQZXJtaXNzaW9uYCwgYnV0IGl0IHRha2VzIHRoZVxuICAvLyBpZCBhcyBhbiBPUFRJT04gKGBhdXRob3JpemVPcmcoeyBwZXJtaXNzaW9uOiAncXVvdGFzOm1hbmFnZScgfSlgKSBiZWNhdXNlIGl0XG4gIC8vIGFsc28gY2Fub25pY2FsaXplcyB0aGUgYDpvcmdJZGAgcGFyYW0sIHdoaWNoIHRoZSByb3V0ZSBjYW5ub3QgZHJvcC4gV2l0aG91dFxuICAvLyB0aGlzIGVudHJ5IHRoZSBjb3ZlcmFnZSBzY2FuIHJlcG9ydGVkIGBxdW90YXM6bWFuYWdlYCBhcyBlbmZvcmNlZCBub3doZXJlLlxuICAnYXV0aG9yaXplT3JnJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnUmVnaXN0ZXIgZGVwbG95bWVudHMnLCBkZXNjcmlwdGlvbjogJ1JlY29yZCBhbmQgcmVtb3ZlIHRoZSBkZXBsb3llZCBzdGFjayBhbmQgc3RlcCBtYW5pZmVzdCBiZWhpbmQgYSBwaXBlbGluZSAodGhlIHBpcGVsaW5lIHJlZ2lzdHJ5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndG9vbGNoYWluOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHRoZSBvcmcgdG9vbGNoYWluIGRlZmF1bHQnLCBkZXNjcmlwdGlvbjogXCJDaG9vc2Ugd2hpY2ggbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSB5b3VyIG9yZydzIHVucGlubmVkIHBpcGVsaW5lcyAoYW5kIHRlYW1zIHdpdGhvdXQgdGhlaXIgb3duKSBidWlsZCB3aXRoLCBvciBmb2xsb3cgdGhlIHBsYXRmb3JtIGRlZmF1bHRcIiwgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cmVhZCcsIGxhYmVsOiAnVmlldyB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGdvbGRlbi1wYXRoIHRlbXBsYXRlIGNhdGFsb2cnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnQXV0aG9yLCBlZGl0LCBhbmQgZGVsZXRlIHBpcGVsaW5lIHRlbXBsYXRlcycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnVmlldyBwbHVnaW5zIGFuZCBidWlsZHMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCB1cGxvYWQsIGVkaXQsIGFuZCBkZWxldGUgcGx1Z2lucycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczppbnN0YWxsJywgbGFiZWw6ICdJbnN0YWxsIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0luc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgZWNvc3lzdGVtIHBsdWdpbnMgKG9yIHJlcXVlc3QgYW4gaW5zdGFsbCB3aGVuIHlvdXIgb3JnIHJlcXVpcmVzIGFwcHJvdmFsKScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwbHVnaW4gaW5zdGFsbHMnLCBkZXNjcmlwdGlvbjogXCJTZXQgeW91ciBvcmcncyBwbHVnaW4gY29uc3VtcHRpb24gcG9saWN5IGFuZCBhcHByb3ZlIG9yIGRlbnkgaW5zdGFsbCByZXF1ZXN0cyB3aXRoaW4gdGhlIG9yZ1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHB1Ymxpc2hlciBwcm9maWxlJywgZGVzY3JpcHRpb246IFwiTWFuYWdlIHlvdXIgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgYW5kIHN1Ym1pdCBwdWJsaXNoLCB2ZXJpZmljYXRpb24sIHRyYW5zZmVyLCBhbmQgYWR2aXNvcnkgcmVxdWVzdHNcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGx1Z2luczptb2RlcmF0ZScsIGxhYmVsOiAnTW9kZXJhdGUgdGhlIHBsdWdpbiBlY29zeXN0ZW0nLCBkZXNjcmlwdGlvbjogJ0RlY2lkZSBwdWJsaXNoIHJlcXVlc3RzLCBtb2RlcmF0ZSBzdWJtaXNzaW9ucyBhbmQgcmV2aWV3cywgeWFuayB2ZXJzaW9ucywgYW5kIHB1Ymxpc2ggYWR2aXNvcmllcyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3B1Ymxpc2hlcnM6dmVyaWZ5JywgbGFiZWw6ICdWZXJpZnkgcHVibGlzaGVycycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBWZXJpZmllZCBhcHBsaWNhdGlvbnMsIHB1Ymxpc2hlciB0aWVyIGFuZCBwcm9maWxlIGNoYW5nZXMsIGFuZCBvd25lcnNoaXAgdHJhbnNmZXJzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGxhdGZvcm06cmVhZCcsIGxhYmVsOiAnVmlldyBwbGF0Zm9ybSBvcGVyYXRpb25zJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyBhbmQgdGhlIGNyb3NzLXRlbmFudCBvcmdhbml6YXRpb24gbGlzdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29yZ3M6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGwgb3JnYW5pemF0aW9ucycsIGRlc2NyaXB0aW9uOiAnTGlzdCBhbmQgb3BlbiBldmVyeSBvcmdhbml6YXRpb24gb24gdGhlIGRlcGxveW1lbnQgXFx1MjAxNCB0aGUgcm9zdGVyIHRoZSBvcGVyYXRvciBzdXJmYWNlcyB3b3JrIGZyb20gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICd0b29sY2hhaW46b3BlcmF0ZScsIGxhYmVsOiAnT3BlcmF0ZSB0aGUgcGxhdGZvcm0gdG9vbGNoYWluJywgZGVzY3JpcHRpb246ICdSdW4gdGhlIFRvb2xjaGFpbiBjb25zb2xlOiBjYW5hcnkgbWVtYmVyc2hpcCwgcmVsZWFzZSBub3RlcywgZGVwcmVjYXRlIC8geWFuayAvIGRlbGV0ZSByZWxlYXNlcywgYW5kIHNldCB0aGUgcGxhdGZvcm0gZGVmYXVsdCBldmVyeSBvcmcgd2l0aG91dCBpdHMgb3duIGZvbGxvd3MgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOm9wZXJhdGUnLCBsYWJlbDogJ09wZXJhdGUgZGlzY291bnRzIGFuZCBwcm9tb3Rpb25zJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGFwcGx5IGFuZCByZXZva2UgZGlzY291bnQgdG9rZW5zIGFuZCBwcm9tb3Rpb24gY2FtcGFpZ25zIGFjcm9zcyB0ZW5hbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIG9ic2VydmFiaWxpdHkgY29uc29sZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gR3JhZmFuYSBhbmQgS2lhbGkg4oCUIGRhc2hib2FyZHMsIHRyYWZmaWMgYW5kIG1lc2ggaGVhbHRoIGFjcm9zcyBldmVyeSB0ZW5hbnQgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIGRhdGFiYXNlIGNvbnNvbGVzJywgZGVzY3JpcHRpb246ICdPcGVuIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3Mg4oCUIGEgZGlyZWN0IHJlYWQvd3JpdGUgc2hlbGwgb3ZlciBldmVyeSB0ZW5hbnRcXHUyMDE5cyByb3dzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBvYmplY3Qtc3RvcmUgY29uc29sZScsIGRlc2NyaXB0aW9uOiAnT3BlbiB0aGUgUnVzdEZTIChTMykgY29uc29sZSDigJQgbGlzdCBhbmQgZGVsZXRlIG9iamVjdHMgaW4gZXZlcnkgYnVja2V0LCBpbmNsdWRpbmcgdGhlIGF1ZGl0IGNoYWluIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb25jYWxsOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIG9uLWNhbGwgcGFnaW5nJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwYWdpbmcgcG9zdHVyZSBhbmQgc2VuZCBhIHRlc3QgcGFnZSAoc3lzdGVtIG9yZyBvbmx5OyB0aGUgcm90YSBsaXZlcyB3aXRoIHRoZSBwcm92aWRlciknLCBjYXRlZ29yeTogJ09uLWNhbGwnIH0sXG4gIHsgaWQ6ICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgbGFiZWw6ICdXb3JrIHRoZSBzdXBwb3J0IGRlc2snLCBkZXNjcmlwdGlvbjogJ1RyaWFnZSB0aGUgc3VwcG9ydCBxdWV1ZSwgYXNzaWduIGFuZCByZS1wcmlvcml0aXNlIGNhc2VzLCB3cml0ZSBpbnRlcm5hbCBub3RlcywgYW5kIHJlY29yZCBpbmNpZGVudHMgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgeyBpZDogJ3N1cHBvcnRfY29udGVudDp3cml0ZScsIGxhYmVsOiAnQXV0aG9yIGNhbm5lZCByZXBsaWVzJywgZGVzY3JpcHRpb246ICdXcml0ZSBhbmQgcmV0aXJlIHRoZSByZXVzYWJsZSBzdXBwb3J0IHJlcGxpZXMgb2ZmZXJlZCB0byBldmVyeSBjdXN0b21lciAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICB7IGlkOiAnc3Vic2NyaXB0aW9uczpyZWFkJywgbGFiZWw6ICdWaWV3IGFsbCBzdWJzY3JpcHRpb25zJywgZGVzY3JpcHRpb246ICdWaWV3IGV2ZXJ5IG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiwgcGxhbiBtaXggYW5kIGJpbGxpbmcgZXZlbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLCBsYWJlbDogJ0NoYW5nZSBhbnkgc3Vic2NyaXB0aW9uJywgZGVzY3JpcHRpb246ICdDaGFuZ2UgYSBwbGFuLCBzZXQgYSBzdXBwb3J0IGZsb29yLCBhbmQgY2FuY2VsIGFuIG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29yZ3M6bWFuYWdlJywgbGFiZWw6ICdBZG1pbmlzdGVyIGFueSBvcmdhbml6YXRpb24nLCBkZXNjcmlwdGlvbjogJ1JlbmFtZSwgcmUtdGllciwgbW92ZSBhbmQgZGVsZXRlIGFueSBvcmdhbml6YXRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6bWFuYWdlJywgbGFiZWw6ICdDaGFuZ2UgYW55IHF1b3RhJywgZGVzY3JpcHRpb246ICdSYWlzZSwgcmVzZXQgYW5kIGNsZWFyIGFub3RoZXIgb3JnYW5pemF0aW9uXFx1MjAxOXMgcXVvdGFzIChzeXN0ZW0gb3JnIG9ubHk7IHZpZXdpbmcgdGhlbSByaWRlcyBwbGF0Zm9ybTpyZWFkKScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnLCBsYWJlbDogJ1J1biB0aGUgcGx1Z2luIGJ1aWxkIHF1ZXVlJywgZGVzY3JpcHRpb246ICdSZWFkIGJ1aWxkLXF1ZXVlIGRlcHRoIGFuZCBwdXJnZSB0aGUgZGVhZC1sZXR0ZXIgcXVldWUgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdjb21wbGlhbmNlOnJlYWQnLCBsYWJlbDogJ1ZpZXcgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnVmlldyBjb21wbGlhbmNlIHJ1bGVzLCBwb2xpY2llcywgYW5kIHNjYW5zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBydWxlcywgcG9saWNpZXMsIGFuZCBleGVtcHRpb25zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICB7IGlkOiAnbWVtYmVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBtZW1iZXJzJywgZGVzY3JpcHRpb246ICdBZGQsIHJlbW92ZSwgYW5kIGNoYW5nZSByb2xlcyBvZiBvcmcgbWVtYmVycycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3JvbGVzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHJvbGVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcm9sZXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdpbnZpdGF0aW9uczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBpbnZpdGF0aW9ucycsIGRlc2NyaXB0aW9uOiAnU2VuZCwgcmVzZW5kLCBhbmQgcmV2b2tlIGludml0YXRpb25zJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBzZXJ2aWNlIGFjY291bnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgb3JnIHNlcnZpY2UgYWNjb3VudHMsIGFzc2lnbiB0aGVpciByb2xlcywgYW5kIGlzc3VlIG9yIHJldm9rZSB0aGVpciBrZXlzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczpyZWFkJywgbGFiZWw6ICdWaWV3IGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY3VzdG9tIGRhc2hib2FyZHMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdkYXNoYm9hcmRzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgbGFiZWw6ICdWaWV3IGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdWaWV3IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5OndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgYWxlcnRpbmcnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnbG9nczpleHBvcnQnLCBsYWJlbDogJ0Rvd25sb2FkIGxvZ3MnLCBkZXNjcmlwdGlvbjogXCJEb3dubG9hZCB5b3VyIG9yZ2FuaXphdGlvbidzIGxvZyBlbnRyaWVzIGFzIGEgZmlsZSAodmlld2luZyBsb2dzIG9ubHkgbmVlZHMgJ1ZpZXcgYWxlcnRpbmcnKVwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdhdWRpdDpyZWFkJywgbGFiZWw6ICdWaWV3IHRoZSBhdWRpdCBsb2cnLCBkZXNjcmlwdGlvbjogXCJSZWFkIHRoZSBvcmdhbml6YXRpb24ncyBvd24gdGFtcGVyLWV2aWRlbnQgYXVkaXQgdHJhaWxcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAncmVwb3J0czpyZWFkJywgbGFiZWw6ICdWaWV3IHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYW5hbHl0aWNzIGFuZCByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cm9sbHVwJywgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6d3JpdGUnLCBsYWJlbDogJ0F1dGhvciBzdGFrZWhvbGRlciByZXBvcnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIHNjaGVkdWxlIGFuZCBkcmFmdCBzY2hlZHVsZWQgcmVwb3J0cyBmb3IgbWFuYWdlcnMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHJlcG9ydHMgZXh0ZXJuYWxseScsIGRlc2NyaXB0aW9uOiAnUHVibGlzaCBhIHJlcG9ydCBhbmQgbWludCBleHBpcmluZyBzaGFyZSBsaW5rcyBmb3IgcGVvcGxlIG91dHNpZGUgdGhlIHBsYXRmb3JtJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOndyaXRlJywgbGFiZWw6ICdTZW5kIG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdTZW5kIG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBzdWJzY3JpcHRpb25zIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6cmVhZCcsIGxhYmVsOiAnVmlldyBxdW90YXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgb3JnYW5pemF0aW9uIHF1b3RhcyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpyZWFkJywgbGFiZWw6ICdWaWV3IHJlZ2lzdHJ5JywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBjb250YWluZXIgaW1hZ2UgcmVnaXN0cnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ0NvcHkgY29udGFpbmVyIGltYWdlcycsIGRlc2NyaXB0aW9uOiAnQ29weSBhbmQgcHJvbW90ZSBhIGNvbnRhaW5lciBpbWFnZSBpbnRvIGFub3RoZXIgcmVwb3NpdG9yeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpwdXJnZScsIGxhYmVsOiAnRGVsZXRlIGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0RlbGV0ZSBpbWFnZXMgYW5kIHJlcG9zaXRvcmllcywgYW5kIHJ1biByZWdpc3RyeSBnYXJiYWdlIGNvbGxlY3Rpb24nLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAnaW1wZXJzb25hdGlvbjpvcGVuJywgbGFiZWw6ICdPcGVuIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbicsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBjdXN0b21lcidzIGFjY291bnQgYXMgb25lIG9mIGl0cyB1c2Vycywgd2l0aCB0aGF0IG9yZ2FuaXphdGlvbidzIGNvbnNlbnRcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgbGFiZWw6ICdBbnN3ZXIgaW1wZXJzb25hdGlvbiByZXF1ZXN0cycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBvciBkZW55IGEgcmVxdWVzdCB0byB2aWV3IGEgbWVtYmVyIG9mIHRoaXMgb3JnYW5pemF0aW9uIGFzIHRoYXQgbWVtYmVyJywgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAndGVhbV9hY2Nlc3M6b3BlbicsIGxhYmVsOiBcIlZpZXcgYSB0ZWFtIG1lbWJlcidzIGFjY291bnRcIiwgZGVzY3JpcHRpb246IFwiVmlldyBhIG1lbWJlciBvZiBvbmUgb2YgdGhpcyBvcmdhbml6YXRpb24ncyB0ZWFtcyBhcyB0aGF0IG1lbWJlciAocmVhZC1vbmx5KVwiLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfc2V0dGluZ3M6d3JpdGUnLCBsYWJlbDogJ09yZ2FuaXphdGlvbiBzZXR0aW5ncycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIGdlbmVyYWwgb3JnIHNldHRpbmdzIGFuZCBBSSBjb25maWcnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19pZHA6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBTU08vSWRQJywgZGVzY3JpcHRpb246ICdDb25maWd1cmUgc2luZ2xlIHNpZ24tb24gYW5kIGlkZW50aXR5IHByb3ZpZGVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2ttczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGVuY3J5cHRpb24ga2V5cycsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb24ga2V5cycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBpbXBlcnNvbmF0aW9uIHBvbGljeScsIGRlc2NyaXB0aW9uOiAnQ29udHJvbCB3aGV0aGVyIHBsYXRmb3JtIG9wZXJhdG9ycyBtYXkgdmlldyB0aGUgb3JnYW5pemF0aW9uIGFzIG9uZSBvZiBpdHMgbWVtYmVycycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuXTtcblxuY29uc3QgUEVSTUlTU0lPTl9MQUJFTFMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihQRVJNSVNTSU9OX0NBVEFMT0cubWFwKChwKSA9PiBbcC5pZCwgcC5sYWJlbF0pKTtcblxuLyoqIEh1bWFuIGxhYmVsIGZvciBhIHBlcm1pc3Npb24gaWQgKGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBpZCBmb3IgYW4gdW5rbm93biBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25MYWJlbChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBFUk1JU1NJT05fTEFCRUxTLmdldChpZCkgPz8gaWQ7XG59XG5cbi8qKiBPbmUgcGlja2VyIHNlY3Rpb246IGEgY2F0ZWdvcnkgYW5kIHRoZSBwZXJtaXNzaW9ucyBpdCBjb250YWlucywgaW4gY2F0YWxvZyBvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25NZXRhW107XG59XG5cbi8qKiBHcm91cCBhIHBlcm1pc3Npb24gbGlzdCBpbnRvIGNhdGVnb3JpZXMsIHByZXNlcnZpbmcgY2F0YWxvZyBvcmRlci4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlDYXRlZ29yeShwZXJtczogcmVhZG9ubHkgUGVybWlzc2lvbk1ldGFbXSk6IFBlcm1pc3Npb25DYXRlZ29yeVtdIHtcbiAgY29uc3Qgb3JkZXI6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHN0cmluZywgUGVybWlzc2lvbk1ldGFbXT4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHBlcm1zKSB7XG4gICAgaWYgKCFieUNhdGVnb3J5LmhhcyhwLmNhdGVnb3J5KSkgeyBieUNhdGVnb3J5LnNldChwLmNhdGVnb3J5LCBbXSk7IG9yZGVyLnB1c2gocC5jYXRlZ29yeSk7IH1cbiAgICBieUNhdGVnb3J5LmdldChwLmNhdGVnb3J5KSEucHVzaChwKTtcbiAgfVxuICByZXR1cm4gb3JkZXIubWFwKChjYXRlZ29yeSkgPT4gKHsgY2F0ZWdvcnksIHBlcm1pc3Npb25zOiBieUNhdGVnb3J5LmdldChjYXRlZ29yeSkhIH0pKTtcbn1cblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBQZXJtaXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQZXJtaXNzaW9uKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBQZXJtaXNzaW9uIHtcbiAgcmV0dXJuIChBTExfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IG11c3QgTkVWRVIgYmUgZ3JhbnRhYmxlIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIENVU1RPTSBSb2xlIOKAlFxuICogdGhleSBnYXRlIHBsYXRmb3JtLW9wZXJhdG9yIHN1cmZhY2VzICh0aGUgc2hhcmVkIGltYWdlIHJlZ2lzdHJ5KSwgc28gYWxsb3dpbmdcbiAqIGFuIG9yZyBhZG1pbiB0byBtaW50IGEgUm9sZSBjYXJyeWluZyB0aGVtIHdvdWxkIGJlIGEgbGF0ZW50IHByaXZpbGVnZVxuICogZXNjYWxhdGlvbi4gVGhleSBhcmUgTk9UIHNlZWRlZCBpbnRvIEFOWSBidWlsdC1pbiBSb2xlIGJ1bmRsZSAobmVpdGhlclxuICogYG1lbWJlcmAgbm9yIGBhZG1pbmApLCBzbyB0aGUgb25seSBob2xkZXIgaXMgYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpIOKAlFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaW1hZ2UtcmVnaXN0cnkgZ2F0ZXMgdGhhdCByZXF1aXJlIHRoZW0gZWZmZWN0aXZlbHlcbiAqIHN1cGVyYWRtaW4tb25seS4gVGhpcyBsaXN0IEFMU08gYmxvY2tzIGN1c3RvbS1Sb2xlIGF1dGhvcmluZyBmcm9tIHJlcXVlc3RpbmdcbiAqIHRoZW0gKHNlZSBwbGF0Zm9ybSBgc2FuaXRpemVQZXJtaXNzaW9uc2ApLlxuICovXG5leHBvcnQgY29uc3QgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC8vIGByZWdpc3RyeTpyZWFkYCBhbmQgYHJlZ2lzdHJ5OndyaXRlYCB3ZXJlIGJvdGggaGVyZS4gV2hhdCBzdGF5cyBpcyB0aGVcbiAgLy8gZGVzdHJ1Y3RpdmUgcnVuZyBhbG9uZTogZGVsZXRpbmcgYSBtYW5pZmVzdCBvciBhIHdob2xlIHJlcG9zaXRvcnksIGFuZCB0aGVcbiAgLy8gR0MgcHJ1bmUsIGVhY2ggb2Ygd2hpY2ggY2FuIHJlbW92ZSBhbiBpbWFnZSBhIHRlbmFudCdzIHBpcGVsaW5lIHN0aWxsXG4gIC8vIHJlc29sdmVzIOKAlCBpbmNsdWRpbmcgdGhlIGRpZ2VzdC1waW5uZWQgcGx1Z2luIGltYWdlcyB0aGUgc3VwcGx5IGNoYWluXG4gIC8vIHZlcmlmaWVzIGFnYWluc3QuIFRoYXQgaXMgdGhlIG9uZSByZWdpc3RyeSBhY3Rpb24gd2l0aCBubyB1bmRvLCBzbyBpdCBrZWVwc1xuICAvLyB0aGUgbmFycm93ZXN0IHBvc3NpYmxlIGF1ZGllbmNlOiB0aGUgZmxhZywgYW5kIG5ldmVyIGEgUm9sZS5cbiAgJ3JlZ2lzdHJ5OnB1cmdlJyxcbl07XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBnb3Zlcm4gdGhlIFBMVUdJTiBFQ09TWVNURU0gYW5kIG1heSBiZSBoZWxkIG9ubHkgaW5zaWRlIHRoZVxuICogc3lzdGVtIG9yZyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIExpa2VcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IHRoZXkgYXJlIGluIG5vIG1lbWJlci9hZG1pbi9vd25lciBidW5kbGUsXG4gKiBhbmQgbm8gUm9sZSBhdXRob3JlZCBpbiBhIFRFTkFOVCBtYXkgY2Fycnkgb25lOiBwbGF0Zm9ybSdzXG4gKiBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWRtaXRzIHRoZW0gb25seSB3aGVuIHRoZSBhdXRob3IgaXMgYSBzdXBlcmFkbWluIEFORFxuICogdGhlIFJvbGUgaXMgYmVpbmcgd3JpdHRlbiBpbiB0aGUgc3lzdGVtIG9yZyBpdHNlbGYgKGBtYXlDb21wb3NlU3lzdGVtT3JnUm9sZWApLlxuICpcbiAqIFNvIHRoZXJlIGFyZSB0aHJlZSBncmFudCBwYXRocywgbm90IG9uZTogYSBzdXBlcmFkbWluIChpbXBsaWNpdC1hbGwpLCBvbmUgb2ZcbiAqIHRoZSBzZWVkZWQgc3lzdGVtLW9yZyBSb2xlcywgYW5kIGEgQ1VTVE9NIHN5c3RlbS1vcmcgUm9sZSBhIHN1cGVyYWRtaW5cbiAqIGNvbXBvc2VkLiBUaGUgdGhpcmQgaXMgd2hhdCBtYWtlcyB0aGUgc3BsaXQgYmV0d2VlbiBgcGx1Z2luczptb2RlcmF0ZWAgYW5kXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgIHVzYWJsZSB3aXRob3V0IHdhaXRpbmcgZm9yIGEgbmV3IHNlZWQgYnVuZGxlIOKAlCB3b3J0aFxuICoga25vd2luZyBiZWZvcmUgcmVhZGluZyBlaXRoZXIgcGVybWlzc2lvbiBhcyBcInVucmVhY2hhYmxlIGV4Y2VwdCB2aWFcbiAqIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU31cIi5cbiAqXG4gKiBgb25jYWxsOm1hbmFnZWAgaXMgY2FycmllZCBieSAqKlBsYXRmb3JtIE9wZXJhdG9yKiogYW5kIGJ5IG5vIG90aGVyIG5hbWVkXG4gKiByb2xlLiBUaGF0IHNwbGl0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb3ZlcnNpZ2h0OiBwYWdpbmcgaXMgdGhlXG4gKiB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgY29uY2VybiBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24sIHNvIHdpZGVuaW5nIHRoZSBFY29zeXN0ZW0gTWFuYWdlciByb2xlIHRvIGNhcnJ5IGl0IHdvdWxkIGhhbmQgdGhlXG4gKiBwYWdlciB0byBwZW9wbGUgaGlyZWQgdG8gcmV2aWV3IHBsdWdpbnMuIEl0IGlzIG5vdCBhIHBsYWNlaG9sZGVyIOKAlCBpdCBnYXRlc1xuICogdHdvIGxpdmUgcm91dGVzICh0aGUgcGFnaW5nIHBvc3R1cmUgcmVhZCBhbmQgdGhlIHRlc3QgcGFnZSksIHVubGlrZVxuICogYHJlZ2lzdHJ5OipgLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOm1vZGVyYXRlJyxcbiAgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgLy8gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlcywgc3lzdGVtLW9yZy1vbmx5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlXG4gIC8vIGNvbnNvbGVzIGFyZTogdGhleSByZWFkIGFuZCBtb3ZlIHRoaW5ncyBiZWxvbmdpbmcgdG8gb3JnYW5pc2F0aW9ucyB0aGVcbiAgLy8gaG9sZGVyIGlzIG5vdCBhIG1lbWJlciBvZiwgc28gdGhleSBtdXN0IG5ldmVyIGJlIGdyYW50YWJsZSBpbnNpZGUgYSB0ZW5hbnQuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gIC8vIFJlYWRpbmcgdGhlIGltYWdlIHJlZ2lzdHJ5OiByZXBvc2l0b3J5IG5hbWVzLCB0YWdzLCBtYW5pZmVzdHMsIGJsb2JzIGFuZCB0aGVcbiAgLy8gc3RvcmFnZSByb2xsdXAuIFByb21vdGVkIG91dCBvZiBTVVBFUkFETUlOX09OTFkgYmVjYXVzZSB0aGUgcmVnaXN0cnkgYnJvd3NlclxuICAvLyB3YXMgaW52aXNpYmxlIHRvIGV2ZXJ5IFJvbGUsIHNvIGEgUGxhdGZvcm0gT3BlcmF0b3IgZGVidWdnaW5nIGEgZmFpbGVkXG4gIC8vIHBsdWdpbiBidWlsZCBjb3VsZCBzZWUgdGhlIGJ1aWxkIHF1ZXVlIGFuZCBpdHMgZGVhZCBsZXR0ZXJzIGJ1dCBub3QgdGhlXG4gIC8vIGltYWdlcyB0aGUgYnVpbGQgcHJvZHVjZWQg4oCUIGFuZCB0aGUgb25seSB3YXkgdG8gbG9vayB3YXMgdGhlIHN1cGVyYWRtaW5cbiAgLy8gZmxhZy4gSXQgc3RheXMgc3lzdGVtLW9yZy1vbmx5IChubyB0ZW5hbnQgUm9sZSBtYXkgY2FycnkgaXQpIGFuZCBpcyBwYWlyZWRcbiAgLy8gd2l0aCBhIHBlci1yZXBvIG9yZy1vd25lcnNoaXAgZmlsdGVyIHRoYXQgcnVucyBBRlRFUiBpdCwgc28gd2lkZW5pbmcgdGhlXG4gIC8vIHBlcm1pc3Npb24gZG9lcyBub3Qgd2lkZW4gd2hpY2ggcmVwb3NpdG9yaWVzIGEgaG9sZGVyIGNhbiByZWFjaDogYVxuICAvLyBzeXN0ZW0tb3JnIG1lbWJlciB3aG8gaXMgbm90IGEgc3VwZXJhZG1pbiBzZWVzIGBzeXN0ZW0vKmAsIGBsaWJyYXJ5LypgIGFuZFxuICAvLyBgcHVibGljLypgIOKAlCB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgYW5kIG5vIHRlbmFudCdzXG4gIC8vIGBvcmctKmAgcmVwb3NpdG9yaWVzIGF0IGFsbCAoYGNhblJlYWRSZXBvYCBpbiB0aGUgaW1hZ2UtcmVnaXN0cnkgc2VydmljZSkuXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgLy8gQ29weWluZy9wcm9tb3RpbmcgYW4gaW1hZ2UuIFN5c3RlbS1vcmctb25seSByYXRoZXIgdGhhbiBzdXBlcmFkbWluLW9ubHlcbiAgLy8gYmVjYXVzZSBpdCBpcyBBRERJVElWRTogaXQgd3JpdGVzIGEgbmV3IHRhZyBhbmQgbWFrZXMgbm90aGluZyBzdG9wXG4gIC8vIHJlc29sdmluZywgYW5kIGBjYW5Xcml0ZVJlcG9gIGNvbmZpbmVzIGEgbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBjYWxsZXJcbiAgLy8gdG8gYHN5c3RlbS8qYCByZWdhcmRsZXNzLiBEZWxpYmVyYXRlbHkgY2FycmllZCBieSBOTyBidWlsdC1pbiBidW5kbGUgdG9kYXlcbiAgLy8g4oCUIHByb21vdGluZyBhbiBpbWFnZSBpcyBhIGpvYiwgbm90IGEgc2lkZSBlZmZlY3Qgb2YgcnVubmluZyB0aGUgZGVwbG95bWVudCxcbiAgLy8gc28gaXQgd2FpdHMgZm9yIGEgUm9sZSBvZiBpdHMgb3duIHJhdGhlciB0aGFuIHJpZGluZyBhbG9uZyB3aXRoXG4gIC8vIGBwbGF0Zm9ybTpyZWFkYC5cbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLFxuICAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgLy8gT3BlbmluZyBhIGNyb3NzLXRlbmFudCBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIFN5c3RlbS1vcmctb25seSBmb3IgdGhlXG4gIC8vIG9idmlvdXMgcmVhc29uIOKAlCBpdCB2aWV3cyBhbiBvcmdhbmlzYXRpb24gdGhlIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2Yg4oCUXG4gIC8vIGFuZCBpdCBpcyB0aGUgT05FIHBlcm1pc3Npb24gaW4gdGhpcyBsaXN0IHRoYXQgYWxzbyBoYXMgdG8gY2xlYXIgYSBnYXRlIHRoZVxuICAvLyBwZXJtaXNzaW9uIHN5c3RlbSBkb2VzIG5vdCBvd246IHRoZSB0YXJnZXQgb3JnYW5pc2F0aW9uJ3MgY29uc2VudCAoaXRzXG4gIC8vIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAgcG9saWN5KSwgcGx1cyBhYWwyIGFuZCBhIHN0cm9uZyBzdGVwLXVwLiBUaGVcbiAgLy8gcGVybWlzc2lvbiBzYXlzIHdobyBtYXkgQVNLOyB0aGUgdGVuYW50IHN0aWxsIGFuc3dlcnMuXG4gIC8vXG4gIC8vIEl0IGRvZXMgTk9UIGNvdmVyIGVtZXJnZW5jeSBhY2Nlc3MuIGBQT1NUIC86dXNlcklkL2JyZWFrZ2xhc3NgIGJ5cGFzc2VzXG4gIC8vIHRlbmFudCBjb25zZW50IGFuZCBzbyBzdGF5cyBvbiB0aGUgc3VwZXJhZG1pbiBmbGFnIGFsb25lLCBhcHByb3ZlZCBieSBhXG4gIC8vIFNFQ09ORCBzdXBlcmFkbWluIChmb3VyLWV5ZXMpLiBBIHBlcm1pc3Npb24gdGhhdCBjb3VsZCBiZSBkZWxlZ2F0ZWQgbXVzdCBub3RcbiAgLy8gYmUgYWJsZSB0byB3YWxrIHBhc3QgY29uc2VudC5cbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG4gIC8vIFBhZ2luZyBpcyB0aGUgdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIGNvbmNlcm4gYW5kIGdyYW50cyBOTyB0ZW5hbnQgYWNjZXNzXG4gIC8vIOKAlCBgaXNTeXN0ZW1PcmdJZGAgaXMgYSBjb250ZW50LW93bmVyIGNoZWNrLCBub3QgYSBwcml2aWxlZ2UgZ2F0ZSDigJQgc28gYVxuICAvLyB0ZW5hbnQgcm9sZSBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY2FycnkgaXQsIGFuZCBhIHRlbmFudCBtdXN0IG5ldmVyIGJlIGFibGVcbiAgLy8gdG8gbWFrZSB0aGlzIGRlcGxveW1lbnQgc2VuZCBhIHBhZ2UuXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgLy8gVGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCB0YXNrcy4gRWFjaCBvbmUgcmVwbGFjZWQgYSBgcmVxdWlyZVN5c3RlbUFkbWluYFxuICAvLyBnYXRlLCBzbyB0aGUgcG9pbnQgb2YgbGlzdGluZyB0aGVtIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50IG9mIGFkZGluZ1xuICAvLyB0aGVtIGF0IGFsbDogYSBSb2xlIGNvbXBvc2VkIGluIHRoZSBzeXN0ZW0gb3JnIGNhbiBjYXJyeSBleGFjdGx5IG9uZSBqb2IsXG4gIC8vIGFuZCBubyBSb2xlIGluIGFueSB0ZW5hbnQgY2FuIGNhcnJ5IGl0IGF0IGFsbC5cbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnLFxuICAvLyBUaGUgVG9vbGNoYWluIGNvbnNvbGUgKHBsYW4gRDkpOiBUSEUgcGxhdGZvcm0gZGVmYXVsdCBhbmQgY2FuYXJ5IG1vdmUgdGhlXG4gIC8vIGJ1aWxkIHRvb2xjaGFpbiBvZiBldmVyeSBvcmcgdGhhdCBmb2xsb3dzIGl0LCBzbyBubyB0ZW5hbnQgbWF5IGhvbGQgaXQuXG4gICd0b29sY2hhaW46b3BlcmF0ZScsXG5dO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlIHN5c3RlbSBvcmcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIGFuIG9yZyBtYXkgYXNzaWduIHZpYSBhIENVU1RPTSBSb2xlIOKAlCBldmVyeSBwZXJtaXNzaW9uIGV4Y2VwdCB0aGVcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfS5cbiAqIEN1c3RvbS1Sb2xlIGNyZWF0ZS91cGRhdGUgdmFsaWRhdGVzIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzZXQgYWdhaW5zdCB0aGlzXG4gKiAoc2VlIHBsYXRmb3JtIHJvbGVzLXNlcnZpY2UpLlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocCkpO1xuXG4vKiogV2hldGhlciBgcGVybWlzc2lvbmAgbWF5IGJlIGdyYW50ZWQgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgY3VzdG9tIFJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHBlcm1pc3Npb24pICYmICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb24pO1xufVxuXG4vKipcbiAqIENhdGVnb3J5IOKGkiBwZXJtaXNzaW9ucyBmb3IgdGhlIGN1c3RvbS1Sb2xlIEFVVEhPUklORyBwaWNrZXI6IHRoZSBjYXRhbG9nIG1pbnVzXG4gKiB0aGUgbm9uLWFzc2lnbmFibGUgcGVybWlzc2lvbnMsIHdpdGggYW55IG5vdy1lbXB0eSBjYXRlZ29yeSBkcm9wcGVkXG4gKiAoc28gXCJSZWdpc3RyeVwiIGRpc2FwcGVhcnMpLiBUaGUgZ3JvdXBlZCB2aWV3IG9mXG4gKiB7QGxpbmsgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlN9LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FTU0lHTkFCTEVfQ0FURUdPUklFUzogcmVhZG9ubHkgUGVybWlzc2lvbkNhdGVnb3J5W10gPVxuICBncm91cEJ5Q2F0ZWdvcnkoUEVSTUlTU0lPTl9DQVRBTE9HLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwLmlkKSkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbHMgKHBlcnNvbmFsIGFjY2VzcyBrZXlzIC8gbWFjaGluZSB0b2tlbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEV2ZXJ5IGA6cmVhZGAgcGVybWlzc2lvbiDigJQgdGhlIFwicmVhZC1vbmx5XCIgcHJlc2V0IGEgbmV3IHBlcnNvbmFsIGFjY2VzcyBrZXlcbiAqIHN0YXJ0cyBmcm9tLiBEZXJpdmVkIGZyb20gdGhlIGNhdGFsb2cgc28gYSBuZXcgcmVzb3VyY2UncyByZWFkIHBlcm1pc3Npb25cbiAqIGpvaW5zIHRoZSBwcmVzZXQgd2l0aG91dCBhIHNlY29uZCBlZGl0LlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9PTkxZX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPVxuICBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKCc6cmVhZCcpKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSByZXF1ZXN0ZWQgcGVybWlzc2lvbiBzdWJzZXQ6IGV2ZXJ5IGVudHJ5IG11c3QgYmUgYSBjYXRhbG9nIGlkXG4gKiAoYW55dGhpbmcgZWxzZSDihpIgYG51bGxgLCB0aGUgY2FsbGVyJ3MgNDAwKSwgZHVwbGljYXRlcyBjb2xsYXBzZSwgYW5kIHRoZVxuICogcmVzdWx0IGlzIGluIGNhbm9uaWNhbCBjYXRhbG9nIG9yZGVyIHNvIGEgc3RvcmVkIHN1YnNldCBjb21wYXJlcyBzdGFibHkuXG4gKiBBbiBFTVBUWSBhcnJheSBpcyB2YWxpZCDigJQgYSBrZXkgdGhhdCBjYW4gYXV0aGVudGljYXRlIGJ1dCBkbyBub3RoaW5nIOKAlCBhbmRcbiAqIGlzIGRpc3RpbmN0IGZyb20gXCJubyBzdWJzZXRcIiAoYHVuZGVmaW5lZGApLCB3aGljaCBtZWFucyBmdWxsIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBlcm1pc3Npb25TdWJzZXQocmVxdWVzdGVkOiByZWFkb25seSB1bmtub3duW10pOiBQZXJtaXNzaW9uW10gfCBudWxsIHtcbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcCBvZiByZXF1ZXN0ZWQpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnIHx8ICFpc1ZhbGlkUGVybWlzc2lvbihwKSkgcmV0dXJuIG51bGw7XG4gICAgd2FudGVkLmFkZChwKTtcbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gd2FudGVkLmhhcyhwKSk7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb25zIGEgcGVybWlzc2lvbi1zY29wZWQgY3JlZGVudGlhbCBhY3R1YWxseSBjYXJyaWVzOiB0aGVcbiAqIElOVEVSU0VDVElPTiBvZiB0aGUgc3Vic2V0IGl0IHdhcyBjcmVhdGVkIHdpdGggYW5kIHRoZSBob2xkZXIncyBDVVJSRU5UXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMsIGluIGNhdGFsb2cgb3JkZXIuIFJlLWV2YWx1YXRlZCBhdCBldmVyeSBpc3N1ZSwgc29cbiAqIGxvc2luZyBhIFJvbGUgc2hyaW5rcyB0aGUgY3JlZGVudGlhbCBhbmQgbm90aGluZyBjYW4gZXZlciBncm93IGl0IHBhc3QgdGhlXG4gKiBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdFBlcm1pc3Npb25zKFxuICBlZmZlY3RpdmU6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWJzZXQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUGVybWlzc2lvbltdIHtcbiAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoc3Vic2V0KTtcbiAgY29uc3QgaGVsZCA9IG5ldyBTZXQoZWZmZWN0aXZlKTtcbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IGFsbG93ZWQuaGFzKHApICYmIGhlbGQuaGFzKHApKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBlcm1pc3Npb24gYnVuZGxlcyB1c2VkIHRvIFNFRUQgdGhlIGJ1aWx0LWluIFJvbGVzIChcIkFkbWluXCIsIFwiTWVtYmVyXCIpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBkZWZpbml0aW9uIG9mIHdoYXQgdGhvc2UgYnVpbHQtaW4gUm9sZXMgZ3JhbnQg4oCUIGl0IGlzIHVzZWRcbiAqIHdoZW4gYSBSb2xlIHJlY29yZCBpcyBjcmVhdGVkIChhbmQgYnkgdGhlIHN0YXJ0dXAgYmFja2ZpbGwpIHRvIHBvcHVsYXRlIHRoYXRcbiAqIFJvbGUncyBvd24gYHBlcm1pc3Npb25zW11gLiBJdCBpcyBOT1QgYSBydW50aW1lIHBlcm1pc3Npb24gc291cmNlOiBhIHVzZXInc1xuICogZWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWUgT05MWSBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtIChzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSkuIFRoZSBjb2Fyc2UgYHJvbGVgIGxhYmVsIChvd25lci9hZG1pbi9tZW1iZXIpXG4gKiBzdXJ2aXZlcyBvbmx5IGZvciBgaXNBZG1pbmAvb3duZXJzaGlwL2Rpc3BsYXksIG5ldmVyIHRvIGdyYW50IHBlcm1pc3Npb25zLlxuICpcbiAqIC0gYG1lbWJlcmAgIOKAlCBkYXktdG8tZGF5IGJ1aWxkZXI6IHJlYWQgKyB3cml0ZSBvbiBwaXBlbGluZXMvdGVtcGxhdGVzL3BsdWdpbnMsXG4gKiAgIHJlYWQgZWxzZXdoZXJlLiBObyBtZW1iZXIvcm9sZS9iaWxsaW5nIG1hbmFnZW1lbnQsIG5vIGNvbXBsaWFuY2UvYWxlcnRcbiAqICAgYXV0aG9yaW5nLCBhbmQgbm8gYDpwdWJsaXNoYCBvbiBhbnkgY2F0YWxvZy5cbiAqIC0gYGFkbWluYCAgIOKAlCBmdWxsIG9yZyBhZG1pbmlzdHJhdGlvbjogZXZlcnkgT1JHLUFTU0lHTkFCTEUgcGVybWlzc2lvbiAoaS5lLlxuICogICBBTExfUEVSTUlTU0lPTlMgbWludXMgdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCB0aGVcbiAqICAge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30sIHNvIGByZWdpc3RyeToqYCBzdGF5XG4gKiAgIHN1cGVyYWRtaW4taW1wbGljaXQtb25seSBhbmQgZWNvc3lzdGVtIG1vZGVyYXRpb24gc3RheXMgd2l0aCB0aGUgc3lzdGVtXG4gKiAgIG9yZydzIEVjb3N5c3RlbSBNYW5hZ2VycyDigJQgbmVpdGhlciBpcyBncmFudGVkIHRvIG9yZyBhZG1pbnMpLlxuICogLSBgb3duZXJgICAg4oCUIHNhbWUgYXMgYWRtaW4gKG93bmVyc2hpcCBpdHNlbGYg4oCUIHRyYW5zZmVyL2RlbGV0ZSDigJQgaXMgZ2F0ZWRcbiAqICAgc2VwYXJhdGVseSwgbm90IHZpYSBhIHBlcm1pc3Npb24pLlxuICovXG5jb25zdCBNRU1CRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLFxuICAncGx1Z2luczppbnN0YWxsJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ3JlcG9ydHM6cmVhZCcsXG4gICdtZXNzYWdlczpyZWFkJywgJ21lc3NhZ2VzOndyaXRlJyxcbiAgJ2JpbGxpbmc6cmVhZCcsXG4gICdxdW90YXM6cmVhZCcsXG5dO1xuXG5jb25zdCBBRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gWy4uLk9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgZWFjaCBidWlsdC1pbiBSb2xlLCBrZXllZCBieSB0aGUgY29hcnNlIHJvbGUgaXQgZ3JhbnRzLlxuICogQ29uc3VtZWQgYnkgdGhlIFJvbGUgc2VlZGVyICsgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgdG8gcG9wdWxhdGUgYSBidWlsdC1pblxuICogUm9sZSdzIGBwZXJtaXNzaW9uc1tdYC4gTk9UIGNvbnN1bHRlZCBhdCByZXF1ZXN0IHRpbWUg4oCUIHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9LlxuICovXG5leHBvcnQgY29uc3QgUk9MRV9QRVJNSVNTSU9OUzogUmVjb3JkPE9yZ1JvbGUsIHJlYWRvbmx5IFBlcm1pc3Npb25bXT4gPSB7XG4gIG1lbWJlcjogTUVNQkVSX1BFUk1JU1NJT05TLFxuICBhZG1pbjogQURNSU5fUEVSTUlTU0lPTlMsXG4gIG93bmVyOiBBRE1JTl9QRVJNSVNTSU9OUyxcbn07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSDigJQgc2VlZGVkIE9OTFkgaW4gdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gSXQgY2FycmllcyB0aGVcbiAqIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IHBsdXMgdGhlIHJlYWRzIGEgbW9kZXJhdG9yIG5lZWRzICh0aGVcbiAqIGluLWFwcCBjYXRhbG9nLCBpbi1hcHAgbm90aWNlcywgdGhlIG1vZGVyYXRpb24tU0xBIGRhc2hib2FyZCkgYW5kIG5vdGhpbmdcbiAqIHRlbmFudC1mYWNpbmc6IG5vIGByZWdpc3RyeToqYCwgbm8gYG1lbWJlcnM6bWFuYWdlYC4gVGhlIFJvbGUgZ3JhbnRzIHRoZVxuICogY29hcnNlIGBtZW1iZXJgIGxhYmVsIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG4vKipcbiAqIFRoZSBQTEFURk9STSBPUEVSQVRPUiBidW5kbGUg4oCUIHRoZSB0aGlyZCBydW5nIG9mIHRoZSBzeXN0ZW0gb3JnJ3MgbGFkZGVyLlxuICpcbiAqIEJlZm9yZSBpdCB0aGUgbGFkZGVyIGhhZCB0d28gcnVuZ3MgYW5kIGEgZ2FwOiBFY29zeXN0ZW0gTWFuYWdlciAocGx1Z2luXG4gKiBtb2RlcmF0aW9uKSBhbmQgU3VwZXIgQWRtaW4gKGltcGxpY2l0LWFsbCwgd2hpY2ggYWxzbyBjYXJyaWVzIGltcGVyc29uYXRpb24sXG4gKiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzKS4gQW55dGhpbmcgaW4gYmV0d2VlbiDigJQgcmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MsXG4gKiBydW4gYSBwcm9tb3Rpb24gY2FtcGFpZ24sIGNoZWNrIHdoZXRoZXIgdGhlIHBhZ2VyIGlzIGNvbmZpZ3VyZWQg4oCUIGhhZCB0byBiZVxuICogZG9uZSBieSBtYWtpbmcgc29tZWJvZHkgYSBmdWxsIHN1cGVyYWRtaW4uXG4gKlxuICogSXQgaXMgYSBCVU5ETEUgcmF0aGVyIHRoYW4gYSBncmFudGFibGUgbGlzdCBiZWNhdXNlIGBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlNgXG4gKiBjYW4gbmV2ZXIgYmUgY2FycmllZCBieSBhIGN1c3RvbSBSb2xlIGluIGFueSBvcmc6IHdpdGhvdXQgYSBzZWVkZWQgYnVuZGxlXG4gKiB0aGVzZSBwZXJtaXNzaW9ucyBoYWQgbm8gZ3JhbnQgcGF0aCBhdCBhbGwgYW5kIHdlcmUgc3VwZXJhZG1pbi1vbmx5IGluXG4gKiBwcmFjdGljZSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgdGhpbmcgdGhleSB3ZXJlIGFkZGVkIHRvIGF2b2lkLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgY2FycnlpbmcgYHBsdWdpbnM6bW9kZXJhdGVgIC8gYHB1Ymxpc2hlcnM6dmVyaWZ5YDogZWNvc3lzdGVtXG4gKiBtb2RlcmF0aW9uIGlzIGEgZGlmZmVyZW50IGpvYiB3aXRoIGl0cyBvd24gUm9sZSwgYW5kIGEgcmV2aWV3ZXIgb2YgcGx1Z2luc1xuICogc2hvdWxkIG5vdCBhY3F1aXJlIHRoZSBhYmlsaXR5IHRvIG1vdmUgYW5vdGhlciB0ZW5hbnQncyBtb25leSBieSBiZWluZyBoYW5kZWRcbiAqIHRoZSBvcGVyYXRvciBSb2xlLlxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gQk9USCBoYWx2ZXMgb2YgdGhlIG9sZCBgcGxhdGZvcm06cmVhZGA6IHRoaXMgaXMgdGhlIG9uZSBqb2IgdGhhdCBnZW51aW5lbHlcbiAgLy8gd2FudHMgdGhlIGRlcGxveSdzIG93biBjb25maWd1cmF0aW9uIEFORCB0aGUgY3VzdG9tZXIgcm9zdGVyLlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gIC8vIFJVTk5JTkcgdGhlIGRlcGxveW1lbnQ6IHJhaXNlIGEgcXVvdGEgZHVyaW5nIGFuIGluY2lkZW50LCB3YXRjaCB0aGUgYnVpbGRcbiAgLy8gcXVldWUgYW5kIHB1cmdlIGl0cyBkZWFkLWxldHRlciBxdWV1ZS5cbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gIC8vIFRoZSBUb29sY2hhaW4gY29uc29sZSAocGxhbiBEOSk6IGNhbmFyeSwgcHJvbW90aW9uLCByb2xsYmFjayBhbmQgcmVsZWFzZVxuICAvLyBsaWZlY3ljbGUgb2YgdGhlIG1hbmFnZWQgYnVpbGQgdG9vbGNoYWluIOKAlCBydW5uaW5nIHRoZSBkZXBsb3ltZW50LlxuICAndG9vbGNoYWluOm9wZXJhdGUnLFxuICAvLyBSZWFkcyB0aGF0IG1ha2UgdGhlIG9wZXJhdG9yIHZpZXdzIHVzYWJsZTogdGhlIGRhc2hib2FyZHMgdGhlIHBvc3R1cmUgcGFuZWxzXG4gIC8vIGxpdmUgb24sIHRoZSBjcm9zcy10ZW5hbnQgbG9nIHZpZXcsIGFuZCB0aGUgY3VzdG9tZXIncyBwbGFuIHdoZW4gYSBsaW1pdCBpc1xuICAvLyB0aGUgdGhpbmcgYmVpbmcgZGVidWdnZWQuXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIFRoZSByZWdpc3RyeSBicm93c2VyOiByZXBvc2l0b3J5IG5hbWVzLCB0YWdzIGFuZCBtYW5pZmVzdHMgZm9yIHRoZSBpbWFnZXNcbiAgLy8gdGhpcyBkZXBsb3ltZW50J3MgYnVpbGRzIHByb2R1Y2UuIEl0IHdhcyB3aXRoaGVsZCB3aGlsZSBgcmVnaXN0cnk6cmVhZGAgd2FzXG4gIC8vIHN1cGVyYWRtaW4tb25seSDigJQgYSBzZWVkZWQgYnVuZGxlIGNhcnJ5aW5nIGEgc3VwZXJhZG1pbi1vbmx5IHBlcm1pc3Npb25cbiAgLy8gd291bGQgbWFrZSB0aGF0IGxpc3QgYSBsaWUsIHNpbmNlIGJ1bmRsZXMgYnlwYXNzIGBzYW5pdGl6ZVBlcm1pc3Npb25zYC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gd2FzIHByb21vdGVkIHRvIHN5c3RlbS1vcmctb25seSBkZWxpYmVyYXRlbHkgcmF0aGVyIHRoYW4gc211Z2dsZWRcbiAgLy8gaW4gaGVyZSwgd2hpY2ggaXMgdGhlIG9yZGVyIHRob3NlIHR3byBjaGFuZ2VzIGhhdmUgdG8gaGFwcGVuIGluLlxuICAncmVnaXN0cnk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIEFDQ09VTlQgTUFOQUdFUiDigJQgdGhlIGNvbW1lcmNpYWwgcmVsYXRpb25zaGlwIHdpdGggYSBjdXN0b21lciwgYXMgb3Bwb3NlZCB0b1xuICogcnVubmluZyB0aGUgZGVwbG95bWVudC5cbiAqXG4gKiBTcGxpdCBmcm9tIHtAbGluayBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OU30gcmF0aGVyIHRoYW4gcGlsZWQgb250byBpdCxcbiAqIGJlY2F1c2UgdGhlIHR3byBqb2JzIGRpdmVyZ2UgYXQgZXhhY3RseSB0aGUgcGVybWlzc2lvbnMgYWRkZWQgYWxvbmdzaWRlIHRoaXNcbiAqIGJ1bmRsZS4gYGJpbGxpbmc6b3BlcmF0ZWAgTU9WRUQgaGVyZSBmcm9tIHRoZSBvcGVyYXRvciBidW5kbGUgZm9yIHRoYXQgcmVhc29uOlxuICogbWludGluZyBhIGRpc2NvdW50IHRva2VuIGlzIGEgY29tbWVyY2lhbCBhY3QsIG5vdCBhbiBvcGVyYXRpb25hbCBvbmUsIGFuZCB0aGVcbiAqIHBlcnNvbiB3aG8gcmVzdGFydHMgYSBzdHVjayBidWlsZCBxdWV1ZSBoYXMgbm8gcmVhc29uIHRvIGhvbGQgaXQuXG4gKlxuICogVGhlIGRlc3RydWN0aXZlIGhhbGYgb2YgdGhlIGNhdGFsb2d1ZSBsaXZlcyBoZXJlIOKAlCBgb3JnczptYW5hZ2VgIGNhbiBERUxFVEVcbiAqIGFuIG9yZ2FuaXNhdGlvbiBhbmQgYHN1YnNjcmlwdGlvbnM6bWFuYWdlYCBjYW4gY2FuY2VsIGl0cyBzdWJzY3JpcHRpb24g4oCUIHNvXG4gKiB0aGlzIGlzIGRlbGliZXJhdGVseSB0aGUgc21hbGxlciwgbW9yZSByYXJlbHktYXNzaWduZWQgb2YgdGhlIHR3by5cbiAqL1xuZXhwb3J0IGNvbnN0IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJyxcbiAgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gIC8vIEEgcXVvdGEgYnVtcCBpcyBhcyBvZnRlbiBhIGNvbW1lcmNpYWwgY29uY2Vzc2lvbiBhcyBhbiBvcGVyYXRpb25hbCBvbmUsIHNvXG4gIC8vIGJvdGggYnVuZGxlcyBjYXJyeSBpdC5cbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgd2hpY2ggaXMgdGhlIHN1cmZhY2UgdGhpcyBqb2Igd29ya3MgZnJvbSDigJQgYW5kXG4gIC8vIG9ubHkgdGhhdC4gSXQgdXNlZCB0byB0YWtlIGBwbGF0Zm9ybTpyZWFkYCwgd2hpY2ggYWxzbyBoYW5kZWQgb3ZlciB0aGVcbiAgLy8gZGVwbG95J3MgUkxTIG1vZGUsIEtNUyBwb3N0dXJlIGFuZCByZW5kZXJlZCBhbGVydCBydWxlczogaW50ZXJuYWxzIGFcbiAgLy8gY29tbWVyY2lhbCByb2xlIGhhcyBubyB1c2UgZm9yLlxuICAnb3JnczpyZWFkJyxcbl07XG5cbi8qKlxuICogQ09OU09MRSBBRE1JTklTVFJBVE9SIOKAlCB0aGUgb3BlcmF0b3IgY29uc29sZXMsIGFzIGEgUm9sZS5cbiAqXG4gKiBXSFkgVEhJUyBFWElTVFMgZXZlbiB0aG91Z2ggZWFjaCBjb25zb2xlIHBlcm1pc3Npb24gaXMgZ3JhbnRhYmxlIGJ5IGhhbmQ6IHdpdGhcbiAqIG5vIHNlZWRlZCBSb2xlLCB0aGUgb25seSBwYXRoIHRvIHBnQWRtaW4gd2FzIGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBjdXN0b21cbiAqIFJvbGUgZm9yIGl0LCBhbmQgdGhlIG9ic2VydmVkIG91dGNvbWUgb2YgYXNraW5nIHBlb3BsZSB0byBkbyB0aGF0IGlzIHRoYXQgdGhleVxuICogcmVhY2ggZm9yIHRoZSBzdXBlcmFkbWluIEZMQUcgaW5zdGVhZCDigJQgdGhlIGV4YWN0IGZhaWx1cmUgdGhlc2UgcGVybWlzc2lvbnNcbiAqIHdlcmUgYWRkZWQgdG8gcmVtb3ZlLiBBIG5hbWVkIFJvbGUgYWxzbyBtYWtlcyBcIndobyBjYW4gb3BlbiBhIGRhdGEgc2hlbGw/XCIgb25lXG4gKiBxdWVyeSBpbnN0ZWFkIG9mIGFuIGF1ZGl0IG9mIGV2ZXJ5IGN1c3RvbSBSb2xlLlxuICpcbiAqIEl0IGNhcnJpZXMgYWxsIHRocmVlIGNvbnNvbGVzLCB3aGljaCBpcyB0aGUgd2hvbGUgam9iIGZvciB0aGUgcGVyc29uIHdobyBob2xkc1xuICogaXQuIE9ORSBDT05TRVFVRU5DRSBXT1JUSCBLTk9XSU5HOiBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCBhbmRcbiAqIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIGFyZSB0aGUgdHdvIGhhbHZlcyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlXG4gKiBkZXNpZ24g4oCUIGEgTW9uZ28gc2hlbGwgY2FuIHRydW5jYXRlIGEgaGFzaCBjaGFpbidzIHRhaWwsIGFuZCB0aGUgb2JqZWN0IHN0b3JlXG4gKiBob2xkcyB0aGUgc2lnbmVkIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uIOKAlCBzbyBhIGhvbGRlciBvZiB0aGlzXG4gKiBSb2xlIGNhbiBkbyBib3RoLiBUaGUgcGVybWlzc2lvbnMgc3RheSBTRVBBUkFURSBmb3IgZXhhY3RseSB0aGF0IHJlYXNvbjogYVxuICogZGVwbG95bWVudCB0aGF0IHdhbnRzIHRoZW0gaGVsZCBieSBkaWZmZXJlbnQgcGVvcGxlIGNvbXBvc2VzIGEgbmFycm93ZXIgUm9sZVxuICogYnkgaGFuZCAoYSBzdXBlcmFkbWluIG1heSBpbmNsdWRlIGFueSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiBpbiBhIFJvbGVcbiAqIGF1dGhvcmVkIGluIHRoZSBzeXN0ZW0gb3JnKSBhbmQgYXNzaWducyB0aGlzIG9uZSB0byBub2JvZHkuXG4gKi9cbi8qKlxuICogUExBVEZPUk0gT0JTRVJWRVIg4oCUIGxvb2ssIGRvbid0IHRvdWNoLiBUaGUgbGFkZGVyJ3MgbWlzc2luZyBib3R0b20gcnVuZy5cbiAqXG4gKiBFdmVyeSBvdGhlciBzeXN0ZW0tb3JnIGJ1bmRsZSBncmFudHMgYSB3cml0ZS4gVGhlIG9uZSB0aGF0IGRvZXMgbm90IOKAlFxuICogQ29uc29sZSBBZG1pbmlzdHJhdG9yIOKAlCBncmFudHMgYSByZWFkIHRoYXQgSVMgYSBkYXRhYmFzZSBzaGVsbC4gU28gc29tZWJvZHlcbiAqIHdobyBzaG91bGQgc2VlIHRoZSBkZXBsb3ltZW50IGFuZCBjaGFuZ2Ugbm90aGluZyAoYSBuZXcgb3BlcmF0b3Igc2hhZG93aW5nLCBhblxuICogYXVkaXRvciwgYW4gb24tY2FsbCBlbmdpbmVlciBkdXJpbmcgYSBoYW5kb3ZlcikgaGFkIHR3byBvcHRpb25zOiBTdXBlciBBZG1pbixcbiAqIG9yIG5vdGhpbmcuIFRoZSB1c3VhbCBvdXRjb21lIG9mIGEgY2hvaWNlIGxpa2UgdGhhdCBpcyB0aGUgZmxhZy5cbiAqXG4gKiBTdHJpY3RseSByZWFkLW9ubHkgYnkgY29uc3RydWN0aW9uOiBldmVyeSBwZXJtaXNzaW9uIGhlcmUgZW5kcyBgOnJlYWRgLCB3aGljaFxuICogYGlzTXV0YXRpb25QZXJtaXNzaW9uYCBjbGFzc2lmaWVzIGFzIGEgcmVhZCwgc28gdGhlIGRhc2hib2FyZCBkaXNhYmxlcyBldmVyeVxuICogd3JpdGUgYWZmb3JkYW5jZSBmb3IgYSBob2xkZXIgcmF0aGVyIHRoYW4gb2ZmZXJpbmcgY29udHJvbHMgdGhhdCA0MDMuXG4gKlxuICogTk9UIGBhdWRpdDpyZWFkYC4gSXQgd291bGQgYmUgdGhlIG9idmlvdXMgYWRkaXRpb24gYW5kIGl0IGlzIHRoZSB3cm9uZyBvbmU6XG4gKiBgbGlzdEF1ZGl0RXZlbnRzYCBwaW5zIGV2ZXJ5IG5vbi1zdXBlcmFkbWluIHRvIHRoZWlyIE9XTiBvcmcsIHNvIGEgc3lzdGVtLW9yZ1xuICogb2JzZXJ2ZXIgaG9sZGluZyBpdCB3b3VsZCBzZWUgdGhlIHN5c3RlbSBvcmcncyBhdWRpdCB0cmFpbCBhbmQgbm90aGluZyBlbHNlIOKAlFxuICogYW4gYWZmb3JkYW5jZSB0aGF0IGxvb2tzIGxpa2UgZmxlZXQtd2lkZSBhdWRpdCBhY2Nlc3MgYW5kIGlzIG5vdC4gUmVhZGluZ1xuICogYW5vdGhlciB0ZW5hbnQncyB0cmFpbCBpcyBkZWxpYmVyYXRlbHkgdGhlIGZsYWcncyBhbG9uZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX09CU0VSVkVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gIC8vIEEgcmVhZCwgYW5kIHRoaXMgUm9sZSBpcyByZWFkcyDigJQgdGhlIHJlZ2lzdHJ5IGJyb3dzZXIgd2l0aCBuZWl0aGVyIG9mIHRoZVxuICAvLyB0d28gd3JpdGUgcnVuZ3MgKGByZWdpc3RyeTp3cml0ZWAgY29waWVzLCBgcmVnaXN0cnk6cHVyZ2VgIGRlbGV0ZXMpLlxuICAncmVnaXN0cnk6cmVhZCcsXG5dO1xuXG5leHBvcnQgY29uc3QgQ09OU09MRV9BRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIFRoZSBhbGwtb3JnYW5pemF0aW9ucyBsaXN0LCBzbyBhIGhvbGRlciBjYW4gZmluZCB0aGUgb3JnIHRoZXkgd2VyZSBhc2tlZFxuICAvLyBhYm91dCB3aXRob3V0IGEgc2Vjb25kIFJvbGUg4oCUIGFuZCBub3RoaW5nIG1vcmUuIFRoaXMgd2FzIGBwbGF0Zm9ybTpyZWFkYCxcbiAgLy8gd2hpY2ggbWVhbnQgb3BlbmluZyBhIGRhdGFiYXNlIGNvbnNvbGUgYWxzbyBncmFudGVkIHRoZSBkZXBsb3kncyBvd25cbiAgLy8gY29uZmlndXJhdGlvbiwgZm9yIG5vIHJlYXNvbiBiZXlvbmQgdGhlIHR3byBzaGFyaW5nIGEgZ2F0ZS5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFJFR0lTVFJZIE9QRVJBVE9SIOKAlCBtb3ZlcyBjb250YWluZXIgaW1hZ2VzIGFyb3VuZCwgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBUSEUgR0FQIElUIEZJTExTLiBQcm9tb3RpbmcgYW4gaW1hZ2Ug4oCUIGNvcHlpbmcgYSBidWlsdCB0YWcgZnJvbSBvbmUgcmVwb3NpdG9yeVxuICogdG8gdGhlIG9uZSBhIHJlbGVhc2UgcmVzb2x2ZXMg4oCUIGlzIGEgam9iIHNvbWVib2R5IGRvZXMsIGFuZCB1bnRpbCBub3cgdGhlIG9ubHlcbiAqIGlkZW50aXR5IHRoYXQgY291bGQgZG8gaXQgd2FzIGEgc3VwZXJhZG1pbi4gYHJlZ2lzdHJ5OndyaXRlYCBoYXMgbm8gb3RoZXJcbiAqIGNhcnJpZXIsIGFuZCBhIHN5c3RlbS1vcmctb25seSBwZXJtaXNzaW9uIHdpdGggbm8gc2VlZGVkIGNhcnJpZXIgaXNcbiAqIHN1cGVyYWRtaW4tb25seSBpbiBwcmFjdGljZSAodGhlIGBwbGF0Zm9ybTpyZWFkYCBmYWlsdXJlLCBwaW5uZWQgYnkgdGhlXG4gKiBcImF0IGxlYXN0IG9uZSBzZWVkZWQgY2FycmllclwiIGFzc2VydGlvbiBpbiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgKS5cbiAqIFNvIHNwbGl0dGluZyBgcmVnaXN0cnk6cHVyZ2VgIG91dCBvZiBgcmVnaXN0cnk6d3JpdGVgIGlzIG9ubHkgaGFsZiB0aGUgY2hhbmdlOlxuICogdGhlIGFkZGl0aXZlIGhhbGYgbmVlZHMgYSBSb2xlIG9yIHRoZSBzcGxpdCBidXlzIG5vdGhpbmcuXG4gKlxuICogV0hZIElUIElTIE5PVCBQQVJUIE9GIFBMQVRGT1JNIE9QRVJBVE9SLiBUaGF0IFJvbGUgcnVucyB0aGUgZGVwbG95bWVudCBhbmRcbiAqIGFscmVhZHkgcmVhZHMgdGhlIHJlZ2lzdHJ5LiBQcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCBub3QgYW5cbiAqIG9wZXJhdGlvbmFsIHNpZGUgZWZmZWN0LCBhbmQgcm9sbGluZyBpdCBpbnRvIHRoZSBSb2xlIGV2ZXJ5b25lIG9uIGNhbGwgaG9sZHNcbiAqIHdvdWxkIG1lYW4gdGhlIHBhZ2VyIHJvdGF0aW9uIGNhbiByZXRhZyBhIHJlbGVhc2UgYXQgM2FtLiBUaGUgdHdvIFJvbGVzXG4gKiBjb21wb3NlIGluc3RlYWQg4oCUIGEgbWVtYmVyIG1heSBob2xkIGFueSBudW1iZXIsIGFuZCBwZXJtaXNzaW9ucyBhcmUgdGhlIHVuaW9uLlxuICpcbiAqIFdIWSBJVCBJUyBPTkxZIFRXTyBQRVJNSVNTSU9OUy4gRGVsaWJlcmF0ZWx5IG5vdGhpbmcgZWxzZTogbm8gYHBsYXRmb3JtOnJlYWRgLFxuICogbm8gY29uc29sZSwgbm8gYG9yZ3M6cmVhZGAuIGBjYW5SZWFkUmVwb2AvYGNhbldyaXRlUmVwb2AgY29uZmluZSBhXG4gKiBub24tc3VwZXJhZG1pbiBzeXN0ZW0tb3JnIGhvbGRlciB0byBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmQgYHB1YmxpYy8qYCDigJRcbiAqIHRoaXMgZGVwbG95bWVudCdzIG93biBiYXNlIGFuZCBwbHVnaW4gaW1hZ2VzIOKAlCBzbyB0aGUgUm9sZSBjYW5ub3QgcmVhY2ggYVxuICogdGVuYW50J3MgcmVwb3NpdG9yaWVzIGF0IGFsbCwgYW5kIGEgaG9sZGVyIHdobyBhbHNvIG5lZWRzIHRoZSBvcGVyYXRvciB2aWV3c1xuICogZ2V0cyB0aGUgb3BlcmF0b3IgUm9sZSB0b28uIEl0IGRvZXMgTk9UIGNhcnJ5IGByZWdpc3RyeTpwdXJnZWAsIHdoaWNoIGlzIGluXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSBhbmQgaW4gbm8gYnVuZGxlIGJ5IGRlc2lnbjogYW4gaW1hZ2VcbiAqIHByb21vdGVyIGhhcyBubyBidXNpbmVzcyBkZWxldGluZyB0aGUgaW1hZ2UgYSB0ZW5hbnQncyBwaXBlbGluZSByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdyZWdpc3RyeTpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8qKlxuICogU1VQUE9SVCBBR0VOVCDigJQgdGhlIHN1cHBvcnQgZGVzaywgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyBgcGxhdGZvcm06cmVhZGAsIG5vIGNvbnNvbGUgYW5kIG5vIGJpbGxpbmcgd3JpdGU6IGFuXG4gKiBhZ2VudCBhbnN3ZXJzIGNhc2VzIGFuZCB3cml0ZXMgdGhlIGNhbm5lZCByZXBsaWVzLiBgc3Vic2NyaXB0aW9uczpyZWFkYCBpc1xuICogaGVyZSBiZWNhdXNlIHRoZSBmaXJzdCBxdWVzdGlvbiBvbiBhbnkgY2FzZSBpcyB3aGF0IHRoZSBjdXN0b21lciBpcyBlbnRpdGxlZFxuICogdG8sIGFuZCB3aXRob3V0IGl0IGFuIGFnZW50IHdvdWxkIGhhdmUgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICovXG5leHBvcnQgY29uc3QgU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsXG4gICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgLy8gTkVXLCBhbmQgdGhlIGdhcCB0aGUgc3BsaXQgZXhwb3NlZDogYW4gYWdlbnQgdHJpYWdpbmcgYSBjYXNlIG5lZWRzIHRvIGZpbmRcbiAgLy8gdGhlIGN1c3RvbWVyJ3Mgb3JnYW5pemF0aW9uLiBUaGUgb25seSBwZXJtaXNzaW9uIHRoYXQgbGlzdGVkIG9yZ3Mgd2FzXG4gIC8vIGBwbGF0Zm9ybTpyZWFkYCwgd2hpY2ggd291bGQgYWxzbyBoYXZlIGhhbmRlZCBhIHN1cHBvcnQgYWdlbnQgdGhlIGRlcGxveSdzXG4gIC8vIGludGVybmFscyDigJQgc28gdGhleSBoYWQgbmVpdGhlciwgYW5kIGhhZCB0byBhc2sgc29tZW9uZSBlbHNlIHRvIGxvb2suXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIGFuZCBhbnN3ZXJpbmcgdGhlIGNhc2UgaXRzZWxmIHJpZGVzIHRoZSBvcmRpbmFyeSBtZXNzYWdpbmdcbiAgLy8gcGVybWlzc2lvbnMg4oCUIGEgc3VwcG9ydCBjYXNlIElTIGEgbWVzc2FnZSB0aHJlYWQuXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ21lc3NhZ2VzOndyaXRlJyxcbl07XG5cbi8qKlxuICogU1VQUE9SVCBMRUFEIOKAlCB0aGUgc3VwcG9ydCBkZXNrLCBwbHVzIHRoZSBhdXRob3JpdHkgdG8gbG9vay5cbiAqXG4gKiBUSEUgR0FQIElUIEZJTExTLiBgaW1wZXJzb25hdGlvbjpvcGVuYCBpcyBzeXN0ZW0tb3JnLW9ubHksIGFuZCBhIHN5c3RlbS1vcmctb25seVxuICogcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzIHN1cGVyYWRtaW4tb25seSBpbiBwcmFjdGljZSDigJQgdGhlXG4gKiBpbnZhcmlhbnQgYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCBhc3NlcnRzLCBhbmQgdGhlIHJlYXNvblxuICogYHBsYXRmb3JtOnJlYWRgIHNoaXBwZWQgdW51c2FibGUuIFdpdGhvdXQgdGhpcyBSb2xlLCBzcGxpdHRpbmcgaW1wZXJzb25hdGlvblxuICogb3V0IG9mIHRoZSBmbGFnIHdvdWxkIGNoYW5nZSBub3RoaW5nOiB0aGUgb25seSB3YXkgdG8gbGV0IHNvbWVib2R5IHZpZXcgYVxuICogY3VzdG9tZXIncyBhY2NvdW50IHdvdWxkIHN0aWxsIGJlIHRvIG1ha2UgdGhlbSBhIGZ1bGwgU3VwZXIgQWRtaW4sIGhhbmRpbmdcbiAqIG92ZXIgYC9hZG1pbi91c2Vycy86aWQvZ3JhbnRzYCwgdGhlIHNpbmdsZS1wZXJzb24gTUZBIHJlc2V0LCB0aGUgZGF0YWJhc2VcbiAqIGNvbnNvbGUgYW5kIGByZWdpc3RyeTpwdXJnZWAgYXQgdGhlIHNhbWUgdGltZS5cbiAqXG4gKiBXSFkgSVQgSVMgVEhFIFNVUFBPUlQgREVTSyBBTkQgTk9UIFRIRSBPUEVSQVRPUi4gVGhlIHF1ZXN0aW9uIGltcGVyc29uYXRpb25cbiAqIGFuc3dlcnMgaXMgXCJ3aGF0IGlzIHRoaXMgY3VzdG9tZXIgYWN0dWFsbHkgc2VlaW5nP1wiLCB3aGljaCBpcyBhIHN1cHBvcnRcbiAqIHF1ZXN0aW9uLiBQbGF0Zm9ybSBPcGVyYXRvciBydW5zIHRoZSBkZXBsb3ltZW50IGFuZCBpcyBoZWxkIGJ5IHdob2V2ZXIgaXMgb25cbiAqIGNhbGw7IGFkZGluZyB0aGlzIHRvIGl0IHdvdWxkIGhhbmQgZXZlcnkgcm90YSBtZW1iZXIgdGhlIGFiaWxpdHkgdG8gYmVjb21lIGFueVxuICogY3VzdG9tZXIncyB1c2VyIGF0IDNhbS4gU3VwcG9ydCBBZ2VudCdzIGJ1bmRsZSBwbHVzIHRoZSBvbmUgcGVybWlzc2lvbiBpcyB0aGVcbiAqIG5hcnJvd2VyLCBtb3JlIGhvbmVzdCBzaGFwZSDigJQgYW5kIGEgbGVhZCB3aG8gYWxzbyBydW5zIHRoZSBkZXBsb3ltZW50IGhvbGRzXG4gKiBib3RoIFJvbGVzLlxuICpcbiAqIFdIQVQgSVQgU1RJTEwgQ0FOTk9UIERPLiBFbWVyZ2VuY3kgYWNjZXNzOiBgYnJlYWtnbGFzc2AgYnlwYXNzZXMgdGVuYW50XG4gKiBjb25zZW50IGFuZCBzdGF5cyBvbiB0aGUgZmxhZywgYXBwcm92ZWQgYnkgYSBzZWNvbmQgU3VwZXIgQWRtaW4uIEFuZCB0aGVcbiAqIHRlbmFudCBjYW4gcmVmdXNlIOKAlCBgaW1wZXJzb25hdGlvbjpvcGVuYCBpcyBwZXJtaXNzaW9uIHRvIEFTSy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfTEVBRF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAuLi5TVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TLFxuICAnaW1wZXJzb25hdGlvbjpvcGVuJyxcbl07XG5cbi8qKlxuICogU1RBUlRJTkcgUE9JTlRTIGZvciBhIGN1c3RvbSBSb2xlIGluIGEgdGVuYW50IG9yZyDigJQgdGVtcGxhdGVzLCBub3QgUm9sZXMuXG4gKlxuICogVEhFIEdBUCBUSEVZIEZJTEwuIEFuIG9yZyBzZWVkcyBleGFjdGx5IFRXTyBSb2xlcyDigJQgTWVtYmVyIGFuZCBBZG1pbiDigJQgYW5kXG4gKiBBZG1pbiBpcyBldmVyeSBvcmctYXNzaWduYWJsZSBwZXJtaXNzaW9uLiBTbyBwcm9tb3RpbmcgYW55b25lIHBhc3QgXCJhdXRob3IgYW5kXG4gKiByZWFkXCIgaGFuZHMgb3ZlciB0aGUgd2hvbGUgcmVtYWluZGVyIGF0IG9uY2U6IGBvcmdfa21zOndyaXRlYCxcbiAqIGBvcmdfaWRwOndyaXRlYCwgYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCwgYGJpbGxpbmc6bWFuYWdlYCwgYHJvbGVzOm1hbmFnZWBcbiAqIGFuZCBgYXVkaXQ6cmVhZGAgYW1vbmcgdGhlbS4gVGhlIHByb2R1Y3QncyBhbnN3ZXIgaXMgXCJhdXRob3IgYSBjdXN0b20gUm9sZVwiLFxuICogYW5kIHRoZSBzYWZldHkgaXMgYWxyZWFkeSByaWdodCAoYHNhbml0aXplUGVybWlzc2lvbnNgIGJvdW5kcyBhIGN1c3RvbSBSb2xlIGJ5XG4gKiBpdHMgYXV0aG9yJ3Mgb3duIGNlaWxpbmcpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBUaGUgZXhhY3Qgc2l6ZXMgb2YgdGhhdCBjbGlmZiBhcmUgYXNzZXJ0ZWQgaW4gYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2BcbiAqIHJhdGhlciB0aGFuIHdyaXR0ZW4gaGVyZS4gVGhpcyBwYXJhZ3JhcGggdXNlZCB0byBjYXJyeSB0aGVtIGlubGluZSDigJQgXCJ0aHJlZVxuICogUm9sZXM6IE1lbWJlciAoMTUpLCBUZWFtIExlYWQgKDE3KSBhbmQgQWRtaW4gKDM3KVwiIOKAlCBhbmQgZXZlcnkgb25lIG9mIHRob3NlXG4gKiBudW1iZXJzIHdlbnQgc3RhbGU6IGBUZWFtIExlYWRgIHN0b3BwZWQgYmVpbmcgc2VlZGVkIHdoZW4gaXQgYmVjYW1lIHRoZSBmaXJzdFxuICogdGVtcGxhdGUgYmVsb3csIGFuZCB0aGUgdHdvIGJ1bmRsZXMgaGF2ZSBncm93biBzaW5jZS4gQSBjb3VudCBub3RoaW5nIGNoZWNrc1xuICogaXMgYSBjbGFpbSB0aGF0IGRlY2F5cywgYW5kIHRoaXMgb25lIHdhcyB0aGUgc3RhdGVkIHJhdGlvbmFsZSBmb3IgdGhlIGZlYXR1cmUuXG4gKlxuICogV0hZIFRFTVBMQVRFUyBBTkQgTk9UIFNFRURFRCBST0xFUy4gQSBzZWVkZWQgYnVpbHQtaW4gaXMgYHN5c3RlbTogdHJ1ZWAgYW5kXG4gKiB0aGVyZWZvcmUgaW1tdXRhYmxlLCBzbyBzZWVkaW5nIHRoZXNlIHdvdWxkIHB1dCBmb3VyIHVuZGVsZXRhYmxlIHJvd3MgaW4gZXZlcnlcbiAqIG9yZyB3aGV0aGVyIGl0IHdhbnRzIHRoZW0uIEEgdGVtcGxhdGUgbGVhdmVzIG5vIHRyYWNlIHVudGlsIHNvbWVvbmUgdXNlcyBpdCxcbiAqIGFuZCB3aGF0IGl0IHByb2R1Y2VzIGlzIGFuIG9yZGluYXJ5IGN1c3RvbSBSb2xlIHRoZSBvcmcgZnVsbHkgb3ducyDigJQgZWRpdGFibGUsXG4gKiBkZWxldGFibGUsIGFuZCBib3VuZGVkIGJ5IHRoZSBhdXRob3IncyBjZWlsaW5nIGxpa2UgYW55IG90aGVyLlxuICpcbiAqIFdIQVQgVEhFWSBERUxJQkVSQVRFTFkgRVhDTFVERS4gYHJvbGVzOm1hbmFnZWAgaXMgaW4gbm9uZSBvZiB0aGVtLiBJdCBpcyB0aGVcbiAqIG9uZSBwZXJtaXNzaW9uIHRoYXQgY29tcG91bmRzIOKAlCB0aGUgaG9sZGVyIGNhbiBtaW50IGZ1cnRoZXIgUm9sZXMsIHVwIHRvIHRoZWlyXG4gKiBvd24gY2VpbGluZyDigJQgc28gYWNxdWlyaW5nIGl0IHNob3VsZCBzdGF5IGEgY29uc2Npb3VzIGFjdCByYXRoZXIgdGhhbiBhIHNpZGVcbiAqIGVmZmVjdCBvZiBwaWNraW5nIGEgcHJlc2V0LiBFdmVyeSBwZXJtaXNzaW9uIGhlcmUgaXMgb3JnLWFzc2lnbmFibGUsIHNvIGFcbiAqIHRlbXBsYXRlIGlzIHZhbGlkIGluIGFueSBvcmcgYW5kIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBhY2NlcHRzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVUZW1wbGF0ZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIGpvYiBpcyDigJQgc2hvd24gbmV4dCB0byB0aGUgdGVtcGxhdGUsIGFuZCBhIHNlbnNpYmxlIFJvbGUgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQZXJtaXNzaW9uW107XG59XG5cbmV4cG9ydCBjb25zdCBST0xFX1RFTVBMQVRFUzogcmVhZG9ubHkgUm9sZVRlbXBsYXRlW10gPSBbXG4gIHtcbiAgICAvLyBXYXMgYSBTRUVERUQgUm9sZSBpbiBldmVyeSBvcmcgdW50aWwgaXQgYmVjYW1lIGEgdGVtcGxhdGUuIEl0IGlzIHRoZSBvbmx5XG4gICAgLy8gYnVpbHQtaW4gdGhhdCB3YXMgYSBqb2IgZGVzY3JpcHRpb24gcmF0aGVyIHRoYW4gYSBzdHJ1Y3R1cmFsIHJlcXVpcmVtZW50OlxuICAgIC8vIFN1cGVyIEFkbWluIGlzIHdoZXJlIGBpc1N1cGVyQWRtaW5gIGlzIGRlcml2ZWQgZnJvbSwgQWRtaW4gYW5kIE1lbWJlciBhcmVcbiAgICAvLyB0aGUgZmxvb3IgYW4gb3JnIGlzIHVudXNhYmxlIHdpdGhvdXQsIGFuZCB0aGUgc3lzdGVtLW9yZyBSb2xlcyBjYXJyeVxuICAgIC8vIHBlcm1pc3Npb25zIG5vIGN1c3RvbSBSb2xlIG1heSBob2xkLiBUZWFtIExlYWQgd2FzIG5vbmUgb2YgdGhvc2Ug4oCUIGl0IGlzXG4gICAgLy8gYG1lbWJlcmAgcGx1cyB0d28gcmVwb3J0IHBlcm1pc3Npb25zLCBhbmQgYW4gb3JnIHRoYXQgZG9lcyBub3QgZGVsZWdhdGVcbiAgICAvLyByZXBvcnQgYXV0aG9yaW5nIGhhZCBhbiB1bmRlbGV0YWJsZSByb3cgZm9yIGl0IGFueXdheS5cbiAgICAvL1xuICAgIC8vIENPTlNFUVVFTkNFLCBzdGF0ZWQgcmF0aGVyIHRoYW4gZGlzY292ZXJlZDogYSBuZXcgb3JnIG5vIGxvbmdlciBoYXMgYSBSb2xlXG4gICAgLy8gdGhhdCBncmFudHMgYHJlcG9ydHM6d3JpdGVgIHRvIGEgbm9uLWFkbWluLiBBbiBhZG1pbiBob2xkcyBib3RoIHBlcm1pc3Npb25zXG4gICAgLy8gKHRoZXkgYXJlIGluIHRoZSBhZG1pbiBidW5kbGUpIGFuZCBpbnN0YW50aWF0ZXMgdGhpcyB0ZW1wbGF0ZSB0byBkZWxlZ2F0ZVxuICAgIC8vIHRoZW0g4oCUIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBmb3VyIGJlbG93LiBPcmdzIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSBzZWVkZWRcbiAgICAvLyBSb2xlIGtlZXAgaXQsIGFuZCB0aGUgYmFja2ZpbGwga2VlcHMgaXRzIGJ1bmRsZSBjdXJyZW50LlxuICAgIGlkOiAndGVhbS1sZWFkJyxcbiAgICBuYW1lOiAnVGVhbSBMZWFkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0F1dGhvcnMgYW5kIHNoYXJlcyBzdGFrZWhvbGRlciByZXBvcnRzIGZvciBhIHRlYW0sIHdpdGhvdXQgb3JnLWFkbWluIGFjY2Vzcy4nLFxuICAgIHBlcm1pc3Npb25zOiBbLi4uTUVNQkVSX1BFUk1JU1NJT05TLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnXSxcbiAgfSxcbiAge1xuICAgIC8qKlxuICAgICAqIE1FTUJFUiBBTFJFQURZIElTIFRIRSBERVZFTE9QRVIgUk9MRSDigJQgdGhpcyB0ZW1wbGF0ZSBleGlzdHMgZm9yIHdoYXQgaXRcbiAgICAgKiBkb2VzIE5PVCBjb3Zlci5cbiAgICAgKlxuICAgICAqIEV2ZXJ5dGhpbmcgaW4gYSBkZXZlbG9wZXIncyBsb29wIGlzIGBwaXBlbGluZXM6cmVhZGAgKyBgcGlwZWxpbmVzOndyaXRlYCxcbiAgICAgKiBib3RoIGluIHRoZSBtZW1iZXIgYnVuZGxlOiBjcmVhdGUsIGVkaXQsIHZhbGlkYXRlLCBydW4sIHN0b3AsIHRoZSBidWxrXG4gICAgICogb3BzLCBBSSBnZW5lcmF0aW9uIChgL3BpcGVsaW5lcy9nZW5lcmF0ZWAsIGluY2wuIGZyb20tdXJsIGFuZCBzdHJlYW1pbmcpLFxuICAgICAqIHRoZSBwaXBlbGluZSByZWdpc3RyeSwgcGx1cyBgdGVtcGxhdGVzOnJlYWRgIHRvIGluc3RhbnRpYXRlIGFuZFxuICAgICAqIGBwbHVnaW5zOmluc3RhbGxgIHRvIGFkZCBhIHBsdWdpbi4gQSB0ZW1wbGF0ZSByZXN0YXRpbmcgdGhhdCB3b3VsZCBidXlcbiAgICAgKiBub3RoaW5nLlxuICAgICAqXG4gICAgICogV2hhdCBhIGRldmVsb3BlciBoaXRzIHRoZSBjbGlmZiBvbiBpcyB0aGUgU0VMRi1TRVJWSUNFIG9wZXJhdGUgcGFpcjogdGhleVxuICAgICAqIGNhbiByZWFkIHRoZWlyIHNlcnZpY2UncyBkYXNoYm9hcmRzIGFuZCBtZXRyaWNzIGFuZCBjYW5ub3QgY2hhbmdlIGVpdGhlcixcbiAgICAgKiBiZWNhdXNlIGJvdGggd3JpdGVzIHNpdCBpbiB0aGUgYWRtaW4gYnVuZGxlLiBTbyB0aGUgcGVyc29uIHdobyBvd25zIGFcbiAgICAgKiBwaXBlbGluZSBmaWxlcyBhIHRpY2tldCB0byBnZXQgYW4gYWxlcnQgb24gaXQuXG4gICAgICpcbiAgICAgKiBERUxJQkVSQVRFTFkgTk9UIEhFUkUuIGBsb2dzOmV4cG9ydGAg4oCUIHZpZXdpbmcgbG9ncyByaWRlc1xuICAgICAqIGBvYnNlcnZhYmlsaXR5OnJlYWRgLCBidXQgZG93bmxvYWRpbmcgdGhlbSBpcyBidWxrIGVncmVzcyBhbiBvcmcgbWF5XG4gICAgICogd2l0aGhvbGQgZnJvbSBtZW1iZXJzIChkb2NzL3Blcm1pc3Npb25zLm1kKSwgYW5kIGEgdGVtcGxhdGUgYWltZWQgYXQgZXZlcnlcbiAgICAgKiBlbmdpbmVlciB3b3VsZCByZXZlcnNlIHRoYXQuIGBwaXBlbGluZXM6cHVibGlzaGAg4oCUIHNoYXJpbmcgYmV5b25kIHRoZVxuICAgICAqIGF1dGhvciBpcyBhIHJlbGVhc2UgZGVjaXNpb24sIHdoaWNoIGlzIFJlbGVhc2UgTWFuYWdlcidzIGJlbG93OyBzb21lYm9keVxuICAgICAqIHdobyBkb2VzIGJvdGggaG9sZHMgYm90aCBSb2xlcy5cbiAgICAgKi9cbiAgICBpZDogJ2RldmVsb3BlcicsXG4gICAgbmFtZTogJ0RldmVsb3BlcicsXG4gICAgZGVzY3JpcHRpb246ICdCdWlsZHMgYW5kIHJ1bnMgcGlwZWxpbmVzLCBhbmQgb3ducyB0aGUgZGFzaGJvYXJkcyBhbmQgYWxlcnRzIGZvciB3aGF0IHRoZXkgYnVpbGQuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ2Rhc2hib2FyZHM6d3JpdGUnLCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSddLFxuICB9LFxuICB7XG4gICAgaWQ6ICdyZWxlYXNlLW1hbmFnZXInLFxuICAgIG5hbWU6ICdSZWxlYXNlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVjaWRlcyB3aGF0IGJlY29tZXMgc2hhcmVkIGJleW9uZCBpdHMgYXV0aG9yLCBhbmQgYXBwcm92ZXMgcGx1Z2luIGluc3RhbGxzLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6cHVibGlzaCcsXG4gICAgICAndGVtcGxhdGVzOnJlYWQnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAgICAgJ3BsdWdpbnM6cmVhZCcsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAgICAgJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3NlY3VyaXR5LW9mZmljZXInLFxuICAgIG5hbWU6ICdTZWN1cml0eSBPZmZpY2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LCBlbmNyeXB0aW9uIGtleXMgYW5kIHRoZSBldmlkZW5jZSB0cmFpbCDigJQgdGhlIHN1cmZhY2UgYW4gYXVkaXRvciBhc2tzIGFib3V0LicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdhdWRpdDpyZWFkJywgJ2xvZ3M6ZXhwb3J0JyxcbiAgICAgICdjb21wbGlhbmNlOnJlYWQnLCAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgICAnb3JnX2lkcDp3cml0ZScsICdvcmdfa21zOndyaXRlJywgJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJyxcbiAgICAgIC8vIE93bmluZyB0aGUgaW1wZXJzb25hdGlvbiBQT0xJQ1kgKGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWApIHdpdGhvdXRcbiAgICAgIC8vIGJlaW5nIGFibGUgdG8gYW5zd2VyIGEgUkVRVUVTVCB3YXMgdGhlIGFzeW1tZXRyeSB0aGUgY29uc2VudCBmbG93IGxlZnRcbiAgICAgIC8vIGJlaGluZDogdGhlIGxlc3NlciBhY3QgaGFkIGEgcGVybWlzc2lvbiBvZiBpdHMgb3duIGFuZCB0aGUgZ3JlYXRlciBvbmVcbiAgICAgIC8vIGhhZCBub25lLiBXaG9ldmVyIGRlY2lkZXMgd2hldGhlciBjb25zZW50IGlzIHJlcXVpcmVkIHNob3VsZCBiZSBhYmxlIHRvXG4gICAgICAvLyBnaXZlIG9yIHdpdGhob2xkIGl0LlxuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncGVvcGxlLW1hbmFnZXInLFxuICAgIG5hbWU6ICdQZW9wbGUgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgcm9zdGVyIGFuZCBpdHMgbWFjaGluZSBjcmVkZW50aWFscywgYWNyb3NzIHRoZSBhY2NvdW50XFx1MjAxOXMgdGVhbXMg4oCUIHdpdGhvdXQgdGhlIG9yZ1xcdTIwMTlzIHNldHRpbmdzIG9yIGl0cyBtb25leS4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnbWVtYmVyczptYW5hZ2UnLCAnaW52aXRhdGlvbnM6bWFuYWdlJywgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJyxcbiAgICAgIC8vIFRoZSBzYW1lIGpvYiwgb25lIGxldmVsIGRvd246IGVudGVyaW5nIGEgZGVzY2VuZGFudCB0ZWFtIHRvIHdvcmsgb24gaXRzXG4gICAgICAvLyByb3N0ZXIsIGFuZCB2aWV3aW5nIG9uZSBvZiBpdHMgbWVtYmVycyBhcyB0aGF0IG1lbWJlci4gV2l0aG91dCBpdCBhXG4gICAgICAvLyBwZW9wbGUgbWFuYWdlciBpbiBhIHBhcmVudCBvcmcgY2FuIGFkbWluaXN0ZXIgdGhlIGFjY291bnQncyB0ZWFtcyBvblxuICAgICAgLy8gcGFwZXIgYW5kIG5vdCByZWFjaCB0aGVtLlxuICAgICAgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ2JpbGxpbmctbWFuYWdlcicsXG4gICAgbmFtZTogJ0JpbGxpbmcgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgc3Vic2NyaXB0aW9uLCBzZWF0cyBhbmQgaW52b2ljZXMgZm9yIHRoaXMgb3JnYW5pemF0aW9uLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLCAncXVvdGFzOnJlYWQnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBUaGUgam9iIHRoZSBpbXBlcnNvbmF0aW9uIGNvbnNlbnQgZmxvdyBjcmVhdGVkIElOU0lERSB0aGUgdGVuYW50OiB0aGVcbiAgICAgKiBuYW1lZCBwZXJzb24gd2hvIGFuc3dlcnMgXCJtYXkgYSBzdXBwb3J0IGVuZ2luZWVyIHZpZXcgdGhpcyBhY2NvdW50P1wiIGFuZFxuICAgICAqIGNhbiBhZnRlcndhcmRzIHJlYWQgd2hhdCBoYXBwZW5lZC5cbiAgICAgKlxuICAgICAqIEl0IGV4aXN0cyBhcyBhIHRlbXBsYXRlIGJlY2F1c2UgYGltcGVyc29uYXRpb246YXBwcm92ZWAgaXMgaW4gdGhlIGFkbWluXG4gICAgICogYW5kIG93bmVyIGJ1bmRsZXMg4oCUIHNvIGJ5IGRlZmF1bHQgZXZlcnkgYWRtaW4gbWF5IGNvbnNlbnQg4oCUIGFuZCB0aGUgd2hvbGVcbiAgICAgKiBwb2ludCBvZiBzcGxpdHRpbmcgaXQgb3V0IHdhcyB0byBsZXQgYW4gb3JnIHNheSBcInRoaXMgZGVjaXNpb24gaXMgb25lXG4gICAgICogcGVyc29uJ3NcIi4gRG9pbmcgdGhhdCBtZWFucyBhdXRob3JpbmcgYSBSb2xlIHRoYXQgaG9sZHMgaXQgYW5kIHRha2luZyBpdFxuICAgICAqIG9mZiB0aGUgb3RoZXJzLCBhbmQgaGFuZC1jb21wb3Npbmcgd2FzIHRoZSBvbmx5IHJvdXRlLlxuICAgICAqXG4gICAgICogVHdvIHBlcm1pc3Npb25zIGFuZCBubyBtb3JlOiBhcHByb3ZpbmcgaXMgbm90IGFkbWluaXN0ZXJpbmcuIGBhdWRpdDpyZWFkYFxuICAgICAqIGlzIGhlcmUgYmVjYXVzZSBjb25zZW50aW5nIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGVjayB3aGF0IHRoZSBzZXNzaW9uXG4gICAgICogdGhlbiBkaWQgaXMgY29uc2VudCBpbiBuYW1lIG9ubHkuXG4gICAgICovXG4gICAgaWQ6ICdhY2Nlc3MtYXBwcm92ZXInLFxuICAgIG5hbWU6ICdBY2Nlc3MgQXBwcm92ZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQW5zd2VycyByZXF1ZXN0cyB0byB2aWV3IHRoaXMgb3JnYW5pemF0aW9uXFx1MjAxOXMgYWNjb3VudHMsIGFuZCByZWFkcyB0aGUgdHJhaWwgb2Ygd2hhdCBoYXBwZW5lZC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ2F1ZGl0OnJlYWQnLFxuICAgIF0sXG4gIH0sXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJFY29zeXN0ZW0gTWFuYWdlclwiIFJvbGUg4oCUIHRoZSBNT0RFUkFUSU9OIGpvYi5cbiAqXG4gKiBJdCBjYXJyaWVzIGBwbHVnaW5zOm1vZGVyYXRlYCBhbmQgTk9UIGBwdWJsaXNoZXJzOnZlcmlmeWAsIGJlY2F1c2UgdGhlIHR3byBhcmVcbiAqIG5vdCBwZWVycy4gYHBsdWdpbnM6bW9kZXJhdGVgIGlzIHRoZSB3aWRlIHN1cmZhY2U6IHlhbmsgYSB2ZXJzaW9uICh3aGljaFxuICogYnJlYWtzIHBpcGVsaW5lcyBhbHJlYWR5IHJ1bm5pbmcgaXQpLCBwdWJsaXNoIGFuIGFkdmlzb3J5ICh3aGljaCBhbGFybXMgZXZlcnlcbiAqIGNvbnN1bWVyIG9mIGEgbGlzdGluZyksIHJld3JpdGUgdGhlIGF1dG8tYXBwcm92YWwgcnVsZXMgKHdoaWNoIGRlY2lkZSB3aGF0XG4gKiBwdWJsaXNoZXMgd2l0aCBubyBodW1hbiByZXZpZXcgYXQgYWxsKSwgcmVzZXJ2ZSBuYW1lcywgbW9kZXJhdGUgcmV2aWV3cyxcbiAqIHJlLXNpZ24uIGBwdWJsaXNoZXJzOnZlcmlmeWAgaXMgdGhyZWUgcm91dGVzIOKAlCBzdXNwZW5kLCB1bnN1c3BlbmQsIHRpZXIg4oCUIGJ1dFxuICogb25lIG9mIHRoZW0gR1JBTlRTIFZFUklGSUVEIFNUQVRVUywgd2hpY2ggaXMgdGhlIGJhZGdlIGNvbnN1bWVycyByZWFkIGFzIFwidGhpc1xuICogZGVwbG95bWVudCB2b3VjaGVzIGZvciB0aGUgcHVibGlzaGVyXCIuXG4gKlxuICogQnVuZGxpbmcgdGhlbSwgYXMgdGhpcyBSb2xlIHVzZWQgdG8sIG1lYW50IGV2ZXJ5b25lIGhpcmVkIHRvIHRyaWFnZSB0aGUgcXVldWVcbiAqIGNvdWxkIGFsc28gbWludCBhIFZlcmlmaWVkIHB1Ymxpc2hlci4gVGhyZWUgbWVjaGFuaXNtcyBhbHJlYWR5IGFzc3VtZSB0aGVcbiAqIHNwbGl0IGNhbiBiaW5kIOKAlCBgcmVxdWlyZWREZWNpc2lvblBlcm1pc3Npb25gIHBlciByZXF1ZXN0IGtpbmQsIHRoZSBxdWV1ZSdzXG4gKiBwZXItcm93IGBjYW4ocmVxdWlyZWRQZXJtaXNzaW9uKWAsIGFuZCB0aGUgYXBwcm92ZXItc2hvcnRhZ2UgY291bnRzIHRoYXRcbiAqIGBFY29zeXN0ZW1FbGlnaWJpbGl0eWAgdHJhY2tzIFNFUEFSQVRFTFkgZm9yIGVhY2ggcGVybWlzc2lvbiDigJQgYW5kIHdpdGggb25lXG4gKiBjb21iaW5lZCBSb2xlIG5vbmUgb2YgdGhlbSBjb3VsZCBldmVyIGRpc2NyaW1pbmF0ZS5cbiAqXG4gKiB7QGxpbmsgUFVCTElTSEVSX1ZFUklGSUVSX1BFUk1JU1NJT05TfSBpcyB0aGUgb3RoZXIgaGFsZi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQdWJsaXNoZXIgVmVyaWZpZXJcIiBSb2xlIOKAlCB0aGUgVFJVU1QgZGVjaXNpb24uXG4gKlxuICogVGhlIG90aGVyIGhhbGYgb2YgdGhlIGVjb3N5c3RlbSBzcGxpdCBkZXNjcmliZWQgb25cbiAqIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU306IHdobyBtYXkgYXdhcmQgVmVyaWZpZWQsIHN1c3BlbmQgYVxuICogcHVibGlzaGVyIGFuZCBsaWZ0IGEgc3VzcGVuc2lvbi4gQ2FycmllcyBgcGx1Z2luczpyZWFkYCBzbyB0aGUgaG9sZGVyIGNhbiBzZWVcbiAqIHdoYXQgYSBwdWJsaXNoZXIgc2hpcHMgYmVmb3JlIHZvdWNoaW5nIGZvciB0aGVtLCBhbmQgdGhlIHNhbWUgdHdvIGFtYmllbnRcbiAqIHJlYWRzIGFzIGl0cyBzaWJsaW5nLlxuICpcbiAqIFNUQUZGIEFUIExFQVNUIFRXTyBQRU9QTEUuIEEgVmVyaWZpZWQgYXBwbGljYXRpb24gYW5kIGFuIHVuc3VzcGVuZCBhcmUgYm90aFxuICogYG5lZWRzVHdvUGVyc29uYCwgYW5kIGBjb25mbGljdE9mSW50ZXJlc3RgIHJlZnVzZXMgdGhlIHNhbWUgcGVyc29uIHR3aWNlLCBzbyBhXG4gKiBzaW5nbGUgaG9sZGVyIGNhbm5vdCBjb21wbGV0ZSBlaXRoZXIgZGVjaXNpb24gYWxvbmUuIFRoZSBjb25zb2xlJ3MgYXBwcm92ZXJcbiAqIHN0YW5kaW5nIG5vdGljZSBpcyB3aGF0IHN1cmZhY2VzIHRoYXQgc2hvcnRhZ2Ug4oCUIGFuZCBzcGxpdHRpbmcgdGhpcyBSb2xlIG91dFxuICogaXMgd2hhdCBmaW5hbGx5IGxldHMgdGhhdCBub3RpY2UgcmVwb3J0IGEgZmlndXJlIGl0cyBzaWJsaW5nJ3MgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6cmVhZCcsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJUZWFtIExlYWRcIiBSb2xlIOKAlCB0aGUgcGVyc29uIHdobyByZXBvcnRzIFVQV0FSRC5cbiAqXG4gKiBFeGlzdHMgYmVjYXVzZSB0aGUgdGFyZ2V0IHVzZXIgZm9yIHN0YWtlaG9sZGVyIHJlcG9ydHMgaXMgYSBsZWFkLCBub3QgYW4gYWRtaW4sXG4gKiBhbmQgZ3JhbnRpbmcgYHJlcG9ydHM6d3JpdGVgIG9ubHkgdGhyb3VnaCB0aGUgYWRtaW4gYnVuZGxlIHdvdWxkIGhhdmUgZm9yY2VkXG4gKiBldmVyeSByZXBvcnRpbmcgbGVhZCB0byBiZSBhbiBvcmcgYWRtaW4gKG1lbWJlcnM6bWFuYWdlLCByb2xlczptYW5hZ2UsXG4gKiBvcmdfc2V0dGluZ3M6d3JpdGUsIGJpbGxpbmcpIHRvIHNlbmQgdGhlaXIgbWFuYWdlciBhIHdlZWtseSBzdW1tYXJ5LlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IGByZXBvcnRzOnJvbGx1cGAuIFJvbGxpbmcgYSByZXBvcnQgdXAgb3ZlciBkZXNjZW5kYW50XG4gKiB0ZWFtcyBpcyBkb3dud2FyZCB2aXNpYmlsaXR5IGFjcm9zcyB0aGUgb3JnIHRyZWUsIHdoaWNoIGlzIGEgZ3JhbnRlZCBjYXBhYmlsaXR5XG4gKiBpbiB0aGlzIG1vZGVsLCBub3Qgc29tZXRoaW5nIGEgdGVhbSdzIG93biBsZWFkIGdldHMgYnkgZGVmYXVsdCDigJQgYSBsZWFkIG9mIGFcbiAqIFBBUkVOVCBvcmcgaXMgZ3JhbnRlZCBpdCBleHBsaWNpdGx5LiBUaGUgUm9sZSBncmFudHMgdGhlIGNvYXJzZSBgbWVtYmVyYCBsYWJlbFxuICogYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBURUFNX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uTUVNQkVSX1BFUk1JU1NJT05TLFxuICAncmVwb3J0czp3cml0ZScsXG4gICdyZXBvcnRzOnB1Ymxpc2gnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgQXV0b21hdGlvblwiIFJvbGUg4oCUIHdoYXQgdGhlIG9yZydzXG4gKiB1bnNjb3BlZCBzdG9yZWQgY3JlZGVudGlhbCAodGhlIGBwbGF0Zm9ybS1hdXRvbWF0aW9uYCBzZXJ2aWNlIGFjY291bnQgdGhhdFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gIHByb3Zpc2lvbnMpIG5lZWRzLCBhbmQgbm90aGluZyBtb3JlLlxuICpcbiAqIERlcml2ZWQgYnkgdHJhY2luZyBldmVyeSBjYWxsIG1hZGUgd2l0aCB0aGF0IGtleSwgbm90IGJ5IGd1ZXNzaW5nOlxuICogIC0gYHBpcGVsaW5lczpyZWFkYCDigJQgdGhlIENvZGVCdWlsZCBzeW50aCAoYW5kIGBwaXBlbGluZSBkZXBsb3kgLS1zdG9yZS10b2tlbnNgKVxuICogICAgZmV0Y2hpbmcgdGhlIHBpcGVsaW5lIGl0IGJ1aWxkcyAoYEdFVCAvcGlwZWxpbmVzLzppZGApO1xuICogIC0gYHBsdWdpbnM6cmVhZGAgICDigJQgcGx1Z2luIHJlc29sdXRpb24gYXQgc3ludGgvZGVwbG95IGFuZCBpbiB0aGUgcGx1Z2luLWxvb2t1cFxuICogICAgTGFtYmRhIChgUE9TVCAvcGx1Z2lucy9sb29rdXBgKSwgYW5kIHRoZSBydW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIHN0ZXBcbiAqICAgIChgUE9TVCAvcGx1Z2lucy9ydW50aW1lLWNoZWNrYCkuXG4gKlxuICogV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgY2FycnksIGFuZCB3aGVyZSB0aGF0IHdvcmsgd2VudDpcbiAqICAtIHJlZ2lzdHJ5IHdyaXRlcyAoYHBpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlYCkg4oCUIHRoZSBzeW50aCByZWdpc3RlcnMgaXRzIHN0ZXBcbiAqICAgIG1hbmlmZXN0IHdpdGggdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5IChQaXBlbGluZSBSZWdpc3RyYXRpb24pO1xuICogIC0gaW1hZ2UgcHVzaGVzIGFuZCBwdWxscyDigJQgQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5IHdpdGhcbiAqICAgIHRoZSBgcmVnaXN0cnktcHVzaGAgc2NvcGVkIGtleSwgbmV2ZXIgdGhpcyBvbmU7XG4gKiAgLSByZXBvcnRpbmcgd3JpdGVzIOKAlCB0aGUgZXZlbnRzIExhbWJkYSBhbmQgc3RlcCByZXBvcnQgdXBsb2FkcyB1c2UgdGhlXG4gKiAgICBgcmVwb3J0aW5nOmluZ2VzdGAgc2NvcGVkIGtleS5cbiAqXG4gKiBJdCB1c2VkIHRvIGJlIHRoZSBvcmcgQURNSU4gUm9sZSwgc28gYSBsZWFrZWQgc3ludGggY3JlZGVudGlhbCBjb3VsZCByZXdyaXRlXG4gKiBldmVyeSBwaXBlbGluZSwgUm9sZSBhbmQgbWVtYmVyIG9mIHRoZSBvcmcuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsXG4gICdwbHVnaW5zOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgUmVnaXN0cmF0aW9uXCIgUm9sZSwgaGVsZCBieSB0aGVcbiAqIGBwaXBlbGluZS1yZWdpc3RlcmAgc2VydmljZSBhY2NvdW50OiBgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCBmb3JcbiAqIGl0cyBvd24gb3JnIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vdCBldmVuIGEgcmVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgb3JnIHBlcm1pc3Npb25zIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uXG4gKlxuICogU2luZ2xlLXNvdXJjZSBtb2RlbDogYSB1c2VyJ3MgYWJpbGl0aWVzIGFyZSBFWEFDVExZIHRoZSB1bmlvbiBvZiB0aGVcbiAqIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgdGhlIFJvbGVzIHRoZXkgaG9sZCAoYSBSb2xlID0gYSBuYW1lZCBwZXJtaXNzaW9uIHNldDtcbiAqIGJ1aWx0LWluIFJvbGVzIGNhcnJ5IHRoZWlyIGJ1bmRsZSBleHBsaWNpdGx5LCBzZWVkZWQgZnJvbVxuICoge0BsaW5rIFJPTEVfUEVSTUlTU0lPTlN9KS4gVGhlcmUgaXMgbm8gc2VwYXJhdGUgcm9sZS1kZXJpdmVkIGJhc2VsaW5lIOKAlCB0aGVcbiAqIGNvYXJzZSBgcm9sZWAgbGFiZWwgZ3JhbnRzIG5vdGhpbmcgb24gaXRzIG93bi5cbiAqXG4gKiAxLiBQbGF0Zm9ybSBzdXBlcmFkbWlucyAoYGlzU3VwZXJBZG1pbmApIGFsd2F5cyBnZXQgQUxMIHBlcm1pc3Npb25zLlxuICogMi4gT3RoZXJ3aXNlLCB1bmlvbiBldmVyeSBwZXJtaXNzaW9uIGdyYW50ZWQgYnkgdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcy5cbiAqIDMuIEludmFsaWQvdW5rbm93biBwZXJtaXNzaW9uIHN0cmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkUGVybWlzc2lvbnMgLSBGbGF0dGVuZWQgcGVybWlzc2lvbnMgZnJvbSBldmVyeSBSb2xlIHRoZSB1c2VyIGhvbGRzXG4gKiBAcGFyYW0gaXNTdXBlckFkbWluIC0gV2hldGhlciB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBzdXBlci1hZG1pbiBmbGFnXG4gKiBAcmV0dXJucyBFZmZlY3RpdmUgcGVybWlzc2lvbnMgaW4gY2Fub25pY2FsIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlclBlcm1pc3Npb25zKFxuICBhc3NpZ25lZFBlcm1pc3Npb25zPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogUGVybWlzc2lvbltdIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfUEVSTUlTU0lPTlNdO1xuXG4gIGNvbnN0IHBlcm1zID0gbmV3IFNldDxQZXJtaXNzaW9uPigpO1xuICBpZiAoYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3QgcCBvZiBhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoaXNWYWxpZFBlcm1pc3Npb24ocCkpIHBlcm1zLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIocCA9PiBwZXJtcy5oYXMocCkpO1xufVxuXG4vKipcbiAqIENvbmZpbmUgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgdG8gd2hhdCBtYXkgYmUgaGVsZCBpbiB0aGUgdG9rZW4ncyBBQ1RJVkVcbiAqIG9yZzogb3V0c2lkZSB0aGUgc3lzdGVtIG9yZyBldmVyeSB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSBlbnRyeSBpc1xuICogZHJvcHBlZCAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIEFwcGxpZWQgYXQgdG9rZW4gaXNzdWUgb25cbiAqIHRvcCBvZiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30g4oCUIGluY2x1ZGluZyBhIHN1cGVyYWRtaW4ncyBpbXBsaWNpdC1hbGwg4oCUXG4gKiBzbyBhIHRva2VuIG1pbnRlZCBpbiBhIHRlbmFudCBvcmcgbmV2ZXIgQ0xBSU1TIGBwbHVnaW5zOm1vZGVyYXRlYCAvXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgLCBldmVuIGlmIGEgaGFuZC13cml0dGVuIFJvbGUgZG9jdW1lbnQgc29tZWhvdyBjYXJyaWVkXG4gKiB0aGVtIHRoZXJlLiAoU3VwZXJhZG1pbnMgc3RpbGwgcGFzcyBgaGFzUGVybWlzc2lvbmAgdmlhIHRoZSBmbGFnOyB0aGVcbiAqIGVjb3N5c3RlbSByb3V0ZSBnYXRlIGFkZGl0aW9uYWxseSByZXF1aXJlcyB0aGUgc3lzdGVtIG9yZywgc28gdGhhdCBieXBhc3NcbiAqIG5ldmVyIHJlYWNoZXMgYSBnb3Zlcm5hbmNlIHJvdXRlIGZyb20gYSB0ZW5hbnQgb3JnIGVpdGhlci4pXG4gKlxuICogVGFrZXMgYSBib29sZWFuIHJhdGhlciB0aGFuIGFuIG9yZyBpZCBzbyB0aGlzIG1vZHVsZSBzdGF5cyBkZXBlbmRlbmN5LWZyZWVcbiAqICh0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdCk7IGNhbGxlcnMgZGVjaWRlIHdpdGggYXBpLWNvcmUgYGlzU3lzdGVtT3JnSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmluZVBlcm1pc3Npb25zVG9Pcmc8UCBleHRlbmRzIHN0cmluZz4oXG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQW10sXG4gIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnOiBib29sZWFuLFxuKTogUFtdIHtcbiAgcmV0dXJuIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnID8gWy4uLnBlcm1pc3Npb25zXSA6IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocCkpO1xufVxuXG4vKiogV2hldGhlciBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCBncmFudHMgYHBlcm1pc3Npb25gIChzdXBlcmFkbWluIOKHkiBhbHdheXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24oXG4gIGdyYW50ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhZ3JhbnRlZCAmJiBncmFudGVkLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXMsIGFzIGEgVEFCTEVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVGhlIG5hbWVkIHBlcm1pc3Npb24gYnVuZGxlcyBhIGJ1aWx0LWluIFJvbGUgbWF5IGNhcnJ5LCBhbmQgdGhlIFJvbGUgTkFNRSBlYWNoXG4gKiBvbmUgaXMgc2VlZGVkIHVuZGVyLiBPbmUgdGFibGUsIGJlY2F1c2UgdGhlIHRocmVlIGZhY3RzIGFib3V0IGEgam9iIFJvbGUg4oCUXG4gKiBpdHMgaWQsIGl0cyBwZXJtaXNzaW9ucyBhbmQgaXRzIGRpc3BsYXkgbmFtZSDigJQgd2VyZSBwcmV2aW91c2x5IHRocmVlXG4gKiBpbmRlcGVuZGVudCBsaXN0cyBpbiB0aHJlZSBwbGFjZXMsIGFuZCBub3RoaW5nIGhlbGQgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBXSEFUIFdFTlQgV1JPTkcgV0lUSE9VVCBJVC4gVGhlIHBsYXRmb3JtIHJlc29sdmVkIGEgYnVuZGxlIHRocm91Z2ggYVxuICogbmluZS1icmFuY2ggYGlmYCBjaGFpbiB3aXRoIGEgZmFsbC10aHJvdWdoIHRvIHRoZSBjb2Fyc2UgYGdyYW50c1JvbGVgIGJ1bmRsZS5cbiAqIEV2ZXJ5IGpvYiBSb2xlIGdyYW50cyBgbWVtYmVyYCwgc28gYSBidW5kbGUgYWRkZWQgdG8gdGhlIGlkIGxpc3QgV0lUSE9VVCBpdHNcbiAqIGJyYW5jaCBkaWQgbm90IGZhaWwg4oCUIGl0IHNpbGVudGx5IHNlZWRlZCB0aGUgcGxhaW4gTWVtYmVyIGJ1bmRsZSwgYW5kIHRoZVxuICogc3RhcnR1cCBiYWNrZmlsbCB0aGVuIHJlLXN5bmNlZCBpdCB0byB0aGF0IHdyb25nIHZhbHVlIG9uIGV2ZXJ5IGJvb3QuIFRoZVxuICogUm9sZSBleGlzdGVkLCB3YXMgYXNzaWduYWJsZSBmcm9tIHRoZSBzdGFmZmluZyBwYW5lbCwgYW5kIGdyYW50ZWQgZmlmdGVlblxuICogdGVuYW50IHBlcm1pc3Npb25zIGluc3RlYWQgb2YgaXRzIGpvYi4gTm90aGluZyBhbnl3aGVyZSBleGVyY2lzZWQgdGhlXG4gKiByZXNvbHZlciBwZXIgYnVuZGxlLlxuICpcbiAqIEtleWVkIGFjY2VzcyBwbHVzIGBzYXRpc2ZpZXNgIG1ha2VzIGEgbWlzc2luZyBlbnRyeSBhIENPTVBJTEUgZXJyb3IsIGFuZCBhblxuICogZXh0cmEgb25lIHRvbyDigJQgaW4gYm90aCBkaXJlY3Rpb25zLCB3aXRoIG5vIHJ1bnRpbWUgY2hlY2sgdG8gZm9yZ2V0LlxuICpcbiAqIFRoZSBOQU1FIGxpdmVzIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbi4gVGhlIHBsYXRmb3JtIHNlZWRlZCBuYW1lcyBmcm9tIGl0c1xuICogb3duIGNvbnN0YW50cyB3aGlsZSB0aGUgZnJvbnRlbmQncyBzdGFmZmluZyByb3N0ZXIgaGFyZC1jb2RlZCBpdHMgb3duIGNvcHksXG4gKiBlYWNoIHBpbm5lZCBieSBhIHRlc3QgYWdhaW5zdCBpdHNlbGYg4oCUIHNvIHJlbmFtaW5nIGEgUm9sZSBwYXNzZWQgYm90aCBzdWl0ZXNcbiAqIGFuZCB0aGUgcm9zdGVyIHNpbGVudGx5IHJlbmRlcmVkIFwiUm9sZSBub3QgZm91bmRcIiwgd2hpY2ggaXMgdGhlIGdyYW50IHBhdGggZm9yXG4gKiB0aGF0IFJvbGUncyBwZXJtaXNzaW9ucyBkaXNhcHBlYXJpbmcuIEJvdGggc2lkZXMgcmVhZCB0aGlzIG5vdy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFUyA9IHtcbiAgZWNvc3lzdGVtX21hbmFnZXI6IHsgbmFtZTogJ0Vjb3N5c3RlbSBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIHB1Ymxpc2hlcl92ZXJpZmllcjogeyBuYW1lOiAnUHVibGlzaGVyIFZlcmlmaWVyJywgcGVybWlzc2lvbnM6IFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OUyB9LFxuICB0ZWFtX2xlYWQ6IHsgbmFtZTogJ1RlYW0gTGVhZCcsIHBlcm1pc3Npb25zOiBURUFNX0xFQURfUEVSTUlTU0lPTlMgfSxcbiAgcGxhdGZvcm1fb2JzZXJ2ZXI6IHsgbmFtZTogJ1BsYXRmb3JtIE9ic2VydmVyJywgcGVybWlzc2lvbnM6IFBMQVRGT1JNX09CU0VSVkVSX1BFUk1JU1NJT05TIH0sXG4gIHBsYXRmb3JtX29wZXJhdG9yOiB7IG5hbWU6ICdQbGF0Zm9ybSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUyB9LFxuICBhY2NvdW50X21hbmFnZXI6IHsgbmFtZTogJ0FjY291bnQgTWFuYWdlcicsIHBlcm1pc3Npb25zOiBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlMgfSxcbiAgY29uc29sZV9hZG1pbjogeyBuYW1lOiAnQ29uc29sZSBBZG1pbmlzdHJhdG9yJywgcGVybWlzc2lvbnM6IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlMgfSxcbiAgc3VwcG9ydF9hZ2VudDogeyBuYW1lOiAnU3VwcG9ydCBBZ2VudCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TIH0sXG4gIHN1cHBvcnRfbGVhZDogeyBuYW1lOiAnU3VwcG9ydCBMZWFkJywgcGVybWlzc2lvbnM6IFNVUFBPUlRfTEVBRF9QRVJNSVNTSU9OUyB9LFxuICByZWdpc3RyeV9vcGVyYXRvcjogeyBuYW1lOiAnUmVnaXN0cnkgT3BlcmF0b3InLCBwZXJtaXNzaW9uczogUkVHSVNUUllfT1BFUkFUT1JfUEVSTUlTU0lPTlMgfSxcbiAgcGlwZWxpbmVfYXV0b21hdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgQXV0b21hdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TIH0sXG4gIHBpcGVsaW5lX3JlZ2lzdHJhdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgUmVnaXN0cmF0aW9uJywgcGVybWlzc2lvbnM6IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUyB9LFxufSBhcyBjb25zdDtcblxuLyoqIEV2ZXJ5IHNlZWQtYnVuZGxlIGlkLiBUaGUgcGxhdGZvcm0ncyBgUm9sZS5zZWVkQnVuZGxlYCBlbnVtIGlzIHRoaXMgbGlzdC4gKi9cbmV4cG9ydCBjb25zdCBTRUVEX0JVTkRMRV9JRFMgPSBPYmplY3Qua2V5cyhTRUVEX0JVTkRMRVMpIGFzIEFycmF5PGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM+O1xuZXhwb3J0IHR5cGUgU2VlZEJ1bmRsZUlkID0ga2V5b2YgdHlwZW9mIFNFRURfQlVORExFUztcblxuLyoqXG4gKiBUaGUgU1lTVEVNIE9SRydzIGpvYiBSb2xlcywgaW4gc3RhZmZpbmcgb3JkZXIg4oCUIHRoZSBzdWJzZXQgb2ZcbiAqIHtAbGluayBTRUVEX0JVTkRMRVN9IHNlZWRlZCB0aGVyZSwgd2hpY2ggaXMgZXZlcnkgYnVuZGxlIGV4Y2VwdCBgdGVhbV9sZWFkYFxuICogKGEgdGVuYW50IGpvYiwgYW5kIGEgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYSBzZWVkZWQgUm9sZSBzaW5jZSBpdCBzdG9wcGVkXG4gKiBiZWluZyBzdHJ1Y3R1cmFsKS5cbiAqXG4gKiBgZWNvc3lzdGVtX21hbmFnZXJgIElTIG9uZSBvZiB0aGVtOyBpdCBpcyBsaXN0ZWQgaGVyZSBldmVuIHRob3VnaCBpdHMgcm9zdGVyXG4gKiBsaXZlcyBvbiB0aGUgRWNvc3lzdGVtIGNvbnNvbGUgcmF0aGVyIHRoYW4gdGhlIHN0YWZmaW5nIHBhbmVsLCBiZWNhdXNlIHdoYXRcbiAqIHRoaXMgbGlzdCBhbnN3ZXJzIGlzIFwid2hpY2ggUm9sZXMgZG9lcyB0aGUgc3lzdGVtIG9yZyBzZWVkXCIsIG5vdCBcIndoaWNoIHBhbmVsXG4gKiByZW5kZXJzIHRoZW1cIi5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfSk9CX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAnZWNvc3lzdGVtX21hbmFnZXInLFxuICAncHVibGlzaGVyX3ZlcmlmaWVyJyxcbiAgJ3BsYXRmb3JtX29ic2VydmVyJyxcbiAgJ3BsYXRmb3JtX29wZXJhdG9yJyxcbiAgJ2FjY291bnRfbWFuYWdlcicsXG4gICdjb25zb2xlX2FkbWluJyxcbiAgJ3N1cHBvcnRfYWdlbnQnLFxuICAnc3VwcG9ydF9sZWFkJyxcbiAgJ3JlZ2lzdHJ5X29wZXJhdG9yJyxcbl07XG5cbi8qKlxuICogVGhlIE1BQ0hJTkUgUm9sZXMgZXZlcnkgb3JnIHNlZWRzIOKAlCB0aGUgc3Vic2V0IG9mIHtAbGluayBTRUVEX0JVTkRMRVN9IGhlbGQgYnlcbiAqIHRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLlxuICpcbiAqIFNlZWRlZCByYXRoZXIgdGhhbiBvZmZlcmVkIGFzIGEge0BsaW5rIFJPTEVfVEVNUExBVEVTfSBlbnRyeSwgdW5saWtlIHRoZVxuICogdGVuYW50IGpvYiBwcmVzZXRzLCBiZWNhdXNlIHRoZXkgYXJlIHN0cnVjdHVyYWw6IHRoZSBDTEkgZ3JhbnRzIG9uZSB0byB0aGVcbiAqIGFjY291bnQgaXQgY3JlYXRlcyBhbmQgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgbW92ZXMgZXhpc3RpbmcgYWNjb3VudHMgb250byBpdCxcbiAqIGFuZCBib3RoIGhhdmUgdG8gZmluZCBpdCBpbiBFVkVSWSBvcmcgYnkgYSBzdGFibGUgaWRlbnRpdHkuIEEgdGVtcGxhdGUgbGVhdmVzXG4gKiBub3RoaW5nIHRvIGZpbmQgdW50aWwgc29tZWJvZHkgaW5zdGFudGlhdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FVVE9NQVRJT05fQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBbXG4gICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG5dO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLCBrZXllZCBieVxuICogYWNjb3VudCBuYW1lLCBhbmQgdGhlIGJ1aWx0LWluIFJvbGUgZWFjaCBob2xkcyDigJQgYG51bGxgIGZvciBhbiBhY2NvdW50IHdob3NlXG4gKiBrZXkgY2FycmllcyBhIGNhcGFiaWxpdHkgU0NPUEUgKGEgYFRva2VuU2NvcGVgKSBhbmQgc28gbmVlZHMgbm8gUm9sZSBhdCBhbGwuXG4gKlxuICogT25lIHRhYmxlIGZvciB0aGUgQ0xJICh3aGljaCBSb2xlIHRvIGdyYW50IGEgTkVXIGFjY291bnQpIGFuZCB0aGUgcGxhdGZvcm0nc1xuICogc3RhcnR1cCBiYWNrZmlsbCAod2hpY2ggUm9sZSB0byBtb3ZlIGFuIEVYSVNUSU5HIGFjY291bnQgb250bywgb2ZmIHRoZSBvcmdcbiAqIGFkbWluIFJvbGUgdGhlc2UgYWNjb3VudHMgd2VyZSBvbmNlIGdpdmVuKS4gQSByZW5hbWUgaGVyZSBtb3ZlcyBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQVVUT01BVElPTl9BQ0NPVU5UX0JVTkRMRVMgPSB7XG4gICdwbGF0Zm9ybS1hdXRvbWF0aW9uJzogJ3BpcGVsaW5lX2F1dG9tYXRpb24nLFxuICAncGlwZWxpbmUtcmVnaXN0ZXInOiAncGlwZWxpbmVfcmVnaXN0cmF0aW9uJyxcbiAgJ3JlcG9ydGluZy1pbmdlc3QnOiBudWxsLFxuICAncmVnaXN0cnktcHVzaCc6IG51bGwsXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBTZWVkQnVuZGxlSWQgfCBudWxsPjtcbiJdfQ==
|
|
1130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMkJ0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXNCO0lBQ2pELDRFQUE0RTtJQUM1RSxtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLDRCQUE0QjtJQUM1QiwwRUFBMEU7SUFDMUUsNEJBQTRCO0lBQzVCLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixrRUFBa0U7SUFDbEUsOEJBQThCO0lBQzlCLDRCQUE0QjtJQUM1QixtQkFBbUI7SUFDbkIsNkVBQTZFO0lBQzdFLCtFQUErRTtJQUMvRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLGNBQWM7Q0FDZixDQUFDO0FBYUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxlQUFlLEdBQUc7SUFDdEIsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHFDQUFxQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDeEgsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG9DQUFvQyxFQUFF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QkFBcUI7SUFDNUMsbUJBQW1CLEVBQUUsdUJBQXVCO0lBQzVDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsZUFBZSxFQUFFLElBQUk7Q0FDaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IE9yZ1JvbGUgfSBmcm9tICcuL3dpcmUtdm9jYWJ1bGFyeS5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uIGlkZW50aWZpZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENhbm9uaWNhbCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbiBpZGVudGlmaWVycywgaW4gYHJlc291cmNlOmFjdGlvbmAgZm9ybS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIE9SRy1TQ09QRUQgY2FwYWJpbGl0aWVzIGEgUm9sZSBjYW4gZ3JhbnQgKFJCQUMpLiBDb2Fyc2UgYnlcbiAqIGRlc2lnbiDigJQgYDp3cml0ZWAgY292ZXJzIGNyZWF0ZS91cGRhdGUvZGVsZXRlIGZvciBhIHJlc291cmNlIOKAlCBzbyB0aGUgY2F0YWxvZ1xuICogYW5kIHBlcm1pc3Npb24tcGlja2VyIFVJIHN0YXkgc21hbGw7IHNwbGl0IGEgYDp3cml0ZWAgaW50byBgOmNyZWF0ZWAvYDpkZWxldGVgXG4gKiBsYXRlciBpZiBhIHJlc291cmNlIG5lZWRzIGl0LlxuICpcbiAqIE5PVCBtb2RlbGVkIGhlcmUgKGludGVudGlvbmFsbHkpOiBwbGF0Zm9ybS1vcGVyYXRvciBhY3Rpb25zIChvcmcgZGVsZXRlLCB0aWVyL1xuICogcXVvdGEgb3ZlcnJpZGUsIHVzZXIgYWRtaW4sIGltcGVyc29uYXRpb24sIHBsYXRmb3JtIHNldHRpbmdzKSBzdGF5IGJlaGluZCB0aGVcbiAqIGdsb2JhbCBgaXNTdXBlckFkbWluYCBmbGFnLCBub3QgYSBwZXItb3JnIHBlcm1pc3Npb247IGFuZCBgcmVxdWlyZVN0ZXBVcGBcbiAqIChNRkEpIC8gYHJlcXVpcmVGZWF0dXJlYCAocGxhbiBlbnRpdGxlbWVudHMpIHJlbWFpbiBvcnRob2dvbmFsIGdhdGVzLlxuICpcbiAqIFRoZSBpZHMgYXJlIHRoZSBrZXlzIG9mIHtAbGluayBQRVJNSVNTSU9OX0RFRlN9IChiZWxvdywgYmVzaWRlIHRoZWlyIHBpY2tlclxuICogbGFiZWwsIGRlc2NyaXB0aW9uIGFuZCBjYXRlZ29yeSksIHNvIHRoZSB1bmlvbiwge0BsaW5rIEFMTF9QRVJNSVNTSU9OU30gYW5kXG4gKiB7QGxpbmsgUEVSTUlTU0lPTl9DQVRBTE9HfSBjYW5ub3QgZHJpZnQ6IGFkZGluZyBhIHBlcm1pc3Npb24gaXMgb25lIGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0ga2V5b2YgdHlwZW9mIFBFUk1JU1NJT05fREVGUztcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBhY3Rpb25zIGEgcGVybWlzc2lvbiBpZCBtYXkgZW5kIGluIOKAlCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlXG4gKiBgcmVzb3VyY2U6YWN0aW9uYCBzdHJhdGVneSB0aGUgZG9jcyBkZXNjcmliZS5cbiAqXG4gKiBJdCBpcyBjbG9zZWQgZm9yIG9uZSBjb25jcmV0ZSByZWFzb246IGBpc011dGF0aW9uUGVybWlzc2lvbmAgKGZyb250ZW5kXG4gKiBgbGliL2F1dGgtaGVscGVycy50c2ApIGNsYXNzaWZpZXMgcmVhZCB2cyB3cml0ZSBCWSBTVUZGSVgsIGFuZCB0aGF0IGlzIHdoYXRcbiAqIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFmZm9yZGFuY2UgZHVyaW5nIGEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gQVxuICogbm91bi1zaGFwZWQgYWN0aW9uICh0aGUgZm9ybWVyIGBvcmc6c2V0dGluZ3NgIGFuZCBgY29uc29sZXM6ZGF0YXN0b3JlYCkgY2Fubm90IGJlIGNsYXNzaWZpZWRcbiAqIGJ5IG5hbWUsIHNvIGVhY2ggb25lIGhhZCB0byBiZSBoYW5kLWxpc3RlZCDigJQgYW5kIGEgcGVybWlzc2lvbiBhZGRlZCB3aXRob3V0XG4gKiByZW1lbWJlcmluZyB0aGF0IGxpc3QgcmVuZGVycyBhbiBlbmFibGVkIGNvbnRyb2wgdGhhdCBkZWFkLWVuZHMgb24gYSA0MDMuXG4gKlxuICogUmVhZHMgYXJlIGA6cmVhZGAgYW5kIGA6cm9sbHVwYCAoYSByZWFkLVZJU0lCSUxJVFkgc2NvcGUpLiBFdmVyeXRoaW5nIGVsc2UgaXNcbiAqIGEgd3JpdGUuIFRoZSBmaXZlIGRvbWFpbiB2ZXJicyBhcmUga2VwdCBiZWNhdXNlIGVhY2ggbmFtZXMgYW4gYWN0aW9uIHdpdGggbm9cbiAqIHN5bm9ueW0gaW4gdGhpcyB2b2NhYnVsYXJ5IOKAlCBgOmV4cG9ydGAgaXMgZWdyZXNzIHJhdGhlciB0aGFuIG11dGF0aW9uLFxuICogYDppbnN0YWxsYCBpcyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiBhdXRob3JpbmcsIGA6bW9kZXJhdGVgIGFuZCBgOnZlcmlmeWAgYXJlXG4gKiBlY29zeXN0ZW0gZGVjaXNpb25zLCBhbmQgYDpvcGVyYXRlYCBtb3ZlcyBhbm90aGVyIHRlbmFudCdzIG1vbmV5LlxuICpcbiAqIGBQRVJNSVNTSU9OX0lEX1NIQVBFYCBhbmQgdGhpcyBsaXN0IGFyZSBhc3NlcnRlZCBvdmVyIHRoZSB3aG9sZSBjYXRhbG9nIGluXG4gKiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgLCBzbyBhZGRpbmcgYW4gb2ZmLXN0cmF0ZWd5IGlkIGZhaWxzXG4gKiB0aGVyZSByYXRoZXIgdGhhbiBhdCBhIDQwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fQUNUSU9OUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdyZWFkJywgJ3JvbGx1cCcsXG4gICd3cml0ZScsICdtYW5hZ2UnLCAncHVibGlzaCcsICdvcGVuJyxcbiAgJ2V4cG9ydCcsICdpbnN0YWxsJywgJ21vZGVyYXRlJywgJ3ZlcmlmeScsICdvcGVyYXRlJywgJ3B1cmdlJywgJ2FwcHJvdmUnLFxuXTtcblxuLyoqIGByZXNvdXJjZTphY3Rpb25gLCB3aGVyZSByZXNvdXJjZSBpcyBgc25ha2VfY2FzZWAgYW5kIGFjdGlvbiBpcyBpbiB7QGxpbmsgUEVSTUlTU0lPTl9BQ1RJT05TfS4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0lEX1NIQVBFID0gL15bYS16XVthLXowLTlfXSo6W2Etel0rJC87XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHtAbGluayBQZXJtaXNzaW9ufSBhbmQgZGVjaWRlIGFjY2Vzcy5cbiAqXG4gKiBcIklzIHBlcm1pc3Npb24gWCBlbmZvcmNlZCBhbnl3aGVyZT9cIiBoYXMgdG8gYmUgYW5zd2VyYWJsZSBzdGF0aWNhbGx5LCB3aGljaFxuICogYSBncmVwIGNhbid0IGRvOiBmb3VyIGRpZmZlcmVudCBjYWxsIHNoYXBlcyBjb25zdW1lIGEgcGVybWlzc2lvbiBpZFxuICogKGByZXF1aXJlUGVybWlzc2lvbigneCcpYCBhdCBhIHJvdXRlLCBgdXNlckhhc1Blcm1pc3Npb24ocmVxLCAneCcpYCBpbnNpZGUgYVxuICogY29udHJvbGxlciwgYW5kIGByZXNvbHZlVmlzaWJpbGl0eShyZXEsIHYsICd4JylgIC9cbiAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKOKApiwgJ3gnKWAgaW4gdGhlIHZpc2liaWxpdHkgaGVscGVycyksIHNvIGEgbmFpdmVcbiAqIGdyZXAgZm9yIGEgcm91dGUtbGV2ZWwgZ2F0ZSByZXBvcnRzIGB0ZW1wbGF0ZXM6cHVibGlzaGAgYXMgVU5FTkZPUkNFRCB3aGVuIGl0XG4gKiBpcyBpbiBmYWN0IGVuZm9yY2VkIG9uIGV2ZXJ5IHRlbXBsYXRlIHB1Ymxpc2guXG4gKlxuICogVGhleSBhbGwgYm90dG9tIG91dCBpbiBgdXNlckhhc1Blcm1pc3Npb25gLCBzbyB0aGUgUlVOVElNRSBwcmltaXRpdmUgd2FzXG4gKiBhbHJlYWR5IG9uZS4gVGhpcyBjb25zdGFudCBtYWtlcyB0aGUgU1RBVElDIHN1cmZhY2Ugb25lIGFzIHdlbGw6IGl0IG5hbWVzXG4gKiBldmVyeSBlbnRyeSBwb2ludCwgc28gYHBlcm1pc3Npb24tY292ZXJhZ2UudGVzdC50c2AgY2FuIGVudW1lcmF0ZSB0aGUgY2F0YWxvZ1xuICogYW5kIHJlcG9ydCBlYWNoIHBlcm1pc3Npb24ncyBlbmZvcmNlbWVudCBzaXRlcyB3aXRob3V0IGd1ZXNzaW5nLiBBIG5ldyBnYXRlXG4gKiB0aGF0IHRha2VzIGEgYFBlcm1pc3Npb25gIG11c3QgYmUgbGlzdGVkIGhlcmUsIG9yIHRoZSBjb3ZlcmFnZSByZXBvcnQgc3RhcnRzXG4gKiBseWluZyBhYm91dCB0aGUgcGVybWlzc2lvbnMgb25seSB0aGF0IGdhdGUgZW5mb3JjZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0dBVEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLy8gTWlkZGxld2FyZSBnYXRlcyAocm91dGUgbGV2ZWwpIOKAlCBhbGwgYW55LW9mIGV4Y2VwdCByZXF1aXJlQWxsUGVybWlzc2lvbnMuXG4gICdyZXF1aXJlUGVybWlzc2lvbicsXG4gICdyZXF1aXJlQWxsUGVybWlzc2lvbnMnLFxuICAncmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UnLFxuICAvLyBUaGUgcGx1Z2luLWVjb3N5c3RlbSBnb3Zlcm5hbmNlIGNoYWluIChzeXN0ZW0gb3JnICsgcGVybWlzc2lvbiArIGFhbDIpLlxuICAncmVxdWlyZVN5c3RlbU9yZ1Blcm1pc3Npb24nLFxuICAvLyBUaGUgc2luZ2xlIHJ1bnRpbWUgcHJpbWl0aXZlIGV2ZXJ5IGdhdGUgYWJvdmUgZGVsZWdhdGVzIHRvOyBhbHNvIGNhbGxlZFxuICAvLyBkaXJlY3RseSB3aGVyZSBhIGNvbnRyb2xsZXIgYnJhbmNoZXMgb24gYSBjYXBhYmlsaXR5IHJhdGhlciB0aGFuIHJlamVjdGluZy5cbiAgJ3VzZXJIYXNQZXJtaXNzaW9uJyxcbiAgJ2hhc1Blcm1pc3Npb24nLFxuICAvLyBWaXNpYmlsaXR5IGhlbHBlcnMg4oCUIHRoZXkgdGFrZSB0aGUgZW50aXR5J3MgUFVCTElTSCBwZXJtaXNzaW9uLlxuICAncmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdyZXNvbHZlVmlzaWJpbGl0eScsXG4gIC8vIHF1b3RhJ3Mgb3duIHdyYXBwZXIuIEl0IGRlbGVnYXRlcyB0byBgcmVxdWlyZVBlcm1pc3Npb25gLCBidXQgaXQgdGFrZXMgdGhlXG4gIC8vIGlkIGFzIGFuIE9QVElPTiAoYGF1dGhvcml6ZU9yZyh7IHBlcm1pc3Npb246ICdxdW90YXM6bWFuYWdlJyB9KWApIGJlY2F1c2UgaXRcbiAgLy8gYWxzbyBjYW5vbmljYWxpemVzIHRoZSBgOm9yZ0lkYCBwYXJhbSwgd2hpY2ggdGhlIHJvdXRlIGNhbm5vdCBkcm9wLiBXaXRob3V0XG4gIC8vIHRoaXMgZW50cnkgdGhlIGNvdmVyYWdlIHNjYW4gcmVwb3J0ZWQgYHF1b3RhczptYW5hZ2VgIGFzIGVuZm9yY2VkIG5vd2hlcmUuXG4gICdhdXRob3JpemVPcmcnLFxuXTtcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBvbmUgcGVybWlzc2lvbjogdGhlIGxhYmVsICsgZGVzY3JpcHRpb24gdGhlXG4gKiBwZXJtaXNzaW9uLXBpY2tlciBVSSBzaG93cywgYW5kIHRoZSBjYXRlZ29yeSBpdCBncm91cHMgdW5kZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbk1ldGEge1xuICBpZDogUGVybWlzc2lvbjtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVyeSBwZXJtaXNzaW9uLCBrZXllZCBieSBpZCwgd2l0aCB0aGUgZGlzcGxheSBtZXRhZGF0YSB0aGUgcGVybWlzc2lvbi1waWNrZXJcbiAqIFVJIHNob3dzIChsYWJlbCwgZGVzY3JpcHRpb24sIHRoZSBjYXRlZ29yeSBpdCBncm91cHMgdW5kZXIpLCBpbiBwaWNrZXIgb3JkZXIuXG4gKiBUaGUgY29tbWVudCBhYm92ZSBhbiBlbnRyeSBpcyB0aGF0IHBlcm1pc3Npb24ncyBkZXNpZ24gbm90ZS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLlxuICovXG5jb25zdCBQRVJNSVNTSU9OX0RFRlMgPSB7XG4gICdwaXBlbGluZXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnVmlldyBwaXBlbGluZXMgYW5kIHRoZWlyIGV4ZWN1dGlvbnMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgJ3BpcGVsaW5lczp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmVzJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gICdwaXBlbGluZXM6cHVibGlzaCc6IHsgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIC8vIFRoZSBwaXBlbGluZSBSRUdJU1RSWSAoYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWApOiB3aGljaCBkZXBsb3llZFxuICAvLyBzdGFjayBiYWNrcyBhIHBpcGVsaW5lLCBhbmQgdGhlIHN0ZXAgbWFuaWZlc3Qgb2YgcGx1Z2luIGRpZ2VzdHMgaXQgcnVucy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6d3JpdGVgIHNvIHRoZSBDb2RlQnVpbGQgc3ludGggY2FuIGtlZXAgdGhhdCByZWNvcmRcbiAgLy8gY3VycmVudCB3aXRoIGEgY3JlZGVudGlhbCB0aGF0IGNhbiBkbyBub3RoaW5nIGVsc2Ug4oCUIGEga2V5IGhvbGRpbmdcbiAgLy8gYHBpcGVsaW5lczp3cml0ZWAgY291bGQgcmV3cml0ZSBldmVyeSBwaXBlbGluZSB0aGUgb3JnIG93bnMuIFBlb3BsZSBnZXQgaXRcbiAgLy8gYmVzaWRlIGBwaXBlbGluZXM6d3JpdGVgICh0aGUgTWVtYmVyIGJ1bmRsZSk7IHRoZSBgcGlwZWxpbmUtcmVnaXN0ZXJgXG4gIC8vIHNlcnZpY2UgYWNjb3VudCBob2xkcyBpdCBhbG9uZS5cbiAgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJzogeyBsYWJlbDogJ1JlZ2lzdGVyIGRlcGxveW1lbnRzJywgZGVzY3JpcHRpb246ICdSZWNvcmQgYW5kIHJlbW92ZSB0aGUgZGVwbG95ZWQgc3RhY2sgYW5kIHN0ZXAgbWFuaWZlc3QgYmVoaW5kIGEgcGlwZWxpbmUgKHRoZSBwaXBlbGluZSByZWdpc3RyeSknLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgLy8gVGhlIG9yZydzIG1hbmFnZWQtdG9vbGNoYWluIERFRkFVTFQgKGRvY3MvcGxhbnMvYm9vdHN0cmFwLWltYWdlLXZlcnNpb25pbmcubWRcbiAgLy8gRDEzKTogd2hpY2ggdG9vbGNoYWluIHJlbGVhc2UgZXZlcnkgdW5waW5uZWQgcGlwZWxpbmUgaW4gdGhlIG9yZyAoYW5kIGl0c1xuICAvLyB0ZWFtcyB0aGF0IHNldCBub25lKSBzeW50aGVzaXplcyB3aXRoIG9uIGl0cyBuZXh0IHJ1bi4gT3JnLWFzc2lnbmFibGUsIHNvXG4gIC8vIEFkbWluIGFuZCBPd25lciBob2xkIGl0OyBOT1QgaW4gTWVtYmVyIG9yIGFueSBwaXBlbGluZS1lZGl0b3IgYnVuZGxlLiBTcGxpdFxuICAvLyBieSBibGFzdCByYWRpdXM6IGBwaXBlbGluZXM6d3JpdGVgIG1vdmVzIE9ORSBwaXBlbGluZSAoaXRzIG93blxuICAvLyBgdG9vbGNoYWluLnJlbGVhc2VgIHBpbiksIHRoaXMgbW92ZXMgQUxMIG9mIHRoZW0sIGFuZFxuICAvLyBgcGx1Z2luX2luc3RhbGxzOm1hbmFnZWAgZ292ZXJucyBmdXR1cmUgaW5zdGFsbHMsIG5vdCBydW5uaW5nIHBpcGVsaW5lcy5cbiAgLy8gSXQgbmV2ZXIgY29uZmVycyBhbnl0aGluZyBvbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCwgY2FuYXJ5IG9yIGNhdGFsb2cuXG4gIC8vIEV2ZXJ5IHdyaXRlIGFsc28gbmVlZHMgYHJlcXVpcmVTdGVwVXBgLlxuICAndG9vbGNoYWluOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgdGhlIG9yZyB0b29sY2hhaW4gZGVmYXVsdCcsIGRlc2NyaXB0aW9uOiBcIkNob29zZSB3aGljaCBtYW5hZ2VkIHRvb2xjaGFpbiByZWxlYXNlIHlvdXIgb3JnJ3MgdW5waW5uZWQgcGlwZWxpbmVzIChhbmQgdGVhbXMgd2l0aG91dCB0aGVpciBvd24pIGJ1aWxkIHdpdGgsIG9yIGZvbGxvdyB0aGUgcGxhdGZvcm0gZGVmYXVsdFwiLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gICd0ZW1wbGF0ZXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgZ29sZGVuLXBhdGggdGVtcGxhdGUgY2F0YWxvZycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICAndGVtcGxhdGVzOndyaXRlJzogeyBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgJ3RlbXBsYXRlczpwdWJsaXNoJzogeyBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gICdwbHVnaW5zOnJlYWQnOiB7IGxhYmVsOiAnVmlldyBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdWaWV3IHBsdWdpbnMgYW5kIGJ1aWxkcycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgJ3BsdWdpbnM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gICdwbHVnaW5zOnB1Ymxpc2gnOiB7IGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gICdwbHVnaW5zOmluc3RhbGwnOiB7IGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJzogeyBsYWJlbDogJ01hbmFnZSBwbHVnaW4gaW5zdGFsbHMnLCBkZXNjcmlwdGlvbjogXCJTZXQgeW91ciBvcmcncyBwbHVnaW4gY29uc3VtcHRpb24gcG9saWN5IGFuZCBhcHByb3ZlIG9yIGRlbnkgaW5zdGFsbCByZXF1ZXN0cyB3aXRoaW4gdGhlIG9yZ1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwdWJsaXNoZXJzOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgcHVibGlzaGVyIHByb2ZpbGUnLCBkZXNjcmlwdGlvbjogXCJNYW5hZ2UgeW91ciBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSBhbmQgc3VibWl0IHB1Ymxpc2gsIHZlcmlmaWNhdGlvbiwgdHJhbnNmZXIsIGFuZCBhZHZpc29yeSByZXF1ZXN0c1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwbHVnaW5zOm1vZGVyYXRlJzogeyBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwdWJsaXNoZXJzOnZlcmlmeSc6IHsgbGFiZWw6ICdWZXJpZnkgcHVibGlzaGVycycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBWZXJpZmllZCBhcHBsaWNhdGlvbnMsIHB1Ymxpc2hlciB0aWVyIGFuZCBwcm9maWxlIGNoYW5nZXMsIGFuZCBvd25lcnNoaXAgdHJhbnNmZXJzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICAvLyBQbGF0Zm9ybSBvcGVyYXRpb25zIChzeXN0ZW0tb3JnIG9ubHkpLiBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzXG4gIC8vIHRoYXQgdXNlZCB0byByZXF1aXJlIHRoZSBzdXBlcmFkbWluIEZMQUcsIHNvIGEgZGVwbG95bWVudCBjYW4gc3RhZmYgdGhlbVxuICAvLyB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIGhhbmRpbmcgb3V0IGltcGxpY2l0LWFsbC4gU3BsaXQgYmVjYXVzZSB0aGUgdHdvIGNhcnJ5XG4gIC8vIGRpZmZlcmVudCByaXNrOiByZWFkaW5nIHdoYXQgYSBkZXBsb3kgY29uZmlndXJlZCBpcyBub3QgdGhlIHNhbWUgYXMgbW92aW5nXG4gIC8vIGFub3RoZXIgb3JnYW5pc2F0aW9uJ3MgbW9uZXkuXG4gICdwbGF0Zm9ybTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgcGxhdGZvcm0gb3BlcmF0aW9ucycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MgYW5kIHRoZSBjcm9zcy10ZW5hbnQgb3JnYW5pemF0aW9uIGxpc3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgT1JHIExJU1QsIHNwbGl0IG91dCBvZiBgcGxhdGZvcm06cmVhZGAgYmVjYXVzZSB0aGF0IG9uZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBkb2luZyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBibGFzdCByYWRpaTogcmVhZGluZyB3aGF0IGFcbiAgLy8gREVQTE9ZIHdhcyBjb25maWd1cmVkIHRvIGRvIChSTFMgbW9kZSwgS01TIHBvc3R1cmUsIHRoZSByZW5kZXJlZCBhbGVydFxuICAvLyBydWxlcykgYW5kIHJlYWRpbmcgdGhlIHJvc3RlciBvZiBldmVyeSBDVVNUT01FUi4gVGhyZWUgb2YgdGhlIGZvdXIgam9iXG4gIC8vIGJ1bmRsZXMgY2FycmllZCBpdCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gd2FudGVkIHRoZSBkZXBsb3kgaW50ZXJuYWxzIOKAlFxuICAvLyBDb25zb2xlIEFkbWluaXN0cmF0b3IgYW5kIFN1cHBvcnQgQWdlbnQgZ290IHRoZW0gcHVyZWx5IGJlY2F1c2UgdGhleSBuZWVkZWRcbiAgLy8gdG8gZmluZCBhbiBvcmcgYnkgbmFtZS5cbiAgLy9cbiAgLy8gU2FtZSBtaXN0YWtlLCBhbmQgc2FtZSBmaXgsIGFzIGBjb25zb2xlczpkYXRhc3RvcmVgIGJlZm9yZSBpdCB3YXMgc3BsaXQgYnlcbiAgLy8gd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzLlxuICAnb3JnczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgYWxsIG9yZ2FuaXphdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0xpc3QgYW5kIG9wZW4gZXZlcnkgb3JnYW5pemF0aW9uIG9uIHRoZSBkZXBsb3ltZW50IFxcdTIwMTQgdGhlIHJvc3RlciB0aGUgb3BlcmF0b3Igc3VyZmFjZXMgd29yayBmcm9tIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBUaGUgVG9vbGNoYWluIENPTlNPTEUgKHBsYW4gRDk7IG5hbWVkIGFmdGVyIGBiaWxsaW5nOm9wZXJhdGVgKTogcHVibGlzaFxuICAvLyBsaWZlY3ljbGUsIGNhbmFyeSBtZW1iZXJzaGlwIGFuZCBUSEUgcGxhdGZvcm0gZGVmYXVsdCDigJQgZXZlcnkgb3JnIHdpdGhvdXRcbiAgLy8gaXRzIG93biBkZWZhdWx0IG1vdmVzIHdpdGggaXQuIFN5c3RlbS1vcmctb25seSAob3RoZXJ3aXNlIEFETUlOX1BFUk1JU1NJT05TLFxuICAvLyBkZXJpdmVkIGZyb20gT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMsIHdvdWxkIGhhbmQgaXQgdG8gZXZlcnkgdGVuYW50XG4gIC8vIEFkbWluKTsgY2FycmllZCBieSBQbGF0Zm9ybSBPcGVyYXRvci4gRXZlcnkgd3JpdGUgYWxzbyBuZWVkcyBgcmVxdWlyZVN0ZXBVcGAuXG4gICd0b29sY2hhaW46b3BlcmF0ZSc6IHsgbGFiZWw6ICdPcGVyYXRlIHRoZSBwbGF0Zm9ybSB0b29sY2hhaW4nLCBkZXNjcmlwdGlvbjogJ1J1biB0aGUgVG9vbGNoYWluIGNvbnNvbGU6IGNhbmFyeSBtZW1iZXJzaGlwLCByZWxlYXNlIG5vdGVzLCBkZXByZWNhdGUgLyB5YW5rIC8gZGVsZXRlIHJlbGVhc2VzLCBhbmQgc2V0IHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGV2ZXJ5IG9yZyB3aXRob3V0IGl0cyBvd24gZm9sbG93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ2JpbGxpbmc6b3BlcmF0ZSc6IHsgbGFiZWw6ICdPcGVyYXRlIGRpc2NvdW50cyBhbmQgcHJvbW90aW9ucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBhcHBseSBhbmQgcmV2b2tlIGRpc2NvdW50IHRva2VucyBhbmQgcHJvbW90aW9uIGNhbXBhaWducyBhY3Jvc3MgdGVuYW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgLy8gVGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBzcGxpdCBieSBCTEFTVCBSQURJVVMgcmF0aGVyIHRoYW4gYnkgcHJvZHVjdC4gVGhyZWVcbiAgLy8gcGVybWlzc2lvbnMgZm9yIGZpdmUgY29uc29sZXMsIGJlY2F1c2Ugd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzIGRpZmZlcnNcbiAgLy8gYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlIGF0IGVhY2ggc3RlcDpcbiAgLy9cbiAgLy8gIC0gYG9ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuYCDigJQgR3JhZmFuYSBhbmQgS2lhbGkuIFJlYWQtb25seSB2aWV3czsgdGhlIHdvcnN0XG4gIC8vICAgIG91dGNvbWUgb2YgYSBtaXN0YWtlbiBncmFudCBpcyBzZWVpbmcgdGVsZW1ldHJ5LlxuICAvLyAgLSBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCAgICAg4oCUIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MuIEEgZGF0YWJhc2Ugc2hlbGxcbiAgLy8gICAgb3ZlciBldmVyeSB0ZW5hbnQncyByb3dzOiBpdCBjYW4gcmVhZCBhbmQgcmV3cml0ZSB0ZW5hbnQgZGF0YSwgYnV0IHRoZVxuICAvLyAgICBhdWRpdCBjaGFpbiBsaXZlcyBlbHNld2hlcmUsIHNvIHRoZSBkYW1hZ2UgaXMgcmVjb3JkZWQuXG4gIC8vICAtIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gICAg4oCUIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlLiBJdCBjYW4gTElTVCBhbmRcbiAgLy8gICAgREVMRVRFIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5LCBMb2tpLCBUaGFub3MsIHBsdWdpbi1idWlsZCBhbmRcbiAgLy8gICAgYXVkaXQtY2hhaW4gYnVja2V0cy4gU3BsaXQgZnJvbSB0aGUgcGFpciBhYm92ZSBiZWNhdXNlIHRoZSB0d28gYXJlIHRoZVxuICAvLyAgICB0d28gSEFMVkVTIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2UgZGVzaWduOiB0aGUgY2hhaW4ncyBITUFDIGtleVxuICAvLyAgICBsaXZlcyBvdXRzaWRlIHRoZSBEQiwgc28gYSBNb25nbyBzaGVsbCBjYW4gdGFtcGVyIGJ1dCBjYW5ub3QgZm9yZ2UgYVxuICAvLyAgICBjb25zaXN0ZW50IGNoYWluIOKAlCBleGNlcHQgYnkgdHJ1bmNhdGluZyB0aGUgdGFpbCwgd2hpY2ggYSBjaGFpbiBjYW5ub3RcbiAgLy8gICAgc2VlIGZyb20gdGhlIGluc2lkZSwgYW5kIHRoZSBkZWZlbmNlIGFnYWluc3QgVEhBVCBpcyB0aGUgc2lnbmVkXG4gIC8vICAgIGNoYWluLWhlYWQgZXhwb3J0IHRvIG9iamVjdCBzdG9yYWdlLiBPbmUgc2hlbGwgY2FuIHRydW5jYXRlOyB0aGUgb3RoZXJcbiAgLy8gICAgY2FuIGRlbGV0ZSB0aGUgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24uXG4gIC8vXG4gIC8vIEFsbCB0aHJlZSBhcmUgc3lzdGVtLW9yZy1vbmx5LCBzbyBub25lIGNhbiBiZSBoZWxkIGluc2lkZSBhIHRlbmFudCwgYW5kIG9ubHlcbiAgLy8gdGhlIGZpcnN0IGlzIGluIHRoZSBQbGF0Zm9ybSBPcGVyYXRvciBidW5kbGU6IHN0YWZmaW5nIGFuIG9wZXJhdG9yIG11c3QgbmV2ZXJcbiAgLy8gaGFuZCBvdmVyIGEgZGF0YSBzaGVsbCBhcyBhIHNpZGUgZWZmZWN0LiBHcmFudGluZyBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBpc1xuICAvLyBhIHNlcGFyYXRlLCBleHBsaWNpdCBhY3QgYnkgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIFJvbGUgZm9yIGV4YWN0bHkgdGhhdFxuICAvLyBwdXJwb3NlLlxuICAvL1xuICAvLyBXSEFUIFRIRSBTUExJVCBET0VTIE5PVCBETywgc28gbm9ib2R5IGJ1aWxkcyBvbiBpdDogaXQgaXMgbm90IGEgY29udGFpbm1lbnRcbiAgLy8gYm91bmRhcnkuIFJvbGVzIGxpdmUgaW4gTW9uZ28gKGBjb2xsZWN0aW9uOiAncm9sZXMnYCksIHNvIGFcbiAgLy8gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgaG9sZGVyIGNhbiB3cml0ZSB0aGF0IGNvbGxlY3Rpb24gYW5kIGdyYW50IHRoZW1zZWx2ZXNcbiAgLy8gYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAg4oCUIGRhdGFzdG9yZSBjb250YWlucyBvYmplY3RzdG9yZSBieSBlc2NhbGF0aW9uLiBUaGVcbiAgLy8gc3BsaXQgZXhwcmVzc2VzIGludGVudCwga2VlcHMgdGhlIGRlZmF1bHQgZ3JhbnQgc21hbGwgYW5kIGdpdmVzIGVhY2ggY2xhc3NcbiAgLy8gaXRzIG93biByZWZ1c2FsIHNpZ25hbC4gV2hhdCBhY3R1YWxseSBwcm90ZWN0cyB0aGUgYXVkaXQgaGVhZHMgZnJvbSB3aG9ldmVyXG4gIC8vIG9wZW5zIHRoYXQgY29uc29sZSBpcyBTMyBPYmplY3QgTG9jayB3aXRoIGEgcmV0YWluLXVudGlsLWRhdGVcbiAgLy8gKGBwbGF0Zm9ybS9zcmMvc2VydmljZXMvYXVkaXQtaGVhZC1leHBvcnQudHNgKSwgd2hpY2ggaG9sZHMgcmVnYXJkbGVzcyBvZlxuICAvLyBhbnkgcGVybWlzc2lvbiBoZXJlLlxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nOiB7IGxhYmVsOiAnT3BlbiB0aGUgb2JzZXJ2YWJpbGl0eSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBHcmFmYW5hIGFuZCBLaWFsaSDigJQgZGFzaGJvYXJkcywgdHJhZmZpYyBhbmQgbWVzaCBoZWFsdGggYWNyb3NzIGV2ZXJ5IHRlbmFudCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3Blbic6IHsgbGFiZWw6ICdPcGVuIHRoZSBkYXRhYmFzZSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzIOKAlCBhIGRpcmVjdCByZWFkL3dyaXRlIHNoZWxsIG92ZXIgZXZlcnkgdGVuYW50XFx1MjAxOXMgcm93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3Blbic6IHsgbGFiZWw6ICdPcGVuIHRoZSBvYmplY3Qtc3RvcmUgY29uc29sZScsIGRlc2NyaXB0aW9uOiAnT3BlbiB0aGUgUnVzdEZTIChTMykgY29uc29sZSDigJQgbGlzdCBhbmQgZGVsZXRlIG9iamVjdHMgaW4gZXZlcnkgYnVja2V0LCBpbmNsdWRpbmcgdGhlIGF1ZGl0IGNoYWluIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgJ29uY2FsbDptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIG9uLWNhbGwgcGFnaW5nJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwYWdpbmcgcG9zdHVyZSBhbmQgc2VuZCBhIHRlc3QgcGFnZSAoc3lzdGVtIG9yZyBvbmx5OyB0aGUgcm90YSBsaXZlcyB3aXRoIHRoZSBwcm92aWRlciknLCBjYXRlZ29yeTogJ09uLWNhbGwnIH0sXG4gIC8vIFRoZSB2ZW5kb3IncyBvdGhlciBvcGVyYXRpb25hbCBUQVNLUyAoc3lzdGVtIG9yZyBvbmx5KS4gRWFjaCBleGlzdHMgc28gYVxuICAvLyBzdXBlcmFkbWluIGNhbiBzdGFmZiBvbmUgam9iIHdpdGggYSBSb2xlIGluc3RlYWQgb2YgdGhlIHN1cGVyYWRtaW4gZmxhZyDigJRcbiAgLy8gYmVmb3JlIHRoZXNlLCAzNCByb3V0ZXMgd2VyZSByZWFjaGFibGUgb25seSBieSBzb21lb25lIHdobyBhbHNvIGhlbGRcbiAgLy8gaW1wZXJzb25hdGlvbiwgYSBkYXRhYmFzZSBzaGVsbCBhbmQgdGhlIGFiaWxpdHkgdG8gbWludCBhbm90aGVyIHN1cGVyYWRtaW4uXG4gIC8vXG4gIC8vIFN1cHBvcnQgZGVzaywgc3BsaXQgaW4gdHdvIGJlY2F1c2UgdGhlIGNvbnRlbnQgaXMgcmV1c2VkIGFjcm9zcyBldmVyeVxuICAvLyBjdXN0b21lciB3aGlsZSBhIGNhc2UgYmVsb25ncyB0byBvbmU6IGBzdXBwb3J0X2Nhc2VzOndyaXRlYCBpcyB0aGUgZGVzaydzXG4gIC8vIG93biB3b3JrICh0cmlhZ2UsIGFzc2lnbm1lbnQsIHNldmVyaXR5LCBpbnRlcm5hbCBub3RlcywgcmVjb3JkaW5nIGFuXG4gIC8vIGluY2lkZW50IGFnYWluc3QgYSBzdXBwb3J0IGNvbnRyYWN0KSwgYHN1cHBvcnRfY29udGVudDp3cml0ZWAgaXMgYXV0aG9yaW5nXG4gIC8vIHRoZSBjYW5uZWQgcmVwbGllcy4gRWFjaCBnYXRlcyBpdHMgdGFzaydzIFJFQURTIGFzIHdlbGwgYXMgaXRzIHdyaXRlcyxcbiAgLy8gYWdhaW5zdCB0aGUgdXN1YWwgY29udmVudGlvbiwgYmVjYXVzZSB0aGVzZSB0YWJsZXMgY2Fycnkgbm8gYG9yZ19pZGAg4oCUIHRoZXJlXG4gIC8vIGlzIG5vIHRlbmFuY3kgYm91bmRhcnkgdW5kZXJuZWF0aCB0byBmYWxsIGJhY2sgb24uXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJzogeyBsYWJlbDogJ1dvcmsgdGhlIHN1cHBvcnQgZGVzaycsIGRlc2NyaXB0aW9uOiAnVHJpYWdlIHRoZSBzdXBwb3J0IHF1ZXVlLCBhc3NpZ24gYW5kIHJlLXByaW9yaXRpc2UgY2FzZXMsIHdyaXRlIGludGVybmFsIG5vdGVzLCBhbmQgcmVjb3JkIGluY2lkZW50cyBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJzogeyBsYWJlbDogJ0F1dGhvciBjYW5uZWQgcmVwbGllcycsIGRlc2NyaXB0aW9uOiAnV3JpdGUgYW5kIHJldGlyZSB0aGUgcmV1c2FibGUgc3VwcG9ydCByZXBsaWVzIG9mZmVyZWQgdG8gZXZlcnkgY3VzdG9tZXIgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgLy8gQ3Jvc3MtdGVuYW50IHN1YnNjcmlwdGlvbnMuIFJlYWQgaXMgc3BsaXQgZnJvbSB3cml0ZSBiZWNhdXNlIGEgcmVhZC1vbmx5XG4gIC8vIGhvbGRlciBpcyBhIHJlYWwgam9iIGhlcmU6IHNvbWVvbmUgd2hvIHJlcG9ydHMgb24gcmV2ZW51ZSBhbmQgcGxhbiBtaXhcbiAgLy8gd2l0aG91dCBiZWluZyBhYmxlIHRvIGNoYW5nZSBhIHBsYW4gb3IgY2FuY2VsIG9uZS5cbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGFsbCBzdWJzY3JpcHRpb25zJywgZGVzY3JpcHRpb246ICdWaWV3IGV2ZXJ5IG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiwgcGxhbiBtaXggYW5kIGJpbGxpbmcgZXZlbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnOiB7IGxhYmVsOiAnQ2hhbmdlIGFueSBzdWJzY3JpcHRpb24nLCBkZXNjcmlwdGlvbjogJ0NoYW5nZSBhIHBsYW4sIHNldCBhIHN1cHBvcnQgZmxvb3IsIGFuZCBjYW5jZWwgYW4gb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gICdvcmdzOm1hbmFnZSc6IHsgbGFiZWw6ICdBZG1pbmlzdGVyIGFueSBvcmdhbml6YXRpb24nLCBkZXNjcmlwdGlvbjogJ1JlbmFtZSwgcmUtdGllciwgbW92ZSBhbmQgZGVsZXRlIGFueSBvcmdhbml6YXRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIENyb3NzLXRlbmFudCBxdW90YSB3cml0ZXMuIFRoZSBtYXRjaGluZyByZWFkcyAoYC9xdW90YXMvYWxsYCwgYC9hdC1yaXNrYClcbiAgLy8gcmlkZSBgcGxhdGZvcm06cmVhZGAgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0b3IgZGFzaGJvYXJkLCBzbyBzb21lb25lXG4gIC8vIHdhdGNoaW5nIGZvciBleGhhdXN0aW9uIGRvZXMgbm90IG5lZWQgdGhlIGFiaWxpdHkgdG8gcmFpc2UgYSBsaW1pdC5cbiAgJ3F1b3RhczptYW5hZ2UnOiB7IGxhYmVsOiAnQ2hhbmdlIGFueSBxdW90YScsIGRlc2NyaXB0aW9uOiAnUmFpc2UsIHJlc2V0IGFuZCBjbGVhciBhbm90aGVyIG9yZ2FuaXphdGlvblxcdTIwMTlzIHF1b3RhcyAoc3lzdGVtIG9yZyBvbmx5OyB2aWV3aW5nIHRoZW0gcmlkZXMgcGxhdGZvcm06cmVhZCknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZSc6IHsgbGFiZWw6ICdSdW4gdGhlIHBsdWdpbiBidWlsZCBxdWV1ZScsIGRlc2NyaXB0aW9uOiAnUmVhZCBidWlsZC1xdWV1ZSBkZXB0aCBhbmQgcHVyZ2UgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAnY29tcGxpYW5jZTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnVmlldyBjb21wbGlhbmNlIHJ1bGVzLCBwb2xpY2llcywgYW5kIHNjYW5zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICAnY29tcGxpYW5jZTp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IHJ1bGVzLCBwb2xpY2llcywgYW5kIGV4ZW1wdGlvbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gICdtZW1iZXJzOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gICdyb2xlczptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIHJvbGVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcm9sZXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gICdpbnZpdGF0aW9uczptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIGludml0YXRpb25zJywgZGVzY3JpcHRpb246ICdTZW5kLCByZXNlbmQsIGFuZCByZXZva2UgaW52aXRhdGlvbnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJzogeyBsYWJlbDogJ01hbmFnZSBzZXJ2aWNlIGFjY291bnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgb3JnIHNlcnZpY2UgYWNjb3VudHMsIGFzc2lnbiB0aGVpciByb2xlcywgYW5kIGlzc3VlIG9yIHJldm9rZSB0aGVpciBrZXlzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICAnZGFzaGJvYXJkczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnVmlldyBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgJ2Rhc2hib2FyZHM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdWaWV3IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gICdvYnNlcnZhYmlsaXR5OndyaXRlJzogeyBsYWJlbDogJ01hbmFnZSBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICAnbG9nczpleHBvcnQnOiB7IGxhYmVsOiAnRG93bmxvYWQgbG9ncycsIGRlc2NyaXB0aW9uOiBcIkRvd25sb2FkIHlvdXIgb3JnYW5pemF0aW9uJ3MgbG9nIGVudHJpZXMgYXMgYSBmaWxlICh2aWV3aW5nIGxvZ3Mgb25seSBuZWVkcyAnVmlldyBhbGVydGluZycpXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gICdhdWRpdDpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgdGhlIGF1ZGl0IGxvZycsIGRlc2NyaXB0aW9uOiBcIlJlYWQgdGhlIG9yZ2FuaXphdGlvbidzIG93biB0YW1wZXItZXZpZGVudCBhdWRpdCB0cmFpbFwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gICdyZXBvcnRzOnJlYWQnOiB7IGxhYmVsOiAnVmlldyByZXBvcnRzJywgZGVzY3JpcHRpb246ICdWaWV3IGFuYWx5dGljcyBhbmQgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdyZXBvcnRzOnJvbGx1cCc6IHsgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0cy4gYHJlcG9ydHM6cmVhZGAgc3RheXMgdGhlIEZSRUUgb24tZGVtYW5kIGRhc2hib2FyZCByZWFkO1xuICAvLyB0aGVzZSB0d28gYXJlIHRoZSBhZGQtb24ncyB3cml0ZSBzdXJmYWNlIOKAlCBgYXV0aG9yYCBzYXZlcy9zY2hlZHVsZXMvZHJhZnRzIGFcbiAgLy8gcmVwb3J0LCBgc2hhcmVgIHB1Ymxpc2hlcyBpdCBiZXlvbmQgdGhlIHBsYXRmb3JtIChQREYsIGVtYWlsLCBzaGFyZSBsaW5rcykuXG4gIC8vIFNwbGl0IGJlY2F1c2UgcHVibGlzaGluZyBleHRlcm5hbGx5IGlzIGEgZGlmZmVyZW50IHJpc2sgZnJvbSBjb21wb3Npbmc6XG4gIC8vIGEgbGVhZCBjYW4gYmUgYWxsb3dlZCB0byBidWlsZCByZXBvcnRzIHdpdGhvdXQgYmVpbmcgYWxsb3dlZCB0byBlbWFpbCB0aGVtIG91dC5cbiAgJ3JlcG9ydHM6d3JpdGUnOiB7IGxhYmVsOiAnQXV0aG9yIHN0YWtlaG9sZGVyIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgc2NoZWR1bGUgYW5kIGRyYWZ0IHNjaGVkdWxlZCByZXBvcnRzIGZvciBtYW5hZ2VycycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdyZXBvcnRzOnB1Ymxpc2gnOiB7IGxhYmVsOiAnUHVibGlzaCByZXBvcnRzIGV4dGVybmFsbHknLCBkZXNjcmlwdGlvbjogJ1B1Ymxpc2ggYSByZXBvcnQgYW5kIG1pbnQgZXhwaXJpbmcgc2hhcmUgbGlua3MgZm9yIHBlb3BsZSBvdXRzaWRlIHRoZSBwbGF0Zm9ybScsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdtZXNzYWdlczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgJ21lc3NhZ2VzOndyaXRlJzogeyBsYWJlbDogJ1NlbmQgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1NlbmQgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgJ2JpbGxpbmc6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgc3Vic2NyaXB0aW9ucyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gICdiaWxsaW5nOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gICdxdW90YXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHF1b3RhcycsIGRlc2NyaXB0aW9uOiAnVmlldyBvcmdhbml6YXRpb24gcXVvdGFzIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgLy8gUmVnaXN0cnkuIFRocmVlIHJ1bmdzLCBiZWNhdXNlIHRoZSB3cml0ZSBoYWxmIGhhcyB0d28gdmVyeSBkaWZmZXJlbnRcbiAgLy8gYmxhc3QgcmFkaWk6IGB3cml0ZWAgQ09QSUVTIGEgbWFuaWZlc3QgKGFkZGl0aXZlIOKAlCBpdCBjcmVhdGVzIGEgdGFnLFxuICAvLyBub3RoaW5nIHN0b3BzIHJlc29sdmluZyksIGBwdXJnZWAgREVMRVRFUyBvbmUgKGEgdGVuYW50J3MgcGlwZWxpbmUgb3IgYVxuICAvLyBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZSBjYW4gc3RvcCByZXNvbHZpbmcsIHdpdGggbm8gdW5kbykuXG4gICdyZWdpc3RyeTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgcmVnaXN0cnknLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gICdyZWdpc3RyeTp3cml0ZSc6IHsgbGFiZWw6ICdDb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0NvcHkgYW5kIHByb21vdGUgYSBjb250YWluZXIgaW1hZ2UgaW50byBhbm90aGVyIHJlcG9zaXRvcnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICAncmVnaXN0cnk6cHVyZ2UnOiB7IGxhYmVsOiAnRGVsZXRlIGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0RlbGV0ZSBpbWFnZXMgYW5kIHJlcG9zaXRvcmllcywgYW5kIHJ1biByZWdpc3RyeSBnYXJiYWdlIGNvbGxlY3Rpb24nLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgJ2ltcGVyc29uYXRpb246b3Blbic6IHsgbGFiZWw6ICdPcGVuIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbicsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBjdXN0b21lcidzIGFjY291bnQgYXMgb25lIG9mIGl0cyB1c2Vycywgd2l0aCB0aGF0IG9yZ2FuaXphdGlvbidzIGNvbnNlbnRcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJzogeyBsYWJlbDogJ0Fuc3dlciBpbXBlcnNvbmF0aW9uIHJlcXVlc3RzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIG9yIGRlbnkgYSByZXF1ZXN0IHRvIHZpZXcgYSBtZW1iZXIgb2YgdGhpcyBvcmdhbml6YXRpb24gYXMgdGhhdCBtZW1iZXInLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gICd0ZWFtX2FjY2VzczpvcGVuJzogeyBsYWJlbDogXCJWaWV3IGEgdGVhbSBtZW1iZXIncyBhY2NvdW50XCIsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBtZW1iZXIgb2Ygb25lIG9mIHRoaXMgb3JnYW5pemF0aW9uJ3MgdGVhbXMgYXMgdGhhdCBtZW1iZXIgKHJlYWQtb25seSlcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuIEZvdXIgUkVTT1VSQ0VTLCBlYWNoIHdpdGggdGhlIGA6d3JpdGVgIGFjdGlvbiwgcmF0aGVyXG4gIC8vIHRoYW4gb25lIGBvcmdgIHJlc291cmNlIHdpdGggZm91ciBub3VuLXNoYXBlZCBhY3Rpb25zIOKAlCB0aGVzZSBhcmUgdGhlIG9yZydzXG4gIC8vIG93biBjb25maWd1cmF0aW9uIHN0YXRlLCB3aGljaCBpcyB3aGF0IGA6d3JpdGVgIG1lYW5zIGhlcmUgKGA6bWFuYWdlYCBpc1xuICAvLyByZXNlcnZlZCBmb3IgYWRtaW5pc3RlcmluZyBhIGNvbGxlY3Rpb24gb2Ygb3RoZXIgZW50aXRpZXM6IG1lbWJlcnMsIHJvbGVzLFxuICAvLyBpbnZpdGF0aW9ucywgc2VydmljZSBhY2NvdW50cywgYmlsbGluZykuXG4gIC8vXG4gIC8vICAtIGBvcmdfc2V0dGluZ3M6d3JpdGVgICAgICAg4oCUIGdlbmVyYWwgb3JnIHNldHRpbmdzICsgQUkgY29uZmlnLlxuICAvLyAgLSBgb3JnX2lkcDp3cml0ZWAgICAgICAgICAgIOKAlCBTU08gLyBJZFAgY29uZmlndXJhdGlvbiAoc2Vuc2l0aXZlOiBjb250cm9scyBsb2dpbikuXG4gIC8vICAtIGBvcmdfa21zOndyaXRlYCAgICAgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vuc2l0aXZlOiBjb250cm9scyBlbmNyeXB0aW9uIG9mIG9yZyBkYXRhKS5cbiAgLy8gIC0gYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCDigJQgdGhlIGltcGVyc29uYXRpb24gcG9saWN5IChzZW5zaXRpdmU6IGNvbnRyb2xzXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gbWF5IFZJRVcgdGhlIG9yZydzIGRhdGEgYXMgYSBtZW1iZXIpLlxuICAvL1xuICAvLyBUaGUgbGFzdCB0aHJlZSB3ZXJlIHNwbGl0IE9VVCBvZiBgb3JnX3NldHRpbmdzOndyaXRlYCBzbyBhIGN1c3RvbSByb2xlIGNhblxuICAvLyBncmFudCBnZW5lcmFsIHNldHRpbmdzIFdJVEhPVVQgdGhlIHNlbnNpdGl2ZSBzdXJmYWNlcyDigJQgYSBcInNldHRpbmdzIG1hbmFnZXJcIlxuICAvLyByb2xlIGZvciBvcmcgbmFtZSBvciBBSSBwcm92aWRlciBtdXN0IG5vdCBhbHNvIGJlIGFibGUgdG8gc3dpdGNoIHRoZSBvcmcgdG9cbiAgLy8gYG9wZW5gLiBBbGwgcmVtYWluIG9yZy1hc3NpZ25hYmxlIGFuZCBhcmUgc2VlZGVkIGludG8gdGhlIGFkbWluL293bmVyXG4gIC8vIGJ1bmRsZXMgKHZpYSBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUykgc28gZXhpc3RpbmcgYWRtaW5zIGtlZXAgZnVsbFxuICAvLyBhY2Nlc3MuXG4gICdvcmdfc2V0dGluZ3M6d3JpdGUnOiB7IGxhYmVsOiAnT3JnYW5pemF0aW9uIHNldHRpbmdzJywgZGVzY3JpcHRpb246ICdNYW5hZ2UgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgYW5kIEFJIGNvbmZpZycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICAnb3JnX2lkcDp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgJ29yZ19rbXM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGVuY3J5cHRpb24ga2V5cycsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb24ga2V5cycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGltcGVyc29uYXRpb24gcG9saWN5JywgZGVzY3JpcHRpb246ICdDb250cm9sIHdoZXRoZXIgcGxhdGZvcm0gb3BlcmF0b3JzIG1heSB2aWV3IHRoZSBvcmdhbml6YXRpb24gYXMgb25lIG9mIGl0cyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG59IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCB7IGxhYmVsOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfT47XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlMgPSBPYmplY3Qua2V5cyhQRVJNSVNTSU9OX0RFRlMpIGFzIHJlYWRvbmx5IFBlcm1pc3Npb25bXTtcblxuLyoqIFRoZSBwZXJtaXNzaW9uIGNhdGFsb2cgd2l0aCBkaXNwbGF5IG1ldGFkYXRhLCBpbiBwaWNrZXIgb3JkZXIuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9DQVRBTE9HOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdID0gQUxMX1BFUk1JU1NJT05TLm1hcCgoaWQpID0+ICh7IGlkLCAuLi5QRVJNSVNTSU9OX0RFRlNbaWRdIH0pKTtcblxuLyoqIEh1bWFuIGxhYmVsIGZvciBhIHBlcm1pc3Npb24gaWQgKGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBpZCBmb3IgYW4gdW5rbm93biBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25MYWJlbChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzVmFsaWRQZXJtaXNzaW9uKGlkKSA/IFBFUk1JU1NJT05fREVGU1tpZF0ubGFiZWwgOiBpZDtcbn1cblxuLyoqIE9uZSBwaWNrZXIgc2VjdGlvbjogYSBjYXRlZ29yeSBhbmQgdGhlIHBlcm1pc3Npb25zIGl0IGNvbnRhaW5zLCBpbiBjYXRhbG9nIG9yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogUGVybWlzc2lvbk1ldGFbXTtcbn1cblxuLyoqIEdyb3VwIGEgcGVybWlzc2lvbiBsaXN0IGludG8gY2F0ZWdvcmllcywgcHJlc2VydmluZyBjYXRhbG9nIG9yZGVyLiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUNhdGVnb3J5KHBlcm1zOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdKTogUGVybWlzc2lvbkNhdGVnb3J5W10ge1xuICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8c3RyaW5nLCBQZXJtaXNzaW9uTWV0YVtdPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcGVybXMpIHtcbiAgICBpZiAoIWJ5Q2F0ZWdvcnkuaGFzKHAuY2F0ZWdvcnkpKSB7IGJ5Q2F0ZWdvcnkuc2V0KHAuY2F0ZWdvcnksIFtdKTsgb3JkZXIucHVzaChwLmNhdGVnb3J5KTsgfVxuICAgIGJ5Q2F0ZWdvcnkuZ2V0KHAuY2F0ZWdvcnkpIS5wdXNoKHApO1xuICB9XG4gIHJldHVybiBvcmRlci5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeSwgcGVybWlzc2lvbnM6IGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSEgfSkpO1xufVxuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFBlcm1pc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBlcm1pc3Npb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFBlcm1pc3Npb24ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFBFUk1JU1NJT05fREVGUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgbXVzdCBORVZFUiBiZSBncmFudGFibGUgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgQ1VTVE9NIFJvbGUg4oCUXG4gKiB0aGV5IGdhdGUgcGxhdGZvcm0tb3BlcmF0b3Igc3VyZmFjZXMgKHRoZSBzaGFyZWQgaW1hZ2UgcmVnaXN0cnkpLCBzbyBhbGxvd2luZ1xuICogYW4gb3JnIGFkbWluIHRvIG1pbnQgYSBSb2xlIGNhcnJ5aW5nIHRoZW0gd291bGQgYmUgYSBsYXRlbnQgcHJpdmlsZWdlXG4gKiBlc2NhbGF0aW9uLiBUaGV5IGFyZSBOT1Qgc2VlZGVkIGludG8gQU5ZIGJ1aWx0LWluIFJvbGUgYnVuZGxlIChuZWl0aGVyXG4gKiBgbWVtYmVyYCBub3IgYGFkbWluYCksIHNvIHRoZSBvbmx5IGhvbGRlciBpcyBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCkg4oCUXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBpbWFnZS1yZWdpc3RyeSBnYXRlcyB0aGF0IHJlcXVpcmUgdGhlbSBlZmZlY3RpdmVseVxuICogc3VwZXJhZG1pbi1vbmx5LiBUaGlzIGxpc3QgQUxTTyBibG9ja3MgY3VzdG9tLVJvbGUgYXV0aG9yaW5nIGZyb20gcmVxdWVzdGluZ1xuICogdGhlbSAoc2VlIHBsYXRmb3JtIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gYHJlZ2lzdHJ5OnJlYWRgIGFuZCBgcmVnaXN0cnk6d3JpdGVgIHdlcmUgYm90aCBoZXJlLiBXaGF0IHN0YXlzIGlzIHRoZVxuICAvLyBkZXN0cnVjdGl2ZSBydW5nIGFsb25lOiBkZWxldGluZyBhIG1hbmlmZXN0IG9yIGEgd2hvbGUgcmVwb3NpdG9yeSwgYW5kIHRoZVxuICAvLyBHQyBwcnVuZSwgZWFjaCBvZiB3aGljaCBjYW4gcmVtb3ZlIGFuIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgc3RpbGxcbiAgLy8gcmVzb2x2ZXMg4oCUIGluY2x1ZGluZyB0aGUgZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2VzIHRoZSBzdXBwbHkgY2hhaW5cbiAgLy8gdmVyaWZpZXMgYWdhaW5zdC4gVGhhdCBpcyB0aGUgb25lIHJlZ2lzdHJ5IGFjdGlvbiB3aXRoIG5vIHVuZG8sIHNvIGl0IGtlZXBzXG4gIC8vIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgYXVkaWVuY2U6IHRoZSBmbGFnLCBhbmQgbmV2ZXIgYSBSb2xlLlxuICAncmVnaXN0cnk6cHVyZ2UnLFxuXTtcblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IGdvdmVybiB0aGUgUExVR0lOIEVDT1NZU1RFTSBhbmQgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gTGlrZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gdGhleSBhcmUgaW4gbm8gbWVtYmVyL2FkbWluL293bmVyIGJ1bmRsZSxcbiAqIGFuZCBubyBSb2xlIGF1dGhvcmVkIGluIGEgVEVOQU5UIG1heSBjYXJyeSBvbmU6IHBsYXRmb3JtJ3NcbiAqIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBhZG1pdHMgdGhlbSBvbmx5IHdoZW4gdGhlIGF1dGhvciBpcyBhIHN1cGVyYWRtaW4gQU5EXG4gKiB0aGUgUm9sZSBpcyBiZWluZyB3cml0dGVuIGluIHRoZSBzeXN0ZW0gb3JnIGl0c2VsZiAoYG1heUNvbXBvc2VTeXN0ZW1PcmdSb2xlYCkuXG4gKlxuICogU28gdGhlcmUgYXJlIHRocmVlIGdyYW50IHBhdGhzLCBub3Qgb25lOiBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCksIG9uZSBvZlxuICogdGhlIHNlZWRlZCBzeXN0ZW0tb3JnIFJvbGVzLCBhbmQgYSBDVVNUT00gc3lzdGVtLW9yZyBSb2xlIGEgc3VwZXJhZG1pblxuICogY29tcG9zZWQuIFRoZSB0aGlyZCBpcyB3aGF0IG1ha2VzIHRoZSBzcGxpdCBiZXR3ZWVuIGBwbHVnaW5zOm1vZGVyYXRlYCBhbmRcbiAqIGBwdWJsaXNoZXJzOnZlcmlmeWAgdXNhYmxlIHdpdGhvdXQgd2FpdGluZyBmb3IgYSBuZXcgc2VlZCBidW5kbGUg4oCUIHdvcnRoXG4gKiBrbm93aW5nIGJlZm9yZSByZWFkaW5nIGVpdGhlciBwZXJtaXNzaW9uIGFzIFwidW5yZWFjaGFibGUgZXhjZXB0IHZpYVxuICoge0BsaW5rIEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TfVwiLlxuICpcbiAqIGBvbmNhbGw6bWFuYWdlYCBpcyBjYXJyaWVkIGJ5ICoqUGxhdGZvcm0gT3BlcmF0b3IqKiBhbmQgYnkgbm8gb3RoZXIgbmFtZWRcbiAqIHJvbGUuIFRoYXQgc3BsaXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQ6IHBhZ2luZyBpcyB0aGVcbiAqIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIGVjb3N5c3RlbVxuICogbW9kZXJhdGlvbiwgc28gd2lkZW5pbmcgdGhlIEVjb3N5c3RlbSBNYW5hZ2VyIHJvbGUgdG8gY2FycnkgaXQgd291bGQgaGFuZCB0aGVcbiAqIHBhZ2VyIHRvIHBlb3BsZSBoaXJlZCB0byByZXZpZXcgcGx1Z2lucy4gSXQgaXMgbm90IGEgcGxhY2Vob2xkZXIg4oCUIGl0IGdhdGVzXG4gKiB0d28gbGl2ZSByb3V0ZXMgKHRoZSBwYWdpbmcgcG9zdHVyZSByZWFkIGFuZCB0aGUgdGVzdCBwYWdlKSwgdW5saWtlXG4gKiBgcmVnaXN0cnk6KmAuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAvLyBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzLCBzeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGVcbiAgLy8gY29uc29sZXMgYXJlOiB0aGV5IHJlYWQgYW5kIG1vdmUgdGhpbmdzIGJlbG9uZ2luZyB0byBvcmdhbmlzYXRpb25zIHRoZVxuICAvLyBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mLCBzbyB0aGV5IG11c3QgbmV2ZXIgYmUgZ3JhbnRhYmxlIGluc2lkZSBhIHRlbmFudC5cbiAgJ3BsYXRmb3JtOnJlYWQnLFxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyB0aGUgaW1hZ2UgcmVnaXN0cnk6IHJlcG9zaXRvcnkgbmFtZXMsIHRhZ3MsIG1hbmlmZXN0cywgYmxvYnMgYW5kIHRoZVxuICAvLyBzdG9yYWdlIHJvbGx1cC4gUHJvbW90ZWQgb3V0IG9mIFNVUEVSQURNSU5fT05MWSBiZWNhdXNlIHRoZSByZWdpc3RyeSBicm93c2VyXG4gIC8vIHdhcyBpbnZpc2libGUgdG8gZXZlcnkgUm9sZSwgc28gYSBQbGF0Zm9ybSBPcGVyYXRvciBkZWJ1Z2dpbmcgYSBmYWlsZWRcbiAgLy8gcGx1Z2luIGJ1aWxkIGNvdWxkIHNlZSB0aGUgYnVpbGQgcXVldWUgYW5kIGl0cyBkZWFkIGxldHRlcnMgYnV0IG5vdCB0aGVcbiAgLy8gaW1hZ2VzIHRoZSBidWlsZCBwcm9kdWNlZCDigJQgYW5kIHRoZSBvbmx5IHdheSB0byBsb29rIHdhcyB0aGUgc3VwZXJhZG1pblxuICAvLyBmbGFnLiBJdCBzdGF5cyBzeXN0ZW0tb3JnLW9ubHkgKG5vIHRlbmFudCBSb2xlIG1heSBjYXJyeSBpdCkgYW5kIGlzIHBhaXJlZFxuICAvLyB3aXRoIGEgcGVyLXJlcG8gb3JnLW93bmVyc2hpcCBmaWx0ZXIgdGhhdCBydW5zIEFGVEVSIGl0LCBzbyB3aWRlbmluZyB0aGVcbiAgLy8gcGVybWlzc2lvbiBkb2VzIG5vdCB3aWRlbiB3aGljaCByZXBvc2l0b3JpZXMgYSBob2xkZXIgY2FuIHJlYWNoOiBhXG4gIC8vIHN5c3RlbS1vcmcgbWVtYmVyIHdobyBpcyBub3QgYSBzdXBlcmFkbWluIHNlZXMgYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kXG4gIC8vIGBwdWJsaWMvKmAg4oCUIHRoaXMgZGVwbG95bWVudCdzIG93biBiYXNlIGFuZCBwbHVnaW4gaW1hZ2VzIOKAlCBhbmQgbm8gdGVuYW50J3NcbiAgLy8gYG9yZy0qYCByZXBvc2l0b3JpZXMgYXQgYWxsIChgY2FuUmVhZFJlcG9gIGluIHRoZSBpbWFnZS1yZWdpc3RyeSBzZXJ2aWNlKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuICAvLyBDb3B5aW5nL3Byb21vdGluZyBhbiBpbWFnZS4gU3lzdGVtLW9yZy1vbmx5IHJhdGhlciB0aGFuIHN1cGVyYWRtaW4tb25seVxuICAvLyBiZWNhdXNlIGl0IGlzIEFERElUSVZFOiBpdCB3cml0ZXMgYSBuZXcgdGFnIGFuZCBtYWtlcyBub3RoaW5nIHN0b3BcbiAgLy8gcmVzb2x2aW5nLCBhbmQgYGNhbldyaXRlUmVwb2AgY29uZmluZXMgYSBub24tc3VwZXJhZG1pbiBzeXN0ZW0tb3JnIGNhbGxlclxuICAvLyB0byBgc3lzdGVtLypgIHJlZ2FyZGxlc3MuIERlbGliZXJhdGVseSBjYXJyaWVkIGJ5IE5PIGJ1aWx0LWluIGJ1bmRsZSB0b2RheVxuICAvLyDigJQgcHJvbW90aW5nIGFuIGltYWdlIGlzIGEgam9iLCBub3QgYSBzaWRlIGVmZmVjdCBvZiBydW5uaW5nIHRoZSBkZXBsb3ltZW50LFxuICAvLyBzbyBpdCB3YWl0cyBmb3IgYSBSb2xlIG9mIGl0cyBvd24gcmF0aGVyIHRoYW4gcmlkaW5nIGFsb25nIHdpdGhcbiAgLy8gYHBsYXRmb3JtOnJlYWRgLlxuICAncmVnaXN0cnk6d3JpdGUnLFxuICAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBPcGVuaW5nIGEgY3Jvc3MtdGVuYW50IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gU3lzdGVtLW9yZy1vbmx5IGZvciB0aGVcbiAgLy8gb2J2aW91cyByZWFzb24g4oCUIGl0IHZpZXdzIGFuIG9yZ2FuaXNhdGlvbiB0aGUgaG9sZGVyIGlzIG5vdCBhIG1lbWJlciBvZiDigJRcbiAgLy8gYW5kIGl0IGlzIHRoZSBPTkUgcGVybWlzc2lvbiBpbiB0aGlzIGxpc3QgdGhhdCBhbHNvIGhhcyB0byBjbGVhciBhIGdhdGUgdGhlXG4gIC8vIHBlcm1pc3Npb24gc3lzdGVtIGRvZXMgbm90IG93bjogdGhlIHRhcmdldCBvcmdhbmlzYXRpb24ncyBjb25zZW50IChpdHNcbiAgLy8gYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCBwb2xpY3kpLCBwbHVzIGFhbDIgYW5kIGEgc3Ryb25nIHN0ZXAtdXAuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHNheXMgd2hvIG1heSBBU0s7IHRoZSB0ZW5hbnQgc3RpbGwgYW5zd2Vycy5cbiAgLy9cbiAgLy8gSXQgZG9lcyBOT1QgY292ZXIgZW1lcmdlbmN5IGFjY2Vzcy4gYFBPU1QgLzp1c2VySWQvYnJlYWtnbGFzc2AgYnlwYXNzZXNcbiAgLy8gdGVuYW50IGNvbnNlbnQgYW5kIHNvIHN0YXlzIG9uIHRoZSBzdXBlcmFkbWluIGZsYWcgYWxvbmUsIGFwcHJvdmVkIGJ5IGFcbiAgLy8gU0VDT05EIHN1cGVyYWRtaW4gKGZvdXItZXllcykuIEEgcGVybWlzc2lvbiB0aGF0IGNvdWxkIGJlIGRlbGVnYXRlZCBtdXN0IG5vdFxuICAvLyBiZSBhYmxlIHRvIHdhbGsgcGFzdCBjb25zZW50LlxuICAnaW1wZXJzb25hdGlvbjpvcGVuJyxcbiAgLy8gUGFnaW5nIGlzIHRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgY29uY2VybiBhbmQgZ3JhbnRzIE5PIHRlbmFudCBhY2Nlc3NcbiAgLy8g4oCUIGBpc1N5c3RlbU9yZ0lkYCBpcyBhIGNvbnRlbnQtb3duZXIgY2hlY2ssIG5vdCBhIHByaXZpbGVnZSBnYXRlIOKAlCBzbyBhXG4gIC8vIHRlbmFudCByb2xlIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjYXJyeSBpdCwgYW5kIGEgdGVuYW50IG11c3QgbmV2ZXIgYmUgYWJsZVxuICAvLyB0byBtYWtlIHRoaXMgZGVwbG95bWVudCBzZW5kIGEgcGFnZS5cbiAgJ29uY2FsbDptYW5hZ2UnLFxuICAvLyBUaGUgdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIHRhc2tzLiBFYWNoIG9uZSByZXBsYWNlZCBhIGByZXF1aXJlU3lzdGVtQWRtaW5gXG4gIC8vIGdhdGUsIHNvIHRoZSBwb2ludCBvZiBsaXN0aW5nIHRoZW0gaGVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnQgb2YgYWRkaW5nXG4gIC8vIHRoZW0gYXQgYWxsOiBhIFJvbGUgY29tcG9zZWQgaW4gdGhlIHN5c3RlbSBvcmcgY2FuIGNhcnJ5IGV4YWN0bHkgb25lIGpvYixcbiAgLy8gYW5kIG5vIFJvbGUgaW4gYW55IHRlbmFudCBjYW4gY2FycnkgaXQgYXQgYWxsLlxuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsXG4gICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJyxcbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gIC8vIFRoZSBUb29sY2hhaW4gY29uc29sZSAocGxhbiBEOSk6IFRIRSBwbGF0Zm9ybSBkZWZhdWx0IGFuZCBjYW5hcnkgbW92ZSB0aGVcbiAgLy8gYnVpbGQgdG9vbGNoYWluIG9mIGV2ZXJ5IG9yZyB0aGF0IGZvbGxvd3MgaXQsIHNvIG5vIHRlbmFudCBtYXkgaG9sZCBpdC5cbiAgJ3Rvb2xjaGFpbjpvcGVyYXRlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gVGhlIFRvb2xjaGFpbiBjb25zb2xlIChwbGFuIEQ5KTogY2FuYXJ5LCBwcm9tb3Rpb24sIHJvbGxiYWNrIGFuZCByZWxlYXNlXG4gIC8vIGxpZmVjeWNsZSBvZiB0aGUgbWFuYWdlZCBidWlsZCB0b29sY2hhaW4g4oCUIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gICd0b29sY2hhaW46b3BlcmF0ZScsXG4gIC8vIFJlYWRzIHRoYXQgbWFrZSB0aGUgb3BlcmF0b3Igdmlld3MgdXNhYmxlOiB0aGUgZGFzaGJvYXJkcyB0aGUgcG9zdHVyZSBwYW5lbHNcbiAgLy8gbGl2ZSBvbiwgdGhlIGNyb3NzLXRlbmFudCBsb2cgdmlldywgYW5kIHRoZSBjdXN0b21lcidzIHBsYW4gd2hlbiBhIGxpbWl0IGlzXG4gIC8vIHRoZSB0aGluZyBiZWluZyBkZWJ1Z2dlZC5cbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgLy8gVGhlIHJlZ2lzdHJ5IGJyb3dzZXI6IHJlcG9zaXRvcnkgbmFtZXMsIHRhZ3MgYW5kIG1hbmlmZXN0cyBmb3IgdGhlIGltYWdlc1xuICAvLyB0aGlzIGRlcGxveW1lbnQncyBidWlsZHMgcHJvZHVjZS4gSXQgd2FzIHdpdGhoZWxkIHdoaWxlIGByZWdpc3RyeTpyZWFkYCB3YXNcbiAgLy8gc3VwZXJhZG1pbi1vbmx5IOKAlCBhIHNlZWRlZCBidW5kbGUgY2FycnlpbmcgYSBzdXBlcmFkbWluLW9ubHkgcGVybWlzc2lvblxuICAvLyB3b3VsZCBtYWtlIHRoYXQgbGlzdCBhIGxpZSwgc2luY2UgYnVuZGxlcyBieXBhc3MgYHNhbml0aXplUGVybWlzc2lvbnNgLiBUaGVcbiAgLy8gcGVybWlzc2lvbiB3YXMgcHJvbW90ZWQgdG8gc3lzdGVtLW9yZy1vbmx5IGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBzbXVnZ2xlZFxuICAvLyBpbiBoZXJlLCB3aGljaCBpcyB0aGUgb3JkZXIgdGhvc2UgdHdvIGNoYW5nZXMgaGF2ZSB0byBoYXBwZW4gaW4uXG4gICdyZWdpc3RyeTpyZWFkJyxcbl07XG5cbi8qKlxuICogQUNDT1VOVCBNQU5BR0VSIOKAlCB0aGUgY29tbWVyY2lhbCByZWxhdGlvbnNoaXAgd2l0aCBhIGN1c3RvbWVyLCBhcyBvcHBvc2VkIHRvXG4gKiBydW5uaW5nIHRoZSBkZXBsb3ltZW50LlxuICpcbiAqIFNwbGl0IGZyb20ge0BsaW5rIFBMQVRGT1JNX09QRVJBVE9SX1BFUk1JU1NJT05TfSByYXRoZXIgdGhhbiBwaWxlZCBvbnRvIGl0LFxuICogYmVjYXVzZSB0aGUgdHdvIGpvYnMgZGl2ZXJnZSBhdCBleGFjdGx5IHRoZSBwZXJtaXNzaW9ucyBhZGRlZCBhbG9uZ3NpZGUgdGhpc1xuICogYnVuZGxlLiBgYmlsbGluZzpvcGVyYXRlYCBNT1ZFRCBoZXJlIGZyb20gdGhlIG9wZXJhdG9yIGJ1bmRsZSBmb3IgdGhhdCByZWFzb246XG4gKiBtaW50aW5nIGEgZGlzY291bnQgdG9rZW4gaXMgYSBjb21tZXJjaWFsIGFjdCwgbm90IGFuIG9wZXJhdGlvbmFsIG9uZSwgYW5kIHRoZVxuICogcGVyc29uIHdobyByZXN0YXJ0cyBhIHN0dWNrIGJ1aWxkIHF1ZXVlIGhhcyBubyByZWFzb24gdG8gaG9sZCBpdC5cbiAqXG4gKiBUaGUgZGVzdHJ1Y3RpdmUgaGFsZiBvZiB0aGUgY2F0YWxvZ3VlIGxpdmVzIGhlcmUg4oCUIGBvcmdzOm1hbmFnZWAgY2FuIERFTEVURVxuICogYW4gb3JnYW5pc2F0aW9uIGFuZCBgc3Vic2NyaXB0aW9uczptYW5hZ2VgIGNhbiBjYW5jZWwgaXRzIHN1YnNjcmlwdGlvbiDigJQgc29cbiAqIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IHRoZSBzbWFsbGVyLCBtb3JlIHJhcmVseS1hc3NpZ25lZCBvZiB0aGUgdHdvLlxuICovXG5leHBvcnQgY29uc3QgQUNDT1VOVF9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAnYmlsbGluZzpvcGVyYXRlJyxcbiAgLy8gQSBxdW90YSBidW1wIGlzIGFzIG9mdGVuIGEgY29tbWVyY2lhbCBjb25jZXNzaW9uIGFzIGFuIG9wZXJhdGlvbmFsIG9uZSwgc29cbiAgLy8gYm90aCBidW5kbGVzIGNhcnJ5IGl0LlxuICAncXVvdGFzOm1hbmFnZScsXG4gIC8vIFRoZSBhbGwtb3JnYW5pemF0aW9ucyBsaXN0LCB3aGljaCBpcyB0aGUgc3VyZmFjZSB0aGlzIGpvYiB3b3JrcyBmcm9tIOKAlCBhbmRcbiAgLy8gb25seSB0aGF0LiBJdCB1c2VkIHRvIHRha2UgYHBsYXRmb3JtOnJlYWRgLCB3aGljaCBhbHNvIGhhbmRlZCBvdmVyIHRoZVxuICAvLyBkZXBsb3kncyBSTFMgbW9kZSwgS01TIHBvc3R1cmUgYW5kIHJlbmRlcmVkIGFsZXJ0IHJ1bGVzOiBpbnRlcm5hbHMgYVxuICAvLyBjb21tZXJjaWFsIHJvbGUgaGFzIG5vIHVzZSBmb3IuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBDT05TT0xFIEFETUlOSVNUUkFUT1Ig4oCUIHRoZSBvcGVyYXRvciBjb25zb2xlcywgYXMgYSBSb2xlLlxuICpcbiAqIFdIWSBUSElTIEVYSVNUUyBldmVuIHRob3VnaCBlYWNoIGNvbnNvbGUgcGVybWlzc2lvbiBpcyBncmFudGFibGUgYnkgaGFuZDogd2l0aFxuICogbm8gc2VlZGVkIFJvbGUsIHRoZSBvbmx5IHBhdGggdG8gcGdBZG1pbiB3YXMgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIGN1c3RvbVxuICogUm9sZSBmb3IgaXQsIGFuZCB0aGUgb2JzZXJ2ZWQgb3V0Y29tZSBvZiBhc2tpbmcgcGVvcGxlIHRvIGRvIHRoYXQgaXMgdGhhdCB0aGV5XG4gKiByZWFjaCBmb3IgdGhlIHN1cGVyYWRtaW4gRkxBRyBpbnN0ZWFkIOKAlCB0aGUgZXhhY3QgZmFpbHVyZSB0aGVzZSBwZXJtaXNzaW9uc1xuICogd2VyZSBhZGRlZCB0byByZW1vdmUuIEEgbmFtZWQgUm9sZSBhbHNvIG1ha2VzIFwid2hvIGNhbiBvcGVuIGEgZGF0YSBzaGVsbD9cIiBvbmVcbiAqIHF1ZXJ5IGluc3RlYWQgb2YgYW4gYXVkaXQgb2YgZXZlcnkgY3VzdG9tIFJvbGUuXG4gKlxuICogSXQgY2FycmllcyBhbGwgdGhyZWUgY29uc29sZXMsIHdoaWNoIGlzIHRoZSB3aG9sZSBqb2IgZm9yIHRoZSBwZXJzb24gd2hvIGhvbGRzXG4gKiBpdC4gT05FIENPTlNFUVVFTkNFIFdPUlRIIEtOT1dJTkc6IGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGFuZFxuICogYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAgYXJlIHRoZSB0d28gaGFsdmVzIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2VcbiAqIGRlc2lnbiDigJQgYSBNb25nbyBzaGVsbCBjYW4gdHJ1bmNhdGUgYSBoYXNoIGNoYWluJ3MgdGFpbCwgYW5kIHRoZSBvYmplY3Qgc3RvcmVcbiAqIGhvbGRzIHRoZSBzaWduZWQgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24g4oCUIHNvIGEgaG9sZGVyIG9mIHRoaXNcbiAqIFJvbGUgY2FuIGRvIGJvdGguIFRoZSBwZXJtaXNzaW9ucyBzdGF5IFNFUEFSQVRFIGZvciBleGFjdGx5IHRoYXQgcmVhc29uOiBhXG4gKiBkZXBsb3ltZW50IHRoYXQgd2FudHMgdGhlbSBoZWxkIGJ5IGRpZmZlcmVudCBwZW9wbGUgY29tcG9zZXMgYSBuYXJyb3dlciBSb2xlXG4gKiBieSBoYW5kIChhIHN1cGVyYWRtaW4gbWF5IGluY2x1ZGUgYW55IHN5c3RlbS1vcmctb25seSBwZXJtaXNzaW9uIGluIGEgUm9sZVxuICogYXV0aG9yZWQgaW4gdGhlIHN5c3RlbSBvcmcpIGFuZCBhc3NpZ25zIHRoaXMgb25lIHRvIG5vYm9keS5cbiAqL1xuLyoqXG4gKiBQTEFURk9STSBPQlNFUlZFUiDigJQgbG9vaywgZG9uJ3QgdG91Y2guIFRoZSBsYWRkZXIncyBtaXNzaW5nIGJvdHRvbSBydW5nLlxuICpcbiAqIEV2ZXJ5IG90aGVyIHN5c3RlbS1vcmcgYnVuZGxlIGdyYW50cyBhIHdyaXRlLiBUaGUgb25lIHRoYXQgZG9lcyBub3Qg4oCUXG4gKiBDb25zb2xlIEFkbWluaXN0cmF0b3Ig4oCUIGdyYW50cyBhIHJlYWQgdGhhdCBJUyBhIGRhdGFiYXNlIHNoZWxsLiBTbyBzb21lYm9keVxuICogd2hvIHNob3VsZCBzZWUgdGhlIGRlcGxveW1lbnQgYW5kIGNoYW5nZSBub3RoaW5nIChhIG5ldyBvcGVyYXRvciBzaGFkb3dpbmcsIGFuXG4gKiBhdWRpdG9yLCBhbiBvbi1jYWxsIGVuZ2luZWVyIGR1cmluZyBhIGhhbmRvdmVyKSBoYWQgdHdvIG9wdGlvbnM6IFN1cGVyIEFkbWluLFxuICogb3Igbm90aGluZy4gVGhlIHVzdWFsIG91dGNvbWUgb2YgYSBjaG9pY2UgbGlrZSB0aGF0IGlzIHRoZSBmbGFnLlxuICpcbiAqIFN0cmljdGx5IHJlYWQtb25seSBieSBjb25zdHJ1Y3Rpb246IGV2ZXJ5IHBlcm1pc3Npb24gaGVyZSBlbmRzIGA6cmVhZGAsIHdoaWNoXG4gKiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIGNsYXNzaWZpZXMgYXMgYSByZWFkLCBzbyB0aGUgZGFzaGJvYXJkIGRpc2FibGVzIGV2ZXJ5XG4gKiB3cml0ZSBhZmZvcmRhbmNlIGZvciBhIGhvbGRlciByYXRoZXIgdGhhbiBvZmZlcmluZyBjb250cm9scyB0aGF0IDQwMy5cbiAqXG4gKiBOT1QgYGF1ZGl0OnJlYWRgLiBJdCB3b3VsZCBiZSB0aGUgb2J2aW91cyBhZGRpdGlvbiBhbmQgaXQgaXMgdGhlIHdyb25nIG9uZTpcbiAqIGBsaXN0QXVkaXRFdmVudHNgIHBpbnMgZXZlcnkgbm9uLXN1cGVyYWRtaW4gdG8gdGhlaXIgT1dOIG9yZywgc28gYSBzeXN0ZW0tb3JnXG4gKiBvYnNlcnZlciBob2xkaW5nIGl0IHdvdWxkIHNlZSB0aGUgc3lzdGVtIG9yZydzIGF1ZGl0IHRyYWlsIGFuZCBub3RoaW5nIGVsc2Ug4oCUXG4gKiBhbiBhZmZvcmRhbmNlIHRoYXQgbG9va3MgbGlrZSBmbGVldC13aWRlIGF1ZGl0IGFjY2VzcyBhbmQgaXMgbm90LiBSZWFkaW5nXG4gKiBhbm90aGVyIHRlbmFudCdzIHRyYWlsIGlzIGRlbGliZXJhdGVseSB0aGUgZmxhZydzIGFsb25lLlxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fT0JTRVJWRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsYXRmb3JtOnJlYWQnLFxuICAnb3JnczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgLy8gQSByZWFkLCBhbmQgdGhpcyBSb2xlIGlzIHJlYWRzIOKAlCB0aGUgcmVnaXN0cnkgYnJvd3NlciB3aXRoIG5laXRoZXIgb2YgdGhlXG4gIC8vIHR3byB3cml0ZSBydW5ncyAoYHJlZ2lzdHJ5OndyaXRlYCBjb3BpZXMsIGByZWdpc3RyeTpwdXJnZWAgZGVsZXRlcykuXG4gICdyZWdpc3RyeTpyZWFkJyxcbl07XG5cbmV4cG9ydCBjb25zdCBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLFxuICAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHNvIGEgaG9sZGVyIGNhbiBmaW5kIHRoZSBvcmcgdGhleSB3ZXJlIGFza2VkXG4gIC8vIGFib3V0IHdpdGhvdXQgYSBzZWNvbmQgUm9sZSDigJQgYW5kIG5vdGhpbmcgbW9yZS4gVGhpcyB3YXMgYHBsYXRmb3JtOnJlYWRgLFxuICAvLyB3aGljaCBtZWFudCBvcGVuaW5nIGEgZGF0YWJhc2UgY29uc29sZSBhbHNvIGdyYW50ZWQgdGhlIGRlcGxveSdzIG93blxuICAvLyBjb25maWd1cmF0aW9uLCBmb3Igbm8gcmVhc29uIGJleW9uZCB0aGUgdHdvIHNoYXJpbmcgYSBnYXRlLlxuICAnb3JnczpyZWFkJyxcbl07XG5cbi8qKlxuICogUkVHSVNUUlkgT1BFUkFUT1Ig4oCUIG1vdmVzIGNvbnRhaW5lciBpbWFnZXMgYXJvdW5kLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIFRIRSBHQVAgSVQgRklMTFMuIFByb21vdGluZyBhbiBpbWFnZSDigJQgY29weWluZyBhIGJ1aWx0IHRhZyBmcm9tIG9uZSByZXBvc2l0b3J5XG4gKiB0byB0aGUgb25lIGEgcmVsZWFzZSByZXNvbHZlcyDigJQgaXMgYSBqb2Igc29tZWJvZHkgZG9lcywgYW5kIHVudGlsIG5vdyB0aGUgb25seVxuICogaWRlbnRpdHkgdGhhdCBjb3VsZCBkbyBpdCB3YXMgYSBzdXBlcmFkbWluLiBgcmVnaXN0cnk6d3JpdGVgIGhhcyBubyBvdGhlclxuICogY2FycmllciwgYW5kIGEgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpc1xuICogc3VwZXJhZG1pbi1vbmx5IGluIHByYWN0aWNlICh0aGUgYHBsYXRmb3JtOnJlYWRgIGZhaWx1cmUsIHBpbm5lZCBieSB0aGVcbiAqIFwiYXQgbGVhc3Qgb25lIHNlZWRlZCBjYXJyaWVyXCIgYXNzZXJ0aW9uIGluIGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2ApLlxuICogU28gc3BsaXR0aW5nIGByZWdpc3RyeTpwdXJnZWAgb3V0IG9mIGByZWdpc3RyeTp3cml0ZWAgaXMgb25seSBoYWxmIHRoZSBjaGFuZ2U6XG4gKiB0aGUgYWRkaXRpdmUgaGFsZiBuZWVkcyBhIFJvbGUgb3IgdGhlIHNwbGl0IGJ1eXMgbm90aGluZy5cbiAqXG4gKiBXSFkgSVQgSVMgTk9UIFBBUlQgT0YgUExBVEZPUk0gT1BFUkFUT1IuIFRoYXQgUm9sZSBydW5zIHRoZSBkZXBsb3ltZW50IGFuZFxuICogYWxyZWFkeSByZWFkcyB0aGUgcmVnaXN0cnkuIFByb21vdGluZyBhbiBpbWFnZSBpcyBhIHJlbGVhc2UgZGVjaXNpb24sIG5vdCBhblxuICogb3BlcmF0aW9uYWwgc2lkZSBlZmZlY3QsIGFuZCByb2xsaW5nIGl0IGludG8gdGhlIFJvbGUgZXZlcnlvbmUgb24gY2FsbCBob2xkc1xuICogd291bGQgbWVhbiB0aGUgcGFnZXIgcm90YXRpb24gY2FuIHJldGFnIGEgcmVsZWFzZSBhdCAzYW0uIFRoZSB0d28gUm9sZXNcbiAqIGNvbXBvc2UgaW5zdGVhZCDigJQgYSBtZW1iZXIgbWF5IGhvbGQgYW55IG51bWJlciwgYW5kIHBlcm1pc3Npb25zIGFyZSB0aGUgdW5pb24uXG4gKlxuICogV0hZIElUIElTIE9OTFkgVFdPIFBFUk1JU1NJT05TLiBEZWxpYmVyYXRlbHkgbm90aGluZyBlbHNlOiBubyBgcGxhdGZvcm06cmVhZGAsXG4gKiBubyBjb25zb2xlLCBubyBgb3JnczpyZWFkYC4gYGNhblJlYWRSZXBvYC9gY2FuV3JpdGVSZXBvYCBjb25maW5lIGFcbiAqIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgaG9sZGVyIHRvIGBzeXN0ZW0vKmAsIGBsaWJyYXJ5LypgIGFuZCBgcHVibGljLypgIOKAlFxuICogdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIHNvIHRoZSBSb2xlIGNhbm5vdCByZWFjaCBhXG4gKiB0ZW5hbnQncyByZXBvc2l0b3JpZXMgYXQgYWxsLCBhbmQgYSBob2xkZXIgd2hvIGFsc28gbmVlZHMgdGhlIG9wZXJhdG9yIHZpZXdzXG4gKiBnZXRzIHRoZSBvcGVyYXRvciBSb2xlIHRvby4gSXQgZG9lcyBOT1QgY2FycnkgYHJlZ2lzdHJ5OnB1cmdlYCwgd2hpY2ggaXMgaW5cbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCBpbiBubyBidW5kbGUgYnkgZGVzaWduOiBhbiBpbWFnZVxuICogcHJvbW90ZXIgaGFzIG5vIGJ1c2luZXNzIGRlbGV0aW5nIHRoZSBpbWFnZSBhIHRlbmFudCdzIHBpcGVsaW5lIHJlc29sdmVzLlxuICovXG5leHBvcnQgY29uc3QgUkVHSVNUUllfT1BFUkFUT1JfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuICAncmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBTVVBQT1JUIEFHRU5UIOKAlCB0aGUgc3VwcG9ydCBkZXNrLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIERlbGliZXJhdGVseSBjYXJyaWVzIG5vIGBwbGF0Zm9ybTpyZWFkYCwgbm8gY29uc29sZSBhbmQgbm8gYmlsbGluZyB3cml0ZTogYW5cbiAqIGFnZW50IGFuc3dlcnMgY2FzZXMgYW5kIHdyaXRlcyB0aGUgY2FubmVkIHJlcGxpZXMuIGBzdWJzY3JpcHRpb25zOnJlYWRgIGlzXG4gKiBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IHF1ZXN0aW9uIG9uIGFueSBjYXNlIGlzIHdoYXQgdGhlIGN1c3RvbWVyIGlzIGVudGl0bGVkXG4gKiB0bywgYW5kIHdpdGhvdXQgaXQgYW4gYWdlbnQgd291bGQgaGF2ZSB0byBhc2sgc29tZW9uZSBlbHNlIHRvIGxvb2suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBORVcsIGFuZCB0aGUgZ2FwIHRoZSBzcGxpdCBleHBvc2VkOiBhbiBhZ2VudCB0cmlhZ2luZyBhIGNhc2UgbmVlZHMgdG8gZmluZFxuICAvLyB0aGUgY3VzdG9tZXIncyBvcmdhbml6YXRpb24uIFRoZSBvbmx5IHBlcm1pc3Npb24gdGhhdCBsaXN0ZWQgb3JncyB3YXNcbiAgLy8gYHBsYXRmb3JtOnJlYWRgLCB3aGljaCB3b3VsZCBhbHNvIGhhdmUgaGFuZGVkIGEgc3VwcG9ydCBhZ2VudCB0aGUgZGVwbG95J3NcbiAgLy8gaW50ZXJuYWxzIOKAlCBzbyB0aGV5IGhhZCBuZWl0aGVyLCBhbmQgaGFkIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAgJ29yZ3M6cmVhZCcsXG4gIC8vIFJlYWRpbmcgYW5kIGFuc3dlcmluZyB0aGUgY2FzZSBpdHNlbGYgcmlkZXMgdGhlIG9yZGluYXJ5IG1lc3NhZ2luZ1xuICAvLyBwZXJtaXNzaW9ucyDigJQgYSBzdXBwb3J0IGNhc2UgSVMgYSBtZXNzYWdlIHRocmVhZC5cbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnbWVzc2FnZXM6d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBTVVBQT1JUIExFQUQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIHBsdXMgdGhlIGF1dGhvcml0eSB0byBsb29rLlxuICpcbiAqIFRIRSBHQVAgSVQgRklMTFMuIGBpbXBlcnNvbmF0aW9uOm9wZW5gIGlzIHN5c3RlbS1vcmctb25seSwgYW5kIGEgc3lzdGVtLW9yZy1vbmx5XG4gKiBwZXJtaXNzaW9uIHdpdGggbm8gc2VlZGVkIGNhcnJpZXIgaXMgc3VwZXJhZG1pbi1vbmx5IGluIHByYWN0aWNlIOKAlCB0aGVcbiAqIGludmFyaWFudCBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgIGFzc2VydHMsIGFuZCB0aGUgcmVhc29uXG4gKiBgcGxhdGZvcm06cmVhZGAgc2hpcHBlZCB1bnVzYWJsZS4gV2l0aG91dCB0aGlzIFJvbGUsIHNwbGl0dGluZyBpbXBlcnNvbmF0aW9uXG4gKiBvdXQgb2YgdGhlIGZsYWcgd291bGQgY2hhbmdlIG5vdGhpbmc6IHRoZSBvbmx5IHdheSB0byBsZXQgc29tZWJvZHkgdmlldyBhXG4gKiBjdXN0b21lcidzIGFjY291bnQgd291bGQgc3RpbGwgYmUgdG8gbWFrZSB0aGVtIGEgZnVsbCBTdXBlciBBZG1pbiwgaGFuZGluZ1xuICogb3ZlciBgL2FkbWluL3VzZXJzLzppZC9ncmFudHNgLCB0aGUgc2luZ2xlLXBlcnNvbiBNRkEgcmVzZXQsIHRoZSBkYXRhYmFzZVxuICogY29uc29sZSBhbmQgYHJlZ2lzdHJ5OnB1cmdlYCBhdCB0aGUgc2FtZSB0aW1lLlxuICpcbiAqIFdIWSBJVCBJUyBUSEUgU1VQUE9SVCBERVNLIEFORCBOT1QgVEhFIE9QRVJBVE9SLiBUaGUgcXVlc3Rpb24gaW1wZXJzb25hdGlvblxuICogYW5zd2VycyBpcyBcIndoYXQgaXMgdGhpcyBjdXN0b21lciBhY3R1YWxseSBzZWVpbmc/XCIsIHdoaWNoIGlzIGEgc3VwcG9ydFxuICogcXVlc3Rpb24uIFBsYXRmb3JtIE9wZXJhdG9yIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kIGlzIGhlbGQgYnkgd2hvZXZlciBpcyBvblxuICogY2FsbDsgYWRkaW5nIHRoaXMgdG8gaXQgd291bGQgaGFuZCBldmVyeSByb3RhIG1lbWJlciB0aGUgYWJpbGl0eSB0byBiZWNvbWUgYW55XG4gKiBjdXN0b21lcidzIHVzZXIgYXQgM2FtLiBTdXBwb3J0IEFnZW50J3MgYnVuZGxlIHBsdXMgdGhlIG9uZSBwZXJtaXNzaW9uIGlzIHRoZVxuICogbmFycm93ZXIsIG1vcmUgaG9uZXN0IHNoYXBlIOKAlCBhbmQgYSBsZWFkIHdobyBhbHNvIHJ1bnMgdGhlIGRlcGxveW1lbnQgaG9sZHNcbiAqIGJvdGggUm9sZXMuXG4gKlxuICogV0hBVCBJVCBTVElMTCBDQU5OT1QgRE8uIEVtZXJnZW5jeSBhY2Nlc3M6IGBicmVha2dsYXNzYCBieXBhc3NlcyB0ZW5hbnRcbiAqIGNvbnNlbnQgYW5kIHN0YXlzIG9uIHRoZSBmbGFnLCBhcHByb3ZlZCBieSBhIHNlY29uZCBTdXBlciBBZG1pbi4gQW5kIHRoZVxuICogdGVuYW50IGNhbiByZWZ1c2Ug4oCUIGBpbXBlcnNvbmF0aW9uOm9wZW5gIGlzIHBlcm1pc3Npb24gdG8gQVNLLlxuICovXG5leHBvcnQgY29uc3QgU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC4uLlNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlMsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuXTtcblxuLyoqXG4gKiBTVEFSVElORyBQT0lOVFMgZm9yIGEgY3VzdG9tIFJvbGUgaW4gYSB0ZW5hbnQgb3JnIOKAlCB0ZW1wbGF0ZXMsIG5vdCBSb2xlcy5cbiAqXG4gKiBUSEUgR0FQIFRIRVkgRklMTC4gQW4gb3JnIHNlZWRzIGV4YWN0bHkgVFdPIFJvbGVzIOKAlCBNZW1iZXIgYW5kIEFkbWluIOKAlCBhbmRcbiAqIEFkbWluIGlzIGV2ZXJ5IG9yZy1hc3NpZ25hYmxlIHBlcm1pc3Npb24uIFNvIHByb21vdGluZyBhbnlvbmUgcGFzdCBcImF1dGhvciBhbmRcbiAqIHJlYWRcIiBoYW5kcyBvdmVyIHRoZSB3aG9sZSByZW1haW5kZXIgYXQgb25jZTogYG9yZ19rbXM6d3JpdGVgLFxuICogYG9yZ19pZHA6d3JpdGVgLCBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgLCBgYmlsbGluZzptYW5hZ2VgLCBgcm9sZXM6bWFuYWdlYFxuICogYW5kIGBhdWRpdDpyZWFkYCBhbW9uZyB0aGVtLiBUaGUgcHJvZHVjdCdzIGFuc3dlciBpcyBcImF1dGhvciBhIGN1c3RvbSBSb2xlXCIsXG4gKiBhbmQgdGhlIHNhZmV0eSBpcyBhbHJlYWR5IHJpZ2h0IChgc2FuaXRpemVQZXJtaXNzaW9uc2AgYm91bmRzIGEgY3VzdG9tIFJvbGUgYnlcbiAqIGl0cyBhdXRob3IncyBvd24gY2VpbGluZykuIFdoYXQgd2FzIG1pc3NpbmcgaXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIFRoZSBleGFjdCBzaXplcyBvZiB0aGF0IGNsaWZmIGFyZSBhc3NlcnRlZCBpbiBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYFxuICogcmF0aGVyIHRoYW4gd3JpdHRlbiBoZXJlLiBUaGlzIHBhcmFncmFwaCB1c2VkIHRvIGNhcnJ5IHRoZW0gaW5saW5lIOKAlCBcInRocmVlXG4gKiBSb2xlczogTWVtYmVyICgxNSksIFRlYW0gTGVhZCAoMTcpIGFuZCBBZG1pbiAoMzcpXCIg4oCUIGFuZCBldmVyeSBvbmUgb2YgdGhvc2VcbiAqIG51bWJlcnMgd2VudCBzdGFsZTogYFRlYW0gTGVhZGAgc3RvcHBlZCBiZWluZyBzZWVkZWQgd2hlbiBpdCBiZWNhbWUgdGhlIGZpcnN0XG4gKiB0ZW1wbGF0ZSBiZWxvdywgYW5kIHRoZSB0d28gYnVuZGxlcyBoYXZlIGdyb3duIHNpbmNlLiBBIGNvdW50IG5vdGhpbmcgY2hlY2tzXG4gKiBpcyBhIGNsYWltIHRoYXQgZGVjYXlzLCBhbmQgdGhpcyBvbmUgd2FzIHRoZSBzdGF0ZWQgcmF0aW9uYWxlIGZvciB0aGUgZmVhdHVyZS5cbiAqXG4gKiBXSFkgVEVNUExBVEVTIEFORCBOT1QgU0VFREVEIFJPTEVTLiBBIHNlZWRlZCBidWlsdC1pbiBpcyBgc3lzdGVtOiB0cnVlYCBhbmRcbiAqIHRoZXJlZm9yZSBpbW11dGFibGUsIHNvIHNlZWRpbmcgdGhlc2Ugd291bGQgcHV0IGZvdXIgdW5kZWxldGFibGUgcm93cyBpbiBldmVyeVxuICogb3JnIHdoZXRoZXIgaXQgd2FudHMgdGhlbS4gQSB0ZW1wbGF0ZSBsZWF2ZXMgbm8gdHJhY2UgdW50aWwgc29tZW9uZSB1c2VzIGl0LFxuICogYW5kIHdoYXQgaXQgcHJvZHVjZXMgaXMgYW4gb3JkaW5hcnkgY3VzdG9tIFJvbGUgdGhlIG9yZyBmdWxseSBvd25zIOKAlCBlZGl0YWJsZSxcbiAqIGRlbGV0YWJsZSwgYW5kIGJvdW5kZWQgYnkgdGhlIGF1dGhvcidzIGNlaWxpbmcgbGlrZSBhbnkgb3RoZXIuXG4gKlxuICogV0hBVCBUSEVZIERFTElCRVJBVEVMWSBFWENMVURFLiBgcm9sZXM6bWFuYWdlYCBpcyBpbiBub25lIG9mIHRoZW0uIEl0IGlzIHRoZVxuICogb25lIHBlcm1pc3Npb24gdGhhdCBjb21wb3VuZHMg4oCUIHRoZSBob2xkZXIgY2FuIG1pbnQgZnVydGhlciBSb2xlcywgdXAgdG8gdGhlaXJcbiAqIG93biBjZWlsaW5nIOKAlCBzbyBhY3F1aXJpbmcgaXQgc2hvdWxkIHN0YXkgYSBjb25zY2lvdXMgYWN0IHJhdGhlciB0aGFuIGEgc2lkZVxuICogZWZmZWN0IG9mIHBpY2tpbmcgYSBwcmVzZXQuIEV2ZXJ5IHBlcm1pc3Npb24gaGVyZSBpcyBvcmctYXNzaWduYWJsZSwgc28gYVxuICogdGVtcGxhdGUgaXMgdmFsaWQgaW4gYW55IG9yZyBhbmQgYHNhbml0aXplUGVybWlzc2lvbnNgIGFjY2VwdHMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVRlbXBsYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgam9iIGlzIOKAlCBzaG93biBuZXh0IHRvIHRoZSB0ZW1wbGF0ZSwgYW5kIGEgc2Vuc2libGUgUm9sZSBkZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXTtcbn1cblxuZXhwb3J0IGNvbnN0IFJPTEVfVEVNUExBVEVTOiByZWFkb25seSBSb2xlVGVtcGxhdGVbXSA9IFtcbiAge1xuICAgIC8vIFdhcyBhIFNFRURFRCBSb2xlIGluIGV2ZXJ5IG9yZyB1bnRpbCBpdCBiZWNhbWUgYSB0ZW1wbGF0ZS4gSXQgaXMgdGhlIG9ubHlcbiAgICAvLyBidWlsdC1pbiB0aGF0IHdhcyBhIGpvYiBkZXNjcmlwdGlvbiByYXRoZXIgdGhhbiBhIHN0cnVjdHVyYWwgcmVxdWlyZW1lbnQ6XG4gICAgLy8gU3VwZXIgQWRtaW4gaXMgd2hlcmUgYGlzU3VwZXJBZG1pbmAgaXMgZGVyaXZlZCBmcm9tLCBBZG1pbiBhbmQgTWVtYmVyIGFyZVxuICAgIC8vIHRoZSBmbG9vciBhbiBvcmcgaXMgdW51c2FibGUgd2l0aG91dCwgYW5kIHRoZSBzeXN0ZW0tb3JnIFJvbGVzIGNhcnJ5XG4gICAgLy8gcGVybWlzc2lvbnMgbm8gY3VzdG9tIFJvbGUgbWF5IGhvbGQuIFRlYW0gTGVhZCB3YXMgbm9uZSBvZiB0aG9zZSDigJQgaXQgaXNcbiAgICAvLyBgbWVtYmVyYCBwbHVzIHR3byByZXBvcnQgcGVybWlzc2lvbnMsIGFuZCBhbiBvcmcgdGhhdCBkb2VzIG5vdCBkZWxlZ2F0ZVxuICAgIC8vIHJlcG9ydCBhdXRob3JpbmcgaGFkIGFuIHVuZGVsZXRhYmxlIHJvdyBmb3IgaXQgYW55d2F5LlxuICAgIC8vXG4gICAgLy8gQ09OU0VRVUVOQ0UsIHN0YXRlZCByYXRoZXIgdGhhbiBkaXNjb3ZlcmVkOiBhIG5ldyBvcmcgbm8gbG9uZ2VyIGhhcyBhIFJvbGVcbiAgICAvLyB0aGF0IGdyYW50cyBgcmVwb3J0czp3cml0ZWAgdG8gYSBub24tYWRtaW4uIEFuIGFkbWluIGhvbGRzIGJvdGggcGVybWlzc2lvbnNcbiAgICAvLyAodGhleSBhcmUgaW4gdGhlIGFkbWluIGJ1bmRsZSkgYW5kIGluc3RhbnRpYXRlcyB0aGlzIHRlbXBsYXRlIHRvIGRlbGVnYXRlXG4gICAgLy8gdGhlbSDigJQgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGZvdXIgYmVsb3cuIE9yZ3MgdGhhdCBhbHJlYWR5IGhhdmUgdGhlIHNlZWRlZFxuICAgIC8vIFJvbGUga2VlcCBpdCwgYW5kIHRoZSBiYWNrZmlsbCBrZWVwcyBpdHMgYnVuZGxlIGN1cnJlbnQuXG4gICAgaWQ6ICd0ZWFtLWxlYWQnLFxuICAgIG5hbWU6ICdUZWFtIExlYWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnQXV0aG9ycyBhbmQgc2hhcmVzIHN0YWtlaG9sZGVyIHJlcG9ydHMgZm9yIGEgdGVhbSwgd2l0aG91dCBvcmctYWRtaW4gYWNjZXNzLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdyZXBvcnRzOndyaXRlJywgJ3JlcG9ydHM6cHVibGlzaCddLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogTUVNQkVSIEFMUkVBRFkgSVMgVEhFIERFVkVMT1BFUiBST0xFIOKAlCB0aGlzIHRlbXBsYXRlIGV4aXN0cyBmb3Igd2hhdCBpdFxuICAgICAqIGRvZXMgTk9UIGNvdmVyLlxuICAgICAqXG4gICAgICogRXZlcnl0aGluZyBpbiBhIGRldmVsb3BlcidzIGxvb3AgaXMgYHBpcGVsaW5lczpyZWFkYCArIGBwaXBlbGluZXM6d3JpdGVgLFxuICAgICAqIGJvdGggaW4gdGhlIG1lbWJlciBidW5kbGU6IGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIHJ1biwgc3RvcCwgdGhlIGJ1bGtcbiAgICAgKiBvcHMsIEFJIGdlbmVyYXRpb24gKGAvcGlwZWxpbmVzL2dlbmVyYXRlYCwgaW5jbC4gZnJvbS11cmwgYW5kIHN0cmVhbWluZyksXG4gICAgICogdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBwbHVzIGB0ZW1wbGF0ZXM6cmVhZGAgdG8gaW5zdGFudGlhdGUgYW5kXG4gICAgICogYHBsdWdpbnM6aW5zdGFsbGAgdG8gYWRkIGEgcGx1Z2luLiBBIHRlbXBsYXRlIHJlc3RhdGluZyB0aGF0IHdvdWxkIGJ1eVxuICAgICAqIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBXaGF0IGEgZGV2ZWxvcGVyIGhpdHMgdGhlIGNsaWZmIG9uIGlzIHRoZSBTRUxGLVNFUlZJQ0Ugb3BlcmF0ZSBwYWlyOiB0aGV5XG4gICAgICogY2FuIHJlYWQgdGhlaXIgc2VydmljZSdzIGRhc2hib2FyZHMgYW5kIG1ldHJpY3MgYW5kIGNhbm5vdCBjaGFuZ2UgZWl0aGVyLFxuICAgICAqIGJlY2F1c2UgYm90aCB3cml0ZXMgc2l0IGluIHRoZSBhZG1pbiBidW5kbGUuIFNvIHRoZSBwZXJzb24gd2hvIG93bnMgYVxuICAgICAqIHBpcGVsaW5lIGZpbGVzIGEgdGlja2V0IHRvIGdldCBhbiBhbGVydCBvbiBpdC5cbiAgICAgKlxuICAgICAqIERFTElCRVJBVEVMWSBOT1QgSEVSRS4gYGxvZ3M6ZXhwb3J0YCDigJQgdmlld2luZyBsb2dzIHJpZGVzXG4gICAgICogYG9ic2VydmFiaWxpdHk6cmVhZGAsIGJ1dCBkb3dubG9hZGluZyB0aGVtIGlzIGJ1bGsgZWdyZXNzIGFuIG9yZyBtYXlcbiAgICAgKiB3aXRoaG9sZCBmcm9tIG1lbWJlcnMgKGRvY3MvcGVybWlzc2lvbnMubWQpLCBhbmQgYSB0ZW1wbGF0ZSBhaW1lZCBhdCBldmVyeVxuICAgICAqIGVuZ2luZWVyIHdvdWxkIHJldmVyc2UgdGhhdC4gYHBpcGVsaW5lczpwdWJsaXNoYCDigJQgc2hhcmluZyBiZXlvbmQgdGhlXG4gICAgICogYXV0aG9yIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgd2hpY2ggaXMgUmVsZWFzZSBNYW5hZ2VyJ3MgYmVsb3c7IHNvbWVib2R5XG4gICAgICogd2hvIGRvZXMgYm90aCBob2xkcyBib3RoIFJvbGVzLlxuICAgICAqL1xuICAgIGlkOiAnZGV2ZWxvcGVyJyxcbiAgICBuYW1lOiAnRGV2ZWxvcGVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0J1aWxkcyBhbmQgcnVucyBwaXBlbGluZXMsIGFuZCBvd25zIHRoZSBkYXNoYm9hcmRzIGFuZCBhbGVydHMgZm9yIHdoYXQgdGhleSBidWlsZC4nLFxuICAgIHBlcm1pc3Npb25zOiBbLi4uTUVNQkVSX1BFUk1JU1NJT05TLCAnZGFzaGJvYXJkczp3cml0ZScsICdvYnNlcnZhYmlsaXR5OndyaXRlJ10sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3JlbGVhc2UtbWFuYWdlcicsXG4gICAgbmFtZTogJ1JlbGVhc2UgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdEZWNpZGVzIHdoYXQgYmVjb21lcyBzaGFyZWQgYmV5b25kIGl0cyBhdXRob3IsIGFuZCBhcHByb3ZlcyBwbHVnaW4gaW5zdGFsbHMuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczpwdWJsaXNoJyxcbiAgICAgICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6cHVibGlzaCcsXG4gICAgICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6cHVibGlzaCcsXG4gICAgICAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAnc2VjdXJpdHktb2ZmaWNlcicsXG4gICAgbmFtZTogJ1NlY3VyaXR5IE9mZmljZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnSWRlbnRpdHksIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIGV2aWRlbmNlIHRyYWlsIOKAlCB0aGUgc3VyZmFjZSBhbiBhdWRpdG9yIGFza3MgYWJvdXQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2F1ZGl0OnJlYWQnLCAnbG9nczpleHBvcnQnLFxuICAgICAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgICAgICdvcmdfaWRwOndyaXRlJywgJ29yZ19rbXM6d3JpdGUnLCAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLFxuICAgICAgLy8gT3duaW5nIHRoZSBpbXBlcnNvbmF0aW9uIFBPTElDWSAoYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCkgd2l0aG91dFxuICAgICAgLy8gYmVpbmcgYWJsZSB0byBhbnN3ZXIgYSBSRVFVRVNUIHdhcyB0aGUgYXN5bW1ldHJ5IHRoZSBjb25zZW50IGZsb3cgbGVmdFxuICAgICAgLy8gYmVoaW5kOiB0aGUgbGVzc2VyIGFjdCBoYWQgYSBwZXJtaXNzaW9uIG9mIGl0cyBvd24gYW5kIHRoZSBncmVhdGVyIG9uZVxuICAgICAgLy8gaGFkIG5vbmUuIFdob2V2ZXIgZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgcmVxdWlyZWQgc2hvdWxkIGJlIGFibGUgdG9cbiAgICAgIC8vIGdpdmUgb3Igd2l0aGhvbGQgaXQuXG4gICAgICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwZW9wbGUtbWFuYWdlcicsXG4gICAgbmFtZTogJ1Blb3BsZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSByb3N0ZXIgYW5kIGl0cyBtYWNoaW5lIGNyZWRlbnRpYWxzLCBhY3Jvc3MgdGhlIGFjY291bnRcXHUyMDE5cyB0ZWFtcyDigJQgd2l0aG91dCB0aGUgb3JnXFx1MjAxOXMgc2V0dGluZ3Mgb3IgaXRzIG1vbmV5LicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdtZW1iZXJzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAgICAgLy8gVGhlIHNhbWUgam9iLCBvbmUgbGV2ZWwgZG93bjogZW50ZXJpbmcgYSBkZXNjZW5kYW50IHRlYW0gdG8gd29yayBvbiBpdHNcbiAgICAgIC8vIHJvc3RlciwgYW5kIHZpZXdpbmcgb25lIG9mIGl0cyBtZW1iZXJzIGFzIHRoYXQgbWVtYmVyLiBXaXRob3V0IGl0IGFcbiAgICAgIC8vIHBlb3BsZSBtYW5hZ2VyIGluIGEgcGFyZW50IG9yZyBjYW4gYWRtaW5pc3RlciB0aGUgYWNjb3VudCdzIHRlYW1zIG9uXG4gICAgICAvLyBwYXBlciBhbmQgbm90IHJlYWNoIHRoZW0uXG4gICAgICAndGVhbV9hY2Nlc3M6b3BlbicsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAnYmlsbGluZy1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnQmlsbGluZyBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBzdWJzY3JpcHRpb24sIHNlYXRzIGFuZCBpbnZvaWNlcyBmb3IgdGhpcyBvcmdhbml6YXRpb24uJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2JpbGxpbmc6cmVhZCcsICdiaWxsaW5nOm1hbmFnZScsICdxdW90YXM6cmVhZCcsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIC8qKlxuICAgICAqIFRoZSBqb2IgdGhlIGltcGVyc29uYXRpb24gY29uc2VudCBmbG93IGNyZWF0ZWQgSU5TSURFIHRoZSB0ZW5hbnQ6IHRoZVxuICAgICAqIG5hbWVkIHBlcnNvbiB3aG8gYW5zd2VycyBcIm1heSBhIHN1cHBvcnQgZW5naW5lZXIgdmlldyB0aGlzIGFjY291bnQ/XCIgYW5kXG4gICAgICogY2FuIGFmdGVyd2FyZHMgcmVhZCB3aGF0IGhhcHBlbmVkLlxuICAgICAqXG4gICAgICogSXQgZXhpc3RzIGFzIGEgdGVtcGxhdGUgYmVjYXVzZSBgaW1wZXJzb25hdGlvbjphcHByb3ZlYCBpcyBpbiB0aGUgYWRtaW5cbiAgICAgKiBhbmQgb3duZXIgYnVuZGxlcyDigJQgc28gYnkgZGVmYXVsdCBldmVyeSBhZG1pbiBtYXkgY29uc2VudCDigJQgYW5kIHRoZSB3aG9sZVxuICAgICAqIHBvaW50IG9mIHNwbGl0dGluZyBpdCBvdXQgd2FzIHRvIGxldCBhbiBvcmcgc2F5IFwidGhpcyBkZWNpc2lvbiBpcyBvbmVcbiAgICAgKiBwZXJzb24nc1wiLiBEb2luZyB0aGF0IG1lYW5zIGF1dGhvcmluZyBhIFJvbGUgdGhhdCBob2xkcyBpdCBhbmQgdGFraW5nIGl0XG4gICAgICogb2ZmIHRoZSBvdGhlcnMsIGFuZCBoYW5kLWNvbXBvc2luZyB3YXMgdGhlIG9ubHkgcm91dGUuXG4gICAgICpcbiAgICAgKiBUd28gcGVybWlzc2lvbnMgYW5kIG5vIG1vcmU6IGFwcHJvdmluZyBpcyBub3QgYWRtaW5pc3RlcmluZy4gYGF1ZGl0OnJlYWRgXG4gICAgICogaXMgaGVyZSBiZWNhdXNlIGNvbnNlbnRpbmcgd2l0aG91dCBiZWluZyBhYmxlIHRvIGNoZWNrIHdoYXQgdGhlIHNlc3Npb25cbiAgICAgKiB0aGVuIGRpZCBpcyBjb25zZW50IGluIG5hbWUgb25seS5cbiAgICAgKi9cbiAgICBpZDogJ2FjY2Vzcy1hcHByb3ZlcicsXG4gICAgbmFtZTogJ0FjY2VzcyBBcHByb3ZlcicsXG4gICAgZGVzY3JpcHRpb246ICdBbnN3ZXJzIHJlcXVlc3RzIHRvIHZpZXcgdGhpcyBvcmdhbml6YXRpb25cXHUyMDE5cyBhY2NvdW50cywgYW5kIHJlYWRzIHRoZSB0cmFpbCBvZiB3aGF0IGhhcHBlbmVkLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLCAnYXVkaXQ6cmVhZCcsXG4gICAgXSxcbiAgfSxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSDigJQgdGhlIE1PREVSQVRJT04gam9iLlxuICpcbiAqIEl0IGNhcnJpZXMgYHBsdWdpbnM6bW9kZXJhdGVgIGFuZCBOT1QgYHB1Ymxpc2hlcnM6dmVyaWZ5YCwgYmVjYXVzZSB0aGUgdHdvIGFyZVxuICogbm90IHBlZXJzLiBgcGx1Z2luczptb2RlcmF0ZWAgaXMgdGhlIHdpZGUgc3VyZmFjZTogeWFuayBhIHZlcnNpb24gKHdoaWNoXG4gKiBicmVha3MgcGlwZWxpbmVzIGFscmVhZHkgcnVubmluZyBpdCksIHB1Ymxpc2ggYW4gYWR2aXNvcnkgKHdoaWNoIGFsYXJtcyBldmVyeVxuICogY29uc3VtZXIgb2YgYSBsaXN0aW5nKSwgcmV3cml0ZSB0aGUgYXV0by1hcHByb3ZhbCBydWxlcyAod2hpY2ggZGVjaWRlIHdoYXRcbiAqIHB1Ymxpc2hlcyB3aXRoIG5vIGh1bWFuIHJldmlldyBhdCBhbGwpLCByZXNlcnZlIG5hbWVzLCBtb2RlcmF0ZSByZXZpZXdzLFxuICogcmUtc2lnbi4gYHB1Ymxpc2hlcnM6dmVyaWZ5YCBpcyB0aHJlZSByb3V0ZXMg4oCUIHN1c3BlbmQsIHVuc3VzcGVuZCwgdGllciDigJQgYnV0XG4gKiBvbmUgb2YgdGhlbSBHUkFOVFMgVkVSSUZJRUQgU1RBVFVTLCB3aGljaCBpcyB0aGUgYmFkZ2UgY29uc3VtZXJzIHJlYWQgYXMgXCJ0aGlzXG4gKiBkZXBsb3ltZW50IHZvdWNoZXMgZm9yIHRoZSBwdWJsaXNoZXJcIi5cbiAqXG4gKiBCdW5kbGluZyB0aGVtLCBhcyB0aGlzIFJvbGUgdXNlZCB0bywgbWVhbnQgZXZlcnlvbmUgaGlyZWQgdG8gdHJpYWdlIHRoZSBxdWV1ZVxuICogY291bGQgYWxzbyBtaW50IGEgVmVyaWZpZWQgcHVibGlzaGVyLiBUaHJlZSBtZWNoYW5pc21zIGFscmVhZHkgYXNzdW1lIHRoZVxuICogc3BsaXQgY2FuIGJpbmQg4oCUIGByZXF1aXJlZERlY2lzaW9uUGVybWlzc2lvbmAgcGVyIHJlcXVlc3Qga2luZCwgdGhlIHF1ZXVlJ3NcbiAqIHBlci1yb3cgYGNhbihyZXF1aXJlZFBlcm1pc3Npb24pYCwgYW5kIHRoZSBhcHByb3Zlci1zaG9ydGFnZSBjb3VudHMgdGhhdFxuICogYEVjb3N5c3RlbUVsaWdpYmlsaXR5YCB0cmFja3MgU0VQQVJBVEVMWSBmb3IgZWFjaCBwZXJtaXNzaW9uIOKAlCBhbmQgd2l0aCBvbmVcbiAqIGNvbWJpbmVkIFJvbGUgbm9uZSBvZiB0aGVtIGNvdWxkIGV2ZXIgZGlzY3JpbWluYXRlLlxuICpcbiAqIHtAbGluayBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlN9IGlzIHRoZSBvdGhlciBoYWxmLlxuICovXG5leHBvcnQgY29uc3QgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6cmVhZCcsXG4gICdwbHVnaW5zOm1vZGVyYXRlJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlB1Ymxpc2hlciBWZXJpZmllclwiIFJvbGUg4oCUIHRoZSBUUlVTVCBkZWNpc2lvbi5cbiAqXG4gKiBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgZWNvc3lzdGVtIHNwbGl0IGRlc2NyaWJlZCBvblxuICoge0BsaW5rIEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TfTogd2hvIG1heSBhd2FyZCBWZXJpZmllZCwgc3VzcGVuZCBhXG4gKiBwdWJsaXNoZXIgYW5kIGxpZnQgYSBzdXNwZW5zaW9uLiBDYXJyaWVzIGBwbHVnaW5zOnJlYWRgIHNvIHRoZSBob2xkZXIgY2FuIHNlZVxuICogd2hhdCBhIHB1Ymxpc2hlciBzaGlwcyBiZWZvcmUgdm91Y2hpbmcgZm9yIHRoZW0sIGFuZCB0aGUgc2FtZSB0d28gYW1iaWVudFxuICogcmVhZHMgYXMgaXRzIHNpYmxpbmcuXG4gKlxuICogU1RBRkYgQVQgTEVBU1QgVFdPIFBFT1BMRS4gQSBWZXJpZmllZCBhcHBsaWNhdGlvbiBhbmQgYW4gdW5zdXNwZW5kIGFyZSBib3RoXG4gKiBgbmVlZHNUd29QZXJzb25gLCBhbmQgYGNvbmZsaWN0T2ZJbnRlcmVzdGAgcmVmdXNlcyB0aGUgc2FtZSBwZXJzb24gdHdpY2UsIHNvIGFcbiAqIHNpbmdsZSBob2xkZXIgY2Fubm90IGNvbXBsZXRlIGVpdGhlciBkZWNpc2lvbiBhbG9uZS4gVGhlIGNvbnNvbGUncyBhcHByb3ZlclxuICogc3RhbmRpbmcgbm90aWNlIGlzIHdoYXQgc3VyZmFjZXMgdGhhdCBzaG9ydGFnZSDigJQgYW5kIHNwbGl0dGluZyB0aGlzIFJvbGUgb3V0XG4gKiBpcyB3aGF0IGZpbmFsbHkgbGV0cyB0aGF0IG5vdGljZSByZXBvcnQgYSBmaWd1cmUgaXRzIHNpYmxpbmcncyBkb2VzIG5vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczpyZWFkJyxcbiAgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlRlYW0gTGVhZFwiIFJvbGUg4oCUIHRoZSBwZXJzb24gd2hvIHJlcG9ydHMgVVBXQVJELlxuICpcbiAqIEV4aXN0cyBiZWNhdXNlIHRoZSB0YXJnZXQgdXNlciBmb3Igc3Rha2Vob2xkZXIgcmVwb3J0cyBpcyBhIGxlYWQsIG5vdCBhbiBhZG1pbixcbiAqIGFuZCBncmFudGluZyBgcmVwb3J0czp3cml0ZWAgb25seSB0aHJvdWdoIHRoZSBhZG1pbiBidW5kbGUgd291bGQgaGF2ZSBmb3JjZWRcbiAqIGV2ZXJ5IHJlcG9ydGluZyBsZWFkIHRvIGJlIGFuIG9yZyBhZG1pbiAobWVtYmVyczptYW5hZ2UsIHJvbGVzOm1hbmFnZSxcbiAqIG9yZ19zZXR0aW5nczp3cml0ZSwgYmlsbGluZykgdG8gc2VuZCB0aGVpciBtYW5hZ2VyIGEgd2Vla2x5IHN1bW1hcnkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogYHJlcG9ydHM6cm9sbHVwYC4gUm9sbGluZyBhIHJlcG9ydCB1cCBvdmVyIGRlc2NlbmRhbnRcbiAqIHRlYW1zIGlzIGRvd253YXJkIHZpc2liaWxpdHkgYWNyb3NzIHRoZSBvcmcgdHJlZSwgd2hpY2ggaXMgYSBncmFudGVkIGNhcGFiaWxpdHlcbiAqIGluIHRoaXMgbW9kZWwsIG5vdCBzb21ldGhpbmcgYSB0ZWFtJ3Mgb3duIGxlYWQgZ2V0cyBieSBkZWZhdWx0IOKAlCBhIGxlYWQgb2YgYVxuICogUEFSRU5UIG9yZyBpcyBncmFudGVkIGl0IGV4cGxpY2l0bHkuIFRoZSBSb2xlIGdyYW50cyB0aGUgY29hcnNlIGBtZW1iZXJgIGxhYmVsXG4gKiBhbmQgbmV2ZXIgc2V0cyBgaXNTdXBlckFkbWluYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fTEVBRF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAuLi5NRU1CRVJfUEVSTUlTU0lPTlMsXG4gICdyZXBvcnRzOndyaXRlJyxcbiAgJ3JlcG9ydHM6cHVibGlzaCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQaXBlbGluZSBBdXRvbWF0aW9uXCIgUm9sZSDigJQgd2hhdCB0aGUgb3JnJ3NcbiAqIHVuc2NvcGVkIHN0b3JlZCBjcmVkZW50aWFsICh0aGUgYHBsYXRmb3JtLWF1dG9tYXRpb25gIHNlcnZpY2UgYWNjb3VudCB0aGF0XG4gKiBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucykgbmVlZHMsIGFuZCBub3RoaW5nIG1vcmUuXG4gKlxuICogRGVyaXZlZCBieSB0cmFjaW5nIGV2ZXJ5IGNhbGwgbWFkZSB3aXRoIHRoYXQga2V5LCBub3QgYnkgZ3Vlc3Npbmc6XG4gKiAgLSBgcGlwZWxpbmVzOnJlYWRgIOKAlCB0aGUgQ29kZUJ1aWxkIHN5bnRoIChhbmQgYHBpcGVsaW5lIGRlcGxveSAtLXN0b3JlLXRva2Vuc2ApXG4gKiAgICBmZXRjaGluZyB0aGUgcGlwZWxpbmUgaXQgYnVpbGRzIChgR0VUIC9waXBlbGluZXMvOmlkYCk7XG4gKiAgLSBgcGx1Z2luczpyZWFkYCAgIOKAlCBwbHVnaW4gcmVzb2x1dGlvbiBhdCBzeW50aC9kZXBsb3kgYW5kIGluIHRoZSBwbHVnaW4tbG9va3VwXG4gKiAgICBMYW1iZGEgKGBQT1NUIC9wbHVnaW5zL2xvb2t1cGApLCBhbmQgdGhlIHJ1bi10aW1lIHZ1bG5lcmFiaWxpdHkgY2hlY2sgc3RlcFxuICogICAgKGBQT1NUIC9wbHVnaW5zL3J1bnRpbWUtY2hlY2tgKS5cbiAqXG4gKiBXaGF0IGl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBjYXJyeSwgYW5kIHdoZXJlIHRoYXQgd29yayB3ZW50OlxuICogIC0gcmVnaXN0cnkgd3JpdGVzIChgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGVgKSDigJQgdGhlIHN5bnRoIHJlZ2lzdGVycyBpdHMgc3RlcFxuICogICAgbWFuaWZlc3Qgd2l0aCB0aGUgc2VwYXJhdGUgYHBpcGVsaW5lLXJlZ2lzdGVyYCBrZXkgKFBpcGVsaW5lIFJlZ2lzdHJhdGlvbik7XG4gKiAgLSBpbWFnZSBwdXNoZXMgYW5kIHB1bGxzIOKAlCBDb2RlQnVpbGQgYXV0aGVudGljYXRlcyB0byB0aGUgaW1hZ2UgcmVnaXN0cnkgd2l0aFxuICogICAgdGhlIGByZWdpc3RyeS1wdXNoYCBzY29wZWQga2V5LCBuZXZlciB0aGlzIG9uZTtcbiAqICAtIHJlcG9ydGluZyB3cml0ZXMg4oCUIHRoZSBldmVudHMgTGFtYmRhIGFuZCBzdGVwIHJlcG9ydCB1cGxvYWRzIHVzZSB0aGVcbiAqICAgIGByZXBvcnRpbmc6aW5nZXN0YCBzY29wZWQga2V5LlxuICpcbiAqIEl0IHVzZWQgdG8gYmUgdGhlIG9yZyBBRE1JTiBSb2xlLCBzbyBhIGxlYWtlZCBzeW50aCBjcmVkZW50aWFsIGNvdWxkIHJld3JpdGVcbiAqIGV2ZXJ5IHBpcGVsaW5lLCBSb2xlIGFuZCBtZW1iZXIgb2YgdGhlIG9yZy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX0FVVE9NQVRJT05fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJyxcbiAgJ3BsdWdpbnM6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQaXBlbGluZSBSZWdpc3RyYXRpb25cIiBSb2xlLCBoZWxkIGJ5IHRoZVxuICogYHBpcGVsaW5lLXJlZ2lzdGVyYCBzZXJ2aWNlIGFjY291bnQ6IGBQT1NUYC9gREVMRVRFIC9waXBlbGluZXMvcmVnaXN0cnlgIGZvclxuICogaXRzIG93biBvcmcgYW5kIG5vdGhpbmcgZWxzZSDigJQgbm90IGV2ZW4gYSByZWFkLlxuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdXNlcidzIGVmZmVjdGl2ZSBvcmcgcGVybWlzc2lvbnMgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbS5cbiAqXG4gKiBTaW5nbGUtc291cmNlIG1vZGVsOiBhIHVzZXIncyBhYmlsaXRpZXMgYXJlIEVYQUNUTFkgdGhlIHVuaW9uIG9mIHRoZVxuICogcGVybWlzc2lvbnMgY2FycmllZCBieSB0aGUgUm9sZXMgdGhleSBob2xkIChhIFJvbGUgPSBhIG5hbWVkIHBlcm1pc3Npb24gc2V0O1xuICogYnVpbHQtaW4gUm9sZXMgY2FycnkgdGhlaXIgYnVuZGxlIGV4cGxpY2l0bHksIHNlZWRlZCBmcm9tXG4gKiB7QGxpbmsgUk9MRV9QRVJNSVNTSU9OU30pLiBUaGVyZSBpcyBubyBzZXBhcmF0ZSByb2xlLWRlcml2ZWQgYmFzZWxpbmUg4oCUIHRoZVxuICogY29hcnNlIGByb2xlYCBsYWJlbCBncmFudHMgbm90aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIDEuIFBsYXRmb3JtIHN1cGVyYWRtaW5zIChgaXNTdXBlckFkbWluYCkgYWx3YXlzIGdldCBBTEwgcGVybWlzc2lvbnMuXG4gKiAyLiBPdGhlcndpc2UsIHVuaW9uIGV2ZXJ5IHBlcm1pc3Npb24gZ3JhbnRlZCBieSB0aGUgdXNlcidzIGFzc2lnbmVkIFJvbGVzLlxuICogMy4gSW52YWxpZC91bmtub3duIHBlcm1pc3Npb24gc3RyaW5ncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRQZXJtaXNzaW9ucyAtIEZsYXR0ZW5lZCBwZXJtaXNzaW9ucyBmcm9tIGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaG9sZHNcbiAqIEBwYXJhbSBpc1N1cGVyQWRtaW4gLSBXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqIEByZXR1cm5zIEVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBpbiBjYW5vbmljYWwgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVc2VyUGVybWlzc2lvbnMoXG4gIGFzc2lnbmVkUGVybWlzc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gWy4uLkFMTF9QRVJNSVNTSU9OU107XG5cbiAgY29uc3QgcGVybXMgPSBuZXcgU2V0PFBlcm1pc3Npb24+KCk7XG4gIGlmIChhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICAgIGlmIChpc1ZhbGlkUGVybWlzc2lvbihwKSkgcGVybXMuYWRkKHApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcihwID0+IHBlcm1zLmhhcyhwKSk7XG59XG5cbi8qKlxuICogQ29uZmluZSBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCB0byB3aGF0IG1heSBiZSBoZWxkIGluIHRoZSB0b2tlbidzIEFDVElWRVxuICogb3JnOiBvdXRzaWRlIHRoZSBzeXN0ZW0gb3JnIGV2ZXJ5IHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IGVudHJ5IGlzXG4gKiBkcm9wcGVkIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gQXBwbGllZCBhdCB0b2tlbiBpc3N1ZSBvblxuICogdG9wIG9mIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSDigJQgaW5jbHVkaW5nIGEgc3VwZXJhZG1pbidzIGltcGxpY2l0LWFsbCDigJRcbiAqIHNvIGEgdG9rZW4gbWludGVkIGluIGEgdGVuYW50IG9yZyBuZXZlciBDTEFJTVMgYHBsdWdpbnM6bW9kZXJhdGVgIC9cbiAqIGBwdWJsaXNoZXJzOnZlcmlmeWAsIGV2ZW4gaWYgYSBoYW5kLXdyaXR0ZW4gUm9sZSBkb2N1bWVudCBzb21laG93IGNhcnJpZWRcbiAqIHRoZW0gdGhlcmUuIChTdXBlcmFkbWlucyBzdGlsbCBwYXNzIGBoYXNQZXJtaXNzaW9uYCB2aWEgdGhlIGZsYWc7IHRoZVxuICogZWNvc3lzdGVtIHJvdXRlIGdhdGUgYWRkaXRpb25hbGx5IHJlcXVpcmVzIHRoZSBzeXN0ZW0gb3JnLCBzbyB0aGF0IGJ5cGFzc1xuICogbmV2ZXIgcmVhY2hlcyBhIGdvdmVybmFuY2Ugcm91dGUgZnJvbSBhIHRlbmFudCBvcmcgZWl0aGVyLilcbiAqXG4gKiBUYWtlcyBhIGJvb2xlYW4gcmF0aGVyIHRoYW4gYW4gb3JnIGlkIHNvIHRoaXMgbW9kdWxlIHN0YXlzIGRlcGVuZGVuY3ktZnJlZVxuICogKHRoZSBmcm9udGVuZCBpbXBvcnRzIGl0KTsgY2FsbGVycyBkZWNpZGUgd2l0aCBhcGktY29yZSBgaXNTeXN0ZW1PcmdJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maW5lUGVybWlzc2lvbnNUb09yZzxQIGV4dGVuZHMgc3RyaW5nPihcbiAgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBbXSxcbiAgYWN0aXZlT3JnSXNTeXN0ZW1Pcmc6IGJvb2xlYW4sXG4pOiBQW10ge1xuICByZXR1cm4gYWN0aXZlT3JnSXNTeXN0ZW1PcmcgPyBbLi4ucGVybWlzc2lvbnNdIDogcGVybWlzc2lvbnMuZmlsdGVyKChwKSA9PiAhaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IGdyYW50cyBgcGVybWlzc2lvbmAgKHN1cGVyYWRtaW4g4oeSIGFsd2F5cykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVybWlzc2lvbihcbiAgZ3JhbnRlZDogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiB0cnVlO1xuICByZXR1cm4gISFncmFudGVkICYmIGdyYW50ZWQuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsdC1pbiBSb2xlIHNlZWQgYnVuZGxlcywgYXMgYSBUQUJMRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUaGUgbmFtZWQgcGVybWlzc2lvbiBidW5kbGVzIGEgYnVpbHQtaW4gUm9sZSBtYXkgY2FycnksIGFuZCB0aGUgUm9sZSBOQU1FIGVhY2hcbiAqIG9uZSBpcyBzZWVkZWQgdW5kZXIuIE9uZSB0YWJsZSwgYmVjYXVzZSB0aGUgdGhyZWUgZmFjdHMgYWJvdXQgYSBqb2IgUm9sZSDigJRcbiAqIGl0cyBpZCwgaXRzIHBlcm1pc3Npb25zIGFuZCBpdHMgZGlzcGxheSBuYW1lIOKAlCB3ZXJlIHByZXZpb3VzbHkgdGhyZWVcbiAqIGluZGVwZW5kZW50IGxpc3RzIGluIHRocmVlIHBsYWNlcywgYW5kIG5vdGhpbmcgaGVsZCB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIFdIQVQgV0VOVCBXUk9ORyBXSVRIT1VUIElULiBUaGUgcGxhdGZvcm0gcmVzb2x2ZWQgYSBidW5kbGUgdGhyb3VnaCBhXG4gKiBuaW5lLWJyYW5jaCBgaWZgIGNoYWluIHdpdGggYSBmYWxsLXRocm91Z2ggdG8gdGhlIGNvYXJzZSBgZ3JhbnRzUm9sZWAgYnVuZGxlLlxuICogRXZlcnkgam9iIFJvbGUgZ3JhbnRzIGBtZW1iZXJgLCBzbyBhIGJ1bmRsZSBhZGRlZCB0byB0aGUgaWQgbGlzdCBXSVRIT1VUIGl0c1xuICogYnJhbmNoIGRpZCBub3QgZmFpbCDigJQgaXQgc2lsZW50bHkgc2VlZGVkIHRoZSBwbGFpbiBNZW1iZXIgYnVuZGxlLCBhbmQgdGhlXG4gKiBzdGFydHVwIGJhY2tmaWxsIHRoZW4gcmUtc3luY2VkIGl0IHRvIHRoYXQgd3JvbmcgdmFsdWUgb24gZXZlcnkgYm9vdC4gVGhlXG4gKiBSb2xlIGV4aXN0ZWQsIHdhcyBhc3NpZ25hYmxlIGZyb20gdGhlIHN0YWZmaW5nIHBhbmVsLCBhbmQgZ3JhbnRlZCBmaWZ0ZWVuXG4gKiB0ZW5hbnQgcGVybWlzc2lvbnMgaW5zdGVhZCBvZiBpdHMgam9iLiBOb3RoaW5nIGFueXdoZXJlIGV4ZXJjaXNlZCB0aGVcbiAqIHJlc29sdmVyIHBlciBidW5kbGUuXG4gKlxuICogS2V5ZWQgYWNjZXNzIHBsdXMgYHNhdGlzZmllc2AgbWFrZXMgYSBtaXNzaW5nIGVudHJ5IGEgQ09NUElMRSBlcnJvciwgYW5kIGFuXG4gKiBleHRyYSBvbmUgdG9vIOKAlCBpbiBib3RoIGRpcmVjdGlvbnMsIHdpdGggbm8gcnVudGltZSBjaGVjayB0byBmb3JnZXQuXG4gKlxuICogVGhlIE5BTUUgbGl2ZXMgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29uLiBUaGUgcGxhdGZvcm0gc2VlZGVkIG5hbWVzIGZyb20gaXRzXG4gKiBvd24gY29uc3RhbnRzIHdoaWxlIHRoZSBmcm9udGVuZCdzIHN0YWZmaW5nIHJvc3RlciBoYXJkLWNvZGVkIGl0cyBvd24gY29weSxcbiAqIGVhY2ggcGlubmVkIGJ5IGEgdGVzdCBhZ2FpbnN0IGl0c2VsZiDigJQgc28gcmVuYW1pbmcgYSBSb2xlIHBhc3NlZCBib3RoIHN1aXRlc1xuICogYW5kIHRoZSByb3N0ZXIgc2lsZW50bHkgcmVuZGVyZWQgXCJSb2xlIG5vdCBmb3VuZFwiLCB3aGljaCBpcyB0aGUgZ3JhbnQgcGF0aCBmb3JcbiAqIHRoYXQgUm9sZSdzIHBlcm1pc3Npb25zIGRpc2FwcGVhcmluZy4gQm90aCBzaWRlcyByZWFkIHRoaXMgbm93LlxuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVTID0ge1xuICBlY29zeXN0ZW1fbWFuYWdlcjogeyBuYW1lOiAnRWNvc3lzdGVtIE1hbmFnZXInLCBwZXJtaXNzaW9uczogRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiAnc3lzdGVtJyB9LFxuICBwdWJsaXNoZXJfdmVyaWZpZXI6IHsgbmFtZTogJ1B1Ymxpc2hlciBWZXJpZmllcicsIHBlcm1pc3Npb25zOiBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiAnc3lzdGVtJyB9LFxuICB0ZWFtX2xlYWQ6IHsgbmFtZTogJ1RlYW0gTGVhZCcsIHBlcm1pc3Npb25zOiBURUFNX0xFQURfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiBudWxsIH0sXG4gIHBsYXRmb3JtX29ic2VydmVyOiB7IG5hbWU6ICdQbGF0Zm9ybSBPYnNlcnZlcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIHBsYXRmb3JtX29wZXJhdG9yOiB7IG5hbWU6ICdQbGF0Zm9ybSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIGFjY291bnRfbWFuYWdlcjogeyBuYW1lOiAnQWNjb3VudCBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIGNvbnNvbGVfYWRtaW46IHsgbmFtZTogJ0NvbnNvbGUgQWRtaW5pc3RyYXRvcicsIHBlcm1pc3Npb25zOiBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgc3VwcG9ydF9hZ2VudDogeyBuYW1lOiAnU3VwcG9ydCBBZ2VudCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgc3VwcG9ydF9sZWFkOiB7IG5hbWU6ICdTdXBwb3J0IExlYWQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgcmVnaXN0cnlfb3BlcmF0b3I6IHsgbmFtZTogJ1JlZ2lzdHJ5IE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgcGlwZWxpbmVfYXV0b21hdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgQXV0b21hdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ29yZycgfSxcbiAgcGlwZWxpbmVfcmVnaXN0cmF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBSZWdpc3RyYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ29yZycgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xuICAvKiogV2hlcmUgaXQgaXMgc2VlZGVkOiBldmVyeSBTWVNURU0gb3JnJ3Mgam9iIFJvbGVzLCBldmVyeSBvcmcncyBNQUNISU5FIFJvbGVzLCBvciBub3doZXJlIChhIHRlbXBsYXRlKS4gKi9cbiAgc2VlZGVkSW46ICdzeXN0ZW0nIHwgJ29yZycgfCBudWxsO1xufT47XG5cbi8qKiBFdmVyeSBzZWVkLWJ1bmRsZSBpZC4gVGhlIHBsYXRmb3JtJ3MgYFJvbGUuc2VlZEJ1bmRsZWAgZW51bSBpcyB0aGlzIGxpc3QuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVfSURTID0gT2JqZWN0LmtleXMoU0VFRF9CVU5ETEVTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTPjtcbmV4cG9ydCB0eXBlIFNlZWRCdW5kbGVJZCA9IGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM7XG5cbi8qKlxuICogVGhlIFNZU1RFTSBPUkcncyBqb2IgUm9sZXMsIGluIHN0YWZmaW5nIG9yZGVyICh0YWJsZSBvcmRlcikg4oCUIHRoZSBzdWJzZXQgb2ZcbiAqIHtAbGluayBTRUVEX0JVTkRMRVN9IHNlZWRlZCB0aGVyZSAoYHNlZWRlZEluOiAnc3lzdGVtJ2ApLCB3aGljaCBpcyBldmVyeSBidW5kbGUgZXhjZXB0IGB0ZWFtX2xlYWRgXG4gKiAoYSB0ZW5hbnQgam9iLCBhbmQgYSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhIHNlZWRlZCBSb2xlIHNpbmNlIGl0IHN0b3BwZWRcbiAqIGJlaW5nIHN0cnVjdHVyYWwpLlxuICpcbiAqIGBlY29zeXN0ZW1fbWFuYWdlcmAgSVMgb25lIG9mIHRoZW07IGl0IGlzIGxpc3RlZCBoZXJlIGV2ZW4gdGhvdWdoIGl0cyByb3N0ZXJcbiAqIGxpdmVzIG9uIHRoZSBFY29zeXN0ZW0gY29uc29sZSByYXRoZXIgdGhhbiB0aGUgc3RhZmZpbmcgcGFuZWwsIGJlY2F1c2Ugd2hhdFxuICogdGhpcyBsaXN0IGFuc3dlcnMgaXMgXCJ3aGljaCBSb2xlcyBkb2VzIHRoZSBzeXN0ZW0gb3JnIHNlZWRcIiwgbm90IFwid2hpY2ggcGFuZWxcbiAqIHJlbmRlcnMgdGhlbVwiLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19KT0JfQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBTRUVEX0JVTkRMRV9JRFMuZmlsdGVyKChpZCkgPT4gU0VFRF9CVU5ETEVTW2lkXS5zZWVkZWRJbiA9PT0gJ3N5c3RlbScpO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyAoYHNlZWRlZEluOiAnb3JnJ2ApIOKAlCB0aGUgc3Vic2V0IG9mIHtAbGluayBTRUVEX0JVTkRMRVN9IGhlbGQgYnlcbiAqIHRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLlxuICpcbiAqIFNlZWRlZCByYXRoZXIgdGhhbiBvZmZlcmVkIGFzIGEge0BsaW5rIFJPTEVfVEVNUExBVEVTfSBlbnRyeSwgdW5saWtlIHRoZVxuICogdGVuYW50IGpvYiBwcmVzZXRzLCBiZWNhdXNlIHRoZXkgYXJlIHN0cnVjdHVyYWw6IHRoZSBDTEkgZ3JhbnRzIG9uZSB0byB0aGVcbiAqIGFjY291bnQgaXQgY3JlYXRlcyBhbmQgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgbW92ZXMgZXhpc3RpbmcgYWNjb3VudHMgb250byBpdCxcbiAqIGFuZCBib3RoIGhhdmUgdG8gZmluZCBpdCBpbiBFVkVSWSBvcmcgYnkgYSBzdGFibGUgaWRlbnRpdHkuIEEgdGVtcGxhdGUgbGVhdmVzXG4gKiBub3RoaW5nIHRvIGZpbmQgdW50aWwgc29tZWJvZHkgaW5zdGFudGlhdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FVVE9NQVRJT05fQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBTRUVEX0JVTkRMRV9JRFMuZmlsdGVyKChpZCkgPT4gU0VFRF9CVU5ETEVTW2lkXS5zZWVkZWRJbiA9PT0gJ29yZycpO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLCBrZXllZCBieVxuICogYWNjb3VudCBuYW1lLCBhbmQgdGhlIGJ1aWx0LWluIFJvbGUgZWFjaCBob2xkcyDigJQgYG51bGxgIGZvciBhbiBhY2NvdW50IHdob3NlXG4gKiBrZXkgY2FycmllcyBhIGNhcGFiaWxpdHkgU0NPUEUgKGEgYFRva2VuU2NvcGVgKSBhbmQgc28gbmVlZHMgbm8gUm9sZSBhdCBhbGwuXG4gKlxuICogT25lIHRhYmxlIGZvciB0aGUgQ0xJICh3aGljaCBSb2xlIHRvIGdyYW50IGEgTkVXIGFjY291bnQpIGFuZCB0aGUgcGxhdGZvcm0nc1xuICogc3RhcnR1cCBiYWNrZmlsbCAod2hpY2ggUm9sZSB0byBtb3ZlIGFuIEVYSVNUSU5HIGFjY291bnQgb250bywgb2ZmIHRoZSBvcmdcbiAqIGFkbWluIFJvbGUgdGhlc2UgYWNjb3VudHMgd2VyZSBvbmNlIGdpdmVuKS4gQSByZW5hbWUgaGVyZSBtb3ZlcyBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQVVUT01BVElPTl9BQ0NPVU5UX0JVTkRMRVMgPSB7XG4gICdwbGF0Zm9ybS1hdXRvbWF0aW9uJzogJ3BpcGVsaW5lX2F1dG9tYXRpb24nLFxuICAncGlwZWxpbmUtcmVnaXN0ZXInOiAncGlwZWxpbmVfcmVnaXN0cmF0aW9uJyxcbiAgJ3JlcG9ydGluZy1pbmdlc3QnOiBudWxsLFxuICAncmVnaXN0cnktcHVzaCc6IG51bGwsXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBTZWVkQnVuZGxlSWQgfCBudWxsPjtcbiJdfQ==
|