@pipeline-builder/api-core 5.2.10 → 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 +218 -26
- package/lib/types/ecosystem-notifications.js +26 -10
- package/lib/types/ecosystem.d.ts +1 -0
- package/lib/types/ecosystem.js +33 -23
- package/lib/types/error-codes.d.ts +41 -0
- package/lib/types/error-codes.js +62 -1
- 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 +263 -125
- package/lib/types/pipeline.d.ts +2 -0
- package/lib/types/pipeline.js +3 -1
- package/lib/types/plugin-catalog.d.ts +68 -0
- package/lib/types/plugin-catalog.js +82 -1
- 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 +22 -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/pipeline-schemas.d.ts +22 -0
- package/lib/validation/pipeline-schemas.js +19 -1
- package/lib/validation/plugin-spec-schema.d.ts +45 -2
- package/lib/validation/plugin-spec-schema.js +85 -7
- package/package.json +8 -1
package/lib/types/permissions.js
CHANGED
|
@@ -28,32 +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
|
-
'templates:read', 'templates:write', 'templates:publish',
|
|
35
|
-
'plugins:read', 'plugins:write', 'plugins:publish',
|
|
36
|
-
'plugins:install', 'plugin_installs:manage', 'publishers:manage',
|
|
37
|
-
'plugins:moderate', 'publishers:verify',
|
|
38
|
-
'platform:read', 'orgs:read', 'billing:operate',
|
|
39
|
-
'observability_console:open', 'database_console:open', 'objectstore_console:open',
|
|
40
|
-
'oncall:manage',
|
|
41
|
-
'support_cases:write', 'support_content:write',
|
|
42
|
-
'subscriptions:read', 'subscriptions:manage',
|
|
43
|
-
'orgs:manage', 'quotas:manage', 'plugin_queue:manage',
|
|
44
|
-
'compliance:read', 'compliance:write',
|
|
45
|
-
'members:manage', 'roles:manage', 'invitations:manage', 'service_accounts:manage',
|
|
46
|
-
'dashboards:read', 'dashboards:write',
|
|
47
|
-
'observability:read', 'observability:write',
|
|
48
|
-
'logs:export', 'audit:read',
|
|
49
|
-
'reports:read', 'reports:rollup', 'reports:write', 'reports:publish',
|
|
50
|
-
'messages:read', 'messages:write',
|
|
51
|
-
'billing:read', 'billing:manage',
|
|
52
|
-
'quotas:read',
|
|
53
|
-
'registry:read', 'registry:write', 'registry:purge',
|
|
54
|
-
'impersonation:open', 'impersonation:approve', 'team_access:open',
|
|
55
|
-
'org_settings:write', 'org_idp:write', 'org_kms:write', 'org_impersonation:write',
|
|
56
|
-
];
|
|
57
31
|
/**
|
|
58
32
|
* The CLOSED set of functions that take a {@link Permission} and decide access.
|
|
59
33
|
*
|
|
@@ -94,80 +68,251 @@ export const PERMISSION_GATES = [
|
|
|
94
68
|
'authorizeOrg',
|
|
95
69
|
];
|
|
96
70
|
/**
|
|
97
|
-
*
|
|
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.
|
|
98
74
|
*
|
|
99
75
|
* This module is the SINGLE catalog for backend and browser alike: it has no
|
|
100
76
|
* runtime dependencies (the only import is a type), so the frontend imports it
|
|
101
77
|
* through the `@pipeline-builder/api-core/permissions` subpath instead of keeping
|
|
102
|
-
* a hand-maintained mirror.
|
|
103
|
-
* exactly once (asserted by `permissions.test.ts`).
|
|
78
|
+
* a hand-maintained mirror.
|
|
104
79
|
*/
|
|
105
|
-
|
|
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
|
-
|
|
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] }));
|
|
168
313
|
/** Human label for a permission id (falls back to the raw id for an unknown one). */
|
|
169
314
|
export function permissionLabel(id) {
|
|
170
|
-
return
|
|
315
|
+
return isValidPermission(id) ? PERMISSION_DEFS[id].label : id;
|
|
171
316
|
}
|
|
172
317
|
/** Group a permission list into categories, preserving catalog order. */
|
|
173
318
|
function groupByCategory(perms) {
|
|
@@ -184,7 +329,7 @@ function groupByCategory(perms) {
|
|
|
184
329
|
}
|
|
185
330
|
/** Check whether a string is a valid Permission. */
|
|
186
331
|
export function isValidPermission(value) {
|
|
187
|
-
return
|
|
332
|
+
return Object.prototype.hasOwnProperty.call(PERMISSION_DEFS, value);
|
|
188
333
|
}
|
|
189
334
|
/**
|
|
190
335
|
* Permissions that must NEVER be grantable through a user-authored CUSTOM Role —
|
|
@@ -288,6 +433,9 @@ export const SYSTEM_ORG_ONLY_PERMISSIONS = [
|
|
|
288
433
|
'orgs:manage',
|
|
289
434
|
'quotas:manage',
|
|
290
435
|
'plugin_queue:manage',
|
|
436
|
+
// The Toolchain console (plan D9): THE platform default and canary move the
|
|
437
|
+
// build toolchain of every org that follows it, so no tenant may hold it.
|
|
438
|
+
'toolchain:operate',
|
|
291
439
|
];
|
|
292
440
|
/** Whether `permission` may be held only inside the system org. */
|
|
293
441
|
export function isSystemOrgOnlyPermission(permission) {
|
|
@@ -435,6 +583,9 @@ export const PLATFORM_OPERATOR_PERMISSIONS = [
|
|
|
435
583
|
// queue and purge its dead-letter queue.
|
|
436
584
|
'quotas:manage',
|
|
437
585
|
'plugin_queue:manage',
|
|
586
|
+
// The Toolchain console (plan D9): canary, promotion, rollback and release
|
|
587
|
+
// lifecycle of the managed build toolchain — running the deployment.
|
|
588
|
+
'toolchain:operate',
|
|
438
589
|
// Reads that make the operator views usable: the dashboards the posture panels
|
|
439
590
|
// live on, the cross-tenant log view, and the customer's plan when a limit is
|
|
440
591
|
// the thing being debugged.
|
|
@@ -923,24 +1074,24 @@ export function hasPermission(granted, permission, isSuperAdmin) {
|
|
|
923
1074
|
* that Role's permissions disappearing. Both sides read this now.
|
|
924
1075
|
*/
|
|
925
1076
|
export const SEED_BUNDLES = {
|
|
926
|
-
ecosystem_manager: { name: 'Ecosystem Manager', permissions: ECOSYSTEM_MANAGER_PERMISSIONS },
|
|
927
|
-
publisher_verifier: { name: 'Publisher Verifier', permissions: PUBLISHER_VERIFIER_PERMISSIONS },
|
|
928
|
-
team_lead: { name: 'Team Lead', permissions: TEAM_LEAD_PERMISSIONS },
|
|
929
|
-
platform_observer: { name: 'Platform Observer', permissions: PLATFORM_OBSERVER_PERMISSIONS },
|
|
930
|
-
platform_operator: { name: 'Platform Operator', permissions: PLATFORM_OPERATOR_PERMISSIONS },
|
|
931
|
-
account_manager: { name: 'Account Manager', permissions: ACCOUNT_MANAGER_PERMISSIONS },
|
|
932
|
-
console_admin: { name: 'Console Administrator', permissions: CONSOLE_ADMIN_PERMISSIONS },
|
|
933
|
-
support_agent: { name: 'Support Agent', permissions: SUPPORT_AGENT_PERMISSIONS },
|
|
934
|
-
support_lead: { name: 'Support Lead', permissions: SUPPORT_LEAD_PERMISSIONS },
|
|
935
|
-
registry_operator: { name: 'Registry Operator', permissions: REGISTRY_OPERATOR_PERMISSIONS },
|
|
936
|
-
pipeline_automation: { name: 'Pipeline Automation', permissions: PIPELINE_AUTOMATION_PERMISSIONS },
|
|
937
|
-
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' },
|
|
938
1089
|
};
|
|
939
1090
|
/** Every seed-bundle id. The platform's `Role.seedBundle` enum is this list. */
|
|
940
1091
|
export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
|
|
941
1092
|
/**
|
|
942
|
-
* The SYSTEM ORG's job Roles, in staffing order — the subset of
|
|
943
|
-
* {@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`
|
|
944
1095
|
* (a tenant job, and a template rather than a seeded Role since it stopped
|
|
945
1096
|
* being structural).
|
|
946
1097
|
*
|
|
@@ -949,19 +1100,9 @@ export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
|
|
|
949
1100
|
* this list answers is "which Roles does the system org seed", not "which panel
|
|
950
1101
|
* renders them".
|
|
951
1102
|
*/
|
|
952
|
-
export const SYSTEM_ORG_JOB_BUNDLES = [
|
|
953
|
-
'ecosystem_manager',
|
|
954
|
-
'publisher_verifier',
|
|
955
|
-
'platform_observer',
|
|
956
|
-
'platform_operator',
|
|
957
|
-
'account_manager',
|
|
958
|
-
'console_admin',
|
|
959
|
-
'support_agent',
|
|
960
|
-
'support_lead',
|
|
961
|
-
'registry_operator',
|
|
962
|
-
];
|
|
1103
|
+
export const SYSTEM_ORG_JOB_BUNDLES = SEED_BUNDLE_IDS.filter((id) => SEED_BUNDLES[id].seededIn === 'system');
|
|
963
1104
|
/**
|
|
964
|
-
* 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
|
|
965
1106
|
* the service accounts `pipeline-manager infra store-token` provisions.
|
|
966
1107
|
*
|
|
967
1108
|
* Seeded rather than offered as a {@link ROLE_TEMPLATES} entry, unlike the
|
|
@@ -970,10 +1111,7 @@ export const SYSTEM_ORG_JOB_BUNDLES = [
|
|
|
970
1111
|
* and both have to find it in EVERY org by a stable identity. A template leaves
|
|
971
1112
|
* nothing to find until somebody instantiates it.
|
|
972
1113
|
*/
|
|
973
|
-
export const ORG_AUTOMATION_BUNDLES = [
|
|
974
|
-
'pipeline_automation',
|
|
975
|
-
'pipeline_registration',
|
|
976
|
-
];
|
|
1114
|
+
export const ORG_AUTOMATION_BUNDLES = SEED_BUNDLE_IDS.filter((id) => SEED_BUNDLES[id].seededIn === 'org');
|
|
977
1115
|
/**
|
|
978
1116
|
* The service accounts `pipeline-manager infra store-token` provisions, keyed by
|
|
979
1117
|
* account name, and the built-in Role each holds — `null` for an account whose
|
|
@@ -989,4 +1127,4 @@ export const AUTOMATION_ACCOUNT_BUNDLES = {
|
|
|
989
1127
|
'reporting-ingest': null,
|
|
990
1128
|
'registry-push': null,
|
|
991
1129
|
};
|
|
992
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa1B0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ25GLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUI7SUFDaEUsa0JBQWtCLEVBQUUsbUJBQW1CO0lBQ3ZDLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCO0lBQy9DLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQjtJQUNqRixlQUFlO0lBQ2YscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxhQUFhLEVBQUUsZUFBZSxFQUFFLHFCQUFxQjtJQUNyRCxpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUs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TUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQXFDLENBQUM7QUFHN0Y7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUE0QjtJQUM3RCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLG1CQUFtQjtDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCO0lBQzdELHFCQUFxQjtJQUNyQix1QkFBdUI7Q0FDeEIsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO0lBQzVDLG1CQUFtQixFQUFFLHVCQUF1QjtJQUM1QyxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGVBQWUsRUFBRSxJQUFJO0NBQ2lDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gVGhlIHBpcGVsaW5lIFJFR0lTVFJZIChgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCk6IHdoaWNoIGRlcGxveWVkXG4gIC8vIHN0YWNrIGJhY2tzIGEgcGlwZWxpbmUsIGFuZCB0aGUgc3RlcCBtYW5pZmVzdCBvZiBwbHVnaW4gZGlnZXN0cyBpdCBydW5zLlxuICAvLyBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczp3cml0ZWAgc28gdGhlIENvZGVCdWlsZCBzeW50aCBjYW4ga2VlcCB0aGF0IHJlY29yZFxuICAvLyBjdXJyZW50IHdpdGggYSBjcmVkZW50aWFsIHRoYXQgY2FuIGRvIG5vdGhpbmcgZWxzZSDigJQgYSBrZXkgaG9sZGluZ1xuICAvLyBgcGlwZWxpbmVzOndyaXRlYCBjb3VsZCByZXdyaXRlIGV2ZXJ5IHBpcGVsaW5lIHRoZSBvcmcgb3ducy4gUGVvcGxlIGdldCBpdFxuICAvLyBiZXNpZGUgYHBpcGVsaW5lczp3cml0ZWAgKHRoZSBNZW1iZXIgYnVuZGxlKTsgdGhlIGBwaXBlbGluZS1yZWdpc3RlcmBcbiAgLy8gc2VydmljZSBhY2NvdW50IGhvbGRzIGl0IGFsb25lLlxuICB8ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZSdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gIHwgJ3RlbXBsYXRlczpyZWFkJ1xuICB8ICd0ZW1wbGF0ZXM6d3JpdGUnXG4gIHwgJ3RlbXBsYXRlczpwdWJsaXNoJ1xuICAvLyBQbHVnaW5zXG4gIHwgJ3BsdWdpbnM6cmVhZCdcbiAgfCAncGx1Z2luczp3cml0ZSdcbiAgfCAncGx1Z2luczpwdWJsaXNoJ1xuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gIHwgJ3BsdWdpbnM6aW5zdGFsbCdcbiAgfCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZSdcbiAgfCAncHVibGlzaGVyczptYW5hZ2UnXG4gIHwgJ3BsdWdpbnM6bW9kZXJhdGUnXG4gIHwgJ3B1Ymxpc2hlcnM6dmVyaWZ5J1xuICAvLyBQbGF0Zm9ybSBvcGVyYXRpb25zIChzeXN0ZW0tb3JnIG9ubHkpLiBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzXG4gIC8vIHRoYXQgdXNlZCB0byByZXF1aXJlIHRoZSBzdXBlcmFkbWluIEZMQUcsIHNvIGEgZGVwbG95bWVudCBjYW4gc3RhZmYgdGhlbVxuICAvLyB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIGhhbmRpbmcgb3V0IGltcGxpY2l0LWFsbC4gU3BsaXQgYmVjYXVzZSB0aGUgdHdvIGNhcnJ5XG4gIC8vIGRpZmZlcmVudCByaXNrOiByZWFkaW5nIHdoYXQgYSBkZXBsb3kgY29uZmlndXJlZCBpcyBub3QgdGhlIHNhbWUgYXMgbW92aW5nXG4gIC8vIGFub3RoZXIgb3JnYW5pc2F0aW9uJ3MgbW9uZXkuXG4gIHwgJ3BsYXRmb3JtOnJlYWQnXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgT1JHIExJU1QsIHNwbGl0IG91dCBvZiBgcGxhdGZvcm06cmVhZGAgYmVjYXVzZSB0aGF0IG9uZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBkb2luZyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBibGFzdCByYWRpaTogcmVhZGluZyB3aGF0IGFcbiAgLy8gREVQTE9ZIHdhcyBjb25maWd1cmVkIHRvIGRvIChSTFMgbW9kZSwgS01TIHBvc3R1cmUsIHRoZSByZW5kZXJlZCBhbGVydFxuICAvLyBydWxlcykgYW5kIHJlYWRpbmcgdGhlIHJvc3RlciBvZiBldmVyeSBDVVNUT01FUi4gVGhyZWUgb2YgdGhlIGZvdXIgam9iXG4gIC8vIGJ1bmRsZXMgY2FycmllZCBpdCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gd2FudGVkIHRoZSBkZXBsb3kgaW50ZXJuYWxzIOKAlFxuICAvLyBDb25zb2xlIEFkbWluaXN0cmF0b3IgYW5kIFN1cHBvcnQgQWdlbnQgZ290IHRoZW0gcHVyZWx5IGJlY2F1c2UgdGhleSBuZWVkZWRcbiAgLy8gdG8gZmluZCBhbiBvcmcgYnkgbmFtZS5cbiAgLy9cbiAgLy8gU2FtZSBtaXN0YWtlLCBhbmQgc2FtZSBmaXgsIGFzIGBjb25zb2xlczpkYXRhc3RvcmVgIGJlZm9yZSBpdCB3YXMgc3BsaXQgYnlcbiAgLy8gd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzLlxuICB8ICdvcmdzOnJlYWQnXG4gIHwgJ2JpbGxpbmc6b3BlcmF0ZSdcbiAgLy8gVGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBzcGxpdCBieSBCTEFTVCBSQURJVVMgcmF0aGVyIHRoYW4gYnkgcHJvZHVjdC4gVGhyZWVcbiAgLy8gcGVybWlzc2lvbnMgZm9yIGZpdmUgY29uc29sZXMsIGJlY2F1c2Ugd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzIGRpZmZlcnNcbiAgLy8gYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlIGF0IGVhY2ggc3RlcDpcbiAgLy9cbiAgLy8gIC0gYG9ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuYCDigJQgR3JhZmFuYSBhbmQgS2lhbGkuIFJlYWQtb25seSB2aWV3czsgdGhlIHdvcnN0XG4gIC8vICAgIG91dGNvbWUgb2YgYSBtaXN0YWtlbiBncmFudCBpcyBzZWVpbmcgdGVsZW1ldHJ5LlxuICAvLyAgLSBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCAgICAg4oCUIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MuIEEgZGF0YWJhc2Ugc2hlbGxcbiAgLy8gICAgb3ZlciBldmVyeSB0ZW5hbnQncyByb3dzOiBpdCBjYW4gcmVhZCBhbmQgcmV3cml0ZSB0ZW5hbnQgZGF0YSwgYnV0IHRoZVxuICAvLyAgICBhdWRpdCBjaGFpbiBsaXZlcyBlbHNld2hlcmUsIHNvIHRoZSBkYW1hZ2UgaXMgcmVjb3JkZWQuXG4gIC8vICAtIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gICAg4oCUIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlLiBJdCBjYW4gTElTVCBhbmRcbiAgLy8gICAgREVMRVRFIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5LCBMb2tpLCBUaGFub3MsIHBsdWdpbi1idWlsZCBhbmRcbiAgLy8gICAgYXVkaXQtY2hhaW4gYnVja2V0cy4gU3BsaXQgZnJvbSB0aGUgcGFpciBhYm92ZSBiZWNhdXNlIHRoZSB0d28gYXJlIHRoZVxuICAvLyAgICB0d28gSEFMVkVTIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2UgZGVzaWduOiB0aGUgY2hhaW4ncyBITUFDIGtleVxuICAvLyAgICBsaXZlcyBvdXRzaWRlIHRoZSBEQiwgc28gYSBNb25nbyBzaGVsbCBjYW4gdGFtcGVyIGJ1dCBjYW5ub3QgZm9yZ2UgYVxuICAvLyAgICBjb25zaXN0ZW50IGNoYWluIOKAlCBleGNlcHQgYnkgdHJ1bmNhdGluZyB0aGUgdGFpbCwgd2hpY2ggYSBjaGFpbiBjYW5ub3RcbiAgLy8gICAgc2VlIGZyb20gdGhlIGluc2lkZSwgYW5kIHRoZSBkZWZlbmNlIGFnYWluc3QgVEhBVCBpcyB0aGUgc2lnbmVkXG4gIC8vICAgIGNoYWluLWhlYWQgZXhwb3J0IHRvIG9iamVjdCBzdG9yYWdlLiBPbmUgc2hlbGwgY2FuIHRydW5jYXRlOyB0aGUgb3RoZXJcbiAgLy8gICAgY2FuIGRlbGV0ZSB0aGUgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24uXG4gIC8vXG4gIC8vIEFsbCB0aHJlZSBhcmUgc3lzdGVtLW9yZy1vbmx5LCBzbyBub25lIGNhbiBiZSBoZWxkIGluc2lkZSBhIHRlbmFudCwgYW5kIG9ubHlcbiAgLy8gdGhlIGZpcnN0IGlzIGluIHRoZSBQbGF0Zm9ybSBPcGVyYXRvciBidW5kbGU6IHN0YWZmaW5nIGFuIG9wZXJhdG9yIG11c3QgbmV2ZXJcbiAgLy8gaGFuZCBvdmVyIGEgZGF0YSBzaGVsbCBhcyBhIHNpZGUgZWZmZWN0LiBHcmFudGluZyBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBpc1xuICAvLyBhIHNlcGFyYXRlLCBleHBsaWNpdCBhY3QgYnkgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIFJvbGUgZm9yIGV4YWN0bHkgdGhhdFxuICAvLyBwdXJwb3NlLlxuICAvL1xuICAvLyBXSEFUIFRIRSBTUExJVCBET0VTIE5PVCBETywgc28gbm9ib2R5IGJ1aWxkcyBvbiBpdDogaXQgaXMgbm90IGEgY29udGFpbm1lbnRcbiAgLy8gYm91bmRhcnkuIFJvbGVzIGxpdmUgaW4gTW9uZ28gKGBjb2xsZWN0aW9uOiAncm9sZXMnYCksIHNvIGFcbiAgLy8gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgaG9sZGVyIGNhbiB3cml0ZSB0aGF0IGNvbGxlY3Rpb24gYW5kIGdyYW50IHRoZW1zZWx2ZXNcbiAgLy8gYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAg4oCUIGRhdGFzdG9yZSBjb250YWlucyBvYmplY3RzdG9yZSBieSBlc2NhbGF0aW9uLiBUaGVcbiAgLy8gc3BsaXQgZXhwcmVzc2VzIGludGVudCwga2VlcHMgdGhlIGRlZmF1bHQgZ3JhbnQgc21hbGwgYW5kIGdpdmVzIGVhY2ggY2xhc3NcbiAgLy8gaXRzIG93biByZWZ1c2FsIHNpZ25hbC4gV2hhdCBhY3R1YWxseSBwcm90ZWN0cyB0aGUgYXVkaXQgaGVhZHMgZnJvbSB3aG9ldmVyXG4gIC8vIG9wZW5zIHRoYXQgY29uc29sZSBpcyBTMyBPYmplY3QgTG9jayB3aXRoIGEgcmV0YWluLXVudGlsLWRhdGVcbiAgLy8gKGBwbGF0Zm9ybS9zcmMvc2VydmljZXMvYXVkaXQtaGVhZC1leHBvcnQudHNgKSwgd2hpY2ggaG9sZHMgcmVnYXJkbGVzcyBvZlxuICAvLyBhbnkgcGVybWlzc2lvbiBoZXJlLlxuICB8ICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbidcbiAgfCAnZGF0YWJhc2VfY29uc29sZTpvcGVuJ1xuICB8ICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nXG4gIC8vIE9uLWNhbGwgKHN5c3RlbS1vcmcgb25seSkuIFJlYWRzIHRoZSBwYWdpbmcgUE9TVFVSRSBhbmQgc2VuZHMgYSB0ZXN0IHBhZ2UuXG4gIC8vIE5vdCBhIHNjaGVkdWxlIGVkaXRvciDigJQgdGhlIHByb3ZpZGVyIG93bnMgdGhlIHJvdGEg4oCUIGFuZCBkZWxpYmVyYXRlbHkgbm90IGFcbiAgLy8gc2V0dGluZ3Mgc3VyZmFjZSBlaXRoZXIsIGJlY2F1c2UgZXZlcnkga25vYiBpcyBvcGVyYXRvci1zaWRlIGVudi4gV2hhdCBpdFxuICAvLyBncmFudHMgaXMgdGhlIG9uZSB0aGluZyBhIHByb2R1Y3Qgc3VyZmFjZSBjYW4gZ2l2ZSB0aGF0IGEgc2hlbGwgY2Fubm90OlxuICAvLyBcIndpbGwgd2UgYWN0dWFsbHkgYmUgcGFnZWRcIiwgYW5zd2VyYWJsZSB3aXRob3V0IGNsdXN0ZXIgYWNjZXNzLlxuICB8ICdvbmNhbGw6bWFuYWdlJ1xuICAvLyBUaGUgdmVuZG9yJ3Mgb3RoZXIgb3BlcmF0aW9uYWwgVEFTS1MgKHN5c3RlbSBvcmcgb25seSkuIEVhY2ggZXhpc3RzIHNvIGFcbiAgLy8gc3VwZXJhZG1pbiBjYW4gc3RhZmYgb25lIGpvYiB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIHRoZSBzdXBlcmFkbWluIGZsYWcg4oCUXG4gIC8vIGJlZm9yZSB0aGVzZSwgMzQgcm91dGVzIHdlcmUgcmVhY2hhYmxlIG9ubHkgYnkgc29tZW9uZSB3aG8gYWxzbyBoZWxkXG4gIC8vIGltcGVyc29uYXRpb24sIGEgZGF0YWJhc2Ugc2hlbGwgYW5kIHRoZSBhYmlsaXR5IHRvIG1pbnQgYW5vdGhlciBzdXBlcmFkbWluLlxuICAvL1xuICAvLyBTdXBwb3J0IGRlc2ssIHNwbGl0IGluIHR3byBiZWNhdXNlIHRoZSBjb250ZW50IGlzIHJldXNlZCBhY3Jvc3MgZXZlcnlcbiAgLy8gY3VzdG9tZXIgd2hpbGUgYSBjYXNlIGJlbG9uZ3MgdG8gb25lOiBgc3VwcG9ydF9jYXNlczp3cml0ZWAgaXMgdGhlIGRlc2snc1xuICAvLyBvd24gd29yayAodHJpYWdlLCBhc3NpZ25tZW50LCBzZXZlcml0eSwgaW50ZXJuYWwgbm90ZXMsIHJlY29yZGluZyBhblxuICAvLyBpbmNpZGVudCBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCksIGBzdXBwb3J0X2NvbnRlbnQ6d3JpdGVgIGlzIGF1dGhvcmluZ1xuICAvLyB0aGUgY2FubmVkIHJlcGxpZXMuIEVhY2ggZ2F0ZXMgaXRzIHRhc2sncyBSRUFEUyBhcyB3ZWxsIGFzIGl0cyB3cml0ZXMsXG4gIC8vIGFnYWluc3QgdGhlIHVzdWFsIGNvbnZlbnRpb24sIGJlY2F1c2UgdGhlc2UgdGFibGVzIGNhcnJ5IG5vIGBvcmdfaWRgIOKAlCB0aGVyZVxuICAvLyBpcyBubyB0ZW5hbmN5IGJvdW5kYXJ5IHVuZGVybmVhdGggdG8gZmFsbCBiYWNrIG9uLlxuICB8ICdzdXBwb3J0X2Nhc2VzOndyaXRlJ1xuICB8ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnXG4gIC8vIENyb3NzLXRlbmFudCBzdWJzY3JpcHRpb25zLiBSZWFkIGlzIHNwbGl0IGZyb20gd3JpdGUgYmVjYXVzZSBhIHJlYWQtb25seVxuICAvLyBob2xkZXIgaXMgYSByZWFsIGpvYiBoZXJlOiBzb21lb25lIHdobyByZXBvcnRzIG9uIHJldmVudWUgYW5kIHBsYW4gbWl4XG4gIC8vIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGFuZ2UgYSBwbGFuIG9yIGNhbmNlbCBvbmUuXG4gIHwgJ3N1YnNjcmlwdGlvbnM6cmVhZCdcbiAgfCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnXG4gIC8vIFRoZSBvcmcgbGlmZWN5Y2xlIEFDUk9TUyB0ZW5hbnRzOiByZW5hbWUsIGRlbGV0ZSwgY2hhbmdlIHRpZXIsIG1vdmUgdW5kZXIgYVxuICAvLyBuZXcgcGFyZW50LiBEaXN0aW5jdCBmcm9tIGBvcmdfc2V0dGluZ3M6d3JpdGVgLCB3aGljaCBpcyBhbiBvcmcgYWN0aW5nIG9uXG4gIC8vIGl0c2VsZi5cbiAgfCAnb3JnczptYW5hZ2UnXG4gIC8vIENyb3NzLXRlbmFudCBxdW90YSB3cml0ZXMuIFRoZSBtYXRjaGluZyByZWFkcyAoYC9xdW90YXMvYWxsYCwgYC9hdC1yaXNrYClcbiAgLy8gcmlkZSBgcGxhdGZvcm06cmVhZGAgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0b3IgZGFzaGJvYXJkLCBzbyBzb21lb25lXG4gIC8vIHdhdGNoaW5nIGZvciBleGhhdXN0aW9uIGRvZXMgbm90IG5lZWQgdGhlIGFiaWxpdHkgdG8gcmFpc2UgYSBsaW1pdC5cbiAgfCAncXVvdGFzOm1hbmFnZSdcbiAgLy8gVGhlIHBsdWdpbiBCVUlMRCBxdWV1ZSDigJQgZGVwdGgsIHN0YWxscywgYW5kIHB1cmdpbmcgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAvLyBEaXN0aW5jdCBmcm9tIGBwbHVnaW5zOm1vZGVyYXRlYCwgd2hpY2ggaXMgZWNvc3lzdGVtIGdvdmVybmFuY2U6IHRoaXMgaXNcbiAgLy8gaW5mcmFzdHJ1Y3R1cmUsIGFuZCB0aGUgcGVvcGxlIHdobyBydW4gaXQgYXJlIG5vdCB0aGUgcGVvcGxlIHdobyByZXZpZXdcbiAgLy8gc3VibWlzc2lvbnMuXG4gIHwgJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnXG4gIC8vIENvbXBsaWFuY2VcbiAgfCAnY29tcGxpYW5jZTpyZWFkJ1xuICB8ICdjb21wbGlhbmNlOndyaXRlJ1xuICAvLyBNZW1iZXJzICYgYWNjZXNzXG4gIHwgJ21lbWJlcnM6bWFuYWdlJ1xuICB8ICdyb2xlczptYW5hZ2UnXG4gIHwgJ2ludml0YXRpb25zOm1hbmFnZSdcbiAgLy8gT3JnLXNjb3BlZCBzZXJ2aWNlIGFjY291bnRzIChub24taHVtYW4gcHJpbmNpcGFscykgYW5kIHRoZWlyIGFjY2VzcyBrZXlzLlxuICAvLyBTcGxpdCBvdXQgb2YgYG1lbWJlcnM6bWFuYWdlYCBiZWNhdXNlIGEgc2VydmljZSBhY2NvdW50IGlzIGEgQ1JFREVOVElBTFxuICAvLyBob2xkZXIsIG5vdCBhIHBlcnNvbjogZ3JhbnRpbmcgc29tZW9uZSB0aGUgYWJpbGl0eSB0byBtaW50IGxvbmctbGl2ZWRcbiAgLy8gbWFjaGluZSBrZXlzIGlzIGEgZGlmZmVyZW50IGRlY2lzaW9uIGZyb20gbGV0dGluZyB0aGVtIG1hbmFnZSB0aGUgcm9zdGVyLlxuICB8ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZSdcbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICB8ICdkYXNoYm9hcmRzOnJlYWQnXG4gIHwgJ2Rhc2hib2FyZHM6d3JpdGUnXG4gIHwgJ29ic2VydmFiaWxpdHk6cmVhZCdcbiAgfCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSdcbiAgLy8gYGxvZ3M6ZXhwb3J0YCBpcyBzcGxpdCBPVVQgb2YgYG9ic2VydmFiaWxpdHk6cmVhZGAgZGVsaWJlcmF0ZWx5LiBSZWFkaW5nXG4gIC8vIGxvZ3MgaW4gdGhlIFVJIGlzIHBhZ2VkIGFuZCBlcGhlbWVyYWw7IEVYUE9SVElORyB0aGVtIGlzIGJ1bGsgZWdyZXNzIHRoYXRcbiAgLy8gbGVhdmVzIHRoZSBidWlsZGluZyBhbmQgb3V0bGl2ZXMgYSByZXZva2VkIHNlc3Npb24sIHNvIGFuIG9yZyBhZG1pbiBtdXN0IGJlXG4gIC8vIGFibGUgdG8gZ3JhbnQgbG9nIHZpZXdpbmcgd2l0aG91dCBncmFudGluZyBkb3dubG9hZHMuXG4gIHwgJ2xvZ3M6ZXhwb3J0J1xuICAvLyBUaGUgb3JnJ3Mgb3duIGhhc2gtY2hhaW5lZCBhdWRpdCB0cmFpbC4gT1JHLUFTU0lHTkFCTEUsIHVubGlrZSB0aGUgcGxhdGZvcm1cbiAgLy8gb3BlcmF0aW9ucyBwYWlyOiB0aGUgcm93cyBhbiBvcmcgcmVhZHMgYXJlIGl0cyBvd24gKHRoZSBxdWVyeSBwcmVkaWNhdGUgaXNcbiAgLy8gYG9yZ0lkYCBPUiBgYWZmZWN0ZWRPcmdJZGApLCBzbyBkZWxlZ2F0aW5nIGl0IGlzIGFuIG9yZydzIGRlY2lzaW9uIOKAlCBhXG4gIC8vIGNvbXBsaWFuY2UgcmV2aWV3ZXIgY2FuIGJlIGdpdmVuIHRoZSB0cmFpbCB3aXRob3V0IGJlaW5nIG1hZGUgYW4gYWRtaW4gb2ZcbiAgLy8gZXZlcnl0aGluZyB0aGF0IHByb2R1Y2VkIGl0LiBSZWFkLW9ubHkgYnkgY29uc3RydWN0aW9uOyB0aGVyZSBpcyBubyB3cml0ZS5cbiAgfCAnYXVkaXQ6cmVhZCdcbiAgLy8gSW5zaWdodHNcbiAgfCAncmVwb3J0czpyZWFkJ1xuICB8ICdyZXBvcnRzOnJvbGx1cCdcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0cy4gYHJlcG9ydHM6cmVhZGAgc3RheXMgdGhlIEZSRUUgb24tZGVtYW5kIGRhc2hib2FyZCByZWFkO1xuICAvLyB0aGVzZSB0d28gYXJlIHRoZSBhZGQtb24ncyB3cml0ZSBzdXJmYWNlIOKAlCBgYXV0aG9yYCBzYXZlcy9zY2hlZHVsZXMvZHJhZnRzIGFcbiAgLy8gcmVwb3J0LCBgc2hhcmVgIHB1Ymxpc2hlcyBpdCBiZXlvbmQgdGhlIHBsYXRmb3JtIChQREYsIGVtYWlsLCBzaGFyZSBsaW5rcykuXG4gIC8vIFNwbGl0IGJlY2F1c2UgcHVibGlzaGluZyBleHRlcm5hbGx5IGlzIGEgZGlmZmVyZW50IHJpc2sgZnJvbSBjb21wb3Npbmc6XG4gIC8vIGEgbGVhZCBjYW4gYmUgYWxsb3dlZCB0byBidWlsZCByZXBvcnRzIHdpdGhvdXQgYmVpbmcgYWxsb3dlZCB0byBlbWFpbCB0aGVtIG91dC5cbiAgfCAncmVwb3J0czp3cml0ZSdcbiAgfCAncmVwb3J0czpwdWJsaXNoJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIEltcGVyc29uYXRpb24g4oCUIHZpZXdpbmcgdGhlIHBsYXRmb3JtIGFzIHNvbWVib2R5IGVsc2UuIFRocmVlIGlkcywgYmVjYXVzZVxuICAvLyB0aHJlZSBkaWZmZXJlbnQgcGFydGllcyBhcmUgaW52b2x2ZWQgYW5kIGVhY2ggZGVjaXNpb24gYmVsb25ncyB0byBhXG4gIC8vIGRpZmZlcmVudCBvbmUgb2YgdGhlbSAoZG9jcy9wZXJtaXNzaW9ucy5tZCNpbXBlcnNvbmF0aW9uKTpcbiAgLy8gIC0gYGltcGVyc29uYXRpb246b3BlbmAgICB0aGUgVkVORE9SIG9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgc2Vzc2lvbiwgd2hpY2hcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tb3JnLW9ubHkgYW5kIHN0aWxsIGNvbnNlbnQtZ2F0ZWQ7XG4gIC8vICAtIGB0ZWFtX2FjY2VzczpvcGVuYCAgICAgYSBQQVJFTlQgb3JnJ3MgYWRtaW4gdmlld2luZyBvbmUgb2YgaXRzIG93biB0ZWFtcydcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLCB3aGljaCBuZXZlciBsZWF2ZXMgdGhlIHRlbmFudDtcbiAgLy8gIC0gYGltcGVyc29uYXRpb246YXBwcm92ZWAgdGhlIFRFTkFOVCBhbnN3ZXJpbmcgYSBjb25zZW50IHJlcXVlc3QuXG4gIC8vIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAgYmVsb3cgaXMgYSBmb3VydGggdGhpbmcgYWdhaW46IHRoZSBQT0xJQ1kgdGhhdFxuICAvLyBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyBuZWVkZWQgYXQgYWxsLlxuICB8ICdpbXBlcnNvbmF0aW9uOm9wZW4nXG4gIHwgJ2ltcGVyc29uYXRpb246YXBwcm92ZSdcbiAgfCAndGVhbV9hY2Nlc3M6b3BlbidcbiAgLy8gUmVnaXN0cnkuIFRocmVlIHJ1bmdzLCBiZWNhdXNlIHRoZSB3cml0ZSBoYWxmIGhhcyB0d28gdmVyeSBkaWZmZXJlbnRcbiAgLy8gYmxhc3QgcmFkaWk6IGB3cml0ZWAgQ09QSUVTIGEgbWFuaWZlc3QgKGFkZGl0aXZlIOKAlCBpdCBjcmVhdGVzIGEgdGFnLFxuICAvLyBub3RoaW5nIHN0b3BzIHJlc29sdmluZyksIGBwdXJnZWAgREVMRVRFUyBvbmUgKGEgdGVuYW50J3MgcGlwZWxpbmUgb3IgYVxuICAvLyBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZSBjYW4gc3RvcCByZXNvbHZpbmcsIHdpdGggbm8gdW5kbykuXG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICB8ICdyZWdpc3RyeTpwdXJnZSdcbiAgLy8gT3JnYW5pemF0aW9uIHNldHRpbmdzLiBGb3VyIFJFU09VUkNFUywgZWFjaCB3aXRoIHRoZSBgOndyaXRlYCBhY3Rpb24sIHJhdGhlclxuICAvLyB0aGFuIG9uZSBgb3JnYCByZXNvdXJjZSB3aXRoIGZvdXIgbm91bi1zaGFwZWQgYWN0aW9ucyDigJQgdGhlc2UgYXJlIHRoZSBvcmcnc1xuICAvLyBvd24gY29uZmlndXJhdGlvbiBzdGF0ZSwgd2hpY2ggaXMgd2hhdCBgOndyaXRlYCBtZWFucyBoZXJlIChgOm1hbmFnZWAgaXNcbiAgLy8gcmVzZXJ2ZWQgZm9yIGFkbWluaXN0ZXJpbmcgYSBjb2xsZWN0aW9uIG9mIG90aGVyIGVudGl0aWVzOiBtZW1iZXJzLCByb2xlcyxcbiAgLy8gaW52aXRhdGlvbnMsIHNlcnZpY2UgYWNjb3VudHMsIGJpbGxpbmcpLlxuICAvL1xuICAvLyAgLSBgb3JnX3NldHRpbmdzOndyaXRlYCAgICAgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZ19pZHA6d3JpdGVgICAgICAgICAgICDigJQgU1NPIC8gSWRQIGNvbmZpZ3VyYXRpb24gKHNlbnNpdGl2ZTogY29udHJvbHMgbG9naW4pLlxuICAvLyAgLSBgb3JnX2ttczp3cml0ZWAgICAgICAgICAgIOKAlCBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgY29uZmlndXJhdGlvblxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbnNpdGl2ZTogY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9sc1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvIG1heSBWSUVXIHRoZSBvcmcncyBkYXRhIGFzIGEgbWVtYmVyKS5cbiAgLy9cbiAgLy8gVGhlIGxhc3QgdGhyZWUgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZ19zZXR0aW5nczp3cml0ZWAgc28gYSBjdXN0b20gcm9sZSBjYW5cbiAgLy8gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGEgXCJzZXR0aW5ncyBtYW5hZ2VyXCJcbiAgLy8gcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvIHN3aXRjaCB0aGUgb3JnIHRvXG4gIC8vIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZSBhZG1pbi9vd25lclxuICAvLyBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwIGZ1bGxcbiAgLy8gYWNjZXNzLlxuICB8ICdvcmdfc2V0dGluZ3M6d3JpdGUnXG4gIHwgJ29yZ19pZHA6d3JpdGUnXG4gIHwgJ29yZ19rbXM6d3JpdGUnXG4gIHwgJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJztcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBhY3Rpb25zIGEgcGVybWlzc2lvbiBpZCBtYXkgZW5kIGluIOKAlCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlXG4gKiBgcmVzb3VyY2U6YWN0aW9uYCBzdHJhdGVneSB0aGUgZG9jcyBkZXNjcmliZS5cbiAqXG4gKiBJdCBpcyBjbG9zZWQgZm9yIG9uZSBjb25jcmV0ZSByZWFzb246IGBpc011dGF0aW9uUGVybWlzc2lvbmAgKGZyb250ZW5kXG4gKiBgbGliL2F1dGgtaGVscGVycy50c2ApIGNsYXNzaWZpZXMgcmVhZCB2cyB3cml0ZSBCWSBTVUZGSVgsIGFuZCB0aGF0IGlzIHdoYXRcbiAqIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFmZm9yZGFuY2UgZHVyaW5nIGEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gQVxuICogbm91bi1zaGFwZWQgYWN0aW9uICh0aGUgZm9ybWVyIGBvcmc6c2V0dGluZ3NgIGFuZCBgY29uc29sZXM6ZGF0YXN0b3JlYCkgY2Fubm90IGJlIGNsYXNzaWZpZWRcbiAqIGJ5IG5hbWUsIHNvIGVhY2ggb25lIGhhZCB0byBiZSBoYW5kLWxpc3RlZCDigJQgYW5kIGEgcGVybWlzc2lvbiBhZGRlZCB3aXRob3V0XG4gKiByZW1lbWJlcmluZyB0aGF0IGxpc3QgcmVuZGVycyBhbiBlbmFibGVkIGNvbnRyb2wgdGhhdCBkZWFkLWVuZHMgb24gYSA0MDMuXG4gKlxuICogUmVhZHMgYXJlIGA6cmVhZGAgYW5kIGA6cm9sbHVwYCAoYSByZWFkLVZJU0lCSUxJVFkgc2NvcGUpLiBFdmVyeXRoaW5nIGVsc2UgaXNcbiAqIGEgd3JpdGUuIFRoZSBmaXZlIGRvbWFpbiB2ZXJicyBhcmUga2VwdCBiZWNhdXNlIGVhY2ggbmFtZXMgYW4gYWN0aW9uIHdpdGggbm9cbiAqIHN5bm9ueW0gaW4gdGhpcyB2b2NhYnVsYXJ5IOKAlCBgOmV4cG9ydGAgaXMgZWdyZXNzIHJhdGhlciB0aGFuIG11dGF0aW9uLFxuICogYDppbnN0YWxsYCBpcyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiBhdXRob3JpbmcsIGA6bW9kZXJhdGVgIGFuZCBgOnZlcmlmeWAgYXJlXG4gKiBlY29zeXN0ZW0gZGVjaXNpb25zLCBhbmQgYDpvcGVyYXRlYCBtb3ZlcyBhbm90aGVyIHRlbmFudCdzIG1vbmV5LlxuICpcbiAqIGBQRVJNSVNTSU9OX0lEX1NIQVBFYCBhbmQgdGhpcyBsaXN0IGFyZSBhc3NlcnRlZCBvdmVyIHRoZSB3aG9sZSBjYXRhbG9nIGluXG4gKiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgLCBzbyBhZGRpbmcgYW4gb2ZmLXN0cmF0ZWd5IGlkIGZhaWxzXG4gKiB0aGVyZSByYXRoZXIgdGhhbiBhdCBhIDQwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fQUNUSU9OUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdyZWFkJywgJ3JvbGx1cCcsXG4gICd3cml0ZScsICdtYW5hZ2UnLCAncHVibGlzaCcsICdvcGVuJyxcbiAgJ2V4cG9ydCcsICdpbnN0YWxsJywgJ21vZGVyYXRlJywgJ3ZlcmlmeScsICdvcGVyYXRlJywgJ3B1cmdlJywgJ2FwcHJvdmUnLFxuXTtcblxuLyoqIGByZXNvdXJjZTphY3Rpb25gLCB3aGVyZSByZXNvdXJjZSBpcyBgc25ha2VfY2FzZWAgYW5kIGFjdGlvbiBpcyBpbiB7QGxpbmsgUEVSTUlTU0lPTl9BQ1RJT05TfS4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0lEX1NIQVBFID0gL15bYS16XVthLXowLTlfXSo6W2Etel0rJC87XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZXM6cHVibGlzaCcsICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6aW5zdGFsbCcsICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgJ3B1Ymxpc2hlcnM6bWFuYWdlJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLCAncHVibGlzaGVyczp2ZXJpZnknLFxuICAncGxhdGZvcm06cmVhZCcsICdvcmdzOnJlYWQnLCAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLCAncXVvdGFzOm1hbmFnZScsICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLCAnYXVkaXQ6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsICdyZWdpc3RyeTpwdXJnZScsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLCAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAnb3JnX3NldHRpbmdzOndyaXRlJywgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFRoZSBDTE9TRUQgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB7QGxpbmsgUGVybWlzc2lvbn0gYW5kIGRlY2lkZSBhY2Nlc3MuXG4gKlxuICogXCJJcyBwZXJtaXNzaW9uIFggZW5mb3JjZWQgYW55d2hlcmU/XCIgaGFzIHRvIGJlIGFuc3dlcmFibGUgc3RhdGljYWxseSwgd2hpY2hcbiAqIGEgZ3JlcCBjYW4ndCBkbzogZm91ciBkaWZmZXJlbnQgY2FsbCBzaGFwZXMgY29uc3VtZSBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGFzIFVORU5GT1JDRUQgd2hlbiBpdFxuICogaXMgaW4gZmFjdCBlbmZvcmNlZCBvbiBldmVyeSB0ZW1wbGF0ZSBwdWJsaXNoLlxuICpcbiAqIFRoZXkgYWxsIGJvdHRvbSBvdXQgaW4gYHVzZXJIYXNQZXJtaXNzaW9uYCwgc28gdGhlIFJVTlRJTUUgcHJpbWl0aXZlIHdhc1xuICogYWxyZWFkeSBvbmUuIFRoaXMgY29uc3RhbnQgbWFrZXMgdGhlIFNUQVRJQyBzdXJmYWNlIG9uZSBhcyB3ZWxsOiBpdCBuYW1lc1xuICogZXZlcnkgZW50cnkgcG9pbnQsIHNvIGBwZXJtaXNzaW9uLWNvdmVyYWdlLnRlc3QudHNgIGNhbiBlbnVtZXJhdGUgdGhlIGNhdGFsb2dcbiAqIGFuZCByZXBvcnQgZWFjaCBwZXJtaXNzaW9uJ3MgZW5mb3JjZW1lbnQgc2l0ZXMgd2l0aG91dCBndWVzc2luZy4gQSBuZXcgZ2F0ZVxuICogdGhhdCB0YWtlcyBhIGBQZXJtaXNzaW9uYCBtdXN0IGJlIGxpc3RlZCBoZXJlLCBvciB0aGUgY292ZXJhZ2UgcmVwb3J0IHN0YXJ0c1xuICogbHlpbmcgYWJvdXQgdGhlIHBlcm1pc3Npb25zIG9ubHkgdGhhdCBnYXRlIGVuZm9yY2VzLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9HQVRFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIE1pZGRsZXdhcmUgZ2F0ZXMgKHJvdXRlIGxldmVsKSDigJQgYWxsIGFueS1vZiBleGNlcHQgcmVxdWlyZUFsbFBlcm1pc3Npb25zLlxuICAncmVxdWlyZVBlcm1pc3Npb24nLFxuICAncmVxdWlyZUFsbFBlcm1pc3Npb25zJyxcbiAgJ3JlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlJyxcbiAgLy8gVGhlIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBjaGFpbiAoc3lzdGVtIG9yZyArIHBlcm1pc3Npb24gKyBhYWwyKS5cbiAgJ3JlcXVpcmVTeXN0ZW1PcmdQZXJtaXNzaW9uJyxcbiAgLy8gVGhlIHNpbmdsZSBydW50aW1lIHByaW1pdGl2ZSBldmVyeSBnYXRlIGFib3ZlIGRlbGVnYXRlcyB0bzsgYWxzbyBjYWxsZWRcbiAgLy8gZGlyZWN0bHkgd2hlcmUgYSBjb250cm9sbGVyIGJyYW5jaGVzIG9uIGEgY2FwYWJpbGl0eSByYXRoZXIgdGhhbiByZWplY3RpbmcuXG4gICd1c2VySGFzUGVybWlzc2lvbicsXG4gICdoYXNQZXJtaXNzaW9uJyxcbiAgLy8gVmlzaWJpbGl0eSBoZWxwZXJzIOKAlCB0aGV5IHRha2UgdGhlIGVudGl0eSdzIFBVQkxJU0ggcGVybWlzc2lvbi5cbiAgJ3JlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAnY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAncmVzb2x2ZVZpc2liaWxpdHknLFxuICAvLyBxdW90YSdzIG93biB3cmFwcGVyLiBJdCBkZWxlZ2F0ZXMgdG8gYHJlcXVpcmVQZXJtaXNzaW9uYCwgYnV0IGl0IHRha2VzIHRoZVxuICAvLyBpZCBhcyBhbiBPUFRJT04gKGBhdXRob3JpemVPcmcoeyBwZXJtaXNzaW9uOiAncXVvdGFzOm1hbmFnZScgfSlgKSBiZWNhdXNlIGl0XG4gIC8vIGFsc28gY2Fub25pY2FsaXplcyB0aGUgYDpvcmdJZGAgcGFyYW0sIHdoaWNoIHRoZSByb3V0ZSBjYW5ub3QgZHJvcC4gV2l0aG91dFxuICAvLyB0aGlzIGVudHJ5IHRoZSBjb3ZlcmFnZSBzY2FuIHJlcG9ydGVkIGBxdW90YXM6bWFuYWdlYCBhcyBlbmZvcmNlZCBub3doZXJlLlxuICAnYXV0aG9yaXplT3JnJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnUmVnaXN0ZXIgZGVwbG95bWVudHMnLCBkZXNjcmlwdGlvbjogJ1JlY29yZCBhbmQgcmVtb3ZlIHRoZSBkZXBsb3llZCBzdGFjayBhbmQgc3RlcCBtYW5pZmVzdCBiZWhpbmQgYSBwaXBlbGluZSAodGhlIHBpcGVsaW5lIHJlZ2lzdHJ5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBnb2xkZW4tcGF0aCB0ZW1wbGF0ZSBjYXRhbG9nJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnU2hhcmUgYSB0ZW1wbGF0ZSBiZXlvbmQgeW91ciBvcmcgKHB1YmxpYyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAncGx1Z2luczpyZWFkJywgbGFiZWw6ICdWaWV3IHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGx1Z2lucyBhbmQgYnVpbGRzJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwbHVnaW5zIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6aW5zdGFsbCcsIGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2luIGluc3RhbGxzJywgZGVzY3JpcHRpb246IFwiU2V0IHlvdXIgb3JnJ3MgcGx1Z2luIGNvbnN1bXB0aW9uIHBvbGljeSBhbmQgYXBwcm92ZSBvciBkZW55IGluc3RhbGwgcmVxdWVzdHMgd2l0aGluIHRoZSBvcmdcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwdWJsaXNoZXIgcHJvZmlsZScsIGRlc2NyaXB0aW9uOiBcIk1hbmFnZSB5b3VyIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlIGFuZCBzdWJtaXQgcHVibGlzaCwgdmVyaWZpY2F0aW9uLCB0cmFuc2ZlciwgYW5kIGFkdmlzb3J5IHJlcXVlc3RzXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbnM6bW9kZXJhdGUnLCBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOnZlcmlmeScsIGxhYmVsOiAnVmVyaWZ5IHB1Ymxpc2hlcnMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgVmVyaWZpZWQgYXBwbGljYXRpb25zLCBwdWJsaXNoZXIgdGllciBhbmQgcHJvZmlsZSBjaGFuZ2VzLCBhbmQgb3duZXJzaGlwIHRyYW5zZmVycyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsYXRmb3JtOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGxhdGZvcm0gb3BlcmF0aW9ucycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MgYW5kIHRoZSBjcm9zcy10ZW5hbnQgb3JnYW5pemF0aW9uIGxpc3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxsIG9yZ2FuaXphdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0xpc3QgYW5kIG9wZW4gZXZlcnkgb3JnYW5pemF0aW9uIG9uIHRoZSBkZXBsb3ltZW50IFxcdTIwMTQgdGhlIHJvc3RlciB0aGUgb3BlcmF0b3Igc3VyZmFjZXMgd29yayBmcm9tIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnYmlsbGluZzpvcGVyYXRlJywgbGFiZWw6ICdPcGVyYXRlIGRpc2NvdW50cyBhbmQgcHJvbW90aW9ucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBhcHBseSBhbmQgcmV2b2tlIGRpc2NvdW50IHRva2VucyBhbmQgcHJvbW90aW9uIGNhbXBhaWducyBhY3Jvc3MgdGVuYW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBvYnNlcnZhYmlsaXR5IGNvbnNvbGVzJywgZGVzY3JpcHRpb246ICdPcGVuIEdyYWZhbmEgYW5kIEtpYWxpIOKAlCBkYXNoYm9hcmRzLCB0cmFmZmljIGFuZCBtZXNoIGhlYWx0aCBhY3Jvc3MgZXZlcnkgdGVuYW50IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnZGF0YWJhc2VfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBkYXRhYmFzZSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzIOKAlCBhIGRpcmVjdCByZWFkL3dyaXRlIHNoZWxsIG92ZXIgZXZlcnkgdGVuYW50XFx1MjAxOXMgcm93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgb2JqZWN0LXN0b3JlIGNvbnNvbGUnLCBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIFJ1c3RGUyAoUzMpIGNvbnNvbGUg4oCUIGxpc3QgYW5kIGRlbGV0ZSBvYmplY3RzIGluIGV2ZXJ5IGJ1Y2tldCwgaW5jbHVkaW5nIHRoZSBhdWRpdCBjaGFpbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29uY2FsbDptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBvbi1jYWxsIHBhZ2luZycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGFnaW5nIHBvc3R1cmUgYW5kIHNlbmQgYSB0ZXN0IHBhZ2UgKHN5c3RlbSBvcmcgb25seTsgdGhlIHJvdGEgbGl2ZXMgd2l0aCB0aGUgcHJvdmlkZXIpJywgY2F0ZWdvcnk6ICdPbi1jYWxsJyB9LFxuICB7IGlkOiAnc3VwcG9ydF9jYXNlczp3cml0ZScsIGxhYmVsOiAnV29yayB0aGUgc3VwcG9ydCBkZXNrJywgZGVzY3JpcHRpb246ICdUcmlhZ2UgdGhlIHN1cHBvcnQgcXVldWUsIGFzc2lnbiBhbmQgcmUtcHJpb3JpdGlzZSBjYXNlcywgd3JpdGUgaW50ZXJuYWwgbm90ZXMsIGFuZCByZWNvcmQgaW5jaWRlbnRzIGFnYWluc3QgYSBzdXBwb3J0IGNvbnRyYWN0IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdTdXBwb3J0IGRlc2snIH0sXG4gIHsgaWQ6ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLCBsYWJlbDogJ0F1dGhvciBjYW5uZWQgcmVwbGllcycsIGRlc2NyaXB0aW9uOiAnV3JpdGUgYW5kIHJldGlyZSB0aGUgcmV1c2FibGUgc3VwcG9ydCByZXBsaWVzIG9mZmVyZWQgdG8gZXZlcnkgY3VzdG9tZXIgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGwgc3Vic2NyaXB0aW9ucycsIGRlc2NyaXB0aW9uOiAnVmlldyBldmVyeSBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24sIHBsYW4gbWl4IGFuZCBiaWxsaW5nIGV2ZW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdDaGFuZ2UgYW55IHN1YnNjcmlwdGlvbicsIGRlc2NyaXB0aW9uOiAnQ2hhbmdlIGEgcGxhbiwgc2V0IGEgc3VwcG9ydCBmbG9vciwgYW5kIGNhbmNlbCBhbiBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOm1hbmFnZScsIGxhYmVsOiAnQWRtaW5pc3RlciBhbnkgb3JnYW5pemF0aW9uJywgZGVzY3JpcHRpb246ICdSZW5hbWUsIHJlLXRpZXIsIG1vdmUgYW5kIGRlbGV0ZSBhbnkgb3JnYW5pemF0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAncXVvdGFzOm1hbmFnZScsIGxhYmVsOiAnQ2hhbmdlIGFueSBxdW90YScsIGRlc2NyaXB0aW9uOiAnUmFpc2UsIHJlc2V0IGFuZCBjbGVhciBhbm90aGVyIG9yZ2FuaXphdGlvblxcdTIwMTlzIHF1b3RhcyAoc3lzdGVtIG9yZyBvbmx5OyB2aWV3aW5nIHRoZW0gcmlkZXMgcGxhdGZvcm06cmVhZCknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5fcXVldWU6bWFuYWdlJywgbGFiZWw6ICdSdW4gdGhlIHBsdWdpbiBidWlsZCBxdWV1ZScsIGRlc2NyaXB0aW9uOiAnUmVhZCBidWlsZC1xdWV1ZSBkZXB0aCBhbmQgcHVyZ2UgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnYXVkaXQ6cmVhZCcsIGxhYmVsOiAnVmlldyB0aGUgYXVkaXQgbG9nJywgZGVzY3JpcHRpb246IFwiUmVhZCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIHRhbXBlci1ldmlkZW50IGF1ZGl0IHRyYWlsXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cmVhZCcsIGxhYmVsOiAnVmlldyByZXBvcnRzJywgZGVzY3JpcHRpb246ICdWaWV3IGFuYWx5dGljcyBhbmQgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnJvbGx1cCcsIGxhYmVsOiAnUm9sbCB1cCB0ZWFtIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgZGVzY2VuZGFudCB0ZWFtcyB3aGVuIHZpZXdpbmcgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOndyaXRlJywgbGFiZWw6ICdBdXRob3Igc3Rha2Vob2xkZXIgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBzY2hlZHVsZSBhbmQgZHJhZnQgc2NoZWR1bGVkIHJlcG9ydHMgZm9yIG1hbmFnZXJzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCByZXBvcnRzIGV4dGVybmFsbHknLCBkZXNjcmlwdGlvbjogJ1B1Ymxpc2ggYSByZXBvcnQgYW5kIG1pbnQgZXhwaXJpbmcgc2hhcmUgbGlua3MgZm9yIHBlb3BsZSBvdXRzaWRlIHRoZSBwbGF0Zm9ybScsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczpyZWFkJywgbGFiZWw6ICdWaWV3IG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdWaWV3IG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczp3cml0ZScsIGxhYmVsOiAnU2VuZCBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnU2VuZCBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnYmlsbGluZzpyZWFkJywgbGFiZWw6ICdWaWV3IGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgc3Vic2NyaXB0aW9ucyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBzdWJzY3JpcHRpb25zLCBhZGQtb25zLCBhbmQgdGhlIGJpbGxpbmcgcG9ydGFsJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncXVvdGFzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcXVvdGFzJywgZGVzY3JpcHRpb246ICdWaWV3IG9yZ2FuaXphdGlvbiBxdW90YXMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cmVhZCcsIGxhYmVsOiAnVmlldyByZWdpc3RyeScsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgY29udGFpbmVyIGltYWdlIHJlZ2lzdHJ5JywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OndyaXRlJywgbGFiZWw6ICdDb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0NvcHkgYW5kIHByb21vdGUgYSBjb250YWluZXIgaW1hZ2UgaW50byBhbm90aGVyIHJlcG9zaXRvcnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cHVyZ2UnLCBsYWJlbDogJ0RlbGV0ZSBjb250YWluZXIgaW1hZ2VzJywgZGVzY3JpcHRpb246ICdEZWxldGUgaW1hZ2VzIGFuZCByZXBvc2l0b3JpZXMsIGFuZCBydW4gcmVnaXN0cnkgZ2FyYmFnZSBjb2xsZWN0aW9uJywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246b3BlbicsIGxhYmVsOiAnT3BlbiBhbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24nLCBkZXNjcmlwdGlvbjogXCJWaWV3IGEgY3VzdG9tZXIncyBhY2NvdW50IGFzIG9uZSBvZiBpdHMgdXNlcnMsIHdpdGggdGhhdCBvcmdhbml6YXRpb24ncyBjb25zZW50XCIsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246YXBwcm92ZScsIGxhYmVsOiAnQW5zd2VyIGltcGVyc29uYXRpb24gcmVxdWVzdHMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgb3IgZGVueSBhIHJlcXVlc3QgdG8gdmlldyBhIG1lbWJlciBvZiB0aGlzIG9yZ2FuaXphdGlvbiBhcyB0aGF0IG1lbWJlcicsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ3RlYW1fYWNjZXNzOm9wZW4nLCBsYWJlbDogXCJWaWV3IGEgdGVhbSBtZW1iZXIncyBhY2NvdW50XCIsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBtZW1iZXIgb2Ygb25lIG9mIHRoaXMgb3JnYW5pemF0aW9uJ3MgdGVhbXMgYXMgdGhhdCBtZW1iZXIgKHJlYWQtb25seSlcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX3NldHRpbmdzOndyaXRlJywgbGFiZWw6ICdPcmdhbml6YXRpb24gc2V0dGluZ3MnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBnZW5lcmFsIG9yZyBzZXR0aW5ncyBhbmQgQUkgY29uZmlnJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfaWRwOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19rbXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBlbmNyeXB0aW9uIGtleXMnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uIGtleXMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgaW1wZXJzb25hdGlvbiBwb2xpY3knLCBkZXNjcmlwdGlvbjogJ0NvbnRyb2wgd2hldGhlciBwbGF0Zm9ybSBvcGVyYXRvcnMgbWF5IHZpZXcgdGhlIG9yZ2FuaXphdGlvbiBhcyBvbmUgb2YgaXRzIG1lbWJlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbl07XG5cbmNvbnN0IFBFUk1JU1NJT05fTEFCRUxTID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oUEVSTUlTU0lPTl9DQVRBTE9HLm1hcCgocCkgPT4gW3AuaWQsIHAubGFiZWxdKSk7XG5cbi8qKiBIdW1hbiBsYWJlbCBmb3IgYSBwZXJtaXNzaW9uIGlkIChmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQgZm9yIGFuIHVua25vd24gb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uTGFiZWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQRVJNSVNTSU9OX0xBQkVMUy5nZXQoaWQpID8/IGlkO1xufVxuXG4vKiogT25lIHBpY2tlciBzZWN0aW9uOiBhIGNhdGVnb3J5IGFuZCB0aGUgcGVybWlzc2lvbnMgaXQgY29udGFpbnMsIGluIGNhdGFsb2cgb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTWV0YVtdO1xufVxuXG4vKiogR3JvdXAgYSBwZXJtaXNzaW9uIGxpc3QgaW50byBjYXRlZ29yaWVzLCBwcmVzZXJ2aW5nIGNhdGFsb2cgb3JkZXIuICovXG5mdW5jdGlvbiBncm91cEJ5Q2F0ZWdvcnkocGVybXM6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10pOiBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSB7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFBlcm1pc3Npb25NZXRhW10+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBwZXJtcykge1xuICAgIGlmICghYnlDYXRlZ29yeS5oYXMocC5jYXRlZ29yeSkpIHsgYnlDYXRlZ29yeS5zZXQocC5jYXRlZ29yeSwgW10pOyBvcmRlci5wdXNoKHAuY2F0ZWdvcnkpOyB9XG4gICAgYnlDYXRlZ29yeS5nZXQocC5jYXRlZ29yeSkhLnB1c2gocCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5LCBwZXJtaXNzaW9uczogYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpISB9KSk7XG59XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUGVybWlzc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUGVybWlzc2lvbiB7XG4gIHJldHVybiAoQUxMX1BFUk1JU1NJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGdyYW50YWJsZSB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBDVVNUT00gUm9sZSDigJRcbiAqIHRoZXkgZ2F0ZSBwbGF0Zm9ybS1vcGVyYXRvciBzdXJmYWNlcyAodGhlIHNoYXJlZCBpbWFnZSByZWdpc3RyeSksIHNvIGFsbG93aW5nXG4gKiBhbiBvcmcgYWRtaW4gdG8gbWludCBhIFJvbGUgY2FycnlpbmcgdGhlbSB3b3VsZCBiZSBhIGxhdGVudCBwcml2aWxlZ2VcbiAqIGVzY2FsYXRpb24uIFRoZXkgYXJlIE5PVCBzZWVkZWQgaW50byBBTlkgYnVpbHQtaW4gUm9sZSBidW5kbGUgKG5laXRoZXJcbiAqIGBtZW1iZXJgIG5vciBgYWRtaW5gKSwgc28gdGhlIG9ubHkgaG9sZGVyIGlzIGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSDigJRcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGltYWdlLXJlZ2lzdHJ5IGdhdGVzIHRoYXQgcmVxdWlyZSB0aGVtIGVmZmVjdGl2ZWx5XG4gKiBzdXBlcmFkbWluLW9ubHkuIFRoaXMgbGlzdCBBTFNPIGJsb2NrcyBjdXN0b20tUm9sZSBhdXRob3JpbmcgZnJvbSByZXF1ZXN0aW5nXG4gKiB0aGVtIChzZWUgcGxhdGZvcm0gYHNhbml0aXplUGVybWlzc2lvbnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBgcmVnaXN0cnk6cmVhZGAgYW5kIGByZWdpc3RyeTp3cml0ZWAgd2VyZSBib3RoIGhlcmUuIFdoYXQgc3RheXMgaXMgdGhlXG4gIC8vIGRlc3RydWN0aXZlIHJ1bmcgYWxvbmU6IGRlbGV0aW5nIGEgbWFuaWZlc3Qgb3IgYSB3aG9sZSByZXBvc2l0b3J5LCBhbmQgdGhlXG4gIC8vIEdDIHBydW5lLCBlYWNoIG9mIHdoaWNoIGNhbiByZW1vdmUgYW4gaW1hZ2UgYSB0ZW5hbnQncyBwaXBlbGluZSBzdGlsbFxuICAvLyByZXNvbHZlcyDigJQgaW5jbHVkaW5nIHRoZSBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZXMgdGhlIHN1cHBseSBjaGFpblxuICAvLyB2ZXJpZmllcyBhZ2FpbnN0LiBUaGF0IGlzIHRoZSBvbmUgcmVnaXN0cnkgYWN0aW9uIHdpdGggbm8gdW5kbywgc28gaXQga2VlcHNcbiAgLy8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBhdWRpZW5jZTogdGhlIGZsYWcsIGFuZCBuZXZlciBhIFJvbGUuXG4gICdyZWdpc3RyeTpwdXJnZScsXG5dO1xuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgZ292ZXJuIHRoZSBQTFVHSU4gRUNPU1lTVEVNIGFuZCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBMaWtlXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSB0aGV5IGFyZSBpbiBubyBtZW1iZXIvYWRtaW4vb3duZXIgYnVuZGxlLFxuICogYW5kIG5vIFJvbGUgYXV0aG9yZWQgaW4gYSBURU5BTlQgbWF5IGNhcnJ5IG9uZTogcGxhdGZvcm0nc1xuICogYHNhbml0aXplUGVybWlzc2lvbnNgIGFkbWl0cyB0aGVtIG9ubHkgd2hlbiB0aGUgYXV0aG9yIGlzIGEgc3VwZXJhZG1pbiBBTkRcbiAqIHRoZSBSb2xlIGlzIGJlaW5nIHdyaXR0ZW4gaW4gdGhlIHN5c3RlbSBvcmcgaXRzZWxmIChgbWF5Q29tcG9zZVN5c3RlbU9yZ1JvbGVgKS5cbiAqXG4gKiBTbyB0aGVyZSBhcmUgdGhyZWUgZ3JhbnQgcGF0aHMsIG5vdCBvbmU6IGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSwgb25lIG9mXG4gKiB0aGUgc2VlZGVkIHN5c3RlbS1vcmcgUm9sZXMsIGFuZCBhIENVU1RPTSBzeXN0ZW0tb3JnIFJvbGUgYSBzdXBlcmFkbWluXG4gKiBjb21wb3NlZC4gVGhlIHRoaXJkIGlzIHdoYXQgbWFrZXMgdGhlIHNwbGl0IGJldHdlZW4gYHBsdWdpbnM6bW9kZXJhdGVgIGFuZFxuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCB1c2FibGUgd2l0aG91dCB3YWl0aW5nIGZvciBhIG5ldyBzZWVkIGJ1bmRsZSDigJQgd29ydGhcbiAqIGtub3dpbmcgYmVmb3JlIHJlYWRpbmcgZWl0aGVyIHBlcm1pc3Npb24gYXMgXCJ1bnJlYWNoYWJsZSBleGNlcHQgdmlhXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9XCIuXG4gKlxuICogYG9uY2FsbDptYW5hZ2VgIGlzIGNhcnJpZWQgYnkgKipQbGF0Zm9ybSBPcGVyYXRvcioqIGFuZCBieSBubyBvdGhlciBuYW1lZFxuICogcm9sZS4gVGhhdCBzcGxpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogcGFnaW5nIGlzIHRoZVxuICogdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIGNvbmNlcm4gYW5kIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZWNvc3lzdGVtXG4gKiBtb2RlcmF0aW9uLCBzbyB3aWRlbmluZyB0aGUgRWNvc3lzdGVtIE1hbmFnZXIgcm9sZSB0byBjYXJyeSBpdCB3b3VsZCBoYW5kIHRoZVxuICogcGFnZXIgdG8gcGVvcGxlIGhpcmVkIHRvIHJldmlldyBwbHVnaW5zLiBJdCBpcyBub3QgYSBwbGFjZWhvbGRlciDigJQgaXQgZ2F0ZXNcbiAqIHR3byBsaXZlIHJvdXRlcyAodGhlIHBhZ2luZyBwb3N0dXJlIHJlYWQgYW5kIHRoZSB0ZXN0IHBhZ2UpLCB1bmxpa2VcbiAqIGByZWdpc3RyeToqYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgb3BlcmF0b3Igc3VyZmFjZXMsIHN5c3RlbS1vcmctb25seSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZVxuICAvLyBjb25zb2xlcyBhcmU6IHRoZXkgcmVhZCBhbmQgbW92ZSB0aGluZ3MgYmVsb25naW5nIHRvIG9yZ2FuaXNhdGlvbnMgdGhlXG4gIC8vIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2YsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBncmFudGFibGUgaW5zaWRlIGEgdGVuYW50LlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIHRoZSBpbWFnZSByZWdpc3RyeTogcmVwb3NpdG9yeSBuYW1lcywgdGFncywgbWFuaWZlc3RzLCBibG9icyBhbmQgdGhlXG4gIC8vIHN0b3JhZ2Ugcm9sbHVwLiBQcm9tb3RlZCBvdXQgb2YgU1VQRVJBRE1JTl9PTkxZIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGJyb3dzZXJcbiAgLy8gd2FzIGludmlzaWJsZSB0byBldmVyeSBSb2xlLCBzbyBhIFBsYXRmb3JtIE9wZXJhdG9yIGRlYnVnZ2luZyBhIGZhaWxlZFxuICAvLyBwbHVnaW4gYnVpbGQgY291bGQgc2VlIHRoZSBidWlsZCBxdWV1ZSBhbmQgaXRzIGRlYWQgbGV0dGVycyBidXQgbm90IHRoZVxuICAvLyBpbWFnZXMgdGhlIGJ1aWxkIHByb2R1Y2VkIOKAlCBhbmQgdGhlIG9ubHkgd2F5IHRvIGxvb2sgd2FzIHRoZSBzdXBlcmFkbWluXG4gIC8vIGZsYWcuIEl0IHN0YXlzIHN5c3RlbS1vcmctb25seSAobm8gdGVuYW50IFJvbGUgbWF5IGNhcnJ5IGl0KSBhbmQgaXMgcGFpcmVkXG4gIC8vIHdpdGggYSBwZXItcmVwbyBvcmctb3duZXJzaGlwIGZpbHRlciB0aGF0IHJ1bnMgQUZURVIgaXQsIHNvIHdpZGVuaW5nIHRoZVxuICAvLyBwZXJtaXNzaW9uIGRvZXMgbm90IHdpZGVuIHdoaWNoIHJlcG9zaXRvcmllcyBhIGhvbGRlciBjYW4gcmVhY2g6IGFcbiAgLy8gc3lzdGVtLW9yZyBtZW1iZXIgd2hvIGlzIG5vdCBhIHN1cGVyYWRtaW4gc2VlcyBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmRcbiAgLy8gYHB1YmxpYy8qYCDigJQgdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIGFuZCBubyB0ZW5hbnQnc1xuICAvLyBgb3JnLSpgIHJlcG9zaXRvcmllcyBhdCBhbGwgKGBjYW5SZWFkUmVwb2AgaW4gdGhlIGltYWdlLXJlZ2lzdHJ5IHNlcnZpY2UpLlxuICAncmVnaXN0cnk6cmVhZCcsXG4gIC8vIENvcHlpbmcvcHJvbW90aW5nIGFuIGltYWdlLiBTeXN0ZW0tb3JnLW9ubHkgcmF0aGVyIHRoYW4gc3VwZXJhZG1pbi1vbmx5XG4gIC8vIGJlY2F1c2UgaXQgaXMgQURESVRJVkU6IGl0IHdyaXRlcyBhIG5ldyB0YWcgYW5kIG1ha2VzIG5vdGhpbmcgc3RvcFxuICAvLyByZXNvbHZpbmcsIGFuZCBgY2FuV3JpdGVSZXBvYCBjb25maW5lcyBhIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgY2FsbGVyXG4gIC8vIHRvIGBzeXN0ZW0vKmAgcmVnYXJkbGVzcy4gRGVsaWJlcmF0ZWx5IGNhcnJpZWQgYnkgTk8gYnVpbHQtaW4gYnVuZGxlIHRvZGF5XG4gIC8vIOKAlCBwcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSBqb2IsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQsXG4gIC8vIHNvIGl0IHdhaXRzIGZvciBhIFJvbGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiByaWRpbmcgYWxvbmcgd2l0aFxuICAvLyBgcGxhdGZvcm06cmVhZGAuXG4gICdyZWdpc3RyeTp3cml0ZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIE9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgaW1wZXJzb25hdGlvbiBzZXNzaW9uLiBTeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZVxuICAvLyBvYnZpb3VzIHJlYXNvbiDigJQgaXQgdmlld3MgYW4gb3JnYW5pc2F0aW9uIHRoZSBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mIOKAlFxuICAvLyBhbmQgaXQgaXMgdGhlIE9ORSBwZXJtaXNzaW9uIGluIHRoaXMgbGlzdCB0aGF0IGFsc28gaGFzIHRvIGNsZWFyIGEgZ2F0ZSB0aGVcbiAgLy8gcGVybWlzc2lvbiBzeXN0ZW0gZG9lcyBub3Qgb3duOiB0aGUgdGFyZ2V0IG9yZ2FuaXNhdGlvbidzIGNvbnNlbnQgKGl0c1xuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIHBvbGljeSksIHBsdXMgYWFsMiBhbmQgYSBzdHJvbmcgc3RlcC11cC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gc2F5cyB3aG8gbWF5IEFTSzsgdGhlIHRlbmFudCBzdGlsbCBhbnN3ZXJzLlxuICAvL1xuICAvLyBJdCBkb2VzIE5PVCBjb3ZlciBlbWVyZ2VuY3kgYWNjZXNzLiBgUE9TVCAvOnVzZXJJZC9icmVha2dsYXNzYCBieXBhc3Nlc1xuICAvLyB0ZW5hbnQgY29uc2VudCBhbmQgc28gc3RheXMgb24gdGhlIHN1cGVyYWRtaW4gZmxhZyBhbG9uZSwgYXBwcm92ZWQgYnkgYVxuICAvLyBTRUNPTkQgc3VwZXJhZG1pbiAoZm91ci1leWVzKS4gQSBwZXJtaXNzaW9uIHRoYXQgY291bGQgYmUgZGVsZWdhdGVkIG11c3Qgbm90XG4gIC8vIGJlIGFibGUgdG8gd2FsayBwYXN0IGNvbnNlbnQuXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG4gIC8vIFRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgdGFza3MuIEVhY2ggb25lIHJlcGxhY2VkIGEgYHJlcXVpcmVTeXN0ZW1BZG1pbmBcbiAgLy8gZ2F0ZSwgc28gdGhlIHBvaW50IG9mIGxpc3RpbmcgdGhlbSBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludCBvZiBhZGRpbmdcbiAgLy8gdGhlbSBhdCBhbGw6IGEgUm9sZSBjb21wb3NlZCBpbiB0aGUgc3lzdGVtIG9yZyBjYW4gY2FycnkgZXhhY3RseSBvbmUgam9iLFxuICAvLyBhbmQgbm8gUm9sZSBpbiBhbnkgdGVuYW50IGNhbiBjYXJyeSBpdCBhdCBhbGwuXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gUmVhZHMgdGhhdCBtYWtlIHRoZSBvcGVyYXRvciB2aWV3cyB1c2FibGU6IHRoZSBkYXNoYm9hcmRzIHRoZSBwb3N0dXJlIHBhbmVsc1xuICAvLyBsaXZlIG9uLCB0aGUgY3Jvc3MtdGVuYW50IGxvZyB2aWV3LCBhbmQgdGhlIGN1c3RvbWVyJ3MgcGxhbiB3aGVuIGEgbGltaXQgaXNcbiAgLy8gdGhlIHRoaW5nIGJlaW5nIGRlYnVnZ2VkLlxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBUaGUgcmVnaXN0cnkgYnJvd3NlcjogcmVwb3NpdG9yeSBuYW1lcywgdGFncyBhbmQgbWFuaWZlc3RzIGZvciB0aGUgaW1hZ2VzXG4gIC8vIHRoaXMgZGVwbG95bWVudCdzIGJ1aWxkcyBwcm9kdWNlLiBJdCB3YXMgd2l0aGhlbGQgd2hpbGUgYHJlZ2lzdHJ5OnJlYWRgIHdhc1xuICAvLyBzdXBlcmFkbWluLW9ubHkg4oCUIGEgc2VlZGVkIGJ1bmRsZSBjYXJyeWluZyBhIHN1cGVyYWRtaW4tb25seSBwZXJtaXNzaW9uXG4gIC8vIHdvdWxkIG1ha2UgdGhhdCBsaXN0IGEgbGllLCBzaW5jZSBidW5kbGVzIGJ5cGFzcyBgc2FuaXRpemVQZXJtaXNzaW9uc2AuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBwcm9tb3RlZCB0byBzeXN0ZW0tb3JnLW9ubHkgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIHNtdWdnbGVkXG4gIC8vIGluIGhlcmUsIHdoaWNoIGlzIHRoZSBvcmRlciB0aG9zZSB0d28gY2hhbmdlcyBoYXZlIHRvIGhhcHBlbiBpbi5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBBQ0NPVU5UIE1BTkFHRVIg4oCUIHRoZSBjb21tZXJjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIGEgY3VzdG9tZXIsIGFzIG9wcG9zZWQgdG9cbiAqIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gKlxuICogU3BsaXQgZnJvbSB7QGxpbmsgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlN9IHJhdGhlciB0aGFuIHBpbGVkIG9udG8gaXQsXG4gKiBiZWNhdXNlIHRoZSB0d28gam9icyBkaXZlcmdlIGF0IGV4YWN0bHkgdGhlIHBlcm1pc3Npb25zIGFkZGVkIGFsb25nc2lkZSB0aGlzXG4gKiBidW5kbGUuIGBiaWxsaW5nOm9wZXJhdGVgIE1PVkVEIGhlcmUgZnJvbSB0aGUgb3BlcmF0b3IgYnVuZGxlIGZvciB0aGF0IHJlYXNvbjpcbiAqIG1pbnRpbmcgYSBkaXNjb3VudCB0b2tlbiBpcyBhIGNvbW1lcmNpYWwgYWN0LCBub3QgYW4gb3BlcmF0aW9uYWwgb25lLCBhbmQgdGhlXG4gKiBwZXJzb24gd2hvIHJlc3RhcnRzIGEgc3R1Y2sgYnVpbGQgcXVldWUgaGFzIG5vIHJlYXNvbiB0byBob2xkIGl0LlxuICpcbiAqIFRoZSBkZXN0cnVjdGl2ZSBoYWxmIG9mIHRoZSBjYXRhbG9ndWUgbGl2ZXMgaGVyZSDigJQgYG9yZ3M6bWFuYWdlYCBjYW4gREVMRVRFXG4gKiBhbiBvcmdhbmlzYXRpb24gYW5kIGBzdWJzY3JpcHRpb25zOm1hbmFnZWAgY2FuIGNhbmNlbCBpdHMgc3Vic2NyaXB0aW9uIOKAlCBzb1xuICogdGhpcyBpcyBkZWxpYmVyYXRlbHkgdGhlIHNtYWxsZXIsIG1vcmUgcmFyZWx5LWFzc2lnbmVkIG9mIHRoZSB0d28uXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAvLyBBIHF1b3RhIGJ1bXAgaXMgYXMgb2Z0ZW4gYSBjb21tZXJjaWFsIGNvbmNlc3Npb24gYXMgYW4gb3BlcmF0aW9uYWwgb25lLCBzb1xuICAvLyBib3RoIGJ1bmRsZXMgY2FycnkgaXQuXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHdoaWNoIGlzIHRoZSBzdXJmYWNlIHRoaXMgam9iIHdvcmtzIGZyb20g4oCUIGFuZFxuICAvLyBvbmx5IHRoYXQuIEl0IHVzZWQgdG8gdGFrZSBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIGFsc28gaGFuZGVkIG92ZXIgdGhlXG4gIC8vIGRlcGxveSdzIFJMUyBtb2RlLCBLTVMgcG9zdHVyZSBhbmQgcmVuZGVyZWQgYWxlcnQgcnVsZXM6IGludGVybmFscyBhXG4gIC8vIGNvbW1lcmNpYWwgcm9sZSBoYXMgbm8gdXNlIGZvci5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIENPTlNPTEUgQURNSU5JU1RSQVRPUiDigJQgdGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBhcyBhIFJvbGUuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTIGV2ZW4gdGhvdWdoIGVhY2ggY29uc29sZSBwZXJtaXNzaW9uIGlzIGdyYW50YWJsZSBieSBoYW5kOiB3aXRoXG4gKiBubyBzZWVkZWQgUm9sZSwgdGhlIG9ubHkgcGF0aCB0byBwZ0FkbWluIHdhcyBhIHN1cGVyYWRtaW4gY29tcG9zaW5nIGEgY3VzdG9tXG4gKiBSb2xlIGZvciBpdCwgYW5kIHRoZSBvYnNlcnZlZCBvdXRjb21lIG9mIGFza2luZyBwZW9wbGUgdG8gZG8gdGhhdCBpcyB0aGF0IHRoZXlcbiAqIHJlYWNoIGZvciB0aGUgc3VwZXJhZG1pbiBGTEFHIGluc3RlYWQg4oCUIHRoZSBleGFjdCBmYWlsdXJlIHRoZXNlIHBlcm1pc3Npb25zXG4gKiB3ZXJlIGFkZGVkIHRvIHJlbW92ZS4gQSBuYW1lZCBSb2xlIGFsc28gbWFrZXMgXCJ3aG8gY2FuIG9wZW4gYSBkYXRhIHNoZWxsP1wiIG9uZVxuICogcXVlcnkgaW5zdGVhZCBvZiBhbiBhdWRpdCBvZiBldmVyeSBjdXN0b20gUm9sZS5cbiAqXG4gKiBJdCBjYXJyaWVzIGFsbCB0aHJlZSBjb25zb2xlcywgd2hpY2ggaXMgdGhlIHdob2xlIGpvYiBmb3IgdGhlIHBlcnNvbiB3aG8gaG9sZHNcbiAqIGl0LiBPTkUgQ09OU0VRVUVOQ0UgV09SVEggS05PV0lORzogYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgYW5kXG4gKiBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCBhcmUgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIGF1ZGl0IHRhbXBlci1ldmlkZW5jZVxuICogZGVzaWduIOKAlCBhIE1vbmdvIHNoZWxsIGNhbiB0cnVuY2F0ZSBhIGhhc2ggY2hhaW4ncyB0YWlsLCBhbmQgdGhlIG9iamVjdCBzdG9yZVxuICogaG9sZHMgdGhlIHNpZ25lZCBoZWFkcyB0aGF0IHdvdWxkIGV4cG9zZSB0aGUgdHJ1bmNhdGlvbiDigJQgc28gYSBob2xkZXIgb2YgdGhpc1xuICogUm9sZSBjYW4gZG8gYm90aC4gVGhlIHBlcm1pc3Npb25zIHN0YXkgU0VQQVJBVEUgZm9yIGV4YWN0bHkgdGhhdCByZWFzb246IGFcbiAqIGRlcGxveW1lbnQgdGhhdCB3YW50cyB0aGVtIGhlbGQgYnkgZGlmZmVyZW50IHBlb3BsZSBjb21wb3NlcyBhIG5hcnJvd2VyIFJvbGVcbiAqIGJ5IGhhbmQgKGEgc3VwZXJhZG1pbiBtYXkgaW5jbHVkZSBhbnkgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gaW4gYSBSb2xlXG4gKiBhdXRob3JlZCBpbiB0aGUgc3lzdGVtIG9yZykgYW5kIGFzc2lnbnMgdGhpcyBvbmUgdG8gbm9ib2R5LlxuICovXG4vKipcbiAqIFBMQVRGT1JNIE9CU0VSVkVSIOKAlCBsb29rLCBkb24ndCB0b3VjaC4gVGhlIGxhZGRlcidzIG1pc3NpbmcgYm90dG9tIHJ1bmcuXG4gKlxuICogRXZlcnkgb3RoZXIgc3lzdGVtLW9yZyBidW5kbGUgZ3JhbnRzIGEgd3JpdGUuIFRoZSBvbmUgdGhhdCBkb2VzIG5vdCDigJRcbiAqIENvbnNvbGUgQWRtaW5pc3RyYXRvciDigJQgZ3JhbnRzIGEgcmVhZCB0aGF0IElTIGEgZGF0YWJhc2Ugc2hlbGwuIFNvIHNvbWVib2R5XG4gKiB3aG8gc2hvdWxkIHNlZSB0aGUgZGVwbG95bWVudCBhbmQgY2hhbmdlIG5vdGhpbmcgKGEgbmV3IG9wZXJhdG9yIHNoYWRvd2luZywgYW5cbiAqIGF1ZGl0b3IsIGFuIG9uLWNhbGwgZW5naW5lZXIgZHVyaW5nIGEgaGFuZG92ZXIpIGhhZCB0d28gb3B0aW9uczogU3VwZXIgQWRtaW4sXG4gKiBvciBub3RoaW5nLiBUaGUgdXN1YWwgb3V0Y29tZSBvZiBhIGNob2ljZSBsaWtlIHRoYXQgaXMgdGhlIGZsYWcuXG4gKlxuICogU3RyaWN0bHkgcmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjogZXZlcnkgcGVybWlzc2lvbiBoZXJlIGVuZHMgYDpyZWFkYCwgd2hpY2hcbiAqIGBpc011dGF0aW9uUGVybWlzc2lvbmAgY2xhc3NpZmllcyBhcyBhIHJlYWQsIHNvIHRoZSBkYXNoYm9hcmQgZGlzYWJsZXMgZXZlcnlcbiAqIHdyaXRlIGFmZm9yZGFuY2UgZm9yIGEgaG9sZGVyIHJhdGhlciB0aGFuIG9mZmVyaW5nIGNvbnRyb2xzIHRoYXQgNDAzLlxuICpcbiAqIE5PVCBgYXVkaXQ6cmVhZGAuIEl0IHdvdWxkIGJlIHRoZSBvYnZpb3VzIGFkZGl0aW9uIGFuZCBpdCBpcyB0aGUgd3Jvbmcgb25lOlxuICogYGxpc3RBdWRpdEV2ZW50c2AgcGlucyBldmVyeSBub24tc3VwZXJhZG1pbiB0byB0aGVpciBPV04gb3JnLCBzbyBhIHN5c3RlbS1vcmdcbiAqIG9ic2VydmVyIGhvbGRpbmcgaXQgd291bGQgc2VlIHRoZSBzeXN0ZW0gb3JnJ3MgYXVkaXQgdHJhaWwgYW5kIG5vdGhpbmcgZWxzZSDigJRcbiAqIGFuIGFmZm9yZGFuY2UgdGhhdCBsb29rcyBsaWtlIGZsZWV0LXdpZGUgYXVkaXQgYWNjZXNzIGFuZCBpcyBub3QuIFJlYWRpbmdcbiAqIGFub3RoZXIgdGVuYW50J3MgdHJhaWwgaXMgZGVsaWJlcmF0ZWx5IHRoZSBmbGFnJ3MgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAvLyBBIHJlYWQsIGFuZCB0aGlzIFJvbGUgaXMgcmVhZHMg4oCUIHRoZSByZWdpc3RyeSBicm93c2VyIHdpdGggbmVpdGhlciBvZiB0aGVcbiAgLy8gdHdvIHdyaXRlIHJ1bmdzIChgcmVnaXN0cnk6d3JpdGVgIGNvcGllcywgYHJlZ2lzdHJ5OnB1cmdlYCBkZWxldGVzKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgc28gYSBob2xkZXIgY2FuIGZpbmQgdGhlIG9yZyB0aGV5IHdlcmUgYXNrZWRcbiAgLy8gYWJvdXQgd2l0aG91dCBhIHNlY29uZCBSb2xlIOKAlCBhbmQgbm90aGluZyBtb3JlLiBUaGlzIHdhcyBgcGxhdGZvcm06cmVhZGAsXG4gIC8vIHdoaWNoIG1lYW50IG9wZW5pbmcgYSBkYXRhYmFzZSBjb25zb2xlIGFsc28gZ3JhbnRlZCB0aGUgZGVwbG95J3Mgb3duXG4gIC8vIGNvbmZpZ3VyYXRpb24sIGZvciBubyByZWFzb24gYmV5b25kIHRoZSB0d28gc2hhcmluZyBhIGdhdGUuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBSRUdJU1RSWSBPUEVSQVRPUiDigJQgbW92ZXMgY29udGFpbmVyIGltYWdlcyBhcm91bmQsIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gUHJvbW90aW5nIGFuIGltYWdlIOKAlCBjb3B5aW5nIGEgYnVpbHQgdGFnIGZyb20gb25lIHJlcG9zaXRvcnlcbiAqIHRvIHRoZSBvbmUgYSByZWxlYXNlIHJlc29sdmVzIOKAlCBpcyBhIGpvYiBzb21lYm9keSBkb2VzLCBhbmQgdW50aWwgbm93IHRoZSBvbmx5XG4gKiBpZGVudGl0eSB0aGF0IGNvdWxkIGRvIGl0IHdhcyBhIHN1cGVyYWRtaW4uIGByZWdpc3RyeTp3cml0ZWAgaGFzIG5vIG90aGVyXG4gKiBjYXJyaWVyLCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzXG4gKiBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2UgKHRoZSBgcGxhdGZvcm06cmVhZGAgZmFpbHVyZSwgcGlubmVkIGJ5IHRoZVxuICogXCJhdCBsZWFzdCBvbmUgc2VlZGVkIGNhcnJpZXJcIiBhc3NlcnRpb24gaW4gYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKiBTbyBzcGxpdHRpbmcgYHJlZ2lzdHJ5OnB1cmdlYCBvdXQgb2YgYHJlZ2lzdHJ5OndyaXRlYCBpcyBvbmx5IGhhbGYgdGhlIGNoYW5nZTpcbiAqIHRoZSBhZGRpdGl2ZSBoYWxmIG5lZWRzIGEgUm9sZSBvciB0aGUgc3BsaXQgYnV5cyBub3RoaW5nLlxuICpcbiAqIFdIWSBJVCBJUyBOT1QgUEFSVCBPRiBQTEFURk9STSBPUEVSQVRPUi4gVGhhdCBSb2xlIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kXG4gKiBhbHJlYWR5IHJlYWRzIHRoZSByZWdpc3RyeS4gUHJvbW90aW5nIGFuIGltYWdlIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgbm90IGFuXG4gKiBvcGVyYXRpb25hbCBzaWRlIGVmZmVjdCwgYW5kIHJvbGxpbmcgaXQgaW50byB0aGUgUm9sZSBldmVyeW9uZSBvbiBjYWxsIGhvbGRzXG4gKiB3b3VsZCBtZWFuIHRoZSBwYWdlciByb3RhdGlvbiBjYW4gcmV0YWcgYSByZWxlYXNlIGF0IDNhbS4gVGhlIHR3byBSb2xlc1xuICogY29tcG9zZSBpbnN0ZWFkIOKAlCBhIG1lbWJlciBtYXkgaG9sZCBhbnkgbnVtYmVyLCBhbmQgcGVybWlzc2lvbnMgYXJlIHRoZSB1bmlvbi5cbiAqXG4gKiBXSFkgSVQgSVMgT05MWSBUV08gUEVSTUlTU0lPTlMuIERlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6IG5vIGBwbGF0Zm9ybTpyZWFkYCxcbiAqIG5vIGNvbnNvbGUsIG5vIGBvcmdzOnJlYWRgLiBgY2FuUmVhZFJlcG9gL2BjYW5Xcml0ZVJlcG9gIGNvbmZpbmUgYVxuICogbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBob2xkZXIgdG8gYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kIGBwdWJsaWMvKmAg4oCUXG4gKiB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgc28gdGhlIFJvbGUgY2Fubm90IHJlYWNoIGFcbiAqIHRlbmFudCdzIHJlcG9zaXRvcmllcyBhdCBhbGwsIGFuZCBhIGhvbGRlciB3aG8gYWxzbyBuZWVkcyB0aGUgb3BlcmF0b3Igdmlld3NcbiAqIGdldHMgdGhlIG9wZXJhdG9yIFJvbGUgdG9vLiBJdCBkb2VzIE5PVCBjYXJyeSBgcmVnaXN0cnk6cHVyZ2VgLCB3aGljaCBpcyBpblxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIGluIG5vIGJ1bmRsZSBieSBkZXNpZ246IGFuIGltYWdlXG4gKiBwcm9tb3RlciBoYXMgbm8gYnVzaW5lc3MgZGVsZXRpbmcgdGhlIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgQUdFTlQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gYHBsYXRmb3JtOnJlYWRgLCBubyBjb25zb2xlIGFuZCBubyBiaWxsaW5nIHdyaXRlOiBhblxuICogYWdlbnQgYW5zd2VycyBjYXNlcyBhbmQgd3JpdGVzIHRoZSBjYW5uZWQgcmVwbGllcy4gYHN1YnNjcmlwdGlvbnM6cmVhZGAgaXNcbiAqIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgcXVlc3Rpb24gb24gYW55IGNhc2UgaXMgd2hhdCB0aGUgY3VzdG9tZXIgaXMgZW50aXRsZWRcbiAqIHRvLCBhbmQgd2l0aG91dCBpdCBhbiBhZ2VudCB3b3VsZCBoYXZlIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIE5FVywgYW5kIHRoZSBnYXAgdGhlIHNwbGl0IGV4cG9zZWQ6IGFuIGFnZW50IHRyaWFnaW5nIGEgY2FzZSBuZWVkcyB0byBmaW5kXG4gIC8vIHRoZSBjdXN0b21lcidzIG9yZ2FuaXphdGlvbi4gVGhlIG9ubHkgcGVybWlzc2lvbiB0aGF0IGxpc3RlZCBvcmdzIHdhc1xuICAvLyBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIHdvdWxkIGFsc28gaGF2ZSBoYW5kZWQgYSBzdXBwb3J0IGFnZW50IHRoZSBkZXBsb3knc1xuICAvLyBpbnRlcm5hbHMg4oCUIHNvIHRoZXkgaGFkIG5laXRoZXIsIGFuZCBoYWQgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyBhbmQgYW5zd2VyaW5nIHRoZSBjYXNlIGl0c2VsZiByaWRlcyB0aGUgb3JkaW5hcnkgbWVzc2FnaW5nXG4gIC8vIHBlcm1pc3Npb25zIOKAlCBhIHN1cHBvcnQgY2FzZSBJUyBhIG1lc3NhZ2UgdGhyZWFkLlxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdtZXNzYWdlczp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgTEVBRCDigJQgdGhlIHN1cHBvcnQgZGVzaywgcGx1cyB0aGUgYXV0aG9yaXR5IHRvIGxvb2suXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gYGltcGVyc29uYXRpb246b3BlbmAgaXMgc3lzdGVtLW9yZy1vbmx5LCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHlcbiAqIHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpcyBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2Ug4oCUIHRoZVxuICogaW52YXJpYW50IGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2AgYXNzZXJ0cywgYW5kIHRoZSByZWFzb25cbiAqIGBwbGF0Zm9ybTpyZWFkYCBzaGlwcGVkIHVudXNhYmxlLiBXaXRob3V0IHRoaXMgUm9sZSwgc3BsaXR0aW5nIGltcGVyc29uYXRpb25cbiAqIG91dCBvZiB0aGUgZmxhZyB3b3VsZCBjaGFuZ2Ugbm90aGluZzogdGhlIG9ubHkgd2F5IHRvIGxldCBzb21lYm9keSB2aWV3IGFcbiAqIGN1c3RvbWVyJ3MgYWNjb3VudCB3b3VsZCBzdGlsbCBiZSB0byBtYWtlIHRoZW0gYSBmdWxsIFN1cGVyIEFkbWluLCBoYW5kaW5nXG4gKiBvdmVyIGAvYWRtaW4vdXNlcnMvOmlkL2dyYW50c2AsIHRoZSBzaW5nbGUtcGVyc29uIE1GQSByZXNldCwgdGhlIGRhdGFiYXNlXG4gKiBjb25zb2xlIGFuZCBgcmVnaXN0cnk6cHVyZ2VgIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogV0hZIElUIElTIFRIRSBTVVBQT1JUIERFU0sgQU5EIE5PVCBUSEUgT1BFUkFUT1IuIFRoZSBxdWVzdGlvbiBpbXBlcnNvbmF0aW9uXG4gKiBhbnN3ZXJzIGlzIFwid2hhdCBpcyB0aGlzIGN1c3RvbWVyIGFjdHVhbGx5IHNlZWluZz9cIiwgd2hpY2ggaXMgYSBzdXBwb3J0XG4gKiBxdWVzdGlvbi4gUGxhdGZvcm0gT3BlcmF0b3IgcnVucyB0aGUgZGVwbG95bWVudCBhbmQgaXMgaGVsZCBieSB3aG9ldmVyIGlzIG9uXG4gKiBjYWxsOyBhZGRpbmcgdGhpcyB0byBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHJvdGEgbWVtYmVyIHRoZSBhYmlsaXR5IHRvIGJlY29tZSBhbnlcbiAqIGN1c3RvbWVyJ3MgdXNlciBhdCAzYW0uIFN1cHBvcnQgQWdlbnQncyBidW5kbGUgcGx1cyB0aGUgb25lIHBlcm1pc3Npb24gaXMgdGhlXG4gKiBuYXJyb3dlciwgbW9yZSBob25lc3Qgc2hhcGUg4oCUIGFuZCBhIGxlYWQgd2hvIGFsc28gcnVucyB0aGUgZGVwbG95bWVudCBob2xkc1xuICogYm90aCBSb2xlcy5cbiAqXG4gKiBXSEFUIElUIFNUSUxMIENBTk5PVCBETy4gRW1lcmdlbmN5IGFjY2VzczogYGJyZWFrZ2xhc3NgIGJ5cGFzc2VzIHRlbmFudFxuICogY29uc2VudCBhbmQgc3RheXMgb24gdGhlIGZsYWcsIGFwcHJvdmVkIGJ5IGEgc2Vjb25kIFN1cGVyIEFkbWluLiBBbmQgdGhlXG4gKiB0ZW5hbnQgY2FuIHJlZnVzZSDigJQgYGltcGVyc29uYXRpb246b3BlbmAgaXMgcGVybWlzc2lvbiB0byBBU0suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyxcbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG5dO1xuXG4vKipcbiAqIFNUQVJUSU5HIFBPSU5UUyBmb3IgYSBjdXN0b20gUm9sZSBpbiBhIHRlbmFudCBvcmcg4oCUIHRlbXBsYXRlcywgbm90IFJvbGVzLlxuICpcbiAqIFRIRSBHQVAgVEhFWSBGSUxMLiBBbiBvcmcgc2VlZHMgZXhhY3RseSBUV08gUm9sZXMg4oCUIE1lbWJlciBhbmQgQWRtaW4g4oCUIGFuZFxuICogQWRtaW4gaXMgZXZlcnkgb3JnLWFzc2lnbmFibGUgcGVybWlzc2lvbi4gU28gcHJvbW90aW5nIGFueW9uZSBwYXN0IFwiYXV0aG9yIGFuZFxuICogcmVhZFwiIGhhbmRzIG92ZXIgdGhlIHdob2xlIHJlbWFpbmRlciBhdCBvbmNlOiBgb3JnX2ttczp3cml0ZWAsXG4gKiBgb3JnX2lkcDp3cml0ZWAsIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAsIGBiaWxsaW5nOm1hbmFnZWAsIGByb2xlczptYW5hZ2VgXG4gKiBhbmQgYGF1ZGl0OnJlYWRgIGFtb25nIHRoZW0uIFRoZSBwcm9kdWN0J3MgYW5zd2VyIGlzIFwiYXV0aG9yIGEgY3VzdG9tIFJvbGVcIixcbiAqIGFuZCB0aGUgc2FmZXR5IGlzIGFscmVhZHkgcmlnaHQgKGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBib3VuZHMgYSBjdXN0b20gUm9sZSBieVxuICogaXRzIGF1dGhvcidzIG93biBjZWlsaW5nKS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogVGhlIGV4YWN0IHNpemVzIG9mIHRoYXQgY2xpZmYgYXJlIGFzc2VydGVkIGluIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgXG4gKiByYXRoZXIgdGhhbiB3cml0dGVuIGhlcmUuIFRoaXMgcGFyYWdyYXBoIHVzZWQgdG8gY2FycnkgdGhlbSBpbmxpbmUg4oCUIFwidGhyZWVcbiAqIFJvbGVzOiBNZW1iZXIgKDE1KSwgVGVhbSBMZWFkICgxNykgYW5kIEFkbWluICgzNylcIiDigJQgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZVxuICogbnVtYmVycyB3ZW50IHN0YWxlOiBgVGVhbSBMZWFkYCBzdG9wcGVkIGJlaW5nIHNlZWRlZCB3aGVuIGl0IGJlY2FtZSB0aGUgZmlyc3RcbiAqIHRlbXBsYXRlIGJlbG93LCBhbmQgdGhlIHR3byBidW5kbGVzIGhhdmUgZ3Jvd24gc2luY2UuIEEgY291bnQgbm90aGluZyBjaGVja3NcbiAqIGlzIGEgY2xhaW0gdGhhdCBkZWNheXMsIGFuZCB0aGlzIG9uZSB3YXMgdGhlIHN0YXRlZCByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLlxuICpcbiAqIFdIWSBURU1QTEFURVMgQU5EIE5PVCBTRUVERUQgUk9MRVMuIEEgc2VlZGVkIGJ1aWx0LWluIGlzIGBzeXN0ZW06IHRydWVgIGFuZFxuICogdGhlcmVmb3JlIGltbXV0YWJsZSwgc28gc2VlZGluZyB0aGVzZSB3b3VsZCBwdXQgZm91ciB1bmRlbGV0YWJsZSByb3dzIGluIGV2ZXJ5XG4gKiBvcmcgd2hldGhlciBpdCB3YW50cyB0aGVtLiBBIHRlbXBsYXRlIGxlYXZlcyBubyB0cmFjZSB1bnRpbCBzb21lb25lIHVzZXMgaXQsXG4gKiBhbmQgd2hhdCBpdCBwcm9kdWNlcyBpcyBhbiBvcmRpbmFyeSBjdXN0b20gUm9sZSB0aGUgb3JnIGZ1bGx5IG93bnMg4oCUIGVkaXRhYmxlLFxuICogZGVsZXRhYmxlLCBhbmQgYm91bmRlZCBieSB0aGUgYXV0aG9yJ3MgY2VpbGluZyBsaWtlIGFueSBvdGhlci5cbiAqXG4gKiBXSEFUIFRIRVkgREVMSUJFUkFURUxZIEVYQ0xVREUuIGByb2xlczptYW5hZ2VgIGlzIGluIG5vbmUgb2YgdGhlbS4gSXQgaXMgdGhlXG4gKiBvbmUgcGVybWlzc2lvbiB0aGF0IGNvbXBvdW5kcyDigJQgdGhlIGhvbGRlciBjYW4gbWludCBmdXJ0aGVyIFJvbGVzLCB1cCB0byB0aGVpclxuICogb3duIGNlaWxpbmcg4oCUIHNvIGFjcXVpcmluZyBpdCBzaG91bGQgc3RheSBhIGNvbnNjaW91cyBhY3QgcmF0aGVyIHRoYW4gYSBzaWRlXG4gKiBlZmZlY3Qgb2YgcGlja2luZyBhIHByZXNldC4gRXZlcnkgcGVybWlzc2lvbiBoZXJlIGlzIG9yZy1hc3NpZ25hYmxlLCBzbyBhXG4gKiB0ZW1wbGF0ZSBpcyB2YWxpZCBpbiBhbnkgb3JnIGFuZCBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWNjZXB0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlVGVtcGxhdGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBqb2IgaXMg4oCUIHNob3duIG5leHQgdG8gdGhlIHRlbXBsYXRlLCBhbmQgYSBzZW5zaWJsZSBSb2xlIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xufVxuXG5leHBvcnQgY29uc3QgUk9MRV9URU1QTEFURVM6IHJlYWRvbmx5IFJvbGVUZW1wbGF0ZVtdID0gW1xuICB7XG4gICAgLy8gV2FzIGEgU0VFREVEIFJvbGUgaW4gZXZlcnkgb3JnIHVudGlsIGl0IGJlY2FtZSBhIHRlbXBsYXRlLiBJdCBpcyB0aGUgb25seVxuICAgIC8vIGJ1aWx0LWluIHRoYXQgd2FzIGEgam9iIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGEgc3RydWN0dXJhbCByZXF1aXJlbWVudDpcbiAgICAvLyBTdXBlciBBZG1pbiBpcyB3aGVyZSBgaXNTdXBlckFkbWluYCBpcyBkZXJpdmVkIGZyb20sIEFkbWluIGFuZCBNZW1iZXIgYXJlXG4gICAgLy8gdGhlIGZsb29yIGFuIG9yZyBpcyB1bnVzYWJsZSB3aXRob3V0LCBhbmQgdGhlIHN5c3RlbS1vcmcgUm9sZXMgY2FycnlcbiAgICAvLyBwZXJtaXNzaW9ucyBubyBjdXN0b20gUm9sZSBtYXkgaG9sZC4gVGVhbSBMZWFkIHdhcyBub25lIG9mIHRob3NlIOKAlCBpdCBpc1xuICAgIC8vIGBtZW1iZXJgIHBsdXMgdHdvIHJlcG9ydCBwZXJtaXNzaW9ucywgYW5kIGFuIG9yZyB0aGF0IGRvZXMgbm90IGRlbGVnYXRlXG4gICAgLy8gcmVwb3J0IGF1dGhvcmluZyBoYWQgYW4gdW5kZWxldGFibGUgcm93IGZvciBpdCBhbnl3YXkuXG4gICAgLy9cbiAgICAvLyBDT05TRVFVRU5DRSwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGEgbmV3IG9yZyBubyBsb25nZXIgaGFzIGEgUm9sZVxuICAgIC8vIHRoYXQgZ3JhbnRzIGByZXBvcnRzOndyaXRlYCB0byBhIG5vbi1hZG1pbi4gQW4gYWRtaW4gaG9sZHMgYm90aCBwZXJtaXNzaW9uc1xuICAgIC8vICh0aGV5IGFyZSBpbiB0aGUgYWRtaW4gYnVuZGxlKSBhbmQgaW5zdGFudGlhdGVzIHRoaXMgdGVtcGxhdGUgdG8gZGVsZWdhdGVcbiAgICAvLyB0aGVtIOKAlCB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZm91ciBiZWxvdy4gT3JncyB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgc2VlZGVkXG4gICAgLy8gUm9sZSBrZWVwIGl0LCBhbmQgdGhlIGJhY2tmaWxsIGtlZXBzIGl0cyBidW5kbGUgY3VycmVudC5cbiAgICBpZDogJ3RlYW0tbGVhZCcsXG4gICAgbmFtZTogJ1RlYW0gTGVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdBdXRob3JzIGFuZCBzaGFyZXMgc3Rha2Vob2xkZXIgcmVwb3J0cyBmb3IgYSB0ZWFtLCB3aXRob3V0IG9yZy1hZG1pbiBhY2Nlc3MuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJ10sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBNRU1CRVIgQUxSRUFEWSBJUyBUSEUgREVWRUxPUEVSIFJPTEUg4oCUIHRoaXMgdGVtcGxhdGUgZXhpc3RzIGZvciB3aGF0IGl0XG4gICAgICogZG9lcyBOT1QgY292ZXIuXG4gICAgICpcbiAgICAgKiBFdmVyeXRoaW5nIGluIGEgZGV2ZWxvcGVyJ3MgbG9vcCBpcyBgcGlwZWxpbmVzOnJlYWRgICsgYHBpcGVsaW5lczp3cml0ZWAsXG4gICAgICogYm90aCBpbiB0aGUgbWVtYmVyIGJ1bmRsZTogY3JlYXRlLCBlZGl0LCB2YWxpZGF0ZSwgcnVuLCBzdG9wLCB0aGUgYnVsa1xuICAgICAqIG9wcywgQUkgZ2VuZXJhdGlvbiAoYC9waXBlbGluZXMvZ2VuZXJhdGVgLCBpbmNsLiBmcm9tLXVybCBhbmQgc3RyZWFtaW5nKSxcbiAgICAgKiB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHBsdXMgYHRlbXBsYXRlczpyZWFkYCB0byBpbnN0YW50aWF0ZSBhbmRcbiAgICAgKiBgcGx1Z2luczppbnN0YWxsYCB0byBhZGQgYSBwbHVnaW4uIEEgdGVtcGxhdGUgcmVzdGF0aW5nIHRoYXQgd291bGQgYnV5XG4gICAgICogbm90aGluZy5cbiAgICAgKlxuICAgICAqIFdoYXQgYSBkZXZlbG9wZXIgaGl0cyB0aGUgY2xpZmYgb24gaXMgdGhlIFNFTEYtU0VSVklDRSBvcGVyYXRlIHBhaXI6IHRoZXlcbiAgICAgKiBjYW4gcmVhZCB0aGVpciBzZXJ2aWNlJ3MgZGFzaGJvYXJkcyBhbmQgbWV0cmljcyBhbmQgY2Fubm90IGNoYW5nZSBlaXRoZXIsXG4gICAgICogYmVjYXVzZSBib3RoIHdyaXRlcyBzaXQgaW4gdGhlIGFkbWluIGJ1bmRsZS4gU28gdGhlIHBlcnNvbiB3aG8gb3ducyBhXG4gICAgICogcGlwZWxpbmUgZmlsZXMgYSB0aWNrZXQgdG8gZ2V0IGFuIGFsZXJ0IG9uIGl0LlxuICAgICAqXG4gICAgICogREVMSUJFUkFURUxZIE5PVCBIRVJFLiBgbG9nczpleHBvcnRgIOKAlCB2aWV3aW5nIGxvZ3MgcmlkZXNcbiAgICAgKiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCwgYnV0IGRvd25sb2FkaW5nIHRoZW0gaXMgYnVsayBlZ3Jlc3MgYW4gb3JnIG1heVxuICAgICAqIHdpdGhob2xkIGZyb20gbWVtYmVycyAoZG9jcy9wZXJtaXNzaW9ucy5tZCksIGFuZCBhIHRlbXBsYXRlIGFpbWVkIGF0IGV2ZXJ5XG4gICAgICogZW5naW5lZXIgd291bGQgcmV2ZXJzZSB0aGF0LiBgcGlwZWxpbmVzOnB1Ymxpc2hgIOKAlCBzaGFyaW5nIGJleW9uZCB0aGVcbiAgICAgKiBhdXRob3IgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCB3aGljaCBpcyBSZWxlYXNlIE1hbmFnZXIncyBiZWxvdzsgc29tZWJvZHlcbiAgICAgKiB3aG8gZG9lcyBib3RoIGhvbGRzIGJvdGggUm9sZXMuXG4gICAgICovXG4gICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgIG5hbWU6ICdEZXZlbG9wZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGRzIGFuZCBydW5zIHBpcGVsaW5lcywgYW5kIG93bnMgdGhlIGRhc2hib2FyZHMgYW5kIGFsZXJ0cyBmb3Igd2hhdCB0aGV5IGJ1aWxkLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdkYXNoYm9hcmRzOndyaXRlJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncmVsZWFzZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUmVsZWFzZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgd2hhdCBiZWNvbWVzIHNoYXJlZCBiZXlvbmQgaXRzIGF1dGhvciwgYW5kIGFwcHJvdmVzIHBsdWdpbiBpbnN0YWxscy4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAgICAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdzZWN1cml0eS1vZmZpY2VyJyxcbiAgICBuYW1lOiAnU2VjdXJpdHkgT2ZmaWNlcicsXG4gICAgZGVzY3JpcHRpb246ICdJZGVudGl0eSwgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgZXZpZGVuY2UgdHJhaWwg4oCUIHRoZSBzdXJmYWNlIGFuIGF1ZGl0b3IgYXNrcyBhYm91dC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYXVkaXQ6cmVhZCcsICdsb2dzOmV4cG9ydCcsXG4gICAgICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgICAgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG4gICAgICAvLyBPd25pbmcgdGhlIGltcGVyc29uYXRpb24gUE9MSUNZIChgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgKSB3aXRob3V0XG4gICAgICAvLyBiZWluZyBhYmxlIHRvIGFuc3dlciBhIFJFUVVFU1Qgd2FzIHRoZSBhc3ltbWV0cnkgdGhlIGNvbnNlbnQgZmxvdyBsZWZ0XG4gICAgICAvLyBiZWhpbmQ6IHRoZSBsZXNzZXIgYWN0IGhhZCBhIHBlcm1pc3Npb24gb2YgaXRzIG93biBhbmQgdGhlIGdyZWF0ZXIgb25lXG4gICAgICAvLyBoYWQgbm9uZS4gV2hvZXZlciBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyByZXF1aXJlZCBzaG91bGQgYmUgYWJsZSB0b1xuICAgICAgLy8gZ2l2ZSBvciB3aXRoaG9sZCBpdC5cbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Blb3BsZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUGVvcGxlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvc3RlciBhbmQgaXRzIG1hY2hpbmUgY3JlZGVudGlhbHMsIGFjcm9zcyB0aGUgYWNjb3VudFxcdTIwMTlzIHRlYW1zIOKAlCB3aXRob3V0IHRoZSBvcmdcXHUyMDE5cyBzZXR0aW5ncyBvciBpdHMgbW9uZXkuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ21lbWJlcnM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICAgICAvLyBUaGUgc2FtZSBqb2IsIG9uZSBsZXZlbCBkb3duOiBlbnRlcmluZyBhIGRlc2NlbmRhbnQgdGVhbSB0byB3b3JrIG9uIGl0c1xuICAgICAgLy8gcm9zdGVyLCBhbmQgdmlld2luZyBvbmUgb2YgaXRzIG1lbWJlcnMgYXMgdGhhdCBtZW1iZXIuIFdpdGhvdXQgaXQgYVxuICAgICAgLy8gcGVvcGxlIG1hbmFnZXIgaW4gYSBwYXJlbnQgb3JnIGNhbiBhZG1pbmlzdGVyIHRoZSBhY2NvdW50J3MgdGVhbXMgb25cbiAgICAgIC8vIHBhcGVyIGFuZCBub3QgcmVhY2ggdGhlbS5cbiAgICAgICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdiaWxsaW5nLW1hbmFnZXInLFxuICAgIG5hbWU6ICdCaWxsaW5nIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHN1YnNjcmlwdGlvbiwgc2VhdHMgYW5kIGludm9pY2VzIGZvciB0aGlzIG9yZ2FuaXphdGlvbi4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJywgJ3F1b3RhczpyZWFkJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIGpvYiB0aGUgaW1wZXJzb25hdGlvbiBjb25zZW50IGZsb3cgY3JlYXRlZCBJTlNJREUgdGhlIHRlbmFudDogdGhlXG4gICAgICogbmFtZWQgcGVyc29uIHdobyBhbnN3ZXJzIFwibWF5IGEgc3VwcG9ydCBlbmdpbmVlciB2aWV3IHRoaXMgYWNjb3VudD9cIiBhbmRcbiAgICAgKiBjYW4gYWZ0ZXJ3YXJkcyByZWFkIHdoYXQgaGFwcGVuZWQuXG4gICAgICpcbiAgICAgKiBJdCBleGlzdHMgYXMgYSB0ZW1wbGF0ZSBiZWNhdXNlIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIGlzIGluIHRoZSBhZG1pblxuICAgICAqIGFuZCBvd25lciBidW5kbGVzIOKAlCBzbyBieSBkZWZhdWx0IGV2ZXJ5IGFkbWluIG1heSBjb25zZW50IOKAlCBhbmQgdGhlIHdob2xlXG4gICAgICogcG9pbnQgb2Ygc3BsaXR0aW5nIGl0IG91dCB3YXMgdG8gbGV0IGFuIG9yZyBzYXkgXCJ0aGlzIGRlY2lzaW9uIGlzIG9uZVxuICAgICAqIHBlcnNvbidzXCIuIERvaW5nIHRoYXQgbWVhbnMgYXV0aG9yaW5nIGEgUm9sZSB0aGF0IGhvbGRzIGl0IGFuZCB0YWtpbmcgaXRcbiAgICAgKiBvZmYgdGhlIG90aGVycywgYW5kIGhhbmQtY29tcG9zaW5nIHdhcyB0aGUgb25seSByb3V0ZS5cbiAgICAgKlxuICAgICAqIFR3byBwZXJtaXNzaW9ucyBhbmQgbm8gbW9yZTogYXBwcm92aW5nIGlzIG5vdCBhZG1pbmlzdGVyaW5nLiBgYXVkaXQ6cmVhZGBcbiAgICAgKiBpcyBoZXJlIGJlY2F1c2UgY29uc2VudGluZyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2sgd2hhdCB0aGUgc2Vzc2lvblxuICAgICAqIHRoZW4gZGlkIGlzIGNvbnNlbnQgaW4gbmFtZSBvbmx5LlxuICAgICAqL1xuICAgIGlkOiAnYWNjZXNzLWFwcHJvdmVyJyxcbiAgICBuYW1lOiAnQWNjZXNzIEFwcHJvdmVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Fuc3dlcnMgcmVxdWVzdHMgdG8gdmlldyB0aGlzIG9yZ2FuaXphdGlvblxcdTIwMTlzIGFjY291bnRzLCBhbmQgcmVhZHMgdGhlIHRyYWlsIG9mIHdoYXQgaGFwcGVuZWQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICdhdWRpdDpyZWFkJyxcbiAgICBdLFxuICB9LFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCB0aGUgTU9ERVJBVElPTiBqb2IuXG4gKlxuICogSXQgY2FycmllcyBgcGx1Z2luczptb2RlcmF0ZWAgYW5kIE5PVCBgcHVibGlzaGVyczp2ZXJpZnlgLCBiZWNhdXNlIHRoZSB0d28gYXJlXG4gKiBub3QgcGVlcnMuIGBwbHVnaW5zOm1vZGVyYXRlYCBpcyB0aGUgd2lkZSBzdXJmYWNlOiB5YW5rIGEgdmVyc2lvbiAod2hpY2hcbiAqIGJyZWFrcyBwaXBlbGluZXMgYWxyZWFkeSBydW5uaW5nIGl0KSwgcHVibGlzaCBhbiBhZHZpc29yeSAod2hpY2ggYWxhcm1zIGV2ZXJ5XG4gKiBjb25zdW1lciBvZiBhIGxpc3RpbmcpLCByZXdyaXRlIHRoZSBhdXRvLWFwcHJvdmFsIHJ1bGVzICh3aGljaCBkZWNpZGUgd2hhdFxuICogcHVibGlzaGVzIHdpdGggbm8gaHVtYW4gcmV2aWV3IGF0IGFsbCksIHJlc2VydmUgbmFtZXMsIG1vZGVyYXRlIHJldmlld3MsXG4gKiByZS1zaWduLiBgcHVibGlzaGVyczp2ZXJpZnlgIGlzIHRocmVlIHJvdXRlcyDigJQgc3VzcGVuZCwgdW5zdXNwZW5kLCB0aWVyIOKAlCBidXRcbiAqIG9uZSBvZiB0aGVtIEdSQU5UUyBWRVJJRklFRCBTVEFUVVMsIHdoaWNoIGlzIHRoZSBiYWRnZSBjb25zdW1lcnMgcmVhZCBhcyBcInRoaXNcbiAqIGRlcGxveW1lbnQgdm91Y2hlcyBmb3IgdGhlIHB1Ymxpc2hlclwiLlxuICpcbiAqIEJ1bmRsaW5nIHRoZW0sIGFzIHRoaXMgUm9sZSB1c2VkIHRvLCBtZWFudCBldmVyeW9uZSBoaXJlZCB0byB0cmlhZ2UgdGhlIHF1ZXVlXG4gKiBjb3VsZCBhbHNvIG1pbnQgYSBWZXJpZmllZCBwdWJsaXNoZXIuIFRocmVlIG1lY2hhbmlzbXMgYWxyZWFkeSBhc3N1bWUgdGhlXG4gKiBzcGxpdCBjYW4gYmluZCDigJQgYHJlcXVpcmVkRGVjaXNpb25QZXJtaXNzaW9uYCBwZXIgcmVxdWVzdCBraW5kLCB0aGUgcXVldWUnc1xuICogcGVyLXJvdyBgY2FuKHJlcXVpcmVkUGVybWlzc2lvbilgLCBhbmQgdGhlIGFwcHJvdmVyLXNob3J0YWdlIGNvdW50cyB0aGF0XG4gKiBgRWNvc3lzdGVtRWxpZ2liaWxpdHlgIHRyYWNrcyBTRVBBUkFURUxZIGZvciBlYWNoIHBlcm1pc3Npb24g4oCUIGFuZCB3aXRoIG9uZVxuICogY29tYmluZWQgUm9sZSBub25lIG9mIHRoZW0gY291bGQgZXZlciBkaXNjcmltaW5hdGUuXG4gKlxuICoge0BsaW5rIFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OU30gaXMgdGhlIG90aGVyIGhhbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczpyZWFkJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUHVibGlzaGVyIFZlcmlmaWVyXCIgUm9sZSDigJQgdGhlIFRSVVNUIGRlY2lzaW9uLlxuICpcbiAqIFRoZSBvdGhlciBoYWxmIG9mIHRoZSBlY29zeXN0ZW0gc3BsaXQgZGVzY3JpYmVkIG9uXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9OiB3aG8gbWF5IGF3YXJkIFZlcmlmaWVkLCBzdXNwZW5kIGFcbiAqIHB1Ymxpc2hlciBhbmQgbGlmdCBhIHN1c3BlbnNpb24uIENhcnJpZXMgYHBsdWdpbnM6cmVhZGAgc28gdGhlIGhvbGRlciBjYW4gc2VlXG4gKiB3aGF0IGEgcHVibGlzaGVyIHNoaXBzIGJlZm9yZSB2b3VjaGluZyBmb3IgdGhlbSwgYW5kIHRoZSBzYW1lIHR3byBhbWJpZW50XG4gKiByZWFkcyBhcyBpdHMgc2libGluZy5cbiAqXG4gKiBTVEFGRiBBVCBMRUFTVCBUV08gUEVPUExFLiBBIFZlcmlmaWVkIGFwcGxpY2F0aW9uIGFuZCBhbiB1bnN1c3BlbmQgYXJlIGJvdGhcbiAqIGBuZWVkc1R3b1BlcnNvbmAsIGFuZCBgY29uZmxpY3RPZkludGVyZXN0YCByZWZ1c2VzIHRoZSBzYW1lIHBlcnNvbiB0d2ljZSwgc28gYVxuICogc2luZ2xlIGhvbGRlciBjYW5ub3QgY29tcGxldGUgZWl0aGVyIGRlY2lzaW9uIGFsb25lLiBUaGUgY29uc29sZSdzIGFwcHJvdmVyXG4gKiBzdGFuZGluZyBub3RpY2UgaXMgd2hhdCBzdXJmYWNlcyB0aGF0IHNob3J0YWdlIOKAlCBhbmQgc3BsaXR0aW5nIHRoaXMgUm9sZSBvdXRcbiAqIGlzIHdoYXQgZmluYWxseSBsZXRzIHRoYXQgbm90aWNlIHJlcG9ydCBhIGZpZ3VyZSBpdHMgc2libGluZydzIGRvZXMgbm90LlxuICovXG5leHBvcnQgY29uc3QgUFVCTElTSEVSX1ZFUklGSUVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiVGVhbSBMZWFkXCIgUm9sZSDigJQgdGhlIHBlcnNvbiB3aG8gcmVwb3J0cyBVUFdBUkQuXG4gKlxuICogRXhpc3RzIGJlY2F1c2UgdGhlIHRhcmdldCB1c2VyIGZvciBzdGFrZWhvbGRlciByZXBvcnRzIGlzIGEgbGVhZCwgbm90IGFuIGFkbWluLFxuICogYW5kIGdyYW50aW5nIGByZXBvcnRzOndyaXRlYCBvbmx5IHRocm91Z2ggdGhlIGFkbWluIGJ1bmRsZSB3b3VsZCBoYXZlIGZvcmNlZFxuICogZXZlcnkgcmVwb3J0aW5nIGxlYWQgdG8gYmUgYW4gb3JnIGFkbWluIChtZW1iZXJzOm1hbmFnZSwgcm9sZXM6bWFuYWdlLFxuICogb3JnX3NldHRpbmdzOndyaXRlLCBiaWxsaW5nKSB0byBzZW5kIHRoZWlyIG1hbmFnZXIgYSB3ZWVrbHkgc3VtbWFyeS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGluY2x1ZGVkOiBgcmVwb3J0czpyb2xsdXBgLiBSb2xsaW5nIGEgcmVwb3J0IHVwIG92ZXIgZGVzY2VuZGFudFxuICogdGVhbXMgaXMgZG93bndhcmQgdmlzaWJpbGl0eSBhY3Jvc3MgdGhlIG9yZyB0cmVlLCB3aGljaCBpcyBhIGdyYW50ZWQgY2FwYWJpbGl0eVxuICogaW4gdGhpcyBtb2RlbCwgbm90IHNvbWV0aGluZyBhIHRlYW0ncyBvd24gbGVhZCBnZXRzIGJ5IGRlZmF1bHQg4oCUIGEgbGVhZCBvZiBhXG4gKiBQQVJFTlQgb3JnIGlzIGdyYW50ZWQgaXQgZXhwbGljaXRseS4gVGhlIFJvbGUgZ3JhbnRzIHRoZSBjb2Fyc2UgYG1lbWJlcmAgbGFiZWxcbiAqIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG5leHBvcnQgY29uc3QgVEVBTV9MRUFEX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC4uLk1FTUJFUl9QRVJNSVNTSU9OUyxcbiAgJ3JlcG9ydHM6d3JpdGUnLFxuICAncmVwb3J0czpwdWJsaXNoJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIEF1dG9tYXRpb25cIiBSb2xlIOKAlCB3aGF0IHRoZSBvcmcnc1xuICogdW5zY29wZWQgc3RvcmVkIGNyZWRlbnRpYWwgKHRoZSBgcGxhdGZvcm0tYXV0b21hdGlvbmAgc2VydmljZSBhY2NvdW50IHRoYXRcbiAqIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zKSBuZWVkcywgYW5kIG5vdGhpbmcgbW9yZS5cbiAqXG4gKiBEZXJpdmVkIGJ5IHRyYWNpbmcgZXZlcnkgY2FsbCBtYWRlIHdpdGggdGhhdCBrZXksIG5vdCBieSBndWVzc2luZzpcbiAqICAtIGBwaXBlbGluZXM6cmVhZGAg4oCUIHRoZSBDb2RlQnVpbGQgc3ludGggKGFuZCBgcGlwZWxpbmUgZGVwbG95IC0tc3RvcmUtdG9rZW5zYClcbiAqICAgIGZldGNoaW5nIHRoZSBwaXBlbGluZSBpdCBidWlsZHMgKGBHRVQgL3BpcGVsaW5lcy86aWRgKTtcbiAqICAtIGBwbHVnaW5zOnJlYWRgICAg4oCUIHBsdWdpbiByZXNvbHV0aW9uIGF0IHN5bnRoL2RlcGxveSBhbmQgaW4gdGhlIHBsdWdpbi1sb29rdXBcbiAqICAgIExhbWJkYSAoYFBPU1QgL3BsdWdpbnMvbG9va3VwYCksIGFuZCB0aGUgcnVuLXRpbWUgdnVsbmVyYWJpbGl0eSBjaGVjayBzdGVwXG4gKiAgICAoYFBPU1QgL3BsdWdpbnMvcnVudGltZS1jaGVja2ApLlxuICpcbiAqIFdoYXQgaXQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGNhcnJ5LCBhbmQgd2hlcmUgdGhhdCB3b3JrIHdlbnQ6XG4gKiAgLSByZWdpc3RyeSB3cml0ZXMgKGBwaXBlbGluZV9yZWdpc3RyeTp3cml0ZWApIOKAlCB0aGUgc3ludGggcmVnaXN0ZXJzIGl0cyBzdGVwXG4gKiAgICBtYW5pZmVzdCB3aXRoIHRoZSBzZXBhcmF0ZSBgcGlwZWxpbmUtcmVnaXN0ZXJgIGtleSAoUGlwZWxpbmUgUmVnaXN0cmF0aW9uKTtcbiAqICAtIGltYWdlIHB1c2hlcyBhbmQgcHVsbHMg4oCUIENvZGVCdWlsZCBhdXRoZW50aWNhdGVzIHRvIHRoZSBpbWFnZSByZWdpc3RyeSB3aXRoXG4gKiAgICB0aGUgYHJlZ2lzdHJ5LXB1c2hgIHNjb3BlZCBrZXksIG5ldmVyIHRoaXMgb25lO1xuICogIC0gcmVwb3J0aW5nIHdyaXRlcyDigJQgdGhlIGV2ZW50cyBMYW1iZGEgYW5kIHN0ZXAgcmVwb3J0IHVwbG9hZHMgdXNlIHRoZVxuICogICAgYHJlcG9ydGluZzppbmdlc3RgIHNjb3BlZCBrZXkuXG4gKlxuICogSXQgdXNlZCB0byBiZSB0aGUgb3JnIEFETUlOIFJvbGUsIHNvIGEgbGVha2VkIHN5bnRoIGNyZWRlbnRpYWwgY291bGQgcmV3cml0ZVxuICogZXZlcnkgcGlwZWxpbmUsIFJvbGUgYW5kIG1lbWJlciBvZiB0aGUgb3JnLlxuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLFxuICAncGx1Z2luczpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIFJlZ2lzdHJhdGlvblwiIFJvbGUsIGhlbGQgYnkgdGhlXG4gKiBgcGlwZWxpbmUtcmVnaXN0ZXJgIHNlcnZpY2UgYWNjb3VudDogYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWAgZm9yXG4gKiBpdHMgb3duIG9yZyBhbmQgbm90aGluZyBlbHNlIOKAlCBub3QgZXZlbiBhIHJlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZXNvbHV0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIG9yZyBwZXJtaXNzaW9ucyBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtLlxuICpcbiAqIFNpbmdsZS1zb3VyY2UgbW9kZWw6IGEgdXNlcidzIGFiaWxpdGllcyBhcmUgRVhBQ1RMWSB0aGUgdW5pb24gb2YgdGhlXG4gKiBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IHRoZSBSb2xlcyB0aGV5IGhvbGQgKGEgUm9sZSA9IGEgbmFtZWQgcGVybWlzc2lvbiBzZXQ7XG4gKiBidWlsdC1pbiBSb2xlcyBjYXJyeSB0aGVpciBidW5kbGUgZXhwbGljaXRseSwgc2VlZGVkIGZyb21cbiAqIHtAbGluayBST0xFX1BFUk1JU1NJT05TfSkuIFRoZXJlIGlzIG5vIHNlcGFyYXRlIHJvbGUtZGVyaXZlZCBiYXNlbGluZSDigJQgdGhlXG4gKiBjb2Fyc2UgYHJvbGVgIGxhYmVsIGdyYW50cyBub3RoaW5nIG9uIGl0cyBvd24uXG4gKlxuICogMS4gUGxhdGZvcm0gc3VwZXJhZG1pbnMgKGBpc1N1cGVyQWRtaW5gKSBhbHdheXMgZ2V0IEFMTCBwZXJtaXNzaW9ucy5cbiAqIDIuIE90aGVyd2lzZSwgdW5pb24gZXZlcnkgcGVybWlzc2lvbiBncmFudGVkIGJ5IHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMuXG4gKiAzLiBJbnZhbGlkL3Vua25vd24gcGVybWlzc2lvbiBzdHJpbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSBhc3NpZ25lZFBlcm1pc3Npb25zIC0gRmxhdHRlbmVkIHBlcm1pc3Npb25zIGZyb20gZXZlcnkgUm9sZSB0aGUgdXNlciBob2xkc1xuICogQHBhcmFtIGlzU3VwZXJBZG1pbiAtIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgc3VwZXItYWRtaW4gZmxhZ1xuICogQHJldHVybnMgRWZmZWN0aXZlIHBlcm1pc3Npb25zIGluIGNhbm9uaWNhbCBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyhcbiAgYXNzaWduZWRQZXJtaXNzaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IFBlcm1pc3Npb25bXSB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiBbLi4uQUxMX1BFUk1JU1NJT05TXTtcblxuICBjb25zdCBwZXJtcyA9IG5ldyBTZXQ8UGVybWlzc2lvbj4oKTtcbiAgaWYgKGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgICAgaWYgKGlzVmFsaWRQZXJtaXNzaW9uKHApKSBwZXJtcy5hZGQocCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKHAgPT4gcGVybXMuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBDb25maW5lIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IHRvIHdoYXQgbWF5IGJlIGhlbGQgaW4gdGhlIHRva2VuJ3MgQUNUSVZFXG4gKiBvcmc6IG91dHNpZGUgdGhlIHN5c3RlbSBvcmcgZXZlcnkge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gZW50cnkgaXNcbiAqIGRyb3BwZWQgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBBcHBsaWVkIGF0IHRva2VuIGlzc3VlIG9uXG4gKiB0b3Agb2Yge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9IOKAlCBpbmNsdWRpbmcgYSBzdXBlcmFkbWluJ3MgaW1wbGljaXQtYWxsIOKAlFxuICogc28gYSB0b2tlbiBtaW50ZWQgaW4gYSB0ZW5hbnQgb3JnIG5ldmVyIENMQUlNUyBgcGx1Z2luczptb2RlcmF0ZWAgL1xuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCwgZXZlbiBpZiBhIGhhbmQtd3JpdHRlbiBSb2xlIGRvY3VtZW50IHNvbWVob3cgY2FycmllZFxuICogdGhlbSB0aGVyZS4gKFN1cGVyYWRtaW5zIHN0aWxsIHBhc3MgYGhhc1Blcm1pc3Npb25gIHZpYSB0aGUgZmxhZzsgdGhlXG4gKiBlY29zeXN0ZW0gcm91dGUgZ2F0ZSBhZGRpdGlvbmFsbHkgcmVxdWlyZXMgdGhlIHN5c3RlbSBvcmcsIHNvIHRoYXQgYnlwYXNzXG4gKiBuZXZlciByZWFjaGVzIGEgZ292ZXJuYW5jZSByb3V0ZSBmcm9tIGEgdGVuYW50IG9yZyBlaXRoZXIuKVxuICpcbiAqIFRha2VzIGEgYm9vbGVhbiByYXRoZXIgdGhhbiBhbiBvcmcgaWQgc28gdGhpcyBtb2R1bGUgc3RheXMgZGVwZW5kZW5jeS1mcmVlXG4gKiAodGhlIGZyb250ZW5kIGltcG9ydHMgaXQpOyBjYWxsZXJzIGRlY2lkZSB3aXRoIGFwaS1jb3JlIGBpc1N5c3RlbU9yZ0lkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpbmVQZXJtaXNzaW9uc1RvT3JnPFAgZXh0ZW5kcyBzdHJpbmc+KFxuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUFtdLFxuICBhY3RpdmVPcmdJc1N5c3RlbU9yZzogYm9vbGVhbixcbik6IFBbXSB7XG4gIHJldHVybiBhY3RpdmVPcmdJc1N5c3RlbU9yZyA/IFsuLi5wZXJtaXNzaW9uc10gOiBwZXJtaXNzaW9ucy5maWx0ZXIoKHApID0+ICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHApKTtcbn1cblxuLyoqIFdoZXRoZXIgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgZ3JhbnRzIGBwZXJtaXNzaW9uYCAoc3VwZXJhZG1pbiDih5IgYWx3YXlzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZXJtaXNzaW9uKFxuICBncmFudGVkOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIWdyYW50ZWQgJiYgZ3JhbnRlZC5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzLCBhcyBhIFRBQkxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRoZSBuYW1lZCBwZXJtaXNzaW9uIGJ1bmRsZXMgYSBidWlsdC1pbiBSb2xlIG1heSBjYXJyeSwgYW5kIHRoZSBSb2xlIE5BTUUgZWFjaFxuICogb25lIGlzIHNlZWRlZCB1bmRlci4gT25lIHRhYmxlLCBiZWNhdXNlIHRoZSB0aHJlZSBmYWN0cyBhYm91dCBhIGpvYiBSb2xlIOKAlFxuICogaXRzIGlkLCBpdHMgcGVybWlzc2lvbnMgYW5kIGl0cyBkaXNwbGF5IG5hbWUg4oCUIHdlcmUgcHJldmlvdXNseSB0aHJlZVxuICogaW5kZXBlbmRlbnQgbGlzdHMgaW4gdGhyZWUgcGxhY2VzLCBhbmQgbm90aGluZyBoZWxkIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogV0hBVCBXRU5UIFdST05HIFdJVEhPVVQgSVQuIFRoZSBwbGF0Zm9ybSByZXNvbHZlZCBhIGJ1bmRsZSB0aHJvdWdoIGFcbiAqIG5pbmUtYnJhbmNoIGBpZmAgY2hhaW4gd2l0aCBhIGZhbGwtdGhyb3VnaCB0byB0aGUgY29hcnNlIGBncmFudHNSb2xlYCBidW5kbGUuXG4gKiBFdmVyeSBqb2IgUm9sZSBncmFudHMgYG1lbWJlcmAsIHNvIGEgYnVuZGxlIGFkZGVkIHRvIHRoZSBpZCBsaXN0IFdJVEhPVVQgaXRzXG4gKiBicmFuY2ggZGlkIG5vdCBmYWlsIOKAlCBpdCBzaWxlbnRseSBzZWVkZWQgdGhlIHBsYWluIE1lbWJlciBidW5kbGUsIGFuZCB0aGVcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgdGhlbiByZS1zeW5jZWQgaXQgdG8gdGhhdCB3cm9uZyB2YWx1ZSBvbiBldmVyeSBib290LiBUaGVcbiAqIFJvbGUgZXhpc3RlZCwgd2FzIGFzc2lnbmFibGUgZnJvbSB0aGUgc3RhZmZpbmcgcGFuZWwsIGFuZCBncmFudGVkIGZpZnRlZW5cbiAqIHRlbmFudCBwZXJtaXNzaW9ucyBpbnN0ZWFkIG9mIGl0cyBqb2IuIE5vdGhpbmcgYW55d2hlcmUgZXhlcmNpc2VkIHRoZVxuICogcmVzb2x2ZXIgcGVyIGJ1bmRsZS5cbiAqXG4gKiBLZXllZCBhY2Nlc3MgcGx1cyBgc2F0aXNmaWVzYCBtYWtlcyBhIG1pc3NpbmcgZW50cnkgYSBDT01QSUxFIGVycm9yLCBhbmQgYW5cbiAqIGV4dHJhIG9uZSB0b28g4oCUIGluIGJvdGggZGlyZWN0aW9ucywgd2l0aCBubyBydW50aW1lIGNoZWNrIHRvIGZvcmdldC5cbiAqXG4gKiBUaGUgTkFNRSBsaXZlcyBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uIFRoZSBwbGF0Zm9ybSBzZWVkZWQgbmFtZXMgZnJvbSBpdHNcbiAqIG93biBjb25zdGFudHMgd2hpbGUgdGhlIGZyb250ZW5kJ3Mgc3RhZmZpbmcgcm9zdGVyIGhhcmQtY29kZWQgaXRzIG93biBjb3B5LFxuICogZWFjaCBwaW5uZWQgYnkgYSB0ZXN0IGFnYWluc3QgaXRzZWxmIOKAlCBzbyByZW5hbWluZyBhIFJvbGUgcGFzc2VkIGJvdGggc3VpdGVzXG4gKiBhbmQgdGhlIHJvc3RlciBzaWxlbnRseSByZW5kZXJlZCBcIlJvbGUgbm90IGZvdW5kXCIsIHdoaWNoIGlzIHRoZSBncmFudCBwYXRoIGZvclxuICogdGhhdCBSb2xlJ3MgcGVybWlzc2lvbnMgZGlzYXBwZWFyaW5nLiBCb3RoIHNpZGVzIHJlYWQgdGhpcyBub3cuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUVEX0JVTkRMRVMgPSB7XG4gIGVjb3N5c3RlbV9tYW5hZ2VyOiB7IG5hbWU6ICdFY29zeXN0ZW0gTWFuYWdlcicsIHBlcm1pc3Npb25zOiBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUyB9LFxuICBwdWJsaXNoZXJfdmVyaWZpZXI6IHsgbmFtZTogJ1B1Ymxpc2hlciBWZXJpZmllcicsIHBlcm1pc3Npb25zOiBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlMgfSxcbiAgdGVhbV9sZWFkOiB7IG5hbWU6ICdUZWFtIExlYWQnLCBwZXJtaXNzaW9uczogVEVBTV9MRUFEX1BFUk1JU1NJT05TIH0sXG4gIHBsYXRmb3JtX29ic2VydmVyOiB7IG5hbWU6ICdQbGF0Zm9ybSBPYnNlcnZlcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUyB9LFxuICBwbGF0Zm9ybV9vcGVyYXRvcjogeyBuYW1lOiAnUGxhdGZvcm0gT3BlcmF0b3InLCBwZXJtaXNzaW9uczogUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlMgfSxcbiAgYWNjb3VudF9tYW5hZ2VyOiB7IG5hbWU6ICdBY2NvdW50IE1hbmFnZXInLCBwZXJtaXNzaW9uczogQUNDT1VOVF9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIGNvbnNvbGVfYWRtaW46IHsgbmFtZTogJ0NvbnNvbGUgQWRtaW5pc3RyYXRvcicsIHBlcm1pc3Npb25zOiBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TIH0sXG4gIHN1cHBvcnRfYWdlbnQ6IHsgbmFtZTogJ1N1cHBvcnQgQWdlbnQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyB9LFxuICBzdXBwb3J0X2xlYWQ6IHsgbmFtZTogJ1N1cHBvcnQgTGVhZCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlMgfSxcbiAgcmVnaXN0cnlfb3BlcmF0b3I6IHsgbmFtZTogJ1JlZ2lzdHJ5IE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TIH0sXG4gIHBpcGVsaW5lX2F1dG9tYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIEF1dG9tYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUyB9LFxuICBwaXBlbGluZV9yZWdpc3RyYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIFJlZ2lzdHJhdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlMgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBFdmVyeSBzZWVkLWJ1bmRsZSBpZC4gVGhlIHBsYXRmb3JtJ3MgYFJvbGUuc2VlZEJ1bmRsZWAgZW51bSBpcyB0aGlzIGxpc3QuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVfSURTID0gT2JqZWN0LmtleXMoU0VFRF9CVU5ETEVTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTPjtcbmV4cG9ydCB0eXBlIFNlZWRCdW5kbGVJZCA9IGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM7XG5cbi8qKlxuICogVGhlIFNZU1RFTSBPUkcncyBqb2IgUm9sZXMsIGluIHN0YWZmaW5nIG9yZGVyIOKAlCB0aGUgc3Vic2V0IG9mXG4gKiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBzZWVkZWQgdGhlcmUsIHdoaWNoIGlzIGV2ZXJ5IGJ1bmRsZSBleGNlcHQgYHRlYW1fbGVhZGBcbiAqIChhIHRlbmFudCBqb2IsIGFuZCBhIHRlbXBsYXRlIHJhdGhlciB0aGFuIGEgc2VlZGVkIFJvbGUgc2luY2UgaXQgc3RvcHBlZFxuICogYmVpbmcgc3RydWN0dXJhbCkuXG4gKlxuICogYGVjb3N5c3RlbV9tYW5hZ2VyYCBJUyBvbmUgb2YgdGhlbTsgaXQgaXMgbGlzdGVkIGhlcmUgZXZlbiB0aG91Z2ggaXRzIHJvc3RlclxuICogbGl2ZXMgb24gdGhlIEVjb3N5c3RlbSBjb25zb2xlIHJhdGhlciB0aGFuIHRoZSBzdGFmZmluZyBwYW5lbCwgYmVjYXVzZSB3aGF0XG4gKiB0aGlzIGxpc3QgYW5zd2VycyBpcyBcIndoaWNoIFJvbGVzIGRvZXMgdGhlIHN5c3RlbSBvcmcgc2VlZFwiLCBub3QgXCJ3aGljaCBwYW5lbFxuICogcmVuZGVycyB0aGVtXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX0pPQl9CVU5ETEVTOiByZWFkb25seSBTZWVkQnVuZGxlSWRbXSA9IFtcbiAgJ2Vjb3N5c3RlbV9tYW5hZ2VyJyxcbiAgJ3B1Ymxpc2hlcl92ZXJpZmllcicsXG4gICdwbGF0Zm9ybV9vYnNlcnZlcicsXG4gICdwbGF0Zm9ybV9vcGVyYXRvcicsXG4gICdhY2NvdW50X21hbmFnZXInLFxuICAnY29uc29sZV9hZG1pbicsXG4gICdzdXBwb3J0X2FnZW50JyxcbiAgJ3N1cHBvcnRfbGVhZCcsXG4gICdyZWdpc3RyeV9vcGVyYXRvcicsXG5dO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyDigJQgdGhlIHN1YnNldCBvZiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBoZWxkIGJ5XG4gKiB0aGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucy5cbiAqXG4gKiBTZWVkZWQgcmF0aGVyIHRoYW4gb2ZmZXJlZCBhcyBhIHtAbGluayBST0xFX1RFTVBMQVRFU30gZW50cnksIHVubGlrZSB0aGVcbiAqIHRlbmFudCBqb2IgcHJlc2V0cywgYmVjYXVzZSB0aGV5IGFyZSBzdHJ1Y3R1cmFsOiB0aGUgQ0xJIGdyYW50cyBvbmUgdG8gdGhlXG4gKiBhY2NvdW50IGl0IGNyZWF0ZXMgYW5kIHRoZSBzdGFydHVwIGJhY2tmaWxsIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIG9udG8gaXQsXG4gKiBhbmQgYm90aCBoYXZlIHRvIGZpbmQgaXQgaW4gRVZFUlkgb3JnIGJ5IGEgc3RhYmxlIGlkZW50aXR5LiBBIHRlbXBsYXRlIGxlYXZlc1xuICogbm90aGluZyB0byBmaW5kIHVudGlsIHNvbWVib2R5IGluc3RhbnRpYXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BVVRPTUFUSU9OX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAncGlwZWxpbmVfYXV0b21hdGlvbicsXG4gICdwaXBlbGluZV9yZWdpc3RyYXRpb24nLFxuXTtcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucywga2V5ZWQgYnlcbiAqIGFjY291bnQgbmFtZSwgYW5kIHRoZSBidWlsdC1pbiBSb2xlIGVhY2ggaG9sZHMg4oCUIGBudWxsYCBmb3IgYW4gYWNjb3VudCB3aG9zZVxuICoga2V5IGNhcnJpZXMgYSBjYXBhYmlsaXR5IFNDT1BFIChhIGBUb2tlblNjb3BlYCkgYW5kIHNvIG5lZWRzIG5vIFJvbGUgYXQgYWxsLlxuICpcbiAqIE9uZSB0YWJsZSBmb3IgdGhlIENMSSAod2hpY2ggUm9sZSB0byBncmFudCBhIE5FVyBhY2NvdW50KSBhbmQgdGhlIHBsYXRmb3JtJ3NcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgKHdoaWNoIFJvbGUgdG8gbW92ZSBhbiBFWElTVElORyBhY2NvdW50IG9udG8sIG9mZiB0aGUgb3JnXG4gKiBhZG1pbiBSb2xlIHRoZXNlIGFjY291bnRzIHdlcmUgb25jZSBnaXZlbikuIEEgcmVuYW1lIGhlcmUgbW92ZXMgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTID0ge1xuICAncGxhdGZvcm0tYXV0b21hdGlvbic6ICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lLXJlZ2lzdGVyJzogJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG4gICdyZXBvcnRpbmctaW5nZXN0JzogbnVsbCxcbiAgJ3JlZ2lzdHJ5LXB1c2gnOiBudWxsLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2VlZEJ1bmRsZUlkIHwgbnVsbD47XG4iXX0=
|
|
1130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMkJ0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXNCO0lBQ2pELDRFQUE0RTtJQUM1RSxtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLDRCQUE0QjtJQUM1QiwwRUFBMEU7SUFDMUUsNEJBQTRCO0lBQzVCLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixrRUFBa0U7SUFDbEUsOEJBQThCO0lBQzlCLDRCQUE0QjtJQUM1QixtQkFBbUI7SUFDbkIsNkVBQTZFO0lBQzdFLCtFQUErRTtJQUMvRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLGNBQWM7Q0FDZixDQUFDO0FBYUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxlQUFlLEdBQUc7SUFDdEIsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHFDQUFxQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDeEgsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG9DQUFvQyxFQUFF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QkFBcUI7SUFDNUMsbUJBQW1CLEVBQUUsdUJBQXVCO0lBQzVDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsZUFBZSxFQUFFLElBQUk7Q0FDaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IE9yZ1JvbGUgfSBmcm9tICcuL3dpcmUtdm9jYWJ1bGFyeS5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uIGlkZW50aWZpZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENhbm9uaWNhbCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbiBpZGVudGlmaWVycywgaW4gYHJlc291cmNlOmFjdGlvbmAgZm9ybS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIE9SRy1TQ09QRUQgY2FwYWJpbGl0aWVzIGEgUm9sZSBjYW4gZ3JhbnQgKFJCQUMpLiBDb2Fyc2UgYnlcbiAqIGRlc2lnbiDigJQgYDp3cml0ZWAgY292ZXJzIGNyZWF0ZS91cGRhdGUvZGVsZXRlIGZvciBhIHJlc291cmNlIOKAlCBzbyB0aGUgY2F0YWxvZ1xuICogYW5kIHBlcm1pc3Npb24tcGlja2VyIFVJIHN0YXkgc21hbGw7IHNwbGl0IGEgYDp3cml0ZWAgaW50byBgOmNyZWF0ZWAvYDpkZWxldGVgXG4gKiBsYXRlciBpZiBhIHJlc291cmNlIG5lZWRzIGl0LlxuICpcbiAqIE5PVCBtb2RlbGVkIGhlcmUgKGludGVudGlvbmFsbHkpOiBwbGF0Zm9ybS1vcGVyYXRvciBhY3Rpb25zIChvcmcgZGVsZXRlLCB0aWVyL1xuICogcXVvdGEgb3ZlcnJpZGUsIHVzZXIgYWRtaW4sIGltcGVyc29uYXRpb24sIHBsYXRmb3JtIHNldHRpbmdzKSBzdGF5IGJlaGluZCB0aGVcbiAqIGdsb2JhbCBgaXNTdXBlckFkbWluYCBmbGFnLCBub3QgYSBwZXItb3JnIHBlcm1pc3Npb247IGFuZCBgcmVxdWlyZVN0ZXBVcGBcbiAqIChNRkEpIC8gYHJlcXVpcmVGZWF0dXJlYCAocGxhbiBlbnRpdGxlbWVudHMpIHJlbWFpbiBvcnRob2dvbmFsIGdhdGVzLlxuICpcbiAqIFRoZSBpZHMgYXJlIHRoZSBrZXlzIG9mIHtAbGluayBQRVJNSVNTSU9OX0RFRlN9IChiZWxvdywgYmVzaWRlIHRoZWlyIHBpY2tlclxuICogbGFiZWwsIGRlc2NyaXB0aW9uIGFuZCBjYXRlZ29yeSksIHNvIHRoZSB1bmlvbiwge0BsaW5rIEFMTF9QRVJNSVNTSU9OU30gYW5kXG4gKiB7QGxpbmsgUEVSTUlTU0lPTl9DQVRBTE9HfSBjYW5ub3QgZHJpZnQ6IGFkZGluZyBhIHBlcm1pc3Npb24gaXMgb25lIGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0ga2V5b2YgdHlwZW9mIFBFUk1JU1NJT05fREVGUztcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBhY3Rpb25zIGEgcGVybWlzc2lvbiBpZCBtYXkgZW5kIGluIOKAlCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlXG4gKiBgcmVzb3VyY2U6YWN0aW9uYCBzdHJhdGVneSB0aGUgZG9jcyBkZXNjcmliZS5cbiAqXG4gKiBJdCBpcyBjbG9zZWQgZm9yIG9uZSBjb25jcmV0ZSByZWFzb246IGBpc011dGF0aW9uUGVybWlzc2lvbmAgKGZyb250ZW5kXG4gKiBgbGliL2F1dGgtaGVscGVycy50c2ApIGNsYXNzaWZpZXMgcmVhZCB2cyB3cml0ZSBCWSBTVUZGSVgsIGFuZCB0aGF0IGlzIHdoYXRcbiAqIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFmZm9yZGFuY2UgZHVyaW5nIGEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gQVxuICogbm91bi1zaGFwZWQgYWN0aW9uICh0aGUgZm9ybWVyIGBvcmc6c2V0dGluZ3NgIGFuZCBgY29uc29sZXM6ZGF0YXN0b3JlYCkgY2Fubm90IGJlIGNsYXNzaWZpZWRcbiAqIGJ5IG5hbWUsIHNvIGVhY2ggb25lIGhhZCB0byBiZSBoYW5kLWxpc3RlZCDigJQgYW5kIGEgcGVybWlzc2lvbiBhZGRlZCB3aXRob3V0XG4gKiByZW1lbWJlcmluZyB0aGF0IGxpc3QgcmVuZGVycyBhbiBlbmFibGVkIGNvbnRyb2wgdGhhdCBkZWFkLWVuZHMgb24gYSA0MDMuXG4gKlxuICogUmVhZHMgYXJlIGA6cmVhZGAgYW5kIGA6cm9sbHVwYCAoYSByZWFkLVZJU0lCSUxJVFkgc2NvcGUpLiBFdmVyeXRoaW5nIGVsc2UgaXNcbiAqIGEgd3JpdGUuIFRoZSBmaXZlIGRvbWFpbiB2ZXJicyBhcmUga2VwdCBiZWNhdXNlIGVhY2ggbmFtZXMgYW4gYWN0aW9uIHdpdGggbm9cbiAqIHN5bm9ueW0gaW4gdGhpcyB2b2NhYnVsYXJ5IOKAlCBgOmV4cG9ydGAgaXMgZWdyZXNzIHJhdGhlciB0aGFuIG11dGF0aW9uLFxuICogYDppbnN0YWxsYCBpcyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiBhdXRob3JpbmcsIGA6bW9kZXJhdGVgIGFuZCBgOnZlcmlmeWAgYXJlXG4gKiBlY29zeXN0ZW0gZGVjaXNpb25zLCBhbmQgYDpvcGVyYXRlYCBtb3ZlcyBhbm90aGVyIHRlbmFudCdzIG1vbmV5LlxuICpcbiAqIGBQRVJNSVNTSU9OX0lEX1NIQVBFYCBhbmQgdGhpcyBsaXN0IGFyZSBhc3NlcnRlZCBvdmVyIHRoZSB3aG9sZSBjYXRhbG9nIGluXG4gKiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgLCBzbyBhZGRpbmcgYW4gb2ZmLXN0cmF0ZWd5IGlkIGZhaWxzXG4gKiB0aGVyZSByYXRoZXIgdGhhbiBhdCBhIDQwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fQUNUSU9OUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdyZWFkJywgJ3JvbGx1cCcsXG4gICd3cml0ZScsICdtYW5hZ2UnLCAncHVibGlzaCcsICdvcGVuJyxcbiAgJ2V4cG9ydCcsICdpbnN0YWxsJywgJ21vZGVyYXRlJywgJ3ZlcmlmeScsICdvcGVyYXRlJywgJ3B1cmdlJywgJ2FwcHJvdmUnLFxuXTtcblxuLyoqIGByZXNvdXJjZTphY3Rpb25gLCB3aGVyZSByZXNvdXJjZSBpcyBgc25ha2VfY2FzZWAgYW5kIGFjdGlvbiBpcyBpbiB7QGxpbmsgUEVSTUlTU0lPTl9BQ1RJT05TfS4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0lEX1NIQVBFID0gL15bYS16XVthLXowLTlfXSo6W2Etel0rJC87XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHtAbGluayBQZXJtaXNzaW9ufSBhbmQgZGVjaWRlIGFjY2Vzcy5cbiAqXG4gKiBcIklzIHBlcm1pc3Npb24gWCBlbmZvcmNlZCBhbnl3aGVyZT9cIiBoYXMgdG8gYmUgYW5zd2VyYWJsZSBzdGF0aWNhbGx5LCB3aGljaFxuICogYSBncmVwIGNhbid0IGRvOiBmb3VyIGRpZmZlcmVudCBjYWxsIHNoYXBlcyBjb25zdW1lIGEgcGVybWlzc2lvbiBpZFxuICogKGByZXF1aXJlUGVybWlzc2lvbigneCcpYCBhdCBhIHJvdXRlLCBgdXNlckhhc1Blcm1pc3Npb24ocmVxLCAneCcpYCBpbnNpZGUgYVxuICogY29udHJvbGxlciwgYW5kIGByZXNvbHZlVmlzaWJpbGl0eShyZXEsIHYsICd4JylgIC9cbiAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKOKApiwgJ3gnKWAgaW4gdGhlIHZpc2liaWxpdHkgaGVscGVycyksIHNvIGEgbmFpdmVcbiAqIGdyZXAgZm9yIGEgcm91dGUtbGV2ZWwgZ2F0ZSByZXBvcnRzIGB0ZW1wbGF0ZXM6cHVibGlzaGAgYXMgVU5FTkZPUkNFRCB3aGVuIGl0XG4gKiBpcyBpbiBmYWN0IGVuZm9yY2VkIG9uIGV2ZXJ5IHRlbXBsYXRlIHB1Ymxpc2guXG4gKlxuICogVGhleSBhbGwgYm90dG9tIG91dCBpbiBgdXNlckhhc1Blcm1pc3Npb25gLCBzbyB0aGUgUlVOVElNRSBwcmltaXRpdmUgd2FzXG4gKiBhbHJlYWR5IG9uZS4gVGhpcyBjb25zdGFudCBtYWtlcyB0aGUgU1RBVElDIHN1cmZhY2Ugb25lIGFzIHdlbGw6IGl0IG5hbWVzXG4gKiBldmVyeSBlbnRyeSBwb2ludCwgc28gYHBlcm1pc3Npb24tY292ZXJhZ2UudGVzdC50c2AgY2FuIGVudW1lcmF0ZSB0aGUgY2F0YWxvZ1xuICogYW5kIHJlcG9ydCBlYWNoIHBlcm1pc3Npb24ncyBlbmZvcmNlbWVudCBzaXRlcyB3aXRob3V0IGd1ZXNzaW5nLiBBIG5ldyBnYXRlXG4gKiB0aGF0IHRha2VzIGEgYFBlcm1pc3Npb25gIG11c3QgYmUgbGlzdGVkIGhlcmUsIG9yIHRoZSBjb3ZlcmFnZSByZXBvcnQgc3RhcnRzXG4gKiBseWluZyBhYm91dCB0aGUgcGVybWlzc2lvbnMgb25seSB0aGF0IGdhdGUgZW5mb3JjZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0dBVEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLy8gTWlkZGxld2FyZSBnYXRlcyAocm91dGUgbGV2ZWwpIOKAlCBhbGwgYW55LW9mIGV4Y2VwdCByZXF1aXJlQWxsUGVybWlzc2lvbnMuXG4gICdyZXF1aXJlUGVybWlzc2lvbicsXG4gICdyZXF1aXJlQWxsUGVybWlzc2lvbnMnLFxuICAncmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UnLFxuICAvLyBUaGUgcGx1Z2luLWVjb3N5c3RlbSBnb3Zlcm5hbmNlIGNoYWluIChzeXN0ZW0gb3JnICsgcGVybWlzc2lvbiArIGFhbDIpLlxuICAncmVxdWlyZVN5c3RlbU9yZ1Blcm1pc3Npb24nLFxuICAvLyBUaGUgc2luZ2xlIHJ1bnRpbWUgcHJpbWl0aXZlIGV2ZXJ5IGdhdGUgYWJvdmUgZGVsZWdhdGVzIHRvOyBhbHNvIGNhbGxlZFxuICAvLyBkaXJlY3RseSB3aGVyZSBhIGNvbnRyb2xsZXIgYnJhbmNoZXMgb24gYSBjYXBhYmlsaXR5IHJhdGhlciB0aGFuIHJlamVjdGluZy5cbiAgJ3VzZXJIYXNQZXJtaXNzaW9uJyxcbiAgJ2hhc1Blcm1pc3Npb24nLFxuICAvLyBWaXNpYmlsaXR5IGhlbHBlcnMg4oCUIHRoZXkgdGFrZSB0aGUgZW50aXR5J3MgUFVCTElTSCBwZXJtaXNzaW9uLlxuICAncmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcycsXG4gICdyZXNvbHZlVmlzaWJpbGl0eScsXG4gIC8vIHF1b3RhJ3Mgb3duIHdyYXBwZXIuIEl0IGRlbGVnYXRlcyB0byBgcmVxdWlyZVBlcm1pc3Npb25gLCBidXQgaXQgdGFrZXMgdGhlXG4gIC8vIGlkIGFzIGFuIE9QVElPTiAoYGF1dGhvcml6ZU9yZyh7IHBlcm1pc3Npb246ICdxdW90YXM6bWFuYWdlJyB9KWApIGJlY2F1c2UgaXRcbiAgLy8gYWxzbyBjYW5vbmljYWxpemVzIHRoZSBgOm9yZ0lkYCBwYXJhbSwgd2hpY2ggdGhlIHJvdXRlIGNhbm5vdCBkcm9wLiBXaXRob3V0XG4gIC8vIHRoaXMgZW50cnkgdGhlIGNvdmVyYWdlIHNjYW4gcmVwb3J0ZWQgYHF1b3RhczptYW5hZ2VgIGFzIGVuZm9yY2VkIG5vd2hlcmUuXG4gICdhdXRob3JpemVPcmcnLFxuXTtcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBvbmUgcGVybWlzc2lvbjogdGhlIGxhYmVsICsgZGVzY3JpcHRpb24gdGhlXG4gKiBwZXJtaXNzaW9uLXBpY2tlciBVSSBzaG93cywgYW5kIHRoZSBjYXRlZ29yeSBpdCBncm91cHMgdW5kZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbk1ldGEge1xuICBpZDogUGVybWlzc2lvbjtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVyeSBwZXJtaXNzaW9uLCBrZXllZCBieSBpZCwgd2l0aCB0aGUgZGlzcGxheSBtZXRhZGF0YSB0aGUgcGVybWlzc2lvbi1waWNrZXJcbiAqIFVJIHNob3dzIChsYWJlbCwgZGVzY3JpcHRpb24sIHRoZSBjYXRlZ29yeSBpdCBncm91cHMgdW5kZXIpLCBpbiBwaWNrZXIgb3JkZXIuXG4gKiBUaGUgY29tbWVudCBhYm92ZSBhbiBlbnRyeSBpcyB0aGF0IHBlcm1pc3Npb24ncyBkZXNpZ24gbm90ZS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLlxuICovXG5jb25zdCBQRVJNSVNTSU9OX0RFRlMgPSB7XG4gICdwaXBlbGluZXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnVmlldyBwaXBlbGluZXMgYW5kIHRoZWlyIGV4ZWN1dGlvbnMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgJ3BpcGVsaW5lczp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmVzJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gICdwaXBlbGluZXM6cHVibGlzaCc6IHsgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIC8vIFRoZSBwaXBlbGluZSBSRUdJU1RSWSAoYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWApOiB3aGljaCBkZXBsb3llZFxuICAvLyBzdGFjayBiYWNrcyBhIHBpcGVsaW5lLCBhbmQgdGhlIHN0ZXAgbWFuaWZlc3Qgb2YgcGx1Z2luIGRpZ2VzdHMgaXQgcnVucy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6d3JpdGVgIHNvIHRoZSBDb2RlQnVpbGQgc3ludGggY2FuIGtlZXAgdGhhdCByZWNvcmRcbiAgLy8gY3VycmVudCB3aXRoIGEgY3JlZGVudGlhbCB0aGF0IGNhbiBkbyBub3RoaW5nIGVsc2Ug4oCUIGEga2V5IGhvbGRpbmdcbiAgLy8gYHBpcGVsaW5lczp3cml0ZWAgY291bGQgcmV3cml0ZSBldmVyeSBwaXBlbGluZSB0aGUgb3JnIG93bnMuIFBlb3BsZSBnZXQgaXRcbiAgLy8gYmVzaWRlIGBwaXBlbGluZXM6d3JpdGVgICh0aGUgTWVtYmVyIGJ1bmRsZSk7IHRoZSBgcGlwZWxpbmUtcmVnaXN0ZXJgXG4gIC8vIHNlcnZpY2UgYWNjb3VudCBob2xkcyBpdCBhbG9uZS5cbiAgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJzogeyBsYWJlbDogJ1JlZ2lzdGVyIGRlcGxveW1lbnRzJywgZGVzY3JpcHRpb246ICdSZWNvcmQgYW5kIHJlbW92ZSB0aGUgZGVwbG95ZWQgc3RhY2sgYW5kIHN0ZXAgbWFuaWZlc3QgYmVoaW5kIGEgcGlwZWxpbmUgKHRoZSBwaXBlbGluZSByZWdpc3RyeSknLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgLy8gVGhlIG9yZydzIG1hbmFnZWQtdG9vbGNoYWluIERFRkFVTFQgKGRvY3MvcGxhbnMvYm9vdHN0cmFwLWltYWdlLXZlcnNpb25pbmcubWRcbiAgLy8gRDEzKTogd2hpY2ggdG9vbGNoYWluIHJlbGVhc2UgZXZlcnkgdW5waW5uZWQgcGlwZWxpbmUgaW4gdGhlIG9yZyAoYW5kIGl0c1xuICAvLyB0ZWFtcyB0aGF0IHNldCBub25lKSBzeW50aGVzaXplcyB3aXRoIG9uIGl0cyBuZXh0IHJ1bi4gT3JnLWFzc2lnbmFibGUsIHNvXG4gIC8vIEFkbWluIGFuZCBPd25lciBob2xkIGl0OyBOT1QgaW4gTWVtYmVyIG9yIGFueSBwaXBlbGluZS1lZGl0b3IgYnVuZGxlLiBTcGxpdFxuICAvLyBieSBibGFzdCByYWRpdXM6IGBwaXBlbGluZXM6d3JpdGVgIG1vdmVzIE9ORSBwaXBlbGluZSAoaXRzIG93blxuICAvLyBgdG9vbGNoYWluLnJlbGVhc2VgIHBpbiksIHRoaXMgbW92ZXMgQUxMIG9mIHRoZW0sIGFuZFxuICAvLyBgcGx1Z2luX2luc3RhbGxzOm1hbmFnZWAgZ292ZXJucyBmdXR1cmUgaW5zdGFsbHMsIG5vdCBydW5uaW5nIHBpcGVsaW5lcy5cbiAgLy8gSXQgbmV2ZXIgY29uZmVycyBhbnl0aGluZyBvbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCwgY2FuYXJ5IG9yIGNhdGFsb2cuXG4gIC8vIEV2ZXJ5IHdyaXRlIGFsc28gbmVlZHMgYHJlcXVpcmVTdGVwVXBgLlxuICAndG9vbGNoYWluOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgdGhlIG9yZyB0b29sY2hhaW4gZGVmYXVsdCcsIGRlc2NyaXB0aW9uOiBcIkNob29zZSB3aGljaCBtYW5hZ2VkIHRvb2xjaGFpbiByZWxlYXNlIHlvdXIgb3JnJ3MgdW5waW5uZWQgcGlwZWxpbmVzIChhbmQgdGVhbXMgd2l0aG91dCB0aGVpciBvd24pIGJ1aWxkIHdpdGgsIG9yIGZvbGxvdyB0aGUgcGxhdGZvcm0gZGVmYXVsdFwiLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gICd0ZW1wbGF0ZXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgZ29sZGVuLXBhdGggdGVtcGxhdGUgY2F0YWxvZycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICAndGVtcGxhdGVzOndyaXRlJzogeyBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgJ3RlbXBsYXRlczpwdWJsaXNoJzogeyBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gICdwbHVnaW5zOnJlYWQnOiB7IGxhYmVsOiAnVmlldyBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdWaWV3IHBsdWdpbnMgYW5kIGJ1aWxkcycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgJ3BsdWdpbnM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gICdwbHVnaW5zOnB1Ymxpc2gnOiB7IGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gICdwbHVnaW5zOmluc3RhbGwnOiB7IGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJzogeyBsYWJlbDogJ01hbmFnZSBwbHVnaW4gaW5zdGFsbHMnLCBkZXNjcmlwdGlvbjogXCJTZXQgeW91ciBvcmcncyBwbHVnaW4gY29uc3VtcHRpb24gcG9saWN5IGFuZCBhcHByb3ZlIG9yIGRlbnkgaW5zdGFsbCByZXF1ZXN0cyB3aXRoaW4gdGhlIG9yZ1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwdWJsaXNoZXJzOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgcHVibGlzaGVyIHByb2ZpbGUnLCBkZXNjcmlwdGlvbjogXCJNYW5hZ2UgeW91ciBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSBhbmQgc3VibWl0IHB1Ymxpc2gsIHZlcmlmaWNhdGlvbiwgdHJhbnNmZXIsIGFuZCBhZHZpc29yeSByZXF1ZXN0c1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwbHVnaW5zOm1vZGVyYXRlJzogeyBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gICdwdWJsaXNoZXJzOnZlcmlmeSc6IHsgbGFiZWw6ICdWZXJpZnkgcHVibGlzaGVycycsIGRlc2NyaXB0aW9uOiAnQXBwcm92ZSBWZXJpZmllZCBhcHBsaWNhdGlvbnMsIHB1Ymxpc2hlciB0aWVyIGFuZCBwcm9maWxlIGNoYW5nZXMsIGFuZCBvd25lcnNoaXAgdHJhbnNmZXJzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICAvLyBQbGF0Zm9ybSBvcGVyYXRpb25zIChzeXN0ZW0tb3JnIG9ubHkpLiBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzXG4gIC8vIHRoYXQgdXNlZCB0byByZXF1aXJlIHRoZSBzdXBlcmFkbWluIEZMQUcsIHNvIGEgZGVwbG95bWVudCBjYW4gc3RhZmYgdGhlbVxuICAvLyB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIGhhbmRpbmcgb3V0IGltcGxpY2l0LWFsbC4gU3BsaXQgYmVjYXVzZSB0aGUgdHdvIGNhcnJ5XG4gIC8vIGRpZmZlcmVudCByaXNrOiByZWFkaW5nIHdoYXQgYSBkZXBsb3kgY29uZmlndXJlZCBpcyBub3QgdGhlIHNhbWUgYXMgbW92aW5nXG4gIC8vIGFub3RoZXIgb3JnYW5pc2F0aW9uJ3MgbW9uZXkuXG4gICdwbGF0Zm9ybTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgcGxhdGZvcm0gb3BlcmF0aW9ucycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MgYW5kIHRoZSBjcm9zcy10ZW5hbnQgb3JnYW5pemF0aW9uIGxpc3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgT1JHIExJU1QsIHNwbGl0IG91dCBvZiBgcGxhdGZvcm06cmVhZGAgYmVjYXVzZSB0aGF0IG9uZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBkb2luZyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBibGFzdCByYWRpaTogcmVhZGluZyB3aGF0IGFcbiAgLy8gREVQTE9ZIHdhcyBjb25maWd1cmVkIHRvIGRvIChSTFMgbW9kZSwgS01TIHBvc3R1cmUsIHRoZSByZW5kZXJlZCBhbGVydFxuICAvLyBydWxlcykgYW5kIHJlYWRpbmcgdGhlIHJvc3RlciBvZiBldmVyeSBDVVNUT01FUi4gVGhyZWUgb2YgdGhlIGZvdXIgam9iXG4gIC8vIGJ1bmRsZXMgY2FycmllZCBpdCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gd2FudGVkIHRoZSBkZXBsb3kgaW50ZXJuYWxzIOKAlFxuICAvLyBDb25zb2xlIEFkbWluaXN0cmF0b3IgYW5kIFN1cHBvcnQgQWdlbnQgZ290IHRoZW0gcHVyZWx5IGJlY2F1c2UgdGhleSBuZWVkZWRcbiAgLy8gdG8gZmluZCBhbiBvcmcgYnkgbmFtZS5cbiAgLy9cbiAgLy8gU2FtZSBtaXN0YWtlLCBhbmQgc2FtZSBmaXgsIGFzIGBjb25zb2xlczpkYXRhc3RvcmVgIGJlZm9yZSBpdCB3YXMgc3BsaXQgYnlcbiAgLy8gd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzLlxuICAnb3JnczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgYWxsIG9yZ2FuaXphdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0xpc3QgYW5kIG9wZW4gZXZlcnkgb3JnYW5pemF0aW9uIG9uIHRoZSBkZXBsb3ltZW50IFxcdTIwMTQgdGhlIHJvc3RlciB0aGUgb3BlcmF0b3Igc3VyZmFjZXMgd29yayBmcm9tIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBUaGUgVG9vbGNoYWluIENPTlNPTEUgKHBsYW4gRDk7IG5hbWVkIGFmdGVyIGBiaWxsaW5nOm9wZXJhdGVgKTogcHVibGlzaFxuICAvLyBsaWZlY3ljbGUsIGNhbmFyeSBtZW1iZXJzaGlwIGFuZCBUSEUgcGxhdGZvcm0gZGVmYXVsdCDigJQgZXZlcnkgb3JnIHdpdGhvdXRcbiAgLy8gaXRzIG93biBkZWZhdWx0IG1vdmVzIHdpdGggaXQuIFN5c3RlbS1vcmctb25seSAob3RoZXJ3aXNlIEFETUlOX1BFUk1JU1NJT05TLFxuICAvLyBkZXJpdmVkIGZyb20gT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMsIHdvdWxkIGhhbmQgaXQgdG8gZXZlcnkgdGVuYW50XG4gIC8vIEFkbWluKTsgY2FycmllZCBieSBQbGF0Zm9ybSBPcGVyYXRvci4gRXZlcnkgd3JpdGUgYWxzbyBuZWVkcyBgcmVxdWlyZVN0ZXBVcGAuXG4gICd0b29sY2hhaW46b3BlcmF0ZSc6IHsgbGFiZWw6ICdPcGVyYXRlIHRoZSBwbGF0Zm9ybSB0b29sY2hhaW4nLCBkZXNjcmlwdGlvbjogJ1J1biB0aGUgVG9vbGNoYWluIGNvbnNvbGU6IGNhbmFyeSBtZW1iZXJzaGlwLCByZWxlYXNlIG5vdGVzLCBkZXByZWNhdGUgLyB5YW5rIC8gZGVsZXRlIHJlbGVhc2VzLCBhbmQgc2V0IHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGV2ZXJ5IG9yZyB3aXRob3V0IGl0cyBvd24gZm9sbG93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ2JpbGxpbmc6b3BlcmF0ZSc6IHsgbGFiZWw6ICdPcGVyYXRlIGRpc2NvdW50cyBhbmQgcHJvbW90aW9ucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBhcHBseSBhbmQgcmV2b2tlIGRpc2NvdW50IHRva2VucyBhbmQgcHJvbW90aW9uIGNhbXBhaWducyBhY3Jvc3MgdGVuYW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgLy8gVGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBzcGxpdCBieSBCTEFTVCBSQURJVVMgcmF0aGVyIHRoYW4gYnkgcHJvZHVjdC4gVGhyZWVcbiAgLy8gcGVybWlzc2lvbnMgZm9yIGZpdmUgY29uc29sZXMsIGJlY2F1c2Ugd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzIGRpZmZlcnNcbiAgLy8gYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlIGF0IGVhY2ggc3RlcDpcbiAgLy9cbiAgLy8gIC0gYG9ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuYCDigJQgR3JhZmFuYSBhbmQgS2lhbGkuIFJlYWQtb25seSB2aWV3czsgdGhlIHdvcnN0XG4gIC8vICAgIG91dGNvbWUgb2YgYSBtaXN0YWtlbiBncmFudCBpcyBzZWVpbmcgdGVsZW1ldHJ5LlxuICAvLyAgLSBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCAgICAg4oCUIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MuIEEgZGF0YWJhc2Ugc2hlbGxcbiAgLy8gICAgb3ZlciBldmVyeSB0ZW5hbnQncyByb3dzOiBpdCBjYW4gcmVhZCBhbmQgcmV3cml0ZSB0ZW5hbnQgZGF0YSwgYnV0IHRoZVxuICAvLyAgICBhdWRpdCBjaGFpbiBsaXZlcyBlbHNld2hlcmUsIHNvIHRoZSBkYW1hZ2UgaXMgcmVjb3JkZWQuXG4gIC8vICAtIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gICAg4oCUIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlLiBJdCBjYW4gTElTVCBhbmRcbiAgLy8gICAgREVMRVRFIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5LCBMb2tpLCBUaGFub3MsIHBsdWdpbi1idWlsZCBhbmRcbiAgLy8gICAgYXVkaXQtY2hhaW4gYnVja2V0cy4gU3BsaXQgZnJvbSB0aGUgcGFpciBhYm92ZSBiZWNhdXNlIHRoZSB0d28gYXJlIHRoZVxuICAvLyAgICB0d28gSEFMVkVTIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2UgZGVzaWduOiB0aGUgY2hhaW4ncyBITUFDIGtleVxuICAvLyAgICBsaXZlcyBvdXRzaWRlIHRoZSBEQiwgc28gYSBNb25nbyBzaGVsbCBjYW4gdGFtcGVyIGJ1dCBjYW5ub3QgZm9yZ2UgYVxuICAvLyAgICBjb25zaXN0ZW50IGNoYWluIOKAlCBleGNlcHQgYnkgdHJ1bmNhdGluZyB0aGUgdGFpbCwgd2hpY2ggYSBjaGFpbiBjYW5ub3RcbiAgLy8gICAgc2VlIGZyb20gdGhlIGluc2lkZSwgYW5kIHRoZSBkZWZlbmNlIGFnYWluc3QgVEhBVCBpcyB0aGUgc2lnbmVkXG4gIC8vICAgIGNoYWluLWhlYWQgZXhwb3J0IHRvIG9iamVjdCBzdG9yYWdlLiBPbmUgc2hlbGwgY2FuIHRydW5jYXRlOyB0aGUgb3RoZXJcbiAgLy8gICAgY2FuIGRlbGV0ZSB0aGUgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24uXG4gIC8vXG4gIC8vIEFsbCB0aHJlZSBhcmUgc3lzdGVtLW9yZy1vbmx5LCBzbyBub25lIGNhbiBiZSBoZWxkIGluc2lkZSBhIHRlbmFudCwgYW5kIG9ubHlcbiAgLy8gdGhlIGZpcnN0IGlzIGluIHRoZSBQbGF0Zm9ybSBPcGVyYXRvciBidW5kbGU6IHN0YWZmaW5nIGFuIG9wZXJhdG9yIG11c3QgbmV2ZXJcbiAgLy8gaGFuZCBvdmVyIGEgZGF0YSBzaGVsbCBhcyBhIHNpZGUgZWZmZWN0LiBHcmFudGluZyBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBpc1xuICAvLyBhIHNlcGFyYXRlLCBleHBsaWNpdCBhY3QgYnkgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIFJvbGUgZm9yIGV4YWN0bHkgdGhhdFxuICAvLyBwdXJwb3NlLlxuICAvL1xuICAvLyBXSEFUIFRIRSBTUExJVCBET0VTIE5PVCBETywgc28gbm9ib2R5IGJ1aWxkcyBvbiBpdDogaXQgaXMgbm90IGEgY29udGFpbm1lbnRcbiAgLy8gYm91bmRhcnkuIFJvbGVzIGxpdmUgaW4gTW9uZ28gKGBjb2xsZWN0aW9uOiAncm9sZXMnYCksIHNvIGFcbiAgLy8gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgaG9sZGVyIGNhbiB3cml0ZSB0aGF0IGNvbGxlY3Rpb24gYW5kIGdyYW50IHRoZW1zZWx2ZXNcbiAgLy8gYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAg4oCUIGRhdGFzdG9yZSBjb250YWlucyBvYmplY3RzdG9yZSBieSBlc2NhbGF0aW9uLiBUaGVcbiAgLy8gc3BsaXQgZXhwcmVzc2VzIGludGVudCwga2VlcHMgdGhlIGRlZmF1bHQgZ3JhbnQgc21hbGwgYW5kIGdpdmVzIGVhY2ggY2xhc3NcbiAgLy8gaXRzIG93biByZWZ1c2FsIHNpZ25hbC4gV2hhdCBhY3R1YWxseSBwcm90ZWN0cyB0aGUgYXVkaXQgaGVhZHMgZnJvbSB3aG9ldmVyXG4gIC8vIG9wZW5zIHRoYXQgY29uc29sZSBpcyBTMyBPYmplY3QgTG9jayB3aXRoIGEgcmV0YWluLXVudGlsLWRhdGVcbiAgLy8gKGBwbGF0Zm9ybS9zcmMvc2VydmljZXMvYXVkaXQtaGVhZC1leHBvcnQudHNgKSwgd2hpY2ggaG9sZHMgcmVnYXJkbGVzcyBvZlxuICAvLyBhbnkgcGVybWlzc2lvbiBoZXJlLlxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nOiB7IGxhYmVsOiAnT3BlbiB0aGUgb2JzZXJ2YWJpbGl0eSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBHcmFmYW5hIGFuZCBLaWFsaSDigJQgZGFzaGJvYXJkcywgdHJhZmZpYyBhbmQgbWVzaCBoZWFsdGggYWNyb3NzIGV2ZXJ5IHRlbmFudCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3Blbic6IHsgbGFiZWw6ICdPcGVuIHRoZSBkYXRhYmFzZSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzIOKAlCBhIGRpcmVjdCByZWFkL3dyaXRlIHNoZWxsIG92ZXIgZXZlcnkgdGVuYW50XFx1MjAxOXMgcm93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3Blbic6IHsgbGFiZWw6ICdPcGVuIHRoZSBvYmplY3Qtc3RvcmUgY29uc29sZScsIGRlc2NyaXB0aW9uOiAnT3BlbiB0aGUgUnVzdEZTIChTMykgY29uc29sZSDigJQgbGlzdCBhbmQgZGVsZXRlIG9iamVjdHMgaW4gZXZlcnkgYnVja2V0LCBpbmNsdWRpbmcgdGhlIGF1ZGl0IGNoYWluIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgJ29uY2FsbDptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIG9uLWNhbGwgcGFnaW5nJywgZGVzY3JpcHRpb246ICdSZWFkIHRoZSBwYWdpbmcgcG9zdHVyZSBhbmQgc2VuZCBhIHRlc3QgcGFnZSAoc3lzdGVtIG9yZyBvbmx5OyB0aGUgcm90YSBsaXZlcyB3aXRoIHRoZSBwcm92aWRlciknLCBjYXRlZ29yeTogJ09uLWNhbGwnIH0sXG4gIC8vIFRoZSB2ZW5kb3IncyBvdGhlciBvcGVyYXRpb25hbCBUQVNLUyAoc3lzdGVtIG9yZyBvbmx5KS4gRWFjaCBleGlzdHMgc28gYVxuICAvLyBzdXBlcmFkbWluIGNhbiBzdGFmZiBvbmUgam9iIHdpdGggYSBSb2xlIGluc3RlYWQgb2YgdGhlIHN1cGVyYWRtaW4gZmxhZyDigJRcbiAgLy8gYmVmb3JlIHRoZXNlLCAzNCByb3V0ZXMgd2VyZSByZWFjaGFibGUgb25seSBieSBzb21lb25lIHdobyBhbHNvIGhlbGRcbiAgLy8gaW1wZXJzb25hdGlvbiwgYSBkYXRhYmFzZSBzaGVsbCBhbmQgdGhlIGFiaWxpdHkgdG8gbWludCBhbm90aGVyIHN1cGVyYWRtaW4uXG4gIC8vXG4gIC8vIFN1cHBvcnQgZGVzaywgc3BsaXQgaW4gdHdvIGJlY2F1c2UgdGhlIGNvbnRlbnQgaXMgcmV1c2VkIGFjcm9zcyBldmVyeVxuICAvLyBjdXN0b21lciB3aGlsZSBhIGNhc2UgYmVsb25ncyB0byBvbmU6IGBzdXBwb3J0X2Nhc2VzOndyaXRlYCBpcyB0aGUgZGVzaydzXG4gIC8vIG93biB3b3JrICh0cmlhZ2UsIGFzc2lnbm1lbnQsIHNldmVyaXR5LCBpbnRlcm5hbCBub3RlcywgcmVjb3JkaW5nIGFuXG4gIC8vIGluY2lkZW50IGFnYWluc3QgYSBzdXBwb3J0IGNvbnRyYWN0KSwgYHN1cHBvcnRfY29udGVudDp3cml0ZWAgaXMgYXV0aG9yaW5nXG4gIC8vIHRoZSBjYW5uZWQgcmVwbGllcy4gRWFjaCBnYXRlcyBpdHMgdGFzaydzIFJFQURTIGFzIHdlbGwgYXMgaXRzIHdyaXRlcyxcbiAgLy8gYWdhaW5zdCB0aGUgdXN1YWwgY29udmVudGlvbiwgYmVjYXVzZSB0aGVzZSB0YWJsZXMgY2Fycnkgbm8gYG9yZ19pZGAg4oCUIHRoZXJlXG4gIC8vIGlzIG5vIHRlbmFuY3kgYm91bmRhcnkgdW5kZXJuZWF0aCB0byBmYWxsIGJhY2sgb24uXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJzogeyBsYWJlbDogJ1dvcmsgdGhlIHN1cHBvcnQgZGVzaycsIGRlc2NyaXB0aW9uOiAnVHJpYWdlIHRoZSBzdXBwb3J0IHF1ZXVlLCBhc3NpZ24gYW5kIHJlLXByaW9yaXRpc2UgY2FzZXMsIHdyaXRlIGludGVybmFsIG5vdGVzLCBhbmQgcmVjb3JkIGluY2lkZW50cyBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJzogeyBsYWJlbDogJ0F1dGhvciBjYW5uZWQgcmVwbGllcycsIGRlc2NyaXB0aW9uOiAnV3JpdGUgYW5kIHJldGlyZSB0aGUgcmV1c2FibGUgc3VwcG9ydCByZXBsaWVzIG9mZmVyZWQgdG8gZXZlcnkgY3VzdG9tZXIgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgLy8gQ3Jvc3MtdGVuYW50IHN1YnNjcmlwdGlvbnMuIFJlYWQgaXMgc3BsaXQgZnJvbSB3cml0ZSBiZWNhdXNlIGEgcmVhZC1vbmx5XG4gIC8vIGhvbGRlciBpcyBhIHJlYWwgam9iIGhlcmU6IHNvbWVvbmUgd2hvIHJlcG9ydHMgb24gcmV2ZW51ZSBhbmQgcGxhbiBtaXhcbiAgLy8gd2l0aG91dCBiZWluZyBhYmxlIHRvIGNoYW5nZSBhIHBsYW4gb3IgY2FuY2VsIG9uZS5cbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGFsbCBzdWJzY3JpcHRpb25zJywgZGVzY3JpcHRpb246ICdWaWV3IGV2ZXJ5IG9yZ2FuaXphdGlvblxcdTIwMTlzIHN1YnNjcmlwdGlvbiwgcGxhbiBtaXggYW5kIGJpbGxpbmcgZXZlbnRzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnOiB7IGxhYmVsOiAnQ2hhbmdlIGFueSBzdWJzY3JpcHRpb24nLCBkZXNjcmlwdGlvbjogJ0NoYW5nZSBhIHBsYW4sIHNldCBhIHN1cHBvcnQgZmxvb3IsIGFuZCBjYW5jZWwgYW4gb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gICdvcmdzOm1hbmFnZSc6IHsgbGFiZWw6ICdBZG1pbmlzdGVyIGFueSBvcmdhbml6YXRpb24nLCBkZXNjcmlwdGlvbjogJ1JlbmFtZSwgcmUtdGllciwgbW92ZSBhbmQgZGVsZXRlIGFueSBvcmdhbml6YXRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIENyb3NzLXRlbmFudCBxdW90YSB3cml0ZXMuIFRoZSBtYXRjaGluZyByZWFkcyAoYC9xdW90YXMvYWxsYCwgYC9hdC1yaXNrYClcbiAgLy8gcmlkZSBgcGxhdGZvcm06cmVhZGAgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0b3IgZGFzaGJvYXJkLCBzbyBzb21lb25lXG4gIC8vIHdhdGNoaW5nIGZvciBleGhhdXN0aW9uIGRvZXMgbm90IG5lZWQgdGhlIGFiaWxpdHkgdG8gcmFpc2UgYSBsaW1pdC5cbiAgJ3F1b3RhczptYW5hZ2UnOiB7IGxhYmVsOiAnQ2hhbmdlIGFueSBxdW90YScsIGRlc2NyaXB0aW9uOiAnUmFpc2UsIHJlc2V0IGFuZCBjbGVhciBhbm90aGVyIG9yZ2FuaXphdGlvblxcdTIwMTlzIHF1b3RhcyAoc3lzdGVtIG9yZyBvbmx5OyB2aWV3aW5nIHRoZW0gcmlkZXMgcGxhdGZvcm06cmVhZCknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZSc6IHsgbGFiZWw6ICdSdW4gdGhlIHBsdWdpbiBidWlsZCBxdWV1ZScsIGRlc2NyaXB0aW9uOiAnUmVhZCBidWlsZC1xdWV1ZSBkZXB0aCBhbmQgcHVyZ2UgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICAnY29tcGxpYW5jZTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnVmlldyBjb21wbGlhbmNlIHJ1bGVzLCBwb2xpY2llcywgYW5kIHNjYW5zJywgY2F0ZWdvcnk6ICdDb21wbGlhbmNlJyB9LFxuICAnY29tcGxpYW5jZTp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IHJ1bGVzLCBwb2xpY2llcywgYW5kIGV4ZW1wdGlvbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gICdtZW1iZXJzOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gICdyb2xlczptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIHJvbGVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcm9sZXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gICdpbnZpdGF0aW9uczptYW5hZ2UnOiB7IGxhYmVsOiAnTWFuYWdlIGludml0YXRpb25zJywgZGVzY3JpcHRpb246ICdTZW5kLCByZXNlbmQsIGFuZCByZXZva2UgaW52aXRhdGlvbnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJzogeyBsYWJlbDogJ01hbmFnZSBzZXJ2aWNlIGFjY291bnRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgb3JnIHNlcnZpY2UgYWNjb3VudHMsIGFzc2lnbiB0aGVpciByb2xlcywgYW5kIGlzc3VlIG9yIHJldm9rZSB0aGVpciBrZXlzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICAnZGFzaGJvYXJkczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnVmlldyBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgJ2Rhc2hib2FyZHM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdWaWV3IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gICdvYnNlcnZhYmlsaXR5OndyaXRlJzogeyBsYWJlbDogJ01hbmFnZSBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICAnbG9nczpleHBvcnQnOiB7IGxhYmVsOiAnRG93bmxvYWQgbG9ncycsIGRlc2NyaXB0aW9uOiBcIkRvd25sb2FkIHlvdXIgb3JnYW5pemF0aW9uJ3MgbG9nIGVudHJpZXMgYXMgYSBmaWxlICh2aWV3aW5nIGxvZ3Mgb25seSBuZWVkcyAnVmlldyBhbGVydGluZycpXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gICdhdWRpdDpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgdGhlIGF1ZGl0IGxvZycsIGRlc2NyaXB0aW9uOiBcIlJlYWQgdGhlIG9yZ2FuaXphdGlvbidzIG93biB0YW1wZXItZXZpZGVudCBhdWRpdCB0cmFpbFwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gICdyZXBvcnRzOnJlYWQnOiB7IGxhYmVsOiAnVmlldyByZXBvcnRzJywgZGVzY3JpcHRpb246ICdWaWV3IGFuYWx5dGljcyBhbmQgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdyZXBvcnRzOnJvbGx1cCc6IHsgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0cy4gYHJlcG9ydHM6cmVhZGAgc3RheXMgdGhlIEZSRUUgb24tZGVtYW5kIGRhc2hib2FyZCByZWFkO1xuICAvLyB0aGVzZSB0d28gYXJlIHRoZSBhZGQtb24ncyB3cml0ZSBzdXJmYWNlIOKAlCBgYXV0aG9yYCBzYXZlcy9zY2hlZHVsZXMvZHJhZnRzIGFcbiAgLy8gcmVwb3J0LCBgc2hhcmVgIHB1Ymxpc2hlcyBpdCBiZXlvbmQgdGhlIHBsYXRmb3JtIChQREYsIGVtYWlsLCBzaGFyZSBsaW5rcykuXG4gIC8vIFNwbGl0IGJlY2F1c2UgcHVibGlzaGluZyBleHRlcm5hbGx5IGlzIGEgZGlmZmVyZW50IHJpc2sgZnJvbSBjb21wb3Npbmc6XG4gIC8vIGEgbGVhZCBjYW4gYmUgYWxsb3dlZCB0byBidWlsZCByZXBvcnRzIHdpdGhvdXQgYmVpbmcgYWxsb3dlZCB0byBlbWFpbCB0aGVtIG91dC5cbiAgJ3JlcG9ydHM6d3JpdGUnOiB7IGxhYmVsOiAnQXV0aG9yIHN0YWtlaG9sZGVyIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgc2NoZWR1bGUgYW5kIGRyYWZ0IHNjaGVkdWxlZCByZXBvcnRzIGZvciBtYW5hZ2VycycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdyZXBvcnRzOnB1Ymxpc2gnOiB7IGxhYmVsOiAnUHVibGlzaCByZXBvcnRzIGV4dGVybmFsbHknLCBkZXNjcmlwdGlvbjogJ1B1Ymxpc2ggYSByZXBvcnQgYW5kIG1pbnQgZXhwaXJpbmcgc2hhcmUgbGlua3MgZm9yIHBlb3BsZSBvdXRzaWRlIHRoZSBwbGF0Zm9ybScsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gICdtZXNzYWdlczpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgJ21lc3NhZ2VzOndyaXRlJzogeyBsYWJlbDogJ1NlbmQgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1NlbmQgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgJ2JpbGxpbmc6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgc3Vic2NyaXB0aW9ucyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gICdiaWxsaW5nOm1hbmFnZSc6IHsgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gICdxdW90YXM6cmVhZCc6IHsgbGFiZWw6ICdWaWV3IHF1b3RhcycsIGRlc2NyaXB0aW9uOiAnVmlldyBvcmdhbml6YXRpb24gcXVvdGFzIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgLy8gUmVnaXN0cnkuIFRocmVlIHJ1bmdzLCBiZWNhdXNlIHRoZSB3cml0ZSBoYWxmIGhhcyB0d28gdmVyeSBkaWZmZXJlbnRcbiAgLy8gYmxhc3QgcmFkaWk6IGB3cml0ZWAgQ09QSUVTIGEgbWFuaWZlc3QgKGFkZGl0aXZlIOKAlCBpdCBjcmVhdGVzIGEgdGFnLFxuICAvLyBub3RoaW5nIHN0b3BzIHJlc29sdmluZyksIGBwdXJnZWAgREVMRVRFUyBvbmUgKGEgdGVuYW50J3MgcGlwZWxpbmUgb3IgYVxuICAvLyBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZSBjYW4gc3RvcCByZXNvbHZpbmcsIHdpdGggbm8gdW5kbykuXG4gICdyZWdpc3RyeTpyZWFkJzogeyBsYWJlbDogJ1ZpZXcgcmVnaXN0cnknLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gICdyZWdpc3RyeTp3cml0ZSc6IHsgbGFiZWw6ICdDb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0NvcHkgYW5kIHByb21vdGUgYSBjb250YWluZXIgaW1hZ2UgaW50byBhbm90aGVyIHJlcG9zaXRvcnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICAncmVnaXN0cnk6cHVyZ2UnOiB7IGxhYmVsOiAnRGVsZXRlIGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0RlbGV0ZSBpbWFnZXMgYW5kIHJlcG9zaXRvcmllcywgYW5kIHJ1biByZWdpc3RyeSBnYXJiYWdlIGNvbGxlY3Rpb24nLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgJ2ltcGVyc29uYXRpb246b3Blbic6IHsgbGFiZWw6ICdPcGVuIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbicsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBjdXN0b21lcidzIGFjY291bnQgYXMgb25lIG9mIGl0cyB1c2Vycywgd2l0aCB0aGF0IG9yZ2FuaXphdGlvbidzIGNvbnNlbnRcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJzogeyBsYWJlbDogJ0Fuc3dlciBpbXBlcnNvbmF0aW9uIHJlcXVlc3RzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIG9yIGRlbnkgYSByZXF1ZXN0IHRvIHZpZXcgYSBtZW1iZXIgb2YgdGhpcyBvcmdhbml6YXRpb24gYXMgdGhhdCBtZW1iZXInLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gICd0ZWFtX2FjY2VzczpvcGVuJzogeyBsYWJlbDogXCJWaWV3IGEgdGVhbSBtZW1iZXIncyBhY2NvdW50XCIsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBtZW1iZXIgb2Ygb25lIG9mIHRoaXMgb3JnYW5pemF0aW9uJ3MgdGVhbXMgYXMgdGhhdCBtZW1iZXIgKHJlYWQtb25seSlcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuIEZvdXIgUkVTT1VSQ0VTLCBlYWNoIHdpdGggdGhlIGA6d3JpdGVgIGFjdGlvbiwgcmF0aGVyXG4gIC8vIHRoYW4gb25lIGBvcmdgIHJlc291cmNlIHdpdGggZm91ciBub3VuLXNoYXBlZCBhY3Rpb25zIOKAlCB0aGVzZSBhcmUgdGhlIG9yZydzXG4gIC8vIG93biBjb25maWd1cmF0aW9uIHN0YXRlLCB3aGljaCBpcyB3aGF0IGA6d3JpdGVgIG1lYW5zIGhlcmUgKGA6bWFuYWdlYCBpc1xuICAvLyByZXNlcnZlZCBmb3IgYWRtaW5pc3RlcmluZyBhIGNvbGxlY3Rpb24gb2Ygb3RoZXIgZW50aXRpZXM6IG1lbWJlcnMsIHJvbGVzLFxuICAvLyBpbnZpdGF0aW9ucywgc2VydmljZSBhY2NvdW50cywgYmlsbGluZykuXG4gIC8vXG4gIC8vICAtIGBvcmdfc2V0dGluZ3M6d3JpdGVgICAgICAg4oCUIGdlbmVyYWwgb3JnIHNldHRpbmdzICsgQUkgY29uZmlnLlxuICAvLyAgLSBgb3JnX2lkcDp3cml0ZWAgICAgICAgICAgIOKAlCBTU08gLyBJZFAgY29uZmlndXJhdGlvbiAoc2Vuc2l0aXZlOiBjb250cm9scyBsb2dpbikuXG4gIC8vICAtIGBvcmdfa21zOndyaXRlYCAgICAgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vuc2l0aXZlOiBjb250cm9scyBlbmNyeXB0aW9uIG9mIG9yZyBkYXRhKS5cbiAgLy8gIC0gYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCDigJQgdGhlIGltcGVyc29uYXRpb24gcG9saWN5IChzZW5zaXRpdmU6IGNvbnRyb2xzXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gbWF5IFZJRVcgdGhlIG9yZydzIGRhdGEgYXMgYSBtZW1iZXIpLlxuICAvL1xuICAvLyBUaGUgbGFzdCB0aHJlZSB3ZXJlIHNwbGl0IE9VVCBvZiBgb3JnX3NldHRpbmdzOndyaXRlYCBzbyBhIGN1c3RvbSByb2xlIGNhblxuICAvLyBncmFudCBnZW5lcmFsIHNldHRpbmdzIFdJVEhPVVQgdGhlIHNlbnNpdGl2ZSBzdXJmYWNlcyDigJQgYSBcInNldHRpbmdzIG1hbmFnZXJcIlxuICAvLyByb2xlIGZvciBvcmcgbmFtZSBvciBBSSBwcm92aWRlciBtdXN0IG5vdCBhbHNvIGJlIGFibGUgdG8gc3dpdGNoIHRoZSBvcmcgdG9cbiAgLy8gYG9wZW5gLiBBbGwgcmVtYWluIG9yZy1hc3NpZ25hYmxlIGFuZCBhcmUgc2VlZGVkIGludG8gdGhlIGFkbWluL293bmVyXG4gIC8vIGJ1bmRsZXMgKHZpYSBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUykgc28gZXhpc3RpbmcgYWRtaW5zIGtlZXAgZnVsbFxuICAvLyBhY2Nlc3MuXG4gICdvcmdfc2V0dGluZ3M6d3JpdGUnOiB7IGxhYmVsOiAnT3JnYW5pemF0aW9uIHNldHRpbmdzJywgZGVzY3JpcHRpb246ICdNYW5hZ2UgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgYW5kIEFJIGNvbmZpZycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICAnb3JnX2lkcDp3cml0ZSc6IHsgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgJ29yZ19rbXM6d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGVuY3J5cHRpb24ga2V5cycsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb24ga2V5cycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnOiB7IGxhYmVsOiAnTWFuYWdlIGltcGVyc29uYXRpb24gcG9saWN5JywgZGVzY3JpcHRpb246ICdDb250cm9sIHdoZXRoZXIgcGxhdGZvcm0gb3BlcmF0b3JzIG1heSB2aWV3IHRoZSBvcmdhbml6YXRpb24gYXMgb25lIG9mIGl0cyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG59IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCB7IGxhYmVsOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfT47XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlMgPSBPYmplY3Qua2V5cyhQRVJNSVNTSU9OX0RFRlMpIGFzIHJlYWRvbmx5IFBlcm1pc3Npb25bXTtcblxuLyoqIFRoZSBwZXJtaXNzaW9uIGNhdGFsb2cgd2l0aCBkaXNwbGF5IG1ldGFkYXRhLCBpbiBwaWNrZXIgb3JkZXIuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9DQVRBTE9HOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdID0gQUxMX1BFUk1JU1NJT05TLm1hcCgoaWQpID0+ICh7IGlkLCAuLi5QRVJNSVNTSU9OX0RFRlNbaWRdIH0pKTtcblxuLyoqIEh1bWFuIGxhYmVsIGZvciBhIHBlcm1pc3Npb24gaWQgKGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBpZCBmb3IgYW4gdW5rbm93biBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25MYWJlbChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzVmFsaWRQZXJtaXNzaW9uKGlkKSA/IFBFUk1JU1NJT05fREVGU1tpZF0ubGFiZWwgOiBpZDtcbn1cblxuLyoqIE9uZSBwaWNrZXIgc2VjdGlvbjogYSBjYXRlZ29yeSBhbmQgdGhlIHBlcm1pc3Npb25zIGl0IGNvbnRhaW5zLCBpbiBjYXRhbG9nIG9yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogUGVybWlzc2lvbk1ldGFbXTtcbn1cblxuLyoqIEdyb3VwIGEgcGVybWlzc2lvbiBsaXN0IGludG8gY2F0ZWdvcmllcywgcHJlc2VydmluZyBjYXRhbG9nIG9yZGVyLiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUNhdGVnb3J5KHBlcm1zOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdKTogUGVybWlzc2lvbkNhdGVnb3J5W10ge1xuICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8c3RyaW5nLCBQZXJtaXNzaW9uTWV0YVtdPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcGVybXMpIHtcbiAgICBpZiAoIWJ5Q2F0ZWdvcnkuaGFzKHAuY2F0ZWdvcnkpKSB7IGJ5Q2F0ZWdvcnkuc2V0KHAuY2F0ZWdvcnksIFtdKTsgb3JkZXIucHVzaChwLmNhdGVnb3J5KTsgfVxuICAgIGJ5Q2F0ZWdvcnkuZ2V0KHAuY2F0ZWdvcnkpIS5wdXNoKHApO1xuICB9XG4gIHJldHVybiBvcmRlci5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeSwgcGVybWlzc2lvbnM6IGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSEgfSkpO1xufVxuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFBlcm1pc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBlcm1pc3Npb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFBlcm1pc3Npb24ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFBFUk1JU1NJT05fREVGUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgbXVzdCBORVZFUiBiZSBncmFudGFibGUgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgQ1VTVE9NIFJvbGUg4oCUXG4gKiB0aGV5IGdhdGUgcGxhdGZvcm0tb3BlcmF0b3Igc3VyZmFjZXMgKHRoZSBzaGFyZWQgaW1hZ2UgcmVnaXN0cnkpLCBzbyBhbGxvd2luZ1xuICogYW4gb3JnIGFkbWluIHRvIG1pbnQgYSBSb2xlIGNhcnJ5aW5nIHRoZW0gd291bGQgYmUgYSBsYXRlbnQgcHJpdmlsZWdlXG4gKiBlc2NhbGF0aW9uLiBUaGV5IGFyZSBOT1Qgc2VlZGVkIGludG8gQU5ZIGJ1aWx0LWluIFJvbGUgYnVuZGxlIChuZWl0aGVyXG4gKiBgbWVtYmVyYCBub3IgYGFkbWluYCksIHNvIHRoZSBvbmx5IGhvbGRlciBpcyBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCkg4oCUXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBpbWFnZS1yZWdpc3RyeSBnYXRlcyB0aGF0IHJlcXVpcmUgdGhlbSBlZmZlY3RpdmVseVxuICogc3VwZXJhZG1pbi1vbmx5LiBUaGlzIGxpc3QgQUxTTyBibG9ja3MgY3VzdG9tLVJvbGUgYXV0aG9yaW5nIGZyb20gcmVxdWVzdGluZ1xuICogdGhlbSAoc2VlIHBsYXRmb3JtIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gYHJlZ2lzdHJ5OnJlYWRgIGFuZCBgcmVnaXN0cnk6d3JpdGVgIHdlcmUgYm90aCBoZXJlLiBXaGF0IHN0YXlzIGlzIHRoZVxuICAvLyBkZXN0cnVjdGl2ZSBydW5nIGFsb25lOiBkZWxldGluZyBhIG1hbmlmZXN0IG9yIGEgd2hvbGUgcmVwb3NpdG9yeSwgYW5kIHRoZVxuICAvLyBHQyBwcnVuZSwgZWFjaCBvZiB3aGljaCBjYW4gcmVtb3ZlIGFuIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgc3RpbGxcbiAgLy8gcmVzb2x2ZXMg4oCUIGluY2x1ZGluZyB0aGUgZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2VzIHRoZSBzdXBwbHkgY2hhaW5cbiAgLy8gdmVyaWZpZXMgYWdhaW5zdC4gVGhhdCBpcyB0aGUgb25lIHJlZ2lzdHJ5IGFjdGlvbiB3aXRoIG5vIHVuZG8sIHNvIGl0IGtlZXBzXG4gIC8vIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgYXVkaWVuY2U6IHRoZSBmbGFnLCBhbmQgbmV2ZXIgYSBSb2xlLlxuICAncmVnaXN0cnk6cHVyZ2UnLFxuXTtcblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IGdvdmVybiB0aGUgUExVR0lOIEVDT1NZU1RFTSBhbmQgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gTGlrZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gdGhleSBhcmUgaW4gbm8gbWVtYmVyL2FkbWluL293bmVyIGJ1bmRsZSxcbiAqIGFuZCBubyBSb2xlIGF1dGhvcmVkIGluIGEgVEVOQU5UIG1heSBjYXJyeSBvbmU6IHBsYXRmb3JtJ3NcbiAqIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBhZG1pdHMgdGhlbSBvbmx5IHdoZW4gdGhlIGF1dGhvciBpcyBhIHN1cGVyYWRtaW4gQU5EXG4gKiB0aGUgUm9sZSBpcyBiZWluZyB3cml0dGVuIGluIHRoZSBzeXN0ZW0gb3JnIGl0c2VsZiAoYG1heUNvbXBvc2VTeXN0ZW1PcmdSb2xlYCkuXG4gKlxuICogU28gdGhlcmUgYXJlIHRocmVlIGdyYW50IHBhdGhzLCBub3Qgb25lOiBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCksIG9uZSBvZlxuICogdGhlIHNlZWRlZCBzeXN0ZW0tb3JnIFJvbGVzLCBhbmQgYSBDVVNUT00gc3lzdGVtLW9yZyBSb2xlIGEgc3VwZXJhZG1pblxuICogY29tcG9zZWQuIFRoZSB0aGlyZCBpcyB3aGF0IG1ha2VzIHRoZSBzcGxpdCBiZXR3ZWVuIGBwbHVnaW5zOm1vZGVyYXRlYCBhbmRcbiAqIGBwdWJsaXNoZXJzOnZlcmlmeWAgdXNhYmxlIHdpdGhvdXQgd2FpdGluZyBmb3IgYSBuZXcgc2VlZCBidW5kbGUg4oCUIHdvcnRoXG4gKiBrbm93aW5nIGJlZm9yZSByZWFkaW5nIGVpdGhlciBwZXJtaXNzaW9uIGFzIFwidW5yZWFjaGFibGUgZXhjZXB0IHZpYVxuICoge0BsaW5rIEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TfVwiLlxuICpcbiAqIGBvbmNhbGw6bWFuYWdlYCBpcyBjYXJyaWVkIGJ5ICoqUGxhdGZvcm0gT3BlcmF0b3IqKiBhbmQgYnkgbm8gb3RoZXIgbmFtZWRcbiAqIHJvbGUuIFRoYXQgc3BsaXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQ6IHBhZ2luZyBpcyB0aGVcbiAqIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIGVjb3N5c3RlbVxuICogbW9kZXJhdGlvbiwgc28gd2lkZW5pbmcgdGhlIEVjb3N5c3RlbSBNYW5hZ2VyIHJvbGUgdG8gY2FycnkgaXQgd291bGQgaGFuZCB0aGVcbiAqIHBhZ2VyIHRvIHBlb3BsZSBoaXJlZCB0byByZXZpZXcgcGx1Z2lucy4gSXQgaXMgbm90IGEgcGxhY2Vob2xkZXIg4oCUIGl0IGdhdGVzXG4gKiB0d28gbGl2ZSByb3V0ZXMgKHRoZSBwYWdpbmcgcG9zdHVyZSByZWFkIGFuZCB0aGUgdGVzdCBwYWdlKSwgdW5saWtlXG4gKiBgcmVnaXN0cnk6KmAuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAvLyBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzLCBzeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGVcbiAgLy8gY29uc29sZXMgYXJlOiB0aGV5IHJlYWQgYW5kIG1vdmUgdGhpbmdzIGJlbG9uZ2luZyB0byBvcmdhbmlzYXRpb25zIHRoZVxuICAvLyBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mLCBzbyB0aGV5IG11c3QgbmV2ZXIgYmUgZ3JhbnRhYmxlIGluc2lkZSBhIHRlbmFudC5cbiAgJ3BsYXRmb3JtOnJlYWQnLFxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyB0aGUgaW1hZ2UgcmVnaXN0cnk6IHJlcG9zaXRvcnkgbmFtZXMsIHRhZ3MsIG1hbmlmZXN0cywgYmxvYnMgYW5kIHRoZVxuICAvLyBzdG9yYWdlIHJvbGx1cC4gUHJvbW90ZWQgb3V0IG9mIFNVUEVSQURNSU5fT05MWSBiZWNhdXNlIHRoZSByZWdpc3RyeSBicm93c2VyXG4gIC8vIHdhcyBpbnZpc2libGUgdG8gZXZlcnkgUm9sZSwgc28gYSBQbGF0Zm9ybSBPcGVyYXRvciBkZWJ1Z2dpbmcgYSBmYWlsZWRcbiAgLy8gcGx1Z2luIGJ1aWxkIGNvdWxkIHNlZSB0aGUgYnVpbGQgcXVldWUgYW5kIGl0cyBkZWFkIGxldHRlcnMgYnV0IG5vdCB0aGVcbiAgLy8gaW1hZ2VzIHRoZSBidWlsZCBwcm9kdWNlZCDigJQgYW5kIHRoZSBvbmx5IHdheSB0byBsb29rIHdhcyB0aGUgc3VwZXJhZG1pblxuICAvLyBmbGFnLiBJdCBzdGF5cyBzeXN0ZW0tb3JnLW9ubHkgKG5vIHRlbmFudCBSb2xlIG1heSBjYXJyeSBpdCkgYW5kIGlzIHBhaXJlZFxuICAvLyB3aXRoIGEgcGVyLXJlcG8gb3JnLW93bmVyc2hpcCBmaWx0ZXIgdGhhdCBydW5zIEFGVEVSIGl0LCBzbyB3aWRlbmluZyB0aGVcbiAgLy8gcGVybWlzc2lvbiBkb2VzIG5vdCB3aWRlbiB3aGljaCByZXBvc2l0b3JpZXMgYSBob2xkZXIgY2FuIHJlYWNoOiBhXG4gIC8vIHN5c3RlbS1vcmcgbWVtYmVyIHdobyBpcyBub3QgYSBzdXBlcmFkbWluIHNlZXMgYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kXG4gIC8vIGBwdWJsaWMvKmAg4oCUIHRoaXMgZGVwbG95bWVudCdzIG93biBiYXNlIGFuZCBwbHVnaW4gaW1hZ2VzIOKAlCBhbmQgbm8gdGVuYW50J3NcbiAgLy8gYG9yZy0qYCByZXBvc2l0b3JpZXMgYXQgYWxsIChgY2FuUmVhZFJlcG9gIGluIHRoZSBpbWFnZS1yZWdpc3RyeSBzZXJ2aWNlKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuICAvLyBDb3B5aW5nL3Byb21vdGluZyBhbiBpbWFnZS4gU3lzdGVtLW9yZy1vbmx5IHJhdGhlciB0aGFuIHN1cGVyYWRtaW4tb25seVxuICAvLyBiZWNhdXNlIGl0IGlzIEFERElUSVZFOiBpdCB3cml0ZXMgYSBuZXcgdGFnIGFuZCBtYWtlcyBub3RoaW5nIHN0b3BcbiAgLy8gcmVzb2x2aW5nLCBhbmQgYGNhbldyaXRlUmVwb2AgY29uZmluZXMgYSBub24tc3VwZXJhZG1pbiBzeXN0ZW0tb3JnIGNhbGxlclxuICAvLyB0byBgc3lzdGVtLypgIHJlZ2FyZGxlc3MuIERlbGliZXJhdGVseSBjYXJyaWVkIGJ5IE5PIGJ1aWx0LWluIGJ1bmRsZSB0b2RheVxuICAvLyDigJQgcHJvbW90aW5nIGFuIGltYWdlIGlzIGEgam9iLCBub3QgYSBzaWRlIGVmZmVjdCBvZiBydW5uaW5nIHRoZSBkZXBsb3ltZW50LFxuICAvLyBzbyBpdCB3YWl0cyBmb3IgYSBSb2xlIG9mIGl0cyBvd24gcmF0aGVyIHRoYW4gcmlkaW5nIGFsb25nIHdpdGhcbiAgLy8gYHBsYXRmb3JtOnJlYWRgLlxuICAncmVnaXN0cnk6d3JpdGUnLFxuICAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBPcGVuaW5nIGEgY3Jvc3MtdGVuYW50IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gU3lzdGVtLW9yZy1vbmx5IGZvciB0aGVcbiAgLy8gb2J2aW91cyByZWFzb24g4oCUIGl0IHZpZXdzIGFuIG9yZ2FuaXNhdGlvbiB0aGUgaG9sZGVyIGlzIG5vdCBhIG1lbWJlciBvZiDigJRcbiAgLy8gYW5kIGl0IGlzIHRoZSBPTkUgcGVybWlzc2lvbiBpbiB0aGlzIGxpc3QgdGhhdCBhbHNvIGhhcyB0byBjbGVhciBhIGdhdGUgdGhlXG4gIC8vIHBlcm1pc3Npb24gc3lzdGVtIGRvZXMgbm90IG93bjogdGhlIHRhcmdldCBvcmdhbmlzYXRpb24ncyBjb25zZW50IChpdHNcbiAgLy8gYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCBwb2xpY3kpLCBwbHVzIGFhbDIgYW5kIGEgc3Ryb25nIHN0ZXAtdXAuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHNheXMgd2hvIG1heSBBU0s7IHRoZSB0ZW5hbnQgc3RpbGwgYW5zd2Vycy5cbiAgLy9cbiAgLy8gSXQgZG9lcyBOT1QgY292ZXIgZW1lcmdlbmN5IGFjY2Vzcy4gYFBPU1QgLzp1c2VySWQvYnJlYWtnbGFzc2AgYnlwYXNzZXNcbiAgLy8gdGVuYW50IGNvbnNlbnQgYW5kIHNvIHN0YXlzIG9uIHRoZSBzdXBlcmFkbWluIGZsYWcgYWxvbmUsIGFwcHJvdmVkIGJ5IGFcbiAgLy8gU0VDT05EIHN1cGVyYWRtaW4gKGZvdXItZXllcykuIEEgcGVybWlzc2lvbiB0aGF0IGNvdWxkIGJlIGRlbGVnYXRlZCBtdXN0IG5vdFxuICAvLyBiZSBhYmxlIHRvIHdhbGsgcGFzdCBjb25zZW50LlxuICAnaW1wZXJzb25hdGlvbjpvcGVuJyxcbiAgLy8gUGFnaW5nIGlzIHRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgY29uY2VybiBhbmQgZ3JhbnRzIE5PIHRlbmFudCBhY2Nlc3NcbiAgLy8g4oCUIGBpc1N5c3RlbU9yZ0lkYCBpcyBhIGNvbnRlbnQtb3duZXIgY2hlY2ssIG5vdCBhIHByaXZpbGVnZSBnYXRlIOKAlCBzbyBhXG4gIC8vIHRlbmFudCByb2xlIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjYXJyeSBpdCwgYW5kIGEgdGVuYW50IG11c3QgbmV2ZXIgYmUgYWJsZVxuICAvLyB0byBtYWtlIHRoaXMgZGVwbG95bWVudCBzZW5kIGEgcGFnZS5cbiAgJ29uY2FsbDptYW5hZ2UnLFxuICAvLyBUaGUgdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIHRhc2tzLiBFYWNoIG9uZSByZXBsYWNlZCBhIGByZXF1aXJlU3lzdGVtQWRtaW5gXG4gIC8vIGdhdGUsIHNvIHRoZSBwb2ludCBvZiBsaXN0aW5nIHRoZW0gaGVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnQgb2YgYWRkaW5nXG4gIC8vIHRoZW0gYXQgYWxsOiBhIFJvbGUgY29tcG9zZWQgaW4gdGhlIHN5c3RlbSBvcmcgY2FuIGNhcnJ5IGV4YWN0bHkgb25lIGpvYixcbiAgLy8gYW5kIG5vIFJvbGUgaW4gYW55IHRlbmFudCBjYW4gY2FycnkgaXQgYXQgYWxsLlxuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsXG4gICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJyxcbiAgJ3F1b3RhczptYW5hZ2UnLFxuICAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gIC8vIFRoZSBUb29sY2hhaW4gY29uc29sZSAocGxhbiBEOSk6IFRIRSBwbGF0Zm9ybSBkZWZhdWx0IGFuZCBjYW5hcnkgbW92ZSB0aGVcbiAgLy8gYnVpbGQgdG9vbGNoYWluIG9mIGV2ZXJ5IG9yZyB0aGF0IGZvbGxvd3MgaXQsIHNvIG5vIHRlbmFudCBtYXkgaG9sZCBpdC5cbiAgJ3Rvb2xjaGFpbjpvcGVyYXRlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gVGhlIFRvb2xjaGFpbiBjb25zb2xlIChwbGFuIEQ5KTogY2FuYXJ5LCBwcm9tb3Rpb24sIHJvbGxiYWNrIGFuZCByZWxlYXNlXG4gIC8vIGxpZmVjeWNsZSBvZiB0aGUgbWFuYWdlZCBidWlsZCB0b29sY2hhaW4g4oCUIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gICd0b29sY2hhaW46b3BlcmF0ZScsXG4gIC8vIFJlYWRzIHRoYXQgbWFrZSB0aGUgb3BlcmF0b3Igdmlld3MgdXNhYmxlOiB0aGUgZGFzaGJvYXJkcyB0aGUgcG9zdHVyZSBwYW5lbHNcbiAgLy8gbGl2ZSBvbiwgdGhlIGNyb3NzLXRlbmFudCBsb2cgdmlldywgYW5kIHRoZSBjdXN0b21lcidzIHBsYW4gd2hlbiBhIGxpbWl0IGlzXG4gIC8vIHRoZSB0aGluZyBiZWluZyBkZWJ1Z2dlZC5cbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgLy8gVGhlIHJlZ2lzdHJ5IGJyb3dzZXI6IHJlcG9zaXRvcnkgbmFtZXMsIHRhZ3MgYW5kIG1hbmlmZXN0cyBmb3IgdGhlIGltYWdlc1xuICAvLyB0aGlzIGRlcGxveW1lbnQncyBidWlsZHMgcHJvZHVjZS4gSXQgd2FzIHdpdGhoZWxkIHdoaWxlIGByZWdpc3RyeTpyZWFkYCB3YXNcbiAgLy8gc3VwZXJhZG1pbi1vbmx5IOKAlCBhIHNlZWRlZCBidW5kbGUgY2FycnlpbmcgYSBzdXBlcmFkbWluLW9ubHkgcGVybWlzc2lvblxuICAvLyB3b3VsZCBtYWtlIHRoYXQgbGlzdCBhIGxpZSwgc2luY2UgYnVuZGxlcyBieXBhc3MgYHNhbml0aXplUGVybWlzc2lvbnNgLiBUaGVcbiAgLy8gcGVybWlzc2lvbiB3YXMgcHJvbW90ZWQgdG8gc3lzdGVtLW9yZy1vbmx5IGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBzbXVnZ2xlZFxuICAvLyBpbiBoZXJlLCB3aGljaCBpcyB0aGUgb3JkZXIgdGhvc2UgdHdvIGNoYW5nZXMgaGF2ZSB0byBoYXBwZW4gaW4uXG4gICdyZWdpc3RyeTpyZWFkJyxcbl07XG5cbi8qKlxuICogQUNDT1VOVCBNQU5BR0VSIOKAlCB0aGUgY29tbWVyY2lhbCByZWxhdGlvbnNoaXAgd2l0aCBhIGN1c3RvbWVyLCBhcyBvcHBvc2VkIHRvXG4gKiBydW5uaW5nIHRoZSBkZXBsb3ltZW50LlxuICpcbiAqIFNwbGl0IGZyb20ge0BsaW5rIFBMQVRGT1JNX09QRVJBVE9SX1BFUk1JU1NJT05TfSByYXRoZXIgdGhhbiBwaWxlZCBvbnRvIGl0LFxuICogYmVjYXVzZSB0aGUgdHdvIGpvYnMgZGl2ZXJnZSBhdCBleGFjdGx5IHRoZSBwZXJtaXNzaW9ucyBhZGRlZCBhbG9uZ3NpZGUgdGhpc1xuICogYnVuZGxlLiBgYmlsbGluZzpvcGVyYXRlYCBNT1ZFRCBoZXJlIGZyb20gdGhlIG9wZXJhdG9yIGJ1bmRsZSBmb3IgdGhhdCByZWFzb246XG4gKiBtaW50aW5nIGEgZGlzY291bnQgdG9rZW4gaXMgYSBjb21tZXJjaWFsIGFjdCwgbm90IGFuIG9wZXJhdGlvbmFsIG9uZSwgYW5kIHRoZVxuICogcGVyc29uIHdobyByZXN0YXJ0cyBhIHN0dWNrIGJ1aWxkIHF1ZXVlIGhhcyBubyByZWFzb24gdG8gaG9sZCBpdC5cbiAqXG4gKiBUaGUgZGVzdHJ1Y3RpdmUgaGFsZiBvZiB0aGUgY2F0YWxvZ3VlIGxpdmVzIGhlcmUg4oCUIGBvcmdzOm1hbmFnZWAgY2FuIERFTEVURVxuICogYW4gb3JnYW5pc2F0aW9uIGFuZCBgc3Vic2NyaXB0aW9uczptYW5hZ2VgIGNhbiBjYW5jZWwgaXRzIHN1YnNjcmlwdGlvbiDigJQgc29cbiAqIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IHRoZSBzbWFsbGVyLCBtb3JlIHJhcmVseS1hc3NpZ25lZCBvZiB0aGUgdHdvLlxuICovXG5leHBvcnQgY29uc3QgQUNDT1VOVF9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAnYmlsbGluZzpvcGVyYXRlJyxcbiAgLy8gQSBxdW90YSBidW1wIGlzIGFzIG9mdGVuIGEgY29tbWVyY2lhbCBjb25jZXNzaW9uIGFzIGFuIG9wZXJhdGlvbmFsIG9uZSwgc29cbiAgLy8gYm90aCBidW5kbGVzIGNhcnJ5IGl0LlxuICAncXVvdGFzOm1hbmFnZScsXG4gIC8vIFRoZSBhbGwtb3JnYW5pemF0aW9ucyBsaXN0LCB3aGljaCBpcyB0aGUgc3VyZmFjZSB0aGlzIGpvYiB3b3JrcyBmcm9tIOKAlCBhbmRcbiAgLy8gb25seSB0aGF0LiBJdCB1c2VkIHRvIHRha2UgYHBsYXRmb3JtOnJlYWRgLCB3aGljaCBhbHNvIGhhbmRlZCBvdmVyIHRoZVxuICAvLyBkZXBsb3kncyBSTFMgbW9kZSwgS01TIHBvc3R1cmUgYW5kIHJlbmRlcmVkIGFsZXJ0IHJ1bGVzOiBpbnRlcm5hbHMgYVxuICAvLyBjb21tZXJjaWFsIHJvbGUgaGFzIG5vIHVzZSBmb3IuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBDT05TT0xFIEFETUlOSVNUUkFUT1Ig4oCUIHRoZSBvcGVyYXRvciBjb25zb2xlcywgYXMgYSBSb2xlLlxuICpcbiAqIFdIWSBUSElTIEVYSVNUUyBldmVuIHRob3VnaCBlYWNoIGNvbnNvbGUgcGVybWlzc2lvbiBpcyBncmFudGFibGUgYnkgaGFuZDogd2l0aFxuICogbm8gc2VlZGVkIFJvbGUsIHRoZSBvbmx5IHBhdGggdG8gcGdBZG1pbiB3YXMgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIGN1c3RvbVxuICogUm9sZSBmb3IgaXQsIGFuZCB0aGUgb2JzZXJ2ZWQgb3V0Y29tZSBvZiBhc2tpbmcgcGVvcGxlIHRvIGRvIHRoYXQgaXMgdGhhdCB0aGV5XG4gKiByZWFjaCBmb3IgdGhlIHN1cGVyYWRtaW4gRkxBRyBpbnN0ZWFkIOKAlCB0aGUgZXhhY3QgZmFpbHVyZSB0aGVzZSBwZXJtaXNzaW9uc1xuICogd2VyZSBhZGRlZCB0byByZW1vdmUuIEEgbmFtZWQgUm9sZSBhbHNvIG1ha2VzIFwid2hvIGNhbiBvcGVuIGEgZGF0YSBzaGVsbD9cIiBvbmVcbiAqIHF1ZXJ5IGluc3RlYWQgb2YgYW4gYXVkaXQgb2YgZXZlcnkgY3VzdG9tIFJvbGUuXG4gKlxuICogSXQgY2FycmllcyBhbGwgdGhyZWUgY29uc29sZXMsIHdoaWNoIGlzIHRoZSB3aG9sZSBqb2IgZm9yIHRoZSBwZXJzb24gd2hvIGhvbGRzXG4gKiBpdC4gT05FIENPTlNFUVVFTkNFIFdPUlRIIEtOT1dJTkc6IGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGFuZFxuICogYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAgYXJlIHRoZSB0d28gaGFsdmVzIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2VcbiAqIGRlc2lnbiDigJQgYSBNb25nbyBzaGVsbCBjYW4gdHJ1bmNhdGUgYSBoYXNoIGNoYWluJ3MgdGFpbCwgYW5kIHRoZSBvYmplY3Qgc3RvcmVcbiAqIGhvbGRzIHRoZSBzaWduZWQgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24g4oCUIHNvIGEgaG9sZGVyIG9mIHRoaXNcbiAqIFJvbGUgY2FuIGRvIGJvdGguIFRoZSBwZXJtaXNzaW9ucyBzdGF5IFNFUEFSQVRFIGZvciBleGFjdGx5IHRoYXQgcmVhc29uOiBhXG4gKiBkZXBsb3ltZW50IHRoYXQgd2FudHMgdGhlbSBoZWxkIGJ5IGRpZmZlcmVudCBwZW9wbGUgY29tcG9zZXMgYSBuYXJyb3dlciBSb2xlXG4gKiBieSBoYW5kIChhIHN1cGVyYWRtaW4gbWF5IGluY2x1ZGUgYW55IHN5c3RlbS1vcmctb25seSBwZXJtaXNzaW9uIGluIGEgUm9sZVxuICogYXV0aG9yZWQgaW4gdGhlIHN5c3RlbSBvcmcpIGFuZCBhc3NpZ25zIHRoaXMgb25lIHRvIG5vYm9keS5cbiAqL1xuLyoqXG4gKiBQTEFURk9STSBPQlNFUlZFUiDigJQgbG9vaywgZG9uJ3QgdG91Y2guIFRoZSBsYWRkZXIncyBtaXNzaW5nIGJvdHRvbSBydW5nLlxuICpcbiAqIEV2ZXJ5IG90aGVyIHN5c3RlbS1vcmcgYnVuZGxlIGdyYW50cyBhIHdyaXRlLiBUaGUgb25lIHRoYXQgZG9lcyBub3Qg4oCUXG4gKiBDb25zb2xlIEFkbWluaXN0cmF0b3Ig4oCUIGdyYW50cyBhIHJlYWQgdGhhdCBJUyBhIGRhdGFiYXNlIHNoZWxsLiBTbyBzb21lYm9keVxuICogd2hvIHNob3VsZCBzZWUgdGhlIGRlcGxveW1lbnQgYW5kIGNoYW5nZSBub3RoaW5nIChhIG5ldyBvcGVyYXRvciBzaGFkb3dpbmcsIGFuXG4gKiBhdWRpdG9yLCBhbiBvbi1jYWxsIGVuZ2luZWVyIGR1cmluZyBhIGhhbmRvdmVyKSBoYWQgdHdvIG9wdGlvbnM6IFN1cGVyIEFkbWluLFxuICogb3Igbm90aGluZy4gVGhlIHVzdWFsIG91dGNvbWUgb2YgYSBjaG9pY2UgbGlrZSB0aGF0IGlzIHRoZSBmbGFnLlxuICpcbiAqIFN0cmljdGx5IHJlYWQtb25seSBieSBjb25zdHJ1Y3Rpb246IGV2ZXJ5IHBlcm1pc3Npb24gaGVyZSBlbmRzIGA6cmVhZGAsIHdoaWNoXG4gKiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIGNsYXNzaWZpZXMgYXMgYSByZWFkLCBzbyB0aGUgZGFzaGJvYXJkIGRpc2FibGVzIGV2ZXJ5XG4gKiB3cml0ZSBhZmZvcmRhbmNlIGZvciBhIGhvbGRlciByYXRoZXIgdGhhbiBvZmZlcmluZyBjb250cm9scyB0aGF0IDQwMy5cbiAqXG4gKiBOT1QgYGF1ZGl0OnJlYWRgLiBJdCB3b3VsZCBiZSB0aGUgb2J2aW91cyBhZGRpdGlvbiBhbmQgaXQgaXMgdGhlIHdyb25nIG9uZTpcbiAqIGBsaXN0QXVkaXRFdmVudHNgIHBpbnMgZXZlcnkgbm9uLXN1cGVyYWRtaW4gdG8gdGhlaXIgT1dOIG9yZywgc28gYSBzeXN0ZW0tb3JnXG4gKiBvYnNlcnZlciBob2xkaW5nIGl0IHdvdWxkIHNlZSB0aGUgc3lzdGVtIG9yZydzIGF1ZGl0IHRyYWlsIGFuZCBub3RoaW5nIGVsc2Ug4oCUXG4gKiBhbiBhZmZvcmRhbmNlIHRoYXQgbG9va3MgbGlrZSBmbGVldC13aWRlIGF1ZGl0IGFjY2VzcyBhbmQgaXMgbm90LiBSZWFkaW5nXG4gKiBhbm90aGVyIHRlbmFudCdzIHRyYWlsIGlzIGRlbGliZXJhdGVseSB0aGUgZmxhZydzIGFsb25lLlxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fT0JTRVJWRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsYXRmb3JtOnJlYWQnLFxuICAnb3JnczpyZWFkJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgLy8gQSByZWFkLCBhbmQgdGhpcyBSb2xlIGlzIHJlYWRzIOKAlCB0aGUgcmVnaXN0cnkgYnJvd3NlciB3aXRoIG5laXRoZXIgb2YgdGhlXG4gIC8vIHR3byB3cml0ZSBydW5ncyAoYHJlZ2lzdHJ5OndyaXRlYCBjb3BpZXMsIGByZWdpc3RyeTpwdXJnZWAgZGVsZXRlcykuXG4gICdyZWdpc3RyeTpyZWFkJyxcbl07XG5cbmV4cG9ydCBjb25zdCBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsXG4gICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLFxuICAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHNvIGEgaG9sZGVyIGNhbiBmaW5kIHRoZSBvcmcgdGhleSB3ZXJlIGFza2VkXG4gIC8vIGFib3V0IHdpdGhvdXQgYSBzZWNvbmQgUm9sZSDigJQgYW5kIG5vdGhpbmcgbW9yZS4gVGhpcyB3YXMgYHBsYXRmb3JtOnJlYWRgLFxuICAvLyB3aGljaCBtZWFudCBvcGVuaW5nIGEgZGF0YWJhc2UgY29uc29sZSBhbHNvIGdyYW50ZWQgdGhlIGRlcGxveSdzIG93blxuICAvLyBjb25maWd1cmF0aW9uLCBmb3Igbm8gcmVhc29uIGJleW9uZCB0aGUgdHdvIHNoYXJpbmcgYSBnYXRlLlxuICAnb3JnczpyZWFkJyxcbl07XG5cbi8qKlxuICogUkVHSVNUUlkgT1BFUkFUT1Ig4oCUIG1vdmVzIGNvbnRhaW5lciBpbWFnZXMgYXJvdW5kLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIFRIRSBHQVAgSVQgRklMTFMuIFByb21vdGluZyBhbiBpbWFnZSDigJQgY29weWluZyBhIGJ1aWx0IHRhZyBmcm9tIG9uZSByZXBvc2l0b3J5XG4gKiB0byB0aGUgb25lIGEgcmVsZWFzZSByZXNvbHZlcyDigJQgaXMgYSBqb2Igc29tZWJvZHkgZG9lcywgYW5kIHVudGlsIG5vdyB0aGUgb25seVxuICogaWRlbnRpdHkgdGhhdCBjb3VsZCBkbyBpdCB3YXMgYSBzdXBlcmFkbWluLiBgcmVnaXN0cnk6d3JpdGVgIGhhcyBubyBvdGhlclxuICogY2FycmllciwgYW5kIGEgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpc1xuICogc3VwZXJhZG1pbi1vbmx5IGluIHByYWN0aWNlICh0aGUgYHBsYXRmb3JtOnJlYWRgIGZhaWx1cmUsIHBpbm5lZCBieSB0aGVcbiAqIFwiYXQgbGVhc3Qgb25lIHNlZWRlZCBjYXJyaWVyXCIgYXNzZXJ0aW9uIGluIGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2ApLlxuICogU28gc3BsaXR0aW5nIGByZWdpc3RyeTpwdXJnZWAgb3V0IG9mIGByZWdpc3RyeTp3cml0ZWAgaXMgb25seSBoYWxmIHRoZSBjaGFuZ2U6XG4gKiB0aGUgYWRkaXRpdmUgaGFsZiBuZWVkcyBhIFJvbGUgb3IgdGhlIHNwbGl0IGJ1eXMgbm90aGluZy5cbiAqXG4gKiBXSFkgSVQgSVMgTk9UIFBBUlQgT0YgUExBVEZPUk0gT1BFUkFUT1IuIFRoYXQgUm9sZSBydW5zIHRoZSBkZXBsb3ltZW50IGFuZFxuICogYWxyZWFkeSByZWFkcyB0aGUgcmVnaXN0cnkuIFByb21vdGluZyBhbiBpbWFnZSBpcyBhIHJlbGVhc2UgZGVjaXNpb24sIG5vdCBhblxuICogb3BlcmF0aW9uYWwgc2lkZSBlZmZlY3QsIGFuZCByb2xsaW5nIGl0IGludG8gdGhlIFJvbGUgZXZlcnlvbmUgb24gY2FsbCBob2xkc1xuICogd291bGQgbWVhbiB0aGUgcGFnZXIgcm90YXRpb24gY2FuIHJldGFnIGEgcmVsZWFzZSBhdCAzYW0uIFRoZSB0d28gUm9sZXNcbiAqIGNvbXBvc2UgaW5zdGVhZCDigJQgYSBtZW1iZXIgbWF5IGhvbGQgYW55IG51bWJlciwgYW5kIHBlcm1pc3Npb25zIGFyZSB0aGUgdW5pb24uXG4gKlxuICogV0hZIElUIElTIE9OTFkgVFdPIFBFUk1JU1NJT05TLiBEZWxpYmVyYXRlbHkgbm90aGluZyBlbHNlOiBubyBgcGxhdGZvcm06cmVhZGAsXG4gKiBubyBjb25zb2xlLCBubyBgb3JnczpyZWFkYC4gYGNhblJlYWRSZXBvYC9gY2FuV3JpdGVSZXBvYCBjb25maW5lIGFcbiAqIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgaG9sZGVyIHRvIGBzeXN0ZW0vKmAsIGBsaWJyYXJ5LypgIGFuZCBgcHVibGljLypgIOKAlFxuICogdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIHNvIHRoZSBSb2xlIGNhbm5vdCByZWFjaCBhXG4gKiB0ZW5hbnQncyByZXBvc2l0b3JpZXMgYXQgYWxsLCBhbmQgYSBob2xkZXIgd2hvIGFsc28gbmVlZHMgdGhlIG9wZXJhdG9yIHZpZXdzXG4gKiBnZXRzIHRoZSBvcGVyYXRvciBSb2xlIHRvby4gSXQgZG9lcyBOT1QgY2FycnkgYHJlZ2lzdHJ5OnB1cmdlYCwgd2hpY2ggaXMgaW5cbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9IGFuZCBpbiBubyBidW5kbGUgYnkgZGVzaWduOiBhbiBpbWFnZVxuICogcHJvbW90ZXIgaGFzIG5vIGJ1c2luZXNzIGRlbGV0aW5nIHRoZSBpbWFnZSBhIHRlbmFudCdzIHBpcGVsaW5lIHJlc29sdmVzLlxuICovXG5leHBvcnQgY29uc3QgUkVHSVNUUllfT1BFUkFUT1JfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuICAncmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBTVVBQT1JUIEFHRU5UIOKAlCB0aGUgc3VwcG9ydCBkZXNrLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIERlbGliZXJhdGVseSBjYXJyaWVzIG5vIGBwbGF0Zm9ybTpyZWFkYCwgbm8gY29uc29sZSBhbmQgbm8gYmlsbGluZyB3cml0ZTogYW5cbiAqIGFnZW50IGFuc3dlcnMgY2FzZXMgYW5kIHdyaXRlcyB0aGUgY2FubmVkIHJlcGxpZXMuIGBzdWJzY3JpcHRpb25zOnJlYWRgIGlzXG4gKiBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IHF1ZXN0aW9uIG9uIGFueSBjYXNlIGlzIHdoYXQgdGhlIGN1c3RvbWVyIGlzIGVudGl0bGVkXG4gKiB0bywgYW5kIHdpdGhvdXQgaXQgYW4gYWdlbnQgd291bGQgaGF2ZSB0byBhc2sgc29tZW9uZSBlbHNlIHRvIGxvb2suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBORVcsIGFuZCB0aGUgZ2FwIHRoZSBzcGxpdCBleHBvc2VkOiBhbiBhZ2VudCB0cmlhZ2luZyBhIGNhc2UgbmVlZHMgdG8gZmluZFxuICAvLyB0aGUgY3VzdG9tZXIncyBvcmdhbml6YXRpb24uIFRoZSBvbmx5IHBlcm1pc3Npb24gdGhhdCBsaXN0ZWQgb3JncyB3YXNcbiAgLy8gYHBsYXRmb3JtOnJlYWRgLCB3aGljaCB3b3VsZCBhbHNvIGhhdmUgaGFuZGVkIGEgc3VwcG9ydCBhZ2VudCB0aGUgZGVwbG95J3NcbiAgLy8gaW50ZXJuYWxzIOKAlCBzbyB0aGV5IGhhZCBuZWl0aGVyLCBhbmQgaGFkIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAgJ29yZ3M6cmVhZCcsXG4gIC8vIFJlYWRpbmcgYW5kIGFuc3dlcmluZyB0aGUgY2FzZSBpdHNlbGYgcmlkZXMgdGhlIG9yZGluYXJ5IG1lc3NhZ2luZ1xuICAvLyBwZXJtaXNzaW9ucyDigJQgYSBzdXBwb3J0IGNhc2UgSVMgYSBtZXNzYWdlIHRocmVhZC5cbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnbWVzc2FnZXM6d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBTVVBQT1JUIExFQUQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIHBsdXMgdGhlIGF1dGhvcml0eSB0byBsb29rLlxuICpcbiAqIFRIRSBHQVAgSVQgRklMTFMuIGBpbXBlcnNvbmF0aW9uOm9wZW5gIGlzIHN5c3RlbS1vcmctb25seSwgYW5kIGEgc3lzdGVtLW9yZy1vbmx5XG4gKiBwZXJtaXNzaW9uIHdpdGggbm8gc2VlZGVkIGNhcnJpZXIgaXMgc3VwZXJhZG1pbi1vbmx5IGluIHByYWN0aWNlIOKAlCB0aGVcbiAqIGludmFyaWFudCBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgIGFzc2VydHMsIGFuZCB0aGUgcmVhc29uXG4gKiBgcGxhdGZvcm06cmVhZGAgc2hpcHBlZCB1bnVzYWJsZS4gV2l0aG91dCB0aGlzIFJvbGUsIHNwbGl0dGluZyBpbXBlcnNvbmF0aW9uXG4gKiBvdXQgb2YgdGhlIGZsYWcgd291bGQgY2hhbmdlIG5vdGhpbmc6IHRoZSBvbmx5IHdheSB0byBsZXQgc29tZWJvZHkgdmlldyBhXG4gKiBjdXN0b21lcidzIGFjY291bnQgd291bGQgc3RpbGwgYmUgdG8gbWFrZSB0aGVtIGEgZnVsbCBTdXBlciBBZG1pbiwgaGFuZGluZ1xuICogb3ZlciBgL2FkbWluL3VzZXJzLzppZC9ncmFudHNgLCB0aGUgc2luZ2xlLXBlcnNvbiBNRkEgcmVzZXQsIHRoZSBkYXRhYmFzZVxuICogY29uc29sZSBhbmQgYHJlZ2lzdHJ5OnB1cmdlYCBhdCB0aGUgc2FtZSB0aW1lLlxuICpcbiAqIFdIWSBJVCBJUyBUSEUgU1VQUE9SVCBERVNLIEFORCBOT1QgVEhFIE9QRVJBVE9SLiBUaGUgcXVlc3Rpb24gaW1wZXJzb25hdGlvblxuICogYW5zd2VycyBpcyBcIndoYXQgaXMgdGhpcyBjdXN0b21lciBhY3R1YWxseSBzZWVpbmc/XCIsIHdoaWNoIGlzIGEgc3VwcG9ydFxuICogcXVlc3Rpb24uIFBsYXRmb3JtIE9wZXJhdG9yIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kIGlzIGhlbGQgYnkgd2hvZXZlciBpcyBvblxuICogY2FsbDsgYWRkaW5nIHRoaXMgdG8gaXQgd291bGQgaGFuZCBldmVyeSByb3RhIG1lbWJlciB0aGUgYWJpbGl0eSB0byBiZWNvbWUgYW55XG4gKiBjdXN0b21lcidzIHVzZXIgYXQgM2FtLiBTdXBwb3J0IEFnZW50J3MgYnVuZGxlIHBsdXMgdGhlIG9uZSBwZXJtaXNzaW9uIGlzIHRoZVxuICogbmFycm93ZXIsIG1vcmUgaG9uZXN0IHNoYXBlIOKAlCBhbmQgYSBsZWFkIHdobyBhbHNvIHJ1bnMgdGhlIGRlcGxveW1lbnQgaG9sZHNcbiAqIGJvdGggUm9sZXMuXG4gKlxuICogV0hBVCBJVCBTVElMTCBDQU5OT1QgRE8uIEVtZXJnZW5jeSBhY2Nlc3M6IGBicmVha2dsYXNzYCBieXBhc3NlcyB0ZW5hbnRcbiAqIGNvbnNlbnQgYW5kIHN0YXlzIG9uIHRoZSBmbGFnLCBhcHByb3ZlZCBieSBhIHNlY29uZCBTdXBlciBBZG1pbi4gQW5kIHRoZVxuICogdGVuYW50IGNhbiByZWZ1c2Ug4oCUIGBpbXBlcnNvbmF0aW9uOm9wZW5gIGlzIHBlcm1pc3Npb24gdG8gQVNLLlxuICovXG5leHBvcnQgY29uc3QgU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC4uLlNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlMsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuXTtcblxuLyoqXG4gKiBTVEFSVElORyBQT0lOVFMgZm9yIGEgY3VzdG9tIFJvbGUgaW4gYSB0ZW5hbnQgb3JnIOKAlCB0ZW1wbGF0ZXMsIG5vdCBSb2xlcy5cbiAqXG4gKiBUSEUgR0FQIFRIRVkgRklMTC4gQW4gb3JnIHNlZWRzIGV4YWN0bHkgVFdPIFJvbGVzIOKAlCBNZW1iZXIgYW5kIEFkbWluIOKAlCBhbmRcbiAqIEFkbWluIGlzIGV2ZXJ5IG9yZy1hc3NpZ25hYmxlIHBlcm1pc3Npb24uIFNvIHByb21vdGluZyBhbnlvbmUgcGFzdCBcImF1dGhvciBhbmRcbiAqIHJlYWRcIiBoYW5kcyBvdmVyIHRoZSB3aG9sZSByZW1haW5kZXIgYXQgb25jZTogYG9yZ19rbXM6d3JpdGVgLFxuICogYG9yZ19pZHA6d3JpdGVgLCBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgLCBgYmlsbGluZzptYW5hZ2VgLCBgcm9sZXM6bWFuYWdlYFxuICogYW5kIGBhdWRpdDpyZWFkYCBhbW9uZyB0aGVtLiBUaGUgcHJvZHVjdCdzIGFuc3dlciBpcyBcImF1dGhvciBhIGN1c3RvbSBSb2xlXCIsXG4gKiBhbmQgdGhlIHNhZmV0eSBpcyBhbHJlYWR5IHJpZ2h0IChgc2FuaXRpemVQZXJtaXNzaW9uc2AgYm91bmRzIGEgY3VzdG9tIFJvbGUgYnlcbiAqIGl0cyBhdXRob3IncyBvd24gY2VpbGluZykuIFdoYXQgd2FzIG1pc3NpbmcgaXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIFRoZSBleGFjdCBzaXplcyBvZiB0aGF0IGNsaWZmIGFyZSBhc3NlcnRlZCBpbiBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYFxuICogcmF0aGVyIHRoYW4gd3JpdHRlbiBoZXJlLiBUaGlzIHBhcmFncmFwaCB1c2VkIHRvIGNhcnJ5IHRoZW0gaW5saW5lIOKAlCBcInRocmVlXG4gKiBSb2xlczogTWVtYmVyICgxNSksIFRlYW0gTGVhZCAoMTcpIGFuZCBBZG1pbiAoMzcpXCIg4oCUIGFuZCBldmVyeSBvbmUgb2YgdGhvc2VcbiAqIG51bWJlcnMgd2VudCBzdGFsZTogYFRlYW0gTGVhZGAgc3RvcHBlZCBiZWluZyBzZWVkZWQgd2hlbiBpdCBiZWNhbWUgdGhlIGZpcnN0XG4gKiB0ZW1wbGF0ZSBiZWxvdywgYW5kIHRoZSB0d28gYnVuZGxlcyBoYXZlIGdyb3duIHNpbmNlLiBBIGNvdW50IG5vdGhpbmcgY2hlY2tzXG4gKiBpcyBhIGNsYWltIHRoYXQgZGVjYXlzLCBhbmQgdGhpcyBvbmUgd2FzIHRoZSBzdGF0ZWQgcmF0aW9uYWxlIGZvciB0aGUgZmVhdHVyZS5cbiAqXG4gKiBXSFkgVEVNUExBVEVTIEFORCBOT1QgU0VFREVEIFJPTEVTLiBBIHNlZWRlZCBidWlsdC1pbiBpcyBgc3lzdGVtOiB0cnVlYCBhbmRcbiAqIHRoZXJlZm9yZSBpbW11dGFibGUsIHNvIHNlZWRpbmcgdGhlc2Ugd291bGQgcHV0IGZvdXIgdW5kZWxldGFibGUgcm93cyBpbiBldmVyeVxuICogb3JnIHdoZXRoZXIgaXQgd2FudHMgdGhlbS4gQSB0ZW1wbGF0ZSBsZWF2ZXMgbm8gdHJhY2UgdW50aWwgc29tZW9uZSB1c2VzIGl0LFxuICogYW5kIHdoYXQgaXQgcHJvZHVjZXMgaXMgYW4gb3JkaW5hcnkgY3VzdG9tIFJvbGUgdGhlIG9yZyBmdWxseSBvd25zIOKAlCBlZGl0YWJsZSxcbiAqIGRlbGV0YWJsZSwgYW5kIGJvdW5kZWQgYnkgdGhlIGF1dGhvcidzIGNlaWxpbmcgbGlrZSBhbnkgb3RoZXIuXG4gKlxuICogV0hBVCBUSEVZIERFTElCRVJBVEVMWSBFWENMVURFLiBgcm9sZXM6bWFuYWdlYCBpcyBpbiBub25lIG9mIHRoZW0uIEl0IGlzIHRoZVxuICogb25lIHBlcm1pc3Npb24gdGhhdCBjb21wb3VuZHMg4oCUIHRoZSBob2xkZXIgY2FuIG1pbnQgZnVydGhlciBSb2xlcywgdXAgdG8gdGhlaXJcbiAqIG93biBjZWlsaW5nIOKAlCBzbyBhY3F1aXJpbmcgaXQgc2hvdWxkIHN0YXkgYSBjb25zY2lvdXMgYWN0IHJhdGhlciB0aGFuIGEgc2lkZVxuICogZWZmZWN0IG9mIHBpY2tpbmcgYSBwcmVzZXQuIEV2ZXJ5IHBlcm1pc3Npb24gaGVyZSBpcyBvcmctYXNzaWduYWJsZSwgc28gYVxuICogdGVtcGxhdGUgaXMgdmFsaWQgaW4gYW55IG9yZyBhbmQgYHNhbml0aXplUGVybWlzc2lvbnNgIGFjY2VwdHMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVRlbXBsYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgam9iIGlzIOKAlCBzaG93biBuZXh0IHRvIHRoZSB0ZW1wbGF0ZSwgYW5kIGEgc2Vuc2libGUgUm9sZSBkZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXTtcbn1cblxuZXhwb3J0IGNvbnN0IFJPTEVfVEVNUExBVEVTOiByZWFkb25seSBSb2xlVGVtcGxhdGVbXSA9IFtcbiAge1xuICAgIC8vIFdhcyBhIFNFRURFRCBSb2xlIGluIGV2ZXJ5IG9yZyB1bnRpbCBpdCBiZWNhbWUgYSB0ZW1wbGF0ZS4gSXQgaXMgdGhlIG9ubHlcbiAgICAvLyBidWlsdC1pbiB0aGF0IHdhcyBhIGpvYiBkZXNjcmlwdGlvbiByYXRoZXIgdGhhbiBhIHN0cnVjdHVyYWwgcmVxdWlyZW1lbnQ6XG4gICAgLy8gU3VwZXIgQWRtaW4gaXMgd2hlcmUgYGlzU3VwZXJBZG1pbmAgaXMgZGVyaXZlZCBmcm9tLCBBZG1pbiBhbmQgTWVtYmVyIGFyZVxuICAgIC8vIHRoZSBmbG9vciBhbiBvcmcgaXMgdW51c2FibGUgd2l0aG91dCwgYW5kIHRoZSBzeXN0ZW0tb3JnIFJvbGVzIGNhcnJ5XG4gICAgLy8gcGVybWlzc2lvbnMgbm8gY3VzdG9tIFJvbGUgbWF5IGhvbGQuIFRlYW0gTGVhZCB3YXMgbm9uZSBvZiB0aG9zZSDigJQgaXQgaXNcbiAgICAvLyBgbWVtYmVyYCBwbHVzIHR3byByZXBvcnQgcGVybWlzc2lvbnMsIGFuZCBhbiBvcmcgdGhhdCBkb2VzIG5vdCBkZWxlZ2F0ZVxuICAgIC8vIHJlcG9ydCBhdXRob3JpbmcgaGFkIGFuIHVuZGVsZXRhYmxlIHJvdyBmb3IgaXQgYW55d2F5LlxuICAgIC8vXG4gICAgLy8gQ09OU0VRVUVOQ0UsIHN0YXRlZCByYXRoZXIgdGhhbiBkaXNjb3ZlcmVkOiBhIG5ldyBvcmcgbm8gbG9uZ2VyIGhhcyBhIFJvbGVcbiAgICAvLyB0aGF0IGdyYW50cyBgcmVwb3J0czp3cml0ZWAgdG8gYSBub24tYWRtaW4uIEFuIGFkbWluIGhvbGRzIGJvdGggcGVybWlzc2lvbnNcbiAgICAvLyAodGhleSBhcmUgaW4gdGhlIGFkbWluIGJ1bmRsZSkgYW5kIGluc3RhbnRpYXRlcyB0aGlzIHRlbXBsYXRlIHRvIGRlbGVnYXRlXG4gICAgLy8gdGhlbSDigJQgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGZvdXIgYmVsb3cuIE9yZ3MgdGhhdCBhbHJlYWR5IGhhdmUgdGhlIHNlZWRlZFxuICAgIC8vIFJvbGUga2VlcCBpdCwgYW5kIHRoZSBiYWNrZmlsbCBrZWVwcyBpdHMgYnVuZGxlIGN1cnJlbnQuXG4gICAgaWQ6ICd0ZWFtLWxlYWQnLFxuICAgIG5hbWU6ICdUZWFtIExlYWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnQXV0aG9ycyBhbmQgc2hhcmVzIHN0YWtlaG9sZGVyIHJlcG9ydHMgZm9yIGEgdGVhbSwgd2l0aG91dCBvcmctYWRtaW4gYWNjZXNzLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdyZXBvcnRzOndyaXRlJywgJ3JlcG9ydHM6cHVibGlzaCddLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogTUVNQkVSIEFMUkVBRFkgSVMgVEhFIERFVkVMT1BFUiBST0xFIOKAlCB0aGlzIHRlbXBsYXRlIGV4aXN0cyBmb3Igd2hhdCBpdFxuICAgICAqIGRvZXMgTk9UIGNvdmVyLlxuICAgICAqXG4gICAgICogRXZlcnl0aGluZyBpbiBhIGRldmVsb3BlcidzIGxvb3AgaXMgYHBpcGVsaW5lczpyZWFkYCArIGBwaXBlbGluZXM6d3JpdGVgLFxuICAgICAqIGJvdGggaW4gdGhlIG1lbWJlciBidW5kbGU6IGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIHJ1biwgc3RvcCwgdGhlIGJ1bGtcbiAgICAgKiBvcHMsIEFJIGdlbmVyYXRpb24gKGAvcGlwZWxpbmVzL2dlbmVyYXRlYCwgaW5jbC4gZnJvbS11cmwgYW5kIHN0cmVhbWluZyksXG4gICAgICogdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBwbHVzIGB0ZW1wbGF0ZXM6cmVhZGAgdG8gaW5zdGFudGlhdGUgYW5kXG4gICAgICogYHBsdWdpbnM6aW5zdGFsbGAgdG8gYWRkIGEgcGx1Z2luLiBBIHRlbXBsYXRlIHJlc3RhdGluZyB0aGF0IHdvdWxkIGJ1eVxuICAgICAqIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBXaGF0IGEgZGV2ZWxvcGVyIGhpdHMgdGhlIGNsaWZmIG9uIGlzIHRoZSBTRUxGLVNFUlZJQ0Ugb3BlcmF0ZSBwYWlyOiB0aGV5XG4gICAgICogY2FuIHJlYWQgdGhlaXIgc2VydmljZSdzIGRhc2hib2FyZHMgYW5kIG1ldHJpY3MgYW5kIGNhbm5vdCBjaGFuZ2UgZWl0aGVyLFxuICAgICAqIGJlY2F1c2UgYm90aCB3cml0ZXMgc2l0IGluIHRoZSBhZG1pbiBidW5kbGUuIFNvIHRoZSBwZXJzb24gd2hvIG93bnMgYVxuICAgICAqIHBpcGVsaW5lIGZpbGVzIGEgdGlja2V0IHRvIGdldCBhbiBhbGVydCBvbiBpdC5cbiAgICAgKlxuICAgICAqIERFTElCRVJBVEVMWSBOT1QgSEVSRS4gYGxvZ3M6ZXhwb3J0YCDigJQgdmlld2luZyBsb2dzIHJpZGVzXG4gICAgICogYG9ic2VydmFiaWxpdHk6cmVhZGAsIGJ1dCBkb3dubG9hZGluZyB0aGVtIGlzIGJ1bGsgZWdyZXNzIGFuIG9yZyBtYXlcbiAgICAgKiB3aXRoaG9sZCBmcm9tIG1lbWJlcnMgKGRvY3MvcGVybWlzc2lvbnMubWQpLCBhbmQgYSB0ZW1wbGF0ZSBhaW1lZCBhdCBldmVyeVxuICAgICAqIGVuZ2luZWVyIHdvdWxkIHJldmVyc2UgdGhhdC4gYHBpcGVsaW5lczpwdWJsaXNoYCDigJQgc2hhcmluZyBiZXlvbmQgdGhlXG4gICAgICogYXV0aG9yIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgd2hpY2ggaXMgUmVsZWFzZSBNYW5hZ2VyJ3MgYmVsb3c7IHNvbWVib2R5XG4gICAgICogd2hvIGRvZXMgYm90aCBob2xkcyBib3RoIFJvbGVzLlxuICAgICAqL1xuICAgIGlkOiAnZGV2ZWxvcGVyJyxcbiAgICBuYW1lOiAnRGV2ZWxvcGVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0J1aWxkcyBhbmQgcnVucyBwaXBlbGluZXMsIGFuZCBvd25zIHRoZSBkYXNoYm9hcmRzIGFuZCBhbGVydHMgZm9yIHdoYXQgdGhleSBidWlsZC4nLFxuICAgIHBlcm1pc3Npb25zOiBbLi4uTUVNQkVSX1BFUk1JU1NJT05TLCAnZGFzaGJvYXJkczp3cml0ZScsICdvYnNlcnZhYmlsaXR5OndyaXRlJ10sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3JlbGVhc2UtbWFuYWdlcicsXG4gICAgbmFtZTogJ1JlbGVhc2UgTWFuYWdlcicsXG4gICAgZGVzY3JpcHRpb246ICdEZWNpZGVzIHdoYXQgYmVjb21lcyBzaGFyZWQgYmV5b25kIGl0cyBhdXRob3IsIGFuZCBhcHByb3ZlcyBwbHVnaW4gaW5zdGFsbHMuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczpwdWJsaXNoJyxcbiAgICAgICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6cHVibGlzaCcsXG4gICAgICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6cHVibGlzaCcsXG4gICAgICAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAnc2VjdXJpdHktb2ZmaWNlcicsXG4gICAgbmFtZTogJ1NlY3VyaXR5IE9mZmljZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnSWRlbnRpdHksIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIGV2aWRlbmNlIHRyYWlsIOKAlCB0aGUgc3VyZmFjZSBhbiBhdWRpdG9yIGFza3MgYWJvdXQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2F1ZGl0OnJlYWQnLCAnbG9nczpleHBvcnQnLFxuICAgICAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgICAgICdvcmdfaWRwOndyaXRlJywgJ29yZ19rbXM6d3JpdGUnLCAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLFxuICAgICAgLy8gT3duaW5nIHRoZSBpbXBlcnNvbmF0aW9uIFBPTElDWSAoYG9yZ19pbXBlcnNvbmF0aW9uOndyaXRlYCkgd2l0aG91dFxuICAgICAgLy8gYmVpbmcgYWJsZSB0byBhbnN3ZXIgYSBSRVFVRVNUIHdhcyB0aGUgYXN5bW1ldHJ5IHRoZSBjb25zZW50IGZsb3cgbGVmdFxuICAgICAgLy8gYmVoaW5kOiB0aGUgbGVzc2VyIGFjdCBoYWQgYSBwZXJtaXNzaW9uIG9mIGl0cyBvd24gYW5kIHRoZSBncmVhdGVyIG9uZVxuICAgICAgLy8gaGFkIG5vbmUuIFdob2V2ZXIgZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgcmVxdWlyZWQgc2hvdWxkIGJlIGFibGUgdG9cbiAgICAgIC8vIGdpdmUgb3Igd2l0aGhvbGQgaXQuXG4gICAgICAnaW1wZXJzb25hdGlvbjphcHByb3ZlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdwZW9wbGUtbWFuYWdlcicsXG4gICAgbmFtZTogJ1Blb3BsZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSByb3N0ZXIgYW5kIGl0cyBtYWNoaW5lIGNyZWRlbnRpYWxzLCBhY3Jvc3MgdGhlIGFjY291bnRcXHUyMDE5cyB0ZWFtcyDigJQgd2l0aG91dCB0aGUgb3JnXFx1MjAxOXMgc2V0dGluZ3Mgb3IgaXRzIG1vbmV5LicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdtZW1iZXJzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAgICAgLy8gVGhlIHNhbWUgam9iLCBvbmUgbGV2ZWwgZG93bjogZW50ZXJpbmcgYSBkZXNjZW5kYW50IHRlYW0gdG8gd29yayBvbiBpdHNcbiAgICAgIC8vIHJvc3RlciwgYW5kIHZpZXdpbmcgb25lIG9mIGl0cyBtZW1iZXJzIGFzIHRoYXQgbWVtYmVyLiBXaXRob3V0IGl0IGFcbiAgICAgIC8vIHBlb3BsZSBtYW5hZ2VyIGluIGEgcGFyZW50IG9yZyBjYW4gYWRtaW5pc3RlciB0aGUgYWNjb3VudCdzIHRlYW1zIG9uXG4gICAgICAvLyBwYXBlciBhbmQgbm90IHJlYWNoIHRoZW0uXG4gICAgICAndGVhbV9hY2Nlc3M6b3BlbicsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAnYmlsbGluZy1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnQmlsbGluZyBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBzdWJzY3JpcHRpb24sIHNlYXRzIGFuZCBpbnZvaWNlcyBmb3IgdGhpcyBvcmdhbml6YXRpb24uJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2JpbGxpbmc6cmVhZCcsICdiaWxsaW5nOm1hbmFnZScsICdxdW90YXM6cmVhZCcsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIC8qKlxuICAgICAqIFRoZSBqb2IgdGhlIGltcGVyc29uYXRpb24gY29uc2VudCBmbG93IGNyZWF0ZWQgSU5TSURFIHRoZSB0ZW5hbnQ6IHRoZVxuICAgICAqIG5hbWVkIHBlcnNvbiB3aG8gYW5zd2VycyBcIm1heSBhIHN1cHBvcnQgZW5naW5lZXIgdmlldyB0aGlzIGFjY291bnQ/XCIgYW5kXG4gICAgICogY2FuIGFmdGVyd2FyZHMgcmVhZCB3aGF0IGhhcHBlbmVkLlxuICAgICAqXG4gICAgICogSXQgZXhpc3RzIGFzIGEgdGVtcGxhdGUgYmVjYXVzZSBgaW1wZXJzb25hdGlvbjphcHByb3ZlYCBpcyBpbiB0aGUgYWRtaW5cbiAgICAgKiBhbmQgb3duZXIgYnVuZGxlcyDigJQgc28gYnkgZGVmYXVsdCBldmVyeSBhZG1pbiBtYXkgY29uc2VudCDigJQgYW5kIHRoZSB3aG9sZVxuICAgICAqIHBvaW50IG9mIHNwbGl0dGluZyBpdCBvdXQgd2FzIHRvIGxldCBhbiBvcmcgc2F5IFwidGhpcyBkZWNpc2lvbiBpcyBvbmVcbiAgICAgKiBwZXJzb24nc1wiLiBEb2luZyB0aGF0IG1lYW5zIGF1dGhvcmluZyBhIFJvbGUgdGhhdCBob2xkcyBpdCBhbmQgdGFraW5nIGl0XG4gICAgICogb2ZmIHRoZSBvdGhlcnMsIGFuZCBoYW5kLWNvbXBvc2luZyB3YXMgdGhlIG9ubHkgcm91dGUuXG4gICAgICpcbiAgICAgKiBUd28gcGVybWlzc2lvbnMgYW5kIG5vIG1vcmU6IGFwcHJvdmluZyBpcyBub3QgYWRtaW5pc3RlcmluZy4gYGF1ZGl0OnJlYWRgXG4gICAgICogaXMgaGVyZSBiZWNhdXNlIGNvbnNlbnRpbmcgd2l0aG91dCBiZWluZyBhYmxlIHRvIGNoZWNrIHdoYXQgdGhlIHNlc3Npb25cbiAgICAgKiB0aGVuIGRpZCBpcyBjb25zZW50IGluIG5hbWUgb25seS5cbiAgICAgKi9cbiAgICBpZDogJ2FjY2Vzcy1hcHByb3ZlcicsXG4gICAgbmFtZTogJ0FjY2VzcyBBcHByb3ZlcicsXG4gICAgZGVzY3JpcHRpb246ICdBbnN3ZXJzIHJlcXVlc3RzIHRvIHZpZXcgdGhpcyBvcmdhbml6YXRpb25cXHUyMDE5cyBhY2NvdW50cywgYW5kIHJlYWRzIHRoZSB0cmFpbCBvZiB3aGF0IGhhcHBlbmVkLicsXG4gICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLCAnYXVkaXQ6cmVhZCcsXG4gICAgXSxcbiAgfSxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSDigJQgdGhlIE1PREVSQVRJT04gam9iLlxuICpcbiAqIEl0IGNhcnJpZXMgYHBsdWdpbnM6bW9kZXJhdGVgIGFuZCBOT1QgYHB1Ymxpc2hlcnM6dmVyaWZ5YCwgYmVjYXVzZSB0aGUgdHdvIGFyZVxuICogbm90IHBlZXJzLiBgcGx1Z2luczptb2RlcmF0ZWAgaXMgdGhlIHdpZGUgc3VyZmFjZTogeWFuayBhIHZlcnNpb24gKHdoaWNoXG4gKiBicmVha3MgcGlwZWxpbmVzIGFscmVhZHkgcnVubmluZyBpdCksIHB1Ymxpc2ggYW4gYWR2aXNvcnkgKHdoaWNoIGFsYXJtcyBldmVyeVxuICogY29uc3VtZXIgb2YgYSBsaXN0aW5nKSwgcmV3cml0ZSB0aGUgYXV0by1hcHByb3ZhbCBydWxlcyAod2hpY2ggZGVjaWRlIHdoYXRcbiAqIHB1Ymxpc2hlcyB3aXRoIG5vIGh1bWFuIHJldmlldyBhdCBhbGwpLCByZXNlcnZlIG5hbWVzLCBtb2RlcmF0ZSByZXZpZXdzLFxuICogcmUtc2lnbi4gYHB1Ymxpc2hlcnM6dmVyaWZ5YCBpcyB0aHJlZSByb3V0ZXMg4oCUIHN1c3BlbmQsIHVuc3VzcGVuZCwgdGllciDigJQgYnV0XG4gKiBvbmUgb2YgdGhlbSBHUkFOVFMgVkVSSUZJRUQgU1RBVFVTLCB3aGljaCBpcyB0aGUgYmFkZ2UgY29uc3VtZXJzIHJlYWQgYXMgXCJ0aGlzXG4gKiBkZXBsb3ltZW50IHZvdWNoZXMgZm9yIHRoZSBwdWJsaXNoZXJcIi5cbiAqXG4gKiBCdW5kbGluZyB0aGVtLCBhcyB0aGlzIFJvbGUgdXNlZCB0bywgbWVhbnQgZXZlcnlvbmUgaGlyZWQgdG8gdHJpYWdlIHRoZSBxdWV1ZVxuICogY291bGQgYWxzbyBtaW50IGEgVmVyaWZpZWQgcHVibGlzaGVyLiBUaHJlZSBtZWNoYW5pc21zIGFscmVhZHkgYXNzdW1lIHRoZVxuICogc3BsaXQgY2FuIGJpbmQg4oCUIGByZXF1aXJlZERlY2lzaW9uUGVybWlzc2lvbmAgcGVyIHJlcXVlc3Qga2luZCwgdGhlIHF1ZXVlJ3NcbiAqIHBlci1yb3cgYGNhbihyZXF1aXJlZFBlcm1pc3Npb24pYCwgYW5kIHRoZSBhcHByb3Zlci1zaG9ydGFnZSBjb3VudHMgdGhhdFxuICogYEVjb3N5c3RlbUVsaWdpYmlsaXR5YCB0cmFja3MgU0VQQVJBVEVMWSBmb3IgZWFjaCBwZXJtaXNzaW9uIOKAlCBhbmQgd2l0aCBvbmVcbiAqIGNvbWJpbmVkIFJvbGUgbm9uZSBvZiB0aGVtIGNvdWxkIGV2ZXIgZGlzY3JpbWluYXRlLlxuICpcbiAqIHtAbGluayBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlN9IGlzIHRoZSBvdGhlciBoYWxmLlxuICovXG5leHBvcnQgY29uc3QgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BsdWdpbnM6cmVhZCcsXG4gICdwbHVnaW5zOm1vZGVyYXRlJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlB1Ymxpc2hlciBWZXJpZmllclwiIFJvbGUg4oCUIHRoZSBUUlVTVCBkZWNpc2lvbi5cbiAqXG4gKiBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgZWNvc3lzdGVtIHNwbGl0IGRlc2NyaWJlZCBvblxuICoge0BsaW5rIEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TfTogd2hvIG1heSBhd2FyZCBWZXJpZmllZCwgc3VzcGVuZCBhXG4gKiBwdWJsaXNoZXIgYW5kIGxpZnQgYSBzdXNwZW5zaW9uLiBDYXJyaWVzIGBwbHVnaW5zOnJlYWRgIHNvIHRoZSBob2xkZXIgY2FuIHNlZVxuICogd2hhdCBhIHB1Ymxpc2hlciBzaGlwcyBiZWZvcmUgdm91Y2hpbmcgZm9yIHRoZW0sIGFuZCB0aGUgc2FtZSB0d28gYW1iaWVudFxuICogcmVhZHMgYXMgaXRzIHNpYmxpbmcuXG4gKlxuICogU1RBRkYgQVQgTEVBU1QgVFdPIFBFT1BMRS4gQSBWZXJpZmllZCBhcHBsaWNhdGlvbiBhbmQgYW4gdW5zdXNwZW5kIGFyZSBib3RoXG4gKiBgbmVlZHNUd29QZXJzb25gLCBhbmQgYGNvbmZsaWN0T2ZJbnRlcmVzdGAgcmVmdXNlcyB0aGUgc2FtZSBwZXJzb24gdHdpY2UsIHNvIGFcbiAqIHNpbmdsZSBob2xkZXIgY2Fubm90IGNvbXBsZXRlIGVpdGhlciBkZWNpc2lvbiBhbG9uZS4gVGhlIGNvbnNvbGUncyBhcHByb3ZlclxuICogc3RhbmRpbmcgbm90aWNlIGlzIHdoYXQgc3VyZmFjZXMgdGhhdCBzaG9ydGFnZSDigJQgYW5kIHNwbGl0dGluZyB0aGlzIFJvbGUgb3V0XG4gKiBpcyB3aGF0IGZpbmFsbHkgbGV0cyB0aGF0IG5vdGljZSByZXBvcnQgYSBmaWd1cmUgaXRzIHNpYmxpbmcncyBkb2VzIG5vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczpyZWFkJyxcbiAgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgJ21lc3NhZ2VzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlRlYW0gTGVhZFwiIFJvbGUg4oCUIHRoZSBwZXJzb24gd2hvIHJlcG9ydHMgVVBXQVJELlxuICpcbiAqIEV4aXN0cyBiZWNhdXNlIHRoZSB0YXJnZXQgdXNlciBmb3Igc3Rha2Vob2xkZXIgcmVwb3J0cyBpcyBhIGxlYWQsIG5vdCBhbiBhZG1pbixcbiAqIGFuZCBncmFudGluZyBgcmVwb3J0czp3cml0ZWAgb25seSB0aHJvdWdoIHRoZSBhZG1pbiBidW5kbGUgd291bGQgaGF2ZSBmb3JjZWRcbiAqIGV2ZXJ5IHJlcG9ydGluZyBsZWFkIHRvIGJlIGFuIG9yZyBhZG1pbiAobWVtYmVyczptYW5hZ2UsIHJvbGVzOm1hbmFnZSxcbiAqIG9yZ19zZXR0aW5nczp3cml0ZSwgYmlsbGluZykgdG8gc2VuZCB0aGVpciBtYW5hZ2VyIGEgd2Vla2x5IHN1bW1hcnkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogYHJlcG9ydHM6cm9sbHVwYC4gUm9sbGluZyBhIHJlcG9ydCB1cCBvdmVyIGRlc2NlbmRhbnRcbiAqIHRlYW1zIGlzIGRvd253YXJkIHZpc2liaWxpdHkgYWNyb3NzIHRoZSBvcmcgdHJlZSwgd2hpY2ggaXMgYSBncmFudGVkIGNhcGFiaWxpdHlcbiAqIGluIHRoaXMgbW9kZWwsIG5vdCBzb21ldGhpbmcgYSB0ZWFtJ3Mgb3duIGxlYWQgZ2V0cyBieSBkZWZhdWx0IOKAlCBhIGxlYWQgb2YgYVxuICogUEFSRU5UIG9yZyBpcyBncmFudGVkIGl0IGV4cGxpY2l0bHkuIFRoZSBSb2xlIGdyYW50cyB0aGUgY29hcnNlIGBtZW1iZXJgIGxhYmVsXG4gKiBhbmQgbmV2ZXIgc2V0cyBgaXNTdXBlckFkbWluYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fTEVBRF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAuLi5NRU1CRVJfUEVSTUlTU0lPTlMsXG4gICdyZXBvcnRzOndyaXRlJyxcbiAgJ3JlcG9ydHM6cHVibGlzaCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQaXBlbGluZSBBdXRvbWF0aW9uXCIgUm9sZSDigJQgd2hhdCB0aGUgb3JnJ3NcbiAqIHVuc2NvcGVkIHN0b3JlZCBjcmVkZW50aWFsICh0aGUgYHBsYXRmb3JtLWF1dG9tYXRpb25gIHNlcnZpY2UgYWNjb3VudCB0aGF0XG4gKiBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucykgbmVlZHMsIGFuZCBub3RoaW5nIG1vcmUuXG4gKlxuICogRGVyaXZlZCBieSB0cmFjaW5nIGV2ZXJ5IGNhbGwgbWFkZSB3aXRoIHRoYXQga2V5LCBub3QgYnkgZ3Vlc3Npbmc6XG4gKiAgLSBgcGlwZWxpbmVzOnJlYWRgIOKAlCB0aGUgQ29kZUJ1aWxkIHN5bnRoIChhbmQgYHBpcGVsaW5lIGRlcGxveSAtLXN0b3JlLXRva2Vuc2ApXG4gKiAgICBmZXRjaGluZyB0aGUgcGlwZWxpbmUgaXQgYnVpbGRzIChgR0VUIC9waXBlbGluZXMvOmlkYCk7XG4gKiAgLSBgcGx1Z2luczpyZWFkYCAgIOKAlCBwbHVnaW4gcmVzb2x1dGlvbiBhdCBzeW50aC9kZXBsb3kgYW5kIGluIHRoZSBwbHVnaW4tbG9va3VwXG4gKiAgICBMYW1iZGEgKGBQT1NUIC9wbHVnaW5zL2xvb2t1cGApLCBhbmQgdGhlIHJ1bi10aW1lIHZ1bG5lcmFiaWxpdHkgY2hlY2sgc3RlcFxuICogICAgKGBQT1NUIC9wbHVnaW5zL3J1bnRpbWUtY2hlY2tgKS5cbiAqXG4gKiBXaGF0IGl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBjYXJyeSwgYW5kIHdoZXJlIHRoYXQgd29yayB3ZW50OlxuICogIC0gcmVnaXN0cnkgd3JpdGVzIChgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGVgKSDigJQgdGhlIHN5bnRoIHJlZ2lzdGVycyBpdHMgc3RlcFxuICogICAgbWFuaWZlc3Qgd2l0aCB0aGUgc2VwYXJhdGUgYHBpcGVsaW5lLXJlZ2lzdGVyYCBrZXkgKFBpcGVsaW5lIFJlZ2lzdHJhdGlvbik7XG4gKiAgLSBpbWFnZSBwdXNoZXMgYW5kIHB1bGxzIOKAlCBDb2RlQnVpbGQgYXV0aGVudGljYXRlcyB0byB0aGUgaW1hZ2UgcmVnaXN0cnkgd2l0aFxuICogICAgdGhlIGByZWdpc3RyeS1wdXNoYCBzY29wZWQga2V5LCBuZXZlciB0aGlzIG9uZTtcbiAqICAtIHJlcG9ydGluZyB3cml0ZXMg4oCUIHRoZSBldmVudHMgTGFtYmRhIGFuZCBzdGVwIHJlcG9ydCB1cGxvYWRzIHVzZSB0aGVcbiAqICAgIGByZXBvcnRpbmc6aW5nZXN0YCBzY29wZWQga2V5LlxuICpcbiAqIEl0IHVzZWQgdG8gYmUgdGhlIG9yZyBBRE1JTiBSb2xlLCBzbyBhIGxlYWtlZCBzeW50aCBjcmVkZW50aWFsIGNvdWxkIHJld3JpdGVcbiAqIGV2ZXJ5IHBpcGVsaW5lLCBSb2xlIGFuZCBtZW1iZXIgb2YgdGhlIG9yZy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX0FVVE9NQVRJT05fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJyxcbiAgJ3BsdWdpbnM6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJQaXBlbGluZSBSZWdpc3RyYXRpb25cIiBSb2xlLCBoZWxkIGJ5IHRoZVxuICogYHBpcGVsaW5lLXJlZ2lzdGVyYCBzZXJ2aWNlIGFjY291bnQ6IGBQT1NUYC9gREVMRVRFIC9waXBlbGluZXMvcmVnaXN0cnlgIGZvclxuICogaXRzIG93biBvcmcgYW5kIG5vdGhpbmcgZWxzZSDigJQgbm90IGV2ZW4gYSByZWFkLlxuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdXNlcidzIGVmZmVjdGl2ZSBvcmcgcGVybWlzc2lvbnMgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbS5cbiAqXG4gKiBTaW5nbGUtc291cmNlIG1vZGVsOiBhIHVzZXIncyBhYmlsaXRpZXMgYXJlIEVYQUNUTFkgdGhlIHVuaW9uIG9mIHRoZVxuICogcGVybWlzc2lvbnMgY2FycmllZCBieSB0aGUgUm9sZXMgdGhleSBob2xkIChhIFJvbGUgPSBhIG5hbWVkIHBlcm1pc3Npb24gc2V0O1xuICogYnVpbHQtaW4gUm9sZXMgY2FycnkgdGhlaXIgYnVuZGxlIGV4cGxpY2l0bHksIHNlZWRlZCBmcm9tXG4gKiB7QGxpbmsgUk9MRV9QRVJNSVNTSU9OU30pLiBUaGVyZSBpcyBubyBzZXBhcmF0ZSByb2xlLWRlcml2ZWQgYmFzZWxpbmUg4oCUIHRoZVxuICogY29hcnNlIGByb2xlYCBsYWJlbCBncmFudHMgbm90aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIDEuIFBsYXRmb3JtIHN1cGVyYWRtaW5zIChgaXNTdXBlckFkbWluYCkgYWx3YXlzIGdldCBBTEwgcGVybWlzc2lvbnMuXG4gKiAyLiBPdGhlcndpc2UsIHVuaW9uIGV2ZXJ5IHBlcm1pc3Npb24gZ3JhbnRlZCBieSB0aGUgdXNlcidzIGFzc2lnbmVkIFJvbGVzLlxuICogMy4gSW52YWxpZC91bmtub3duIHBlcm1pc3Npb24gc3RyaW5ncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRQZXJtaXNzaW9ucyAtIEZsYXR0ZW5lZCBwZXJtaXNzaW9ucyBmcm9tIGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaG9sZHNcbiAqIEBwYXJhbSBpc1N1cGVyQWRtaW4gLSBXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqIEByZXR1cm5zIEVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBpbiBjYW5vbmljYWwgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVc2VyUGVybWlzc2lvbnMoXG4gIGFzc2lnbmVkUGVybWlzc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gWy4uLkFMTF9QRVJNSVNTSU9OU107XG5cbiAgY29uc3QgcGVybXMgPSBuZXcgU2V0PFBlcm1pc3Npb24+KCk7XG4gIGlmIChhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICAgIGlmIChpc1ZhbGlkUGVybWlzc2lvbihwKSkgcGVybXMuYWRkKHApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcihwID0+IHBlcm1zLmhhcyhwKSk7XG59XG5cbi8qKlxuICogQ29uZmluZSBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCB0byB3aGF0IG1heSBiZSBoZWxkIGluIHRoZSB0b2tlbidzIEFDVElWRVxuICogb3JnOiBvdXRzaWRlIHRoZSBzeXN0ZW0gb3JnIGV2ZXJ5IHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9IGVudHJ5IGlzXG4gKiBkcm9wcGVkIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gQXBwbGllZCBhdCB0b2tlbiBpc3N1ZSBvblxuICogdG9wIG9mIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSDigJQgaW5jbHVkaW5nIGEgc3VwZXJhZG1pbidzIGltcGxpY2l0LWFsbCDigJRcbiAqIHNvIGEgdG9rZW4gbWludGVkIGluIGEgdGVuYW50IG9yZyBuZXZlciBDTEFJTVMgYHBsdWdpbnM6bW9kZXJhdGVgIC9cbiAqIGBwdWJsaXNoZXJzOnZlcmlmeWAsIGV2ZW4gaWYgYSBoYW5kLXdyaXR0ZW4gUm9sZSBkb2N1bWVudCBzb21laG93IGNhcnJpZWRcbiAqIHRoZW0gdGhlcmUuIChTdXBlcmFkbWlucyBzdGlsbCBwYXNzIGBoYXNQZXJtaXNzaW9uYCB2aWEgdGhlIGZsYWc7IHRoZVxuICogZWNvc3lzdGVtIHJvdXRlIGdhdGUgYWRkaXRpb25hbGx5IHJlcXVpcmVzIHRoZSBzeXN0ZW0gb3JnLCBzbyB0aGF0IGJ5cGFzc1xuICogbmV2ZXIgcmVhY2hlcyBhIGdvdmVybmFuY2Ugcm91dGUgZnJvbSBhIHRlbmFudCBvcmcgZWl0aGVyLilcbiAqXG4gKiBUYWtlcyBhIGJvb2xlYW4gcmF0aGVyIHRoYW4gYW4gb3JnIGlkIHNvIHRoaXMgbW9kdWxlIHN0YXlzIGRlcGVuZGVuY3ktZnJlZVxuICogKHRoZSBmcm9udGVuZCBpbXBvcnRzIGl0KTsgY2FsbGVycyBkZWNpZGUgd2l0aCBhcGktY29yZSBgaXNTeXN0ZW1PcmdJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maW5lUGVybWlzc2lvbnNUb09yZzxQIGV4dGVuZHMgc3RyaW5nPihcbiAgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBbXSxcbiAgYWN0aXZlT3JnSXNTeXN0ZW1Pcmc6IGJvb2xlYW4sXG4pOiBQW10ge1xuICByZXR1cm4gYWN0aXZlT3JnSXNTeXN0ZW1PcmcgPyBbLi4ucGVybWlzc2lvbnNdIDogcGVybWlzc2lvbnMuZmlsdGVyKChwKSA9PiAhaXNTeXN0ZW1PcmdPbmx5UGVybWlzc2lvbihwKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IGdyYW50cyBgcGVybWlzc2lvbmAgKHN1cGVyYWRtaW4g4oeSIGFsd2F5cykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVybWlzc2lvbihcbiAgZ3JhbnRlZDogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiB0cnVlO1xuICByZXR1cm4gISFncmFudGVkICYmIGdyYW50ZWQuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsdC1pbiBSb2xlIHNlZWQgYnVuZGxlcywgYXMgYSBUQUJMRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUaGUgbmFtZWQgcGVybWlzc2lvbiBidW5kbGVzIGEgYnVpbHQtaW4gUm9sZSBtYXkgY2FycnksIGFuZCB0aGUgUm9sZSBOQU1FIGVhY2hcbiAqIG9uZSBpcyBzZWVkZWQgdW5kZXIuIE9uZSB0YWJsZSwgYmVjYXVzZSB0aGUgdGhyZWUgZmFjdHMgYWJvdXQgYSBqb2IgUm9sZSDigJRcbiAqIGl0cyBpZCwgaXRzIHBlcm1pc3Npb25zIGFuZCBpdHMgZGlzcGxheSBuYW1lIOKAlCB3ZXJlIHByZXZpb3VzbHkgdGhyZWVcbiAqIGluZGVwZW5kZW50IGxpc3RzIGluIHRocmVlIHBsYWNlcywgYW5kIG5vdGhpbmcgaGVsZCB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIFdIQVQgV0VOVCBXUk9ORyBXSVRIT1VUIElULiBUaGUgcGxhdGZvcm0gcmVzb2x2ZWQgYSBidW5kbGUgdGhyb3VnaCBhXG4gKiBuaW5lLWJyYW5jaCBgaWZgIGNoYWluIHdpdGggYSBmYWxsLXRocm91Z2ggdG8gdGhlIGNvYXJzZSBgZ3JhbnRzUm9sZWAgYnVuZGxlLlxuICogRXZlcnkgam9iIFJvbGUgZ3JhbnRzIGBtZW1iZXJgLCBzbyBhIGJ1bmRsZSBhZGRlZCB0byB0aGUgaWQgbGlzdCBXSVRIT1VUIGl0c1xuICogYnJhbmNoIGRpZCBub3QgZmFpbCDigJQgaXQgc2lsZW50bHkgc2VlZGVkIHRoZSBwbGFpbiBNZW1iZXIgYnVuZGxlLCBhbmQgdGhlXG4gKiBzdGFydHVwIGJhY2tmaWxsIHRoZW4gcmUtc3luY2VkIGl0IHRvIHRoYXQgd3JvbmcgdmFsdWUgb24gZXZlcnkgYm9vdC4gVGhlXG4gKiBSb2xlIGV4aXN0ZWQsIHdhcyBhc3NpZ25hYmxlIGZyb20gdGhlIHN0YWZmaW5nIHBhbmVsLCBhbmQgZ3JhbnRlZCBmaWZ0ZWVuXG4gKiB0ZW5hbnQgcGVybWlzc2lvbnMgaW5zdGVhZCBvZiBpdHMgam9iLiBOb3RoaW5nIGFueXdoZXJlIGV4ZXJjaXNlZCB0aGVcbiAqIHJlc29sdmVyIHBlciBidW5kbGUuXG4gKlxuICogS2V5ZWQgYWNjZXNzIHBsdXMgYHNhdGlzZmllc2AgbWFrZXMgYSBtaXNzaW5nIGVudHJ5IGEgQ09NUElMRSBlcnJvciwgYW5kIGFuXG4gKiBleHRyYSBvbmUgdG9vIOKAlCBpbiBib3RoIGRpcmVjdGlvbnMsIHdpdGggbm8gcnVudGltZSBjaGVjayB0byBmb3JnZXQuXG4gKlxuICogVGhlIE5BTUUgbGl2ZXMgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29uLiBUaGUgcGxhdGZvcm0gc2VlZGVkIG5hbWVzIGZyb20gaXRzXG4gKiBvd24gY29uc3RhbnRzIHdoaWxlIHRoZSBmcm9udGVuZCdzIHN0YWZmaW5nIHJvc3RlciBoYXJkLWNvZGVkIGl0cyBvd24gY29weSxcbiAqIGVhY2ggcGlubmVkIGJ5IGEgdGVzdCBhZ2FpbnN0IGl0c2VsZiDigJQgc28gcmVuYW1pbmcgYSBSb2xlIHBhc3NlZCBib3RoIHN1aXRlc1xuICogYW5kIHRoZSByb3N0ZXIgc2lsZW50bHkgcmVuZGVyZWQgXCJSb2xlIG5vdCBmb3VuZFwiLCB3aGljaCBpcyB0aGUgZ3JhbnQgcGF0aCBmb3JcbiAqIHRoYXQgUm9sZSdzIHBlcm1pc3Npb25zIGRpc2FwcGVhcmluZy4gQm90aCBzaWRlcyByZWFkIHRoaXMgbm93LlxuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVTID0ge1xuICBlY29zeXN0ZW1fbWFuYWdlcjogeyBuYW1lOiAnRWNvc3lzdGVtIE1hbmFnZXInLCBwZXJtaXNzaW9uczogRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiAnc3lzdGVtJyB9LFxuICBwdWJsaXNoZXJfdmVyaWZpZXI6IHsgbmFtZTogJ1B1Ymxpc2hlciBWZXJpZmllcicsIHBlcm1pc3Npb25zOiBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiAnc3lzdGVtJyB9LFxuICB0ZWFtX2xlYWQ6IHsgbmFtZTogJ1RlYW0gTGVhZCcsIHBlcm1pc3Npb25zOiBURUFNX0xFQURfUEVSTUlTU0lPTlMsIHNlZWRlZEluOiBudWxsIH0sXG4gIHBsYXRmb3JtX29ic2VydmVyOiB7IG5hbWU6ICdQbGF0Zm9ybSBPYnNlcnZlcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIHBsYXRmb3JtX29wZXJhdG9yOiB7IG5hbWU6ICdQbGF0Zm9ybSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIGFjY291bnRfbWFuYWdlcjogeyBuYW1lOiAnQWNjb3VudCBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUywgc2VlZGVkSW46ICdzeXN0ZW0nIH0sXG4gIGNvbnNvbGVfYWRtaW46IHsgbmFtZTogJ0NvbnNvbGUgQWRtaW5pc3RyYXRvcicsIHBlcm1pc3Npb25zOiBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgc3VwcG9ydF9hZ2VudDogeyBuYW1lOiAnU3VwcG9ydCBBZ2VudCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0FHRU5UX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgc3VwcG9ydF9sZWFkOiB7IG5hbWU6ICdTdXBwb3J0IExlYWQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgcmVnaXN0cnlfb3BlcmF0b3I6IHsgbmFtZTogJ1JlZ2lzdHJ5IE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ3N5c3RlbScgfSxcbiAgcGlwZWxpbmVfYXV0b21hdGlvbjogeyBuYW1lOiAnUGlwZWxpbmUgQXV0b21hdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ29yZycgfSxcbiAgcGlwZWxpbmVfcmVnaXN0cmF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBSZWdpc3RyYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TLCBzZWVkZWRJbjogJ29yZycgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xuICAvKiogV2hlcmUgaXQgaXMgc2VlZGVkOiBldmVyeSBTWVNURU0gb3JnJ3Mgam9iIFJvbGVzLCBldmVyeSBvcmcncyBNQUNISU5FIFJvbGVzLCBvciBub3doZXJlIChhIHRlbXBsYXRlKS4gKi9cbiAgc2VlZGVkSW46ICdzeXN0ZW0nIHwgJ29yZycgfCBudWxsO1xufT47XG5cbi8qKiBFdmVyeSBzZWVkLWJ1bmRsZSBpZC4gVGhlIHBsYXRmb3JtJ3MgYFJvbGUuc2VlZEJ1bmRsZWAgZW51bSBpcyB0aGlzIGxpc3QuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVfSURTID0gT2JqZWN0LmtleXMoU0VFRF9CVU5ETEVTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTPjtcbmV4cG9ydCB0eXBlIFNlZWRCdW5kbGVJZCA9IGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM7XG5cbi8qKlxuICogVGhlIFNZU1RFTSBPUkcncyBqb2IgUm9sZXMsIGluIHN0YWZmaW5nIG9yZGVyICh0YWJsZSBvcmRlcikg4oCUIHRoZSBzdWJzZXQgb2ZcbiAqIHtAbGluayBTRUVEX0JVTkRMRVN9IHNlZWRlZCB0aGVyZSAoYHNlZWRlZEluOiAnc3lzdGVtJ2ApLCB3aGljaCBpcyBldmVyeSBidW5kbGUgZXhjZXB0IGB0ZWFtX2xlYWRgXG4gKiAoYSB0ZW5hbnQgam9iLCBhbmQgYSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhIHNlZWRlZCBSb2xlIHNpbmNlIGl0IHN0b3BwZWRcbiAqIGJlaW5nIHN0cnVjdHVyYWwpLlxuICpcbiAqIGBlY29zeXN0ZW1fbWFuYWdlcmAgSVMgb25lIG9mIHRoZW07IGl0IGlzIGxpc3RlZCBoZXJlIGV2ZW4gdGhvdWdoIGl0cyByb3N0ZXJcbiAqIGxpdmVzIG9uIHRoZSBFY29zeXN0ZW0gY29uc29sZSByYXRoZXIgdGhhbiB0aGUgc3RhZmZpbmcgcGFuZWwsIGJlY2F1c2Ugd2hhdFxuICogdGhpcyBsaXN0IGFuc3dlcnMgaXMgXCJ3aGljaCBSb2xlcyBkb2VzIHRoZSBzeXN0ZW0gb3JnIHNlZWRcIiwgbm90IFwid2hpY2ggcGFuZWxcbiAqIHJlbmRlcnMgdGhlbVwiLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19KT0JfQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBTRUVEX0JVTkRMRV9JRFMuZmlsdGVyKChpZCkgPT4gU0VFRF9CVU5ETEVTW2lkXS5zZWVkZWRJbiA9PT0gJ3N5c3RlbScpO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyAoYHNlZWRlZEluOiAnb3JnJ2ApIOKAlCB0aGUgc3Vic2V0IG9mIHtAbGluayBTRUVEX0JVTkRMRVN9IGhlbGQgYnlcbiAqIHRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLlxuICpcbiAqIFNlZWRlZCByYXRoZXIgdGhhbiBvZmZlcmVkIGFzIGEge0BsaW5rIFJPTEVfVEVNUExBVEVTfSBlbnRyeSwgdW5saWtlIHRoZVxuICogdGVuYW50IGpvYiBwcmVzZXRzLCBiZWNhdXNlIHRoZXkgYXJlIHN0cnVjdHVyYWw6IHRoZSBDTEkgZ3JhbnRzIG9uZSB0byB0aGVcbiAqIGFjY291bnQgaXQgY3JlYXRlcyBhbmQgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgbW92ZXMgZXhpc3RpbmcgYWNjb3VudHMgb250byBpdCxcbiAqIGFuZCBib3RoIGhhdmUgdG8gZmluZCBpdCBpbiBFVkVSWSBvcmcgYnkgYSBzdGFibGUgaWRlbnRpdHkuIEEgdGVtcGxhdGUgbGVhdmVzXG4gKiBub3RoaW5nIHRvIGZpbmQgdW50aWwgc29tZWJvZHkgaW5zdGFudGlhdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgT1JHX0FVVE9NQVRJT05fQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBTRUVEX0JVTkRMRV9JRFMuZmlsdGVyKChpZCkgPT4gU0VFRF9CVU5ETEVTW2lkXS5zZWVkZWRJbiA9PT0gJ29yZycpO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGFjY291bnRzIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zLCBrZXllZCBieVxuICogYWNjb3VudCBuYW1lLCBhbmQgdGhlIGJ1aWx0LWluIFJvbGUgZWFjaCBob2xkcyDigJQgYG51bGxgIGZvciBhbiBhY2NvdW50IHdob3NlXG4gKiBrZXkgY2FycmllcyBhIGNhcGFiaWxpdHkgU0NPUEUgKGEgYFRva2VuU2NvcGVgKSBhbmQgc28gbmVlZHMgbm8gUm9sZSBhdCBhbGwuXG4gKlxuICogT25lIHRhYmxlIGZvciB0aGUgQ0xJICh3aGljaCBSb2xlIHRvIGdyYW50IGEgTkVXIGFjY291bnQpIGFuZCB0aGUgcGxhdGZvcm0nc1xuICogc3RhcnR1cCBiYWNrZmlsbCAod2hpY2ggUm9sZSB0byBtb3ZlIGFuIEVYSVNUSU5HIGFjY291bnQgb250bywgb2ZmIHRoZSBvcmdcbiAqIGFkbWluIFJvbGUgdGhlc2UgYWNjb3VudHMgd2VyZSBvbmNlIGdpdmVuKS4gQSByZW5hbWUgaGVyZSBtb3ZlcyBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQVVUT01BVElPTl9BQ0NPVU5UX0JVTkRMRVMgPSB7XG4gICdwbGF0Zm9ybS1hdXRvbWF0aW9uJzogJ3BpcGVsaW5lX2F1dG9tYXRpb24nLFxuICAncGlwZWxpbmUtcmVnaXN0ZXInOiAncGlwZWxpbmVfcmVnaXN0cmF0aW9uJyxcbiAgJ3JlcG9ydGluZy1pbmdlc3QnOiBudWxsLFxuICAncmVnaXN0cnktcHVzaCc6IG51bGwsXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBTZWVkQnVuZGxlSWQgfCBudWxsPjtcbiJdfQ==
|