@mnaoumov/obsidian-lib 5.2.0 → 6.0.0
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/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +1 -1
- package/dist/lib/cjs/__merged.cjs +8 -24
- package/dist/lib/cjs/__merged.d.cts +4 -4
- package/dist/lib/cjs/async-with-notice.cjs +7 -7
- package/dist/lib/cjs/backlink-index.cjs +3 -3
- package/dist/lib/cjs/callout.cjs +2 -2
- package/dist/lib/cjs/case-insensitive-file-index.cjs +5 -5
- package/dist/lib/cjs/community-plugins.cjs +3 -3
- package/dist/lib/cjs/components/async-error-handler-component.cjs +2 -2
- package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
- package/dist/lib/cjs/components/plugin-context-component.cjs +1 -3
- package/dist/lib/cjs/components/plugin-context-component.d.cts +1 -2
- package/dist/lib/cjs/components/plugin-gate-component.cjs +15 -15
- package/dist/lib/cjs/components/plugin-notice-component.cjs +75 -7
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +24 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +7 -5
- package/dist/lib/cjs/components/release-notes-component.cjs +2 -2
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +10 -10
- package/dist/lib/cjs/css-class.cjs +2 -2
- package/dist/lib/cjs/css-class.d.cts +8 -11
- package/dist/lib/cjs/dataview.cjs +4 -4
- package/dist/lib/cjs/debug.cjs +2 -22
- package/dist/lib/cjs/debug.d.cts +0 -5
- package/dist/lib/cjs/frontmatter.cjs +3 -3
- package/dist/lib/cjs/frontmatter.d.cts +1 -1
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/html-element.cjs +1 -1
- package/dist/lib/cjs/html-element.d.cts +1 -1
- package/dist/lib/cjs/i18n/i18n.cjs +1 -1
- package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +2 -2
- package/dist/lib/cjs/i18n/locales/en.d.cts +1 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -1
- package/dist/lib/cjs/index.cjs +4 -4
- package/dist/lib/cjs/index.d.cts +1 -1
- package/dist/lib/cjs/library-styles.cjs +7 -14
- package/dist/lib/cjs/library-styles.d.cts +9 -23
- package/dist/lib/cjs/library.cjs +1 -4
- package/dist/lib/cjs/library.d.cts +3 -11
- package/dist/lib/cjs/link.cjs +3 -3
- package/dist/lib/cjs/markdown.cjs +3 -3
- package/dist/lib/cjs/metadata-cache.cjs +4 -4
- package/dist/lib/cjs/modals/alert.cjs +2 -2
- package/dist/lib/cjs/modals/confirm.cjs +3 -3
- package/dist/lib/cjs/modals/prompt.cjs +3 -3
- package/dist/lib/cjs/obsidian-lib-state.cjs +148 -0
- package/dist/lib/cjs/obsidian-lib-state.d.cts +30 -0
- package/dist/lib/cjs/path-settings.cjs +6 -6
- package/dist/lib/cjs/plugin/index.cjs +1 -4
- package/dist/lib/cjs/plugin/index.d.cts +0 -1
- package/dist/lib/cjs/plugin/plugin-api.cjs +3 -3
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -41
- package/dist/lib/cjs/plugin/plugin-context.cjs +1 -6
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +5 -5
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -40
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +8 -62
- package/dist/lib/cjs/plugin/plugin.cjs +2 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
- package/dist/lib/cjs/popovers/popover.cjs +3 -3
- package/dist/lib/cjs/queue.cjs +4 -4
- package/dist/lib/cjs/resource-lock.cjs +9 -9
- package/dist/lib/cjs/vault-delete.cjs +2 -2
- package/dist/lib/cjs/vault-transaction.cjs +17 -2
- package/dist/lib/cjs/vault-transaction.d.cts +2 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +1 -1
- package/dist/lib/esm/__merged.d.mts +4 -4
- package/dist/lib/esm/__merged.mjs +8 -24
- package/dist/lib/esm/async-with-notice.mjs +7 -7
- package/dist/lib/esm/backlink-index.mjs +3 -3
- package/dist/lib/esm/callout.mjs +2 -2
- package/dist/lib/esm/case-insensitive-file-index.mjs +5 -5
- package/dist/lib/esm/community-plugins.mjs +3 -3
- package/dist/lib/esm/components/async-error-handler-component.mjs +2 -2
- package/dist/lib/esm/components/monkey-around-component.mjs +3 -3
- package/dist/lib/esm/components/plugin-context-component.d.mts +1 -2
- package/dist/lib/esm/components/plugin-context-component.mjs +1 -3
- package/dist/lib/esm/components/plugin-gate-component.mjs +15 -15
- package/dist/lib/esm/components/plugin-notice-component.d.mts +24 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +75 -7
- package/dist/lib/esm/components/plugin-suggestion-component.mjs +7 -5
- package/dist/lib/esm/components/release-notes-component.mjs +2 -2
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +10 -10
- package/dist/lib/esm/css-class.d.mts +8 -11
- package/dist/lib/esm/css-class.mjs +2 -2
- package/dist/lib/esm/dataview.mjs +4 -4
- package/dist/lib/esm/debug.d.mts +0 -5
- package/dist/lib/esm/debug.mjs +3 -26
- package/dist/lib/esm/frontmatter.d.mts +1 -1
- package/dist/lib/esm/frontmatter.mjs +3 -3
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/html-element.d.mts +1 -1
- package/dist/lib/esm/html-element.mjs +1 -1
- package/dist/lib/esm/i18n/i18n.d.mts +1 -1
- package/dist/lib/esm/i18n/i18n.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +1 -1
- package/dist/lib/esm/i18n/locales/en.mjs +2 -2
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -1
- package/dist/lib/esm/index.d.mts +1 -1
- package/dist/lib/esm/index.mjs +3 -3
- package/dist/lib/esm/library-styles.d.mts +9 -23
- package/dist/lib/esm/library-styles.mjs +7 -12
- package/dist/lib/esm/library.d.mts +3 -11
- package/dist/lib/esm/library.mjs +1 -3
- package/dist/lib/esm/link.mjs +3 -3
- package/dist/lib/esm/markdown.mjs +3 -3
- package/dist/lib/esm/metadata-cache.mjs +4 -4
- package/dist/lib/esm/modals/alert.mjs +2 -2
- package/dist/lib/esm/modals/confirm.mjs +3 -3
- package/dist/lib/esm/modals/prompt.mjs +3 -3
- package/dist/lib/esm/obsidian-lib-state.d.mts +30 -0
- package/dist/lib/esm/obsidian-lib-state.mjs +59 -0
- package/dist/lib/esm/path-settings.mjs +6 -6
- package/dist/lib/esm/plugin/index.d.mts +0 -1
- package/dist/lib/esm/plugin/index.mjs +1 -3
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -41
- package/dist/lib/esm/plugin/plugin-api.mjs +3 -3
- package/dist/lib/esm/plugin/plugin-context.mjs +1 -7
- package/dist/lib/esm/plugin/plugin-install-state.mjs +5 -5
- package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +8 -62
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -37
- package/dist/lib/esm/plugin/plugin.d.mts +1 -1
- package/dist/lib/esm/plugin/plugin.mjs +2 -2
- package/dist/lib/esm/popovers/popover.mjs +3 -3
- package/dist/lib/esm/queue.mjs +4 -4
- package/dist/lib/esm/resource-lock.mjs +9 -9
- package/dist/lib/esm/vault-delete.mjs +2 -2
- package/dist/lib/esm/vault-transaction.d.mts +2 -1
- package/dist/lib/esm/vault-transaction.mjs +17 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/styles.css +174 -168
- package/package.json +1 -1
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +0 -177
- package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +0 -50
- package/dist/lib/cjs/plugin/plugin-api-schema.cjs +0 -127
- package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +0 -37
- package/dist/lib/esm/obsidian-dev-utils-state.d.mts +0 -50
- package/dist/lib/esm/obsidian-dev-utils-state.mjs +0 -86
- package/dist/lib/esm/plugin/plugin-api-schema.d.mts +0 -37
- package/dist/lib/esm/plugin/plugin-api-schema.mjs +0 -41
- package/plugin/plugin-api-schema/package.json +0 -6
|
@@ -240,25 +240,25 @@ class PluginGateComponent extends ComponentEx {
|
|
|
240
240
|
if (this.isTooOld(dependency)) {
|
|
241
241
|
return this.createVersionMismatchMessage(dependency);
|
|
242
242
|
}
|
|
243
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
243
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.blockedNotice, {
|
|
244
244
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
245
245
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
246
246
|
}));
|
|
247
247
|
}
|
|
248
248
|
createConflictAppearedMessage(conflict) {
|
|
249
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
249
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginConflict.conflictAppearedNotice, {
|
|
250
250
|
conflictingPluginName: asCodeBlock(conflict.pluginName),
|
|
251
251
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
252
252
|
}));
|
|
253
253
|
}
|
|
254
254
|
createConflictBlockedMessage(conflict) {
|
|
255
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
255
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginConflict.blockedNotice, {
|
|
256
256
|
conflictingPluginName: asCodeBlock(conflict.pluginName),
|
|
257
257
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
258
258
|
}));
|
|
259
259
|
}
|
|
260
260
|
createConflictWarningMessage(conflict) {
|
|
261
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
261
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginConflict.warningNotice, {
|
|
262
262
|
conflictingPluginName: asCodeBlock(conflict.pluginName),
|
|
263
263
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
264
264
|
}));
|
|
@@ -267,13 +267,13 @@ class PluginGateComponent extends ComponentEx {
|
|
|
267
267
|
if (this.isTooOld(dependency)) {
|
|
268
268
|
return this.createVersionMismatchMessage(dependency);
|
|
269
269
|
}
|
|
270
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
270
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.dependencyLostNotice, {
|
|
271
271
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
272
272
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
273
273
|
}));
|
|
274
274
|
}
|
|
275
275
|
createVersionMismatchMessage(dependency) {
|
|
276
|
-
return createFragmentWithCodeBlocks(t(($) => $.
|
|
276
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.versionMismatchNotice, {
|
|
277
277
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
278
278
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
279
279
|
}));
|
|
@@ -424,11 +424,11 @@ class PluginGateComponent extends ComponentEx {
|
|
|
424
424
|
*/
|
|
425
425
|
renderBlockedBanner(containerEl, unsatisfiedDependencies, blockingConflicts) {
|
|
426
426
|
if (unsatisfiedDependencies.length > 0) {
|
|
427
|
-
containerEl.createEl("h2", { text: t(($) => $.
|
|
427
|
+
containerEl.createEl("h2", { text: t(($) => $.obsidianLib.pluginDependency.settingsHeading) });
|
|
428
428
|
}
|
|
429
429
|
for (const dependency of unsatisfiedDependencies) {
|
|
430
430
|
const bannerEl = containerEl.createDiv({
|
|
431
|
-
cls: [CssClass.LibraryName, CssClass.
|
|
431
|
+
cls: [CssClass.LibraryName, CssClass.PluginDependencyBanner]
|
|
432
432
|
});
|
|
433
433
|
bannerEl.append(this.createBlockedMessage(dependency));
|
|
434
434
|
appendTextOrFragmentClone(bannerEl.createDiv(), dependency.reason);
|
|
@@ -438,7 +438,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
438
438
|
});
|
|
439
439
|
if (state !== InstalledPluginState.Enabled) {
|
|
440
440
|
new ButtonComponent(bannerEl).setButtonText(t(
|
|
441
|
-
($) => state === InstalledPluginState.InstalledButDisabled ? $.
|
|
441
|
+
($) => state === InstalledPluginState.InstalledButDisabled ? $.obsidianLib.pluginSuggestion.enable : $.obsidianLib.pluginSuggestion.install
|
|
442
442
|
)).setCta().onClick(convertAsyncToSync(async () => {
|
|
443
443
|
await installAndEnablePlugin({
|
|
444
444
|
app: this.app,
|
|
@@ -449,7 +449,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
449
449
|
}));
|
|
450
450
|
continue;
|
|
451
451
|
}
|
|
452
|
-
new ButtonComponent(bannerEl).setButtonText(t(($) => $.
|
|
452
|
+
new ButtonComponent(bannerEl).setButtonText(t(($) => $.obsidianLib.pluginDependency.update, { dependencyPluginName: dependency.pluginName })).setCta().onClick(convertAsyncToSync(async () => {
|
|
453
453
|
await updatePlugin({
|
|
454
454
|
app: this.app,
|
|
455
455
|
pluginId: dependency.pluginId,
|
|
@@ -463,7 +463,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
463
463
|
if (blockingConflicts.length === 0) {
|
|
464
464
|
return;
|
|
465
465
|
}
|
|
466
|
-
containerEl.createEl("h2", { text: t(($) => $.
|
|
466
|
+
containerEl.createEl("h2", { text: t(($) => $.obsidianLib.pluginConflict.settingsHeading) });
|
|
467
467
|
for (const conflict of blockingConflicts) {
|
|
468
468
|
this.renderConflictEntry(containerEl, conflict, this.createConflictBlockedMessage(conflict));
|
|
469
469
|
}
|
|
@@ -481,11 +481,11 @@ class PluginGateComponent extends ComponentEx {
|
|
|
481
481
|
*/
|
|
482
482
|
renderConflictEntry(containerEl, conflict, messageFragment) {
|
|
483
483
|
const bannerEl = containerEl.createDiv({
|
|
484
|
-
cls: [CssClass.LibraryName, CssClass.
|
|
484
|
+
cls: [CssClass.LibraryName, CssClass.PluginConflictBanner]
|
|
485
485
|
});
|
|
486
486
|
bannerEl.append(messageFragment);
|
|
487
487
|
appendTextOrFragmentClone(bannerEl.createDiv(), conflict.reason);
|
|
488
|
-
new ButtonComponent(bannerEl).setButtonText(t(($) => $.
|
|
488
|
+
new ButtonComponent(bannerEl).setButtonText(t(($) => $.obsidianLib.pluginConflict.disable, { conflictingPluginName: conflict.pluginName })).setCta().onClick(convertAsyncToSync(async () => {
|
|
489
489
|
await disableCommunityPlugin({
|
|
490
490
|
app: this.app,
|
|
491
491
|
pluginId: conflict.pluginId
|
|
@@ -495,7 +495,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
495
495
|
this.renderOpenSettingsButton(bannerEl, conflict.pluginId, conflict.pluginName);
|
|
496
496
|
}
|
|
497
497
|
renderOpenSettingsButton(bannerEl, pluginId, pluginName) {
|
|
498
|
-
new ButtonComponent(bannerEl).setButtonText(t(($) => $.
|
|
498
|
+
new ButtonComponent(bannerEl).setButtonText(t(($) => $.obsidianLib.pluginDependency.openDependencySettings, {
|
|
499
499
|
dependencyPluginName: pluginName
|
|
500
500
|
})).onClick(() => {
|
|
501
501
|
this.app.setting.open();
|
|
@@ -520,4 +520,4 @@ export {
|
|
|
520
520
|
PluginConflictSeverity,
|
|
521
521
|
PluginGateComponent
|
|
522
522
|
};
|
|
523
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luRGVwZW5kZW5jeS5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEFwcGVhcmVkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luQ29uZmxpY3QuY29uZmxpY3RBcHBlYXJlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkNvbmZsaWN0Lndhcm5pbmdOb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luRGVwZW5kZW5jeS5kZXBlbmRlbmN5TG9zdE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luRGVwZW5kZW5jeS5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuTGVnYWN5TGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5lbmFibGVcbiAgICAgICAgICAgICAgOiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsXG4gICAgICAgICAgKSlcbiAgICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbih7XG4gICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkLFxuICAgICAgICAgICAgICBwbHVnaW5OYW1lOiBkZXBlbmRlbmN5LnBsdWdpbk5hbWUsXG4gICAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ic2lkaWFuIGFwcGxpZXMgdGhlIHVwZGF0ZSBieSByZWxvYWRpbmcgdGhlIGRlcGVuZGVuY3ksIHdoaWNoIHJlcHVibGlzaGVzIGl0cyBBUEksIHNvIHRoZSB3YXRjaCdzXG4gICAgICAvLyBgY2hhbmdlYCByZW9wZW5zIHRoZSBnYXRlIHdpdGggbm8gZnVydGhlciBzdGVwIGhlcmUuXG4gICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luQ29uZmxpY3Quc2V0dGluZ3NIZWFkaW5nKSB9KTtcblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgYmxvY2tpbmdDb25mbGljdHMpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbCwgY29uZmxpY3QsIHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIG9uZSBjb25mbGljdDogd2hhdCBpdCBpcywgd2h5IGl0IG1hdHRlcnMsIGFuZCB0aGUgdHdvIHdheXMgb3V0IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWlyIGlzIG9mZmVyZWQgb24gdGhlIE9USEVSIHBsdWdpbiDigJQgZGlzYWJsaW5nIGl0IGlzIHRoZSBvbmUgdGhpbmcgdGhpcyBwbHVnaW4gY2FuIGRvIGluIGFcbiAgICogY2xpY2ssIHNpbmNlIGl0IGNhbm5vdCB1cGRhdGUgc29tZW9uZSBlbHNlJ3MgcGx1Z2luIOKAlCBhbmQgaXQgaXMgdGhlIHBlcnNpc3RlZCBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgXG4gICAqIHJhdGhlciB0aGFuIHRoZSB0cmFuc2llbnQgZGlzYWJsZSwgYmVjYXVzZSB0aGUgdXNlciBhc2tlZCBmb3IgaXQgYnkgY2xpY2tpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgY29uZmxpY3QgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gbWVzc2FnZUZyYWdtZW50IC0gVGhlIHNlbnRlbmNlIGV4cGxhaW5pbmcgdGhlIGNvbmZsaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0LCBtZXNzYWdlRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuTGVnYWN5TGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkNvbmZsaWN0LmRpc2FibGUsIHsgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBjb25mbGljdC5wbHVnaW5OYW1lIH0pKVxuICAgICAgLnNldEN0YSgpXG4gICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiBjb25mbGljdC5wbHVnaW5JZFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgY29uZmxpY3QucGx1Z2luSWQsIGNvbmZsaWN0LnBsdWdpbk5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW5JZDogc3RyaW5nLCBwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkRlcGVuZGVuY3kub3BlbkRlcGVuZGVuY3lTZXR0aW5ncywge1xuICAgICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogcGx1Z2luTmFtZVxuICAgICAgfSkpXG4gICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlbigpO1xuICAgICAgICB0aGlzLmFwcC5zZXR0aW5nLm9wZW5UYWJCeUlkKHBsdWdpbklkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93QmxvY2tlZFNldHRpbmdUYWIoXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFkZGVkIHRocm91Z2ggYGFwcC5zZXR0aW5nYCByYXRoZXIgdGhhbiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgLCBiZWNhdXNlIHRoaXMgdGFiIGhhcyB0byBjb21lIGJhY2tcbiAgICAvLyBPRkYgYWdhaW4gdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucyDigJQgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBvd24gc2V0dGluZ3MgdGFiLCByZWdpc3RlcmVkIGJ5XG4gICAgLy8gYG9ubG9hZEltcGxgLCB3b3VsZCBhcHBlYXIgYmVzaWRlIGEgc3RhbGUgXCJyZXF1aXJlZCBwbHVnaW4gbWlzc2luZ1wiIG9uZS4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYFxuICAgIC8vIG9ubHkgZXZlciByZW1vdmVzIGF0IHBsdWdpbiB1bmxvYWQuXG4gICAgY29uc3QgYmxvY2tlZFNldHRpbmdUYWIgPSBuZXcgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIoe1xuICAgICAgcGx1Z2luOiB0aGlzLnBsdWdpbixcbiAgICAgIHJlbmRlckJhbm5lcjogKGNvbnRhaW5lckVsKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyQmxvY2tlZEJhbm5lcihjb250YWluZXJFbCwgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmFwcC5zZXR0aW5nLmFkZFNldHRpbmdUYWIoYmxvY2tlZFNldHRpbmdUYWIpO1xuICAgIHRoaXMuYmxvY2tlZFNldHRpbmdUYWIgPSBibG9ja2VkU2V0dGluZ1RhYjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBGQSxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0UsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLE9BQ1I7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVNQLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuYmxvY2tlZE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5jb25mbGljdEFwcGVhcmVkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC53YXJuaW5nTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgaWYgKHRoaXMuaXNUb29PbGQoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEZBLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRSxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsT0FDUjtBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0NBQW9DO0FBUTdDLE1B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QVU7QUFBQSxJQUNwRjtBQUVBLFFBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQztBQUFBLElBQ0Y7QUFFQSxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWUsRUFBRSxDQUFDO0FBRTNGLGVBQVcsWUFBWSxtQkFBbUI7QUFDeEMsV0FBSyxvQkFBb0IsYUFBYSxVQUFVLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQzdGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFRLG9CQUFvQixhQUEwQixVQUEwQixpQkFBeUM7QUFDdkgsVUFBTSxXQUFXLFlBQVksVUFBVTtBQUFBLE1BQ3JDLEtBQUssQ0FBQyxTQUFTLGFBQWEsU0FBUyxvQkFBb0I7QUFBQSxJQUMzRCxDQUFDO0FBQ0QsYUFBUyxPQUFPLGVBQWU7QUFDL0IsOEJBQTBCLFNBQVMsVUFBVSxHQUFHLFNBQVMsTUFBTTtBQUUvRCxRQUFJLGdCQUFnQixRQUFRLEVBQ3pCLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQzVHLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLFlBQU0sdUJBQXVCO0FBQUEsUUFDM0IsS0FBSyxLQUFLO0FBQUEsUUFDVixVQUFVLFNBQVM7QUFBQSxNQUNyQixDQUFDO0FBQ0QsWUFBTSxLQUFLLFFBQVE7QUFBQSxJQUNyQixDQUFDLENBQUM7QUFFSixTQUFLLHlCQUF5QixVQUFVLFNBQVMsVUFBVSxTQUFTLFVBQVU7QUFBQSxFQUNoRjtBQUFBLEVBRVEseUJBQXlCLFVBQXVCLFVBQWtCLFlBQTBCO0FBQ2xHLFFBQUksZ0JBQWdCLFFBQVEsRUFDekIsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLHdCQUF3QjtBQUFBLE1BQzdFLHNCQUFzQjtBQUFBLElBQ3hCLENBQUMsQ0FBQyxFQUNELFFBQVEsTUFBTTtBQUNiLFdBQUssSUFBSSxRQUFRLEtBQUs7QUFDdEIsV0FBSyxJQUFJLFFBQVEsWUFBWSxRQUFRO0FBQUEsSUFDdkMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVRLHNCQUNOLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSxLQUFLLG1CQUFtQjtBQUMxQjtBQUFBLElBQ0Y7QUFNQSxVQUFNLG9CQUFvQixJQUFJLHdCQUF3QjtBQUFBLE1BQ3BELFFBQVEsS0FBSztBQUFBLE1BQ2IsY0FBYyxDQUFDLGdCQUFzQjtBQUNuQyxhQUFLLG9CQUFvQixhQUFhLHlCQUF5QixpQkFBaUI7QUFBQSxNQUNsRjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssSUFBSSxRQUFRLGNBQWMsaUJBQWlCO0FBQ2hELFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFDRjsiLCJuYW1lcyI6WyJQbHVnaW5Db25mbGljdFNldmVyaXR5Il19
|
|
@@ -234,7 +234,8 @@ export declare class PluginNoticeComponent extends ComponentEx {
|
|
|
234
234
|
/**
|
|
235
235
|
* Displays a notice message to the user.
|
|
236
236
|
*
|
|
237
|
-
* @param message - The message to display.
|
|
237
|
+
* @param message - The message to display. The notice shows the plugin name above it, so a leading
|
|
238
|
+
* `<plugin name>:` in the message is dropped rather than shown twice.
|
|
238
239
|
* @param options - The options for displaying the notice.
|
|
239
240
|
* @returns The notice object.
|
|
240
241
|
*/
|
|
@@ -320,6 +321,15 @@ export declare class PluginNoticeComponent extends ComponentEx {
|
|
|
320
321
|
private buildPrefixedMessage;
|
|
321
322
|
private getPermanentNotice;
|
|
322
323
|
private getPermanentNotices;
|
|
324
|
+
/**
|
|
325
|
+
* Measures a leading `<plugin name>:` in a message, together with the whitespace around the colon and
|
|
326
|
+
* after it.
|
|
327
|
+
*
|
|
328
|
+
* @param text - The message text.
|
|
329
|
+
* @returns The length of the prefix, or `0` when the text does not open with this plugin's name and a
|
|
330
|
+
* colon.
|
|
331
|
+
*/
|
|
332
|
+
private getPluginNamePrefixLength;
|
|
323
333
|
/**
|
|
324
334
|
* Makes a notice hard to close: marks its outer element (so the CSS neutralizes its padding) and
|
|
325
335
|
* installs a capture-phase click guard that stops every click except on an interactive element (a
|
|
@@ -353,6 +363,19 @@ export declare class PluginNoticeComponent extends ComponentEx {
|
|
|
353
363
|
* @returns The {@link PluginNoticeComponentShownNotice} describing where the message ended up.
|
|
354
364
|
*/
|
|
355
365
|
private showNoticeWithDuration;
|
|
366
|
+
/**
|
|
367
|
+
* Drops a leading `<plugin name>:` from a message. The notice already opens with the plugin name in its
|
|
368
|
+
* own styled header, so a message that repeats it reads as the name twice.
|
|
369
|
+
*
|
|
370
|
+
* A fragment is matched on its text, so a name wrapped in an element (such as inline code) still
|
|
371
|
+
* counts; the prefix is cut out of its text nodes, and an element it leaves empty is removed. The name
|
|
372
|
+
* is matched exactly, and only at the start: a message that merely mentions the name later is left
|
|
373
|
+
* alone.
|
|
374
|
+
*
|
|
375
|
+
* @param message - The message.
|
|
376
|
+
* @returns The message without the prefix. A fragment is changed in place and returned.
|
|
377
|
+
*/
|
|
378
|
+
private stripPluginNamePrefix;
|
|
356
379
|
/**
|
|
357
380
|
* Wraps a notice's `hide` so the given callback runs the first time the notice is hidden — by the
|
|
358
381
|
* user, by a replacing notice, by its duration elapsing, or on unload. Does nothing when no callback
|