@sapui5/sap.fe.templates 1.148.0 → 1.149.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.
Files changed (38) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListComponent.js +2 -5
  5. package/src/sap/fe/templates/ListReport/Component.js +2 -5
  6. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +84 -14
  7. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +88 -13
  8. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +41 -1
  9. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +43 -0
  10. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -2
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +12 -11
  12. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +8 -5
  13. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -7
  14. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  15. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +12 -6
  16. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +14 -6
  17. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +7 -1
  18. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +5 -0
  19. package/src/sap/fe/templates/ObjectPage/Component.js +12 -15
  20. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +15 -9
  21. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +7 -3
  22. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +81 -47
  23. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +72 -26
  24. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +5 -15
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +2 -12
  26. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +10 -3
  27. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +12 -1
  28. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +2 -5
  29. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +2 -5
  30. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +11 -8
  31. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +9 -1
  32. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -1
  33. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +2 -2
  34. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +2 -2
  35. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +0 -4
  36. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +0 -1
  37. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +0 -1
  38. package/src/sap/fe/templates/library.js +1 -1
@@ -2,11 +2,12 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2026 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/PageController", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/controllerextensions/cards/CollaborationManager", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/macros/CommonHelper", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/ui/Device", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "./overrides/CollaborationManager", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ClassSupport, ActionRuntime, CommonUtils, PageController, BusyLocker, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, CollaborationManager, draft, UiModelConstants, NavigationReason, ConfirmRecommendationDialog, ModelHelper, FELibrary, CommonHelper, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, CollaborationDiscard, SectionNavigationHelper, TableScroller, InstanceManager, Device, UI5Element, Library, Messaging, Message, MessageType, OverrideExecution, CollaborationManagerOverride, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/PageController", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/controllerextensions/cards/CollaborationManager", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/macros/CommonHelper", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/ui/Device", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "./overrides/CollaborationManager", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ClassSupport, ActionRuntime, CommonUtils, PageController, BusyLocker, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, CollaborationManager, draft, UiModelConstants, NavigationReason, ConfirmRecommendationDialog, ManifestSettings, ModelHelper, FELibrary, CommonHelper, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, CollaborationDiscard, SectionNavigationHelper, TableScroller, InstanceManager, Device, UI5Element, Library, Messaging, Message, MessageType, OverrideExecution, CollaborationManagerOverride, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _dec11, _dec12, _dec13, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor0;
9
9
  var pollForSectionStability = SectionNavigationHelper.pollForSectionStability;
10
+ var CreationMode = ManifestSettings.CreationMode;
10
11
  var RecommendationDialogDecision = ConfirmRecommendationDialog.RecommendationDialogDecision;
11
12
  var usingExtension = ClassSupport.usingExtension;
12
13
  var publicExtension = ClassSupport.publicExtension;
@@ -29,16 +30,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
29
30
  const bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
30
31
  return bIsStickyEditMode ? "explace" : undefined;
31
32
  }
32
- })), _dec10 = usingExtension(ViewState.override(ViewStateOverrides)), _dec11 = usingExtension(PageReady.override({
33
+ })), _dec0 = usingExtension(ViewState.override(ViewStateOverrides)), _dec1 = usingExtension(PageReady.override({
33
34
  isContextExpected: function () {
34
35
  return true;
35
36
  }
36
- })), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
37
- function ObjectPageController() {
37
+ })), _dec10 = publicExtension(), _dec11 = finalExtension(), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
38
+ function ObjectPageController(...args) {
38
39
  var _this;
39
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
40
- args[_key] = arguments[_key];
41
- }
42
40
  _this = _PageController.call(this, ...args) || this;
43
41
  _initializerDefineProperty(_this, "placeholder", _descriptor, _this);
44
42
  _initializerDefineProperty(_this, "share", _descriptor2, _this);
@@ -49,11 +47,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
49
47
  _initializerDefineProperty(_this, "collaborationManager", _descriptor7, _this);
50
48
  _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor8, _this);
51
49
  _initializerDefineProperty(_this, "viewState", _descriptor9, _this);
52
- _initializerDefineProperty(_this, "pageReady", _descriptor10, _this);
50
+ _initializerDefineProperty(_this, "pageReady", _descriptor0, _this);
53
51
  _this.invalidateTitleHierarchyCacheSetUp = false;
54
52
  _this.mergePatchDraft = false;
55
- // Tracks if initial ObjectPage load has completed
56
- _this.hasInitialLoadCompleted = false;
53
+ // Flag to prevent ViewState.apply() from overriding section selection after user interaction or targetControlId navigation
54
+ _this.skipViewStateSectionRestore = false;
55
+ // Tracks if the binding context path changed (new entity vs same entity re-binding)
56
+ _this.isNewBindingContext = false;
57
57
  _this.handlers = {
58
58
  onPrimaryAction(oController, oView, oContext, sActionName, mParameters, mConditions) {
59
59
  /**
@@ -201,6 +201,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
201
201
  onNavigateChange(oEvent) {
202
202
  //will be called always when we click on a section tab
203
203
  this.bSectionNavigated = true;
204
+
205
+ // Prevent ViewState from overriding the user's manual tab selection.
206
+ // This is important after discard when ViewState.apply might try to restore the previous section.
207
+ this.skipViewStateSectionRestore = true;
204
208
  const subSection = oEvent.getParameter("subSection");
205
209
  this.targetSubSection = subSection;
206
210
  this.getExtensionAPI().updateAppState();
@@ -264,8 +268,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
264
268
  * @param onlyActionable If true, only actionable (enabled) candidates are returned
265
269
  * @returns An array of controls that are candidates for primary action shortcuts
266
270
  */
267
- _proto._getPrimaryActionShortcutCandidates = function _getPrimaryActionShortcutCandidates(root) {
268
- let onlyActionable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
271
+ _proto._getPrimaryActionShortcutCandidates = function _getPrimaryActionShortcutCandidates(root, onlyActionable = false) {
269
272
  return root.findAggregatedObjects(true, object => {
270
273
  const isButton = object.isA("sap.m.Button");
271
274
  const isMenuButton = object.isA("sap.m.MenuButton");
@@ -392,7 +395,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
392
395
  }
393
396
  const tableType = table.isA("sap.ui.mdc.Table") && table.getType();
394
397
  const tableAPI = table.getParent()?.isA("sap.fe.macros.Table") ? table.getParent() : undefined;
395
- if (tableType && (tableType?.isA("sap.ui.mdc.table.GridTableType") || tableType?.isA("sap.ui.mdc.table.TreeTableType")) && tableAPI?.getTableDefinition().control.rowCountMode === "Auto") {
398
+ const tableControl = tableAPI?.getTableDefinition().control;
399
+ if (tableType && (tableType?.isA("sap.ui.mdc.table.GridTableType") || tableType?.isA("sap.ui.mdc.table.TreeTableType")) && tableControl?.rowCountMode === "Auto" && (
400
+ // Exclude CreationRow mode unless sectionLayout is Tabs: the fit-container style creates whitespace in the subsection in edit mode when CreationRow is used in TableCreationOptions
401
+ tableControl?.creationMode !== CreationMode.CreationRow || this.getView().getViewData().sectionLayout === "Tabs")) {
396
402
  //In case there is only a single table in a subSection we fit that to the whole page so that the scrollbar comes only on table and not on page
397
403
  visibleSubSection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
398
404
  visibleSubSection.detachEvent("modelContextChange", changeClassForTables, this);
@@ -466,13 +472,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
466
472
  this.checkSectionsForNonResponsiveTable(subSections);
467
473
  }
468
474
  };
469
- _proto._onBeforeBinding = function _onBeforeBinding(oContext) {
470
- let mParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
475
+ _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters = {}) {
476
+ // Reset flag to allow section restoration on this new binding context.
477
+ // This ensures ViewState.apply() can properly restore sections after discard or re-navigation.
478
+ this.skipViewStateSectionRestore = false;
479
+
471
480
  // Store targetControlId for scrolling after binding completes
472
481
  this.pendingTargetControlId = mParameters.targetControlId;
473
482
 
474
- // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
475
- this.previousBindingContextPath = this.getView().getBindingContext()?.getPath();
483
+ // Apply targetControlId only on initial navigation - don't apply during edit/save/discard transitions
484
+ // to preserve user's section selection. Note: getView().getBindingContext() returns the OLD context
485
+ // therefore the oContext parameter is used.
486
+ const currentContextPath = oContext?.getPath();
487
+ const getEntityIdentity = path => {
488
+ if (!path) return undefined;
489
+ // Remove IsActiveEntity from the path to get entity identity
490
+ // e.g., "/Products(ID=1,IsActiveEntity=true)" -> "/Products(ID=1)"
491
+ return path.replace(/,?IsActiveEntity=(true|false),?/, "").replace(/\(\s*,/, "(").replace(/,\s*\)/, ")");
492
+ };
493
+ const currentEntityId = getEntityIdentity(currentContextPath);
494
+ const previousEntityId = getEntityIdentity(this.previousBindingContextPath);
495
+ this.isNewBindingContext = previousEntityId !== currentEntityId;
496
+ this.previousBindingContextPath = currentContextPath;
476
497
  const aTables = this._findTables(),
477
498
  oObjectPage = this._getObjectPageLayoutControl(),
478
499
  oInternalModelContext = this.getView().getBindingContext("internal"),
@@ -634,6 +655,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
634
655
  // SubSection's contents binding is disabled.
635
656
  blocks.forEach(block => {
636
657
  if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
658
+ // Set binding context to null on both the block and its content
659
+ // to support both: subsections with UI.Hidden annotation (content needs to be cleared)
660
+ // and customer controller extensions that set binding context on the block level
661
+ block.setBindingContext(undefined);
637
662
  block.content.setBindingContext?.(null);
638
663
  } else {
639
664
  block.setBindingContext(null);
@@ -707,8 +732,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
707
732
  * @param aSubSections Object page sub sections
708
733
  * @param fromTabNavigation Indicates if the focus is set after a tab navigation
709
734
  */;
710
- _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
711
- let fromTabNavigation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
735
+ _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections, fromTabNavigation = false) {
712
736
  setTimeout(function () {
713
737
  // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
714
738
  const oObjectPage = this._getObjectPageLayoutControl();
@@ -774,6 +798,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
774
798
  const blocks = oSubSection.getBlocks();
775
799
  blocks.forEach(block => {
776
800
  if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
801
+ // Set binding context to undefined on both the block and its content
802
+ // to support both: subsections with UI.Hidden annotation (content needs to be cleared)
803
+ // and customer controller extensions that set binding context on the block level
804
+ block.setBindingContext(undefined);
777
805
  block.content.setBindingContext?.(undefined);
778
806
  } else {
779
807
  block.setBindingContext(undefined);
@@ -816,12 +844,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
816
844
  });
817
845
  } else {
818
846
  const hiddenDraftEnabled = this.getAppComponent()?.getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft?.enabled;
819
- draft.processDataLossOrDraftDiscardConfirmation(navBack, Function.prototype, oContext, this, true, draft.NavigationType.BackNavigation, undefined, hiddenDraftEnabled ? true : undefined);
847
+ draft.processDataLossOrDraftDiscardConfirmation(() => {
848
+ if (this.getAppComponent().getRouterProxy().checkIfBackIsOutOfGuard()) {
849
+ this.editFlow.handleSessionOff();
850
+ }
851
+ navBack();
852
+ }, Function.prototype, oContext, this, true, draft.NavigationType.BackNavigation, undefined, hiddenDraftEnabled ? true : undefined, undefined,
853
+ // `navigationType` (BackNavigation above) still drives the non-FCL paths inside
854
+ // processDraftAdminData (e.g. processNoActiveEntityMode / processEditingDraftForExistingEntity).
855
+ // `draftDataLossStrategy` is consumed by the FCL branch (processFclMode) only — both are needed.
856
+ {
857
+ withoutChanges: draft.DraftDataLossOptions.Discard
858
+ });
820
859
  }
821
860
  }
822
861
 
823
862
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
824
- ;
863
+ ;
825
864
  _proto._onAfterBinding = function _onAfterBinding(inputBindingContext, mParameters) {
826
865
  const view = this.getView();
827
866
  const viewLevel = view?.getViewData()?.viewLevel;
@@ -1029,27 +1068,24 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1029
1068
 
1030
1069
  // Skip polling if already on target section (navigation was no-op or succeeded immediately)
1031
1070
  if (oObjectPage.getSelectedSection() === targetSectionId) {
1032
- this.hasInitialLoadCompleted = true;
1071
+ this.skipViewStateSectionRestore = true;
1033
1072
  return;
1034
1073
  }
1035
1074
 
1036
- // Skip polling on subsequent navigations
1037
- if (this.hasInitialLoadCompleted) {
1038
- return;
1075
+ // Poll to detect UX rules reset only on new entity binding.
1076
+ // _adjustSelectedSectionByUXRules() only runs when ObjectPageLayout re-initializes with a new entity.
1077
+ if (this.isNewBindingContext) {
1078
+ pollForSectionStability({
1079
+ getSelectedSection: () => oObjectPage.getSelectedSection(),
1080
+ targetSectionId,
1081
+ onResetDetected: navigateToTarget
1082
+ }).then(() => {
1083
+ this.skipViewStateSectionRestore = true;
1084
+ return; // Required by linter rule promise/always-return
1085
+ }).catch(() => {
1086
+ // Required by linter rule promise/catch-or-return - polling failures are non-critical
1087
+ });
1039
1088
  }
1040
-
1041
- // Poll to detect UX rules reset during initial load
1042
- // Uses shared utility from helpers/SectionNavigationHelper.ts
1043
- pollForSectionStability({
1044
- getSelectedSection: () => oObjectPage.getSelectedSection(),
1045
- targetSectionId,
1046
- onResetDetected: navigateToTarget
1047
- }).then(() => {
1048
- this.hasInitialLoadCompleted = true;
1049
- return; // Required by linter rule promise/always-return
1050
- }).catch(() => {
1051
- // Required by linter rule promise/catch-or-return - polling failures are non-critical
1052
- });
1053
1089
  }
1054
1090
 
1055
1091
  /**
@@ -1100,8 +1136,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1100
1136
  * @param waitForVisibilityBindings Boolean indicating whether to wait for visibility bindings to be resolved before reconnecting observers
1101
1137
  * @returns A promise that resolves to true if the observers were reconnected, false otherwise
1102
1138
  */;
1103
- _proto.reconnectSubSectionVisibilityObservers = async function reconnectSubSectionVisibilityObservers(subSectionInfo, objectPageLayout, waitForApplyAppstate) {
1104
- let waitForVisibilityBindings = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
1139
+ _proto.reconnectSubSectionVisibilityObservers = async function reconnectSubSectionVisibilityObservers(subSectionInfo, objectPageLayout, waitForApplyAppstate, waitForVisibilityBindings = true) {
1105
1140
  if (!this.getDisableObjectPageRequestOptimization() && subSectionInfo) {
1106
1141
  await Promise.all(waitForVisibilityBindings ? this.waitForVisibilityBindings : []).then(async () => {
1107
1142
  objectPageLayout.setVisible(true);
@@ -1430,8 +1465,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1430
1465
  * @param byPassSideEffects Only the draft Validation step is executed
1431
1466
  * @returns Promise of the global validation
1432
1467
  */;
1433
- _proto.executeGlobalValidation = async function executeGlobalValidation(context) {
1434
- let byPassSideEffects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1468
+ _proto.executeGlobalValidation = async function executeGlobalValidation(context, byPassSideEffects = false) {
1435
1469
  const appComponent = this.getAppComponent();
1436
1470
  // the draft validation is treated as a user interaction, and the service must return transition messages again if still valid
1437
1471
  this.messageHandler.removeTransitionMessages();
@@ -1993,17 +2027,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1993
2027
  enumerable: true,
1994
2028
  writable: true,
1995
2029
  initializer: null
1996
- }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec10], {
2030
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec0], {
1997
2031
  configurable: true,
1998
2032
  enumerable: true,
1999
2033
  writable: true,
2000
2034
  initializer: null
2001
- }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec11], {
2035
+ }), _descriptor0 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec1], {
2002
2036
  configurable: true,
2003
2037
  enumerable: true,
2004
2038
  writable: true,
2005
2039
  initializer: null
2006
- }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _class2)) || _class);
2040
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _class2)) || _class);
2007
2041
  return ObjectPageController;
2008
2042
  }, false);
2009
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZSIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiX2RlYzMiLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJfZGVjNCIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiX2RlYzUiLCJQYWdpbmF0b3IiLCJQYWdpbmF0b3JPdmVycmlkZSIsIl9kZWM2IiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiX2RlYzciLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIl9kZWM4IiwiQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIiwiX2RlYzkiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiX2RlYzEwIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiX2RlYzExIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJfZGVjMTIiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjMTMiLCJmaW5hbEV4dGVuc2lvbiIsIl9kZWMxNCIsIl9kZWMxNSIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9QYWdlQ29udHJvbGxlciIsIl90aGlzIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIl9kZXNjcmlwdG9yNSIsIl9kZXNjcmlwdG9yNiIsIl9kZXNjcmlwdG9yNyIsIl9kZXNjcmlwdG9yOCIsIl9kZXNjcmlwdG9yOSIsIl9kZXNjcmlwdG9yMTAiLCJpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZVNldFVwIiwibWVyZ2VQYXRjaERyYWZ0IiwiaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQiLCJoYW5kbGVycyIsIm9uUHJpbWFyeUFjdGlvbiIsIm9Db250cm9sbGVyIiwib1ZpZXciLCJvQ29udGV4dCIsInNBY3Rpb25OYW1lIiwibVBhcmFtZXRlcnMiLCJtQ29uZGl0aW9ucyIsInByaW1hcnlDYW5kaWRhdGUiLCJfZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyIsImdldEVuYWJsZWQiLCJpc0EiLCJmaXJlUHJlc3MiLCJmaXJlRGVmYXVsdEFjdGlvbiIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsInBvc2l0aXZlQWN0aW9uVmlzaWJsZSIsInBvc2l0aXZlQWN0aW9uRW5hYmxlZCIsIm9uQ2FsbEFjdGlvbiIsImVkaXRBY3Rpb25WaXNpYmxlIiwiZWRpdEFjdGlvbkVuYWJsZWQiLCJfZWRpdERvY3VtZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRJc0VkaXRhYmxlIiwiX3NhdmVEb2N1bWVudCIsIl9hcHBseURvY3VtZW50Iiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJldmVudCIsInRhYmxlQVBJIiwiZ2V0U291cmNlIiwidGFibGUiLCJjb250ZW50IiwiY3VycmVudEFjdGlvblByb21pc2UiLCJlZGl0RmxvdyIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwidGFibGVDb250ZXh0cyIsIl9nZXRUYWJsZUJpbmRpbmciLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJhY3Rpb25SZXNwb25zZSIsImNvbnRyb2xJZCIsImdldElkIiwiYWN0aW9uRGF0YSIsIm9EYXRhIiwia2V5cyIsIm5ld0l0ZW0iLCJmaW5kIiwidGFibGVDb250ZXh0IiwidGFibGVEYXRhIiwiZ2V0T2JqZWN0IiwiZXZlcnkiLCJrZXkiLCJnZXRJbmRleCIsImRpYWxvZyIsIkluc3RhbmNlTWFuYWdlciIsImdldE9wZW5EaWFsb2dzIiwiZGF0YSIsImF0dGFjaEV2ZW50T25jZSIsImZvY3VzUm93IiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJlIiwiTG9nIiwiZXJyb3IiLCJtZXNzYWdlQnV0dG9uIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsIm9uVGFibGVCaW5kaW5nVXBkYXRlZCIsInN5bmNUYXNrIiwiaW52b2tlQWN0aW9uIiwidGhlbiIsInJlcyIsIl9zaG93TWVzc2FnZVBvcG92ZXIiLCJjYXRjaCIsIm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkIiwib1NvdXJjZSIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbnRyb2xDb25maWciLCJzQ29sbGVjdGlvblBhdGgiLCJKU09OIiwicGFyc2UiLCJvVGFyZ2V0SW5mbyIsIm9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsImFOYXZpZ2F0aW9uRGF0YSIsIl9nZXRDaGFydENvbnRleHREYXRhIiwiYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibWFwIiwib05hdmlnYXRpb25EYXRhIiwibWV0YVBhdGgiLCJwYXJhbWV0ZXJzIiwib1BhcmFtcyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRPdXRib3VuZFBhcmFtcyIsIk9iamVjdCIsImN1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZ2V0S2V5IiwiX2dldEltcGxpY2l0U2VtYW50aWNPYmplY3RNYXBwaW5nRm9yRGF0YVBvaW50cyIsImdldFZhbHVlIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib25OYXZpZ2F0ZUNoYW5nZSIsIm9FdmVudCIsImJTZWN0aW9uTmF2aWdhdGVkIiwic3ViU2VjdGlvbiIsImdldFBhcmFtZXRlciIsInRhcmdldFN1YlNlY3Rpb24iLCJnZXRFeHRlbnNpb25BUEkiLCJ1cGRhdGVBcHBTdGF0ZSIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNlY3Rpb25MYXlvdXQiLCJnZXRQcm9wZXJ0eSIsIl91cGRhdGVGb2N1c0luRWRpdE1vZGUiLCJvblZhcmlhbnRTZWxlY3RlZCIsIm9uVmFyaWFudFNhdmVkIiwic2V0VGltZW91dCIsIm5hdmlnYXRlVG9TdWJTZWN0aW9uIiwidkRldGFpbENvbmZpZyIsIm9EZXRhaWxDb25maWciLCJ0YXJnZXRJZCIsInN1YlNlY3Rpb25JZCIsInNlY3Rpb25JZCIsImNsb3NlQ29sbGFib3JhdGlvblN0cmlwIiwic2V0UHJvcGVydHkiLCJjbG9zZU9QTWVzc2FnZVN0cmlwIiwidmlldyIsImJJc0luRWRpdE1vZGUiLCJpbnRlcm5hbE1vZGVsIiwibWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQiLCJiaW5kQ29udGV4dCIsIl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgiLCJnZXRCb3VuZENvbnRleHQiLCJjb250ZXh0Qm91bmRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsImdldFBlcnNpc3RlbnQiLCJyZW1vdmVNZXNzYWdlcyIsImhpZGVNZXNzYWdlIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJyb290Iiwib25seUFjdGlvbmFibGUiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJvYmplY3QiLCJpc0J1dHRvbiIsImlzTWVudUJ1dHRvbiIsImN0cmwiLCJmbGFnIiwiZ2V0VmlzaWJsZSIsInNJZCIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiZ2V0T3duZXJDb21wb25lbnQiLCJwYWdlIiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsImdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbiIsImF0dGFjaEV2ZW50IiwiX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQiLCJiaW5kIiwiX2dldEFsbFN1YlNlY3Rpb25zIiwiZm9yRWFjaCIsImJ5SWQiLCJtZXNzYWdlQmluZGluZyIsImJpbmRMaXN0IiwiYXR0YWNoQ2hhbmdlIiwiX2ZuU2hvd09QTWVzc2FnZSIsIl9oYW5kbGVTbWFydFN1bW1hcnlTdGFydHVwQWN0aW9uIiwib25FeGl0IiwiZGVzdHJveSIsIm9NZXNzYWdlUG9wb3ZlciIsImlzT3BlbiIsImNsb3NlIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJkaXNjb25uZWN0IiwiZGV0YWNoQ2hhbmdlIiwiZ2V0QXBwQ29tcG9uZW50IiwiaXNTdXNwZW5kZWQiLCJtZXNzYWdlcyIsIl9zaG93TWVzc2FnZXMiLCJvVGFibGUiLCJnZXRSb3dCaW5kaW5nIiwiY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZSIsInN1YlNlY3Rpb25zIiwiY2hhbmdlQ2xhc3NGb3JUYWJsZXMiLCJ2aXNpYmxlU3ViU2VjdGlvbiIsImJsb2NrcyIsImdldEJsb2NrcyIsImdldE1vcmVCbG9ja3MiLCJzZWFyY2hUYWJsZUluQmxvY2siLCJ0YWJsZVR5cGUiLCJnZXRUeXBlIiwiZ2V0UGFyZW50IiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiY29udHJvbCIsInJvd0NvdW50TW9kZSIsImFkZFN0eWxlQ2xhc3MiLCJkZXRhY2hFdmVudCIsImJsb2NrIiwiZ2V0VGFibGVBUEkiLCJtYWluQ29udGVudCIsImdldE1haW5Db250ZW50IiwibWFpbkNvbnRlbnRUYWJsZUFQSSIsInNpZGVDb250ZW50IiwiZ2V0U2lkZUNvbnRlbnQiLCJzaWRlQ29udGVudFRhYmxlQVBJIiwib25CZWZvcmVSZW5kZXJpbmciLCJQYWdlQ29udHJvbGxlciIsImFwcGx5IiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsIkNvbW1vbkhlbHBlciIsInNldE1ldGFNb2RlbCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJnZXRVc2VJY29uVGFiQmFyIiwic2VjdGlvbnMiLCJnZXRTZWN0aW9ucyIsInNlY3Rpb24iLCJnZXRTdWJTZWN0aW9ucyIsIl9vbkJlZm9yZUJpbmRpbmciLCJwZW5kaW5nVGFyZ2V0Q29udHJvbElkIiwidGFyZ2V0Q29udHJvbElkIiwicHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGgiLCJhVGFibGVzIiwiX2ZpbmRUYWJsZXMiLCJvSW50ZXJuYWxNb2RlbCIsImFCYXRjaEdyb3VwcyIsIm9GYXN0Q3JlYXRpb25Sb3ciLCJwdXNoIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInNvbWUiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiaXRlbSIsImdldENyZWF0aW9uUm93Iiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsImZuT1BSZW5kZXJpbmdMYXlvdXQiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl9pbml0aWFsaXplUGFnaW5hdGlvbiIsImxpc3RCaW5kaW5nIiwiX2Rpc2FibGVCbG9ja3NCaW5kaW5ncyIsImRpc2Nvbm5lY3RTdWJTZWN0aW9uVmlzaWJpbGl0eU9ic2VydmVycyIsIndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MiLCJ3YWl0Rm9yQWxsU3ViU2VjdGlvblZpc2liaWxpdHlCaW5kaW5nc1Jlc29sdmVkIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiZW5hYmxlQW5pbWF0aW9uIiwib2JqZWN0UGFnZUxheW91dCIsInNldFZpc2libGUiLCJzdWJTZWN0aW9uc0luZm8iLCJmZSIsIm90aGVycyIsImRpc2Nvbm5lY3RWaXNpYmlsaXR5T2JzZXJ2ZXIiLCJnZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJkb21FZGl0YWJsZUVsZW1lbnQiLCJfZ2V0Rmlyc3RFZGl0YWJsZUlucHV0IiwiVUk1RWxlbWVudCIsImNsb3Nlc3RUbyIsImdldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9iamVjdFBhZ2UiLCJmb290ZXIiLCJnZXRGb290ZXIiLCJmb290ZXJQcmltYXJ5QWN0aW9uIiwiZmlyc3RDbGlja2FibGVFbGVtZW50IiwiYWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsImdldENvbnRlbnQiLCJhU2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImlTa2lwIiwiYkVkaXRhYmxlSGVhZGVyIiwiZmlyc3RWaXNpYmlsaXR5QmluZGluZyIsIl9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZyIsImlTZWN0aW9uIiwib1NlY3Rpb24iLCJhU3ViU2VjdGlvbnMiLCJpU3ViU2VjdGlvbiIsIm9TdWJTZWN0aW9uIiwiZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uIiwic3ViQmxvY2siLCJfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24iLCJhQmxvY2tzIiwiYmxvY2tDb250cm9sIiwiYUZvcm1Db250YWluZXJzIiwiZ2V0Rm9ybUNvbnRhaW5lcnMiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImVtcHR5RmllbGQiLCJnZXRGaXJzdEVtcHR5UmVxdWlyZWRGaWVsZCIsImZpZWxkcyIsImdldFJlcXVpcmVkIiwiaXNFbXB0eSIsImdldE11bHRpVmFsdWVGaWVsZCIsImdldEl0ZW1zIiwidmFsdWUiLCJkZWJ1ZyIsImZyb21UYWJOYXZpZ2F0aW9uIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImdldENvbnRlbnRFZGl0IiwiZm9jdXNJbmZvIiwiZ2V0Rm9jdXNJbmZvIiwidGFyZ2V0SW5mbyIsInNpbGVudCIsImdldEVuYWJsZVN1Z2dlc3Rpb25zIiwiaXNCb3VuZCIsInNldEVuYWJsZVN1Z2dlc3Rpb25zIiwiZm9jdXMiLCJhbGxzdWJTZWN0aW9ucyIsImN1cnJlbnRNb2RlbCIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU3ViU2VjdGlvbkNyZWF0ZWQiLCJfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQiLCJtZXNzYWdlSGFuZGxlciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm5hdkJhY2siLCJjYW5Hb0JhY2siLCJ3aW5kb3ciLCJuYXZpZ2F0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJfcm91dGluZyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiY3VycmVudFVSTCIsImRvY3VtZW50IiwiVVJMIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwid2FybmluZyIsImhpZGRlbkRyYWZ0RW5hYmxlZCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJlbmFibGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIl9vbkFmdGVyQmluZGluZyIsImlucHV0QmluZGluZ0NvbnRleHQiLCJSb3dQcmVzcyIsImluY2x1ZGVzIiwic3RvcmVTaWJsaW5nQ29udGV4dERhdGEiLCJzaWRlRWZmZWN0cyIsImNsZWFyRmllbGRHcm91cHNWYWxpZGl0eSIsImJpbmRpbmdDb250ZXh0IiwiYUlCTkFjdGlvbnMiLCJnZXRJQk5BY3Rpb25zIiwib1RhYmxlUm93QmluZGluZyIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwicmVtb3ZlQ2FjaGVzQW5kTWVzc2FnZXMiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwidGFibGVEZWZpbml0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJjbGVhclNlbGVjdGlvbiIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5Iiwib01vZGVsIiwib0ZpbmFsVUlTdGF0ZSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsIm9CaW5kaW5nIiwiZm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzIiwiVGFibGVIZWxwZXIiLCJlbmFibGVGYXN0Q3JlYXRpb25Sb3ciLCJnZXRDb250ZXh0IiwiZm5IYW5kbGVDaGFuZ2UiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZSIsIl91cGRhdGVSZWxhdGVkQXBwcyIsImN1cnJlbnRCaW5kaW5nIiwiaGFuZGxlUGF0Y2hTZW50IiwiVGFibGVVdGlscyIsIndoZW5Cb3VuZCIsIm9FcnJvciIsIl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzIiwidXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50IiwiX3VwZGF0ZUF2YWlsYWJsZUNhcmRzIiwicmVjb21tZW5kYXRpb25zIiwiY2xlYXJSZWNvbW1lbmRhdGlvbnMiLCJkaXNwbGF5Q29sbGFib3JhdGlvbk1lc3NhZ2UiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsIl9zZXRPUE1lc3NhZ2VTdHJpcEludGVybmFsQ29udGV4dCIsImFwcGx5QXBwU3RhdGUiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0Rm9yIiwicmVjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMiLCJoYW5kbGVQZW5kaW5nVGFyZ2V0Q29udHJvbElkTmF2aWdhdGlvbiIsInhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZCIsImNvbnN1bWVQZW5kaW5nVGFyZ2V0Q29udHJvbElkIiwiYWxsIiwid2FpdFBhZ2VSZWFkeSIsIm5hdmlnYXRlVG9UYXJnZXRTZWN0aW9uIiwidGFyZ2V0Q29udHJvbCIsImlzU2VjdGlvbiIsInRhcmdldFNlY3Rpb25JZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24iLCJwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSIsIm9uUmVzZXREZXRlY3RlZCIsInNldFRhcmdldFN1YlNlY3Rpb24iLCJ2aWV3U3RhdGUiLCJ1cGRhdGVBcHBTdGF0ZURlYm91bmNlZCIsImlzSW5FZGl0TW9kZSIsInN1YlNlY3Rpb25JbmZvIiwid2FpdEZvckFwcGx5QXBwc3RhdGUiLCJvYnNlcnZlQ3VycmVudFNlY3Rpb24iLCJzdWJzZWN0aW9uIiwiZmlyZUV2ZW50IiwiY2FyZHMiLCJjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UiLCJnZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UiLCJoYXNDb2xsYWJvcmF0aW9uTWFuYWdlckNvbm5lY3RlZCIsImNvbGxhYm9yYXRpb25NYW5hZ2VyIiwiY29sbGVjdEF2YWlsYWJsZUNhcmRzIiwiY2FyZE9iamVjdCIsInVwZGF0ZUNhcmRzIiwicGFyZW50QXBwSWQiLCJhZGRDYXJkc1RvQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJzaGFyZUF2YWlsYWJsZUNhcmRzIiwiZmluZEVsZW1lbnRzIiwiZWxlbSIsIm1lc3NhZ2VTdHJpcCIsImVudGl0eU5hbWUiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImNvbGxhYm9yYXRpb25NZXNzYWdlIiwiTWVzc2FnZSIsImdldFRleHQiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJJbmZvcm1hdGlvbiIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwib25QYWdlUmVhZHkiLCJzZXRGb2N1cyIsImlzSW5EaXNwbGF5TW9kZSIsIm9GaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJvU2VsZWN0ZWRTZWN0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJjdHh0Iiwib0JpbmRpbmdDb250ZXh0IiwiYklzU3RpY2t5TW9kZSIsIm9BcHBDb21wb25lbnQiLCJpc0VkaXRhYmxlIiwiZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyIsImNvbnRleHQiLCJmb3JjZUZvY3VzIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJEZXZpY2UiLCJzdXBwb3J0IiwidG91Y2giLCJzYXZlQnV0dG9uIiwiYXV0b1F1ZXVlVW5sb2NrIiwiYXV0b1F1ZXVlTG9jayIsImlzTG9ja2VkIiwidW5sb2NrIiwiZGV0YWNoQnJvd3NlckV2ZW50IiwiYXR0YWNoQnJvd3NlckV2ZW50IiwibG9jayIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsIm9PYmplY3RQYWdlRGVzY3JpcHRpb24iLCJleHRyYWN0UGF0aHMiLCJiaW5kaW5nSW5mbyIsImZyb20iLCJTZXQiLCJwYXJ0cyIsInBhcnQiLCJtb2RlbCIsInBhdGgiLCJCb29sZWFuIiwic3VidGl0bGVQYXRocyIsImdldEJpbmRpbmdJbmZvIiwiZGVzY3JpcHRpb25QYXRocyIsInBhdGhzVG9SZXNvbHZlIiwiYXBwQ29tcG9uZW50Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZm5DbGVhckNhY2hlVGl0bGUiLCJpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9PYmplY3RQYWdlQ29udGV4dCIsImJ1aWxkIiwidGl0bGUiLCJzdWJ0aXRsZSIsImludGVudCIsImljb24iLCJkZXNjcmlwdGlvbiIsInAiLCJyZXF1ZXN0UHJvcGVydHkiLCJfZXhlY3V0ZVRhYlNob3J0Q3V0Iiwib0V4ZWN1dGlvbiIsImlTZWN0aW9uSW5kZXhNYXgiLCJzQ29tbWFuZCIsImdldENvbW1hbmQiLCJuZXdTZWN0aW9uIiwiaVNlbGVjdGVkU2VjdGlvbkluZGV4IiwiaW5kZXhPZlNlY3Rpb24iLCJfZ2V0Rm9vdGVyVmlzaWJpbGl0eSIsInNWaWV3SWQiLCJpc0hpZGRlbkRyYWZ0RW5hYmxlZCIsIm9NZXNzYWdlIiwiaXNFcnJvck1lc3NhZ2UiLCJ2YWxpZGF0aW9uIiwibWVzc2FnZVZhbGlkYXRpb24iLCJpc0VkaXRNb2RlIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwib0l0ZW1CaW5kaW5nIiwiZ2V0TGVuZ3RoIiwib3BlbkJ5IiwiQnVzeUxvY2tlciIsImVkaXREb2N1bWVudCIsImZpbmFsbHkiLCJwcm9wZXJ0eVBhdGgiLCJMb2NhbFByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIlNlbWFudGljT2JqZWN0UHJvcGVydHkiLCJfdmFsaWRhdGVEb2N1bWVudCIsImdldEFjdGl2ZUVsZW1lbnQiLCJieVBhc3NTaWRlRWZmZWN0cyIsImlzVHJhbnNpZW50IiwiY3JlYXRlZCIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJyZXQiLCJleGVjdXRlR2xvYmFsVmFsaWRhdGlvbiIsInNob3dNZXNzYWdlcyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiY3JlYXRlUm9vdENvbnRleHQiLCJEcmFmdCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJpc0Nvbm5lY3RlZCIsInNraXBCaW5kaW5nVG9WaWV3IiwidXNlU2F2ZUFuZExlYXZlIiwiYXdhaXRDcmVhdGVEb2N1bWVudHMiLCJleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwibWVzc2FnZVBvcG92ZXJFcnIiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiZGlhbG9nQWN0aW9uIiwiQ29sbGFib3JhdGlvbkRpc2NhcmQiLCJnZXRVc2VyQWN0aW9uIiwiZXJyIiwiY3JlYXRpb25Sb3ciLCJ0YWJsZUJpbmRpbmciLCJjb250ZXh0S2V5cyIsInN0YXJ0c1dpdGgiLCJjcmVhdGVEb2N1bWVudCIsImNyZWF0aW9uTW9kZSIsImNyZWF0ZUF0RW5kIiwiZ2V0QWdncmVnYXRpb24iLCJza2lwU2lkZUVmZmVjdHMiLCJpc1N0YW5kYXJkU2F2ZSIsImNvbW1hbmQiLCJiaW5kaW5ncyIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwibGFzdEZvY3VzZWRDb250cm9sSWQiLCJzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImFmdGVyQ2FuY2VsIiwicHJvbWlzZVJlc3VsdCIsImNhbmNlbERvY3VtZW50Iiwic2tpcERpc2NhcmRQb3BvdmVyIiwiYXBwbHlEb2N1bWVudCIsInNob3dSZWxhdGVkQXBwcyIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsIml0ZW0xIiwib0VsZW1lbnQiLCJjaGFydENvbnRyb2wiLCJnZXRDaGFydENvbnRyb2wiLCJvU3ViRWxlbWVudCIsIl9nZXRBbGxCbG9ja3MiLCJfZmluZENoYXJ0cyIsImFDaGFydHMiLCJvQmxvY2siLCJvQ29udGVudCIsInNldFNob3dTaWRlQ29udGVudCIsIm9DaGFydENvbnRleHQiLCJzQ2hhcnRQYXRoIiwib0NvbnRleHREYXRhIiwib0NoYXJ0Q29udGV4dERhdGEiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX21lcmdlTXVsdGlwbGVDb250ZXh0cyIsIm9QYWdlQ29udGV4dCIsImFMaW5lQ29udGV4dCIsImFBdHRyaWJ1dGVzIiwiYVBhZ2VBdHRyaWJ1dGVzIiwic01ldGFQYXRoTGluZSIsInNQYXRoTGluZSIsInNQYWdlUGF0aCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGhQYWdlIiwicmVwbGFjZSIsIm9TaW5nbGVDb250ZXh0Iiwib1N1YkNoYXJ0Q29udGV4dERhdGEiLCJjb250ZXh0RGF0YSIsImVudGl0eVNldCIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZUxldmVsU1YiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJzZWxlY3Rpb25WYXJpYW50IiwiYXR0cmlidXRlcyIsIm9WaWV3RGF0YSIsIm9Db25maWd1cmF0aW9ucyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiYUNvbmZpZ3VyYXRpb25zIiwic0tleSIsIm9Db25maWd1cmF0aW9uIiwicmVxdWVzdEdyb3VwSWQiLCJwYWdpbmF0b3JDdXJyZW50Q29udGV4dCIsImJpbmRpbmdUb1VzZSIsInBhZ2luYXRvciIsImluaXRpYWxpemUiLCJvRGF0YVBvaW50cyIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib1NoZWxsU2VydmljZXMiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRMaW5rcyIsImZuT25FcnJvciIsImZuU2V0TGlua0VuYWJsZW1lbnQiLCJpZCIsImFTdXBwb3J0ZWRMaW5rcyIsInNMaW5rSWQiLCJzdXBwb3J0ZWQiLCJvU3ViRGF0YVBvaW50cyIsIm9QYWdlRGF0YSIsIm9EYXRhUG9pbnQiLCJvTGluayIsIm9MaW5rQ29udGV4dCIsIm9MaW5rRGF0YSIsIm9NaXhlZENvbnRleHQiLCJtZXJnZSIsIm9NYXBwaW5nIiwic01haW5Qcm9wZXJ0eSIsInNNYXBwZWRQcm9wZXJ0eSIsImhhc093blByb3BlcnR5Iiwib05ld01hcHBpbmciLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJwYXJhbXMiLCJhTGlua3MiLCJfZmluZFN1bW1hcml6ZUJ1dHRvbiIsIm9iamVjdFBhZ2VUaXRsZSIsInN1bW1hcml6ZUJ1dHRvbiIsImJ1dHRvbiIsImVuZHNXaXRoIiwiZ2V0U3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1zIiwicHJlZmVycmVkQWN0aW9uIiwicHJlZmVycmVkQWN0aW9uTGV2ZWwiLCJwYXJzZUludCIsInNwbGl0IiwiaXNOYU4iLCJnZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMiLCJDYW5QZXJmb3JtIiwic2V0UHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiQWxyZWFkeVBlcmZvcm1lZCIsImVudmlyb25tZW50U2VydmljZSIsImVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiU21hcnRTdW1tYXJpemUiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24sIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgU3RhcnR1cFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGFnZVJlYWR5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdlUmVhZHlcIjtcbmltcG9ydCBQYWdpbmF0b3IgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2luYXRvclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IFNoYXJlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgQ29sbGFib3JhdGlvbk1hbmFnZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NhcmRzL0NvbGxhYm9yYXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgVWlNb2RlbENvbnN0YW50cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIENvbW1hbmRFeGVjdXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0NvbW1hbmRFeGVjdXRpb25cIjtcbmltcG9ydCB7IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvUmVjb21tZW5kYXRpb25zL0NvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCwgTWljcm9DaGFydE1hbmlmZXN0Q29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgeyB0eXBlIFdyYXBwZWRDYXJkIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL0NvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIENoYXJ0QmxvY2sgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ2hhcnRcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBNYWNyb0FQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9NYWNyb0FQSVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkQmxvY2sgZnJvbSBcInNhcC9mZS9tYWNyb3MvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgRWFzeUZpbGxCdXR0b24gZnJvbSBcInNhcC9mZS9tYWNyb3MvYWkvRWFzeUZpbGxCdXR0b25cIjtcbmltcG9ydCB0eXBlIFN1bW1hcml6YXRpb25CdXR0b24gZnJvbSBcInNhcC9mZS9tYWNyb3MvYWkvU3VtbWFyaXphdGlvbkJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgU3ViU2VjdGlvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9zZWN0aW9uL1N1YlNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIEZvcm1BUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvZm9ybS9Gb3JtQVBJXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlQnV0dG9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL21lc3NhZ2VzL01lc3NhZ2VCdXR0b25cIjtcbmltcG9ydCB0eXBlIFNoYXJlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3NoYXJlL1NoYXJlQVBJXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUNyZWF0aW9uT3B0aW9ucyBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUNyZWF0aW9uT3B0aW9uc1wiO1xuaW1wb3J0IFRhYmxlSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlSGVscGVyXCI7XG5pbXBvcnQgVGFibGVVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9VdGlsc1wiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBDb2xsYWJvcmF0aW9uRGlzY2FyZCBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2NvbXBvbmVudHMvQ29sbGFib3JhdGlvbkRpc2NhcmREaWFsb2dcIjtcbmltcG9ydCB0eXBlIFN1YlNlY3Rpb25CbG9jayBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2NvbnRyb2xzL1N1YlNlY3Rpb25CbG9ja1wiO1xuaW1wb3J0IHsgcG9sbEZvclNlY3Rpb25TdGFiaWxpdHkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2hlbHBlcnMvU2VjdGlvbk5hdmlnYXRpb25IZWxwZXJcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCB0eXBlIEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBJbnB1dEJhc2UgZnJvbSBcInNhcC9tL0lucHV0QmFzZVwiO1xuaW1wb3J0IEluc3RhbmNlTWFuYWdlciBmcm9tIFwic2FwL20vSW5zdGFuY2VNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSBNZW51QnV0dG9uIGZyb20gXCJzYXAvbS9NZW51QnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBOYXZDb250YWluZXIgZnJvbSBcInNhcC9tL05hdkNvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IHR5cGUgU2VhcmNoRmllbGQgZnJvbSBcInNhcC9tL1NlYXJjaEZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUb29sYmFyU3BhY2VyIGZyb20gXCJzYXAvbS9Ub29sYmFyU3BhY2VyXCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQ29tbWFuZEV4ZWN1dGlvbiRFeGVjdXRlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29tbWFuZEV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgQ3VzdG9tRGF0YSBmcm9tIFwic2FwL3VpL2NvcmUvQ3VzdG9tRGF0YVwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RPdXRib3VuZEVudHJ5IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIER5bmFtaWNTaWRlQ29udGVudCBmcm9tIFwic2FwL3VpL2xheW91dC9EeW5hbWljU2lkZUNvbnRlbnRcIjtcbmltcG9ydCB0eXBlIEZvcm0gZnJvbSBcInNhcC91aS9sYXlvdXQvZm9ybS9Gb3JtXCI7XG5pbXBvcnQgdHlwZSBDaGFydCBmcm9tIFwic2FwL3VpL21kYy9DaGFydFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlVHlwZUJhc2UgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvVGFibGVUeXBlQmFzZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbXBvc2l0ZUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db21wb3NpdGVCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9MaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU3ViU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVN1YlNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsVHlwZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB0eXBlIENvbGxhYm9yYXRpb25EcmFmdCBmcm9tIFwiLi9jb21wb25lbnRzL0NvbGxhYm9yYXRpb25EcmFmdFwiO1xuaW1wb3J0IENvbGxhYm9yYXRpb25NYW5hZ2VyT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbGxhYm9yYXRpb25NYW5hZ2VyXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZ092ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2luYXRvck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9QYWdpbmF0b3JcIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5leHBvcnQgdHlwZSBCaW5kaW5nUGFyYW1zID0ge1xuXHRyZWRpcmVjdGVkVG9Ob25EcmFmdD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cmVhc29uPzogTmF2aWdhdGlvblJlYXNvbjtcblx0YlBlcnNpc3RPUFNjcm9sbD86IGJvb2xlYW47XG5cdGxpc3RCaW5kaW5nPzogT0RhdGFMaXN0QmluZGluZztcblx0c2hvd1BsYWNlaG9sZGVyPzogYm9vbGVhbjtcblx0cmVxdWVzdE9uQmluZGluZz86IHN0cmluZ1tdO1xuXHR0YXJnZXRDb250cm9sSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5jb25zdCBQcmVmZXJyZWRBY3Rpb25TdGF0dXMgPSBGRUxpYnJhcnkuUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZTtcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKVxuY2xhc3MgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdG9WaWV3ITogRkVWaWV3O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUpKVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblxuXHRAdXNpbmdFeHRlbnNpb24oUGFnaW5hdG9yLm92ZXJyaWRlKFBhZ2luYXRvck92ZXJyaWRlKSlcblx0cGFnaW5hdG9yITogUGFnaW5hdG9yO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihNZXNzYWdlSGFuZGxlci5vdmVycmlkZShNZXNzYWdlSGFuZGxlck92ZXJyaWRlKSlcblx0bWVzc2FnZUhhbmRsZXIhOiBNZXNzYWdlSGFuZGxlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihDb2xsYWJvcmF0aW9uTWFuYWdlci5vdmVycmlkZShDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlKSlcblx0Y29sbGFib3JhdGlvbk1hbmFnZXIhOiBDb2xsYWJvcmF0aW9uTWFuYWdlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0UGFnZVJlYWR5Lm92ZXJyaWRlKHtcblx0XHRcdGlzQ29udGV4dEV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0cGFnZVJlYWR5ITogUGFnZVJlYWR5O1xuXG5cdHByaXZhdGUgbUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzPzogUmVjb3JkPHN0cmluZywgT2JqZWN0UGFnZUV4dGVuc2lvbkFQST47XG5cblx0cHJvdGVjdGVkIGV4dGVuc2lvbkFQST86IE9iamVjdFBhZ2VFeHRlbnNpb25BUEk7XG5cblx0cHJpdmF0ZSBiU2VjdGlvbk5hdmlnYXRlZD86IGJvb2xlYW47XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZVNldFVwID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXG5cdHByaXZhdGUgY3VycmVudEJpbmRpbmc/OiBCaW5kaW5nO1xuXG5cdHByaXZhdGUgbWVzc2FnZUJ1dHRvbiE6IE1lc3NhZ2VCdXR0b247XG5cblx0cHJpdmF0ZSBjb2xsYWJvcmF0aW9uTWVzc2FnZT86IE1lc3NhZ2U7XG5cblx0cHJpdmF0ZSBtZXJnZVBhdGNoRHJhZnQgPSBmYWxzZTtcblxuXHRwcml2YXRlIGF1dG9RdWV1ZUxvY2s6IFJldHVyblR5cGU8T0RhdGFNb2RlbFtcImxvY2tcIl0+IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgbWVzc2FnZUJpbmRpbmc/OiBCaW5kaW5nO1xuXG5cdHByaXZhdGUgd2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyE6IFByb21pc2U8dW5rbm93bj5bXTtcblxuXHRwcml2YXRlIHN1YlNlY3Rpb25zPzogeyBmZTogU3ViU2VjdGlvbltdOyBvdGhlcnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10gfTtcblxuXHRwcml2YXRlIHByZXZpb3VzQmluZGluZ0NvbnRleHRQYXRoPzogc3RyaW5nO1xuXG5cdHByaXZhdGUgcGVuZGluZ1RhcmdldENvbnRyb2xJZD86IHN0cmluZztcblxuXHRwcml2YXRlIHRhcmdldFN1YlNlY3Rpb24/OiBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblxuXHQvLyBUcmFja3MgaWYgaW5pdGlhbCBPYmplY3RQYWdlIGxvYWQgaGFzIGNvbXBsZXRlZFxuXHRwcml2YXRlIGhhc0luaXRpYWxMb2FkQ29tcGxldGVkID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgY29udHJvbHMgKEJ1dHRvbiAvIE1lbnVCdXR0b24pIHRoYXQgYXJlIG1hcmtlZCBhcyBcInByaW1hcnkgYWN0aW9uXCIuXG5cdCAqIFRoZSBtYXJrZXIgaXMgc2V0IGJ5IHRoZSBjb252ZXJ0ZXJzIHdoZW4gYW4gYWN0aW9uIGlzIGVtcGhhc2l6ZWQgKGFubm90YXRpb24tYmFzZWQpIG9yXG5cdCAqIGNvbmZpZ3VyZWQgYXMgcHJpbWFyeUFjdGlvbiAoY3VzdG9tIGFjdGlvbiBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCkuXG5cdCAqIEBwYXJhbSByb290IFJvb3QgY29udHJvbCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb21cblx0ICogQHBhcmFtIG9ubHlBY3Rpb25hYmxlIElmIHRydWUsIG9ubHkgYWN0aW9uYWJsZSAoZW5hYmxlZCkgY2FuZGlkYXRlcyBhcmUgcmV0dXJuZWRcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29udHJvbHMgdGhhdCBhcmUgY2FuZGlkYXRlcyBmb3IgcHJpbWFyeSBhY3Rpb24gc2hvcnRjdXRzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRQcmltYXJ5QWN0aW9uU2hvcnRjdXRDYW5kaWRhdGVzKHJvb3Q6IE1hbmFnZWRPYmplY3QsIG9ubHlBY3Rpb25hYmxlID0gZmFsc2UpOiBBcnJheTxCdXR0b24gfCBNZW51QnV0dG9uPiB7XG5cdFx0cmV0dXJuIHJvb3QuZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChvYmplY3Q6IE1hbmFnZWRPYmplY3QpID0+IHtcblx0XHRcdGNvbnN0IGlzQnV0dG9uID0gb2JqZWN0LmlzQShcInNhcC5tLkJ1dHRvblwiKTtcblx0XHRcdGNvbnN0IGlzTWVudUJ1dHRvbiA9IG9iamVjdC5pc0EoXCJzYXAubS5NZW51QnV0dG9uXCIpO1xuXHRcdFx0aWYgKCFpc0J1dHRvbiAmJiAhaXNNZW51QnV0dG9uKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGN0cmwgPSBvYmplY3QgYXMgQnV0dG9uIHwgTWVudUJ1dHRvbjtcblx0XHRcdGNvbnN0IGZsYWcgPSBjdHJsXG5cdFx0XHRcdC5nZXRDdXN0b21EYXRhKClcblx0XHRcdFx0LmZpbmQoKGN1c3RvbURhdGE6IEN1c3RvbURhdGEpID0+IGN1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiZmVQcmltYXJ5QWN0aW9uU2hvcnRjdXRcIilcblx0XHRcdFx0Py5nZXRWYWx1ZSgpO1xuXHRcdFx0aWYgKGZsYWcgIT09IHRydWUgJiYgZmxhZyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjdHJsLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHQvLyBGb3IgZm9jdXMgcGxhY2VtZW50IHdlIG11c3QgaWdub3JlIGRpc2FibGVkIGNhbmRpZGF0ZXMuXG5cdFx0XHRyZXR1cm4gb25seUFjdGlvbmFibGUgPyBjdHJsLmdldEVuYWJsZWQoKSA6IHRydWU7XG5cdFx0fSkgYXMgQXJyYXk8QnV0dG9uIHwgTWVudUJ1dHRvbj47XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKHNJZD86IHN0cmluZyk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKHNJZCkge1xuXHRcdFx0Ly8gdG8gYWxsb3cgbG9jYWwgSUQgdXNhZ2UgZm9yIGN1c3RvbSBwYWdlcyB3ZSdsbCBjcmVhdGUvcmV0dXJuIG93biBpbnN0YW5jZXMgZm9yIGN1c3RvbSBzZWN0aW9uc1xuXHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgPSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyB8fCB7fTtcblxuXHRcdFx0aWYgKCF0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0gPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMsIHNJZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0XHR0aGlzLmV4dGVuc2lvbkFQSSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdFx0fVxuXHR9XG5cblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHN1cGVyLm9uSW5pdCgpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdC8vIFNldHRpbmcgZGVmYXVsdHMgb2YgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgcGFnZTogdHJ1ZSB9LCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXG5cdFx0XHRcInJlbGF0ZWRBcHBzXCIsXG5cdFx0XHR7XG5cdFx0XHRcdHZpc2liaWxpdHk6IGZhbHNlLFxuXHRcdFx0XHRpdGVtczogbnVsbFxuXHRcdFx0fSxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHRydWVcblx0XHQpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiLCB0aGlzLl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblxuXHRcdGlmICh0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpKSB7XG5cdFx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgdGhpcy5faGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydC5iaW5kKHRoaXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKS5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiB7XG5cdFx0XHRcdHN1YlNlY3Rpb24uYXR0YWNoRXZlbnQoXCJzdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0XCIsIHRoaXMuX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQuYmluZCh0aGlzKSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLm1lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKSBhcyBNZXNzYWdlQnV0dG9uO1xuXHRcdHRoaXMubWVzc2FnZUJpbmRpbmcgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuYmluZExpc3QoXCIvXCIpO1xuXHRcdHRoaXMubWVzc2FnZUJpbmRpbmc/LmF0dGFjaENoYW5nZSh0aGlzLl9mblNob3dPUE1lc3NhZ2UsIHRoaXMpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyb290RWRpdEVuYWJsZWRcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicm9vdEVkaXRWaXNpYmxlXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHR0aGlzLl9oYW5kbGVTbWFydFN1bW1hcnlTdGFydHVwQWN0aW9uKCk7XG5cdH1cblxuXHRvbkV4aXQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykpIHtcblx0XHRcdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzO1xuXHRcdH1cblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXG5cdFx0Y29uc3Qgb01lc3NhZ2VQb3BvdmVyID0gdGhpcy5tZXNzYWdlQnV0dG9uID8gdGhpcy5tZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3ZlciA6IG51bGw7XG5cdFx0aWYgKG9NZXNzYWdlUG9wb3ZlciAmJiBvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdG9NZXNzYWdlUG9wb3Zlci5jbG9zZSgpO1xuXHRcdH1cblx0XHQvL3doZW4gZXhpdGluZyB3ZSBzZXQga2VlcEFsaXZlIGNvbnRleHQgdG8gZmFsc2Vcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKG9Db250ZXh0ICYmIG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpOyAvLyBDbGVhbnVwIGNvbGxhYm9yYXRpb24gY29ubmVjdGlvbiB3aGVuIGxlYXZpbmcgdGhlIGFwcFxuXG5cdFx0dGhpcy5tZXNzYWdlQmluZGluZz8uZGV0YWNoQ2hhbmdlKHRoaXMuX2ZuU2hvd09QTWVzc2FnZSwgdGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAgb24gdGhlIG9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKi9cblx0X2ZuU2hvd09QTWVzc2FnZSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgYXBwIGlzIHN1c3BlbmRlZCwgd2UgZG8gbm90IHNob3cgdGhlIG1lc3NhZ2VzICh0aGUgTWVzc2FnZU1vZGVsIGNvbnRhaW5zIG1lc3NhZ2VzIGZyb20gdGhlIGFjdGl2ZSBhcHApLlxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGV4dGVuc2lvbkFQSSA9IHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCk7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nPy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXRzKClbMF0gPT09IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHRleHRlbnNpb25BUEkuX3Nob3dNZXNzYWdlcyhtZXNzYWdlcywgXCJCYWNrZW5kXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUYWJsZUJpbmRpbmcob1RhYmxlOiBUYWJsZSk6IE9EYXRhTGlzdEJpbmRpbmcge1xuXHRcdHJldHVybiBvVGFibGUgJiYgb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhlIHNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lciBDU1MgY2xhc3MgdG8gZXZlcnkgdmlzaWJsZSBzdWJzZWN0aW9uIHRoYXQgY29udGFpbnMgb25seSBhIHNpbmdsZSBHcmlkVGFibGUgb3IgVHJlZVRhYmxlLlxuXHQgKiBUaGlzIG1ha2VzIHRoZSB0YWJsZSBmaWxsIHRoZSBmdWxsIGhlaWdodCBvZiBpdHMgY29udGFpbmVyIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBhcHBlYXJzIG9uIHRoZSB0YWJsZSBpdHNlbGYgcmF0aGVyIHRoYW4gb24gdGhlIHBhZ2UuXG5cdCAqIEBwYXJhbSBzdWJTZWN0aW9ucyBUaGUgc3ViIHNlY3Rpb25zIHRvIGxvb2sgZm9yXG5cdCAqL1xuXHRwcml2YXRlIGNoZWNrU2VjdGlvbnNGb3JOb25SZXNwb25zaXZlVGFibGUoc3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10pOiB2b2lkIHtcblx0XHRjb25zdCBjaGFuZ2VDbGFzc0ZvclRhYmxlcyA9IChldmVudDogRXZlbnQsIHZpc2libGVTdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgYmxvY2tzID0gWy4uLnZpc2libGVTdWJTZWN0aW9uLmdldEJsb2NrcygpLCAuLi52aXNpYmxlU3ViU2VjdGlvbi5nZXRNb3JlQmxvY2tzKCldO1xuXHRcdFx0aWYgKGJsb2Nrcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgdGFibGUgPSB0aGlzLnNlYXJjaFRhYmxlSW5CbG9jayhibG9ja3NbMF0gYXMgU3ViU2VjdGlvbkJsb2NrKTtcblx0XHRcdFx0aWYgKCF0YWJsZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB0YWJsZVR5cGUgPSB0YWJsZS5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiAodGFibGUuZ2V0VHlwZSgpIGFzIFRhYmxlVHlwZUJhc2UpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpPy5pc0E8VGFibGVBUEk+KFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSA/ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0YWJsZVR5cGUgJiZcblx0XHRcdFx0XHQodGFibGVUeXBlPy5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIikgfHwgdGFibGVUeXBlPy5pc0EoXCJzYXAudWkubWRjLnRhYmxlLlRyZWVUYWJsZVR5cGVcIikpICYmXG5cdFx0XHRcdFx0dGFibGVBUEk/LmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbnRyb2wucm93Q291bnRNb2RlID09PSBcIkF1dG9cIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvL0luIGNhc2UgdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0YWJsZSBpbiBhIHN1YlNlY3Rpb24gd2UgZml0IHRoYXQgdG8gdGhlIHdob2xlIHBhZ2Ugc28gdGhhdCB0aGUgc2Nyb2xsYmFyIGNvbWVzIG9ubHkgb24gdGFibGUgYW5kIG5vdCBvbiBwYWdlXG5cdFx0XHRcdFx0dmlzaWJsZVN1YlNlY3Rpb24uYWRkU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKTtcblx0XHRcdFx0XHR2aXNpYmxlU3ViU2VjdGlvbi5kZXRhY2hFdmVudChcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBjaGFuZ2VDbGFzc0ZvclRhYmxlcywgdGhpcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGZvciAoY29uc3Qgc3ViU2VjdGlvbiBvZiBzdWJTZWN0aW9ucykge1xuXHRcdFx0aWYgKHN1YlNlY3Rpb24uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYXR0YWNoIHRoaXMgZXZlbnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBPYmplY3QgUGFnZSBMYXp5IExvYWRpbmcgbWVjaGFuaXNtXG5cdFx0XHRcdHN1YlNlY3Rpb24uYXR0YWNoRXZlbnQoXCJtb2RlbENvbnRleHRDaGFuZ2VcIiwgc3ViU2VjdGlvbiwgY2hhbmdlQ2xhc3NGb3JUYWJsZXMsIHRoaXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kIGEgdGFibGUgaW4gYmxvY2tzIG9mIHNlY3Rpb24uXG5cdCAqIEBwYXJhbSBibG9jayBPbmUgc3ViIHNlY3Rpb24gYmxvY2tcblx0ICogQHJldHVybnMgVGFibGUgaWYgZXhpc3RzXG5cdCAqL1xuXHRwcml2YXRlIHNlYXJjaFRhYmxlSW5CbG9jayhibG9jazogU3ViU2VjdGlvbkJsb2NrKTogVGFibGUgfCB1bmRlZmluZWQge1xuXHRcdGxldCB0YWJsZUFQSTogVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZ2V0VGFibGVBUEkgPSAoY29udHJvbDogQ29udHJvbCk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdC8vIFRoZSB0YWJsZSBtYXkgY3VycmVudGx5IGJlIHNob3duIGluIGEgZnVsbCBzY3JlZW4gZGlhbG9nLCB3ZSBjYW4gdGhlbiBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFibGVBUElcblx0XHRcdC8vIGNvbnRyb2wgZnJvbSB0aGUgY3VzdG9tIGRhdGEgb2YgdGhlIHBsYWNlIGhvbGRlciBwYW5lbFxuXHRcdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLm0uUGFuZWxcIikgJiYgY29udHJvbC5kYXRhKFwiRnVsbFNjcmVlblRhYmxlUGxhY2VIb2xkZXJcIikpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRyb2wuZGF0YShcInRhYmxlQVBJcmVmZXJlbmNlXCIpO1xuXHRcdFx0fSBlbHNlIGlmIChjb250cm9sLmlzQShcInNhcC5mZS5tYWNyb3MuVGFibGVcIikpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRyb2wgYXMgVGFibGVBUEk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYmxvY2suaXNBKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLmNvbnRyb2xzLlN1YlNlY3Rpb25CbG9ja1wiKSkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IGJsb2NrLmNvbnRlbnQ7XG5cdFx0XHRpZiAoY29udHJvbC5pc0EoXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRjb25zdCBtYWluQ29udGVudCA9IChjb250cm9sIGFzIER5bmFtaWNTaWRlQ29udGVudCkuZ2V0TWFpbkNvbnRlbnQoKVswXTtcblx0XHRcdFx0Y29uc3QgbWFpbkNvbnRlbnRUYWJsZUFQSSA9IGdldFRhYmxlQVBJKG1haW5Db250ZW50KTtcblx0XHRcdFx0aWYgKG1haW5Db250ZW50VGFibGVBUEkpIHtcblx0XHRcdFx0XHR0YWJsZUFQSSA9IG1haW5Db250ZW50VGFibGVBUEk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUNvbnRlbnQgPSAoY29udHJvbCBhcyBEeW5hbWljU2lkZUNvbnRlbnQpLmdldFNpZGVDb250ZW50KClbMF07XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUNvbnRlbnRUYWJsZUFQSSA9IGdldFRhYmxlQVBJKHNpZGVDb250ZW50KTtcblx0XHRcdFx0XHRpZiAoc2lkZUNvbnRlbnRUYWJsZUFQSSkge1xuXHRcdFx0XHRcdFx0dGFibGVBUEkgPSBzaWRlQ29udGVudFRhYmxlQVBJO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFibGVBUEkgPSBnZXRUYWJsZUFQSShjb250cm9sKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdHJldHVybiB0YWJsZUFQSS5jb250ZW50O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0b25CZWZvcmVSZW5kZXJpbmcoKTogdm9pZCB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHRcdC8vIEluIHRoZSByZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IHNjZW5hcmlvIHdlIG5lZWQgdG8gZW5zdXJlIGluIGNhc2Ugb2YgcmVsb2FkL3JlZnJlc2ggdGhhdCB0aGUgbWV0YSBtb2RlbCBpbiB0aGUgbWV0aG9kZSByZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IG9mIHRoZSBGaWVsZFJ1bnRpbWUgaXMgYXZhaWxhYmxlXG5cdFx0aWYgKHRoaXMub1ZpZXcuZ2V0Vmlld0RhdGEoKT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCAmJiBDb21tb25IZWxwZXIuZ2V0TWV0YU1vZGVsKCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Q29tbW9uSGVscGVyLnNldE1ldGFNb2RlbCh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdH1cblxuXHRvbkFmdGVyUmVuZGVyaW5nKCk6IHZvaWQge1xuXHRcdGxldCBzdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXTtcblx0XHRpZiAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRVc2VJY29uVGFiQmFyKCkpIHtcblx0XHRcdGNvbnN0IHNlY3Rpb25zID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRTZWN0aW9ucygpO1xuXHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG5cdFx0XHRcdHN1YlNlY3Rpb25zID0gc2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHR0aGlzLmNoZWNrU2VjdGlvbnNGb3JOb25SZXNwb25zaXZlVGFibGUoc3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0XHR0aGlzLmNoZWNrU2VjdGlvbnNGb3JOb25SZXNwb25zaXZlVGFibGUoc3ViU2VjdGlvbnMpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkJlZm9yZUJpbmRpbmcob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBtUGFyYW1ldGVyczogQmluZGluZ1BhcmFtcyA9IHt9KTogdm9pZCB7XG5cdFx0Ly8gU3RvcmUgdGFyZ2V0Q29udHJvbElkIGZvciBzY3JvbGxpbmcgYWZ0ZXIgYmluZGluZyBjb21wbGV0ZXNcblx0XHR0aGlzLnBlbmRpbmdUYXJnZXRDb250cm9sSWQgPSBtUGFyYW1ldGVycy50YXJnZXRDb250cm9sSWQ7XG5cblx0XHQvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgaG93IHRoaXMgY29tZXMgdG9nZXRoZXIgd2l0aCB0aGUgdHJhbnNhY3Rpb24gaGVscGVyLCBzYW1lIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGFmdGVyQmluZGluZ1xuXHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKSxcblx0XHRcdG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSxcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIiksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiKTtcblx0XHRsZXQgb0Zhc3RDcmVhdGlvblJvdztcblx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvXCIpO1xuXHRcdGlmIChtUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRpZiAoXG5cdFx0XHRvcENvbnRleHQgJiZcblx0XHRcdG9wQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmXG5cdFx0XHQhYUJhdGNoR3JvdXBzLnNvbWUob3BDb250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMuYmluZChvcENvbnRleHQuZ2V0TW9kZWwoKSkpXG5cdFx0KSB7XG5cdFx0XHQvKiBcdEluIGNhc2UgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBmb3IgdGhlIGNyZWF0aW9uIHJvdyBhbmQgbm8gb3RoZXJzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRUT0RPOiB0aGlzIGlzIGp1c3QgYSBxdWljayBzb2x1dGlvbiwgdGhpcyBuZWVkcyB0byBiZSByZXdvcmtlZFxuXHRcdFx0XHRcdFx0XHRcdCovXG5cblx0XHRcdG9wQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5vdyB3ZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBjb250ZXh0IHRvIG51bGwgZm9yIGV2ZXJ5IGZhc3QgY3JlYXRpb24gcm93XG5cdFx0Ly8gVE9ETzogR2V0IHJpZCBvZiB0aGlzIGNvZGluZyBvciBtb3ZlIGl0IHRvIGFub3RoZXIgbGF5ZXIgLSB0byBiZSBkaXNjdXNzZWQgd2l0aCBNREMgYW5kIG1vZGVsXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFUYWJsZXMpIHtcblx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cgPSBpdGVtLmdldENyZWF0aW9uUm93KCk7XG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb24gc28gdGhhdCBiaW5kaW5ncyBhcmUgZW5hYmxlZCBkdXJpbmcgbmF2aWdhdGlvbiB0aHJvdWdoIHBhZ2luYXRvciBidXR0b25zLCBhcyB0aGVyZSBpcyBubyB2aWV3IHJlcmVuZGVyaW5nL3JlYmluZFxuXHRcdGNvbnN0IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdGlmICghKG9PYmplY3RQYWdlIGFzIHsgaXNGaXJzdFJlbmRlcmluZz86ICgpID0+IGJvb2xlYW4gfSkuaXNGaXJzdFJlbmRlcmluZz8uKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnRPbmNlKFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbik7XG5cblx0XHRjb25zdCBmbk9QUmVuZGVyaW5nTGF5b3V0ID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKT8uZWRpdGFibGVIZWFkZXJDb250ZW50KSB7XG5cdFx0XHRcdFx0Zm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShmbk9QUmVuZGVyaW5nTGF5b3V0KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmFkZEV2ZW50RGVsZWdhdGUoZm5PUFJlbmRlcmluZ0xheW91dCk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdHRoaXMuX2luaXRpYWxpemVQYWdpbmF0aW9uKG9Db250ZXh0LCBvSW50ZXJuYWxNb2RlbCwgbVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nKTtcblxuXHRcdHRoaXMuX2Rpc2FibGVCbG9ja3NCaW5kaW5ncyhvT2JqZWN0UGFnZSk7XG5cblx0XHR0aGlzLnN1YlNlY3Rpb25zID0gdGhpcy5kaXNjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMob09iamVjdFBhZ2UpO1xuXHRcdHRoaXMud2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRoaXMud2FpdEZvckFsbFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZ3NSZXNvbHZlZCgpO1xuXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIuaXNQbGFjZWhvbGRlckVuYWJsZWQoKSAmJiBtUGFyYW1ldGVycy5zaG93UGxhY2Vob2xkZXIpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvTmF2Q29udGFpbmVyID0gKG9WaWV3LmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgeyBvQ29udGFpbmVyOiBDb250cm9sIH0pLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHR0aGlzLnBsYWNlaG9sZGVyLmVuYWJsZUFuaW1hdGlvbigpO1xuXHRcdFx0XHQob05hdkNvbnRhaW5lciBhcyB1bmtub3duIGFzIHsgc2hvd1BsYWNlaG9sZGVyOiBGdW5jdGlvbiB9KS5zaG93UGxhY2Vob2xkZXIoe30pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMuXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlTGF5b3V0XG5cdCAqIEByZXR1cm5zIFRoZSBzdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiBvciB1bmRlZmluZWQgaWYgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkXG5cdCAqL1xuXHRkaXNjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMoXG5cdFx0b2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dFxuXHQpOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdG9iamVjdFBhZ2VMYXlvdXQuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRjb25zdCBzdWJTZWN0aW9uc0luZm86IHtcblx0XHRcdFx0ZmU6IFN1YlNlY3Rpb25bXTtcblx0XHRcdFx0b3RoZXJzOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdO1xuXHRcdFx0fSA9IHsgZmU6IFtdLCBvdGhlcnM6IFtdIH07XG5cdFx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0aWYgKHN1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikpIHtcblx0XHRcdFx0XHRzdWJTZWN0aW9uc0luZm8uZmUucHVzaChzdWJTZWN0aW9uKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdWJTZWN0aW9uc0luZm8ub3RoZXJzLnB1c2goc3ViU2VjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0c3ViU2VjdGlvbnNJbmZvLmZlLmZvckVhY2goKHN1YlNlY3Rpb24pID0+IHN1YlNlY3Rpb24uZGlzY29ubmVjdFZpc2liaWxpdHlPYnNlcnZlcigpKTtcblx0XHRcdHJldHVybiBzdWJTZWN0aW9uc0luZm87XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsb2FkaW5nIHN0cmF0ZWd5IGZvciB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqIEByZXR1cm5zIFRoZSBsb2FkaW5nIHN0cmF0ZWd5IGZvciB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqL1xuXHRnZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZGF0YShcImRpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvblwiKSA9PT0gXCJ0cnVlXCI7XG5cdH1cblxuXHRwcml2YXRlIGdldEZpcnN0RWRpdGFibGVJbnB1dCgpOiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkb21FZGl0YWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKTtcblx0XHRyZXR1cm4gZG9tRWRpdGFibGVFbGVtZW50ID8gVUk1RWxlbWVudC5jbG9zZXN0VG8oZG9tRWRpdGFibGVFbGVtZW50KSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IGluIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIG9iamVjdFBhZ2UgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IGZvdW5kXG5cdCAqL1xuXHRwcml2YXRlIGdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvYmplY3RQYWdlOiBPYmplY3RQYWdlTGF5b3V0KTogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gSW4gZGlzcGxheSBtb2RlLCBpZiBhIHZpc2libGUgcHJpbWFyeSBhY3Rpb24gd2l0aCB0aGUgZW1waGFzaXMgZXhpc3RzIGluIHRoZSBmb290ZXIsIGl0IG11c3QgYmUgdGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IG9uIHRoZSBwYWdlLlxuXHRcdGNvbnN0IGZvb3RlciA9IG9iamVjdFBhZ2UuZ2V0Rm9vdGVyKCk7XG5cdFx0Y29uc3QgZm9vdGVyUHJpbWFyeUFjdGlvbiA9IGZvb3RlclxuXHRcdFx0PyB0aGlzLl9nZXRQcmltYXJ5QWN0aW9uU2hvcnRjdXRDYW5kaWRhdGVzKGZvb3RlciBhcyB1bmtub3duIGFzIE1hbmFnZWRPYmplY3QsIHRydWUpWzBdXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRpZiAoZm9vdGVyUHJpbWFyeUFjdGlvbikge1xuXHRcdFx0cmV0dXJuIGZvb3RlclByaW1hcnlBY3Rpb247XG5cdFx0fVxuXHRcdC8vIEZhbGxiYWNrOiBmaXJzdCB2aXNpYmxlICYgZW5hYmxlZCBoZWFkZXIgYWN0aW9uIChFZGl0LCBldGMuKVxuXHRcdGxldCBmaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYWN0aW9ucyA9IG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSAmJiAob2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUpLmdldEFjdGlvbnMoKTtcblx0XHRpZiAoYWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRmaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhY3Rpb25zLmZpbmQoZnVuY3Rpb24gKGFjdGlvbjogQ29udHJvbCkge1xuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBEcmFmdCBzd2l0Y2ggYW5kIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IGF2YXRhciBjb250cm9sc1xuXHRcdFx0XHQvLyB0aGVyZSBpcyBhIFRvb2xiYXJTcGFjZXIgaW4gdGhlIGFjdGlvbnMgYWdncmVnYXRpb24gd2hpY2ggd2UgbmVlZCB0byBleGNsdWRlIGhlcmUhXG5cdFx0XHRcdC8vIER1ZSB0byB0aGUgQUNDIHJlcG9ydCwgd2UgYWxzbyBuZWVkIG5vdCB0byBjaGVjayBmb3IgdGhlIEludmlzaWJsZVRleHQgZWxlbWVudHNcblx0XHRcdFx0aWYgKGFjdGlvbi5pc0E8U3VtbWFyaXphdGlvbkJ1dHRvbj4oXCJzYXAuZmUubWFjcm9zLmFpLlN1bW1hcml6YXRpb25CdXR0b25cIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uLmdldENvbnRlbnQoKT8uZ2V0VmlzaWJsZSgpID8/IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8U2hhcmVBUEk+KFwic2FwLmZlLm1hY3Jvcy5TaGFyZVwiKSB8fFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8RWFzeUZpbGxCdXR0b24+KFwic2FwLmZlLm1hY3Jvcy5haS5FYXN5RmlsbEJ1dHRvblwiKSB8fFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8Q29sbGFib3JhdGlvbkRyYWZ0PihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5jb21wb25lbnRzLkNvbGxhYm9yYXRpb25EcmFmdFwiKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZSBhbmQgQ29sbGFib3JhdGlvbkRyYWZ0IGRvZXMgbm90IGhhdmUgYSBkaXNhYmxlIHByb3BlcnR5XG5cdFx0XHRcdFx0Ly8gaGVuY2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZiBpdCBpcyBkaXNhYmxlZCBvciBub3Rcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uLmdldFZpc2libGUoKTtcblx0XHRcdFx0fSBlbHNlIGlmICghYWN0aW9uLmlzQTxJbnZpc2libGVUZXh0PihcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIWFjdGlvbi5pc0E8VG9vbGJhclNwYWNlcj4oXCJzYXAubS5Ub29sYmFyU3BhY2VyXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRWaXNpYmxlKCkgJiYgKGFjdGlvbiBhcyBCdXR0b24pLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBmaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgYmluZGluZ3Mgb2YgYmxvY2tzIGluIE9iamVjdCBQYWdlIExheW91dCBiYXNlZCBvbiB0aGUgaXRzIG92ZXJhbGwgY29udGVudC5cblx0ICogQHBhcmFtIG9iamVjdFBhZ2UgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICovXG5cdF9kaXNhYmxlQmxvY2tzQmluZGluZ3ModGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9iamVjdFBhZ2U6IE9iamVjdFBhZ2VMYXlvdXQpOiB2b2lkIHtcblx0XHRjb25zdCBhU2VjdGlvbnMgPSBvYmplY3RQYWdlLmdldFNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYlVzZUljb25UYWJCYXIgPSBvYmplY3RQYWdlLmdldFVzZUljb25UYWJCYXIoKTtcblx0XHRsZXQgaVNraXAgPSAzOyAvLyAzIHNlY3Rpb25zL3N1YnNlY3Rpb25zIGFyZSBsb2FkZWQgaW5pdGlhbGx5LCB0aGUgb3RoZXJzIGFyZSBsb2FkZWQgbGF6aWx5XG5cdFx0Y29uc3QgYklzSW5FZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGNvbnN0IGJFZGl0YWJsZUhlYWRlciA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuZWRpdGFibGVIZWFkZXJDb250ZW50O1xuXHRcdGNvbnN0IGZpcnN0VmlzaWJpbGl0eUJpbmRpbmcgPSB0aGlzLl9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZygpO1xuXHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRjb25zdCBvU2VjdGlvbiA9IGFTZWN0aW9uc1tpU2VjdGlvbl07XG5cdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0Ly8gSW4gSWNvblRhYkJhciBtb2RlIGtlZXAgdGhlIHNlY29uZCBzZWN0aW9uIGJvdW5kIGlmIHRoZXJlIGlzIGFuIGVkaXRhYmxlIGhlYWRlciBhbmQgd2UgYXJlIHN3aXRjaGluZyB0byBkaXNwbGF5IG1vZGVcblx0XHRcdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNbaVN1YlNlY3Rpb25dO1xuXHRcdFx0XHRjb25zdCBkaXNhYmxlQmluZGluZ0NvbnRleHRDb25kaXRpb24gPVxuXHRcdFx0XHRcdCh0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmXG5cdFx0XHRcdFx0XHQoaVNraXAgPCAxIHx8IChiVXNlSWNvblRhYkJhciAmJiAoaVNlY3Rpb24gPiAxIHx8IChpU2VjdGlvbiA9PT0gMSAmJiAhYkVkaXRhYmxlSGVhZGVyICYmICFiSXNJbkVkaXRNb2RlKSkpKSkgfHxcblx0XHRcdFx0XHQoIXRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkgJiZcblx0XHRcdFx0XHRcdCgoIWJVc2VJY29uVGFiQmFyICYmIChpU2tpcCA8IDEgfHwgb1N1YlNlY3Rpb24uZ2V0QmluZGluZyhcInZpc2libGVcIikpKSB8fCAvL2lmIHdlIGFyZSBub3QgaW4gSWNvblRhYkJhciBtb2RlLCBhbGwgc2VjdGlvbiB3aXRoIGluZGV4ID49MyBvciB3aXRoIHZpc2liaWxpdHkgYmluZGluZyBzaG91bGQgYmUgZGlzY29ubmVjdGVkXG5cdFx0XHRcdFx0XHRcdCghYlVzZUljb25UYWJCYXIgJiYgIWZpcnN0VmlzaWJpbGl0eUJpbmRpbmcgJiYgaVNraXAgPCAxKSB8fCAvLyBpZiBubyBzdWJzZWN0aW9uIGhhcyB2aXNpYmlsaXR5IGJpbmRpbmcgYW5kIHdlIGFyZSBub3QgaW4gSWNvblRhYkJhciBtb2RlXG5cdFx0XHRcdFx0XHRcdChiVXNlSWNvblRhYkJhciAmJiAoaVNlY3Rpb24gPiAxIHx8IChpU2VjdGlvbiA9PT0gMSAmJiAhYkVkaXRhYmxlSGVhZGVyICYmICFiSXNJbkVkaXRNb2RlKSkpKSk7XG5cdFx0XHRcdGlmIChkaXNhYmxlQmluZGluZ0NvbnRleHRDb25kaXRpb24pIHtcblx0XHRcdFx0XHQvLyBTdWJTZWN0aW9uJ3MgYmluZGluZyBpcyBlbmFibGVkLlxuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0Y29uc3QgYmxvY2tzID0gb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCk7XG5cdFx0XHRcdFx0Ly8gU3ViU2VjdGlvbidzIGNvbnRlbnRzIGJpbmRpbmcgaXMgZGlzYWJsZWQuXG5cdFx0XHRcdFx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoYmxvY2suaXNBPFN1YlNlY3Rpb25CbG9jaz4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGJsb2NrLmNvbnRlbnQuc2V0QmluZGluZ0NvbnRleHQ/LihudWxsKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGJsb2NrLnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKS5mb3JFYWNoKChzdWJCbG9jaykgPT4gc3ViQmxvY2suc2V0QmluZGluZ0NvbnRleHQobnVsbCkpO1xuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLmdldEFjdGlvbnMoKS5mb3JFYWNoKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNldEJpbmRpbmdDb250ZXh0KG51bGwpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10pOiBJbnB1dEJhc2UgfCB1bmRlZmluZWQge1xuXHRcdGlmIChhU3ViU2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdGZvciAoY29uc3Qgc3ViU2VjdGlvbiBvZiBhU3ViU2VjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGFCbG9ja3MgPSBzdWJTZWN0aW9uLmdldEJsb2NrcygpIGFzIChGb3JtIHwgRm9ybUFQSSlbXTtcblxuXHRcdFx0aWYgKGFCbG9ja3MpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBibG9ja0NvbnRyb2wgb2YgYUJsb2Nrcykge1xuXHRcdFx0XHRcdGlmIChibG9ja0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQ/LigpKSB7XG5cdFx0XHRcdFx0XHRsZXQgYUZvcm1Db250YWluZXJzO1xuXG5cdFx0XHRcdFx0XHRpZiAoYmxvY2tDb250cm9sLmlzQTxGb3JtPihcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGJsb2NrQ29udHJvbC5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChibG9ja0NvbnRyb2wuZ2V0Q29udGVudCAmJiBibG9ja0NvbnRyb2wuZ2V0Q29udGVudCgpPy5pc0E8Rm9ybT4oXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSAoYmxvY2tDb250cm9sLmdldENvbnRlbnQoKSBhcyBGb3JtKS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChibG9ja0NvbnRyb2w/LmdldENvbnRlbnQ/LigpPy5pc0E8Rm9ybUFQST4oXCJzYXAuZmUubWFjcm9zLmZvcm0uRm9ybUFQSVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSAoKGJsb2NrQ29udHJvbC5nZXRDb250ZW50KCkgYXMgRm9ybUFQSSkuZ2V0Q29udGVudCgpIGFzIEZvcm0pLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgZm9ybUNvbnRhaW5lciBvZiBhRm9ybUNvbnRhaW5lcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRm9ybUVsZW1lbnRzID0gZm9ybUNvbnRhaW5lci5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtRWxlbWVudCBvZiBhRm9ybUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBmb3JtRWxlbWVudC5nZXRGaWVsZHMoKSBhcyBJbnB1dEJhc2VbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW1wdHlGaWVsZCA9IHRoaXMuZ2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoYUZpZWxkcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbXB0eUZpZWxkKSByZXR1cm4gZW1wdHlGaWVsZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZlcmlmeSBpZiB0aGUgZmlyc3QgZmllbGQgaXMgZW1wdHkgYW5kIHJlcXVpcmVkLlxuXHQgKiBAcGFyYW0gZmllbGRzIFRoZSBmaWVsZHMgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVGhlIGZpcnN0IGVtcHR5IHJlcXVpcmVkIGZpZWxkIG9yIHVuZGVmaW5lZCBpZiBubyBzdWNoIGZpZWxkIGV4aXN0c1xuXHQgKi9cblx0Z2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoZmllbGRzOiBJbnB1dEJhc2VbXSk6IElucHV0QmFzZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0aWYgKCFmaWVsZHNbMF0uZ2V0UmVxdWlyZWQ/LigpKSByZXR1cm47XG5cblx0XHRsZXQgaXNFbXB0eSA9IGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChmaWVsZHNbMF0uaXNBKFwic2FwLmZlLm1hY3Jvcy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdFx0Y29uc3QgaXRlbXMgPSAoZmllbGRzWzBdIGFzIHVua25vd24gYXMgTXVsdGlWYWx1ZUZpZWxkQmxvY2spLmdldE11bHRpVmFsdWVGaWVsZCgpLmdldEl0ZW1zKCk7XG5cdFx0XHRcdGlzRW1wdHkgPSBpdGVtcy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IChmaWVsZHNbMF0gYXMgSW5wdXRCYXNlKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRpc0VtcHR5ID0gIXZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gY2hlY2tpbmcgZmllbGQgcHJvcGVydGllczogJHtlcnJvcn1gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNFbXB0eSA/IGZpZWxkc1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGluaXRpYWwgZm9jdXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcGFyYW0gYVN1YlNlY3Rpb25zIE9iamVjdCBwYWdlIHN1YiBzZWN0aW9uc1xuXHQgKiBAcGFyYW0gZnJvbVRhYk5hdmlnYXRpb24gSW5kaWNhdGVzIGlmIHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgYSB0YWIgbmF2aWdhdGlvblxuXHQgKi9cblx0X3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10sIGZyb21UYWJOYXZpZ2F0aW9uID0gZmFsc2UpOiB2b2lkIHtcblx0XHRzZXRUaW1lb3V0KFxuXHRcdFx0ZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdFx0Y29uc3Qgb01hbmRhdG9yeUZpZWxkID0gdGhpcy5fZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zKTtcblx0XHRcdFx0bGV0IG9GaWVsZFRvRm9jdXM6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvTWFuZGF0b3J5RmllbGQpIHtcblx0XHRcdFx0XHRpZiAob01hbmRhdG9yeUZpZWxkLmlzQShcInNhcC5mZS5tYWNyb3MuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gKG9NYW5kYXRvcnlGaWVsZCBhcyB1bmtub3duIGFzIE11bHRpVmFsdWVGaWVsZEJsb2NrKS5nZXRNdWx0aVZhbHVlRmllbGQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChcblx0XHRcdFx0XHRcdFx0b01hbmRhdG9yeUZpZWxkIGFzIHVua25vd24gYXMgeyBjb250ZW50OiB7IGdldENvbnRlbnRFZGl0OiBGdW5jdGlvbiB9IH1cblx0XHRcdFx0XHRcdCkuY29udGVudC5nZXRDb250ZW50RWRpdCgpWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gdGhpcy5nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSA/PyB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9GaWVsZFRvRm9jdXMpIHtcblx0XHRcdFx0XHRjb25zdCBmb2N1c0luZm8gPSBvRmllbGRUb0ZvY3VzLmdldEZvY3VzSW5mbygpIGFzIHsgdGFyZ2V0SW5mbzogb2JqZWN0IH07XG5cdFx0XHRcdFx0Zm9jdXNJbmZvLnRhcmdldEluZm8gPSB7IHNpbGVudDogdHJ1ZSB9O1xuXHRcdFx0XHRcdGlmIChvRmllbGRUb0ZvY3VzLmlzQShcInNhcC51aS5tZGMuZmllbGQuRmllbGRJbnB1dFwiKSkge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9GaWVsZFRvRm9jdXMuZ2V0UGFyZW50KCkgYXMgVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5pc0E8U2VhcmNoRmllbGQ+KFwic2FwLm0uU2VhcmNoRmllbGRcIikgJiZcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMuZ2V0RW5hYmxlU3VnZ2VzdGlvbnMoKSAmJlxuXHRcdFx0XHRcdFx0IW9GaWVsZFRvRm9jdXMuaXNCb3VuZChcImVuYWJsZVN1Z2dlc3Rpb25zXCIpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBmb2N1cyBpcyBzZXQgb24gYSBzZWFyY2ggZmllbGQgd2l0aCBzdWdnZXN0aW9ucywgd2UgdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgc3VnZ2VzdGlvbnMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGVtIG9uIGZvY3VzXG5cdFx0XHRcdFx0XHQvLyB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBib3VuZCAodG8gYXZvaWQgbW9kaWZ5aW5nIHNvbWV0aGluZyBpbiBhIG1vZGVsKVxuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5zZXRFbmFibGVTdWdnZXN0aW9ucyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLnNldEVuYWJsZVN1Z2dlc3Rpb25zKHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5mb2N1cyhmb2N1c0luZm8pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fS5iaW5kKHRoaXMpLFxuXHRcdFx0ZnJvbVRhYk5hdmlnYXRpb24gPyAzMDAgOiAwXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpcnN0IHN1Yi1zZWN0aW9uIHdpdGggYSB2aXNpYmlsaXR5IGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgdmlldy5cblx0ICogU2VjdGlvbnMgd2l0aCBiaW5kaW5ncyBvbiBpbnRlcm5hbCBtb2RlbHMgb25seSBhcmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgVGhlIHZpc2liaWxpdHkgYmluZGluZyBvZiB0aGUgZmlyc3Qgc3ViLXNlY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdF9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZygpOiBCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBhbGxzdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgY3VycmVudE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRyZXR1cm4gYWxsc3ViU2VjdGlvbnNcblx0XHRcdC5maW5kKFxuXHRcdFx0XHQoc3ViU2VjdGlvbikgPT5cblx0XHRcdFx0XHQoc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKSBhcyBDb21wb3NpdGVCaW5kaW5nIHwgdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0Py5nZXRCaW5kaW5ncz8uKClcblx0XHRcdFx0XHRcdC5zb21lKChiaW5kaW5nKSA9PiBiaW5kaW5nLmdldE1vZGVsKCkgPT09IGN1cnJlbnRNb2RlbClcblx0XHRcdClcblx0XHRcdD8uZ2V0QmluZGluZyhcInZpc2libGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYWxsIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyB0byBiZSByZXNvbHZlZC5cblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3IgdGhlICd2aXNpYmlsaXR5Q2hhbmdlZCcgZXZlbnQgIC4gVGhlIGNoYW5nZSBldmVudCBpcyBmaXJlZCBldmVuIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdCBjaGFuZ2VkIGJ1dCBqdXN0IHJlc29sdmVkLlxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgd2hlbiBlYWNoIHZpc2liaWxpdHkgYmluZGluZyBpcyByZXNvbHZlZC5cblx0ICovXG5cdHdhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQoKTogUHJvbWlzZTx1bmtub3duPltdIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKVxuXHRcdFx0LmZpbHRlcihcblx0XHRcdFx0KHN1YlNlY3Rpb24pID0+IHN1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikgJiYgc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKVxuXHRcdFx0KSAvL2ZpbHRlcmluZyBvbiBGRSBzdWJzZWN0aW9ucyB3aXRoIHZpc2liaWxpdHkgYmluZGluZylcblx0XHRcdC5tYXAoYXN5bmMgKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzdWJTZWN0aW9uLmF0dGFjaEV2ZW50T25jZShcInZpc2liaWxpdHlDaGFuZ2VkXCIsIHJlc29sdmUpKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBVSTVFdmVudDx7IHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uIH0+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRpZiAob1N1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikpIHtcblx0XHRcdG9TdWJTZWN0aW9uLmhhbmRsZVN1YlNlY3Rpb25DcmVhdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHR9XG5cdFx0Y29uc3QgYmxvY2tzID0gb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCk7XG5cdFx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0XHRpZiAoYmxvY2suaXNBPFN1YlNlY3Rpb25CbG9jaz4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRcdGJsb2NrLmNvbnRlbnQuc2V0QmluZGluZ0NvbnRleHQ/Lih1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvU3ViU2VjdGlvbi5nZXRNb3JlQmxvY2tzKCkuZm9yRWFjaCgoc3ViQmxvY2spID0+IHN1YkJsb2NrLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHRcdG9TdWJTZWN0aW9uLmdldEFjdGlvbnMoKS5mb3JFYWNoKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQge1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHQvLyBGdW5jdGlvbiB0byBuYXZpZ2F0ZSBiYWNrLCBvciBkaXNwbGF5IHRoZSBsYXVuY2hwYWQgaWYgd2UncmUgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGhpc3Rvcnlcblx0XHRjb25zdCBuYXZCYWNrID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0Ly8gVXNlIHRoZSBuZXcgTmF2aWdhdGlvbiBBUEkgaWYgaXQncyBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIsIHRvIGNoZWNrIGlmIHdlIGNhbiBnbyBiYWNrIGluIGhpc3RvcnkuXG5cdFx0XHRjb25zdCBjYW5Hb0JhY2sgPSAod2luZG93IGFzIHsgbmF2aWdhdGlvbj86IHsgY2FuR29CYWNrPzogYm9vbGVhbiB9IH0pLm5hdmlnYXRpb24/LmNhbkdvQmFjaztcblx0XHRcdGlmIChjYW5Hb0JhY2sgPT09IHRydWUpIHtcblx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNhbkdvQmFjayA9PT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGYWxsYmFjayBpbiBjYXNlIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgTmF2aWdhdGlvbiBBUElcblx0XHRcdFx0Y29uc3QgY3VycmVudFVSTCA9IGRvY3VtZW50LlVSTDtcblx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gcHJldmlvdXMgcGFnZSBpbiB0aGUgaGlzdG9yeSwgaGlzdG9yeS5iYWNrIGRvZXMgbm90aGluZy5cblx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHVzZSBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCwgdGhhdCB3aWxsIGRpc3BsYXkgdGhlIGhvbWUgcGFnZVxuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAoZG9jdW1lbnQuVVJMID09PSBjdXJyZW50VVJMKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIDUwMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdC8vIFRoaXMgb2JqZWN0IHBhZ2UgZG9lc24ndCBoYXZlIGEgYmluZGluZyBjb250ZXh0LCBidXQgc3RpbGwgaGFuZGxlcyB0aGUgc2hlbGwgYmFjayBuYXZpZ2F0aW9uIC0tPiBwZm9ybSB0aGUgbmF2IGJhY2sgYW5kIHJlbW92ZSB0aGUgbmF2YmFjayBoYW5kbGVyIGFzIGl0IG1ha2VzIG5vIHNlbnNlIGFueSBsb25nZXJcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0LmdldFNoZWxsU2VydmljZXMoKVxuXHRcdFx0XHQuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKVxuXHRcdFx0XHQudGhlbihuYXZCYWNrKVxuXHRcdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIHNldHRpbmcgYmFjayBuYXZpZ2F0aW9uXCIsIGUpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaGlkZGVuRHJhZnRFbmFibGVkID0gKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdClcblx0XHRcdFx0Py5lbmFibGVkO1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdG5hdkJhY2ssXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGhpZGRlbkRyYWZ0RW5hYmxlZCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcoaW5wdXRCaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXc/LmdldFZpZXdEYXRhKCk/LnZpZXdMZXZlbDtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRpZiAoW05hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sIE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3NdLmluY2x1ZGVzKG1QYXJhbWV0ZXJzPy5yZWFzb24gYXMgTmF2aWdhdGlvblJlYXNvbikpIHtcblx0XHRcdHRoaXMuZWRpdEZsb3cuc3RvcmVTaWJsaW5nQ29udGV4dERhdGEoaW5wdXRCaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaWRlRWZmZWN0cy5jbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cblx0XHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0XHQvLyBOZWVkIHRvIGZpeCB3aXRoIEJMSTogRklPUklURUNIUDEtMTUyNzRcblx0XHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRcdGNvbnN0IG9UYWJsZVJvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYXBwbHkgZm9yIGJvdGggZWRpdCBhbmQgZGlzcGxheSBtb2RlIGluIHN0aWNreVxuXHRcdFx0XHRcdFx0KG9UYWJsZVJvd0JpbmRpbmcgYXMgdW5rbm93biBhcyB7IHJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzOiBGdW5jdGlvbiB9KS5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHRcdC8vIENsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFuZCB1cGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYWNjb3JkaW5nbHlcblx0XHRcdFx0Ly8gV2lsbCB0byBiZSBmaXhlZCB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSB0YWJsZUFQSSA/IEpTT04ucGFyc2UodGFibGVBUEkudGFibGVEZWZpbml0aW9uLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCkgOiB7fTtcblxuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBbXSwgXCJ0YWJsZVwiKTtcblxuXHRcdFx0XHRvVGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGU7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRcdG9GaW5hbFVJU3RhdGU6IFByb21pc2U8dW5rbm93bj4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKSxcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFRhYmxlSGVscGVyLmVuYWJsZUZhc3RDcmVhdGlvblJvdyhcblx0XHRcdFx0XHRcdG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0b0ZpbmFsVUlTdGF0ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9Nb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIFN0b3JlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiBpbnRlcm5hbCBtb2RlbCBmb3IgYWNjZXNzIGJ5IGNvbnRyb2xsZXIgZXh0ZW5zaW9uc1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcIm5hdmlnYXRpb25QYXJhbWV0ZXJzXCIsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZShiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHNcblx0XHRcdHRoaXMuX3VwZGF0ZVJlbGF0ZWRBcHBzKCk7XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBiaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwge30sIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJpbmRpbmcgaXMgcmVhZHkgaGVuY2UgY2FsbGluZyBpdCBpbiBvbkFmdGVyQmluZGluZ1xuXHRcdFx0aWYgKHRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIHVua25vd24gYXMgeyBfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50czogRnVuY3Rpb24gfSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9UbyBDb21wdXRlIHRoZSBFZGl0IEJpbmRpbmcgb2YgdGhlIHN1Yk9iamVjdCBwYWdlIHVzaW5nIHJvb3Qgb2JqZWN0IHBhZ2UsIGNyZWF0ZSBhIGNvbnRleHQgZm9yIGRyYWZ0IHJvb3QgYW5kIHVwZGF0ZSB0aGUgZWRpdCBidXR0b24gaW4gc3ViIE9QIHVzaW5nIHRoZSBjb250ZXh0XG5cdFx0XHRBY3Rpb25SdW50aW1lLnVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKFtdKTtcblx0XHR9XG5cdFx0Ly8gd2UgYXJlIGNsZWFyaW5nIGFueSBwcmV2aW91cyBkYXRhIGZyb20gcmVjb21tZW5kYXRpb25zIGV2ZXJ5IHRpbWUgd2UgY29tZSB0byBuZXcgT1Bcblx0XHQvLyBzbyB0aGF0IGNhY2hlZCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzaG93biB0byB1c2VyXG5cdFx0aWYgKHZpZXdMZXZlbCAmJiB2aWV3TGV2ZWwgPT09IDEpIHtcblx0XHRcdG9GaW5hbFVJU3RhdGU/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9ucy5jbGVhclJlY29tbWVuZGF0aW9ucygpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLmRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShtUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQpO1xuXHRcdHRoaXMuX3NldE9QTWVzc2FnZVN0cmlwSW50ZXJuYWxDb250ZXh0KCk7XG5cblx0XHRjb25zdCBhcHBseUFwcFN0YXRlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKHZpZXcpO1xuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IoYXBwbHlBcHBTdGF0ZSk7XG5cblx0XHR0aGlzLnJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdFx0dGhpcy5zdWJTZWN0aW9ucyxcblx0XHRcdG9PYmplY3RQYWdlLFxuXHRcdFx0YXBwbHlBcHBTdGF0ZSxcblx0XHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggIT09IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKVxuXHRcdCk7XG5cblx0XHQvLyBDYXB0dXJlIHN5bmNocm9ub3VzbHkgdG8gYXZvaWQgcmFjZSB3aXRoIHN1YnNlcXVlbnQgbmF2aWdhdGlvbnNcblx0XHRjb25zdCBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gdGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkO1xuXHRcdHRoaXMucGVuZGluZ1RhcmdldENvbnRyb2xJZCA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oYXBwbHlBcHBTdGF0ZSwgb09iamVjdFBhZ2UsIHBlbmRpbmdUYXJnZXRDb250cm9sSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbmF2aWdhdGlvbiB0byBhIHRhcmdldCBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gYWZ0ZXIgYXBwIHN0YXRlIGlzIGFwcGxpZWQuXG5cdCAqIFRoaXMgY29vcmRpbmF0ZXMgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb24gZnJvbSB0d28gc291cmNlczpcblx0ICogLSBJbi1hcHAgbmF2aWdhdGlvbjogcGVuZGluZ1RhcmdldENvbnRyb2xJZCBjYXB0dXJlZCBiZWZvcmUgYXBwbHlBcHBTdGF0ZS5cblx0ICogLSBDcm9zcy1hcHAgbmF2aWdhdGlvbjogeEFwcFN0YXRlIHRhcmdldENvbnRyb2xJZCBzdG9yZWQgYnkgQXBwU3RhdGVIYW5kbGVyIGR1cmluZyBMUiB0byBPUCB0cmFuc2l0aW9uLlxuXHQgKiBAcGFyYW0gYXBwbHlBcHBTdGF0ZSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhcHAgc3RhdGUgaGFzIGJlZW4gYXBwbGllZC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkIFRoZSB0YXJnZXRDb250cm9sSWQgY2FwdHVyZWQgYmVmb3JlIGFwcGx5QXBwU3RhdGUsIGlmIGFueS5cblx0ICovXG5cdHByaXZhdGUgaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oXG5cdFx0YXBwbHlBcHBTdGF0ZTogUHJvbWlzZTx2b2lkIHwgb2JqZWN0Pixcblx0XHRvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCxcblx0XHRwZW5kaW5nVGFyZ2V0Q29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0YXBwbHlBcHBTdGF0ZVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEFwcFN0YXRlSGFuZGxlcigpPy5jb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCgpO1xuXHRcdFx0XHRjb25zdCB0YXJnZXRDb250cm9sSWQgPSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID8/IHhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZDtcblx0XHRcdFx0aWYgKCF0YXJnZXRDb250cm9sSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzICAobmVlZGVkIGZvciBsYXp5IGxvYWRpbmcgc2NlbmFyaW9zKVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHRoaXMud2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8vIFNvbWUgdmlzaWJpbGl0eSBiaW5kaW5ncyBmYWlsZWQgdG8gcmVzb2x2ZSwgcHJvY2VlZGluZyBhbnl3YXlcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIHBhZ2VSZWFkeSB0byBlbnN1cmUgT2JqZWN0UGFnZSBpcyBmdWxseSBpbml0aWFsaXplZFxuXHRcdFx0XHRhd2FpdCB0aGlzLnBhZ2VSZWFkeS53YWl0UGFnZVJlYWR5KCk7XG5cblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZSwgdGFyZ2V0Q29udHJvbElkKTtcblx0XHRcdFx0cmV0dXJuOyAvLyBSZXF1aXJlZCBieSBsaW50ZXIgcnVsZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHQvLyBhcHBseUFwcFN0YXRlIGZhaWxlZCAtIHNraXAgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb25cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHRhcmdldCBzZWN0aW9uIHdpdGggYXV0b21hdGljIHJlLW5hdmlnYXRpb24gaWYgVVggcnVsZXMgcmVzZXQgdGhlIHNlbGVjdGlvbi5cblx0ICogUG9sbHMgdGhlIHNlY3Rpb24gc3RhdGUgc2luY2Ugc2V0U2VsZWN0ZWRTZWN0aW9uKCkgZG9lc24ndCBmaXJlIHRoZSBuYXZpZ2F0ZSBldmVudC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCwgdGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IHNlY3Rpb24gSUQgZm9yIGNvbXBhcmlzb25cblx0XHRjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZCh0YXJnZXRDb250cm9sSWQpO1xuXHRcdGNvbnN0IGlzU2VjdGlvbiA9IHRhcmdldENvbnRyb2w/LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpO1xuXHRcdGNvbnN0IHRhcmdldFNlY3Rpb25JZCA9IGlzU2VjdGlvbiA/IHRhcmdldENvbnRyb2w/LmdldElkKCkgOiAodGFyZ2V0Q29udHJvbD8uZ2V0UGFyZW50KCkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pPy5nZXRJZCgpO1xuXG5cdFx0Ly8gTmF2aWdhdGUgZnVuY3Rpb24gd2l0aCBndWFyZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBjYWxscyB3aGVuIGFscmVhZHkgb24gdGFyZ2V0XG5cdFx0Y29uc3QgbmF2aWdhdGVUb1RhcmdldCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvblxuXHRcdFx0fVxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkKTtcblx0XHR9O1xuXG5cdFx0Ly8gTmF2aWdhdGUgaW1tZWRpYXRlbHlcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0KCk7XG5cblx0XHQvLyBTa2lwIHBvbGxpbmcgaWYgYWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvbiAobmF2aWdhdGlvbiB3YXMgbm8tb3Agb3Igc3VjY2VlZGVkIGltbWVkaWF0ZWx5KVxuXHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHR0aGlzLmhhc0luaXRpYWxMb2FkQ29tcGxldGVkID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTa2lwIHBvbGxpbmcgb24gc3Vic2VxdWVudCBuYXZpZ2F0aW9uc1xuXHRcdGlmICh0aGlzLmhhc0luaXRpYWxMb2FkQ29tcGxldGVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdC8vIFVzZXMgc2hhcmVkIHV0aWxpdHkgZnJvbSBoZWxwZXJzL1NlY3Rpb25OYXZpZ2F0aW9uSGVscGVyLnRzXG5cdFx0cG9sbEZvclNlY3Rpb25TdGFiaWxpdHkoe1xuXHRcdFx0Z2V0U2VsZWN0ZWRTZWN0aW9uOiAoKSA9PiBvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSxcblx0XHRcdHRhcmdldFNlY3Rpb25JZCxcblx0XHRcdG9uUmVzZXREZXRlY3RlZDogbmF2aWdhdGVUb1RhcmdldFxuXHRcdH0pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuIC0gcG9sbGluZyBmYWlsdXJlcyBhcmUgbm9uLWNyaXRpY2FsXG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRhcmdldFN1YlNlY3Rpb24gYmFzZWQgb24gdGhlIHRhcmdldCBjb250cm9sIElEIGZvciBhcHAgc3RhdGUgcGVyc2lzdGVuY2UuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRUYXJnZXRTdWJTZWN0aW9uKHRhcmdldENvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQodGFyZ2V0Q29udHJvbElkKTtcblx0XHRpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTdWJTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTdWJTZWN0aW9uXCIpKSB7XG5cdFx0XHR0aGlzLnRhcmdldFN1YlNlY3Rpb24gPSB0YXJnZXRDb250cm9sO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpKSB7XG5cdFx0XHRjb25zdCBzdWJTZWN0aW9ucyA9IHRhcmdldENvbnRyb2wuZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb25zWzBdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBuYXZpZ2F0aW9uIHRvIHRoZSB0YXJnZXQgc2VjdGlvbiBhbmQgdGhlbiB1cGRhdGVzIHRoZSBhcHAgc3RhdGUuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGFyZ2V0U3ViU2VjdGlvbiBCRUZPUkUgbmF2aWdhdGlvbiBmb3IgYXBwIHN0YXRlIHNhdmluZy5cblx0XHQvLyBzY3JvbGxUb1NlY3Rpb24oKSBkb2Vzbid0IGZpcmUgdGhlIG5hdmlnYXRlIGV2ZW50LCBzbyBvbk5hdmlnYXRlQ2hhbmdlIHdvbid0IGJlIGNhbGxlZC5cblx0XHR0aGlzLnNldFRhcmdldFN1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdC8vIFdhaXQgZm9yIEV4dGVuc2lvbkFQSSBwb2xsaW5nIHRvIGNvbXBsZXRlICh+MTAwbXMpIHBsdXMgc2Nyb2xsIHRvIGZpbmlzaFxuXHRcdC8vIGJlZm9yZSB1cGRhdGluZyBhcHAgc3RhdGUgYW5kIHNldHRpbmcgZm9jdXMuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZS51cGRhdGVBcHBTdGF0ZURlYm91bmNlZCgpO1xuXG5cdFx0XHQvLyBTZXQgZm9jdXMgaWYgaW4gZWRpdCBtb2RlIChmb3IgaW4tYXBwIG5hdmlnYXRpb24gdG8gc3ViLW9iamVjdCBwYWdlIGluIGVkaXQgbW9kZSlcblx0XHRcdC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2Nyb2xsVG9TZWN0aW9uKCkgZG9lc24ndCBmaXJlIG9uTmF2aWdhdGVDaGFuZ2UsXG5cdFx0XHQvLyBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgZm9jdXMgc2V0dGluZyBoZXJlXG5cdFx0XHRjb25zdCBpc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdGlmIChpc0luRWRpdE1vZGUgJiYgdGhpcy50YXJnZXRTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbdGhpcy50YXJnZXRTdWJTZWN0aW9uXSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMgYWZ0ZXIgdGhlIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYW5kIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZC5cblx0ICogVGhpcyBmdW5jdGlvbiB3YWl0IGZvciB0aGUgYXBwU2F0ZSB0byBiZSBhcHBsaWVkIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIG9ic2VydmVycyBhbmQgdGhlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgc2VjdGlvbiBpZiBpdCBjaGFuZ2VkIGR1cmluZyB0aGUgYXBwU3RhdGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBzdWJTZWN0aW9uSW5mbyBTdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZHVyaW5nIGRpc2Nvbm5lY3Rpb25cblx0ICogQHBhcmFtIG9iamVjdFBhZ2VMYXlvdXQgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHBhcmFtIHdhaXRGb3JBcHBseUFwcHN0YXRlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZFxuXHQgKiBAcGFyYW0gd2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB3YWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSByZWNvbm5lY3Rpbmcgb2JzZXJ2ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIG9ic2VydmVycyB3ZXJlIHJlY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGFzeW5jIHJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdHN1YlNlY3Rpb25JbmZvOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkLFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0d2FpdEZvckFwcGx5QXBwc3RhdGU6IFByb21pc2U8dW5rbm93bj4sXG5cdFx0d2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRydWVcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmIHN1YlNlY3Rpb25JbmZvKSB7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzID8gdGhpcy53YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzIDogW10pXG5cdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdC8vd2FpdGluZyBmb3IgdGhlIGFwcCBzdGF0ZSB0byBiZSBhcHBsaWVkIGJ0byBlbnN1cmUgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VjdGlvbiBpZiByZXF1aXJlZFxuXHRcdFx0XHRcdFx0YXdhaXQgd2FpdEZvckFwcGx5QXBwc3RhdGU7XG5cdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8uZmUuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4gc3ViU2VjdGlvbi5vYnNlcnZlQ3VycmVudFNlY3Rpb24oKSk7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8ub3RoZXJzXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChzdWJzZWN0aW9uKSA9PiBzdWJzZWN0aW9uLmdldFZpc2libGUoKSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmZpcmVFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgeyBzdWJTZWN0aW9uOiBzdWJTZWN0aW9uIH0pKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGNhcmRzIHdoZW4gdGhlIGJpbmRpbmcgaXMgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY2FyZHMgQXJyYXkgb2YgY2FyZHMgdG8gYmUgdXBkYXRlZFxuXHQgKi9cblx0YXN5bmMgX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKGNhcmRzOiBXcmFwcGVkQ2FyZFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UoKTtcblx0XHQvLyBPbmx5IGNvbGxlY3QgY2FyZHMgd2hlbiBjb25zdW1lcnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY2FyZHMgY2hhbm5lbFxuXHRcdGlmIChjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UuaGFzQ29sbGFib3JhdGlvbk1hbmFnZXJDb25uZWN0ZWQoKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb2xsYWJvcmF0aW9uTWFuYWdlci5jb2xsZWN0QXZhaWxhYmxlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0aWYgKGNhcmRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgY2FyZE9iamVjdCA9IHRoaXMuY29sbGFib3JhdGlvbk1hbmFnZXIudXBkYXRlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRBcHBJZCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SWQoKTtcblx0XHRcdFx0Y29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlLmFkZENhcmRzVG9Db2xsYWJvcmF0aW9uTWFuYWdlcihjYXJkT2JqZWN0LCBwYXJlbnRBcHBJZCwgdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSk7XG5cdFx0XHRcdGNvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZS5zaGFyZUF2YWlsYWJsZUNhcmRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IG9mIHRoZSBNZXNzYWdlc3RyaXAgT1AuXG5cdCAqL1xuXHRfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIiwgeyAuLi5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIikgfSk7XG5cdFx0aWYgKGludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHQob09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyB1bmtub3duIGFzIENvbnRyb2wpXG5cdFx0XHRcdD8uZmluZEVsZW1lbnRzKHRydWUsIChlbGVtOiBDb250cm9sKSA9PiBlbGVtLmlzQShcInNhcC5tLk1lc3NhZ2VTdHJpcFwiKSlcblx0XHRcdFx0LmZvckVhY2goKG1lc3NhZ2VTdHJpcDogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VTdHJpcC5zZXRCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dCh0aGlzLmdldEV4dGVuc2lvbkFQSSgpLl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpISxcblx0XHRcdFx0XHRcdFwiaW50ZXJuYWxcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcncyBiaW5kaW5nIGNvbnRleHQgYWxyZWFkeSBoYWQgbWVzc2FnZXMgdGhhdCB3ZXJlIG5vdCBjbGVhcmVkLCB3ZSB3b3VsZCBuZWVkIHRvIHJlLWV2YWx1YXRlIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAuXG5cdFx0XHR0aGlzLl9mblNob3dPUE1lc3NhZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2hvdyBhIG1lc3NhZ2Ugc3RyaXAgaWYgYSByZWRpcmVjdGlvbiB0byBhIG5vbi1kcmFmdCBlbGVtZW50IGhhcyBiZWVuIGRvbmUuXG5cdCAqIFJlbW92ZSB0aGUgbWVzc2FnZSBzdHJpcCBpbiBjYXNlIHdlIG5hdmlnYXRlIHRvIGFub3RoZXIgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlOYW1lIE5hbWUgb2YgdGhlIEVudGl0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1lc3NhZ2Vcblx0ICovXG5cdGRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShlbnRpdHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmNvbGxhYm9yYXRpb25NZXNzYWdlXSk7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZTtcblx0XHR9XG5cblx0XHRpZiAoZW50aXR5TmFtZSkge1xuXHRcdFx0dGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlJFUk9VVEVEX05BVklHQVRJT05fVE9fU0FWRURfVkVSU0lPTlwiLCBbZW50aXR5TmFtZV0pLFxuXHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbixcblx0XHRcdFx0dGFyZ2V0OiB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpXG5cdFx0XHR9KTtcblx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhbdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZV0pO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IHsgZm9yY2VGb2N1czogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIUNvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdGlmIChvRmlyc3RDbGlja2FibGVFbGVtZW50KSB7XG5cdFx0XHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRTZWN0aW9uID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKG9TZWxlY3RlZFNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGN0eHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vIHNldHRpbmcgdGhpcyBtb2RlbCBkYXRhIHRvIGJlIHVzZWQgZm9yIHJlY29tbWVuZGF0aW9ucyBiaW5kaW5nXG5cdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5zZXRQcm9wZXJ0eShcIi9jdXJyZW50Q3R4dFwiLCBjdHh0KTtcblxuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL1Nob3cgcG9wdXAgd2hpbGUgbmF2aWdhdGluZyBiYWNrIGZyb20gb2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBkcmFmdFxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gZG8gbm90IHJlcXVlc3QgcmVjb21tZW5kYXRpb25zIGFjdGlvbiBpZiB3ZSBhcmUgaW4gRGlzcGxheSBtb2RlXG5cdFx0Y29uc3QgaXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0VkaXRhYmxlICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0YXdhaXQgdGhpcy5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyhbeyBjb250ZXh0OiBvQmluZGluZ0NvbnRleHQgfV0pO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycz8uZm9yY2VGb2N1cykge1xuXHRcdFx0c2V0Rm9jdXMoKTtcblx0XHR9XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdHRoaXMuX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGhlIGZvbGxvd2luZyBjb2RpbmcgaXMgZG9uZSB0byBtZXJnZSBhbiBvcGVuIFBBVENIIGFuZCB0aGUgZHJhZnRwcmVwYXJlL2RyYWZ0YWN0aXZhdGVcblx0XHQvL3JlcXVlc3QgaW50byBvbmUgJGJhdGNoIHJlcXVlc3Rcblx0XHQvL1RvIGFjaGlldmUgdGhpcyB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIGF0IHRoZSBtb3VzZWRvd24gZXZlbnQgKGJlZm9yZSBmb2N1c291dCkgaW5cblx0XHQvL29yZGVyIHRvIHdhaXQgZm9yIHRoZSBkcmFmdCByZXF1ZXN0IGlzc3VlZCBpbiB0aGUgc2F2ZSBidXR0b25zIHByZXNzIGV2ZW50IGhhbmRsZXIuXG5cdFx0Ly9UaGUgcXVldWUgaXMgcmVsZWFzZWQgYWdhaW4gZHVyaW5nIG1vdXNldXAgKGJlZm9yZSBwcmVzcykuXG5cdFx0Ly9UaGlzIGlzIG9ubHkgcG9zc2libGUgb24gbm9uIHRvdWNoIGRldmljZXMgYmVjYXVzZSBvbiB0b3VjaCBkZXZpY2VzIHRoZSBmb2N1c291dCBhbmQgcHJlc3Ncblx0XHQvL2V2ZW50cyBhcmUgYm90aCBpbml0aWF0ZWQgYXQgdG91Y2hlbmQgYnkgc2FwLm0uQnV0dG9uLlxuXHRcdC8vbW91c2VIYW5kbGVyU2V0IGlzIHVzZWQgdG8gZW5zdXJlcyB0aGF0IHRoZSBldmVudCBoYW5kbGVycyBhcmUgYXR0YWNoZWQgb25seSBvbmUgdGltZS5cblx0XHQvL1RoZXJlIGNhbiBiZSBtdWx0aXBsZSBvblBhZ2VSZWFkeSBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZWRpdC9kaXNwbGF5IG1vZGVcblx0XHRpZiAoIXRoaXMubWVyZ2VQYXRjaERyYWZ0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3Qgc2F2ZUJ1dHRvbiA9IG9WaWV3LmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpTdGFuZGFyZEFjdGlvbjo6U2F2ZVwiKSBhcyBCdXR0b247XG5cdFx0XHRjb25zdCBhdXRvUXVldWVVbmxvY2sgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sudW5sb2NrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F2ZUJ1dHRvbi5kZXRhY2hCcm93c2VyRXZlbnQoXCJtb3VzZXVwXCIsIGF1dG9RdWV1ZVVubG9jayk7XG5cdFx0XHRcdHNhdmVCdXR0b24uZGV0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0fTtcblxuXHRcdFx0c2F2ZUJ1dHRvbj8uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLmxvY2soXCIkYXV0b1wiKTtcblx0XHRcdFx0XHQvL3doZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgYXdheSBmcm9tIHRoZSBzYXZlIGJ1dHRvbiB3aGlsZSBwcmVzc2VkIHRoZW4gdGhlcmUgd2lsbCBiZSBub1xuXHRcdFx0XHRcdC8vbW91c2V1cCBldmVudCBvbiB0aGUgc2F2ZSBidXR0b24uIFRoZXJlZm9yZSwgdGhlIHVubG9ja2luZyBpcyBkb25lIG9uIFwibW91c2V1cFwiIGFuZCBcImJsdXJcIlxuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2V1cFwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tZXJnZVBhdGNoRHJhZnQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGU7XG5cdH1cblxuXHRfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTogT2JqZWN0UGFnZUxheW91dCB7XG5cdFx0cmV0dXJuIHRoaXMuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdH1cblxuXHRhc3luYyBfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTogUHJvbWlzZTx7IHRpdGxlOiBzdHJpbmc7IHN1YnRpdGxlOiBzdHJpbmc7IGludGVudDogc3RyaW5nOyBpY29uOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4ge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhKSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VEZXNjcmlwdGlvbiA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YSkge1xuXHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcIk9iamVjdFBhZ2VEZXNjcmlwdGlvblwiO1xuXHRcdH0pO1xuXHRcdGNvbnN0IGV4dHJhY3RQYXRocyA9IChiaW5kaW5nSW5mbz86IHsgcGFydHM/OiB7IHBhdGg/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nIH1bXSB9KTogc3RyaW5nW10gPT5cblx0XHRcdEFycmF5LmZyb20oXG5cdFx0XHRcdG5ldyBTZXQoXG5cdFx0XHRcdFx0KGJpbmRpbmdJbmZvPy5wYXJ0cyB8fCBbXSlcblx0XHRcdFx0XHRcdC5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0Lm1vZGVsKVxuXHRcdFx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXRoIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y29uc3Qgc3VidGl0bGVQYXRocyA9IGV4dHJhY3RQYXRocyhvT2JqZWN0UGFnZVN1YnRpdGxlPy5nZXRCaW5kaW5nSW5mbyhcInZhbHVlXCIpKTtcblx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGhzID0gZXh0cmFjdFBhdGhzKG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikpO1xuXHRcdGNvbnN0IHBhdGhzVG9SZXNvbHZlID0gWy4uLnN1YnRpdGxlUGF0aHMsIC4uLmRlc2NyaXB0aW9uUGF0aHNdO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGZuQ2xlYXJDYWNoZVRpdGxlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlKG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSBhcyBzdHJpbmcpO1xuXHRcdH07XG5cdFx0aWYgKChvT2JqZWN0UGFnZURlc2NyaXB0aW9uIHx8IG9PYmplY3RQYWdlU3VidGl0bGUpICYmICF0aGlzLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXApIHtcblx0XHRcdG9PYmplY3RQYWdlU3VidGl0bGU/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVRpdGxlSGllcmFyY2h5Q2FjaGVTZXRVcCA9IHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IG9PYmplY3RQYWdlQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYnVpbGQgPSAoKTogeyB0aXRsZTogc3RyaW5nOyBzdWJ0aXRsZTogc3RyaW5nOyBpbnRlbnQ6IHN0cmluZzsgaWNvbjogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0gPT4gKHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpID8/IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZT8uZ2V0VmFsdWUoKSA/PyBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBvT2JqZWN0UGFnZURlc2NyaXB0aW9uPy5nZXRWYWx1ZSgpID8/IFwiXCJcblx0XHR9KTtcblx0XHQvL2lmIG5vIGNvbnRleHQgb3Igbm90aGluZyB0byByZXNvbHZlLCBkaXJlY3QgcmV0dXJuXG5cdFx0aWYgKCFvT2JqZWN0UGFnZUNvbnRleHQgfHwgcGF0aHNUb1Jlc29sdmUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1aWxkKCkpO1xuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHBhdGhzVG9SZXNvbHZlLm1hcChhc3luYyAocCkgPT4gKG9PYmplY3RQYWdlQ29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkucmVxdWVzdFByb3BlcnR5KHApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpXG5cdFx0KTtcblx0XHRyZXR1cm4gYnVpbGQoKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSAob0V4ZWN1dGlvbi5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIENvbW1hbmRFeGVjdXRpb24pLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSEpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbLS1pU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3U2VjdGlvbikge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obmV3U2VjdGlvbik7XG5cdFx0XHRcdG5ld1NlY3Rpb24uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rm9vdGVyVmlzaWJpbGl0eSgpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdFx0Py5lbmFibGVkO1xuXHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IGlzRXJyb3JNZXNzYWdlID0gb01lc3NhZ2UudmFsaWRhdGlvbiAmJiBvTWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIjtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZVZhbGlkYXRpb24gPSBpc0hpZGRlbkRyYWZ0RW5hYmxlZFxuXHRcdFx0XHRcdD8gaXNFcnJvck1lc3NhZ2Vcblx0XHRcdFx0XHQ6IGlzRXJyb3JNZXNzYWdlICYmIG9NZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcyhzVmlld0lkKSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlVmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2hvd01lc3NhZ2VQb3BvdmVyKCk6IHZvaWQge1xuXHRcdGNvbnN0IGlzRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKGlzRWRpdE1vZGUgJiYgIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKSBhcyBMaXN0QmluZGluZztcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2VkaXREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIG9iamVjdC5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNPYmplY3QgVGhlIHNlbWFudGljIG9iamVjdFxuXHQgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgdGhlIGRlZmF1bHQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgb2JqZWN0XG5cdCAqL1xuXHRfZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmdcblx0KTogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogcHJvcGVydHlQYXRoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNlbWFudGljT2JqZWN0XG5cdFx0XHR9XG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIG9uIGEgdHJhbnNpZW50IGNvbnRleHQ6XG5cdCAqIC0gaWYgdGhlIGNvbnRleHQgZ2V0cyBkYXRhLCB3YWl0IGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgYW5kIGV4ZWN1dGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uXG5cdCAqIC0gaWYgbm8gZGF0YSBpcyBmb3VuZCBvbiB0aGlzIGNvbnRleHQsIG9ubHkgdGhlIHByZXBhcmVBY3Rpb24gaXMgcmVxdWVzdGVkXG5cdCAqIC0gb24gYSByZWd1bGFyIGNvbnRleHQsIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBpcyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb2YgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHVuZGVmaW5lZCBpZiBub3QgZXhlY3V0ZWRcblx0ICovXG5cdGFzeW5jIF92YWxpZGF0ZURvY3VtZW50KCk6IFByb21pc2U8dm9pZCB8IHVua25vd25bXSB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0XHRjb25zdCBjb250cm9sID0gVUk1RWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCkgYXMgQ29udHJvbDtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghY29udHJvbCB8fCAhY29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0bGV0IGJ5UGFzc1NpZGVFZmZlY3RzID0gZmFsc2U7XG5cdFx0aWYgKGNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0aWYgKGNvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ5UGFzc1NpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKGNvbnRyb2wpO1xuXHRcdGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdsb2JhbFZhbGlkYXRpb24oY29udGV4dCwgYnlQYXNzU2lkZUVmZmVjdHMpO1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29udHJvbCB9KTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIHRoZSBnbG9iYWwgc2lkZSBlZmZlY3RzIGFyZSBleGVjdXRlZCBpZiB0aGVzZSBzaWRlIGVmZmVjdHMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHRcblx0ICogLSB0aGUgZHJhZnQgVmFsaWRhdGlvbiBvbiB0aGUgRHJhZnRSb290IGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0XG5cdCAqIEBwYXJhbSBieVBhc3NTaWRlRWZmZWN0cyBPbmx5IHRoZSBkcmFmdCBWYWxpZGF0aW9uIHN0ZXAgaXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvZiB0aGUgZ2xvYmFsIHZhbGlkYXRpb25cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVHbG9iYWxWYWxpZGF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBieVBhc3NTaWRlRWZmZWN0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkIHwgdW5rbm93bltdIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Ly8gdGhlIGRyYWZ0IHZhbGlkYXRpb24gaXMgdHJlYXRlZCBhcyBhIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCB0aGUgc2VydmljZSBtdXN0IHJldHVybiB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFnYWluIGlmIHN0aWxsIHZhbGlkXG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoIWJ5UGFzc1NpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChnbG9iYWxTaWRlRWZmZWN0cy5tYXAoYXN5bmMgKHNpZGVFZmZlY3RzKSA9PiB0aGlzLnNpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0KSkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Ly9FeGVjdXRlIHRoZSBkcmFmdFZhbGlkYXRpb24gaWYgdGhlcmUgaXMgbm8gZ2xvYmFsU2lkZUVmZmVjdHMgKGlnbm9yZSBFVGFncyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0KVxuXHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRyZXR1cm4gZHJhZnQuZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihkcmFmdFJvb3RDb250ZXh0LCBhcHBDb21wb25lbnQsIHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZHJhZnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogSWYgZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBvbiB0aGUgY3JlYXRpb24gcm93cywgdGhlIHJlbGF0ZWQgZG9jdW1lbnRzIGFyZSBjcmVhdGVkXG5cdCAqIGJlZm9yZSBzYXZpbmcgdGhlIGRyYWZ0IHZlcnNpb24uXG5cdCAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBJbmRpY2F0ZXMgaWYgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcgc2hvdWxkIGJlIHNraXBwZWRcblx0ICogQHBhcmFtIHVzZVNhdmVBbmRMZWF2ZSBJbmRpY2F0ZXMgaWYgdGhlIHNhdmUgaXMgdHJpZ2dlcmVkIGZyb20gYSBzYXZlIGFuZCBsZWF2ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX3NhdmVEb2N1bWVudChza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sIHVzZVNhdmVBbmRMZWF2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhd2FpdENyZWF0ZURvY3VtZW50czogUHJvbWlzZTx2b2lkIHwgT0RhdGFMaXN0QmluZGluZz5bXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG1lc3NhZ2VQb3BvdmVyRXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG1vZGVsKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGRpYWxvZ0FjdGlvbiA9IGF3YWl0IG5ldyBDb2xsYWJvcmF0aW9uRGlzY2FyZCh0aGlzLmdldFZpZXcoKSwgdHJ1ZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJjYW5jZWxcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBXZSBrZWVwIHRoZSBkcmFmdCBhbmQgbGVhdmUgZm9yIExSXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBjb2xsYWJvcmF0aW9uIGRpc2NhcmQ6ICR7ZXJyfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKCh0YWJsZTogVGFibGUpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUJpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoKGNyZWF0aW9uUm93Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkKT8uZ2V0T2JqZWN0KCkgfHwge30pO1xuXHRcdFx0XHRpZiAoY29udGV4dEtleXMuZmlsdGVyKChrZXkpID0+ICFrZXkuc3RhcnRzV2l0aChcIkAkdWk1LlwiKSkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXRDcmVhdGVEb2N1bWVudHMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZURvY3VtZW50KHRhYmxlQmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGUuZGF0YShcImNyZWF0aW9uTW9kZVwiKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHRcdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0QWdncmVnYXRpb24oXCJjcmVhdGlvbk1vZGVcIikgYXMgVGFibGVDcmVhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdCk/LmdldFByb3BlcnR5KFwiY3JlYXRlQXRFbmRcIikgPT09IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiB0cnVlIC8vIHRoZSBza2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXksIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGhhbmRsZVNpZGVFZmZlY3RzIGZ1bmNpdG9uIHRvIGF2b2lkIGJhdGNoIHJlZHVuZGFuY3lcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGFibGVCaW5kaW5nKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bGV0IGlzU3RhbmRhcmRTYXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNraXBCaW5kaW5nVG9WaWV3ICYmIHR5cGVvZiBza2lwQmluZGluZ1RvVmlldyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRjb25zdCBjb21tYW5kID0gKHNraXBCaW5kaW5nVG9WaWV3IGFzIENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50KT8uZ2V0U291cmNlPy4oKT8uZ2V0Q29tbWFuZD8uKCk7XG5cdFx0XHRcdGlzU3RhbmRhcmRTYXZlID0gY29tbWFuZCA9PT0gXCJTYXZlXCI7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGF3YWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHtcblx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0XHRiaW5kaW5nczogYmluZGluZ3MgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0XHRcdFx0bWVyZ2VQYXRjaERyYWZ0OiB0aGlzLm1lcmdlUGF0Y2hEcmFmdCxcblx0XHRcdFx0XHRza2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRpc1N0YW5kYXJkU2F2ZSxcblx0XHRcdFx0XHR1c2VTYXZlQW5kTGVhdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHRpZiAoZXJyb3IgIT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRtZXNzYWdlUG9wb3ZlckVyciA9IChlcnJvciBhcyBzdHJpbmcpID8/IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQobW9kZWwpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG1vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChtZXNzYWdlUG9wb3ZlckVyciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChtZXNzYWdlUG9wb3ZlckVyci5sZW5ndGgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IobWVzc2FnZVBvcG92ZXJFcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9jYW5jZWxEb2N1bWVudChtUGFyYW1ldGVyczogeyBjYW5jZWxCdXR0b246IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBjYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikgYXMgQnV0dG9uIHwgdW5kZWZpbmVkOyAvL3RvIGdldCB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjYW5jZWwgYnV0dG9uIGZyb20gY29tbWFuZCBleGVjdXRpb25cblx0XHRjb25zdCBsYXN0Rm9jdXNlZENvbnRyb2xJZCA9IFVJNUVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpPy5nZXRJZCgpO1xuXHRcdGxldCBzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCgpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkaWFsb2dBY3Rpb24gPSBhd2FpdCBuZXcgQ29sbGFib3JhdGlvbkRpc2NhcmQodGhpcy5nZXRWaWV3KCksIGZhbHNlKS5nZXRVc2VyQWN0aW9uKCk7XG5cdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdGlmIChkaWFsb2dBY3Rpb24gPT09IFwiY2FuY2VsXCIpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV2Uga2VlcCB0aGUgZHJhZnQgYW5kIGxlYXZlIGZvciBMUlxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImtlZXBEcmFmdFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFdlIGhhdmUgZGlzcGxheWVkIHRoZSBkaWFsb2cgYW5kIHRoZSB1c2VyIGNvbmZpcm1lZCB0aGUgZGlzY2FyZCAtPiBXZSBza2lwIHRoZSBkaXNjYXJkIGNvbmZpcm1hdGlvblxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImRpc2NhcmRDb25maXJtZWRcIikge1xuXHRcdFx0XHRcdHNob3VsZFNraXBEaXNjYXJkUG9wb3ZlciA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZ2V0IGNvbGxhYm9yYXRpdmUgdXNlcnNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGlzRG9jdW1lbnRNb2RpZmllZCA9XG5cdFx0XHQhIXRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fFxuXHRcdFx0KCF0aGlzLmdldFN0aWNreUVkaXRNb2RlKCkgJiYgY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UpO1xuXHRcdGNvbnN0IGFmdGVyQ2FuY2VsOiBGdW5jdGlvbiA9IChwcm9taXNlUmVzdWx0OiBPRGF0YVY0Q29udGV4dCkgPT4ge1xuXHRcdFx0Ly8gZm9jdXMgaXMgcmV0YWluZWQgb24gdGhlIGxhc3QgZm9jdXNlZCBlbGVtZW50XG5cdFx0XHRpZiAobGFzdEZvY3VzZWRDb250cm9sSWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRVSTVFbGVtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RGb2N1c2VkQ29udHJvbElkKT8uZm9jdXMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwcm9taXNlUmVzdWx0O1xuXHRcdH07XG5cdFx0aWYgKFxuXHRcdFx0KHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdCk/LmVuYWJsZWQgJiZcblx0XHRcdGlzRG9jdW1lbnRNb2RpZmllZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhZnRlckNhbmNlbCxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdFx0XHRcdHRydWVcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93XG5cdFx0XHQuY2FuY2VsRG9jdW1lbnQoY29udGV4dCwgeyBjb250cm9sOiBjYW5jZWxCdXR0b24sIHNraXBEaXNjYXJkUG9wb3Zlcjogc2hvdWxkU2tpcERpc2NhcmRQb3BvdmVyIH0pXG5cdFx0XHQudGhlbigocHJvbWlzZVJlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWZ0ZXJDYW5jZWwocHJvbWlzZVJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmFwcGx5RG9jdW1lbnQob0NvbnRleHQpLmNhdGNoKCgpID0+IHtcblx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBzaG93UmVsYXRlZEFwcHMgPSBvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpO1xuXHRcdGlmIChzaG93UmVsYXRlZEFwcHMgPT09IFwidHJ1ZVwiIHx8IHNob3dSZWxhdGVkQXBwcyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZSwgYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IENvbnRyb2xbXSwgYVN1YnNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLCBhQ29udHJvbHM6IENvbnRyb2xbXSwgYklzQ2hhcnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtMSBvZiBhUGFyZW50RWxlbWVudCkge1xuXHRcdFx0bGV0IG9FbGVtZW50ID0gKGl0ZW0xIGFzIE1hY3JvQVBJKS5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gPyAoaXRlbTEgYXMgTWFjcm9BUEkpLmdldENvbnRlbnQoKSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChiSXNDaGFydCkge1xuXHRcdFx0XHRpZiAob0VsZW1lbnQ/LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikpIHtcblx0XHRcdFx0XHRjb25zdCBpdGVtcyA9IG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikgYXMgQ29udHJvbFtdO1xuXHRcdFx0XHRcdGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW06IENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChpdGVtLmlzQTxDaGFydEJsb2NrPihcInNhcC5mZS5tYWNyb3MuQ2hhcnRcIikpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhcnRDb250cm9sID0gaXRlbS5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2goY2hhcnRDb250cm9sKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0E8RHluYW1pY1NpZGVDb250ZW50PihcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1N1YkVsZW1lbnQgPSBvRWxlbWVudC5nZXRNYWluQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQoKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAob1N1YkVsZW1lbnQgJiYgb1N1YkVsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQgPSBvU3ViRWxlbWVudFswXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhlIHRhYmxlIG1heSBjdXJyZW50bHkgYmUgc2hvd24gaW4gYSBmdWxsIHNjcmVlbiBkaWFsb2csIHdlIGNhbiB0aGVuIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYWJsZUFQSVxuXHRcdFx0XHQvLyBjb250cm9sIGZyb20gdGhlIGN1c3RvbSBkYXRhIG9mIHRoZSBwbGFjZSBob2xkZXIgcGFuZWxcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAubS5QYW5lbFwiKSAmJiBvRWxlbWVudC5kYXRhKFwiRnVsbFNjcmVlblRhYmxlUGxhY2VIb2xkZXJcIikpIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmRhdGEoXCJ0YWJsZUFQSXJlZmVyZW5jZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQTxUYWJsZUFQST4oXCJzYXAuZmUubWFjcm9zLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1N1YkVsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gPyBvRWxlbWVudC5nZXRDb250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9TdWJFbGVtZW50ICYmIG9TdWJFbGVtZW50LmlzQSAmJiBvU3ViRWxlbWVudC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob1N1YkVsZW1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRBbGxTdWJTZWN0aW9ucygpOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0bGV0IGFTdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IE9iamVjdFBhZ2VTZWN0aW9uKSB7XG5cdFx0XHRhU3ViU2VjdGlvbnMgPSBhU3ViU2VjdGlvbnMuY29uY2F0KG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhU3ViU2VjdGlvbnM7XG5cdH1cblxuXHRfZ2V0QWxsQmxvY2tzKCk6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSB7XG5cdFx0bGV0IGFCbG9ja3M6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSA9IFtdO1xuXHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uKSB7XG5cdFx0XHRhQmxvY2tzID0gYUJsb2Nrcy5jb25jYXQob1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCkgYXMgRW5oYW5jZVdpdGhVSTU8U3ViU2VjdGlvbkJsb2NrPltdKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYUJsb2Nrcztcblx0fVxuXG5cdF9maW5kVGFibGVzKCk6IFRhYmxlW10ge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogVGFibGVbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhYmxlcztcblx0fVxuXG5cdF9maW5kQ2hhcnRzKCk6IENoYXJ0W10ge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYUNoYXJ0czogQ2hhcnRbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNoYXJ0cztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCk6IHZvaWQge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogRW5oYW5jZVdpdGhVSTU8U3ViU2VjdGlvbkJsb2NrPik6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBvQmxvY2suZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9CbG9jay5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAob0NvbnRlbnQgJiYgb0NvbnRlbnQuaXNBICYmIG9Db250ZW50LmlzQTxEeW5hbWljU2lkZUNvbnRlbnQ+KFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFydCBDb250ZXh0IGlzIHJlc29sdmVkIGZvciAxOm4gbWljcm9jaGFydHMuXG5cdCAqIEBwYXJhbSBvQ2hhcnRDb250ZXh0IFRoZSBDb250ZXh0IG9mIHRoZSBNaWNyb0NoYXJ0XG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIFRoZSBjb2xsZWN0aW9uUGF0aCBvZiB0aGUgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIEF0dHJpYnV0ZXMgb2YgdGhlIGNoYXJ0IENvbnRleHRcblx0ICovXG5cdF9nZXRDaGFydENvbnRleHREYXRhKG9DaGFydENvbnRleHQ6IENvbnRleHQsIHNDaGFydFBhdGg6IHN0cmluZyk6IHVua25vd25bXSB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NoYXJ0Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgb0NoYXJ0Q29udGV4dERhdGEgPSBbb0NvbnRleHREYXRhXTtcblx0XHRpZiAob0NoYXJ0Q29udGV4dCAmJiBzQ2hhcnRQYXRoKSB7XG5cdFx0XHRpZiAob0NvbnRleHREYXRhW3NDaGFydFBhdGhdKSB7XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhID0gb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRkZWxldGUgb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YS5wdXNoKG9Db250ZXh0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQ2hhcnRDb250ZXh0RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIHRhYmxlcyB0byB0aGUgcm93IHdpdGggdGhlIHNQYXRoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUm93UGF0aCAnc1BhdGggb2YgdGhlIHRhYmxlIHJvdydcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fZmluZFRhYmxlcyAmJiB0aGlzLl9maW5kVGFibGVzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBhVGFibGVzKSB7XG5cdFx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhpdGVtLCBzUm93UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtZXJnZSBzZWxlY3RlZCBjb250ZXh0cyBhbmQgZmlsdGVycy5cblx0ICogQHBhcmFtIG9QYWdlQ29udGV4dCBQYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIGFMaW5lQ29udGV4dCBTZWxlY3RlZCBDb250ZXh0c1xuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBDb2xsZWN0aW9uIG5hbWUgb2YgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIFNlbGVjdGlvbiBWYXJpYW50IE9iamVjdFxuXHQgKi9cblx0X21lcmdlTXVsdGlwbGVDb250ZXh0cyhcblx0XHRvUGFnZUNvbnRleHQ6IENvbnRleHQsXG5cdFx0YUxpbmVDb250ZXh0OiBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdHNDaGFydFBhdGg6IHN0cmluZ1xuXHQpOiB7IHNlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQ7IGF0dHJpYnV0ZXM6IHVua25vd25bXSB9IHtcblx0XHRsZXQgYUF0dHJpYnV0ZXM6IHVua25vd25bXSA9IFtdLFxuXHRcdFx0YVBhZ2VBdHRyaWJ1dGVzID0gW10sXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdHNNZXRhUGF0aExpbmU6IHN0cmluZyxcblx0XHRcdHNQYXRoTGluZTtcblxuXHRcdGNvbnN0IHNQYWdlUGF0aCA9IG9QYWdlQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYWdlQ29udGV4dCAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKSAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0LmZvckVhY2goKG9TaW5nbGVDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob1N1YkNoYXJ0Q29udGV4dERhdGE6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1N1YkNoYXJ0Q29udGV4dERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBgJHtzTWV0YVBhdGhQYWdlfS8ke3NDaGFydFBhdGh9YFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TaW5nbGVDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhMaW5lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhUGFnZUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRjb250ZXh0RGF0YTogb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhQYWdlXG5cdFx0fSk7XG5cdFx0Ly8gQWRkaW5nIFBhZ2UgQ29udGV4dCB0byBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGFQYWdlQXR0cmlidXRlcyA9IHRoaXMuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5yZW1vdmVTZW5zaXRpdmVEYXRhKGFQYWdlQXR0cmlidXRlcywgc01ldGFQYXRoUGFnZSk7XG5cdFx0Y29uc3Qgb1BhZ2VMZXZlbFNWID0gQ29tbW9uVXRpbHMuYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQoKSwgYVBhZ2VBdHRyaWJ1dGVzLCB0aGlzLmdldFZpZXcoKSk7XG5cdFx0YUF0dHJpYnV0ZXMgPSB0aGlzLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucmVtb3ZlU2Vuc2l0aXZlRGF0YShhQXR0cmlidXRlcywgc01ldGFQYXRoUGFnZSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IG9QYWdlTGV2ZWxTVixcblx0XHRcdGF0dHJpYnV0ZXM6IGFBdHRyaWJ1dGVzXG5cdFx0fTtcblx0fVxuXG5cdF9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCksXG5cdFx0XHRvQ29uZmlndXJhdGlvbnMgPSBvVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sXG5cdFx0XHRhQ29uZmlndXJhdGlvbnMgPSBvQ29uZmlndXJhdGlvbnMgJiYgT2JqZWN0LmtleXMob0NvbmZpZ3VyYXRpb25zKSxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IFtcIiRhdXRvLkhlcm9lc1wiLCBcIiRhdXRvLkRlY29yYXRpb25cIiwgXCIkYXV0by5Xb3JrZXJzXCJdO1xuXG5cdFx0aWYgKGFDb25maWd1cmF0aW9ucyAmJiBhQ29uZmlndXJhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUNvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0tleV0gYXMgTWljcm9DaGFydE1hbmlmZXN0Q29uZmlndXJhdGlvbjtcblx0XHRcdFx0aWYgKG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkID09PSBcIkxvbmdSdW5uZXJzXCIpIHtcblx0XHRcdFx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvLkxvbmdSdW5uZXJzXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFCYXRjaEdyb3Vwcztcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gaW5pdGlhbGl6ZSBwYWdpbmF0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIG9iamVjdCBwYWdlXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIEludGVybmFsIG1vZGVsXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBQYXJlbnQgbGlzdCBiaW5kaW5nIHRvIHVzZVxuXHQgKi9cblx0X2luaXRpYWxpemVQYWdpbmF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGxpc3RCaW5kaW5nPzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGlmICh2aWV3TGV2ZWwgPiAxKSB7XG5cdFx0XHRjb25zdCBwYWdpbmF0b3JDdXJyZW50Q29udGV4dCA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIik7XG5cdFx0XHRpZiAocGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ1RvVXNlID0gcGFnaW5hdG9yQ3VycmVudENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKGJpbmRpbmdUb1VzZSwgcGFnaW5hdG9yQ3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChsaXN0QmluZGluZykge1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKGxpc3RCaW5kaW5nLCBjb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpOiB2b2lkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0RhdGFQb2ludHMgPSBDb21tb25VdGlscy5nZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24oXG5cdFx0XHRvVmlldy5nZXRWaWV3RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldE91dGJvdW5kcygpXG5cdFx0KTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IG9QYWdlQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlXCIsIHt9KTtcblx0XHRpZiAob1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IG9iamVjdCkge1xuXHRcdFx0XHRcdHJldHVybiBmbkdldExpbmtzKG9EYXRhUG9pbnRzLCBvRGF0YSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb0Vycm9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5PbkVycm9yKG9FcnJvcjogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmblNldExpbmtFbmFibGVtZW50KGlkOiBzdHJpbmcsIGFTdXBwb3J0ZWRMaW5rczogeyBzdXBwb3J0ZWQ/OiBib29sZWFuIH1bXSk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgc0xpbmtJZCA9IGlkO1xuXHRcdFx0Ly8gcHJvY2VzcyB2aWFibGUgbGlua3MgZnJvbSBnZXRMaW5rcyBmb3IgYWxsIGRhdGFwb2ludHMgaGF2aW5nIG91dGJvdW5kXG5cdFx0XHRpZiAoYVN1cHBvcnRlZExpbmtzICYmIGFTdXBwb3J0ZWRMaW5rcy5sZW5ndGggPT09IDEgJiYgYVN1cHBvcnRlZExpbmtzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlzSGVhZGVyRFBMaW5rVmlzaWJsZS8ke3NMaW5rSWR9YCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9TdWJEYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3MoXG5cdFx0XHRvU3ViRGF0YVBvaW50czogUmVjb3JkPFxuXHRcdFx0XHRzdHJpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRcdFx0XHRcdGFjdGlvbjogc3RyaW5nO1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdFx0XHR9XG5cdFx0XHQ+LFxuXHRcdFx0b1BhZ2VEYXRhOiBvYmplY3Rcblx0XHQpOiB2b2lkIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9TdWJEYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvU3ViRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdFx0XHRjb25zdCBvTGluayA9IG9WaWV3LmJ5SWQoc0lkKTtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIGZvciBkYXRhIHBvaW50cyBjb25maWd1cmVkIGluIGFwcCBkZXNjcmlwdG9yIGJ1dCBub3QgYW5ub3RhdGVkIGluIHRoZSBoZWFkZXJcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvTGlua0NvbnRleHQgPSBvTGluay5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBvTGlua0RhdGE6IG9iamVjdCA9IG9MaW5rQ29udGV4dCAmJiBvTGlua0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBvTWl4ZWRDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IG1lcmdlKHt9LCBvUGFnZURhdGEsIG9MaW5rRGF0YSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdC8vIHByb2Nlc3Mgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdzXG5cdFx0XHRcdGlmIChvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZztcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gaW4gYVNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBhU2VtYW50aWNPYmplY3RNYXBwaW5nW2l0ZW1dO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01haW5Qcm9wZXJ0eSA9IG9NYXBwaW5nW1wiTG9jYWxQcm9wZXJ0eVwiXSFbXCIkUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01hcHBlZFByb3BlcnR5ID0gb01hcHBpbmdbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdITtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRvTmV3TWFwcGluZ1tzTWFwcGVkUHJvcGVydHldID0gb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0XHRvTWl4ZWRDb250ZXh0ID0gbWVyZ2Uoe30sIG9NaXhlZENvbnRleHQsIG9OZXdNYXBwaW5nKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmICghc0tleS5zdGFydHNXaXRoKFwiX1wiKSAmJiAhc0tleS5pbmNsdWRlcyhcIm9kYXRhLmNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRcdFx0b1BhcmFtc1tzS2V5XSA9IG9NaXhlZENvbnRleHRbc0tleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHZhbGlkYXRlIGlmIGEgbGluayBtdXN0IGJlIHJlbmRlcmVkXG5cdFx0XHRcdG9TaGVsbFNlcnZpY2VzXG5cdFx0XHRcdFx0LmlzTmF2aWdhdGlvblN1cHBvcnRlZChbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvbjogb0RhdGFQb2ludC5hY3Rpb25cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOiBvUGFyYW1zXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0XHQudGhlbigoYUxpbmtzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRMaW5rRW5hYmxlbWVudChzSWQsIGFMaW5rcyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZm5PbkVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZmluZFN1bW1hcml6ZUJ1dHRvbigpOiBCdXR0b24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGNvbnN0IG9iamVjdFBhZ2VUaXRsZSA9IG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlO1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBvYmplY3RQYWdlVGl0bGU/LmdldEFjdGlvbnMoKTtcblx0XHRsZXQgc3VtbWFyaXplQnV0dG9uOiBCdXR0b24gfCB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG5cdFx0XHRpZiAoYWN0aW9uLmlzQTxTdW1tYXJpemF0aW9uQnV0dG9uPihcInNhcC5mZS5tYWNyb3MuYWkuU3VtbWFyaXphdGlvbkJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBidXR0b24gPSBhY3Rpb24uZ2V0Q29udGVudCgpIGFzIEJ1dHRvbiB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGJ1dHRvbiAmJiBidXR0b24uZ2V0SWQoKS5lbmRzV2l0aChcIjo6U3VtbWFyaXplOjpidXR0b25cIikpIHtcblx0XHRcdFx0XHRzdW1tYXJpemVCdXR0b24gPSBidXR0b247XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3VtbWFyaXplQnV0dG9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyBzdGFydHVwIHBhcmFtZXRlcnMgYW5kIHRyaWdnZXJzIHRoZSBzbWFydCBzdW1tYXJ5IGFjdGlvbiBvbiB0aGUgT2JqZWN0IFBhZ2UgaWYgcmVxdWlyZWQuXG5cdCAqXG5cdCAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMgaW5kaWNhdGUgdGhhdCBhIHNtYXJ0IHN1bW1hcnkgc2hvdWxkIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGN1cnJlbnQgT2JqZWN0IFBhZ2UgbGV2ZWwuXG5cdCAqIFRoZSBsZXZlbCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCBPYmplY3QgUGFnZSBzaG91bGQgYmUgc3VtbWFyaXplZCwgd2hpY2ggaXMgcmVsZXZhbnQgaW4gRmxleGlibGUgQ29sdW1uIExheW91dCAoRkNMKSBzY2VuYXJpb3Mgd2hlcmVcblx0ICogbXVsdGlwbGUgT2JqZWN0IFBhZ2VzIG1heSBiZSBkaXNwbGF5ZWQgc2ltdWx0YW5lb3VzbHkuXG5cdCAqIElmIG5vIGxldmVsIGlzIHByb3ZpZGVkIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIHRoZSBtZXRob2QgZGVmYXVsdHMgdGhlIGxldmVsIHRvIDEuXG5cdCAqIElmIHRoZSBzdW1tYXJ5IGFjdGlvbiBpcyBhbGxvd2VkIGFuZCB0aGUgU21hcnRTdW1tYXJpemUgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUsIGl0IGxvY2F0ZXMgdGhlIHN1bW1hcml6ZSBidXR0b24gYW5kIHRyaWdnZXJzIGl0cyBwcmVzcyBldmVudC5cblx0ICogVGhlIG1ldGhvZCBlbnN1cmVzIHRoZSBzdW1tYXJ5IGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBwZXIgbmF2aWdhdGlvbiBhbmQgbG9ncyBlcnJvcnMgaWYgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldCBvciB0aGUgYnV0dG9uIGlzIHVuYXZhaWxhYmxlLlxuXHQgKiBBbGwgZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0IGFuZCBsb2dnZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaGFuZGxlU21hcnRTdW1tYXJ5U3RhcnR1cEFjdGlvbigpOiB2b2lkIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGFwcENvbXBvbmVudFxuXHRcdFx0Py5nZXRTdGFydHVwUGFyYW1ldGVycygpXG5cdFx0XHQ/LnRoZW4oKHN0YXJ0dXBQYXJhbXM6IFN0YXJ0dXBQYXJhbWV0ZXJzKSA9PiB7XG5cdFx0XHRcdGlmICghc3RhcnR1cFBhcmFtcy5wcmVmZXJyZWRBY3Rpb24gfHwgIXN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdLnN0YXJ0c1dpdGgoXCJzdW1tYXJ5XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBjb3JyZWN0IE9QIGJ5IGNoZWNraW5nIHRoZSBsZXZlbCBwcm92aWRlZCBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdFx0XHRcdGNvbnN0IHZpZXdMZXZlbCA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdFx0XHRjb25zdCBwcmVmZXJyZWRBY3Rpb25MZXZlbCA9XG5cdFx0XHRcdFx0c3RhcnR1cFBhcmFtcy5wcmVmZXJyZWRBY3Rpb25bMF0gPT09IFwic3VtbWFyeVwiID8gMSA6IHBhcnNlSW50KHN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdLnNwbGl0KFwiLVwiKVsxXSwgMTApO1xuXHRcdFx0XHRpZiAoaXNOYU4ocHJlZmVycmVkQWN0aW9uTGV2ZWwpIHx8IHZpZXdMZXZlbCAhPT0gcHJlZmVycmVkQWN0aW9uTGV2ZWwpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBzdW1tYXJ5IGFjdGlvbiBzaGFsbCBiZSBleGVjdXRlZCBub3cgKGl0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkIGJ5IGEgaGlnaGVyIGxldmVsIE9QKVxuXHRcdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFByZWZlcnJlZEFjdGlvblN0YXR1cygpID09PSBQcmVmZXJyZWRBY3Rpb25TdGF0dXMuQ2FuUGVyZm9ybSkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5zZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMoUHJlZmVycmVkQWN0aW9uU3RhdHVzLkFscmVhZHlQZXJmb3JtZWQpOyAvLyB0byBwcmV2ZW50IG90aGVyIE9QcyBvbiBoaWdoZXIgbGV2ZWxzIHRvIGV4ZWN1dGUgdGhlIHN1bW1hcnkgYWdhaW5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBTbWFydFN1bW1hcml6ZSBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZVxuXHRcdFx0XHRjb25zdCBlbnZpcm9ubWVudFNlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKTtcblx0XHRcdFx0aWYgKCFlbnZpcm9ubWVudFNlcnZpY2U/LmVudmlyb25tZW50Q2FwYWJpbGl0aWVzLlNtYXJ0U3VtbWFyaXplKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU21hcnQgU3VtbWFyaXphdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBiZWNhdXNlIFNtYXJ0U3VtbWFyaXplIGNhcGFiaWxpdHkgaXMgbm90IGF2YWlsYWJsZVwiKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBTdW1tYXJ5IGJ1dHRvblxuXHRcdFx0XHRjb25zdCBzdW1tYXJpemVCdXR0b24gPSB0aGlzLl9maW5kU3VtbWFyaXplQnV0dG9uKCk7XG5cblx0XHRcdFx0aWYgKHN1bW1hcml6ZUJ1dHRvbiAmJiBzdW1tYXJpemVCdXR0b24uZ2V0VmlzaWJsZSgpICYmIHN1bW1hcml6ZUJ1dHRvbi5nZXRFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzdW1tYXJpemVCdXR0b24uZmlyZVByZXNzKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFwiU21hcnQgU3VtbWFyaXphdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBiZWNhdXNlIHRoZSBTdW1tYXJpemUgYnV0dG9uIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgZW5hYmxlZCBvciBub3QgZm91bmQuXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyBzdGFydHVwIHBhcmFtZXRlcnMgb3IgdHJpZ2dlcmluZyBzbWFydCBzdW1tYXJ5OlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHRvblByaW1hcnlBY3Rpb24oXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvVmlldzogRkVWaWV3LFxuXHRcdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdH0sXG5cdFx0XHRtQ29uZGl0aW9uczoge1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdHBvc2l0aXZlQWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdFx0ZWRpdEFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXHRcdFx0fVxuXHRcdCk6IHZvaWQge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJbnZva2VzIHRoZSBwYWdlIHByaW1hcnkgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBDdHJsK0VudGVyIChDbWQrRW50ZXIgb24gbWFjT1MpLlxuXHRcdFx0ICovXG5cblx0XHRcdGNvbnN0IHByaW1hcnlDYW5kaWRhdGUgPSBvQ29udHJvbGxlci5fZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhvVmlldylbMF07XG5cblx0XHRcdC8qIEJ5IGRlc2lnbiwgdGhlcmUgbXVzdCBiZSBhdCBtb3N0IG9uZSBjYW5kaWRhdGUgZHVlIHRvIHRoZSBcInNpbmdsZSBlbXBoYXNpcyBwZXIgcGFnZVwiIHJ1bGUuXG5cdFx0XHQgICBJZiBhIHByaW1hcnktZW50ZXIgdGFyZ2V0IGlzIGZvdW5kLCBpdCBtdXN0IGZ1bGx5IHRha2Ugb3ZlciBDdHJsL0NtZCtFbnRlci4qL1xuXG5cdFx0XHRpZiAocHJpbWFyeUNhbmRpZGF0ZSkge1xuXHRcdFx0XHRpZiAoIXByaW1hcnlDYW5kaWRhdGUuZ2V0RW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gVGFrZSBvdmVyIEN0cmwvQ21kK0VudGVyLCBidXQgZG8gbm90IHRyaWdnZXIgYW55dGhpbmcgd2hlbiB0aGUgcHJpbWFyeSBhY3Rpb24gaXMgZGlzYWJsZWQuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcmltYXJ5Q2FuZGlkYXRlLmlzQShcInNhcC5tLkJ1dHRvblwiKSkge1xuXHRcdFx0XHRcdChwcmltYXJ5Q2FuZGlkYXRlIGFzIEJ1dHRvbikuZmlyZVByZXNzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChwcmltYXJ5Q2FuZGlkYXRlIGFzIE1lbnVCdXR0b24pLmlzQShcInNhcC5tLk1lbnVCdXR0b25cIikpIHtcblx0XHRcdFx0XHQocHJpbWFyeUNhbmRpZGF0ZSBhcyBNZW51QnV0dG9uKS5maXJlRGVmYXVsdEFjdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5oYW5kbGVycy5vbkNhbGxBY3Rpb24ob1ZpZXcsIHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGUpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXREb2N1bWVudCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlWaWV3TGV2ZWwgPT09IDEgJiYgQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldykpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX3NhdmVEb2N1bWVudCgpO1xuXHRcdFx0fSBlbHNlIGlmIChDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fYXBwbHlEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIE1hbmFnZXMgdGhlIGNvbnRleHQgY2hhbmdlIGV2ZW50IG9uIHRoZSB0YWJsZXMuXG5cdFx0ICogVGhlIGZvY3VzIGlzIHNldCBpZiB0aGlzIGNoYW5nZSBpcyByZWxhdGVkIHRvIGFuIGVkaXRGbG93IGFjdGlvbiBhbmRcblx0XHQgKiBhbiBldmVudCBpcyBmaXJlZCBvbiB0aGUgb2JqZWN0UGFnZSBtZXNzYWdlQnV0dG9uLlxuXHRcdCAqIEBwYXJhbSB0aGlzIFRoZSBvYmplY3RQYWdlIGNvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gZXZlbnQgVGhlIFVJNSBldmVudFxuXHRcdCAqL1xuXHRcdGFzeW5jIG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBldmVudDogVUk1RXZlbnQ8e30sIFRhYmxlQVBJPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0Y29uc3QgdGFibGVBUEkgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGNvbnN0IHRhYmxlID0gdGFibGVBUEkuY29udGVudDtcblx0XHRcdGNvbnN0IGN1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0Y29uc3QgdGFibGVDb250ZXh0cyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyh0YWJsZSk/LmdldEFsbEN1cnJlbnRDb250ZXh0cygpO1xuXG5cdFx0XHRpZiAoY3VycmVudEFjdGlvblByb21pc2UgJiYgdGFibGVDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBjdXJyZW50QWN0aW9uUHJvbWlzZTtcblx0XHRcdFx0XHRpZiAoYWN0aW9uUmVzcG9uc2U/LmNvbnRyb2xJZCA9PT0gdGFibGUuZ2V0SWQoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aW9uRGF0YSA9IGFjdGlvblJlc3BvbnNlLm9EYXRhO1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJlc3BvbnNlLmtleXM7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdJdGVtID1cblx0XHRcdFx0XHRcdFx0dGFibGVDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCh0YWJsZUNvbnRleHQ6IENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlRGF0YSA9IHRhYmxlQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBrZXlzLmV2ZXJ5KChrZXk6IHN0cmluZykgPT4gdGFibGVEYXRhW2tleV0gPT09IGFjdGlvbkRhdGFba2V5XSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQ/LmdldEluZGV4KCkgPz8gLTE7XG5cdFx0XHRcdFx0XHRpZiAobmV3SXRlbSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGlhbG9nID0gSW5zdGFuY2VNYW5hZ2VyLmdldE9wZW5EaWFsb2dzKCkuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnkgZGVzaWduLCBhIHNhcC5tLmRpYWxvZyBzZXQgdGhlIGZvY3VzIHRvIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnQgd2hlbiBjbG9zaW5nLlxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB3YWl0IGZvciB0aGUgZGlhbG9nIHRvIGJlIGNsb3NlZCBiZWZvcmUgc2V0IHRoZSBmb2N1cyB0byBhbm90aGVyIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRkaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhuZXdJdGVtLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhuZXdJdGVtLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLmVkaXRGbG93LmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBBbiBlcnJvciBvY2N1cnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW06ICR7ZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gZmlyZSBNb2RlbENvbnRleHRDaGFuZ2Ugb24gdGhlIG1lc3NhZ2UgYnV0dG9uIHdoZW5ldmVyIHRoZSB0YWJsZSBjb250ZXh0IGNoYW5nZXNcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdG9uVGFibGVCaW5kaW5nVXBkYXRlZCh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5tZXNzYWdlQnV0dG9uLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgb25DYWxsQWN0aW9uKFxuXHRcdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG5cdFx0XHR9XG5cdFx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcjtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgVkggdmFsdWVzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIHRoZSBhY3Rpb25cblx0XHRcdGF3YWl0IG9Db250cm9sbGVyLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblx0XHRvbkRhdGFQb2ludFRpdGxlUHJlc3NlZChcblx0XHRcdG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlcixcblx0XHRcdG9Tb3VyY2U6IENvbnRyb2wsXG5cdFx0XHRvTWFuaWZlc3RPdXRib3VuZDogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RPdXRib3VuZEVudHJ5Pixcblx0XHRcdHNDb250cm9sQ29uZmlnOiBzdHJpbmcsXG5cdFx0XHRzQ29sbGVjdGlvblBhdGg6IHN0cmluZ1xuXHRcdCk6IHZvaWQge1xuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQgPSB0eXBlb2Ygb01hbmlmZXN0T3V0Ym91bmQgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9NYW5pZmVzdE91dGJvdW5kKSA6IG9NYW5pZmVzdE91dGJvdW5kO1xuXHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvTWFuaWZlc3RPdXRib3VuZFtzQ29udHJvbENvbmZpZ10sXG5cdFx0XHRcdG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkhLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0bGV0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob1RhcmdldEluZm8pLFxuXHRcdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBvQ29udHJvbGxlci5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LCBzQ29sbGVjdGlvblBhdGgpLFxuXHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cblx0XHRcdGFOYXZpZ2F0aW9uRGF0YSA9IGFOYXZpZ2F0aW9uRGF0YS5tYXAoZnVuY3Rpb24gKG9OYXZpZ2F0aW9uRGF0YTogdW5rbm93bikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGRhdGE6IG9OYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRtZXRhUGF0aDogc01ldGFQYXRoICsgKHNDb2xsZWN0aW9uUGF0aCA/IGAvJHtzQ29sbGVjdGlvblBhdGh9YCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQ2hlY2sgaWYgaW1wbGljaXQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRpZiAoYVNlbWFudGljT2JqZWN0TWFwcGluZy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tRGF0YSA9IG9Tb3VyY2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoKGRhdGEpID0+IGRhdGEuZ2V0S2V5KCkgPT09IFwiVmFsdWVQcm9wZXJ0eVBhdGhcIik7XG5cdFx0XHRcdGlmIChjdXN0b21EYXRhKSB7XG5cdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9Db250cm9sbGVyLl9nZXRJbXBsaWNpdFNlbWFudGljT2JqZWN0TWFwcGluZ0ZvckRhdGFQb2ludHMoXG5cdFx0XHRcdFx0XHRjdXN0b21EYXRhLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0XHRvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRhc3luYyBvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZyxcblx0XHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRcdHNDcmVhdGVQYXRoOiBzdHJpbmdcblx0XHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0LCBvQ29udGV4dCwgc0NyZWF0ZVBhdGgpO1xuXHRcdH0sXG5cblx0XHRvbk5hdmlnYXRlQ2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IFVJNUV2ZW50PHsgc3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24gfT4pOiB2b2lkIHtcblx0XHRcdC8vd2lsbCBiZSBjYWxsZWQgYWx3YXlzIHdoZW4gd2UgY2xpY2sgb24gYSBzZWN0aW9uIHRhYlxuXHRcdFx0dGhpcy5iU2VjdGlvbk5hdmlnYXRlZCA9IHRydWU7XG5cblx0XHRcdGNvbnN0IHN1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb247XG5cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKSAmJlxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbc3ViU2VjdGlvbl0sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25WYXJpYW50U2F2ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDIwMDApO1xuXHRcdH0sXG5cdFx0bmF2aWdhdGVUb1N1YlNlY3Rpb246IGZ1bmN0aW9uIChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHZEZXRhaWxDb25maWc6IHN0cmluZyB8IG9iamVjdCk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0RldGFpbENvbmZpZyA9IHR5cGVvZiB2RGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2RGV0YWlsQ29uZmlnKSA6IHZEZXRhaWxDb25maWc7XG5cblx0XHRcdC8vIERldGVybWluZSB0aGUgdGFyZ2V0IElEIGJhc2VkIG9uIGlucHV0IHR5cGVcblx0XHRcdGxldCB0YXJnZXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHR5cGVvZiBvRGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRhcmdldElkID0gb0RldGFpbENvbmZpZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFByaW9yaXR5OiBzdWJTZWN0aW9uSWQgPiBzZWN0aW9uSWRcblx0XHRcdFx0dGFyZ2V0SWQgPSBvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCA/PyBvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhcmdldElkKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpLm5hdmlnYXRlVG9TdWJTZWN0aW9uKHRhcmdldElkKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Y2xvc2VDb2xsYWJvcmF0aW9uU3RyaXA6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5zZXRQcm9wZXJ0eShcIi9zaG93Q29sbGFib3JhdGlvblN0cmlwXCIsIGZhbHNlKTtcblx0XHR9LFxuXG5cdFx0Y2xvc2VPUE1lc3NhZ2VTdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBiSXNJbkVkaXRNb2RlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KTtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0XHRjb25zdCBtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IGludGVybmFsTW9kZWxcblx0XHRcdFx0LmJpbmRDb250ZXh0KHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkuX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCkhO1xuXHRcdFx0Ly8gUmVtb3ZlIGNvbnRleHQgYm91bmQgbWVzc2FnZXMgYW5kIHNldCB0aGUgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHRoZSBiYWNrZW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgaW4gZWRpdCBtb2RlLlxuXHRcdFx0aWYgKCFiSXNJbkVkaXRNb2RlICYmIG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiT1BCYWNrZW5kTWVzc2FnZVZpc2libGVcIikgPT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEJvdW5kTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHRcdChtZXNzYWdlOiBNZXNzYWdlKSA9PlxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICYmIG1lc3NhZ2UuZ2V0UGVyc2lzdGVudCgpID09PSB0cnVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGNvbnRleHRCb3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhjb250ZXh0Qm91bmRNZXNzYWdlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiT1BCYWNrZW5kTWVzc2FnZVZpc2libGVcIiwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS5oaWRlTWVzc2FnZSgpO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBZ0hBLE1BQU1BLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFnQjtFQUNuRCxNQUFNRSxxQkFBcUIsR0FBR0QsU0FBUyxDQUFDRSx5QkFBeUI7O0VBRWpFO0FBQ0E7QUFDQTtFQUZBLElBSU1DLG9CQUFvQixJQUFBQyxJQUFBLEdBRHpCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsRUFBQUMsS0FBQSxHQUlqRUMsY0FBYyxDQUFDQyxXQUFXLENBQUMsRUFBQUMsS0FBQSxHQUczQkYsY0FBYyxDQUFDRyxLQUFLLENBQUNDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUc5Q04sY0FBYyxDQUFDTyxlQUFlLENBQUNILFFBQVEsQ0FBQ0ksdUJBQXVCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBR2pFVCxjQUFjLENBQUNVLFNBQVMsQ0FBQ04sUUFBUSxDQUFDTyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHckRaLGNBQWMsQ0FBQ2EsY0FBYyxDQUFDVCxRQUFRLENBQUNVLHNCQUFzQixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUcvRGYsY0FBYyxDQUFDZ0IscUJBQXFCLENBQUNaLFFBQVEsQ0FBQ2EsNkJBQTZCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBRzdFbEIsY0FBYyxDQUFDbUIsb0JBQW9CLENBQUNmLFFBQVEsQ0FBQ2dCLDRCQUE0QixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUczRXJCLGNBQWMsQ0FDZHNCLDZCQUE2QixDQUFDbEIsUUFBUSxDQUFDO0lBQ3RDbUIsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBQSxFQUErQztNQUNqRSxNQUFNQyxpQkFBaUIsR0FDckIsSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxhQUFhLENBQUMsQ0FBQyxDQUEwQkMsaUJBQWlCLElBQ3pFLElBQUksQ0FBQ0YsT0FBTyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQUMsQ0FBMEJDLGlCQUFpQixDQUFDLENBQUM7TUFDN0UsT0FBT0gsaUJBQWlCLEdBQUcsU0FBUyxHQUFHSSxTQUFTO0lBQ2pEO0VBQ0QsQ0FBQyxDQUNGLENBQUMsRUFBQUMsTUFBQSxHQUdBN0IsY0FBYyxDQUFDOEIsU0FBUyxDQUFDMUIsUUFBUSxDQUFDMkIsa0JBQWtCLENBQUMsQ0FBQyxFQUFBQyxNQUFBLEdBR3REaEMsY0FBYyxDQUNkaUMsU0FBUyxDQUFDN0IsUUFBUSxDQUFDO0lBQ2xCOEIsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBQSxFQUFZO01BQzlCLE9BQU8sSUFBSTtJQUNaO0VBQ0QsQ0FBQyxDQUNGLENBQUMsRUFBQUMsTUFBQSxHQXFFQUMsZUFBZSxDQUFDLENBQUMsRUFBQUMsTUFBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsTUFBQSxHQXlnQ2hCSCxlQUFlLENBQUMsQ0FBQyxFQUFBSSxNQUFBLEdBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQTlDLElBQUEsQ0FBQStDLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMsZUFBQTtJQUFBLFNBQUFsRCxxQkFBQTtNQUFBLElBQUFtRCxLQUFBO01BQUEsU0FBQUMsSUFBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsRUFBQUMsSUFBQSxPQUFBQyxLQUFBLENBQUFKLElBQUEsR0FBQUssSUFBQSxNQUFBQSxJQUFBLEdBQUFMLElBQUEsRUFBQUssSUFBQTtRQUFBRixJQUFBLENBQUFFLElBQUEsSUFBQUosU0FBQSxDQUFBSSxJQUFBO01BQUE7TUFBQU4sS0FBQSxHQUFBRCxlQUFBLENBQUFRLElBQUEsVUFBQUgsSUFBQTtNQUFBSSwwQkFBQSxDQUFBUixLQUFBLGlCQUFBUyxXQUFBLEVBQUFULEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSxXQUFBVSxZQUFBLEVBQUFWLEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSxjQUFBVyxZQUFBLEVBQUFYLEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSxlQUFBWSxZQUFBLEVBQUFaLEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSxvQkFBQWEsWUFBQSxFQUFBYixLQUFBO01BQUFRLDBCQUFBLENBQUFSLEtBQUEsMkJBQUFjLFlBQUEsRUFBQWQsS0FBQTtNQUFBUSwwQkFBQSxDQUFBUixLQUFBLDBCQUFBZSxZQUFBLEVBQUFmLEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSw0QkFBQWdCLFlBQUEsRUFBQWhCLEtBQUE7TUFBQVEsMEJBQUEsQ0FBQVIsS0FBQSxlQUFBaUIsWUFBQSxFQUFBakIsS0FBQTtNQUFBUSwwQkFBQSxDQUFBUixLQUFBLGVBQUFrQixhQUFBLEVBQUFsQixLQUFBO01BQUFBLEtBQUEsQ0F2a0M1Qm1CLGtDQUFrQyxHQUFHLEtBQUs7TUFBQW5CLEtBQUEsQ0FVMUNvQixlQUFlLEdBQUcsS0FBSztNQWdCL0I7TUFBQXBCLEtBQUEsQ0FDUXFCLHVCQUF1QixHQUFHLEtBQUs7TUFBQXJCLEtBQUEsQ0E2NUR2Q3NCLFFBQVEsR0FBRztRQUNWQyxlQUFlQSxDQUNkQyxXQUFpQyxFQUNqQ0MsS0FBYSxFQUNiQyxRQUF3QixFQUN4QkMsV0FBbUIsRUFDbkJDLFdBaUJDLEVBQ0RDLFdBS0MsRUFDTTtVQUNQO0FBQ0g7QUFDQTs7VUFFRyxNQUFNQyxnQkFBZ0IsR0FBR04sV0FBVyxDQUFDTyxtQ0FBbUMsQ0FBQ04sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztVQUVsRjtBQUNIOztVQUVHLElBQUlLLGdCQUFnQixFQUFFO1lBQ3JCLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUNFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7Y0FDbkM7Y0FDQTtZQUNEO1lBQ0EsSUFBSUYsZ0JBQWdCLENBQUNHLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRTtjQUN4Q0gsZ0JBQWdCLENBQVlJLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDO1lBQ0EsSUFBS0osZ0JBQWdCLENBQWdCRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRTtjQUM1REgsZ0JBQWdCLENBQWdCSyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JEO1lBQ0E7VUFDRDtVQUNBLE1BQU1DLFVBQVUsR0FBR1osV0FBVyxDQUFDOUMsT0FBTyxDQUFDLENBQUMsQ0FBQzJELFdBQVcsQ0FBQyxDQUFDLENBQUNDLFNBQVM7VUFDaEUsSUFBSVQsV0FBVyxDQUFDVSxxQkFBcUIsRUFBRTtZQUN0QyxJQUFJVixXQUFXLENBQUNXLHFCQUFxQixFQUFFO2NBQ3RDaEIsV0FBVyxDQUFDRixRQUFRLENBQUNtQixZQUFZLENBQUNoQixLQUFLLEVBQUVFLFdBQVcsRUFBRUMsV0FBVyxDQUFDO1lBQ25FO1VBQ0QsQ0FBQyxNQUFNLElBQUlDLFdBQVcsQ0FBQ2EsaUJBQWlCLEVBQUU7WUFDekMsSUFBSWIsV0FBVyxDQUFDYyxpQkFBaUIsRUFBRTtjQUNsQ25CLFdBQVcsQ0FBQ29CLGFBQWEsQ0FBQyxDQUFDO1lBQzVCO1VBQ0QsQ0FBQyxNQUFNLElBQUlSLFVBQVUsS0FBSyxDQUFDLElBQUlTLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDckIsS0FBSyxDQUFDLEVBQUU7WUFDaEVELFdBQVcsQ0FBQ3VCLGFBQWEsQ0FBQyxDQUFDO1VBQzVCLENBQUMsTUFBTSxJQUFJRixXQUFXLENBQUNDLGFBQWEsQ0FBQ3JCLEtBQUssQ0FBQyxFQUFFO1lBQzVDRCxXQUFXLENBQUN3QixjQUFjLENBQUN0QixRQUFRLENBQUM7VUFDckM7UUFDRCxDQUFDO1FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7UUFDRSxNQUFNdUIsb0JBQW9CQSxDQUE2QkMsS0FBNkIsRUFBaUI7VUFDcEcsTUFBTUMsUUFBUSxHQUFHRCxLQUFLLENBQUNFLFNBQVMsQ0FBQyxDQUFDO1VBQ2xDLE1BQU1DLEtBQUssR0FBR0YsUUFBUSxDQUFDRyxPQUFPO1VBQzlCLE1BQU1DLG9CQUFvQixHQUFHLElBQUksQ0FBQ0MsUUFBUSxDQUFDQyx1QkFBdUIsQ0FBQyxDQUFDO1VBQ3BFLE1BQU1DLGFBQWEsR0FBRyxJQUFJLENBQUNDLGdCQUFnQixDQUFDTixLQUFLLENBQUMsRUFBRU8scUJBQXFCLENBQUMsQ0FBQztVQUUzRSxJQUFJTCxvQkFBb0IsSUFBSUcsYUFBYSxFQUFFdkQsTUFBTSxFQUFFO1lBQ2xELElBQUk7Y0FDSCxNQUFNMEQsY0FBYyxHQUFHLE1BQU1OLG9CQUFvQjtjQUNqRCxJQUFJTSxjQUFjLEVBQUVDLFNBQVMsS0FBS1QsS0FBSyxDQUFDVSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNoRCxNQUFNQyxVQUFVLEdBQUdILGNBQWMsQ0FBQ0ksS0FBSztnQkFDdkMsTUFBTUMsSUFBSSxHQUFHTCxjQUFjLENBQUNLLElBQUk7Z0JBQ2hDLE1BQU1DLE9BQU8sR0FDWlQsYUFBYSxDQUNYVSxJQUFJLENBQUVDLFlBQXFCLElBQUs7a0JBQ2hDLE1BQU1DLFNBQVMsR0FBR0QsWUFBWSxDQUFDRSxTQUFTLENBQUMsQ0FBQztrQkFDMUMsT0FBT0wsSUFBSSxDQUFDTSxLQUFLLENBQUVDLEdBQVcsSUFBS0gsU0FBUyxDQUFDRyxHQUFHLENBQUMsS0FBS1QsVUFBVSxDQUFDUyxHQUFHLENBQUMsQ0FBQztnQkFDdkUsQ0FBQyxDQUFDLEVBQ0FDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJUCxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUU7a0JBQ25CLE1BQU1RLE1BQU0sR0FBR0MsZUFBZSxDQUFDQyxjQUFjLENBQUMsQ0FBQyxDQUFDVCxJQUFJLENBQUVPLE1BQU0sSUFBS0EsTUFBTSxDQUFDRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLENBQUM7a0JBQzFHLElBQUlILE1BQU0sRUFBRTtvQkFDWDtvQkFDQTtvQkFDQUEsTUFBTSxDQUFDSSxlQUFlLENBQUMsWUFBWSxFQUFFLE1BQU07c0JBQzFDMUIsS0FBSyxDQUFDMkIsUUFBUSxDQUFDYixPQUFPLEVBQUUsSUFBSSxDQUFDO29CQUM5QixDQUFDLENBQUM7a0JBQ0gsQ0FBQyxNQUFNO29CQUNOZCxLQUFLLENBQUMyQixRQUFRLENBQUNiLE9BQU8sRUFBRSxJQUFJLENBQUM7a0JBQzlCO2tCQUNBLElBQUksQ0FBQ1gsUUFBUSxDQUFDeUIsMEJBQTBCLENBQUMsQ0FBQztnQkFDM0M7Y0FDRDtZQUNELENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7Y0FDWEMsR0FBRyxDQUFDQyxLQUFLLENBQUMsOERBQThERixDQUFDLEVBQUUsQ0FBQztZQUM3RTtVQUNEO1VBQ0E7VUFDQSxJQUFJLENBQUNHLGFBQWEsQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRURDLHFCQUFxQkEsQ0FBQSxFQUFtQztVQUN2RCxJQUFJLENBQUNGLGFBQWEsQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTTdDLFlBQVlBLENBQ2pCaEIsS0FBYSxFQUNiRSxXQUFtQixFQUNuQkMsV0FrQkMsRUFDa0I7VUFDbkIsTUFBTUosV0FBVyxHQUFHQyxLQUFLLENBQUM5QyxhQUFhLENBQUMsQ0FBeUI7O1VBRWpFO1VBQ0EsTUFBTTZDLFdBQVcsQ0FBQ2dDLFFBQVEsQ0FBQ2dDLFFBQVEsQ0FBQyxDQUFDO1VBRXJDLE9BQU9oRSxXQUFXLENBQUNnQyxRQUFRLENBQ3pCaUMsWUFBWSxDQUFDOUQsV0FBVyxFQUFFQyxXQUFXLENBQUMsQ0FDdEM4RCxJQUFJLENBQUVDLEdBQUcsSUFBSztZQUNkbkUsV0FBVyxDQUFDb0UsbUJBQW1CLENBQUMsQ0FBQztZQUNqQyxPQUFPRCxHQUFHO1VBQ1gsQ0FBQyxDQUFDLENBQ0RFLEtBQUssQ0FBQyxNQUFNO1lBQ1pyRSxXQUFXLENBQUNvRSxtQkFBbUIsQ0FBQyxDQUFDO1VBQ2xDLENBQUMsQ0FBQztRQUNKLENBQUM7UUFDREUsdUJBQXVCQSxDQUN0QnRFLFdBQWlDLEVBQ2pDdUUsT0FBZ0IsRUFDaEJDLGlCQUF3RCxFQUN4REMsY0FBc0IsRUFDdEJDLGVBQXVCLEVBQ2hCO1VBQ1BGLGlCQUFpQixHQUFHLE9BQU9BLGlCQUFpQixLQUFLLFFBQVEsR0FBR0csSUFBSSxDQUFDQyxLQUFLLENBQUNKLGlCQUFpQixDQUFDLEdBQUdBLGlCQUFpQjtVQUM3RyxNQUFNSyxXQUFXLEdBQUdMLGlCQUFpQixDQUFDQyxjQUFjLENBQUM7WUFDcERLLCtCQUErQixHQUFHUCxPQUFPLENBQUNRLGlCQUFpQixDQUFDLENBQUU7WUFDOURDLFNBQVMsR0FBR0YsK0JBQStCLENBQ3pDRyxRQUFRLENBQUMsQ0FBQyxDQUNWQyxZQUFZLENBQUMsQ0FBQyxDQUNkQyxXQUFXLENBQUNMLCtCQUErQixDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDO1VBQ3pELElBQUlDLHNCQUFzQixHQUFHaEUsV0FBVyxDQUFDaUUsd0JBQXdCLENBQUNULFdBQVcsQ0FBQztZQUM3RVUsZUFBZSxHQUFHdkYsV0FBVyxDQUFDd0Ysb0JBQW9CLENBQUNWLCtCQUErQixFQUFFSixlQUFlLENBQUM7WUFDcEdlLDhCQUE4QjtVQUUvQkYsZUFBZSxHQUFHQSxlQUFlLENBQUNHLEdBQUcsQ0FBQyxVQUFVQyxlQUF3QixFQUFFO1lBQ3pFLE9BQU87Y0FDTnJDLElBQUksRUFBRXFDLGVBQWU7Y0FDckJDLFFBQVEsRUFBRVosU0FBUyxJQUFJTixlQUFlLEdBQUcsSUFBSUEsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUNwRSxDQUFDO1VBQ0YsQ0FBQyxDQUFDO1VBQ0YsSUFBSUcsV0FBVyxJQUFJQSxXQUFXLENBQUNnQixVQUFVLEVBQUU7WUFDMUMsTUFBTUMsT0FBTyxHQUFHakIsV0FBVyxDQUFDZ0IsVUFBVSxJQUFJN0YsV0FBVyxDQUFDK0Ysc0JBQXNCLENBQUNDLGlCQUFpQixDQUFDbkIsV0FBVyxDQUFDZ0IsVUFBVSxDQUFDO1lBQ3RILElBQUlJLE1BQU0sQ0FBQ3ZELElBQUksQ0FBQ29ELE9BQU8sQ0FBQyxDQUFDbkgsTUFBTSxHQUFHLENBQUMsRUFBRTtjQUNwQzhHLDhCQUE4QixHQUFHSyxPQUFPO1lBQ3pDO1VBQ0Q7VUFDQTtVQUNBLElBQUlULHNCQUFzQixDQUFDMUcsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QyxNQUFNdUgsVUFBVSxHQUFHM0IsT0FBTyxDQUFDNEIsYUFBYSxDQUFDLENBQUMsQ0FBQ3ZELElBQUksQ0FBRVUsSUFBSSxJQUFLQSxJQUFJLENBQUM4QyxNQUFNLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixDQUFDO1lBQ2hHLElBQUlGLFVBQVUsRUFBRTtjQUNmYixzQkFBc0IsR0FBR3JGLFdBQVcsQ0FBQ3FHLDhDQUE4QyxDQUNsRkgsVUFBVSxDQUFDSSxRQUFRLENBQUMsQ0FBQyxFQUNyQnpCLFdBQVcsQ0FBQzBCLGNBQ2IsQ0FBQztZQUNGO1VBQ0Q7VUFFQSxJQUFJMUIsV0FBVyxJQUFJQSxXQUFXLENBQUMwQixjQUFjLElBQUkxQixXQUFXLENBQUMyQixNQUFNLEVBQUU7WUFDcEV4RyxXQUFXLENBQUMrRixzQkFBc0IsQ0FBQ1UsUUFBUSxDQUFDNUIsV0FBVyxDQUFDMEIsY0FBYyxFQUFFMUIsV0FBVyxDQUFDMkIsTUFBTSxFQUFFO2NBQzNGRSxrQkFBa0IsRUFBRW5CLGVBQWU7Y0FDbkNvQixxQkFBcUIsRUFBRXRCLHNCQUFzQjtjQUM3Q0ksOEJBQThCLEVBQUVBO1lBQ2pDLENBQUMsQ0FBQztVQUNIO1FBQ0QsQ0FBQztRQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtRQUNFLE1BQU1tQiw4QkFBOEJBLENBQ25DNUcsV0FBaUMsRUFDakM2RyxlQUF1QixFQUN2QjNHLFFBQXdCLEVBQ3hCNEcsV0FBbUIsRUFDSDtVQUNoQixPQUFPOUcsV0FBVyxDQUFDK0Ysc0JBQXNCLENBQUNhLDhCQUE4QixDQUFDNUcsV0FBVyxFQUFFNkcsZUFBZSxFQUFFM0csUUFBUSxFQUFFNEcsV0FBVyxDQUFDO1FBQzlILENBQUM7UUFFREMsZ0JBQWdCQSxDQUE2QkMsTUFBc0QsRUFBUTtVQUMxRztVQUNBLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUcsSUFBSTtVQUU3QixNQUFNQyxVQUFVLEdBQUdGLE1BQU0sQ0FBQ0csWUFBWSxDQUFDLFlBQVksQ0FBQztVQUNwRCxJQUFJLENBQUNDLGdCQUFnQixHQUFHRixVQUFVO1VBRWxDLElBQUksQ0FBQ0csZUFBZSxDQUFDLENBQUMsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7VUFFdkMsTUFBTUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDckssT0FBTyxDQUFDLENBQUMsQ0FBQzZILGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7VUFFbEcsSUFDQzFELFdBQVcsQ0FBQ0MsYUFBYSxDQUFDLElBQUksQ0FBQ3BFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFDekMsSUFBSSxDQUFDQSxPQUFPLENBQUMsQ0FBQyxDQUFDMkQsV0FBVyxDQUFDLENBQUMsQ0FBQzJHLGFBQWEsS0FBSyxNQUFNLElBQ3JERCxxQkFBcUIsQ0FBQ0UsV0FBVyxDQUFDLDRCQUE0QixDQUFDLEtBQUssS0FBSyxFQUN4RTtZQUNELElBQUksQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQ1IsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDO1VBQ2hEO1FBQ0QsQ0FBQztRQUNEUyxpQkFBaUIsRUFBRSxTQUFBQSxDQUFBLEVBQTRDO1VBQzlELElBQUksQ0FBQ04sZUFBZSxDQUFDLENBQUMsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNETSxjQUFjLEVBQUUsU0FBQUEsQ0FBQSxFQUE0QztVQUMzRDtVQUNBQyxVQUFVLENBQUMsTUFBTTtZQUNoQixJQUFJLENBQUNSLGVBQWUsQ0FBQyxDQUFDLENBQUNDLGNBQWMsQ0FBQyxDQUFDO1VBQ3hDLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDVCxDQUFDO1FBQ0RRLG9CQUFvQixFQUFFLFNBQUFBLENBQVU5SCxXQUFpQyxFQUFFK0gsYUFBOEIsRUFBUTtVQUN4RyxNQUFNQyxhQUFhLEdBQUcsT0FBT0QsYUFBYSxLQUFLLFFBQVEsR0FBR3BELElBQUksQ0FBQ0MsS0FBSyxDQUFDbUQsYUFBYSxDQUFDLEdBQUdBLGFBQWE7O1VBRW5HO1VBQ0EsSUFBSUUsUUFBNEI7VUFDaEMsSUFBSSxPQUFPRCxhQUFhLEtBQUssUUFBUSxFQUFFO1lBQ3RDQyxRQUFRLEdBQUdELGFBQWE7VUFDekIsQ0FBQyxNQUFNO1lBQ047WUFDQUMsUUFBUSxHQUFHRCxhQUFhLENBQUNFLFlBQVksSUFBSUYsYUFBYSxDQUFDRyxTQUFTO1VBQ2pFO1VBRUEsSUFBSUYsUUFBUSxFQUFFO1lBQ2JqSSxXQUFXLENBQUNxSCxlQUFlLENBQUMsQ0FBQyxDQUFDUyxvQkFBb0IsQ0FBQ0csUUFBUSxDQUFDO1VBQzdEO1FBQ0QsQ0FBQztRQUVERyx1QkFBdUIsRUFBRSxTQUFBQSxDQUFBLEVBQTRDO1VBQ3BFLElBQUksQ0FBQ2xMLE9BQU8sQ0FBQyxDQUFDLENBQUMrSCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUNvRCxXQUFXLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDO1FBQzVFLENBQUM7UUFFREMsbUJBQW1CLEVBQUUsU0FBQUEsQ0FBQSxFQUE0QztVQUNoRSxNQUFNQyxJQUFJLEdBQUcsSUFBSSxDQUFDckwsT0FBTyxDQUFDLENBQUM7VUFDM0IsTUFBTXNMLGFBQWEsR0FBR25ILFdBQVcsQ0FBQ0MsYUFBYSxDQUFDaUgsSUFBSSxDQUFDO1VBQ3JELE1BQU1FLGFBQWEsR0FBR0YsSUFBSSxDQUFDdEQsUUFBUSxDQUFDLFVBQVUsQ0FBQztVQUMvQyxNQUFNeUQsZ0NBQWdDLEdBQUdELGFBQWEsQ0FDcERFLFdBQVcsQ0FBQyxJQUFJLENBQUN0QixlQUFlLENBQUMsQ0FBQyxDQUFDdUIsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQ3hFQyxlQUFlLENBQUMsQ0FBRTtVQUNwQjtVQUNBLElBQUksQ0FBQ0wsYUFBYSxJQUFJRSxnQ0FBZ0MsQ0FBQ2pCLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN2RyxNQUFNcUIsb0JBQW9CLEdBQUdDLFNBQVMsQ0FBQ0MsZUFBZSxDQUFDLENBQUMsQ0FDdERDLE9BQU8sQ0FBQyxDQUFDLENBQ1RDLE1BQU0sQ0FDTEMsT0FBZ0IsSUFDaEJBLE9BQU8sQ0FBQ0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUNsTSxPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLENBQUMsQ0FBQyxFQUFFSyxPQUFPLENBQUMsQ0FBQyxJQUFJK0QsT0FBTyxDQUFDRSxhQUFhLENBQUMsQ0FBQyxLQUFLLElBQzNHLENBQUM7WUFDRixJQUFJUCxvQkFBb0IsQ0FBQ25LLE1BQU0sS0FBSyxDQUFDLEVBQUU7Y0FDdENvSyxTQUFTLENBQUNPLGNBQWMsQ0FBQ1Isb0JBQW9CLENBQUM7WUFDL0M7VUFDRDtVQUNBSixnQ0FBZ0MsQ0FBQ0wsV0FBVyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQztVQUM5RSxJQUFJLENBQUNoQixlQUFlLENBQUMsQ0FBQyxDQUFDa0MsV0FBVyxDQUFDLENBQUM7UUFDckM7TUFDRCxDQUFDO01BQUEsT0FBQS9LLEtBQUE7SUFBQTtJQUFBZ0wsY0FBQSxDQUFBbk8sb0JBQUEsRUFBQWtELGVBQUE7SUFBQSxJQUFBa0wsTUFBQSxHQUFBcE8sb0JBQUEsQ0FBQXFPLFNBQUE7SUFyc0VEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFQQ0QsTUFBQSxDQVFRbEosbUNBQW1DLEdBQTNDLFNBQVFBLG1DQUFtQ0EsQ0FBQ29KLElBQW1CLEVBQXNEO01BQUEsSUFBcERDLGNBQWMsR0FBQWxMLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFyQixTQUFBLEdBQUFxQixTQUFBLE1BQUcsS0FBSztNQUN0RixPQUFPaUwsSUFBSSxDQUFDRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUdDLE1BQXFCLElBQUs7UUFDbEUsTUFBTUMsUUFBUSxHQUFHRCxNQUFNLENBQUNySixHQUFHLENBQUMsY0FBYyxDQUFDO1FBQzNDLE1BQU11SixZQUFZLEdBQUdGLE1BQU0sQ0FBQ3JKLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxJQUFJLENBQUNzSixRQUFRLElBQUksQ0FBQ0MsWUFBWSxFQUFFO1VBQy9CLE9BQU8sS0FBSztRQUNiO1FBQ0EsTUFBTUMsSUFBSSxHQUFHSCxNQUE2QjtRQUMxQyxNQUFNSSxJQUFJLEdBQUdELElBQUksQ0FDZjlELGFBQWEsQ0FBQyxDQUFDLENBQ2Z2RCxJQUFJLENBQUVzRCxVQUFzQixJQUFLQSxVQUFVLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEtBQUsseUJBQXlCLENBQUMsRUFDbEZFLFFBQVEsQ0FBQyxDQUFDO1FBQ2IsSUFBSTRELElBQUksS0FBSyxJQUFJLElBQUlBLElBQUksS0FBSyxNQUFNLEVBQUU7VUFDckMsT0FBTyxLQUFLO1FBQ2I7UUFDQSxJQUFJLENBQUNELElBQUksQ0FBQ0UsVUFBVSxDQUFDLENBQUMsRUFBRTtVQUN2QixPQUFPLEtBQUs7UUFDYjtRQUNBO1FBQ0EsT0FBT1AsY0FBYyxHQUFHSyxJQUFJLENBQUN6SixVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUk7TUFDakQsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBaUosTUFBQSxDQUlEcEMsZUFBZSxHQUZmLFNBRUFBLGVBQWVBLENBQUMrQyxHQUFZLEVBQWdCO01BQzNDLElBQUlBLEdBQUcsRUFBRTtRQUNSO1FBQ0EsSUFBSSxDQUFDQywyQkFBMkIsR0FBRyxJQUFJLENBQUNBLDJCQUEyQixJQUFJLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsSUFBSSxDQUFDQSwyQkFBMkIsQ0FBQ0QsR0FBRyxDQUFDLEVBQUU7VUFDM0MsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQ0QsR0FBRyxDQUFDLEdBQUcsSUFBSUUsWUFBWSxDQUFDLElBQUksRUFBRUYsR0FBRyxDQUFDO1FBQ3BFO1FBQ0EsT0FBTyxJQUFJLENBQUNDLDJCQUEyQixDQUFDRCxHQUFHLENBQUM7TUFDN0MsQ0FBQyxNQUFNO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQ0csWUFBWSxFQUFFO1VBQ3ZCLElBQUksQ0FBQ0EsWUFBWSxHQUFHLElBQUlELFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDM0M7UUFDQSxPQUFPLElBQUksQ0FBQ0MsWUFBWTtNQUN6QjtJQUNELENBQUM7SUFBQWQsTUFBQSxDQUVEZSxNQUFNLEdBQU4sU0FBQUEsTUFBTUEsQ0FBQSxFQUFTO01BQ2RqTSxlQUFBLENBQUFtTCxTQUFBLENBQU1jLE1BQU0sQ0FBQXpMLElBQUE7TUFDWixNQUFNMEwsV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQzs7TUFFdEQ7TUFDQSxNQUFNbkQscUJBQXFCLEdBQUcsSUFBSSxDQUFDb0QsaUJBQWlCLENBQUMsQ0FBQyxDQUFDNUYsaUJBQWlCLENBQUMsVUFBVSxDQUF5QjtNQUM1R3dDLHFCQUFxQixFQUFFYyxXQUFXLENBQUMsMkJBQTJCLEVBQUU7UUFBRXVDLElBQUksRUFBRTtNQUFLLENBQUMsRUFBRXZOLFNBQVMsRUFBRSxJQUFJLENBQUM7TUFDaEdrSyxxQkFBcUIsRUFBRWMsV0FBVyxDQUNqQyxhQUFhLEVBQ2I7UUFDQ3dDLFVBQVUsRUFBRSxLQUFLO1FBQ2pCQyxLQUFLLEVBQUU7TUFDUixDQUFDLEVBQ0R6TixTQUFTLEVBQ1QsSUFDRCxDQUFDO01BQ0RrSyxxQkFBcUIsRUFBRWMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMwQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7TUFDaEZ4RCxxQkFBcUIsRUFBRWMsV0FBVyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQztNQUV2RSxJQUFJLElBQUksQ0FBQzJDLHVDQUF1QyxDQUFDLENBQUMsRUFBRTtRQUNuRFAsV0FBVyxDQUFDUSxXQUFXLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDQyxnQ0FBZ0MsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZHLENBQUMsTUFBTTtRQUNOLElBQUksQ0FBQ0Msa0JBQWtCLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUVuRSxVQUFVLElBQUs7VUFDakRBLFVBQVUsQ0FBQytELFdBQVcsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUNDLGdDQUFnQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDO01BQ0g7TUFFQSxJQUFJLENBQUN0SCxhQUFhLEdBQUcsSUFBSSxDQUFDM0csT0FBTyxDQUFDLENBQUMsQ0FBQ29PLElBQUksQ0FBQyw4QkFBOEIsQ0FBa0I7TUFDekYsSUFBSSxDQUFDQyxjQUFjLEdBQUd4QyxTQUFTLENBQUNDLGVBQWUsQ0FBQyxDQUFDLENBQUN3QyxRQUFRLENBQUMsR0FBRyxDQUFDO01BQy9ELElBQUksQ0FBQ0QsY0FBYyxFQUFFRSxZQUFZLENBQUMsSUFBSSxDQUFDQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7TUFDOURuRSxxQkFBcUIsRUFBRWMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRWhMLFNBQVMsRUFBRSxJQUFJLENBQUM7TUFDNUVrSyxxQkFBcUIsRUFBRWMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRWhMLFNBQVMsRUFBRSxJQUFJLENBQUM7TUFFNUUsSUFBSSxDQUFDc08sZ0NBQWdDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQUFsQyxNQUFBLENBRURtQyxNQUFNLEdBQU4sU0FBQUEsTUFBTUEsQ0FBQSxFQUFTO01BQ2QsSUFBSSxJQUFJLENBQUN2QiwyQkFBMkIsRUFBRTtRQUNyQyxLQUFLLE1BQU1ELEdBQUcsSUFBSW5FLE1BQU0sQ0FBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMySCwyQkFBMkIsQ0FBQyxFQUFFO1VBQ2hFLElBQUksSUFBSSxDQUFDQSwyQkFBMkIsQ0FBQ0QsR0FBRyxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQ0QsR0FBRyxDQUFDLENBQUN5QixPQUFPLENBQUMsQ0FBQztVQUNoRDtRQUNEO1FBQ0EsT0FBTyxJQUFJLENBQUN4QiwyQkFBMkI7TUFDeEM7TUFDQSxJQUFJLElBQUksQ0FBQ0UsWUFBWSxFQUFFO1FBQ3RCLElBQUksQ0FBQ0EsWUFBWSxDQUFDc0IsT0FBTyxDQUFDLENBQUM7TUFDNUI7TUFDQSxPQUFPLElBQUksQ0FBQ3RCLFlBQVk7TUFFeEIsTUFBTXVCLGVBQWUsR0FBRyxJQUFJLENBQUNqSSxhQUFhLEdBQUcsSUFBSSxDQUFDQSxhQUFhLENBQUNpSSxlQUFlLEdBQUcsSUFBSTtNQUN0RixJQUFJQSxlQUFlLElBQUlBLGVBQWUsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoREQsZUFBZSxDQUFDRSxLQUFLLENBQUMsQ0FBQztNQUN4QjtNQUNBO01BQ0EsTUFBTTlMLFFBQVEsR0FBRyxJQUFJLENBQUNoRCxPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLENBQUMsQ0FBQztNQUNuRCxJQUFJN0UsUUFBUSxJQUFJQSxRQUFRLENBQUMrTCxXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDL0wsUUFBUSxDQUFDZ00sWUFBWSxDQUFDLEtBQUssQ0FBQztNQUM3QjtNQUVBLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFdEMsSUFBSSxDQUFDYixjQUFjLEVBQUVjLFlBQVksQ0FBQyxJQUFJLENBQUNYLGdCQUFnQixFQUFFLElBQUksQ0FBQztJQUMvRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUFqQyxNQUFBLENBSUFpQyxnQkFBZ0IsR0FBaEIsU0FBQUEsZ0JBQWdCQSxDQUFBLEVBQVM7TUFDeEIsSUFBSSxJQUFJLENBQUNZLGVBQWUsQ0FBQyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDekM7UUFDQTtNQUNEO01BRUEsTUFBTWhDLFlBQVksR0FBRyxJQUFJLENBQUNsRCxlQUFlLENBQUMsQ0FBQztNQUMzQyxNQUFNa0IsSUFBSSxHQUFHLElBQUksQ0FBQ3JMLE9BQU8sQ0FBQyxDQUFDO01BQzNCLE1BQU1zUCxRQUFRLEdBQUd6RCxTQUFTLEVBQUVDLGVBQWUsQ0FBQyxDQUFDLENBQzNDQyxPQUFPLENBQUMsQ0FBQyxDQUNUQyxNQUFNLENBQUVDLE9BQWdCLElBQUs7UUFDN0IsT0FBT0EsT0FBTyxDQUFDQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLYixJQUFJLENBQUN4RCxpQkFBaUIsQ0FBQyxDQUFDLEVBQUVLLE9BQU8sQ0FBQyxDQUFDO01BQ3ZFLENBQUMsQ0FBQztNQUVILElBQUltRixZQUFZLEVBQUU7UUFDakJBLFlBQVksQ0FBQ2tDLGFBQWEsQ0FBQ0QsUUFBUSxFQUFFLFNBQVMsQ0FBQztNQUNoRDtJQUNELENBQUM7SUFBQS9DLE1BQUEsQ0FFRHRILGdCQUFnQixHQUFoQixTQUFBQSxnQkFBZ0JBLENBQUN1SyxNQUFhLEVBQW9CO01BQ2pELE9BQU9BLE1BQU0sSUFBSUEsTUFBTSxDQUFDQyxhQUFhLENBQUMsQ0FBQztJQUN4Qzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQWxELE1BQUEsQ0FLUW1ELGtDQUFrQyxHQUExQyxTQUFRQSxrQ0FBa0NBLENBQUNDLFdBQW1DLEVBQVE7TUFDckYsTUFBTUMsb0JBQW9CLEdBQUdBLENBQUNwTCxLQUFZLEVBQUVxTCxpQkFBdUMsS0FBVztRQUM3RixNQUFNQyxNQUFNLEdBQUcsQ0FBQyxHQUFHRCxpQkFBaUIsQ0FBQ0UsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHRixpQkFBaUIsQ0FBQ0csYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN2RixJQUFJRixNQUFNLENBQUNyTyxNQUFNLEtBQUssQ0FBQyxFQUFFO1VBQ3hCLE1BQU1rRCxLQUFLLEdBQUcsSUFBSSxDQUFDc0wsa0JBQWtCLENBQUNILE1BQU0sQ0FBQyxDQUFDLENBQW9CLENBQUM7VUFDbkUsSUFBSSxDQUFDbkwsS0FBSyxFQUFFO1lBQ1g7VUFDRDtVQUNBLE1BQU11TCxTQUFTLEdBQUd2TCxLQUFLLENBQUNwQixHQUFHLENBQVEsa0JBQWtCLENBQUMsSUFBS29CLEtBQUssQ0FBQ3dMLE9BQU8sQ0FBQyxDQUFtQjtVQUM1RixNQUFNMUwsUUFBUSxHQUFHRSxLQUFLLENBQUN5TCxTQUFTLENBQUMsQ0FBQyxFQUFFN00sR0FBRyxDQUFXLHFCQUFxQixDQUFDLEdBQUlvQixLQUFLLENBQUN5TCxTQUFTLENBQUMsQ0FBQyxHQUFnQmpRLFNBQVM7VUFDdEgsSUFDQytQLFNBQVMsS0FDUkEsU0FBUyxFQUFFM00sR0FBRyxDQUFDLGdDQUFnQyxDQUFDLElBQUkyTSxTQUFTLEVBQUUzTSxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxJQUN0R2tCLFFBQVEsRUFBRTRMLGtCQUFrQixDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDQyxZQUFZLEtBQUssTUFBTSxFQUM3RDtZQUNEO1lBQ0FWLGlCQUFpQixDQUFDVyxhQUFhLENBQUMseUNBQXlDLENBQUM7WUFDMUVYLGlCQUFpQixDQUFDWSxXQUFXLENBQUMsb0JBQW9CLEVBQUViLG9CQUFvQixFQUFFLElBQUksQ0FBQztVQUNoRjtRQUNEO01BQ0QsQ0FBQztNQUNELEtBQUssTUFBTTVGLFVBQVUsSUFBSTJGLFdBQVcsRUFBRTtRQUNyQyxJQUFJM0YsVUFBVSxDQUFDaUQsVUFBVSxDQUFDLENBQUMsRUFBRTtVQUM1QjtVQUNBakQsVUFBVSxDQUFDK0QsV0FBVyxDQUFDLG9CQUFvQixFQUFFL0QsVUFBVSxFQUFFNEYsb0JBQW9CLEVBQUUsSUFBSSxDQUFDO1FBQ3JGO01BQ0Q7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQXJELE1BQUEsQ0FLUTBELGtCQUFrQixHQUExQixTQUFRQSxrQkFBa0JBLENBQUNTLEtBQXNCLEVBQXFCO01BQ3JFLElBQUlqTSxRQUE4QjtNQUNsQyxNQUFNa00sV0FBVyxHQUFJTCxPQUFnQixJQUEyQjtRQUMvRDtRQUNBO1FBQ0EsSUFBSUEsT0FBTyxDQUFDL00sR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJK00sT0FBTyxDQUFDbEssSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUU7VUFDN0UsT0FBT2tLLE9BQU8sQ0FBQ2xLLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN6QyxDQUFDLE1BQU0sSUFBSWtLLE9BQU8sQ0FBQy9NLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1VBQzlDLE9BQU8rTSxPQUFPO1FBQ2Y7TUFDRCxDQUFDO01BQ0QsSUFBSUksS0FBSyxDQUFDbk4sR0FBRyxDQUFDLHNEQUFzRCxDQUFDLEVBQUU7UUFDdEUsTUFBTStNLE9BQU8sR0FBR0ksS0FBSyxDQUFDOUwsT0FBTztRQUM3QixJQUFJMEwsT0FBTyxDQUFDL00sR0FBRyxDQUFDLGtDQUFrQyxDQUFDLEVBQUU7VUFDcEQsTUFBTXFOLFdBQVcsR0FBSU4sT0FBTyxDQUF3Qk8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDdkUsTUFBTUMsbUJBQW1CLEdBQUdILFdBQVcsQ0FBQ0MsV0FBVyxDQUFDO1VBQ3BELElBQUlFLG1CQUFtQixFQUFFO1lBQ3hCck0sUUFBUSxHQUFHcU0sbUJBQW1CO1VBQy9CLENBQUMsTUFBTTtZQUNOLE1BQU1DLFdBQVcsR0FBSVQsT0FBTyxDQUF3QlUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsTUFBTUMsbUJBQW1CLEdBQUdOLFdBQVcsQ0FBQ0ksV0FBVyxDQUFDO1lBQ3BELElBQUlFLG1CQUFtQixFQUFFO2NBQ3hCeE0sUUFBUSxHQUFHd00sbUJBQW1CO1lBQy9CO1VBQ0Q7UUFDRCxDQUFDLE1BQU07VUFDTnhNLFFBQVEsR0FBR2tNLFdBQVcsQ0FBQ0wsT0FBTyxDQUFDO1FBQ2hDO1FBRUEsSUFBSTdMLFFBQVEsRUFBRTtVQUNiLE9BQU9BLFFBQVEsQ0FBQ0csT0FBTztRQUN4QjtNQUNEO01BQ0EsT0FBT3pFLFNBQVM7SUFDakIsQ0FBQztJQUFBb00sTUFBQSxDQUVEMkUsaUJBQWlCLEdBQWpCLFNBQUFBLGlCQUFpQkEsQ0FBQSxFQUFTO01BQ3pCQyxjQUFjLENBQUMzRSxTQUFTLENBQUMwRSxpQkFBaUIsQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztNQUN0RDtNQUNBLElBQUksSUFBSSxDQUFDck8sS0FBSyxDQUFDWSxXQUFXLENBQUMsQ0FBQyxFQUFFME4seUJBQXlCLElBQUlDLFlBQVksQ0FBQ3RKLFlBQVksQ0FBQyxDQUFDLEtBQUs3SCxTQUFTLEVBQUU7UUFDckdtUixZQUFZLENBQUNDLFlBQVksQ0FBQyxJQUFJLENBQUNuQyxlQUFlLENBQUMsQ0FBQyxDQUFDcEgsWUFBWSxDQUFDLENBQUMsQ0FBQztNQUNqRTtJQUNELENBQUM7SUFBQXVFLE1BQUEsQ0FFRGlGLGdCQUFnQixHQUFoQixTQUFBQSxnQkFBZ0JBLENBQUEsRUFBUztNQUN4QixJQUFJN0IsV0FBbUM7TUFDdkMsSUFBSSxJQUFJLENBQUNuQywyQkFBMkIsQ0FBQyxDQUFDLENBQUNpRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7UUFDMUQsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ2xFLDJCQUEyQixDQUFDLENBQUMsQ0FBQ21FLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssTUFBTUMsT0FBTyxJQUFJRixRQUFRLEVBQUU7VUFDL0IvQixXQUFXLEdBQUdpQyxPQUFPLENBQUNDLGNBQWMsQ0FBQyxDQUFDO1VBQ3RDLElBQUksQ0FBQ25DLGtDQUFrQyxDQUFDQyxXQUFXLENBQUM7UUFDckQ7TUFDRCxDQUFDLE1BQU07UUFDTkEsV0FBVyxHQUFHLElBQUksQ0FBQ3pCLGtCQUFrQixDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDd0Isa0NBQWtDLENBQUNDLFdBQVcsQ0FBQztNQUNyRDtJQUNELENBQUM7SUFBQXBELE1BQUEsQ0FFRHVGLGdCQUFnQixHQUFoQixTQUFBQSxnQkFBZ0JBLENBQUM5TyxRQUF3QixFQUF5QztNQUFBLElBQXZDRSxXQUEwQixHQUFBMUIsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXJCLFNBQUEsR0FBQXFCLFNBQUEsTUFBRyxDQUFDLENBQUM7TUFDekU7TUFDQSxJQUFJLENBQUN1USxzQkFBc0IsR0FBRzdPLFdBQVcsQ0FBQzhPLGVBQWU7O01BRXpEO01BQ0EsSUFBSSxDQUFDQywwQkFBMEIsR0FBRyxJQUFJLENBQUNqUyxPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLENBQUMsQ0FBQyxFQUFFSyxPQUFPLENBQUMsQ0FBQztNQUMvRSxNQUFNZ0ssT0FBTyxHQUFHLElBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQUM7UUFDakM1RSxXQUFXLEdBQUcsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2hEbkQscUJBQXFCLEdBQUcsSUFBSSxDQUFDckssT0FBTyxDQUFDLENBQUMsQ0FBQzZILGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7UUFDNUZ1SyxjQUFjLEdBQUcsSUFBSSxDQUFDcFMsT0FBTyxDQUFDLENBQUMsQ0FBQytILFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDcERzSyxZQUFZLEdBQUdoSSxxQkFBcUIsQ0FBQ0UsV0FBVyxDQUFDLGFBQWEsQ0FBQztNQUNoRSxJQUFJK0gsZ0JBQWdCO01BQ3BCRCxZQUFZLENBQUNFLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDMUIsSUFBSXJQLFdBQVcsQ0FBQ3NQLE1BQU0sS0FBS0MsZ0JBQWdCLENBQUNDLGNBQWMsRUFBRTtRQUMzRCxJQUFJLENBQUNDLGlCQUFpQixDQUFDLENBQUM7TUFDekI7TUFDQSxNQUFNQyxTQUFTLEdBQUdyRixXQUFXLENBQUMxRixpQkFBaUIsQ0FBQyxDQUFtQjtNQUNuRSxJQUNDK0ssU0FBUyxJQUNUQSxTQUFTLENBQUNDLGlCQUFpQixDQUFDLENBQUMsSUFDN0IsQ0FBQ1IsWUFBWSxDQUFDUyxJQUFJLENBQUNGLFNBQVMsQ0FBQzdLLFFBQVEsQ0FBQyxDQUFDLENBQUM4SyxpQkFBaUIsQ0FBQzVFLElBQUksQ0FBQzJFLFNBQVMsQ0FBQzdLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwRjtRQUNEO0FBQ0g7QUFDQTs7UUFFRzZLLFNBQVMsQ0FBQ0csVUFBVSxDQUFDLENBQUMsQ0FBQ0MsWUFBWSxDQUFDLENBQUM7TUFDdEM7O01BRUE7TUFDQTtNQUNBLEtBQUssTUFBTUMsSUFBSSxJQUFJZixPQUFPLEVBQUU7UUFDM0JJLGdCQUFnQixHQUFHVyxJQUFJLENBQUNDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUlaLGdCQUFnQixFQUFFO1VBQ3JCQSxnQkFBZ0IsQ0FBQ2EsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3pDO01BQ0Q7O01BRUE7TUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxTQUFBQSxDQUFBLEVBQWtCO1FBQ2xELElBQUksQ0FBRTdGLFdBQVcsQ0FBMEM4RixnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQ25RLFdBQVcsQ0FBQ29RLGdCQUFnQixFQUFFO1VBQ2pIL0YsV0FBVyxDQUFDZ0csa0JBQWtCLENBQUMsSUFBeUIsQ0FBQztRQUMxRDtNQUNELENBQUM7TUFDRGhHLFdBQVcsQ0FBQ2xILGVBQWUsQ0FBQyxvQkFBb0IsRUFBRStNLHdCQUF3QixDQUFDO01BRTNFLE1BQU1JLG1CQUFtQixHQUFHO1FBQzNCaEMsZ0JBQWdCLEVBQUVBLENBQUEsS0FBWTtVQUM3QixJQUFJLElBQUksQ0FBQ3hSLE9BQU8sQ0FBQyxDQUFDLENBQUMyRCxXQUFXLENBQUMsQ0FBQyxFQUFFOFAscUJBQXFCLEVBQUU7WUFDeERMLHdCQUF3QixDQUFDLENBQUM7VUFDM0I7VUFDQTdGLFdBQVcsQ0FBQ21HLG1CQUFtQixDQUFDRixtQkFBbUIsQ0FBQztRQUNyRDtNQUNELENBQUM7TUFDRGpHLFdBQVcsQ0FBQ29HLGdCQUFnQixDQUFDSCxtQkFBbUIsQ0FBQzs7TUFFakQ7TUFDQSxJQUFJLENBQUNJLHFCQUFxQixDQUFDNVEsUUFBUSxFQUFFb1AsY0FBYyxFQUFFbFAsV0FBVyxFQUFFMlEsV0FBVyxDQUFDO01BRTlFLElBQUksQ0FBQ0Msc0JBQXNCLENBQUN2RyxXQUFXLENBQUM7TUFFeEMsSUFBSSxDQUFDb0MsV0FBVyxHQUFHLElBQUksQ0FBQ29FLHVDQUF1QyxDQUFDeEcsV0FBVyxDQUFDO01BQzVFLElBQUksQ0FBQ3lHLHlCQUF5QixHQUFHLElBQUksQ0FBQ0MsOENBQThDLENBQUMsQ0FBQztNQUV0RixJQUFJLElBQUksQ0FBQ0MsV0FBVyxDQUFDQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUlqUixXQUFXLENBQUNrUixlQUFlLEVBQUU7UUFDM0UsTUFBTXJSLEtBQUssR0FBRyxJQUFJLENBQUMvQyxPQUFPLENBQUMsQ0FBQztRQUM1QixNQUFNcVUsYUFBYSxHQUFJdFIsS0FBSyxDQUFDcU4sU0FBUyxDQUFDLENBQUMsQ0FBd0NrRSxVQUFVLENBQUNsRSxTQUFTLENBQUMsQ0FBQztRQUN0RyxJQUFJaUUsYUFBYSxFQUFFO1VBQ2xCLElBQUksQ0FBQ0gsV0FBVyxDQUFDSyxlQUFlLENBQUMsQ0FBQztVQUNqQ0YsYUFBYSxDQUE4Q0QsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hGO01BQ0Q7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQTdILE1BQUEsQ0FLQXdILHVDQUF1QyxHQUF2QyxTQUFBQSx1Q0FBdUNBLENBQ3RDUyxnQkFBa0MsRUFDaUM7TUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQzFHLHVDQUF1QyxDQUFDLENBQUMsRUFBRTtRQUNwRDBHLGdCQUFnQixDQUFDQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU1DLGVBR0wsR0FBRztVQUFFQyxFQUFFLEVBQUUsRUFBRTtVQUFFQyxNQUFNLEVBQUU7UUFBRyxDQUFDO1FBQzFCLElBQUksQ0FBQzFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFFbkUsVUFBVSxJQUFLO1VBQ2pELElBQUlBLFVBQVUsQ0FBQ3pHLEdBQUcsQ0FBYSwyQ0FBMkMsQ0FBQyxFQUFFO1lBQzVFbVIsZUFBZSxDQUFDQyxFQUFFLENBQUNwQyxJQUFJLENBQUN2SSxVQUFVLENBQUM7VUFDcEMsQ0FBQyxNQUFNO1lBQ04wSyxlQUFlLENBQUNFLE1BQU0sQ0FBQ3JDLElBQUksQ0FBQ3ZJLFVBQVUsQ0FBQztVQUN4QztRQUNELENBQUMsQ0FBQztRQUNGMEssZUFBZSxDQUFDQyxFQUFFLENBQUN4RyxPQUFPLENBQUVuRSxVQUFVLElBQUtBLFVBQVUsQ0FBQzZLLDRCQUE0QixDQUFDLENBQUMsQ0FBQztRQUNyRixPQUFPSCxlQUFlO01BQ3ZCO01BQ0EsT0FBT3ZVLFNBQVM7SUFDakI7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBb00sTUFBQSxDQUlBdUIsdUNBQXVDLEdBQXZDLFNBQUFBLHVDQUF1Q0EsQ0FBQSxFQUFZO01BQ2xELE9BQU8sSUFBSSxDQUFDTiwyQkFBMkIsQ0FBQyxDQUFDLENBQUNwSCxJQUFJLENBQUMsc0NBQXNDLENBQUMsS0FBSyxNQUFNO0lBQ2xHLENBQUM7SUFBQW1HLE1BQUEsQ0FFT3VJLHFCQUFxQixHQUE3QixTQUFRQSxxQkFBcUJBLENBQUEsRUFBMkI7TUFDdkQsTUFBTUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDdkgsMkJBQTJCLENBQUMsQ0FBQyxDQUFDd0gsc0JBQXNCLENBQUMsQ0FBQztNQUN0RixPQUFPRCxrQkFBa0IsR0FBR0UsVUFBVSxDQUFDQyxTQUFTLENBQUNILGtCQUFrQixDQUFDLEdBQUc1VSxTQUFTO0lBQ2pGOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUFvTSxNQUFBLENBTVE0SSx3QkFBd0IsR0FBaEMsU0FBUUEsd0JBQXdCQSxDQUFDQyxVQUE0QixFQUEwQjtNQUN0RjtNQUNBLE1BQU1DLE1BQU0sR0FBR0QsVUFBVSxDQUFDRSxTQUFTLENBQUMsQ0FBQztNQUNyQyxNQUFNQyxtQkFBbUIsR0FBR0YsTUFBTSxHQUMvQixJQUFJLENBQUNoUyxtQ0FBbUMsQ0FBQ2dTLE1BQU0sRUFBOEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQ3JGbFYsU0FBUztNQUNaLElBQUlvVixtQkFBbUIsRUFBRTtRQUN4QixPQUFPQSxtQkFBbUI7TUFDM0I7TUFDQTtNQUNBLElBQUlDLHFCQUFxQjtNQUN6QixNQUFNQyxPQUFPLEdBQUdMLFVBQVUsQ0FBQ00sY0FBYyxDQUFDLENBQUMsSUFBS04sVUFBVSxDQUFDTSxjQUFjLENBQUMsQ0FBQyxDQUFrQ0MsVUFBVSxDQUFDLENBQUM7TUFDekgsSUFBSUYsT0FBTyxFQUFFaFUsTUFBTSxFQUFFO1FBQ3BCK1QscUJBQXFCLEdBQUdDLE9BQU8sQ0FBQy9QLElBQUksQ0FBQyxVQUFVNEQsTUFBZSxFQUFFO1VBQy9EO1VBQ0E7VUFDQTtVQUNBLElBQUlBLE1BQU0sQ0FBQy9GLEdBQUcsQ0FBc0Isc0NBQXNDLENBQUMsRUFBRTtZQUM1RSxPQUFPK0YsTUFBTSxDQUFDc00sVUFBVSxDQUFDLENBQUMsRUFBRTNJLFVBQVUsQ0FBQyxDQUFDLElBQUksS0FBSztVQUNsRCxDQUFDLE1BQU0sSUFDTjNELE1BQU0sQ0FBQy9GLEdBQUcsQ0FBVyxxQkFBcUIsQ0FBQyxJQUMzQytGLE1BQU0sQ0FBQy9GLEdBQUcsQ0FBaUIsaUNBQWlDLENBQUMsSUFDN0QrRixNQUFNLENBQUMvRixHQUFHLENBQXFCLDJEQUEyRCxDQUFDLEVBQzFGO1lBQ0Q7WUFDQTtZQUNBLE9BQU8rRixNQUFNLENBQUMyRCxVQUFVLENBQUMsQ0FBQztVQUMzQixDQUFDLE1BQU0sSUFBSSxDQUFDM0QsTUFBTSxDQUFDL0YsR0FBRyxDQUFnQiwyQkFBMkIsQ0FBQyxJQUFJLENBQUMrRixNQUFNLENBQUMvRixHQUFHLENBQWdCLHFCQUFxQixDQUFDLEVBQUU7WUFDeEgsT0FBTytGLE1BQU0sQ0FBQzJELFVBQVUsQ0FBQyxDQUFDLElBQUszRCxNQUFNLENBQVloRyxVQUFVLENBQUMsQ0FBQztVQUM5RDtRQUNELENBQUMsQ0FBQztNQUNIO01BQ0EsT0FBT2tTLHFCQUFxQjtJQUM3Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUFqSixNQUFBLENBSUF1SCxzQkFBc0IsR0FBdEIsU0FBQUEsc0JBQXNCQSxDQUE2QnNCLFVBQTRCLEVBQVE7TUFDdEYsTUFBTVMsU0FBUyxHQUFHVCxVQUFVLENBQUN6RCxXQUFXLENBQUMsQ0FBQztNQUMxQyxNQUFNbUUsY0FBYyxHQUFHVixVQUFVLENBQUMzRCxnQkFBZ0IsQ0FBQyxDQUFDO01BQ3BELElBQUlzRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDZixNQUFNekssYUFBYSxHQUFHbkgsV0FBVyxDQUFDQyxhQUFhLENBQUMsSUFBSSxDQUFDcEUsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUMvRCxNQUFNZ1csZUFBZSxHQUFHLElBQUksQ0FBQ2hXLE9BQU8sQ0FBQyxDQUFDLENBQUMyRCxXQUFXLENBQUMsQ0FBQyxDQUFDOFAscUJBQXFCO01BQzFFLE1BQU13QyxzQkFBc0IsR0FBRyxJQUFJLENBQUNDLG9DQUFvQyxDQUFDLENBQUM7TUFDMUUsS0FBSyxJQUFJQyxRQUFRLEdBQUcsQ0FBQyxFQUFFQSxRQUFRLEdBQUdOLFNBQVMsQ0FBQ3BVLE1BQU0sRUFBRTBVLFFBQVEsRUFBRSxFQUFFO1FBQy9ELE1BQU1DLFFBQVEsR0FBR1AsU0FBUyxDQUFDTSxRQUFRLENBQUM7UUFDcEMsTUFBTUUsWUFBWSxHQUFHRCxRQUFRLENBQUN2RSxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLElBQUl5RSxXQUFXLEdBQUcsQ0FBQyxFQUFFQSxXQUFXLEdBQUdELFlBQVksQ0FBQzVVLE1BQU0sRUFBRTZVLFdBQVcsRUFBRSxFQUFFUCxLQUFLLEVBQUUsRUFBRTtVQUNwRjtVQUNBLE1BQU1RLFdBQVcsR0FBR0YsWUFBWSxDQUFDQyxXQUFXLENBQUM7VUFDN0MsTUFBTUUsOEJBQThCLEdBQ2xDLElBQUksQ0FBQzFJLHVDQUF1QyxDQUFDLENBQUMsS0FDN0NpSSxLQUFLLEdBQUcsQ0FBQyxJQUFLRCxjQUFjLEtBQUtLLFFBQVEsR0FBRyxDQUFDLElBQUtBLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQ0gsZUFBZSxJQUFJLENBQUMxSyxhQUFjLENBQUUsQ0FBQyxJQUMzRyxDQUFDLElBQUksQ0FBQ3dDLHVDQUF1QyxDQUFDLENBQUMsS0FDN0MsQ0FBQ2dJLGNBQWMsS0FBS0MsS0FBSyxHQUFHLENBQUMsSUFBSVEsV0FBVyxDQUFDeEQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1VBQUs7VUFDeEUsQ0FBQytDLGNBQWMsSUFBSSxDQUFDRyxzQkFBc0IsSUFBSUYsS0FBSyxHQUFHLENBQUU7VUFBSTtVQUM1REQsY0FBYyxLQUFLSyxRQUFRLEdBQUcsQ0FBQyxJQUFLQSxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUNILGVBQWUsSUFBSSxDQUFDMUssYUFBYyxDQUFFLENBQUU7VUFDakcsSUFBSWtMLDhCQUE4QixFQUFFO1lBQ25DO1lBQ0FELFdBQVcsQ0FBQ3BELGlCQUFpQixDQUFDaFQsU0FBUyxDQUFDO1lBQ3hDLE1BQU0yUCxNQUFNLEdBQUd5RyxXQUFXLENBQUN4RyxTQUFTLENBQUMsQ0FBQztZQUN0QztZQUNBRCxNQUFNLENBQUMzQixPQUFPLENBQUV1QyxLQUFLLElBQUs7Y0FDekIsSUFBSUEsS0FBSyxDQUFDbk4sR0FBRyxDQUFrQixzREFBc0QsQ0FBQyxFQUFFO2dCQUN2Rm1OLEtBQUssQ0FBQzlMLE9BQU8sQ0FBQ3VPLGlCQUFpQixHQUFHLElBQUksQ0FBQztjQUN4QyxDQUFDLE1BQU07Z0JBQ056QyxLQUFLLENBQUN5QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Y0FDOUI7WUFDRCxDQUFDLENBQUM7WUFDRm9ELFdBQVcsQ0FBQ3ZHLGFBQWEsQ0FBQyxDQUFDLENBQUM3QixPQUFPLENBQUVzSSxRQUFRLElBQUtBLFFBQVEsQ0FBQ3RELGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25Gb0QsV0FBVyxDQUFDWixVQUFVLENBQUMsQ0FBQyxDQUFDeEgsT0FBTyxDQUFFc0gsT0FBTyxJQUFLQSxPQUFPLENBQUN0QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztVQUMvRTtRQUNEO01BQ0Q7SUFDRCxDQUFDO0lBQUE1RyxNQUFBLENBRURtSywwQ0FBMEMsR0FBMUMsU0FBQUEsMENBQTBDQSxDQUFDTCxZQUFvQyxFQUF5QjtNQUN2RyxJQUFJQSxZQUFZLENBQUM1VSxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU90QixTQUFTO01BQy9DLEtBQUssTUFBTTZKLFVBQVUsSUFBSXFNLFlBQVksRUFBRTtRQUN0QyxNQUFNTSxPQUFPLEdBQUczTSxVQUFVLENBQUMrRixTQUFTLENBQUMsQ0FBdUI7UUFFNUQsSUFBSTRHLE9BQU8sRUFBRTtVQUNaLEtBQUssTUFBTUMsWUFBWSxJQUFJRCxPQUFPLEVBQUU7WUFDbkMsSUFBSUMsWUFBWSxDQUFDL08saUJBQWlCLEdBQUcsQ0FBQyxFQUFFO2NBQ3ZDLElBQUlnUCxlQUFlO2NBRW5CLElBQUlELFlBQVksQ0FBQ3JULEdBQUcsQ0FBTyx5QkFBeUIsQ0FBQyxFQUFFO2dCQUN0RHNULGVBQWUsR0FBR0QsWUFBWSxDQUFDRSxpQkFBaUIsQ0FBQyxDQUFDO2NBQ25ELENBQUMsTUFBTSxJQUFJRixZQUFZLENBQUNoQixVQUFVLElBQUlnQixZQUFZLENBQUNoQixVQUFVLENBQUMsQ0FBQyxFQUFFclMsR0FBRyxDQUFPLHlCQUF5QixDQUFDLEVBQUU7Z0JBQ3RHc1QsZUFBZSxHQUFJRCxZQUFZLENBQUNoQixVQUFVLENBQUMsQ0FBQyxDQUFVa0IsaUJBQWlCLENBQUMsQ0FBQztjQUMxRSxDQUFDLE1BQU0sSUFBSUYsWUFBWSxFQUFFaEIsVUFBVSxHQUFHLENBQUMsRUFBRXJTLEdBQUcsQ0FBVSw0QkFBNEIsQ0FBQyxFQUFFO2dCQUNwRnNULGVBQWUsR0FBS0QsWUFBWSxDQUFDaEIsVUFBVSxDQUFDLENBQUMsQ0FBYUEsVUFBVSxDQUFDLENBQUMsQ0FBVWtCLGlCQUFpQixDQUFDLENBQUM7Y0FDcEc7Y0FDQSxJQUFJRCxlQUFlLEVBQUU7Z0JBQ3BCLEtBQUssTUFBTUUsYUFBYSxJQUFJRixlQUFlLEVBQUU7a0JBQzVDLE1BQU1HLGFBQWEsR0FBR0QsYUFBYSxDQUFDRSxlQUFlLENBQUMsQ0FBQztrQkFDckQsSUFBSUQsYUFBYSxFQUFFO29CQUNsQixLQUFLLE1BQU1FLFdBQVcsSUFBSUYsYUFBYSxFQUFFO3NCQUN4QyxNQUFNRyxPQUFPLEdBQUdELFdBQVcsQ0FBQ0UsU0FBUyxDQUFDLENBQWdCO3NCQUN0RCxNQUFNQyxVQUFVLEdBQUcsSUFBSSxDQUFDQywwQkFBMEIsQ0FBQ0gsT0FBTyxDQUFDO3NCQUMzRCxJQUFJRSxVQUFVLEVBQUUsT0FBT0EsVUFBVTtvQkFDbEM7a0JBQ0Q7Z0JBQ0Q7Y0FDRDtZQUNEO1VBQ0Q7UUFDRDtNQUNEO01BRUEsT0FBT2xYLFNBQVM7SUFDakI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUFvTSxNQUFBLENBS0ErSywwQkFBMEIsR0FBMUIsU0FBQUEsMEJBQTBCQSxDQUFDQyxNQUFtQixFQUF5QjtNQUN0RSxJQUFJLENBQUNBLE1BQU0sSUFBSUEsTUFBTSxDQUFDOVYsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUVwQyxJQUFJLENBQUM4VixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNDLFdBQVcsR0FBRyxDQUFDLEVBQUU7TUFFaEMsSUFBSUMsT0FBTyxHQUFHLEtBQUs7TUFFbkIsSUFBSTtRQUNILElBQUlGLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ2hVLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFO1VBQ25ELE1BQU1xSyxLQUFLLEdBQUkySixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQXFDRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDO1VBQzVGRixPQUFPLEdBQUc3SixLQUFLLENBQUNuTSxNQUFNLEtBQUssQ0FBQztRQUM3QixDQUFDLE1BQU07VUFDTixNQUFNbVcsS0FBSyxHQUFJTCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQWVuTyxRQUFRLENBQUMsQ0FBQztVQUNqRHFPLE9BQU8sR0FBRyxDQUFDRyxLQUFLO1FBQ2pCO01BQ0QsQ0FBQyxDQUFDLE9BQU9sUixLQUFLLEVBQUU7UUFDZkQsR0FBRyxDQUFDb1IsS0FBSyxDQUFDLHlDQUF5Q25SLEtBQUssRUFBRSxDQUFDO01BQzVEO01BRUEsT0FBTytRLE9BQU8sR0FBR0YsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHcFgsU0FBUztJQUN2Qzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQW9NLE1BQUEsQ0FLQS9CLHNCQUFzQixHQUF0QixTQUFBQSxzQkFBc0JBLENBQUM2TCxZQUFvQyxFQUFtQztNQUFBLElBQWpDeUIsaUJBQWlCLEdBQUF0VyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBckIsU0FBQSxHQUFBcUIsU0FBQSxNQUFHLEtBQUs7TUFDckZtSixVQUFVLENBQ1QsWUFBNEM7UUFDM0M7UUFDQSxNQUFNNEMsV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQztRQUN0RCxNQUFNdUssZUFBZSxHQUFHLElBQUksQ0FBQ3JCLDBDQUEwQyxDQUFDTCxZQUFZLENBQUM7UUFDckYsSUFBSTJCLGFBQXFDO1FBQ3pDLElBQUlELGVBQWUsRUFBRTtVQUNwQixJQUFJQSxlQUFlLENBQUN4VSxHQUFHLENBQUMsK0JBQStCLENBQUMsRUFBRTtZQUN6RHlVLGFBQWEsR0FBSUQsZUFBZSxDQUFxQ0wsa0JBQWtCLENBQUMsQ0FBQztVQUMxRixDQUFDLE1BQU07WUFDTk0sYUFBYSxHQUNaRCxlQUFlLENBQ2RuVCxPQUFPLENBQUNxVCxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM5QjtRQUNELENBQUMsTUFBTTtVQUNORCxhQUFhLEdBQUcsSUFBSSxDQUFDbEQscUJBQXFCLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ0ssd0JBQXdCLENBQUM1SCxXQUFXLENBQUM7UUFDM0Y7UUFDQSxJQUFJeUssYUFBYSxFQUFFO1VBQ2xCLE1BQU1FLFNBQVMsR0FBR0YsYUFBYSxDQUFDRyxZQUFZLENBQUMsQ0FBMkI7VUFDeEVELFNBQVMsQ0FBQ0UsVUFBVSxHQUFHO1lBQUVDLE1BQU0sRUFBRTtVQUFLLENBQUM7VUFDdkMsSUFBSUwsYUFBYSxDQUFDelUsR0FBRyxDQUFDLDZCQUE2QixDQUFDLEVBQUU7WUFDckR5VSxhQUFhLEdBQUdBLGFBQWEsQ0FBQzVILFNBQVMsQ0FBQyxDQUEyQjtVQUNwRTtVQUVBLElBQ0M0SCxhQUFhLEVBQUV6VSxHQUFHLENBQWMsbUJBQW1CLENBQUMsSUFDcER5VSxhQUFhLENBQUNNLG9CQUFvQixDQUFDLENBQUMsSUFDcEMsQ0FBQ04sYUFBYSxDQUFDTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFDMUM7WUFDRDtZQUNBO1lBQ0FQLGFBQWEsQ0FBQ1Esb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ3pDUixhQUFhLENBQUNTLEtBQUssQ0FBQ1AsU0FBUyxDQUFDO1lBQzlCRixhQUFhLENBQUNRLG9CQUFvQixDQUFDLElBQUksQ0FBQztVQUN6QyxDQUFDLE1BQU07WUFDTlIsYUFBYSxFQUFFUyxLQUFLLENBQUNQLFNBQVMsQ0FBQztVQUNoQztRQUNEO01BQ0QsQ0FBQyxDQUFDakssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUNaNkosaUJBQWlCLEdBQUcsR0FBRyxHQUFHLENBQzNCLENBQUM7SUFDRjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBLE9BSkM7SUFBQXZMLE1BQUEsQ0FLQTJKLG9DQUFvQyxHQUFwQyxTQUFBQSxvQ0FBb0NBLENBQUEsRUFBd0I7TUFDM0QsTUFBTXdDLGNBQWMsR0FBRyxJQUFJLENBQUN4SyxrQkFBa0IsQ0FBQyxDQUFDO01BQ2hELE1BQU15SyxZQUFZLEdBQUcsSUFBSSxDQUFDM1ksT0FBTyxDQUFDLENBQUMsQ0FBQytILFFBQVEsQ0FBQyxDQUFDO01BQzlDLE9BQU8yUSxjQUFjLENBQ25CaFQsSUFBSSxDQUNIc0UsVUFBVSxJQUNUQSxVQUFVLENBQUMrSSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQzlCNkYsV0FBVyxHQUFHLENBQUMsQ0FDaEI5RixJQUFJLENBQUUrRixPQUFPLElBQUtBLE9BQU8sQ0FBQzlRLFFBQVEsQ0FBQyxDQUFDLEtBQUs0USxZQUFZLENBQ3pELENBQUMsRUFDQzVGLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUF4RyxNQUFBLENBS0EwSCw4Q0FBOEMsR0FBOUMsU0FBQUEsOENBQThDQSxDQUFBLEVBQXVCO01BQ3BFLE9BQU8sSUFBSSxDQUFDL0Ysa0JBQWtCLENBQUMsQ0FBQyxDQUM5QmxDLE1BQU0sQ0FDTGhDLFVBQVUsSUFBS0EsVUFBVSxDQUFDekcsR0FBRyxDQUFhLDJDQUEyQyxDQUFDLElBQUl5RyxVQUFVLENBQUMrSSxVQUFVLENBQUMsU0FBUyxDQUMzSCxDQUFDLENBQUM7TUFBQSxDQUNEdkssR0FBRyxDQUFDLE1BQU93QixVQUFVLElBQUs7UUFDMUIsT0FBTyxJQUFJOE8sT0FBTyxDQUFFQyxPQUFPLElBQUsvTyxVQUFVLENBQUMzRCxlQUFlLENBQUMsbUJBQW1CLEVBQUUwUyxPQUFPLENBQUMsQ0FBQztNQUMxRixDQUFDLENBQUM7SUFDSixDQUFDO0lBQUF4TSxNQUFBLENBRUR5QixnQ0FBZ0MsR0FBaEMsU0FBQUEsZ0NBQWdDQSxDQUFDbEUsTUFBc0QsRUFBUTtNQUM5RixNQUFNeU0sV0FBVyxHQUFHek0sTUFBTSxDQUFDRyxZQUFZLENBQUMsWUFBWSxDQUFDO01BQ3JELElBQUlzTSxXQUFXLENBQUNoVCxHQUFHLENBQWEsMkNBQTJDLENBQUMsRUFBRTtRQUM3RWdULFdBQVcsQ0FBQ3lDLHVCQUF1QixDQUFDLElBQUksQ0FBQ2haLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDcEQ7TUFDQSxNQUFNOFAsTUFBTSxHQUFHeUcsV0FBVyxDQUFDeEcsU0FBUyxDQUFDLENBQUM7TUFDdENELE1BQU0sQ0FBQzNCLE9BQU8sQ0FBRXVDLEtBQUssSUFBSztRQUN6QixJQUFJQSxLQUFLLENBQUNuTixHQUFHLENBQWtCLHNEQUFzRCxDQUFDLEVBQUU7VUFDdkZtTixLQUFLLENBQUM5TCxPQUFPLENBQUN1TyxpQkFBaUIsR0FBR2hULFNBQVMsQ0FBQztRQUM3QyxDQUFDLE1BQU07VUFDTnVRLEtBQUssQ0FBQ3lDLGlCQUFpQixDQUFDaFQsU0FBUyxDQUFDO1FBQ25DO01BQ0QsQ0FBQyxDQUFDO01BQ0ZvVyxXQUFXLENBQUN2RyxhQUFhLENBQUMsQ0FBQyxDQUFDN0IsT0FBTyxDQUFFc0ksUUFBUSxJQUFLQSxRQUFRLENBQUN0RCxpQkFBaUIsQ0FBQ2hULFNBQVMsQ0FBQyxDQUFDO01BQ3hGb1csV0FBVyxDQUFDWixVQUFVLENBQUMsQ0FBQyxDQUFDeEgsT0FBTyxDQUFFc0gsT0FBTyxJQUFLQSxPQUFPLENBQUN0QyxpQkFBaUIsQ0FBQ2hULFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFBQW9NLE1BQUEsQ0FFRDBNLHdCQUF3QixHQUF4QixTQUFBQSx3QkFBd0JBLENBQUNqVyxRQUF3QixFQUFRO01BQ3hELElBQUksQ0FBQ2tXLGNBQWMsQ0FBQ0Msd0JBQXdCLENBQUMsQ0FBQzs7TUFFOUM7TUFDQSxNQUFNQyxPQUFPLEdBQUdBLENBQUEsS0FBWTtRQUMzQjtRQUNBLE1BQU1DLFNBQVMsR0FBSUMsTUFBTSxDQUE4Q0MsVUFBVSxFQUFFRixTQUFTO1FBQzVGLElBQUlBLFNBQVMsS0FBSyxJQUFJLEVBQUU7VUFDdkJHLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUM7UUFDZixDQUFDLE1BQU0sSUFBSUosU0FBUyxLQUFLLEtBQUssRUFBRTtVQUMvQixJQUFJLENBQUNLLFFBQVEsQ0FBQ0MsdUJBQXVCLENBQUMzVyxRQUFRLENBQUM7UUFDaEQsQ0FBQyxNQUFNO1VBQ047VUFDQSxNQUFNNFcsVUFBVSxHQUFHQyxRQUFRLENBQUNDLEdBQUc7VUFDL0JOLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUM7VUFDZDtVQUNBO1VBQ0E5TyxVQUFVLENBQUMsTUFBTTtZQUNoQixJQUFJa1AsUUFBUSxDQUFDQyxHQUFHLEtBQUtGLFVBQVUsRUFBRTtjQUNoQyxJQUFJLENBQUNGLFFBQVEsQ0FBQ0MsdUJBQXVCLENBQUMzVyxRQUFRLENBQUM7WUFDaEQ7VUFDRCxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQ1I7TUFDRCxDQUFDO01BRUQsSUFBSSxJQUFJLENBQUNvTSxlQUFlLENBQUMsQ0FBQyxDQUFDMkssY0FBYyxDQUFDLENBQUMsQ0FBQ0MseUJBQXlCLENBQUMsQ0FBQyxFQUFFO1FBQ3hFO1FBQ0FSLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUM7TUFDZixDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQ3paLE9BQU8sQ0FBQyxDQUFDLENBQUM2SCxpQkFBaUIsQ0FBQyxDQUFDLEVBQUU7UUFDL0M7UUFDQSxJQUFJLENBQUN1SCxlQUFlLENBQUMsQ0FBQyxDQUNwQjZLLGdCQUFnQixDQUFDLENBQUMsQ0FDbEJDLGlCQUFpQixDQUFDL1osU0FBUyxDQUFDLENBQzVCNkcsSUFBSSxDQUFDb1MsT0FBTyxDQUFDLENBQ2JqUyxLQUFLLENBQUVYLENBQUMsSUFBSztVQUNiQyxHQUFHLENBQUMwVCxPQUFPLENBQUMscUNBQXFDLEVBQUUzVCxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO01BQ0osQ0FBQyxNQUFNO1FBQ04sTUFBTTRULGtCQUFrQixHQUFJLElBQUksQ0FBQ2hMLGVBQWUsQ0FBQyxDQUFDLEVBQUVpTCwwQkFBMEIsQ0FBQyxDQUFDLEVBQUVDLGVBQWUsQ0FBQyxDQUFDLEVBQUVDLFdBQVcsRUFDN0dDLE9BQU87UUFDVkMsS0FBSyxDQUFDQyx5Q0FBeUMsQ0FDOUN0QixPQUFPLEVBQ1B1QixRQUFRLENBQUNuTyxTQUFTLEVBQ2xCeEosUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLEVBQ0p5WCxLQUFLLENBQUNHLGNBQWMsQ0FBQ0MsY0FBYyxFQUNuQzFhLFNBQVMsRUFDVGlhLGtCQUFrQixHQUFHLElBQUksR0FBR2phLFNBQzdCLENBQUM7TUFDRjtJQUNEOztJQUVBO0lBQUE7SUFBQW9NLE1BQUEsQ0FDQXVPLGVBQWUsR0FBZixTQUFBQSxlQUFlQSxDQUFDQyxtQkFBK0MsRUFBRTdYLFdBQXNDLEVBQVE7TUFDOUcsTUFBTW1JLElBQUksR0FBRyxJQUFJLENBQUNyTCxPQUFPLENBQUMsQ0FBQztNQUMzQixNQUFNNEQsU0FBUyxHQUFHeUgsSUFBSSxFQUFFMUgsV0FBVyxDQUFDLENBQUMsRUFBRUMsU0FBUztNQUNoRCxNQUFNMkosV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQztNQUN0RCxNQUFNMEUsT0FBTyxHQUFHLElBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQUM7TUFDbEMsSUFBSSxDQUFDTSxnQkFBZ0IsQ0FBQ0MsY0FBYyxFQUFFRCxnQkFBZ0IsQ0FBQ3VJLFFBQVEsQ0FBQyxDQUFDQyxRQUFRLENBQUMvWCxXQUFXLEVBQUVzUCxNQUEwQixDQUFDLEVBQUU7UUFDbkgsSUFBSSxDQUFDMU4sUUFBUSxDQUFDb1csdUJBQXVCLENBQUNILG1CQUFtQixDQUFDO01BQzNEO01BRUEsSUFBSSxDQUFDSSxXQUFXLENBQUNDLHdCQUF3QixDQUFDLENBQUM7O01BRTNDO01BQ0E7TUFDQSxNQUFNQyxjQUFjLEdBQUc5TixXQUFXLENBQUMxRixpQkFBaUIsQ0FBQyxDQUFtQjtNQUV4RSxJQUFJeVQsV0FBeUIsR0FBRyxFQUFFO01BQ2xDL04sV0FBVyxDQUFDb0UsV0FBVyxDQUFDLENBQUMsQ0FBQ3hELE9BQU8sQ0FBQyxVQUFVaUksUUFBMkIsRUFBRTtRQUN4RUEsUUFBUSxDQUFDdkUsY0FBYyxDQUFDLENBQUMsQ0FBQzFELE9BQU8sQ0FBQyxVQUFVb0ksV0FBaUMsRUFBRTtVQUM5RStFLFdBQVcsR0FBR25YLFdBQVcsQ0FBQ29YLGFBQWEsQ0FBQ2hGLFdBQVcsRUFBRStFLFdBQVcsQ0FBQztRQUNsRSxDQUFDLENBQUM7TUFDSCxDQUFDLENBQUM7O01BRUY7TUFDQTtNQUNBO01BQ0E7TUFDQTs7TUFFQXBKLE9BQU8sQ0FBQy9ELE9BQU8sQ0FBQyxVQUFVcUIsTUFBYSxFQUFFO1FBQ3hDLE1BQU1uRixxQkFBcUIsR0FBR21GLE1BQU0sQ0FBQzNILGlCQUFpQixDQUFDLFVBQVUsQ0FBQztRQUNsRSxJQUFJd0MscUJBQXFCLEVBQUU7VUFDMUJBLHFCQUFxQixDQUFDYyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDakVkLHFCQUFxQixDQUFDYyxXQUFXLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFFbEVtUSxXQUFXLEdBQUduWCxXQUFXLENBQUNvWCxhQUFhLENBQUMvTCxNQUFNLEVBQUU4TCxXQUFXLENBQUM7O1VBRTVEO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsTUFBTUUsZ0JBQWdCLEdBQUdoTSxNQUFNLENBQUNDLGFBQWEsQ0FBQyxDQUFDO1VBQy9DLElBQUkrTCxnQkFBZ0IsRUFBRTtZQUNyQixJQUFJQyxXQUFXLENBQUNDLHdCQUF3QixDQUFDRixnQkFBZ0IsQ0FBQ3pULFFBQVEsQ0FBQyxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtjQUNyRjtjQUNDd1QsZ0JBQWdCLENBQXNERyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDbkc7VUFDRDtVQUNBOztVQUVBO1VBQ0E7VUFDQSxNQUFNbFgsUUFBUSxHQUFHK0ssTUFBTSxDQUFDWSxTQUFTLENBQUMsQ0FBYTtVQUMvQyxNQUFNd0wsNEJBQTRCLEdBQUduWCxRQUFRLEdBQUdnRCxJQUFJLENBQUNDLEtBQUssQ0FBQ2pELFFBQVEsQ0FBQ29YLGVBQWUsQ0FBQ0MscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7VUFFL0dDLGFBQWEsQ0FBQ0MsbUJBQW1CLENBQUMzUixxQkFBcUIsRUFBRXVSLDRCQUE0QixFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7VUFFbkdwTSxNQUFNLENBQUN5TSxjQUFjLENBQUMsQ0FBQztRQUN4QjtNQUNELENBQUMsQ0FBQztNQUNGO01BQ0EsTUFBTUMsZ0JBQWdCLEdBQUczTyxXQUFXLENBQUNtSSxjQUFjLENBQUMsQ0FBaUM7TUFDckYsSUFBSXlHLGlCQUErQixHQUFHLEVBQUU7TUFDeENBLGlCQUFpQixHQUFHaFksV0FBVyxDQUFDb1gsYUFBYSxDQUFDVyxnQkFBZ0IsRUFBRUMsaUJBQWlCLENBQUM7TUFDbEZiLFdBQVcsR0FBR0EsV0FBVyxDQUFDYyxNQUFNLENBQUNELGlCQUFpQixDQUFDO01BQ25EaFksV0FBVyxDQUFDa1ksc0NBQXNDLENBQUNmLFdBQVcsRUFBRSxJQUFJLENBQUN0YixPQUFPLENBQUMsQ0FBQyxDQUFDO01BRS9FLElBQUlzYyxNQUFrQjtRQUNyQkMsYUFBK0IsR0FBR3pELE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUM7O01BRXBEO01BQ0E7QUFDRjtBQUNBO01BQ0UsTUFBTXlELHdCQUF3QixHQUFJaE4sTUFBYSxJQUFXO1FBQ3pELE1BQU1pTixRQUFRLEdBQUcsSUFBSSxDQUFDeFgsZ0JBQWdCLENBQUN1SyxNQUFNLENBQUM7VUFDN0NrTix3QkFBd0IsR0FBRyxTQUFBQSxDQUFBLEVBQWtCO1lBQzVDQyxXQUFXLENBQUNDLHFCQUFxQixDQUNoQ3BOLE1BQU0sQ0FBQzBELGNBQWMsQ0FBQyxDQUFDLEVBQ3ZCdUosUUFBUSxDQUFDdlUsT0FBTyxDQUFDLENBQUMsRUFDbEJ1VSxRQUFRLENBQUNJLFVBQVUsQ0FBQyxDQUFDLEVBQ3JCUCxNQUFNLEVBQ05DLGFBQ0QsQ0FBQztVQUNGLENBQUM7UUFFRixJQUFJLENBQUNFLFFBQVEsRUFBRTtVQUNkaFcsR0FBRyxDQUFDQyxLQUFLLENBQUMsdUNBQXVDOEksTUFBTSxDQUFDbkssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1VBQ2xFO1FBQ0Q7UUFFQSxJQUFJb1gsUUFBUSxDQUFDSSxVQUFVLENBQUMsQ0FBQyxFQUFFO1VBQzFCSCx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNCLENBQUMsTUFBTTtVQUNOLE1BQU1JLGNBQWMsR0FBRyxTQUFBQSxDQUFBLEVBQWtCO1lBQ3hDLElBQUlMLFFBQVEsQ0FBQ0ksVUFBVSxDQUFDLENBQUMsRUFBRTtjQUMxQkgsd0JBQXdCLENBQUMsQ0FBQztjQUMxQkQsUUFBUSxDQUFDdE4sWUFBWSxDQUFDMk4sY0FBYyxDQUFDO1lBQ3RDO1VBQ0QsQ0FBQztVQUNETCxRQUFRLENBQUNsTyxZQUFZLENBQUN1TyxjQUFjLENBQUM7UUFDdEM7TUFDRCxDQUFDO01BRUQsSUFBSXpCLGNBQWMsRUFBRTtRQUNuQmlCLE1BQU0sR0FBR2pCLGNBQWMsQ0FBQ3RULFFBQVEsQ0FBQyxDQUFDOztRQUVsQztRQUNBLE1BQU1nVixvQkFBb0IsR0FBRyxJQUFJLENBQUMvYyxPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLENBQUMsVUFBVSxDQUF5QjtRQUNqRyxJQUFJM0UsV0FBVyxFQUFFO1VBQ2hCNlosb0JBQW9CLEVBQUU1UixXQUFXLENBQUMsc0JBQXNCLEVBQUVqSSxXQUFXLENBQUM7UUFDdkU7O1FBRUE7UUFDQXFaLGFBQWEsR0FBRyxJQUFJLENBQUN6WCxRQUFRLENBQUNrWSx3QkFBd0IsQ0FBQzNCLGNBQWMsQ0FBQzs7UUFFdEU7UUFDQSxJQUFJLENBQUM0QixrQkFBa0IsQ0FBQyxDQUFDOztRQUV6QjtRQUNBLE1BQU1SLFFBQVEsR0FBSXBCLGNBQWMsQ0FBQ3RJLFVBQVUsSUFBSXNJLGNBQWMsQ0FBQ3RJLFVBQVUsQ0FBQyxDQUFDLElBQUtzSSxjQUFjOztRQUU3RjtRQUNBLElBQUksSUFBSSxDQUFDNkIsY0FBYyxLQUFLVCxRQUFRLEVBQUU7VUFDckNBLFFBQVEsQ0FBQzFPLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDakosUUFBUSxDQUFDcVksZUFBZSxFQUFFLElBQUksQ0FBQztVQUMxRSxJQUFJLENBQUNELGNBQWMsR0FBR1QsUUFBUTtRQUMvQjtRQUVBdkssT0FBTyxDQUFDL0QsT0FBTyxDQUFDLFVBQVVxQixNQUFhLEVBQVE7VUFDOUM7VUFDQTROLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDN04sTUFBTSxDQUFDLENBQzFCeEksSUFBSSxDQUFDd1Ysd0JBQXdCLENBQUMsQ0FDOUJyVixLQUFLLENBQUMsVUFBVW1XLE1BQWUsRUFBRTtZQUNqQzdXLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLCtDQUErQyxFQUFFNFcsTUFBZ0IsQ0FBQztVQUM3RSxDQUFDLENBQUM7UUFDSixDQUFDLENBQUM7O1FBRUY7UUFDQSxJQUFJLElBQUksQ0FBQ3hQLHVDQUF1QyxDQUFDLENBQUMsRUFBRTtVQUNsRFAsV0FBVyxDQUErRGdRLGdDQUFnQyxDQUFDLENBQUM7UUFDOUc7O1FBRUE7UUFDQXhCLGFBQWEsQ0FBQ3lCLHVDQUF1QyxDQUFDLElBQUksQ0FBQ3hkLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDeWQscUJBQXFCLENBQUMsRUFBRSxDQUFDO01BQy9CO01BQ0E7TUFDQTtNQUNBLElBQUk3WixTQUFTLElBQUlBLFNBQVMsS0FBSyxDQUFDLEVBQUU7UUFDakMyWSxhQUFhLEVBQUV2VixJQUFJLENBQUMsTUFBTTtVQUN6QixJQUFJLENBQUMwVyxlQUFlLENBQUNDLG9CQUFvQixDQUFDLENBQUM7VUFFM0M7UUFDRCxDQUFDLENBQUM7TUFDSDtNQUNBLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMxYSxXQUFXLEVBQUUyYSxvQkFBb0IsQ0FBQztNQUNuRSxJQUFJLENBQUNDLGlDQUFpQyxDQUFDLENBQUM7TUFFeEMsTUFBTUMsYUFBYSxHQUFHLElBQUksQ0FBQzNPLGVBQWUsQ0FBQyxDQUFDLENBQUM0TyxrQkFBa0IsQ0FBQyxDQUFDLENBQUNELGFBQWEsQ0FBQzFTLElBQUksQ0FBQztNQUNyRixJQUFJLENBQUM0UyxTQUFTLENBQUNDLE9BQU8sQ0FBQ0gsYUFBYSxDQUFDO01BRXJDLElBQUksQ0FBQ0ksc0NBQXNDLENBQzFDLElBQUksQ0FBQ3hPLFdBQVcsRUFDaEJwQyxXQUFXLEVBQ1h3USxhQUFhLEVBQ2IsSUFBSSxDQUFDOUwsMEJBQTBCLEtBQUssSUFBSSxDQUFDalMsT0FBTyxDQUFDLENBQUMsQ0FBQzZILGlCQUFpQixDQUFDLENBQUMsRUFBRUssT0FBTyxDQUFDLENBQ2pGLENBQUM7O01BRUQ7TUFDQSxNQUFNNkosc0JBQXNCLEdBQUcsSUFBSSxDQUFDQSxzQkFBc0I7TUFDMUQsSUFBSSxDQUFDQSxzQkFBc0IsR0FBRzVSLFNBQVM7TUFFdkMsSUFBSSxDQUFDaWUsc0NBQXNDLENBQUNMLGFBQWEsRUFBRXhRLFdBQVcsRUFBRXdFLHNCQUFzQixDQUFDO0lBQ2hHOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVJDO0lBQUF4RixNQUFBLENBU1E2UixzQ0FBc0MsR0FBOUMsU0FBUUEsc0NBQXNDQSxDQUM3Q0wsYUFBcUMsRUFDckN4USxXQUE2QixFQUM3QndFLHNCQUEwQyxFQUNuQztNQUNQZ00sYUFBYSxDQUNYL1csSUFBSSxDQUFDLFlBQVk7UUFDakIsTUFBTXFYLHdCQUF3QixHQUFHLElBQUksQ0FBQ2pQLGVBQWUsQ0FBQyxDQUFDLENBQUM0TyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUVNLDZCQUE2QixDQUFDLENBQUM7UUFDN0csTUFBTXRNLGVBQWUsR0FBR0Qsc0JBQXNCLElBQUlzTSx3QkFBd0I7UUFDMUUsSUFBSSxDQUFDck0sZUFBZSxFQUFFO1VBQ3JCO1FBQ0Q7O1FBRUE7UUFDQSxJQUFJO1VBQ0gsTUFBTThHLE9BQU8sQ0FBQ3lGLEdBQUcsQ0FBQyxJQUFJLENBQUN2Syx5QkFBeUIsQ0FBQztRQUNsRCxDQUFDLENBQUMsTUFBTTtVQUNQO1FBQUE7O1FBR0Q7UUFDQSxNQUFNLElBQUksQ0FBQ2lLLFNBQVMsQ0FBQ08sYUFBYSxDQUFDLENBQUM7O1FBRXBDO1FBQ0EsSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQ2xSLFdBQVcsRUFBRXlFLGVBQWUsQ0FBQztRQUMxRCxPQUFPLENBQUM7TUFDVCxDQUFDLENBQUMsQ0FDRDdLLEtBQUssQ0FBQyxNQUFNO1FBQ1o7TUFBQSxDQUNBLENBQUM7SUFDSjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBb0YsTUFBQSxDQU1Ra1MsdUJBQXVCLEdBQS9CLFNBQVFBLHVCQUF1QkEsQ0FBQ2xSLFdBQTZCLEVBQUV5RSxlQUF1QixFQUFRO01BQzdGO01BQ0EsTUFBTTBNLGFBQWEsR0FBRyxJQUFJLENBQUMxZSxPQUFPLENBQUMsQ0FBQyxDQUFDb08sSUFBSSxDQUFDNEQsZUFBZSxDQUFDO01BQzFELE1BQU0yTSxTQUFTLEdBQUdELGFBQWEsRUFBRW5iLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztNQUNsRSxNQUFNcWIsZUFBZSxHQUFHRCxTQUFTLEdBQUdELGFBQWEsRUFBRXJaLEtBQUssQ0FBQyxDQUFDLEdBQUlxWixhQUFhLEVBQUV0TyxTQUFTLENBQUMsQ0FBQyxFQUF3Qi9LLEtBQUssQ0FBQyxDQUFDOztNQUV2SDtNQUNBLE1BQU13WixnQkFBZ0IsR0FBR0EsQ0FBQSxLQUFZO1FBQ3BDLElBQUl0UixXQUFXLENBQUN1UixrQkFBa0IsQ0FBQyxDQUFDLEtBQUtGLGVBQWUsRUFBRTtVQUN6RCxPQUFPLENBQUM7UUFDVDtRQUNBLElBQUksQ0FBQ0csd0JBQXdCLENBQUMvTSxlQUFlLENBQUM7TUFDL0MsQ0FBQzs7TUFFRDtNQUNBNk0sZ0JBQWdCLENBQUMsQ0FBQzs7TUFFbEI7TUFDQSxJQUFJdFIsV0FBVyxDQUFDdVIsa0JBQWtCLENBQUMsQ0FBQyxLQUFLRixlQUFlLEVBQUU7UUFDekQsSUFBSSxDQUFDamMsdUJBQXVCLEdBQUcsSUFBSTtRQUNuQztNQUNEOztNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUNBLHVCQUF1QixFQUFFO1FBQ2pDO01BQ0Q7O01BRUE7TUFDQTtNQUNBcWMsdUJBQXVCLENBQUM7UUFDdkJGLGtCQUFrQixFQUFFQSxDQUFBLEtBQU12UixXQUFXLENBQUN1UixrQkFBa0IsQ0FBQyxDQUFDO1FBQzFERixlQUFlO1FBQ2ZLLGVBQWUsRUFBRUo7TUFDbEIsQ0FBQyxDQUFDLENBQ0E3WCxJQUFJLENBQUMsTUFBTTtRQUNYLElBQUksQ0FBQ3JFLHVCQUF1QixHQUFHLElBQUk7UUFDbkMsT0FBTyxDQUFDO01BQ1QsQ0FBQyxDQUFDLENBQ0R3RSxLQUFLLENBQUMsTUFBTTtRQUNaO01BQUEsQ0FDQSxDQUFDO0lBQ0o7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBb0YsTUFBQSxDQUlRMlMsbUJBQW1CLEdBQTNCLFNBQVFBLG1CQUFtQkEsQ0FBQ2xOLGVBQXVCLEVBQVE7TUFDMUQsTUFBTTBNLGFBQWEsR0FBRyxJQUFJLENBQUMxZSxPQUFPLENBQUMsQ0FBQyxDQUFDb08sSUFBSSxDQUFDNEQsZUFBZSxDQUFDO01BQzFELElBQUkwTSxhQUFhLEVBQUVuYixHQUFHLENBQXVCLCtCQUErQixDQUFDLEVBQUU7UUFDOUUsSUFBSSxDQUFDMkcsZ0JBQWdCLEdBQUd3VSxhQUFhO01BQ3RDLENBQUMsTUFBTSxJQUFJQSxhQUFhLEVBQUVuYixHQUFHLENBQW9CLDRCQUE0QixDQUFDLEVBQUU7UUFDL0UsTUFBTW9NLFdBQVcsR0FBRytPLGFBQWEsQ0FBQzdNLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQzNILGdCQUFnQixHQUFHeUYsV0FBVyxDQUFDLENBQUMsQ0FBQztNQUN2QztJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBLE9BSEM7SUFBQXBELE1BQUEsQ0FJUXdTLHdCQUF3QixHQUFoQyxTQUFRQSx3QkFBd0JBLENBQUMvTSxlQUF1QixFQUFRO01BQy9EO01BQ0E7TUFDQSxJQUFJLENBQUNrTixtQkFBbUIsQ0FBQ2xOLGVBQWUsQ0FBQztNQUV6QyxJQUFJLENBQUM3SCxlQUFlLENBQUMsQ0FBQyxDQUFDUyxvQkFBb0IsQ0FBQ29ILGVBQWUsQ0FBQzs7TUFFNUQ7TUFDQTtNQUNBckgsVUFBVSxDQUFDLE1BQU07UUFDaEIsSUFBSSxDQUFDd1UsU0FBUyxDQUFDQyx1QkFBdUIsQ0FBQyxDQUFDOztRQUV4QztRQUNBO1FBQ0E7UUFDQSxNQUFNQyxZQUFZLEdBQUdsYixXQUFXLENBQUNDLGFBQWEsQ0FBQyxJQUFJLENBQUNwRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUlxZixZQUFZLElBQUksSUFBSSxDQUFDblYsZ0JBQWdCLEVBQUU7VUFDMUMsSUFBSSxDQUFDTSxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQ04sZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDNUQ7TUFDRCxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ1I7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUkM7SUFBQXFDLE1BQUEsQ0FTTTRSLHNDQUFzQyxHQUE1QyxlQUFNQSxzQ0FBc0NBLENBQzNDbUIsY0FBZ0YsRUFDaEY5SyxnQkFBa0MsRUFDbEMrSyxvQkFBc0MsRUFFbkI7TUFBQSxJQURuQnZMLHlCQUF5QixHQUFBeFMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXJCLFNBQUEsR0FBQXFCLFNBQUEsTUFBRyxJQUFJO01BRWhDLElBQUksQ0FBQyxJQUFJLENBQUNzTSx1Q0FBdUMsQ0FBQyxDQUFDLElBQUl3UixjQUFjLEVBQUU7UUFDdEUsTUFBTXhHLE9BQU8sQ0FBQ3lGLEdBQUcsQ0FBQ3ZLLHlCQUF5QixHQUFHLElBQUksQ0FBQ0EseUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQ2hGaE4sSUFBSSxDQUFDLFlBQVk7VUFDakJ3TixnQkFBZ0IsQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQztVQUNqQyxJQUFJO1lBQ0g7WUFDQSxNQUFNOEssb0JBQW9CO1VBQzNCLENBQUMsQ0FBQyxNQUFNO1lBQ1A5WSxHQUFHLENBQUMwVCxPQUFPLENBQUMsZ0NBQWdDLENBQUM7VUFDOUM7VUFDQW1GLGNBQWMsQ0FBQzNLLEVBQUUsQ0FBQ3hHLE9BQU8sQ0FBRW5FLFVBQVUsSUFBS0EsVUFBVSxDQUFDd1YscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1VBQzdFRixjQUFjLENBQUMxSyxNQUFNLENBQ25CNUksTUFBTSxDQUFFeVQsVUFBVSxJQUFLQSxVQUFVLENBQUN4UyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQy9Da0IsT0FBTyxDQUFFbkUsVUFBVSxJQUFLQSxVQUFVLENBQUMwVixTQUFTLENBQUMsMkJBQTJCLEVBQUU7WUFBRTFWLFVBQVUsRUFBRUE7VUFBVyxDQUFDLENBQUMsQ0FBQztVQUN4RztRQUNELENBQUMsQ0FBQyxDQUNEN0MsS0FBSyxDQUFFWCxDQUFVLElBQUs7VUFDdEJDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLGdDQUFnQyxFQUFFRixDQUFXLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJO01BQ1o7TUFDQSxPQUFPLEtBQUs7SUFDYjs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUErRixNQUFBLENBSU1rUixxQkFBcUIsR0FBM0IsZUFBTUEscUJBQXFCQSxDQUFDa0MsS0FBb0IsRUFBaUI7TUFDaEUsTUFBTUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDeFEsZUFBZSxDQUFDLENBQUMsQ0FBQ3lRLDhCQUE4QixDQUFDLENBQUM7TUFDM0Y7TUFDQSxJQUFJRCwyQkFBMkIsQ0FBQ0UsZ0NBQWdDLENBQUMsQ0FBQyxFQUFFO1FBQ25FLE1BQU0sSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ0MscUJBQXFCLENBQUNMLEtBQUssQ0FBQztRQUM1RCxJQUFJQSxLQUFLLENBQUNsZSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3JCLE1BQU13ZSxVQUFVLEdBQUcsSUFBSSxDQUFDRixvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDUCxLQUFLLENBQUM7VUFDL0QsTUFBTVEsV0FBVyxHQUFHLElBQUksQ0FBQy9RLGVBQWUsQ0FBQyxDQUFDLENBQUMvSixLQUFLLENBQUMsQ0FBQztVQUNsRHVhLDJCQUEyQixDQUFDUSw4QkFBOEIsQ0FBQ0gsVUFBVSxFQUFFRSxXQUFXLEVBQUUsSUFBSSxDQUFDbmdCLE9BQU8sQ0FBQyxDQUFDLENBQUNxRixLQUFLLENBQUMsQ0FBQyxDQUFDO1VBQzNHdWEsMkJBQTJCLENBQUNTLG1CQUFtQixDQUFDLENBQUM7UUFDbEQ7TUFDRDtJQUNEOztJQUVBO0FBQ0Q7QUFDQSxPQUZDO0lBQUE5VCxNQUFBLENBR0F1UixpQ0FBaUMsR0FBakMsU0FBQUEsaUNBQWlDQSxDQUFBLEVBQVM7TUFDekMsTUFBTXpTLElBQUksR0FBRyxJQUFJLENBQUNyTCxPQUFPLENBQUMsQ0FBQztNQUMzQixNQUFNdU4sV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQztNQUN0RCxNQUFNdVAsb0JBQW9CLEdBQUcxUixJQUFJLENBQUN4RCxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7TUFDL0RrVixvQkFBb0IsRUFBRTVSLFdBQVcsQ0FBQyxjQUFjLEVBQUU7UUFBRSxHQUFHNFIsb0JBQW9CLEVBQUV4UyxXQUFXLENBQUMsY0FBYztNQUFFLENBQUMsQ0FBQztNQUMzRyxJQUFJd1Msb0JBQW9CLEVBQUU7UUFDeEJ4UCxXQUFXLENBQUNtSSxjQUFjLENBQUMsQ0FBQyxFQUMxQjRLLFlBQVksQ0FBQyxJQUFJLEVBQUdDLElBQWEsSUFBS0EsSUFBSSxDQUFDaGQsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FDdEU0SyxPQUFPLENBQUVxUyxZQUF3QixJQUFLO1VBQ3RDQSxZQUFZLENBQUNyTixpQkFBaUIsQ0FDN0I0SixvQkFBb0IsQ0FDbEJoVixRQUFRLENBQUMsQ0FBQyxDQUNWMEQsV0FBVyxDQUFDLElBQUksQ0FBQ3RCLGVBQWUsQ0FBQyxDQUFDLENBQUN1QixrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FDeEVDLGVBQWUsQ0FBQyxDQUFDLEVBQ25CLFVBQ0QsQ0FBQztRQUNGLENBQUMsQ0FBQztRQUNIO1FBQ0EsSUFBSSxDQUFDNkMsZ0JBQWdCLENBQUMsQ0FBQztNQUN4QjtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBakMsTUFBQSxDQUtBcVIsMkJBQTJCLEdBQTNCLFNBQUFBLDJCQUEyQkEsQ0FBQzZDLFVBQThCLEVBQVE7TUFDakUsTUFBTUMsY0FBYyxHQUFHQyxPQUFPLENBQUNDLG9CQUFvQixDQUFDLGFBQWEsQ0FBRTtNQUVuRSxJQUFJLElBQUksQ0FBQ0Msb0JBQW9CLEVBQUU7UUFDOUJoVixTQUFTLENBQUNPLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQ3lVLG9CQUFvQixDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUNBLG9CQUFvQjtNQUNqQztNQUVBLElBQUlKLFVBQVUsRUFBRTtRQUNmLElBQUksQ0FBQ0ksb0JBQW9CLEdBQUcsSUFBSUMsT0FBTyxDQUFDO1VBQ3ZDN1UsT0FBTyxFQUFFeVUsY0FBYyxDQUFDSyxPQUFPLENBQUMsc0NBQXNDLEVBQUUsQ0FBQ04sVUFBVSxDQUFDLENBQUM7VUFDckZPLElBQUksRUFBRUMsV0FBVyxDQUFDQyxXQUFXO1VBQzdCQyxNQUFNLEVBQUUsSUFBSSxDQUFDbmhCLE9BQU8sQ0FBQyxDQUFDLEVBQUU2SCxpQkFBaUIsQ0FBQyxDQUFDLEVBQUVLLE9BQU8sQ0FBQztRQUN0RCxDQUFDLENBQUM7UUFDRjJELFNBQVMsQ0FBQ3VWLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQ1Asb0JBQW9CLENBQUMsQ0FBQztNQUNuRDtJQUNELENBQUM7SUFBQXRVLE1BQUEsQ0FJSzhVLFdBQVcsR0FGakIsZUFFTUEsV0FBV0EsQ0FBQ25lLFdBQWdELEVBQWlCO01BQ2xGLE1BQU1vZSxRQUFRLEdBQUdBLENBQUEsS0FBWTtRQUM1QjtRQUNBLE1BQU0vVCxXQUFXLEdBQUcsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RELE1BQU0rVCxlQUFlLEdBQUcsQ0FBQ3BkLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDLElBQUksQ0FBQ3BFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbEUsSUFBSXVoQixlQUFlLEVBQUU7VUFDcEIsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDck0sd0JBQXdCLENBQUM1SCxXQUFXLENBQUM7VUFDekUsSUFBSWlVLHNCQUFzQixFQUFFO1lBQzNCQSxzQkFBc0IsQ0FBQy9JLEtBQUssQ0FBQyxDQUFDO1VBQy9CO1FBQ0QsQ0FBQyxNQUFNO1VBQ04sTUFBTWdKLGdCQUFnQixHQUFHeE0sVUFBVSxDQUFDeU0sY0FBYyxDQUFDblUsV0FBVyxDQUFDdVIsa0JBQWtCLENBQUMsQ0FBQyxDQUFrQztVQUNySCxJQUFJMkMsZ0JBQWdCLEVBQUU7WUFDckIsSUFBSSxDQUFDalgsc0JBQXNCLENBQUNpWCxnQkFBZ0IsQ0FBQzVQLGNBQWMsQ0FBQyxDQUFDLENBQUM7VUFDL0Q7UUFDRDtNQUNELENBQUM7TUFDRCxNQUFNOFAsSUFBSSxHQUFHLElBQUksQ0FBQzNoQixPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLENBQUMsQ0FBQztNQUMvQztNQUNBLElBQUksQ0FBQzdILE9BQU8sQ0FBQyxDQUFDLENBQUMrSCxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUNvRCxXQUFXLENBQUMsY0FBYyxFQUFFd1csSUFBSSxDQUFDOztNQUVyRTtNQUNBLE1BQU01ZSxLQUFLLEdBQUcsSUFBSSxDQUFDL0MsT0FBTyxDQUFDLENBQUM7TUFDNUIsTUFBTXFLLHFCQUFxQixHQUFHdEgsS0FBSyxDQUFDOEUsaUJBQWlCLENBQUMsVUFBVSxDQUF5QjtNQUN6RixNQUFNK1osZUFBZSxHQUFHN2UsS0FBSyxDQUFDOEUsaUJBQWlCLENBQUMsQ0FBQztNQUNqRDtNQUNBLElBQUkrWixlQUFlLEVBQUU7UUFDcEIsTUFBTUMsYUFBYSxHQUFHcEcsV0FBVyxDQUFDQyx3QkFBd0IsQ0FBQ2tHLGVBQWUsQ0FBQzdaLFFBQVEsQ0FBQyxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDNlosYUFBYSxFQUFFO1VBQ25CLE1BQU1DLGFBQWEsR0FBRzNkLFdBQVcsQ0FBQ2lMLGVBQWUsQ0FBQ3JNLEtBQUssQ0FBQztVQUN4RCxNQUFNK2UsYUFBYSxDQUFDN0gsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQ2pCLHdCQUF3QixDQUFDMkksZUFBZSxDQUFDLENBQUM7UUFDL0c7TUFDRDtNQUNBO01BQ0EsTUFBTUcsVUFBVSxHQUFHNWQsV0FBVyxDQUFDQyxhQUFhLENBQUMsSUFBSSxDQUFDcEUsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUM1RCxJQUFJK2hCLFVBQVUsSUFBSUgsZUFBZSxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxDQUFDbEUsZUFBZSxDQUFDc0UsNEJBQTRCLENBQUMsQ0FBQztVQUFFQyxPQUFPLEVBQUVMO1FBQWdCLENBQUMsQ0FBQyxDQUFDO01BQ3hGO01BRUEsSUFBSTFlLFdBQVcsRUFBRWdmLFVBQVUsRUFBRTtRQUM1QlosUUFBUSxDQUFDLENBQUM7TUFDWDtNQUNBalgscUJBQXFCLENBQUNjLFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUM7TUFDdEUsSUFBSSxDQUFDZ1gseUNBQXlDLENBQUMsQ0FBQzs7TUFFaEQ7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ3pmLGVBQWUsSUFBSSxDQUFDMGYsTUFBTSxDQUFDQyxPQUFPLENBQUNDLEtBQUssRUFBRTtRQUNuRCxNQUFNQyxVQUFVLEdBQUd4ZixLQUFLLENBQUNxTCxJQUFJLENBQUMscUNBQXFDLENBQVc7UUFDOUUsTUFBTW9VLGVBQWUsR0FBR0EsQ0FBQSxLQUFZO1VBQ25DLElBQUksSUFBSSxDQUFDQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDRCxhQUFhLENBQUNFLE1BQU0sQ0FBQyxDQUFDO1VBQzVCO1VBQ0FKLFVBQVUsQ0FBQ0ssa0JBQWtCLENBQUMsU0FBUyxFQUFFSixlQUFlLENBQUM7VUFDekRELFVBQVUsQ0FBQ0ssa0JBQWtCLENBQUMsTUFBTSxFQUFFSixlQUFlLENBQUM7UUFDdkQsQ0FBQztRQUVERCxVQUFVLEVBQUVNLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxNQUFZO1VBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUNKLGFBQWEsRUFBRUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUNwQyxJQUFJLENBQUNELGFBQWEsR0FBRyxJQUFJLENBQUN6aUIsT0FBTyxDQUFDLENBQUMsQ0FBQytILFFBQVEsQ0FBQyxDQUFDLENBQUMrYSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQzVEO1lBQ0E7WUFDQVAsVUFBVSxDQUFDTSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUVMLGVBQWUsQ0FBQztZQUN6REQsVUFBVSxDQUFDTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUVMLGVBQWUsQ0FBQztVQUN2RDtRQUNELENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQzlmLGVBQWUsR0FBRyxJQUFJO01BQzVCO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBNkosTUFBQSxDQUlBck0saUJBQWlCLEdBQWpCLFNBQUFBLGlCQUFpQkEsQ0FBQSxFQUFZO01BQzVCLE1BQU0waEIsZUFBZSxHQUFHLElBQUksQ0FBQzVoQixPQUFPLENBQUMsQ0FBQyxDQUFDNkgsaUJBQWlCLElBQUksSUFBSSxDQUFDN0gsT0FBTyxDQUFDLENBQUMsQ0FBQzZILGlCQUFpQixDQUFDLENBQUM7TUFDOUYsSUFBSTlILGlCQUFpQixHQUFHLEtBQUs7TUFDN0IsSUFBSTZoQixlQUFlLEVBQUU7UUFDcEIsTUFBTUMsYUFBYSxHQUFHcEcsV0FBVyxDQUFDQyx3QkFBd0IsQ0FBQ2tHLGVBQWUsQ0FBQzdaLFFBQVEsQ0FBQyxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFBSTZaLGFBQWEsRUFBRTtVQUNsQjloQixpQkFBaUIsR0FBR29FLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDLElBQUksQ0FBQ3BFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUQ7TUFDRDtNQUNBLE9BQU9ELGlCQUFpQjtJQUN6QixDQUFDO0lBQUF3TSxNQUFBLENBRURpQiwyQkFBMkIsR0FBM0IsU0FBQUEsMkJBQTJCQSxDQUFBLEVBQXFCO01BQy9DLE9BQU8sSUFBSSxDQUFDWSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDbkMsQ0FBQztJQUFBN0IsTUFBQSxDQUVLd1csd0JBQXdCLEdBQTlCLGVBQU1BLHdCQUF3QkEsQ0FBQSxFQUFvRztNQUNqSSxNQUFNeFYsV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQztNQUN0RCxNQUFNd1YsbUJBQW1CLEdBQUd6VixXQUFXLENBQUN0RSxhQUFhLENBQUMsQ0FBQyxDQUFDdkQsSUFBSSxDQUFDLFVBQVV1ZCxXQUFXLEVBQUU7UUFDbkYsT0FBT0EsV0FBVyxDQUFDL1osTUFBTSxDQUFDLENBQUMsS0FBSyxvQkFBb0I7TUFDckQsQ0FBQyxDQUFDO01BQ0YsTUFBTWdhLHNCQUFzQixHQUFHM1YsV0FBVyxDQUFDdEUsYUFBYSxDQUFDLENBQUMsQ0FBQ3ZELElBQUksQ0FBQyxVQUFVdWQsV0FBVyxFQUFFO1FBQ3RGLE9BQU9BLFdBQVcsQ0FBQy9aLE1BQU0sQ0FBQyxDQUFDLEtBQUssdUJBQXVCO01BQ3hELENBQUMsQ0FBQztNQUNGLE1BQU1pYSxZQUFZLEdBQUlDLFdBQTZELElBQ2xGemhCLEtBQUssQ0FBQzBoQixJQUFJLENBQ1QsSUFBSUMsR0FBRyxDQUNOLENBQUNGLFdBQVcsRUFBRUcsS0FBSyxJQUFJLEVBQUUsRUFDdkJ2WCxNQUFNLENBQUV3WCxJQUFJLElBQUssQ0FBQ0EsSUFBSSxDQUFDQyxLQUFLLENBQUMsQ0FDN0JqYixHQUFHLENBQUVnYixJQUFJLElBQUtBLElBQUksQ0FBQ0UsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUM5QjFYLE1BQU0sQ0FBQzJYLE9BQU8sQ0FDakIsQ0FDRCxDQUFDO01BQ0YsTUFBTUMsYUFBYSxHQUFHVCxZQUFZLENBQUNILG1CQUFtQixFQUFFYSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7TUFDaEYsTUFBTUMsZ0JBQWdCLEdBQUdYLFlBQVksQ0FBQ0Qsc0JBQXNCLEVBQUVXLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztNQUN0RixNQUFNRSxjQUFjLEdBQUcsQ0FBQyxHQUFHSCxhQUFhLEVBQUUsR0FBR0UsZ0JBQWdCLENBQUM7TUFDOUQsTUFBTUUsWUFBWSxHQUFHLElBQUksQ0FBQzVVLGVBQWUsQ0FBQyxDQUFDO01BQzNDLE1BQU02VSxrQkFBa0IsR0FBR0QsWUFBWSxDQUFDRSxxQkFBcUIsQ0FBQyxDQUFDO01BQy9ELE1BQU1DLGlCQUFpQixHQUFHQSxDQUFBLEtBQVk7UUFDckNGLGtCQUFrQixDQUFDRyw2QkFBNkIsQ0FBQzdXLFdBQVcsQ0FBQzFGLGlCQUFpQixDQUFDLENBQUMsRUFBRUssT0FBTyxDQUFDLENBQVcsQ0FBQztNQUN2RyxDQUFDO01BQ0QsSUFBSSxDQUFDZ2Isc0JBQXNCLElBQUlGLG1CQUFtQixLQUFLLENBQUMsSUFBSSxDQUFDdmdCLGtDQUFrQyxFQUFFO1FBQ2hHdWdCLG1CQUFtQixFQUFFalEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFeEUsWUFBWSxDQUFDNFYsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO1FBQy9FakIsc0JBQXNCLEVBQUVuUSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUV4RSxZQUFZLENBQUM0VixpQkFBaUIsRUFBRSxJQUFJLENBQUM7UUFDbEYsSUFBSSxDQUFDMWhCLGtDQUFrQyxHQUFHLElBQUk7TUFDL0M7TUFDQSxNQUFNNGhCLGtCQUFrQixHQUFHOVcsV0FBVyxDQUFDMUYsaUJBQWlCLENBQUMsQ0FBQztNQUMxRCxNQUFNeWMsS0FBSyxHQUFHQSxDQUFBLE1BQStGO1FBQzVHQyxLQUFLLEVBQUVoWCxXQUFXLENBQUNuSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFO1FBQ2hEb2UsUUFBUSxFQUFFeEIsbUJBQW1CLEVBQUU1WixRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDL0NxYixNQUFNLEVBQUUsRUFBRTtRQUNWQyxJQUFJLEVBQUUsRUFBRTtRQUNSQyxXQUFXLEVBQUV6QixzQkFBc0IsRUFBRTlaLFFBQVEsQ0FBQyxDQUFDLElBQUk7TUFDcEQsQ0FBQyxDQUFDO01BQ0Y7TUFDQSxJQUFJLENBQUNpYixrQkFBa0IsSUFBSU4sY0FBYyxDQUFDdGlCLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkQsT0FBT3FYLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDdUwsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUNoQztNQUNBLE1BQU14TCxPQUFPLENBQUN5RixHQUFHLENBQ2hCd0YsY0FBYyxDQUFDdmIsR0FBRyxDQUFDLE1BQU9vYyxDQUFDLElBQU1QLGtCQUFrQixDQUFvQlEsZUFBZSxDQUFDRCxDQUFDLENBQUMsQ0FBQ3pkLEtBQUssQ0FBQyxNQUFNaEgsU0FBUyxDQUFDLENBQ2pILENBQUM7TUFDRCxPQUFPbWtCLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUFBL1gsTUFBQSxDQUVEdVksbUJBQW1CLEdBQW5CLFNBQUFBLG1CQUFtQkEsQ0FBQ0MsVUFBb0IsRUFBUTtNQUMvQyxNQUFNeFgsV0FBVyxHQUFHLElBQUksQ0FBQ0MsMkJBQTJCLENBQUMsQ0FBQztRQUNyRHFJLFNBQVMsR0FBR3RJLFdBQVcsQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDcVQsZ0JBQWdCLEdBQUduUCxTQUFTLENBQUNwVSxNQUFNLEdBQUcsQ0FBQztRQUN2Q3dqQixRQUFRLEdBQUlGLFVBQVUsQ0FBQ3JnQixTQUFTLENBQUMsQ0FBQyxDQUFpQ3dnQixVQUFVLENBQUMsQ0FBQztNQUNoRixJQUFJQyxVQUFVO1FBQ2JDLHFCQUFxQixHQUFHN1gsV0FBVyxDQUFDOFgsY0FBYyxDQUFDLElBQUksQ0FBQ2pYLElBQUksQ0FBQ2IsV0FBVyxDQUFDdVIsa0JBQWtCLENBQUMsQ0FBRSxDQUFzQixDQUFDO01BQ3RILElBQUlzRyxxQkFBcUIsS0FBSyxDQUFDLENBQUMsSUFBSUosZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO1FBQ3pELElBQUlDLFFBQVEsS0FBSyxTQUFTLEVBQUU7VUFDM0IsSUFBSUcscUJBQXFCLElBQUlKLGdCQUFnQixHQUFHLENBQUMsRUFBRTtZQUNsREcsVUFBVSxHQUFHdFAsU0FBUyxDQUFDLEVBQUV1UCxxQkFBcUIsQ0FBQztVQUNoRDtRQUNELENBQUMsTUFBTSxJQUFJQSxxQkFBcUIsS0FBSyxDQUFDLEVBQUU7VUFDdkM7VUFDQUQsVUFBVSxHQUFHdFAsU0FBUyxDQUFDLEVBQUV1UCxxQkFBcUIsQ0FBQztRQUNoRDtRQUVBLElBQUlELFVBQVUsRUFBRTtVQUNmNVgsV0FBVyxDQUFDZ0csa0JBQWtCLENBQUM0UixVQUFVLENBQUM7VUFDMUNBLFVBQVUsQ0FBQzFNLEtBQUssQ0FBQyxDQUFDO1FBQ25CO01BQ0Q7SUFDRCxDQUFDO0lBQUFsTSxNQUFBLENBRUQrWSxvQkFBb0IsR0FBcEIsU0FBQUEsb0JBQW9CQSxDQUFBLEVBQVM7TUFDNUIsTUFBTWpiLHFCQUFxQixHQUFHLElBQUksQ0FBQ3JLLE9BQU8sQ0FBQyxDQUFDLENBQUM2SCxpQkFBaUIsQ0FBQyxVQUFVLENBQXlCO01BQ2xHLE1BQU0wZCxPQUFPLEdBQUcsSUFBSSxDQUFDdmxCLE9BQU8sQ0FBQyxDQUFDLENBQUNxRixLQUFLLENBQUMsQ0FBQztNQUN0Q2dGLHFCQUFxQixDQUFDYyxXQUFXLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDO01BQ3ZFLE1BQU1xYSxvQkFBb0IsR0FBSSxJQUFJLENBQUNwVyxlQUFlLENBQUMsQ0FBQyxDQUFDaUwsMEJBQTBCLENBQUMsQ0FBQyxDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDQyxXQUFXLEVBQzVHQyxPQUFPO01BQ1YzTyxTQUFTLENBQUNDLGVBQWUsQ0FBQyxDQUFDLENBQ3pCQyxPQUFPLENBQUMsQ0FBQyxDQUNUb0MsT0FBTyxDQUFDLFVBQVVzWCxRQUFpQixFQUFRO1FBQzNDLE1BQU1DLGNBQWMsR0FBR0QsUUFBUSxDQUFDRSxVQUFVLElBQUlGLFFBQVEsQ0FBQ3RWLE9BQU8sQ0FBQyxDQUFDLEtBQUssT0FBTztRQUM1RSxNQUFNeVYsaUJBQWlCLEdBQUdKLG9CQUFvQixHQUMzQ0UsY0FBYyxHQUNkQSxjQUFjLElBQUlELFFBQVEsQ0FBQ3ZaLFVBQVUsQ0FBQyxDQUFDLENBQUM0RyxJQUFJLENBQUVxTyxNQUFNLElBQUtBLE1BQU0sQ0FBQ2xHLFFBQVEsQ0FBQ3NLLE9BQU8sQ0FBQyxDQUFDO1FBQ3JGLElBQUlLLGlCQUFpQixFQUFFO1VBQ3RCdmIscUJBQXFCLENBQUNjLFdBQVcsQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLENBQUM7UUFDdkU7TUFDRCxDQUFDLENBQUM7SUFDSixDQUFDO0lBQUFvQixNQUFBLENBRURyRixtQkFBbUIsR0FBbkIsU0FBQUEsbUJBQW1CQSxDQUFBLEVBQVM7TUFDM0IsTUFBTTJlLFVBQVUsR0FBRzFoQixXQUFXLENBQUNDLGFBQWEsQ0FBQyxJQUFJLENBQUNwRSxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQzVELE1BQU1pa0Isa0JBQWtCLEdBQUcsSUFBSSxDQUFDN1UsZUFBZSxDQUFDLENBQUMsQ0FBQzhVLHFCQUFxQixDQUFDLENBQUM7TUFDekUsTUFBTTRCLGVBQWUsR0FBRzdCLGtCQUFrQixDQUFDOEIsWUFBWSxDQUFDLENBQUMsR0FDdEQ5QixrQkFBa0IsQ0FBQytCLGdCQUFnQixDQUFDLENBQUMsR0FDcEMsSUFBSSxDQUFDNVcsZUFBZSxDQUFDLENBQUMsQ0FBQzZXLGdCQUFnQixDQUFDLENBQUMsQ0FBa0JDLGNBQWMsQ0FBQyxDQUFDO01BQy9FLElBQUlMLFVBQVUsSUFBSSxDQUFDQyxlQUFlLENBQUN2aUIsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDNUQsTUFBTTRpQixjQUFjLEdBQUcsSUFBSSxDQUFDeGYsYUFBYTtVQUN4Q2lJLGVBQWUsR0FBR3VYLGNBQWMsQ0FBQ3ZYLGVBQWU7VUFDaER3WCxZQUFZLEdBQUd4WCxlQUFlLENBQUNtRSxVQUFVLENBQUMsT0FBTyxDQUFnQjtRQUVsRSxJQUFJcVQsWUFBWSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDelgsZUFBZSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1VBQzlEc1gsY0FBYyxDQUFDMVIsVUFBVSxDQUFDLElBQUksQ0FBQztVQUMvQjtVQUNBOUosVUFBVSxDQUFDLFlBQVk7WUFDdEJpRSxlQUFlLENBQUMwWCxNQUFNLENBQUNILGNBQWMsQ0FBQztVQUN2QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ047TUFDRDtJQUNELENBQUM7SUFBQTVaLE1BQUEsQ0FFS3JJLGFBQWEsR0FBbkIsZUFBTUEsYUFBYUEsQ0FBQSxFQUE0QjtNQUM5QyxNQUFNbEIsUUFBUSxHQUFHLElBQUksQ0FBQ2hELE9BQU8sQ0FBQyxDQUFDLENBQUM2SCxpQkFBaUIsQ0FBQyxDQUFDO01BQ25ELE1BQU15VSxNQUFNLEdBQUcsSUFBSSxDQUFDdGMsT0FBTyxDQUFDLENBQUMsQ0FBQytILFFBQVEsQ0FBQyxJQUFJLENBQUM7TUFDNUN3ZSxVQUFVLENBQUN6RCxJQUFJLENBQUN4RyxNQUFNLENBQUM7TUFDdkIsT0FBTyxJQUFJLENBQUN4WCxRQUFRLENBQUMwaEIsWUFBWSxDQUFDcFYsS0FBSyxDQUFDLElBQUksQ0FBQ3RNLFFBQVEsRUFBRSxDQUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQ3lqQixPQUFPLENBQUMsWUFBWTtRQUN0RkYsVUFBVSxDQUFDNUQsTUFBTSxDQUFDckcsTUFBTSxDQUFDO01BQzFCLENBQUMsQ0FBQztJQUNIOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQS9QLE1BQUEsQ0FPQXBELDhDQUE4QyxHQUE5QyxTQUFBQSw4Q0FBOENBLENBQzdDdWQsWUFBb0IsRUFDcEJyZCxjQUFzQixFQUN1QjtNQUM3QyxPQUFPLENBQ047UUFDQ3NkLGFBQWEsRUFBRTtVQUNkQyxhQUFhLEVBQUVGO1FBQ2hCLENBQUM7UUFDREcsc0JBQXNCLEVBQUV4ZDtNQUN6QixDQUFDLENBQ0Q7SUFDRjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBa0QsTUFBQSxDQVNNdWEsaUJBQWlCLEdBQXZCLGVBQU1BLGlCQUFpQkEsQ0FBQSxFQUFvRDtNQUMxRSxNQUFNeFcsT0FBTyxHQUFHMkUsVUFBVSxDQUFDOFIsZ0JBQWdCLENBQUMsQ0FBWTtNQUN4RCxNQUFNOUUsT0FBTyxHQUFHM1IsT0FBTyxFQUFFekksaUJBQWlCLENBQUMsQ0FBK0I7TUFFMUUsSUFBSSxDQUFDeUksT0FBTyxJQUFJLENBQUMyUixPQUFPLEVBQUU7UUFDekIsT0FBTzloQixTQUFTO01BQ2pCO01BQ0EsSUFBSTZtQixpQkFBaUIsR0FBRyxLQUFLO01BQzdCLElBQUkvRSxPQUFPLENBQUNnRixXQUFXLENBQUMsQ0FBQyxFQUFFO1FBQzFCLElBQUloRixPQUFPLENBQUNwUCxpQkFBaUIsQ0FBQyxDQUFDLEVBQUU7VUFDaEMsTUFBTW9QLE9BQU8sQ0FBQ2lGLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLENBQUMsTUFBTTtVQUNORixpQkFBaUIsR0FBRyxJQUFJO1FBQ3pCO01BQ0Q7TUFDQSxJQUFJLENBQUM5TixjQUFjLENBQUNpTyxzQkFBc0IsQ0FBQzdXLE9BQU8sQ0FBQztNQUNuRCxNQUFNOFcsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQ3BGLE9BQU8sRUFBRStFLGlCQUFpQixDQUFDO01BQzFFLElBQUksQ0FBQzlOLGNBQWMsQ0FBQ29PLFlBQVksQ0FBQztRQUFFaFg7TUFBUSxDQUFDLENBQUM7TUFDN0MsT0FBTzhXLEdBQUc7SUFDWDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBN2EsTUFBQSxDQVNNOGEsdUJBQXVCLEdBQTdCLGVBQU1BLHVCQUF1QkEsQ0FBQ3BGLE9BQXVCLEVBQThFO01BQUEsSUFBNUUrRSxpQkFBaUIsR0FBQXhsQixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBckIsU0FBQSxHQUFBcUIsU0FBQSxNQUFHLEtBQUs7TUFDL0UsTUFBTXdpQixZQUFZLEdBQUcsSUFBSSxDQUFDNVUsZUFBZSxDQUFDLENBQUM7TUFDM0M7TUFDQSxJQUFJLENBQUM4SixjQUFjLENBQUNDLHdCQUF3QixDQUFDLENBQUM7TUFDOUMsSUFBSSxDQUFDNk4saUJBQWlCLEVBQUU7UUFDdkIsTUFBTU8sa0JBQWtCLEdBQUd2RCxZQUFZLENBQUN3RCxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9ELE1BQU1DLFVBQVUsR0FBR0Ysa0JBQWtCLENBQUNHLHdCQUF3QixDQUFDekYsT0FBTyxDQUFDO1FBQ3ZFLE1BQU0wRixpQkFBaUIsR0FBR0YsVUFBVSxHQUFHRixrQkFBa0IsQ0FBQ0ssK0JBQStCLENBQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDMUc7UUFDQSxJQUFJRSxpQkFBaUIsQ0FBQ2xtQixNQUFNLEVBQUU7VUFDN0IsTUFBTSxJQUFJLENBQUNxRCxRQUFRLENBQUNnQyxRQUFRLENBQUMsQ0FBQztVQUM5QixPQUFPZ1MsT0FBTyxDQUFDeUYsR0FBRyxDQUFDb0osaUJBQWlCLENBQUNuZixHQUFHLENBQUMsTUFBTzJTLFdBQVcsSUFBSyxJQUFJLENBQUNBLFdBQVcsQ0FBQzBNLGtCQUFrQixDQUFDMU0sV0FBVyxFQUFFOEcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1SDtNQUNEO01BRUEsTUFBTTZGLGdCQUFnQixHQUFJLE1BQU0zakIsV0FBVyxDQUFDNGpCLGlCQUFpQixDQUM1RGhxQixnQkFBZ0IsQ0FBQ2lxQixLQUFLLEVBQ3RCLElBQUksQ0FBQ2hvQixPQUFPLENBQUMsQ0FBQyxFQUNkZ2tCLFlBQ0QsQ0FBb0I7TUFDcEI7TUFDQSxJQUFJOEQsZ0JBQWdCLEVBQUU7UUFDckIsTUFBTSxJQUFJLENBQUNoakIsUUFBUSxDQUFDZ0MsUUFBUSxDQUFDLENBQUM7UUFDOUIsT0FBTzJULEtBQUssQ0FBQ3dOLHNCQUFzQixDQUFDSCxnQkFBZ0IsRUFBRTlELFlBQVksRUFBRSxJQUFJLENBQUMvVSxrQkFBa0IsQ0FBQ2laLFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFDM0c7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BUEM7SUFBQTNiLE1BQUEsQ0FRTWxJLGFBQWEsR0FBbkIsZUFBTUEsYUFBYUEsQ0FBQzhqQixpQkFBMkIsRUFBRUMsZUFBeUIsRUFBaUI7TUFDMUYsTUFBTW5HLE9BQU8sR0FBRyxJQUFJLENBQUNqaUIsT0FBTyxDQUFDLENBQUMsQ0FBQzZILGlCQUFpQixDQUFDLENBQUM7TUFDbEQsTUFBTTRiLEtBQUssR0FBRyxJQUFJLENBQUN6akIsT0FBTyxDQUFDLENBQUMsQ0FBQytILFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDMUNzZ0Isb0JBQXdELEdBQUcsRUFBRTtNQUM5RDtNQUNBLElBQUlDLHlCQUF5QixHQUFHLEtBQUs7TUFDckMsSUFBSUMsaUJBQXFDO01BQ3pDaEMsVUFBVSxDQUFDekQsSUFBSSxDQUFDVyxLQUFLLENBQUM7TUFDdEIsSUFBSTtRQUNILElBQUksSUFBSSxDQUFDeFUsa0JBQWtCLENBQUN1WixzQkFBc0IsQ0FBQyxDQUFDLEVBQUU7VUFDckQsSUFBSTtZQUNILE1BQU1DLFlBQVksR0FBRyxNQUFNLElBQUlDLG9CQUFvQixDQUFDLElBQUksQ0FBQzFvQixPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDMm9CLGFBQWEsQ0FBQyxDQUFDO1lBQ3pGO1lBQ0EsSUFBSUYsWUFBWSxLQUFLLFFBQVEsRUFBRTtjQUM5QjtZQUNEO1lBQ0E7WUFDQSxJQUFJQSxZQUFZLEtBQUssV0FBVyxFQUFFO2NBQ2pDLElBQUksQ0FBQ3haLGtCQUFrQixDQUFDQyxVQUFVLENBQUMsQ0FBQztjQUNwQyxNQUFNLElBQUksQ0FBQ3dLLFFBQVEsQ0FBQ0MsdUJBQXVCLENBQUNzSSxPQUFPLENBQUM7Y0FDcEQ7WUFDRDtVQUNELENBQUMsQ0FBQyxPQUFPMkcsR0FBRyxFQUFFO1lBQ2JuaUIsR0FBRyxDQUFDQyxLQUFLLENBQUMsb0RBQW9Ea2lCLEdBQUcsRUFBRSxDQUFDO1VBQ3JFO1FBQ0Q7UUFFQSxNQUFNLElBQUksQ0FBQzlqQixRQUFRLENBQUNnQyxRQUFRLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUNxTCxXQUFXLENBQUMsQ0FBQyxDQUFDaEUsT0FBTyxDQUFFeEosS0FBWSxJQUFLO1VBQzVDLE1BQU1ra0IsV0FBVyxHQUFHbGtCLEtBQUssQ0FBQ3VPLGNBQWMsQ0FBQyxDQUFDO1VBQzFDLE1BQU00VixZQUFZLEdBQUcsSUFBSSxDQUFDN2pCLGdCQUFnQixDQUFDTixLQUFLLENBQUM7VUFFakQsTUFBTW9rQixXQUFXLEdBQUdoZ0IsTUFBTSxDQUFDdkQsSUFBSSxDQUFFcWpCLFdBQVcsRUFBRWhoQixpQkFBaUIsQ0FBQyxDQUFDLEVBQWlDaEMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUNwSCxJQUFJa2pCLFdBQVcsQ0FBQy9jLE1BQU0sQ0FBRWpHLEdBQUcsSUFBSyxDQUFDQSxHQUFHLENBQUNpakIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUN2bkIsTUFBTSxFQUFFO1lBQ2xFNm1CLHlCQUF5QixHQUFHLElBQUk7WUFDaENELG9CQUFvQixDQUFDOVYsSUFBSSxDQUN4QixJQUFJLENBQUN6TixRQUFRLENBQ1hta0IsY0FBYyxDQUFDSCxZQUFZLEVBQUU7Y0FDN0JJLFlBQVksRUFBRXZrQixLQUFLLENBQUN5QixJQUFJLENBQUMsY0FBYyxDQUFDO2NBQ3hDeWlCLFdBQVcsRUFBRUEsV0FBVztjQUN4Qk0sV0FBVyxFQUVSeGtCLEtBQUssQ0FBQ3lMLFNBQVMsQ0FBQyxDQUFDLENBQWNnWixjQUFjLENBQUMsY0FBYyxDQUFDLEVBQzVEN2UsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUk7Y0FDdkM4ZSxlQUFlLEVBQUUsSUFBSSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUNEcmlCLElBQUksQ0FBQyxNQUFNOGhCLFlBQVksQ0FDMUIsQ0FBQztVQUNGO1FBQ0QsQ0FBQyxDQUFDO1FBQ0YsSUFBSVEsY0FBbUM7UUFDdkMsSUFBSW5CLGlCQUFpQixJQUFJLE9BQU9BLGlCQUFpQixLQUFLLFFBQVEsRUFBRTtVQUMvRCxNQUFNb0IsT0FBTyxHQUFJcEIsaUJBQWlCLEVBQW9DempCLFNBQVMsR0FBRyxDQUFDLEVBQUV3Z0IsVUFBVSxHQUFHLENBQUM7VUFDbkdvRSxjQUFjLEdBQUdDLE9BQU8sS0FBSyxNQUFNO1FBQ3BDO1FBQ0EsTUFBTUMsUUFBUSxHQUFHLE1BQU0xUSxPQUFPLENBQUN5RixHQUFHLENBQUM4SixvQkFBb0IsQ0FBQztRQUN4RDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtVQUNILE1BQU0sSUFBSSxDQUFDdmpCLFFBQVEsQ0FBQzJrQixZQUFZLENBQUN4SCxPQUFPLEVBQUU7WUFDekN5SCwwQkFBMEIsRUFBRXBCLHlCQUF5QjtZQUNyRGtCLFFBQVEsRUFBRUEsUUFBeUM7WUFDbkQ5bUIsZUFBZSxFQUFFLElBQUksQ0FBQ0EsZUFBZTtZQUNyQ3lsQixpQkFBaUI7WUFDakJtQixjQUFjO1lBQ2RsQjtVQUNELENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxPQUFPMWhCLEtBQWMsRUFBRTtVQUN4QjtVQUNBO1VBQ0E7VUFDQTtVQUNBLElBQUlBLEtBQUssS0FBS2lqQiw0QkFBNEIsQ0FBQ0MsUUFBUSxFQUFFO1lBQ3BEckIsaUJBQWlCLEdBQUk3aEIsS0FBSyxJQUFlLEVBQUU7VUFDNUM7UUFDRDtNQUNELENBQUMsU0FBUztRQUNULElBQUk2ZixVQUFVLENBQUM3RCxRQUFRLENBQUNlLEtBQUssQ0FBQyxFQUFFO1VBQy9COEMsVUFBVSxDQUFDNUQsTUFBTSxDQUFDYyxLQUFLLENBQUM7UUFDekI7UUFDQSxJQUFJOEUsaUJBQWlCLEtBQUtwb0IsU0FBUyxFQUFFO1VBQ3BDLElBQUlvb0IsaUJBQWlCLENBQUM5bUIsTUFBTSxFQUFFO1lBQzdCZ0YsR0FBRyxDQUFDQyxLQUFLLENBQUM2aEIsaUJBQWlCLENBQUM7VUFDN0I7VUFDQSxJQUFJLENBQUNyaEIsbUJBQW1CLENBQUMsQ0FBQztRQUMzQjtNQUNEO0lBQ0QsQ0FBQztJQUFBcUYsTUFBQSxDQUVLc2QsZUFBZSxHQUFyQixlQUFNQSxlQUFlQSxDQUFDM21CLFdBQXFDLEVBQTJCO01BQ3JGLE1BQU0rZSxPQUFPLEdBQUcsSUFBSSxDQUFDamlCLE9BQU8sQ0FBQyxDQUFDLEVBQUU2SCxpQkFBaUIsQ0FBQyxDQUFDO01BQ25ELE1BQU1paUIsWUFBWSxHQUFHLElBQUksQ0FBQzlwQixPQUFPLENBQUMsQ0FBQyxDQUFDb08sSUFBSSxDQUFDbEwsV0FBVyxDQUFDNG1CLFlBQVksQ0FBdUIsQ0FBQyxDQUFDO01BQzFGLE1BQU1DLG9CQUFvQixHQUFHOVUsVUFBVSxDQUFDOFIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFMWhCLEtBQUssQ0FBQyxDQUFDO01BQ25FLElBQUkya0Isd0JBQXdCLEdBQUcsS0FBSztNQUNwQyxJQUFJLElBQUksQ0FBQy9hLGtCQUFrQixDQUFDdVosc0JBQXNCLENBQUMsQ0FBQyxFQUFFO1FBQ3JELElBQUk7VUFDSCxNQUFNQyxZQUFZLEdBQUcsTUFBTSxJQUFJQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMxb0IsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzJvQixhQUFhLENBQUMsQ0FBQztVQUMxRjtVQUNBLElBQUlGLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDOUI7VUFDRDtVQUNBO1VBQ0EsSUFBSUEsWUFBWSxLQUFLLFdBQVcsRUFBRTtZQUNqQyxJQUFJLENBQUN4WixrQkFBa0IsQ0FBQ0MsVUFBVSxDQUFDLENBQUM7WUFDcEMsTUFBTSxJQUFJLENBQUN3SyxRQUFRLENBQUNDLHVCQUF1QixDQUFDc0ksT0FBTyxDQUFDO1lBQ3BEO1VBQ0Q7VUFDQTtVQUNBLElBQUl3RyxZQUFZLEtBQUssa0JBQWtCLEVBQUU7WUFDeEN1Qix3QkFBd0IsR0FBRyxJQUFJO1VBQ2hDO1FBQ0QsQ0FBQyxDQUFDLE9BQU9wQixHQUFHLEVBQUU7VUFDYm5pQixHQUFHLENBQUNDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztRQUM1QztNQUNEO01BQ0EsTUFBTXVqQixrQkFBa0IsR0FDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQ2pxQixPQUFPLENBQUMsQ0FBQyxDQUFDK0gsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDd0MsV0FBVyxDQUFDMmYsZ0JBQWdCLENBQUNDLGdCQUFnQixDQUFDLElBQzdFLENBQUMsSUFBSSxDQUFDanFCLGlCQUFpQixDQUFDLENBQUMsSUFBSStoQixPQUFPLENBQUMxWCxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxLQUFNO01BQ2hGLE1BQU02ZixXQUFxQixHQUFJQyxhQUE2QixJQUFLO1FBQ2hFO1FBQ0EsSUFBSU4sb0JBQW9CLEtBQUs1cEIsU0FBUyxFQUFFO1VBQ3ZDOFUsVUFBVSxDQUFDeU0sY0FBYyxDQUFDcUksb0JBQW9CLENBQUMsRUFBRXRSLEtBQUssQ0FBQyxDQUFDO1FBQ3pEO1FBQ0EsT0FBTzRSLGFBQWE7TUFDckIsQ0FBQztNQUNELElBQ0UsSUFBSSxDQUFDamIsZUFBZSxDQUFDLENBQUMsRUFBRWlMLDBCQUEwQixDQUFDLENBQUMsRUFBRUMsZUFBZSxDQUFDLENBQUMsRUFBRUMsV0FBVyxFQUFrQkMsT0FBTyxJQUM5R3lQLGtCQUFrQixFQUNqQjtRQUNELE9BQU94UCxLQUFLLENBQUNDLHlDQUF5QyxDQUNyRDBQLFdBQVcsRUFDWHpQLFFBQVEsQ0FBQ25PLFNBQVMsRUFDbEJ5VixPQUFPLEVBQ1AsSUFBSSxFQUNKLEtBQUssRUFDTHhILEtBQUssQ0FBQ0csY0FBYyxDQUFDQyxjQUFjLEVBQ25DLElBQ0QsQ0FBQztNQUNGO01BQ0EsT0FBTyxJQUFJLENBQUMvVixRQUFRLENBQ2xCd2xCLGNBQWMsQ0FBQ3JJLE9BQU8sRUFBRTtRQUFFM1IsT0FBTyxFQUFFd1osWUFBWTtRQUFFUyxrQkFBa0IsRUFBRVA7TUFBeUIsQ0FBQyxDQUFDLENBQ2hHaGpCLElBQUksQ0FBRXFqQixhQUFhLElBQUs7UUFDeEIsT0FBT0QsV0FBVyxDQUFDQyxhQUFhLENBQUM7TUFDbEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUFBOWQsTUFBQSxDQUVLakksY0FBYyxHQUFwQixlQUFNQSxjQUFjQSxDQUFDdEIsUUFBd0IsRUFBaUI7TUFDN0QsT0FBTyxJQUFJLENBQUM4QixRQUFRLENBQUMwbEIsYUFBYSxDQUFDeG5CLFFBQVEsQ0FBQyxDQUFDbUUsS0FBSyxDQUFDLE1BQU07UUFDeEQsSUFBSSxDQUFDRCxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFCO01BQ0QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBcUYsTUFBQSxDQUVEMFEsa0JBQWtCLEdBQWxCLFNBQUFBLGtCQUFrQkEsQ0FBQSxFQUFTO01BQzFCLE1BQU0xUCxXQUFXLEdBQUcsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQyxDQUFDO01BQ3RELE1BQU1pZCxlQUFlLEdBQUdsZCxXQUFXLENBQUNuSCxJQUFJLENBQUMsaUJBQWlCLENBQUM7TUFDM0QsSUFBSXFrQixlQUFlLEtBQUssTUFBTSxJQUFJQSxlQUFlLEtBQUssSUFBSSxFQUFFO1FBQzNELE1BQU16RyxZQUFZLEdBQUc3ZixXQUFXLENBQUNpTCxlQUFlLENBQUMsSUFBSSxDQUFDcFAsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRW1FLFdBQVcsQ0FBQ3VtQix3QkFBd0IsQ0FBQ25kLFdBQVcsRUFBRXlXLFlBQVksQ0FBQztNQUNoRTtJQUNELENBQUM7SUFBQXpYLE1BQUEsQ0FFRG9lLHdCQUF3QixHQUF4QixTQUFBQSx3QkFBd0JBLENBQUNDLGNBQXlCLEVBQUVDLFdBQWlDLEVBQUVDLFNBQW9CLEVBQUVDLFFBQWtCLEVBQVE7TUFDdEksS0FBSyxNQUFNQyxLQUFLLElBQUlKLGNBQWMsRUFBRTtRQUNuQyxJQUFJSyxRQUFRLEdBQUlELEtBQUssQ0FBY3BWLFVBQVUsWUFBWStFLFFBQVEsR0FBSXFRLEtBQUssQ0FBY3BWLFVBQVUsQ0FBQyxDQUFDLEdBQUd6VixTQUFTO1FBQ2hILElBQUk0cUIsUUFBUSxFQUFFO1VBQ2IsSUFBSUUsUUFBUSxFQUFFN0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RDLE1BQU14YixLQUFLLEdBQUdxZCxRQUFRLENBQUM3QixjQUFjLENBQUMsT0FBTyxDQUFjO1lBQzNEeGIsS0FBSyxDQUFDTyxPQUFPLENBQUMsVUFBVThFLElBQWEsRUFBRTtjQUN0QyxJQUFJQSxJQUFJLENBQUMxUCxHQUFHLENBQWEscUJBQXFCLENBQUMsRUFBRTtnQkFDaEQsTUFBTTJuQixZQUFZLEdBQUdqWSxJQUFJLENBQUNrWSxlQUFlLENBQUMsQ0FBQztnQkFDM0NMLFNBQVMsQ0FBQ3ZZLElBQUksQ0FBQzJZLFlBQVksQ0FBQztjQUM3QjtZQUNELENBQUMsQ0FBQztVQUNIO1FBQ0QsQ0FBQyxNQUFNO1VBQ04sSUFBSUQsUUFBUSxJQUFJQSxRQUFRLENBQUMxbkIsR0FBRyxJQUFJMG5CLFFBQVEsQ0FBQzFuQixHQUFHLENBQXFCLGtDQUFrQyxDQUFDLEVBQUU7WUFDckcsTUFBTTZuQixXQUFXLEdBQUdILFFBQVEsQ0FBQ3BhLGNBQWMsWUFBWThKLFFBQVEsR0FBR3NRLFFBQVEsQ0FBQ3BhLGNBQWMsQ0FBQyxDQUFDLEdBQUcxUSxTQUFTO1lBQ3ZHLElBQUlpckIsV0FBVyxJQUFJQSxXQUFXLENBQUMzcEIsTUFBTSxHQUFHLENBQUMsRUFBRTtjQUMxQ3dwQixRQUFRLEdBQUdHLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDMUI7VUFDRDtVQUNBO1VBQ0E7VUFDQSxJQUFJSCxRQUFRLElBQUlBLFFBQVEsQ0FBQzFuQixHQUFHLElBQUkwbkIsUUFBUSxDQUFDMW5CLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSTBuQixRQUFRLENBQUM3a0IsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUU7WUFDM0c2a0IsUUFBUSxHQUFHQSxRQUFRLENBQUM3a0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1VBQzlDO1VBQ0EsSUFBSTZrQixRQUFRLElBQUlBLFFBQVEsQ0FBQzFuQixHQUFHLElBQUkwbkIsUUFBUSxDQUFDMW5CLEdBQUcsQ0FBVyxxQkFBcUIsQ0FBQyxFQUFFO1lBQzlFLE1BQU02bkIsV0FBVyxHQUFHSCxRQUFRLENBQUNyVixVQUFVLFlBQVkrRSxRQUFRLEdBQUdzUSxRQUFRLENBQUNyVixVQUFVLENBQUMsQ0FBQyxHQUFHelYsU0FBUztZQUMvRixJQUFJaXJCLFdBQVcsSUFBSUEsV0FBVyxDQUFDN25CLEdBQUcsSUFBSTZuQixXQUFXLENBQUM3bkIsR0FBRyxDQUFRLGtCQUFrQixDQUFDLEVBQUU7Y0FDakZ1bkIsU0FBUyxDQUFDdlksSUFBSSxDQUFDNlksV0FBVyxDQUFDO1lBQzVCO1VBQ0Q7UUFDRDtNQUNEO0lBQ0QsQ0FBQztJQUFBN2UsTUFBQSxDQUVEMkIsa0JBQWtCLEdBQWxCLFNBQUFBLGtCQUFrQkEsQ0FBQSxFQUEyQjtNQUM1QyxNQUFNWCxXQUFXLEdBQUcsSUFBSSxDQUFDQywyQkFBMkIsQ0FBQyxDQUFDO01BQ3RELElBQUk2SSxZQUFvQyxHQUFHLEVBQUU7TUFDN0M5SSxXQUFXLENBQUNvRSxXQUFXLENBQUMsQ0FBQyxDQUFDeEQsT0FBTyxDQUFDLFVBQVVpSSxRQUEyQixFQUFFO1FBQ3hFQyxZQUFZLEdBQUdBLFlBQVksQ0FBQytGLE1BQU0sQ0FBQ2hHLFFBQVEsQ0FBQ3ZFLGNBQWMsQ0FBQyxDQUFDLENBQUM7TUFDOUQsQ0FBQyxDQUFDO01BQ0YsT0FBT3dFLFlBQVk7SUFDcEIsQ0FBQztJQUFBOUosTUFBQSxDQUVEOGUsYUFBYSxHQUFiLFNBQUFBLGFBQWFBLENBQUEsRUFBc0M7TUFDbEQsSUFBSTFVLE9BQTBDLEdBQUcsRUFBRTtNQUNuRCxJQUFJLENBQUN6SSxrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxVQUFVb0ksV0FBaUMsRUFBRTtRQUM5RUksT0FBTyxHQUFHQSxPQUFPLENBQUN5RixNQUFNLENBQUM3RixXQUFXLENBQUN4RyxTQUFTLENBQUMsQ0FBc0MsQ0FBQztNQUN2RixDQUFDLENBQUM7TUFDRixPQUFPNEcsT0FBTztJQUNmLENBQUM7SUFBQXBLLE1BQUEsQ0FFRDRGLFdBQVcsR0FBWCxTQUFBQSxXQUFXQSxDQUFBLEVBQVk7TUFDdEIsTUFBTWtFLFlBQVksR0FBRyxJQUFJLENBQUNuSSxrQkFBa0IsQ0FBQyxDQUFDO01BQzlDLE1BQU1nRSxPQUFnQixHQUFHLEVBQUU7TUFDM0IsS0FBSyxJQUFJbEksVUFBVSxHQUFHLENBQUMsRUFBRUEsVUFBVSxHQUFHcU0sWUFBWSxDQUFDNVUsTUFBTSxFQUFFdUksVUFBVSxFQUFFLEVBQUU7UUFDeEUsSUFBSSxDQUFDMmdCLHdCQUF3QixDQUFDdFUsWUFBWSxDQUFDck0sVUFBVSxDQUFDLENBQUMrRixTQUFTLENBQUMsQ0FBQyxFQUFFc0csWUFBWSxDQUFDck0sVUFBVSxDQUFDLEVBQUVrSSxPQUFPLENBQUM7UUFDdEcsSUFBSSxDQUFDeVksd0JBQXdCLENBQUN0VSxZQUFZLENBQUNyTSxVQUFVLENBQUMsQ0FBQ2dHLGFBQWEsQ0FBQyxDQUFDLEVBQUVxRyxZQUFZLENBQUNyTSxVQUFVLENBQUMsRUFBRWtJLE9BQU8sQ0FBQztNQUMzRztNQUNBLE9BQU9BLE9BQU87SUFDZixDQUFDO0lBQUEzRixNQUFBLENBRUQrZSxXQUFXLEdBQVgsU0FBQUEsV0FBV0EsQ0FBQSxFQUFZO01BQ3RCLE1BQU1qVixZQUFZLEdBQUcsSUFBSSxDQUFDbkksa0JBQWtCLENBQUMsQ0FBQztNQUM5QyxNQUFNcWQsT0FBZ0IsR0FBRyxFQUFFO01BQzNCLEtBQUssSUFBSXZoQixVQUFVLEdBQUcsQ0FBQyxFQUFFQSxVQUFVLEdBQUdxTSxZQUFZLENBQUM1VSxNQUFNLEVBQUV1SSxVQUFVLEVBQUUsRUFBRTtRQUN4RSxJQUFJLENBQUMyZ0Isd0JBQXdCLENBQUN0VSxZQUFZLENBQUNyTSxVQUFVLENBQUMsQ0FBQytGLFNBQVMsQ0FBQyxDQUFDLEVBQUVzRyxZQUFZLENBQUNyTSxVQUFVLENBQUMsRUFBRXVoQixPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQzVHLElBQUksQ0FBQ1osd0JBQXdCLENBQUN0VSxZQUFZLENBQUNyTSxVQUFVLENBQUMsQ0FBQ2dHLGFBQWEsQ0FBQyxDQUFDLEVBQUVxRyxZQUFZLENBQUNyTSxVQUFVLENBQUMsRUFBRXVoQixPQUFPLEVBQUUsSUFBSSxDQUFDO01BQ2pIO01BQ0EsT0FBT0EsT0FBTztJQUNmLENBQUM7SUFBQWhmLE1BQUEsQ0FFRG9HLGlCQUFpQixHQUFqQixTQUFBQSxpQkFBaUJBLENBQUEsRUFBUztNQUN6QixJQUFJLENBQUMwWSxhQUFhLENBQUMsQ0FBQyxDQUFDbGQsT0FBTyxDQUFDLFVBQVVxZCxNQUF1QyxFQUFRO1FBQ3JGLE1BQU1DLFFBQVEsR0FBR0QsTUFBTSxDQUFDNVYsVUFBVSxZQUFZK0UsUUFBUSxJQUFJNlEsTUFBTSxDQUFDNVYsVUFBVSxDQUFDLENBQUM7UUFDN0UsSUFBSTZWLFFBQVEsSUFBSUEsUUFBUSxDQUFDbG9CLEdBQUcsSUFBSWtvQixRQUFRLENBQUNsb0IsR0FBRyxDQUFxQixrQ0FBa0MsQ0FBQyxFQUFFO1VBQ3JHLElBQUlrb0IsUUFBUSxDQUFDQyxrQkFBa0IsWUFBWS9RLFFBQVEsRUFBRTtZQUNwRDhRLFFBQVEsQ0FBQ0Msa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztVQUMxQztRQUNEO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQW5mLE1BQUEsQ0FNQWpFLG9CQUFvQixHQUFwQixTQUFBQSxvQkFBb0JBLENBQUNxakIsYUFBc0IsRUFBRUMsVUFBa0IsRUFBYTtNQUMzRSxNQUFNQyxZQUFZLEdBQUdGLGFBQWEsQ0FBQzlsQixTQUFTLENBQUMsQ0FBQztNQUM5QyxJQUFJaW1CLGlCQUFpQixHQUFHLENBQUNELFlBQVksQ0FBQztNQUN0QyxJQUFJRixhQUFhLElBQUlDLFVBQVUsRUFBRTtRQUNoQyxJQUFJQyxZQUFZLENBQUNELFVBQVUsQ0FBQyxFQUFFO1VBQzdCRSxpQkFBaUIsR0FBR0QsWUFBWSxDQUFDRCxVQUFVLENBQUM7VUFDNUMsT0FBT0MsWUFBWSxDQUFDRCxVQUFVLENBQUM7VUFDL0JFLGlCQUFpQixDQUFDdlosSUFBSSxDQUFDc1osWUFBWSxDQUFDO1FBQ3JDO01BQ0Q7TUFDQSxPQUFPQyxpQkFBaUI7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0EsT0FIQztJQUFBdmYsTUFBQSxDQUtBd2Ysa0JBQWtCLEdBQWxCLFNBQUFBLGtCQUFrQkEsQ0FBQ0MsUUFBZ0IsRUFBUTtNQUMxQyxJQUFJLElBQUksQ0FBQzdaLFdBQVcsSUFBSSxJQUFJLENBQUNBLFdBQVcsQ0FBQyxDQUFDLENBQUMxUSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3RELE1BQU15USxPQUFPLEdBQUcsSUFBSSxDQUFDQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxLQUFLLE1BQU1jLElBQUksSUFBSWYsT0FBTyxFQUFFO1VBQzNCK1osYUFBYSxDQUFDQyxnQkFBZ0IsQ0FBQ2paLElBQUksRUFBRStZLFFBQVEsQ0FBQztRQUMvQztNQUNEO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQztJQUFBemYsTUFBQSxDQU9BNGYsc0JBQXNCLEdBQXRCLFNBQUFBLHNCQUFzQkEsQ0FDckJDLFlBQXFCLEVBQ3JCQyxZQUE4QixFQUM5QlQsVUFBa0IsRUFDOEM7TUFDaEUsSUFBSVUsV0FBc0IsR0FBRyxFQUFFO1FBQzlCQyxlQUFlLEdBQUcsRUFBRTtRQUNwQnZwQixRQUFRO1FBQ1J3cEIsYUFBcUI7UUFDckJDLFNBQVM7TUFFVixNQUFNQyxTQUFTLEdBQUdOLFlBQVksQ0FBQ2xrQixPQUFPLENBQUMsQ0FBQztNQUN4QyxNQUFNeWtCLFVBQVUsR0FBR1AsWUFBWSxJQUFJQSxZQUFZLENBQUNya0IsUUFBUSxDQUFDLENBQUMsSUFBSXFrQixZQUFZLENBQUNya0IsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsWUFBWSxDQUFDLENBQUM7TUFDcEcsTUFBTTRrQixhQUFhLEdBQUdELFVBQVUsSUFBSUEsVUFBVSxDQUFDMWtCLFdBQVcsQ0FBQ3lrQixTQUFTLENBQUMsQ0FBQ0csT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7O01BRXpGO01BQ0EsSUFBSVIsWUFBWSxJQUFJQSxZQUFZLENBQUM1cUIsTUFBTSxFQUFFO1FBQ3hDdUIsUUFBUSxHQUFHcXBCLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDMUJJLFNBQVMsR0FBR3pwQixRQUFRLENBQUNrRixPQUFPLENBQUMsQ0FBQztRQUM5QnNrQixhQUFhLEdBQUdHLFVBQVUsSUFBSUEsVUFBVSxDQUFDMWtCLFdBQVcsQ0FBQ3drQixTQUFTLENBQUMsQ0FBQ0ksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFFbkZSLFlBQVksQ0FBQ2xlLE9BQU8sQ0FBRTJlLGNBQThCLElBQVc7VUFDOUQsSUFBSWxCLFVBQVUsRUFBRTtZQUNmLE1BQU1FLGlCQUFpQixHQUFHLElBQUksQ0FBQ3hqQixvQkFBb0IsQ0FBQ3drQixjQUFjLEVBQUVsQixVQUFVLENBQUM7WUFDL0UsSUFBSUUsaUJBQWlCLEVBQUU7Y0FDdEJRLFdBQVcsR0FBR1IsaUJBQWlCLENBQUN0akIsR0FBRyxDQUFDLFVBQVV1a0Isb0JBQTZCLEVBQUU7Z0JBQzVFLE9BQU87a0JBQ05DLFdBQVcsRUFBRUQsb0JBQW9CO2tCQUNqQ0UsU0FBUyxFQUFFLEdBQUdMLGFBQWEsSUFBSWhCLFVBQVU7Z0JBQzFDLENBQUM7Y0FDRixDQUFDLENBQUM7WUFDSDtVQUNELENBQUMsTUFBTTtZQUNOVSxXQUFXLENBQUMvWixJQUFJLENBQUM7Y0FDaEJ5YSxXQUFXLEVBQUVGLGNBQWMsQ0FBQ2puQixTQUFTLENBQUMsQ0FBQztjQUN2Q29uQixTQUFTLEVBQUVUO1lBQ1osQ0FBQyxDQUFDO1VBQ0g7UUFDRCxDQUFDLENBQUM7TUFDSDtNQUNBRCxlQUFlLENBQUNoYSxJQUFJLENBQUM7UUFDcEJ5YSxXQUFXLEVBQUVaLFlBQVksQ0FBQ3ZtQixTQUFTLENBQUMsQ0FBQztRQUNyQ29uQixTQUFTLEVBQUVMO01BQ1osQ0FBQyxDQUFDO01BQ0Y7TUFDQUwsZUFBZSxHQUFHLElBQUksQ0FBQzFqQixzQkFBc0IsQ0FBQ3FrQixtQkFBbUIsQ0FBQ1gsZUFBZSxFQUFFSyxhQUFhLENBQUM7TUFDakcsTUFBTU8sWUFBWSxHQUFHaHBCLFdBQVcsQ0FBQ2lwQixnQ0FBZ0MsQ0FBQyxJQUFJQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUVkLGVBQWUsRUFBRSxJQUFJLENBQUN2c0IsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUMxSHNzQixXQUFXLEdBQUcsSUFBSSxDQUFDempCLHNCQUFzQixDQUFDcWtCLG1CQUFtQixDQUFDWixXQUFXLEVBQUVNLGFBQWEsQ0FBQztNQUN6RixPQUFPO1FBQ05VLGdCQUFnQixFQUFFSCxZQUFZO1FBQzlCSSxVQUFVLEVBQUVqQjtNQUNiLENBQUM7SUFDRixDQUFDO0lBQUEvZixNQUFBLENBRURzQixzQkFBc0IsR0FBdEIsU0FBQUEsc0JBQXNCQSxDQUFBLEVBQWE7TUFDbEMsTUFBTTJmLFNBQVMsR0FBRyxJQUFJLENBQUN4dEIsT0FBTyxDQUFDLENBQUMsQ0FBQzJELFdBQVcsQ0FBQyxDQUFDO1FBQzdDOHBCLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxvQkFBb0I7UUFDaERDLGVBQWUsR0FBR0YsZUFBZSxJQUFJMWtCLE1BQU0sQ0FBQ3ZELElBQUksQ0FBQ2lvQixlQUFlLENBQUM7UUFDakVwYixZQUFZLEdBQUcsQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxDQUFDO01BRXJFLElBQUlzYixlQUFlLElBQUlBLGVBQWUsQ0FBQ2xzQixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2xEa3NCLGVBQWUsQ0FBQ3hmLE9BQU8sQ0FBQyxVQUFVeWYsSUFBSSxFQUFFO1VBQ3ZDLE1BQU1DLGNBQWMsR0FBR0osZUFBZSxDQUFDRyxJQUFJLENBQW9DO1VBQy9FLElBQUlDLGNBQWMsQ0FBQ0MsY0FBYyxLQUFLLGFBQWEsRUFBRTtZQUNwRHpiLFlBQVksQ0FBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1VBQ3ZDO1FBQ0QsQ0FBQyxDQUFDO01BQ0g7TUFDQSxPQUFPRixZQUFZO0lBQ3BCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUE5RixNQUFBLENBTUFxSCxxQkFBcUIsR0FBckIsU0FBQUEscUJBQXFCQSxDQUFDcU8sT0FBdUIsRUFBRTFXLGFBQXdCLEVBQUVzSSxXQUE4QixFQUFRO01BQzlHLE1BQU1qUSxTQUFTLEdBQUcsSUFBSSxDQUFDNUQsT0FBTyxDQUFDLENBQUMsQ0FBQzJELFdBQVcsQ0FBQyxDQUFDLENBQUNDLFNBQVM7TUFDeEQsSUFBSUEsU0FBUyxHQUFHLENBQUMsRUFBRTtRQUNsQixNQUFNbXFCLHVCQUF1QixHQUFHeGlCLGFBQWEsQ0FBQ2hCLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztRQUNyRixJQUFJd2pCLHVCQUF1QixFQUFFO1VBQzVCLE1BQU1DLFlBQVksR0FBR0QsdUJBQXVCLENBQUNoYixVQUFVLENBQUMsQ0FBQztVQUN6RCxJQUFJLENBQUNrYixTQUFTLENBQUNDLFVBQVUsQ0FBQ0YsWUFBWSxFQUFFRCx1QkFBdUIsQ0FBQztVQUNoRXhpQixhQUFhLENBQUNKLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUM7UUFDNUQsQ0FBQyxNQUFNLElBQUkwSSxXQUFXLEVBQUU7VUFDdkIsSUFBSSxDQUFDb2EsU0FBUyxDQUFDQyxVQUFVLENBQUNyYSxXQUFXLEVBQUVvTyxPQUFPLENBQUM7UUFDaEQ7TUFDRDtJQUNELENBQUM7SUFBQTFWLE1BQUEsQ0FFRDRWLHlDQUF5QyxHQUF6QyxTQUFBQSx5Q0FBeUNBLENBQUEsRUFBUztNQUNqRCxNQUFNcGYsS0FBSyxHQUFHLElBQUksQ0FBQy9DLE9BQU8sQ0FBQyxDQUFDO01BQzVCLE1BQU1xSyxxQkFBcUIsR0FBR3RILEtBQUssQ0FBQzhFLGlCQUFpQixDQUFDLFVBQVUsQ0FBeUI7TUFDekYsTUFBTXNtQixXQUFXLEdBQUdocUIsV0FBVyxDQUFDaXFCLDZDQUE2QyxDQUM1RXJyQixLQUFLLENBQUNZLFdBQVcsQ0FBQyxDQUFDLEVBQ25CLElBQUksQ0FBQ3lMLGVBQWUsQ0FBQyxDQUFDLENBQUNpZixpQkFBaUIsQ0FBQyxDQUFDLENBQUNDLFlBQVksQ0FBQyxDQUN6RCxDQUFDO01BQ0QsTUFBTUMsY0FBYyxHQUFHLElBQUksQ0FBQ25mLGVBQWUsQ0FBQyxDQUFDLENBQUM2SyxnQkFBZ0IsQ0FBQyxDQUFDO01BQ2hFLE1BQU1tUyxZQUFZLEdBQUdycEIsS0FBSyxJQUFJQSxLQUFLLENBQUM4RSxpQkFBaUIsQ0FBQyxDQUFDO01BQ3ZEd0MscUJBQXFCLENBQUNjLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUM5RCxJQUFJaWhCLFlBQVksRUFBRTtRQUNqQkEsWUFBWSxDQUNWb0MsYUFBYSxDQUFDLENBQUMsQ0FDZnhuQixJQUFJLENBQUMsVUFBVXpCLEtBQWEsRUFBRTtVQUM5QixPQUFPa3BCLFVBQVUsQ0FBQ04sV0FBVyxFQUFFNW9CLEtBQUssQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FDRDRCLEtBQUssQ0FBQyxVQUFVbVcsTUFBZSxFQUFFO1VBQ2pDN1csR0FBRyxDQUFDQyxLQUFLLENBQUMsa0RBQWtELEVBQUU0VyxNQUFnQixDQUFDO1FBQ2hGLENBQUMsQ0FBQztNQUNKOztNQUVBO0FBQ0Y7QUFDQTtNQUNFLFNBQVNvUixTQUFTQSxDQUFDcFIsTUFBYyxFQUFRO1FBQ3hDN1csR0FBRyxDQUFDQyxLQUFLLENBQUM0VyxNQUFNLENBQUM7TUFDbEI7TUFFQSxTQUFTcVIsbUJBQW1CQSxDQUFDQyxFQUFVLEVBQUVDLGVBQTBDLEVBQVE7UUFDMUYsTUFBTUMsT0FBTyxHQUFHRixFQUFFO1FBQ2xCO1FBQ0EsSUFBSUMsZUFBZSxJQUFJQSxlQUFlLENBQUNwdEIsTUFBTSxLQUFLLENBQUMsSUFBSW90QixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUNFLFNBQVMsRUFBRTtVQUNwRjFrQixxQkFBcUIsQ0FBQ2MsV0FBVyxDQUFDLHlCQUF5QjJqQixPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUM7UUFDNUU7TUFDRDs7TUFFQTtBQUNGO0FBQ0E7QUFDQTtNQUNFLFNBQVNMLFVBQVVBLENBQ2xCTyxjQU9DLEVBQ0RDLFNBQWlCLEVBQ1Y7UUFDUCxLQUFLLE1BQU0vaEIsR0FBRyxJQUFJOGhCLGNBQWMsRUFBRTtVQUNqQyxNQUFNRSxVQUFVLEdBQUdGLGNBQWMsQ0FBQzloQixHQUFHLENBQUM7VUFDdEMsTUFBTXRFLE9BQWdDLEdBQUcsQ0FBQyxDQUFDO1VBQzNDLE1BQU11bUIsS0FBSyxHQUFHcHNCLEtBQUssQ0FBQ3FMLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQztVQUM3QixJQUFJLENBQUNpaUIsS0FBSyxFQUFFO1lBQ1g7WUFDQTtVQUNEO1VBQ0EsTUFBTUMsWUFBWSxHQUFHRCxLQUFLLENBQUN0bkIsaUJBQWlCLENBQUMsQ0FBQztVQUM5QyxNQUFNd25CLFNBQWlCLEdBQUdELFlBQVksSUFBSUEsWUFBWSxDQUFDdnBCLFNBQVMsQ0FBQyxDQUFDO1VBQ2xFLElBQUl5cEIsYUFBc0MsR0FBR0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFTixTQUFTLEVBQUVJLFNBQVMsQ0FBNEI7VUFDdkc7VUFDQSxJQUFJSCxVQUFVLENBQUN6bEIscUJBQXFCLEVBQUU7WUFDckMsTUFBTXRCLHNCQUFzQixHQUFHK21CLFVBQVUsQ0FBQ3psQixxQkFBcUI7WUFDL0QsS0FBSyxNQUFNd0osSUFBSSxJQUFJOUssc0JBQXNCLEVBQUU7Y0FDMUMsTUFBTXFuQixRQUFRLEdBQUdybkIsc0JBQXNCLENBQUM4SyxJQUFJLENBQUM7Y0FDN0MsTUFBTXdjLGFBQWEsR0FBR0QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFFLGVBQWUsQ0FBQztjQUNqRSxNQUFNRSxlQUFlLEdBQUdGLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBRTtjQUMzRCxJQUFJQyxhQUFhLEtBQUtDLGVBQWUsRUFBRTtnQkFDdEMsSUFBSUosYUFBYSxDQUFDSyxjQUFjLENBQUNGLGFBQWEsQ0FBQyxFQUFFO2tCQUNoRCxNQUFNRyxXQUFvQyxHQUFHLENBQUMsQ0FBQztrQkFDL0NBLFdBQVcsQ0FBQ0YsZUFBZSxDQUFDLEdBQUdKLGFBQWEsQ0FBQ0csYUFBYSxDQUFDO2tCQUMzREgsYUFBYSxHQUFHQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUVELGFBQWEsRUFBRU0sV0FBVyxDQUE0QjtrQkFDaEYsT0FBT04sYUFBYSxDQUFDRyxhQUFhLENBQUM7Z0JBQ3BDO2NBQ0Q7WUFDRDtVQUNEO1VBRUEsSUFBSUgsYUFBYSxFQUFFO1lBQ2xCLEtBQUssTUFBTTFCLElBQUksSUFBSTBCLGFBQWEsRUFBRTtjQUNqQyxJQUFJLENBQUMxQixJQUFJLENBQUM1RSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzRFLElBQUksQ0FBQzNTLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDN0RyUyxPQUFPLENBQUNnbEIsSUFBSSxDQUFDLEdBQUcwQixhQUFhLENBQUMxQixJQUFJLENBQUM7Y0FDcEM7WUFDRDtVQUNEO1VBQ0E7VUFDQVcsY0FBYyxDQUNac0IscUJBQXFCLENBQUMsQ0FDdEI7WUFDQzFPLE1BQU0sRUFBRTtjQUNQOVgsY0FBYyxFQUFFNmxCLFVBQVUsQ0FBQzdsQixjQUFjO2NBQ3pDQyxNQUFNLEVBQUU0bEIsVUFBVSxDQUFDNWxCO1lBQ3BCLENBQUM7WUFDRHdtQixNQUFNLEVBQUVsbkI7VUFDVCxDQUFDLENBQ0QsQ0FBQyxDQUNENUIsSUFBSSxDQUFFK29CLE1BQU0sSUFBSztZQUNqQixPQUFPcEIsbUJBQW1CLENBQUN6aEIsR0FBRyxFQUFFNmlCLE1BQU0sQ0FBQztVQUN4QyxDQUFDLENBQUMsQ0FDRDVvQixLQUFLLENBQUN1bkIsU0FBUyxDQUFDO1FBQ25CO01BQ0Q7SUFDRCxDQUFDO0lBQUFuaUIsTUFBQSxDQUVEeWpCLG9CQUFvQixHQUFwQixTQUFBQSxvQkFBb0JBLENBQUEsRUFBdUI7TUFDMUMsTUFBTTVhLFVBQVUsR0FBRyxJQUFJLENBQUM1SCwyQkFBMkIsQ0FBQyxDQUFDO01BQ3JELE1BQU15aUIsZUFBZSxHQUFHN2EsVUFBVSxDQUFDTSxjQUFjLENBQUMsQ0FBaUM7TUFDbkYsTUFBTUQsT0FBTyxHQUFHd2EsZUFBZSxFQUFFdGEsVUFBVSxDQUFDLENBQUM7TUFDN0MsSUFBSXVhLGVBQW1DO01BRXZDLEtBQUssTUFBTTVtQixNQUFNLElBQUltTSxPQUFPLEVBQUU7UUFDN0IsSUFBSW5NLE1BQU0sQ0FBQy9GLEdBQUcsQ0FBc0Isc0NBQXNDLENBQUMsRUFBRTtVQUM1RSxNQUFNNHNCLE1BQU0sR0FBRzdtQixNQUFNLENBQUNzTSxVQUFVLENBQUMsQ0FBdUI7VUFDeEQsSUFBSXVhLE1BQU0sSUFBSUEsTUFBTSxDQUFDOXFCLEtBQUssQ0FBQyxDQUFDLENBQUMrcUIsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDN0RGLGVBQWUsR0FBR0MsTUFBTTtZQUN4QjtVQUNEO1FBQ0Q7TUFDRDtNQUVBLE9BQU9ELGVBQWU7SUFDdkI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQTNqQixNQUFBLENBWUFrQyxnQ0FBZ0MsR0FBaEMsU0FBQUEsZ0NBQWdDQSxDQUFBLEVBQVM7TUFDeEMsTUFBTXVWLFlBQVksR0FBRyxJQUFJLENBQUM1VSxlQUFlLENBQUMsQ0FBQztNQUMzQzRVLFlBQVksRUFDVHFNLG9CQUFvQixDQUFDLENBQUMsRUFDdEJycEIsSUFBSSxDQUFFc3BCLGFBQWdDLElBQUs7UUFDNUMsSUFBSSxDQUFDQSxhQUFhLENBQUNDLGVBQWUsSUFBSSxDQUFDRCxhQUFhLENBQUNDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQ3ZILFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtVQUM5RjtRQUNEOztRQUVBO1FBQ0EsTUFBTXBsQixTQUFTLEdBQUcsSUFBSSxDQUFDNUQsT0FBTyxDQUFDLENBQUMsQ0FBQzJELFdBQVcsQ0FBQyxDQUFDLENBQUNDLFNBQVM7UUFDeEQsTUFBTTRzQixvQkFBb0IsR0FDekJGLGFBQWEsQ0FBQ0MsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxDQUFDLEdBQUdFLFFBQVEsQ0FBQ0gsYUFBYSxDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEgsSUFBSUMsS0FBSyxDQUFDSCxvQkFBb0IsQ0FBQyxJQUFJNXNCLFNBQVMsS0FBSzRzQixvQkFBb0IsRUFBRTtVQUN0RTtRQUNEOztRQUVBO1FBQ0EsSUFBSXhNLFlBQVksQ0FBQzRNLHdCQUF3QixDQUFDLENBQUMsS0FBSzN5QixxQkFBcUIsQ0FBQzR5QixVQUFVLEVBQUU7VUFDakY3TSxZQUFZLENBQUM4TSx3QkFBd0IsQ0FBQzd5QixxQkFBcUIsQ0FBQzh5QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxNQUFNO1VBQ047UUFDRDs7UUFFQTtRQUNBLE1BQU1DLGtCQUFrQixHQUFHaE4sWUFBWSxDQUFDM0osMEJBQTBCLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMyVyxrQkFBa0IsRUFBRUMsdUJBQXVCLENBQUNDLGNBQWMsRUFBRTtVQUNoRXpxQixHQUFHLENBQUNDLEtBQUssQ0FBQywwRkFBMEYsQ0FBQztVQUNyRztRQUNEOztRQUVBO1FBQ0EsTUFBTXdwQixlQUFlLEdBQUcsSUFBSSxDQUFDRixvQkFBb0IsQ0FBQyxDQUFDO1FBRW5ELElBQUlFLGVBQWUsSUFBSUEsZUFBZSxDQUFDampCLFVBQVUsQ0FBQyxDQUFDLElBQUlpakIsZUFBZSxDQUFDNXNCLFVBQVUsQ0FBQyxDQUFDLEVBQUU7VUFDcEY0c0IsZUFBZSxDQUFDMXNCLFNBQVMsQ0FBQyxDQUFDO1VBQzNCO1FBQ0QsQ0FBQyxNQUFNO1VBQ05pRCxHQUFHLENBQUNDLEtBQUssQ0FDUix1SEFDRCxDQUFDO1VBQ0Q7UUFDRDtNQUNELENBQUMsQ0FBQyxDQUNEUyxLQUFLLENBQUVULEtBQWMsSUFBSztRQUMxQkQsR0FBRyxDQUFDQyxLQUFLLENBQUMsd0VBQXdFLEVBQUVBLEtBQWUsQ0FBQztNQUNyRyxDQUFDLENBQUM7SUFDSixDQUFDO0lBQUEsT0FBQXZJLG9CQUFBO0VBQUEsRUE1K0RpQ2dULGNBQWMsR0FBQXBQLFdBQUEsR0FBQW92Qix5QkFBQSxDQUFBL3ZCLE9BQUEsQ0FBQW9MLFNBQUEsa0JBQUFsTyxLQUFBO0lBQUE4eUIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUF2dkIsWUFBQSxHQUFBbXZCLHlCQUFBLENBQUEvdkIsT0FBQSxDQUFBb0wsU0FBQSxZQUFBL04sS0FBQTtJQUFBMnlCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBdHZCLFlBQUEsR0FBQWt2Qix5QkFBQSxDQUFBL3ZCLE9BQUEsQ0FBQW9MLFNBQUEsZUFBQTNOLEtBQUE7SUFBQXV5QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQXJ2QixZQUFBLEdBQUFpdkIseUJBQUEsQ0FBQS92QixPQUFBLENBQUFvTCxTQUFBLGdCQUFBeE4sS0FBQTtJQUFBb3lCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBcHZCLFlBQUEsR0FBQWd2Qix5QkFBQSxDQUFBL3ZCLE9BQUEsQ0FBQW9MLFNBQUEscUJBQUFyTixLQUFBO0lBQUFpeUIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFudkIsWUFBQSxHQUFBK3VCLHlCQUFBLENBQUEvdkIsT0FBQSxDQUFBb0wsU0FBQSw0QkFBQWxOLEtBQUE7SUFBQTh4QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQWx2QixZQUFBLEdBQUE4dUIseUJBQUEsQ0FBQS92QixPQUFBLENBQUFvTCxTQUFBLDJCQUFBL00sS0FBQTtJQUFBMnhCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBanZCLFlBQUEsR0FBQTZ1Qix5QkFBQSxDQUFBL3ZCLE9BQUEsQ0FBQW9MLFNBQUEsNkJBQUE1TSxLQUFBO0lBQUF3eEIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFodkIsWUFBQSxHQUFBNHVCLHlCQUFBLENBQUEvdkIsT0FBQSxDQUFBb0wsU0FBQSxnQkFBQXBNLE1BQUE7SUFBQWd4QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQS91QixhQUFBLEdBQUEydUIseUJBQUEsQ0FBQS92QixPQUFBLENBQUFvTCxTQUFBLGdCQUFBak0sTUFBQTtJQUFBNndCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBSix5QkFBQSxDQUFBL3ZCLE9BQUEsQ0FBQW9MLFNBQUEsc0JBQUE5TCxNQUFBLEVBQUFFLE1BQUEsR0FBQW1JLE1BQUEsQ0FBQXlvQix3QkFBQSxDQUFBcHdCLE9BQUEsQ0FBQW9MLFNBQUEsc0JBQUFwTCxPQUFBLENBQUFvTCxTQUFBLEdBQUEya0IseUJBQUEsQ0FBQS92QixPQUFBLENBQUFvTCxTQUFBLGtCQUFBMUwsTUFBQSxFQUFBQyxNQUFBLEdBQUFnSSxNQUFBLENBQUF5b0Isd0JBQUEsQ0FBQXB3QixPQUFBLENBQUFvTCxTQUFBLGtCQUFBcEwsT0FBQSxDQUFBb0wsU0FBQSxHQUFBcEwsT0FBQSxNQUFBRCxNQUFBO0VBQUEsT0EyeEVsQ2hELG9CQUFvQjtBQUFBIiwiaWdub3JlTGlzdCI6W119
2043
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZSIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiX2RlYzMiLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJfZGVjNCIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiX2RlYzUiLCJQYWdpbmF0b3IiLCJQYWdpbmF0b3JPdmVycmlkZSIsIl9kZWM2IiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiX2RlYzciLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIl9kZWM4IiwiQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIiwiX2RlYzkiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiX2RlYzAiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJfZGVjMSIsIlBhZ2VSZWFkeSIsImlzQ29udGV4dEV4cGVjdGVkIiwiX2RlYzEwIiwicHVibGljRXh0ZW5zaW9uIiwiX2RlYzExIiwiZmluYWxFeHRlbnNpb24iLCJfZGVjMTIiLCJfZGVjMTMiLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsIl9jbGFzcyIsIl9jbGFzczIiLCJfUGFnZUNvbnRyb2xsZXIiLCJhcmdzIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIl9kZXNjcmlwdG9yNSIsIl9kZXNjcmlwdG9yNiIsIl9kZXNjcmlwdG9yNyIsIl9kZXNjcmlwdG9yOCIsIl9kZXNjcmlwdG9yOSIsIl9kZXNjcmlwdG9yMCIsImludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXAiLCJtZXJnZVBhdGNoRHJhZnQiLCJza2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUiLCJpc05ld0JpbmRpbmdDb250ZXh0IiwiaGFuZGxlcnMiLCJvblByaW1hcnlBY3Rpb24iLCJvQ29udHJvbGxlciIsIm9WaWV3Iiwib0NvbnRleHQiLCJzQWN0aW9uTmFtZSIsIm1QYXJhbWV0ZXJzIiwibUNvbmRpdGlvbnMiLCJwcmltYXJ5Q2FuZGlkYXRlIiwiX2dldFByaW1hcnlBY3Rpb25TaG9ydGN1dENhbmRpZGF0ZXMiLCJnZXRFbmFibGVkIiwiaXNBIiwiZmlyZVByZXNzIiwiZmlyZURlZmF1bHRBY3Rpb24iLCJpVmlld0xldmVsIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJvbkNhbGxBY3Rpb24iLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwiX2VkaXREb2N1bWVudCIsIkNvbW1vblV0aWxzIiwiZ2V0SXNFZGl0YWJsZSIsIl9zYXZlRG9jdW1lbnQiLCJfYXBwbHlEb2N1bWVudCIsIm9uVGFibGVDb250ZXh0Q2hhbmdlIiwiZXZlbnQiLCJ0YWJsZUFQSSIsImdldFNvdXJjZSIsInRhYmxlIiwiY29udGVudCIsImN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsInRhYmxlQ29udGV4dHMiLCJfZ2V0VGFibGVCaW5kaW5nIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwibGVuZ3RoIiwiYWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJnZXRJZCIsImFjdGlvbkRhdGEiLCJvRGF0YSIsImtleXMiLCJuZXdJdGVtIiwiZmluZCIsInRhYmxlQ29udGV4dCIsInRhYmxlRGF0YSIsImdldE9iamVjdCIsImV2ZXJ5Iiwia2V5IiwiZ2V0SW5kZXgiLCJkaWFsb2ciLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsImRhdGEiLCJhdHRhY2hFdmVudE9uY2UiLCJmb2N1c1JvdyIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZSIsIkxvZyIsImVycm9yIiwibWVzc2FnZUJ1dHRvbiIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJvblRhYmxlQmluZGluZ1VwZGF0ZWQiLCJzeW5jVGFzayIsImludm9rZUFjdGlvbiIsInRoZW4iLCJyZXMiLCJfc2hvd01lc3NhZ2VQb3BvdmVyIiwiY2F0Y2giLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9Tb3VyY2UiLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb250cm9sQ29uZmlnIiwic0NvbGxlY3Rpb25QYXRoIiwiSlNPTiIsInBhcnNlIiwib1RhcmdldEluZm8iLCJvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzTWV0YVBhdGgiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJnZXRTZW1hbnRpY09iamVjdE1hcHBpbmciLCJhTmF2aWdhdGlvbkRhdGEiLCJfZ2V0Q2hhcnRDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm1hcCIsIm9OYXZpZ2F0aW9uRGF0YSIsIm1ldGFQYXRoIiwicGFyYW1ldGVycyIsIm9QYXJhbXMiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0T3V0Ym91bmRQYXJhbXMiLCJPYmplY3QiLCJjdXN0b21EYXRhIiwiZ2V0Q3VzdG9tRGF0YSIsImdldEtleSIsIl9nZXRJbXBsaWNpdFNlbWFudGljT2JqZWN0TWFwcGluZ0ZvckRhdGFQb2ludHMiLCJnZXRWYWx1ZSIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0aW9uQ29udGV4dHMiLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9uTmF2aWdhdGVDaGFuZ2UiLCJvRXZlbnQiLCJiU2VjdGlvbk5hdmlnYXRlZCIsInN1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJ0YXJnZXRTdWJTZWN0aW9uIiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0IiwiZ2V0UHJvcGVydHkiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInZEZXRhaWxDb25maWciLCJvRGV0YWlsQ29uZmlnIiwidGFyZ2V0SWQiLCJzdWJTZWN0aW9uSWQiLCJzZWN0aW9uSWQiLCJjbG9zZUNvbGxhYm9yYXRpb25TdHJpcCIsInNldFByb3BlcnR5IiwiY2xvc2VPUE1lc3NhZ2VTdHJpcCIsInZpZXciLCJiSXNJbkVkaXRNb2RlIiwiaW50ZXJuYWxNb2RlbCIsIm1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0IiwiYmluZENvbnRleHQiLCJfZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0IiwiY29udGV4dEJvdW5kTWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJnZXRQZXJzaXN0ZW50IiwicmVtb3ZlTWVzc2FnZXMiLCJoaWRlTWVzc2FnZSIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwicm9vdCIsIm9ubHlBY3Rpb25hYmxlIiwiZmluZEFnZ3JlZ2F0ZWRPYmplY3RzIiwib2JqZWN0IiwiaXNCdXR0b24iLCJpc01lbnVCdXR0b24iLCJjdHJsIiwiZmxhZyIsImdldFZpc2libGUiLCJzSWQiLCJtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMiLCJFeHRlbnNpb25BUEkiLCJleHRlbnNpb25BUEkiLCJvbkluaXQiLCJvT2JqZWN0UGFnZSIsIl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCIsImdldE93bmVyQ29tcG9uZW50IiwicGFnZSIsInZpc2liaWxpdHkiLCJpdGVtcyIsIl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXciLCJnZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24iLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0IiwiYmluZCIsIl9nZXRBbGxTdWJTZWN0aW9ucyIsImZvckVhY2giLCJieUlkIiwibWVzc2FnZUJpbmRpbmciLCJiaW5kTGlzdCIsImF0dGFjaENoYW5nZSIsIl9mblNob3dPUE1lc3NhZ2UiLCJfaGFuZGxlU21hcnRTdW1tYXJ5U3RhcnR1cEFjdGlvbiIsIm9uRXhpdCIsImRlc3Ryb3kiLCJvTWVzc2FnZVBvcG92ZXIiLCJpc09wZW4iLCJjbG9zZSIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiZGlzY29ubmVjdCIsImRldGFjaENoYW5nZSIsImdldEFwcENvbXBvbmVudCIsImlzU3VzcGVuZGVkIiwibWVzc2FnZXMiLCJfc2hvd01lc3NhZ2VzIiwib1RhYmxlIiwiZ2V0Um93QmluZGluZyIsImNoZWNrU2VjdGlvbnNGb3JOb25SZXNwb25zaXZlVGFibGUiLCJzdWJTZWN0aW9ucyIsImNoYW5nZUNsYXNzRm9yVGFibGVzIiwidmlzaWJsZVN1YlNlY3Rpb24iLCJibG9ja3MiLCJnZXRCbG9ja3MiLCJnZXRNb3JlQmxvY2tzIiwic2VhcmNoVGFibGVJbkJsb2NrIiwidGFibGVUeXBlIiwiZ2V0VHlwZSIsImdldFBhcmVudCIsInRhYmxlQ29udHJvbCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJyb3dDb3VudE1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsImFkZFN0eWxlQ2xhc3MiLCJkZXRhY2hFdmVudCIsImJsb2NrIiwiZ2V0VGFibGVBUEkiLCJtYWluQ29udGVudCIsImdldE1haW5Db250ZW50IiwibWFpbkNvbnRlbnRUYWJsZUFQSSIsInNpZGVDb250ZW50IiwiZ2V0U2lkZUNvbnRlbnQiLCJzaWRlQ29udGVudFRhYmxlQVBJIiwib25CZWZvcmVSZW5kZXJpbmciLCJQYWdlQ29udHJvbGxlciIsImFwcGx5IiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsIkNvbW1vbkhlbHBlciIsInNldE1ldGFNb2RlbCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJnZXRVc2VJY29uVGFiQmFyIiwic2VjdGlvbnMiLCJnZXRTZWN0aW9ucyIsInNlY3Rpb24iLCJnZXRTdWJTZWN0aW9ucyIsIl9vbkJlZm9yZUJpbmRpbmciLCJwZW5kaW5nVGFyZ2V0Q29udHJvbElkIiwidGFyZ2V0Q29udHJvbElkIiwiY3VycmVudENvbnRleHRQYXRoIiwiZ2V0RW50aXR5SWRlbnRpdHkiLCJwYXRoIiwicmVwbGFjZSIsImN1cnJlbnRFbnRpdHlJZCIsInByZXZpb3VzRW50aXR5SWQiLCJwcmV2aW91c0JpbmRpbmdDb250ZXh0UGF0aCIsImFUYWJsZXMiLCJfZmluZFRhYmxlcyIsIm9JbnRlcm5hbE1vZGVsIiwiYUJhdGNoR3JvdXBzIiwib0Zhc3RDcmVhdGlvblJvdyIsInB1c2giLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJfY2xvc2VTaWRlQ29udGVudCIsIm9wQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwic29tZSIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJpdGVtIiwiZ2V0Q3JlYXRpb25Sb3ciLCJzZXRCaW5kaW5nQ29udGV4dCIsImZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiIsImlzRmlyc3RSZW5kZXJpbmciLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2V0U2VsZWN0ZWRTZWN0aW9uIiwiZm5PUFJlbmRlcmluZ0xheW91dCIsImVkaXRhYmxlSGVhZGVyQ29udGVudCIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJhZGRFdmVudERlbGVnYXRlIiwiX2luaXRpYWxpemVQYWdpbmF0aW9uIiwibGlzdEJpbmRpbmciLCJfZGlzYWJsZUJsb2Nrc0JpbmRpbmdzIiwiZGlzY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzIiwid2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyIsIndhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQiLCJwbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJFbmFibGVkIiwic2hvd1BsYWNlaG9sZGVyIiwib05hdkNvbnRhaW5lciIsIm9Db250YWluZXIiLCJlbmFibGVBbmltYXRpb24iLCJvYmplY3RQYWdlTGF5b3V0Iiwic2V0VmlzaWJsZSIsInN1YlNlY3Rpb25zSW5mbyIsImZlIiwib3RoZXJzIiwiZGlzY29ubmVjdFZpc2liaWxpdHlPYnNlcnZlciIsImdldEZpcnN0RWRpdGFibGVJbnB1dCIsImRvbUVkaXRhYmxlRWxlbWVudCIsIl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJVSTVFbGVtZW50IiwiY2xvc2VzdFRvIiwiZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50Iiwib2JqZWN0UGFnZSIsImZvb3RlciIsImdldEZvb3RlciIsImZvb3RlclByaW1hcnlBY3Rpb24iLCJmaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJhY3Rpb25zIiwiZ2V0SGVhZGVyVGl0bGUiLCJnZXRBY3Rpb25zIiwiZ2V0Q29udGVudCIsImFTZWN0aW9ucyIsImJVc2VJY29uVGFiQmFyIiwiaVNraXAiLCJiRWRpdGFibGVIZWFkZXIiLCJmaXJzdFZpc2liaWxpdHlCaW5kaW5nIiwiX2dldGZpcnN0U3ViU2VjdGlvblZpc2liaWxpdHlCaW5kaW5nIiwiaVNlY3Rpb24iLCJvU2VjdGlvbiIsImFTdWJTZWN0aW9ucyIsImlTdWJTZWN0aW9uIiwib1N1YlNlY3Rpb24iLCJkaXNhYmxlQmluZGluZ0NvbnRleHRDb25kaXRpb24iLCJzdWJCbG9jayIsIl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbiIsImFCbG9ja3MiLCJibG9ja0NvbnRyb2wiLCJhRm9ybUNvbnRhaW5lcnMiLCJnZXRGb3JtQ29udGFpbmVycyIsImZvcm1Db250YWluZXIiLCJhRm9ybUVsZW1lbnRzIiwiZ2V0Rm9ybUVsZW1lbnRzIiwiZm9ybUVsZW1lbnQiLCJhRmllbGRzIiwiZ2V0RmllbGRzIiwiZW1wdHlGaWVsZCIsImdldEZpcnN0RW1wdHlSZXF1aXJlZEZpZWxkIiwiZmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJpc0VtcHR5IiwiZ2V0TXVsdGlWYWx1ZUZpZWxkIiwiZ2V0SXRlbXMiLCJ2YWx1ZSIsImRlYnVnIiwiZnJvbVRhYk5hdmlnYXRpb24iLCJvTWFuZGF0b3J5RmllbGQiLCJvRmllbGRUb0ZvY3VzIiwiZ2V0Q29udGVudEVkaXQiLCJmb2N1c0luZm8iLCJnZXRGb2N1c0luZm8iLCJ0YXJnZXRJbmZvIiwic2lsZW50IiwiZ2V0RW5hYmxlU3VnZ2VzdGlvbnMiLCJpc0JvdW5kIiwic2V0RW5hYmxlU3VnZ2VzdGlvbnMiLCJmb2N1cyIsImFsbHN1YlNlY3Rpb25zIiwiY3VycmVudE1vZGVsIiwiZ2V0QmluZGluZ3MiLCJiaW5kaW5nIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYW5kbGVTdWJTZWN0aW9uQ3JlYXRlZCIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdCIsIm1lc3NhZ2VIYW5kbGVyIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwibmF2QmFjayIsImNhbkdvQmFjayIsIndpbmRvdyIsIm5hdmlnYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsIl9yb3V0aW5nIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJjdXJyZW50VVJMIiwiZG9jdW1lbnQiLCJVUkwiLCJnZXRSb3V0ZXJQcm94eSIsImNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJ3YXJuaW5nIiwiaGlkZGVuRHJhZnRFbmFibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJIaWRkZW5EcmFmdCIsImVuYWJsZWQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJoYW5kbGVTZXNzaW9uT2ZmIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwid2l0aG91dENoYW5nZXMiLCJEcmFmdERhdGFMb3NzT3B0aW9ucyIsIkRpc2NhcmQiLCJfb25BZnRlckJpbmRpbmciLCJpbnB1dEJpbmRpbmdDb250ZXh0IiwiUm93UHJlc3MiLCJpbmNsdWRlcyIsInN0b3JlU2libGluZ0NvbnRleHREYXRhIiwic2lkZUVmZmVjdHMiLCJjbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkiLCJiaW5kaW5nQ29udGV4dCIsImFJQk5BY3Rpb25zIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInRhYmxlRGVmaW5pdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiY2xlYXJTZWxlY3Rpb24iLCJvT2JqZWN0UGFnZVRpdGxlIiwiYUlCTkhlYWRlckFjdGlvbnMiLCJjb25jYXQiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9Nb2RlbCIsIm9GaW5hbFVJU3RhdGUiLCJoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMiLCJvQmluZGluZyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsIlRhYmxlSGVscGVyIiwiZW5hYmxlRmFzdENyZWF0aW9uUm93IiwiZ2V0Q29udGV4dCIsImZuSGFuZGxlQ2hhbmdlIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUiLCJfdXBkYXRlUmVsYXRlZEFwcHMiLCJjdXJyZW50QmluZGluZyIsImhhbmRsZVBhdGNoU2VudCIsIlRhYmxlVXRpbHMiLCJ3aGVuQm91bmQiLCJvRXJyb3IiLCJfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsIl91cGRhdGVBdmFpbGFibGVDYXJkcyIsInJlY29tbWVuZGF0aW9ucyIsImNsZWFyUmVjb21tZW5kYXRpb25zIiwiZGlzcGxheUNvbGxhYm9yYXRpb25NZXNzYWdlIiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQiLCJhcHBseUFwcFN0YXRlIiwiZ2V0QXBwU3RhdGVIYW5kbGVyIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsInJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzIiwiaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24iLCJ4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQiLCJjb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCIsImFsbCIsIndhaXRQYWdlUmVhZHkiLCJuYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbiIsInRhcmdldENvbnRyb2wiLCJpc1NlY3Rpb24iLCJ0YXJnZXRTZWN0aW9uSWQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwibmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uIiwicG9sbEZvclNlY3Rpb25TdGFiaWxpdHkiLCJvblJlc2V0RGV0ZWN0ZWQiLCJzZXRUYXJnZXRTdWJTZWN0aW9uIiwidmlld1N0YXRlIiwidXBkYXRlQXBwU3RhdGVEZWJvdW5jZWQiLCJpc0luRWRpdE1vZGUiLCJzdWJTZWN0aW9uSW5mbyIsIndhaXRGb3JBcHBseUFwcHN0YXRlIiwib2JzZXJ2ZUN1cnJlbnRTZWN0aW9uIiwic3Vic2VjdGlvbiIsImZpcmVFdmVudCIsImNhcmRzIiwiY29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlIiwiZ2V0Q29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlIiwiaGFzQ29sbGFib3JhdGlvbk1hbmFnZXJDb25uZWN0ZWQiLCJjb2xsYWJvcmF0aW9uTWFuYWdlciIsImNvbGxlY3RBdmFpbGFibGVDYXJkcyIsImNhcmRPYmplY3QiLCJ1cGRhdGVDYXJkcyIsInBhcmVudEFwcElkIiwiYWRkQ2FyZHNUb0NvbGxhYm9yYXRpb25NYW5hZ2VyIiwic2hhcmVBdmFpbGFibGVDYXJkcyIsImZpbmRFbGVtZW50cyIsImVsZW0iLCJtZXNzYWdlU3RyaXAiLCJlbnRpdHlOYW1lIiwicmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJjb2xsYWJvcmF0aW9uTWVzc2FnZSIsIk1lc3NhZ2UiLCJnZXRUZXh0IiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiSW5mb3JtYXRpb24iLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIm9uUGFnZVJlYWR5Iiwic2V0Rm9jdXMiLCJpc0luRGlzcGxheU1vZGUiLCJvRmlyc3RDbGlja2FibGVFbGVtZW50Iiwib1NlbGVjdGVkU2VjdGlvbiIsImdldEVsZW1lbnRCeUlkIiwiY3R4dCIsIm9CaW5kaW5nQ29udGV4dCIsImJJc1N0aWNreU1vZGUiLCJvQXBwQ29tcG9uZW50IiwiaXNFZGl0YWJsZSIsImZldGNoQW5kQXBwbHlSZWNvbW1lbmRhdGlvbnMiLCJjb250ZXh0IiwiZm9yY2VGb2N1cyIsIl9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwiRGV2aWNlIiwic3VwcG9ydCIsInRvdWNoIiwic2F2ZUJ1dHRvbiIsImF1dG9RdWV1ZVVubG9jayIsImF1dG9RdWV1ZUxvY2siLCJpc0xvY2tlZCIsInVubG9jayIsImRldGFjaEJyb3dzZXJFdmVudCIsImF0dGFjaEJyb3dzZXJFdmVudCIsImxvY2siLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJvT2JqZWN0UGFnZURlc2NyaXB0aW9uIiwiZXh0cmFjdFBhdGhzIiwiYmluZGluZ0luZm8iLCJBcnJheSIsImZyb20iLCJTZXQiLCJwYXJ0cyIsInBhcnQiLCJtb2RlbCIsIkJvb2xlYW4iLCJzdWJ0aXRsZVBhdGhzIiwiZ2V0QmluZGluZ0luZm8iLCJkZXNjcmlwdGlvblBhdGhzIiwicGF0aHNUb1Jlc29sdmUiLCJhcHBDb21wb25lbnQiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJmbkNsZWFyQ2FjaGVUaXRsZSIsImludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlIiwib09iamVjdFBhZ2VDb250ZXh0IiwiYnVpbGQiLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsImRlc2NyaXB0aW9uIiwicCIsInJlcXVlc3RQcm9wZXJ0eSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsImlzSGlkZGVuRHJhZnRFbmFibGVkIiwib01lc3NhZ2UiLCJpc0Vycm9yTWVzc2FnZSIsInZhbGlkYXRpb24iLCJtZXNzYWdlVmFsaWRhdGlvbiIsImlzRWRpdE1vZGUiLCJjdXJyZW50UGFnZVZpZXciLCJpc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RWaWV3IiwiZ2V0Um9vdENvbnRhaW5lciIsImdldEN1cnJlbnRQYWdlIiwib01lc3NhZ2VCdXR0b24iLCJvSXRlbUJpbmRpbmciLCJnZXRMZW5ndGgiLCJvcGVuQnkiLCJCdXN5TG9ja2VyIiwiZWRpdERvY3VtZW50IiwiZmluYWxseSIsInByb3BlcnR5UGF0aCIsIkxvY2FsUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiU2VtYW50aWNPYmplY3RQcm9wZXJ0eSIsIl92YWxpZGF0ZURvY3VtZW50IiwiZ2V0QWN0aXZlRWxlbWVudCIsImJ5UGFzc1NpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJjcmVhdGVkIiwiaG9sZE1lc3NhZ2VzRm9yQ29udHJvbCIsInJldCIsImV4ZWN1dGVHbG9iYWxWYWxpZGF0aW9uIiwic2hvd01lc3NhZ2VzIiwic2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsImdsb2JhbFNpZGVFZmZlY3RzIiwiZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImRyYWZ0Um9vdENvbnRleHQiLCJjcmVhdGVSb290Q29udGV4dCIsIkRyYWZ0IiwiZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbiIsImlzQ29ubmVjdGVkIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJ1c2VTYXZlQW5kTGVhdmUiLCJhd2FpdENyZWF0ZURvY3VtZW50cyIsImV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJtZXNzYWdlUG9wb3ZlckVyciIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJkaWFsb2dBY3Rpb24iLCJDb2xsYWJvcmF0aW9uRGlzY2FyZCIsImdldFVzZXJBY3Rpb24iLCJlcnIiLCJjcmVhdGlvblJvdyIsInRhYmxlQmluZGluZyIsImNvbnRleHRLZXlzIiwic3RhcnRzV2l0aCIsImNyZWF0ZURvY3VtZW50IiwiY3JlYXRlQXRFbmQiLCJnZXRBZ2dyZWdhdGlvbiIsInNraXBTaWRlRWZmZWN0cyIsImlzU3RhbmRhcmRTYXZlIiwiY29tbWFuZCIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29udGludWUiLCJfY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJsYXN0Rm9jdXNlZENvbnRyb2xJZCIsInNob3VsZFNraXBEaXNjYXJkUG9wb3ZlciIsImlzRG9jdW1lbnRNb2RpZmllZCIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiYWZ0ZXJDYW5jZWwiLCJwcm9taXNlUmVzdWx0IiwiY2FuY2VsRG9jdW1lbnQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJhcHBseURvY3VtZW50Iiwic2hvd1JlbGF0ZWRBcHBzIiwidXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwiX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uIiwiYVBhcmVudEVsZW1lbnQiLCJhU3Vic2VjdGlvbiIsImFDb250cm9scyIsImJJc0NoYXJ0IiwiaXRlbTEiLCJvRWxlbWVudCIsImNoYXJ0Q29udHJvbCIsImdldENoYXJ0Q29udHJvbCIsIm9TdWJFbGVtZW50IiwiX2dldEFsbEJsb2NrcyIsIl9maW5kQ2hhcnRzIiwiYUNoYXJ0cyIsIm9CbG9jayIsIm9Db250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50Iiwib0NoYXJ0Q29udGV4dCIsInNDaGFydFBhdGgiLCJvQ29udGV4dERhdGEiLCJvQ2hhcnRDb250ZXh0RGF0YSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfbWVyZ2VNdWx0aXBsZUNvbnRleHRzIiwib1BhZ2VDb250ZXh0IiwiYUxpbmVDb250ZXh0IiwiYUF0dHJpYnV0ZXMiLCJhUGFnZUF0dHJpYnV0ZXMiLCJzTWV0YVBhdGhMaW5lIiwic1BhdGhMaW5lIiwic1BhZ2VQYXRoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aFBhZ2UiLCJvU2luZ2xlQ29udGV4dCIsIm9TdWJDaGFydENvbnRleHREYXRhIiwiY29udGV4dERhdGEiLCJlbnRpdHlTZXQiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib1BhZ2VMZXZlbFNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsImF0dHJpYnV0ZXMiLCJvVmlld0RhdGEiLCJvQ29uZmlndXJhdGlvbnMiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImFDb25maWd1cmF0aW9ucyIsInNLZXkiLCJvQ29uZmlndXJhdGlvbiIsInJlcXVlc3RHcm91cElkIiwicGFnaW5hdG9yQ3VycmVudENvbnRleHQiLCJiaW5kaW5nVG9Vc2UiLCJwYWdpbmF0b3IiLCJpbml0aWFsaXplIiwib0RhdGFQb2ludHMiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9TaGVsbFNlcnZpY2VzIiwicmVxdWVzdE9iamVjdCIsImZuR2V0TGlua3MiLCJmbk9uRXJyb3IiLCJmblNldExpbmtFbmFibGVtZW50IiwiaWQiLCJhU3VwcG9ydGVkTGlua3MiLCJzTGlua0lkIiwic3VwcG9ydGVkIiwib1N1YkRhdGFQb2ludHMiLCJvUGFnZURhdGEiLCJvRGF0YVBvaW50Iiwib0xpbmsiLCJvTGlua0NvbnRleHQiLCJvTGlua0RhdGEiLCJvTWl4ZWRDb250ZXh0IiwibWVyZ2UiLCJvTWFwcGluZyIsInNNYWluUHJvcGVydHkiLCJzTWFwcGVkUHJvcGVydHkiLCJoYXNPd25Qcm9wZXJ0eSIsIm9OZXdNYXBwaW5nIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwicGFyYW1zIiwiYUxpbmtzIiwiX2ZpbmRTdW1tYXJpemVCdXR0b24iLCJvYmplY3RQYWdlVGl0bGUiLCJzdW1tYXJpemVCdXR0b24iLCJidXR0b24iLCJlbmRzV2l0aCIsImdldFN0YXJ0dXBQYXJhbWV0ZXJzIiwic3RhcnR1cFBhcmFtcyIsInByZWZlcnJlZEFjdGlvbiIsInByZWZlcnJlZEFjdGlvbkxldmVsIiwicGFyc2VJbnQiLCJzcGxpdCIsImlzTmFOIiwiZ2V0UHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiQ2FuUGVyZm9ybSIsInNldFByZWZlcnJlZEFjdGlvblN0YXR1cyIsIkFscmVhZHlQZXJmb3JtZWQiLCJlbnZpcm9ubWVudFNlcnZpY2UiLCJlbnZpcm9ubWVudENhcGFiaWxpdGllcyIsIlNtYXJ0U3VtbWFyaXplIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXJ0dXBQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2VSZWFkeSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnZVJlYWR5XCI7XG5pbXBvcnQgUGFnaW5hdG9yIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdpbmF0b3JcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IENvbGxhYm9yYXRpb25NYW5hZ2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jYXJkcy9Db2xsYWJvcmF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBDb21tYW5kRXhlY3V0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9Db21tYW5kRXhlY3V0aW9uXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQsIE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHsgdHlwZSBXcmFwcGVkQ2FyZCB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Db2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBDaGFydEJsb2NrIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NoYXJ0XCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWFjcm9BUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvTWFjcm9BUElcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEJsb2NrIGZyb20gXCJzYXAvZmUvbWFjcm9zL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCB0eXBlIEVhc3lGaWxsQnV0dG9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL2FpL0Vhc3lGaWxsQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBTdW1tYXJpemF0aW9uQnV0dG9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL2FpL1N1bW1hcml6YXRpb25CdXR0b25cIjtcbmltcG9ydCB0eXBlIFN1YlNlY3Rpb24gZnJvbSBcInNhcC9mZS9tYWNyb3MvY29udHJvbHMvc2VjdGlvbi9TdWJTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBGb3JtQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm0vRm9ybUFQSVwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9tZXNzYWdlcy9NZXNzYWdlQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBTaGFyZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9zaGFyZS9TaGFyZUFQSVwiO1xuaW1wb3J0IHR5cGUgVGFibGVDcmVhdGlvbk9wdGlvbnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVDcmVhdGlvbk9wdGlvbnNcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEV4dGVuc2lvbkFQSSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgQ29sbGFib3JhdGlvbkRpc2NhcmQgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9jb21wb25lbnRzL0NvbGxhYm9yYXRpb25EaXNjYXJkRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBTdWJTZWN0aW9uQmxvY2sgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9jb250cm9scy9TdWJTZWN0aW9uQmxvY2tcIjtcbmltcG9ydCB7IHBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5IH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9oZWxwZXJzL1NlY3Rpb25OYXZpZ2F0aW9uSGVscGVyXCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgSW5wdXRCYXNlIGZyb20gXCJzYXAvbS9JbnB1dEJhc2VcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCB0eXBlIFNlYXJjaEZpZWxkIGZyb20gXCJzYXAvbS9TZWFyY2hGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVG9vbGJhclNwYWNlciBmcm9tIFwic2FwL20vVG9vbGJhclNwYWNlclwiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbW1hbmRFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIEN1c3RvbURhdGEgZnJvbSBcInNhcC91aS9jb3JlL0N1c3RvbURhdGFcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0T3V0Ym91bmRFbnRyeSB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBEeW5hbWljU2lkZUNvbnRlbnQgZnJvbSBcInNhcC91aS9sYXlvdXQvRHluYW1pY1NpZGVDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBGb3JtIGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybVwiO1xuaW1wb3J0IHR5cGUgQ2hhcnQgZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBUYWJsZVR5cGVCYXNlIGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL1RhYmxlVHlwZUJhc2VcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb21wb3NpdGVCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQ29tcG9zaXRlQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIExpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBDb2xsYWJvcmF0aW9uRHJhZnQgZnJvbSBcIi4vY29tcG9uZW50cy9Db2xsYWJvcmF0aW9uRHJhZnRcIjtcbmltcG9ydCBDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9Db2xsYWJvcmF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdpbmF0b3JPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuZXhwb3J0IHR5cGUgQmluZGluZ1BhcmFtcyA9IHtcblx0cmVkaXJlY3RlZFRvTm9uRHJhZnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHJlYXNvbj86IE5hdmlnYXRpb25SZWFzb247XG5cdGJQZXJzaXN0T1BTY3JvbGw/OiBib29sZWFuO1xuXHRsaXN0QmluZGluZz86IE9EYXRhTGlzdEJpbmRpbmc7XG5cdHNob3dQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cdHJlcXVlc3RPbkJpbmRpbmc/OiBzdHJpbmdbXTtcblx0dGFyZ2V0Q29udHJvbElkPzogc3RyaW5nO1xufTtcblxuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuY29uc3QgUHJlZmVycmVkQWN0aW9uU3RhdHVzID0gRkVMaWJyYXJ5LlByZWZlcnJlZEFjdGlvblN0YXR1c1R5cGU7XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIilcbmNsYXNzIE9iamVjdFBhZ2VDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRvVmlldyE6IEZFVmlldztcblxuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdHBsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKEludGVybmFsUm91dGluZ092ZXJyaWRlKSlcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFBhZ2luYXRvci5vdmVycmlkZShQYWdpbmF0b3JPdmVycmlkZSkpXG5cdHBhZ2luYXRvciE6IFBhZ2luYXRvcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oTWVzc2FnZUhhbmRsZXIub3ZlcnJpZGUoTWVzc2FnZUhhbmRsZXJPdmVycmlkZSkpXG5cdG1lc3NhZ2VIYW5kbGVyITogTWVzc2FnZUhhbmRsZXI7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oQ29sbGFib3JhdGlvbk1hbmFnZXIub3ZlcnJpZGUoQ29sbGFib3JhdGlvbk1hbmFnZXJPdmVycmlkZSkpXG5cdGNvbGxhYm9yYXRpb25NYW5hZ2VyITogQ29sbGFib3JhdGlvbk1hbmFnZXI7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldE5hdmlnYXRpb25Nb2RlOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgYklzU3RpY2t5RWRpdE1vZGUgPVxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlICYmXG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUoKTtcblx0XHRcdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlID8gXCJleHBsYWNlXCIgOiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdFBhZ2VSZWFkeS5vdmVycmlkZSh7XG5cdFx0XHRpc0NvbnRleHRFeHBlY3RlZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdHBhZ2VSZWFkeSE6IFBhZ2VSZWFkeTtcblxuXHRwcml2YXRlIG1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcz86IFJlY29yZDxzdHJpbmcsIE9iamVjdFBhZ2VFeHRlbnNpb25BUEk+O1xuXG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXG5cdHByaXZhdGUgYlNlY3Rpb25OYXZpZ2F0ZWQ/OiBib29sZWFuO1xuXG5cdHByaXZhdGUgaW52YWxpZGF0ZVRpdGxlSGllcmFyY2h5Q2FjaGVTZXRVcCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyPzogUG9wb3ZlcjtcblxuXHRwcml2YXRlIGN1cnJlbnRCaW5kaW5nPzogQmluZGluZztcblxuXHRwcml2YXRlIG1lc3NhZ2VCdXR0b24hOiBNZXNzYWdlQnV0dG9uO1xuXG5cdHByaXZhdGUgY29sbGFib3JhdGlvbk1lc3NhZ2U/OiBNZXNzYWdlO1xuXG5cdHByaXZhdGUgbWVyZ2VQYXRjaERyYWZ0ID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBhdXRvUXVldWVMb2NrOiBSZXR1cm5UeXBlPE9EYXRhTW9kZWxbXCJsb2NrXCJdPiB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIG1lc3NhZ2VCaW5kaW5nPzogQmluZGluZztcblxuXHRwcml2YXRlIHdhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MhOiBQcm9taXNlPHVua25vd24+W107XG5cblx0cHJpdmF0ZSBzdWJTZWN0aW9ucz86IHsgZmU6IFN1YlNlY3Rpb25bXTsgb3RoZXJzOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdIH07XG5cblx0cHJpdmF0ZSBwcmV2aW91c0JpbmRpbmdDb250ZXh0UGF0aD86IHN0cmluZztcblxuXHRwcml2YXRlIHBlbmRpbmdUYXJnZXRDb250cm9sSWQ/OiBzdHJpbmc7XG5cblx0cHJpdmF0ZSB0YXJnZXRTdWJTZWN0aW9uPzogT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cblx0Ly8gRmxhZyB0byBwcmV2ZW50IFZpZXdTdGF0ZS5hcHBseSgpIGZyb20gb3ZlcnJpZGluZyBzZWN0aW9uIHNlbGVjdGlvbiBhZnRlciB1c2VyIGludGVyYWN0aW9uIG9yIHRhcmdldENvbnRyb2xJZCBuYXZpZ2F0aW9uXG5cdHByaXZhdGUgc2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlID0gZmFsc2U7XG5cblx0Ly8gVHJhY2tzIGlmIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0aCBjaGFuZ2VkIChuZXcgZW50aXR5IHZzIHNhbWUgZW50aXR5IHJlLWJpbmRpbmcpXG5cdHByaXZhdGUgaXNOZXdCaW5kaW5nQ29udGV4dCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbnRyb2xzIChCdXR0b24gLyBNZW51QnV0dG9uKSB0aGF0IGFyZSBtYXJrZWQgYXMgXCJwcmltYXJ5IGFjdGlvblwiLlxuXHQgKiBUaGUgbWFya2VyIGlzIHNldCBieSB0aGUgY29udmVydGVycyB3aGVuIGFuIGFjdGlvbiBpcyBlbXBoYXNpemVkIChhbm5vdGF0aW9uLWJhc2VkKSBvclxuXHQgKiBjb25maWd1cmVkIGFzIHByaW1hcnlBY3Rpb24gKGN1c3RvbSBhY3Rpb24gZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpLlxuXHQgKiBAcGFyYW0gcm9vdCBSb290IGNvbnRyb2wgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tXG5cdCAqIEBwYXJhbSBvbmx5QWN0aW9uYWJsZSBJZiB0cnVlLCBvbmx5IGFjdGlvbmFibGUgKGVuYWJsZWQpIGNhbmRpZGF0ZXMgYXJlIHJldHVybmVkXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGNhbmRpZGF0ZXMgZm9yIHByaW1hcnkgYWN0aW9uIHNob3J0Y3V0c1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhyb290OiBNYW5hZ2VkT2JqZWN0LCBvbmx5QWN0aW9uYWJsZSA9IGZhbHNlKTogQXJyYXk8QnV0dG9uIHwgTWVudUJ1dHRvbj4ge1xuXHRcdHJldHVybiByb290LmZpbmRBZ2dyZWdhdGVkT2JqZWN0cyh0cnVlLCAob2JqZWN0OiBNYW5hZ2VkT2JqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBpc0J1dHRvbiA9IG9iamVjdC5pc0EoXCJzYXAubS5CdXR0b25cIik7XG5cdFx0XHRjb25zdCBpc01lbnVCdXR0b24gPSBvYmplY3QuaXNBKFwic2FwLm0uTWVudUJ1dHRvblwiKTtcblx0XHRcdGlmICghaXNCdXR0b24gJiYgIWlzTWVudUJ1dHRvbikge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjdHJsID0gb2JqZWN0IGFzIEJ1dHRvbiB8IE1lbnVCdXR0b247XG5cdFx0XHRjb25zdCBmbGFnID0gY3RybFxuXHRcdFx0XHQuZ2V0Q3VzdG9tRGF0YSgpXG5cdFx0XHRcdC5maW5kKChjdXN0b21EYXRhOiBDdXN0b21EYXRhKSA9PiBjdXN0b21EYXRhLmdldEtleSgpID09PSBcImZlUHJpbWFyeUFjdGlvblNob3J0Y3V0XCIpXG5cdFx0XHRcdD8uZ2V0VmFsdWUoKTtcblx0XHRcdGlmIChmbGFnICE9PSB0cnVlICYmIGZsYWcgIT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmICghY3RybC5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRm9yIGZvY3VzIHBsYWNlbWVudCB3ZSBtdXN0IGlnbm9yZSBkaXNhYmxlZCBjYW5kaWRhdGVzLlxuXHRcdFx0cmV0dXJuIG9ubHlBY3Rpb25hYmxlID8gY3RybC5nZXRFbmFibGVkKCkgOiB0cnVlO1xuXHRcdH0pIGFzIEFycmF5PEJ1dHRvbiB8IE1lbnVCdXR0b24+O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSShzSWQ/OiBzdHJpbmcpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmIChzSWQpIHtcblx0XHRcdC8vIHRvIGFsbG93IGxvY2FsIElEIHVzYWdlIGZvciBjdXN0b20gcGFnZXMgd2UnbGwgY3JlYXRlL3JldHVybiBvd24gaW5zdGFuY2VzIGZvciBjdXN0b20gc2VjdGlvbnNcblx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzID0gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgfHwge307XG5cblx0XHRcdGlmICghdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzLCBzSWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHRcdH1cblx0fVxuXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHRzdXBlci5vbkluaXQoKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHQvLyBTZXR0aW5nIGRlZmF1bHRzIG9mIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IHBhZ2U6IHRydWUgfSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFxuXHRcdFx0XCJyZWxhdGVkQXBwc1wiLFxuXHRcdFx0e1xuXHRcdFx0XHR2aXNpYmlsaXR5OiBmYWxzZSxcblx0XHRcdFx0aXRlbXM6IG51bGxcblx0XHRcdH0sXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIiwgdGhpcy5fZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cblx0XHRpZiAodGhpcy5nZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKSkge1xuXHRcdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnQoXCJzdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0XCIsIHRoaXMuX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQuYmluZCh0aGlzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4ge1xuXHRcdFx0XHRzdWJTZWN0aW9uLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpGb290ZXJCYXI6Ok1lc3NhZ2VCdXR0b25cIikgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHR0aGlzLm1lc3NhZ2VCaW5kaW5nID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmJpbmRMaXN0KFwiL1wiKTtcblx0XHR0aGlzLm1lc3NhZ2VCaW5kaW5nPy5hdHRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicm9vdEVkaXRFbmFibGVkXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcInJvb3RFZGl0VmlzaWJsZVwiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0dGhpcy5faGFuZGxlU21hcnRTdW1tYXJ5U3RhcnR1cEFjdGlvbigpO1xuXHR9XG5cblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgb2YgT2JqZWN0LmtleXModGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpKSB7XG5cdFx0XHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXS5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcztcblx0XHR9XG5cdFx0aWYgKHRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblxuXHRcdGNvbnN0IG9NZXNzYWdlUG9wb3ZlciA9IHRoaXMubWVzc2FnZUJ1dHRvbiA/IHRoaXMubWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIgOiBudWxsO1xuXHRcdGlmIChvTWVzc2FnZVBvcG92ZXIgJiYgb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIuY2xvc2UoKTtcblx0XHR9XG5cdFx0Ly93aGVuIGV4aXRpbmcgd2Ugc2V0IGtlZXBBbGl2ZSBjb250ZXh0IHRvIGZhbHNlXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTsgLy8gQ2xlYW51cCBjb2xsYWJvcmF0aW9uIGNvbm5lY3Rpb24gd2hlbiBsZWF2aW5nIHRoZSBhcHBcblxuXHRcdHRoaXMubWVzc2FnZUJpbmRpbmc/LmRldGFjaENoYW5nZSh0aGlzLl9mblNob3dPUE1lc3NhZ2UsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBtZXNzYWdlIHN0cmlwIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICpcblx0ICovXG5cdF9mblNob3dPUE1lc3NhZ2UoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0Ly8gSWYgdGhlIGFwcCBpcyBzdXNwZW5kZWQsIHdlIGRvIG5vdCBzaG93IHRoZSBtZXNzYWdlcyAodGhlIE1lc3NhZ2VNb2RlbCBjb250YWlucyBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgYXBwKS5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBleHRlbnNpb25BUEkgPSB0aGlzLmdldEV4dGVuc2lvbkFQSSgpO1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZz8uZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSkge1xuXHRcdFx0ZXh0ZW5zaW9uQVBJLl9zaG93TWVzc2FnZXMobWVzc2FnZXMsIFwiQmFja2VuZFwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0VGFibGVCaW5kaW5nKG9UYWJsZTogVGFibGUpOiBPRGF0YUxpc3RCaW5kaW5nIHtcblx0XHRyZXR1cm4gb1RhYmxlICYmIG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoZSBzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXIgQ1NTIGNsYXNzIHRvIGV2ZXJ5IHZpc2libGUgc3Vic2VjdGlvbiB0aGF0IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgR3JpZFRhYmxlIG9yIFRyZWVUYWJsZS5cblx0ICogVGhpcyBtYWtlcyB0aGUgdGFibGUgZmlsbCB0aGUgZnVsbCBoZWlnaHQgb2YgaXRzIGNvbnRhaW5lciBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgYXBwZWFycyBvbiB0aGUgdGFibGUgaXRzZWxmIHJhdGhlciB0aGFuIG9uIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc3ViU2VjdGlvbnMgVGhlIHN1YiBzZWN0aW9ucyB0byBsb29rIGZvclxuXHQgKi9cblx0cHJpdmF0ZSBjaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlKHN1YlNlY3Rpb25zOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hhbmdlQ2xhc3NGb3JUYWJsZXMgPSAoZXZlbnQ6IEV2ZW50LCB2aXNpYmxlU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGJsb2NrcyA9IFsuLi52aXNpYmxlU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSwgLi4udmlzaWJsZVN1YlNlY3Rpb24uZ2V0TW9yZUJsb2NrcygpXTtcblx0XHRcdGlmIChibG9ja3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlID0gdGhpcy5zZWFyY2hUYWJsZUluQmxvY2soYmxvY2tzWzBdIGFzIFN1YlNlY3Rpb25CbG9jayk7XG5cdFx0XHRcdGlmICghdGFibGUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGFibGVUeXBlID0gdGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiYgKHRhYmxlLmdldFR5cGUoKSBhcyBUYWJsZVR5cGVCYXNlKTtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKT8uaXNBPFRhYmxlQVBJPihcInNhcC5mZS5tYWNyb3MuVGFibGVcIikgPyAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCB0YWJsZUNvbnRyb2wgPSB0YWJsZUFQST8uZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbDtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVUeXBlICYmXG5cdFx0XHRcdFx0KHRhYmxlVHlwZT8uaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpIHx8IHRhYmxlVHlwZT8uaXNBKFwic2FwLnVpLm1kYy50YWJsZS5UcmVlVGFibGVUeXBlXCIpKSAmJlxuXHRcdFx0XHRcdHRhYmxlQ29udHJvbD8ucm93Q291bnRNb2RlID09PSBcIkF1dG9cIiAmJlxuXHRcdFx0XHRcdC8vIEV4Y2x1ZGUgQ3JlYXRpb25Sb3cgbW9kZSB1bmxlc3Mgc2VjdGlvbkxheW91dCBpcyBUYWJzOiB0aGUgZml0LWNvbnRhaW5lciBzdHlsZSBjcmVhdGVzIHdoaXRlc3BhY2UgaW4gdGhlIHN1YnNlY3Rpb24gaW4gZWRpdCBtb2RlIHdoZW4gQ3JlYXRpb25Sb3cgaXMgdXNlZCBpbiBUYWJsZUNyZWF0aW9uT3B0aW9uc1xuXHRcdFx0XHRcdCh0YWJsZUNvbnRyb2w/LmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuc2VjdGlvbkxheW91dCA9PT0gXCJUYWJzXCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vSW4gY2FzZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhYmxlIGluIGEgc3ViU2VjdGlvbiB3ZSBmaXQgdGhhdCB0byB0aGUgd2hvbGUgcGFnZSBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY29tZXMgb25seSBvbiB0YWJsZSBhbmQgbm90IG9uIHBhZ2Vcblx0XHRcdFx0XHR2aXNpYmxlU3ViU2VjdGlvbi5hZGRTdHlsZUNsYXNzKFwic2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyXCIpO1xuXHRcdFx0XHRcdHZpc2libGVTdWJTZWN0aW9uLmRldGFjaEV2ZW50KFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBzdWJTZWN0aW9uIG9mIHN1YlNlY3Rpb25zKSB7XG5cdFx0XHRpZiAoc3ViU2VjdGlvbi5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhdHRhY2ggdGhpcyBldmVudCBpbiBvcmRlciB0byBtYW5hZ2UgdGhlIE9iamVjdCBQYWdlIExhenkgTG9hZGluZyBtZWNoYW5pc21cblx0XHRcdFx0c3ViU2VjdGlvbi5hdHRhY2hFdmVudChcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBzdWJTZWN0aW9uLCBjaGFuZ2VDbGFzc0ZvclRhYmxlcywgdGhpcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgYSB0YWJsZSBpbiBibG9ja3Mgb2Ygc2VjdGlvbi5cblx0ICogQHBhcmFtIGJsb2NrIE9uZSBzdWIgc2VjdGlvbiBibG9ja1xuXHQgKiBAcmV0dXJucyBUYWJsZSBpZiBleGlzdHNcblx0ICovXG5cdHByaXZhdGUgc2VhcmNoVGFibGVJbkJsb2NrKGJsb2NrOiBTdWJTZWN0aW9uQmxvY2spOiBUYWJsZSB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IHRhYmxlQVBJOiBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBnZXRUYWJsZUFQSSA9IChjb250cm9sOiBDb250cm9sKTogVGFibGVBUEkgfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0Ly8gVGhlIHRhYmxlIG1heSBjdXJyZW50bHkgYmUgc2hvd24gaW4gYSBmdWxsIHNjcmVlbiBkaWFsb2csIHdlIGNhbiB0aGVuIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYWJsZUFQSVxuXHRcdFx0Ly8gY29udHJvbCBmcm9tIHRoZSBjdXN0b20gZGF0YSBvZiB0aGUgcGxhY2UgaG9sZGVyIHBhbmVsXG5cdFx0XHRpZiAoY29udHJvbC5pc0EoXCJzYXAubS5QYW5lbFwiKSAmJiBjb250cm9sLmRhdGEoXCJGdWxsU2NyZWVuVGFibGVQbGFjZUhvbGRlclwiKSkge1xuXHRcdFx0XHRyZXR1cm4gY29udHJvbC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wuaXNBKFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSkge1xuXHRcdFx0XHRyZXR1cm4gY29udHJvbCBhcyBUYWJsZUFQSTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChibG9jay5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gYmxvY2suY29udGVudDtcblx0XHRcdGlmIChjb250cm9sLmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdGNvbnN0IG1haW5Db250ZW50ID0gKGNvbnRyb2wgYXMgRHluYW1pY1NpZGVDb250ZW50KS5nZXRNYWluQ29udGVudCgpWzBdO1xuXHRcdFx0XHRjb25zdCBtYWluQ29udGVudFRhYmxlQVBJID0gZ2V0VGFibGVBUEkobWFpbkNvbnRlbnQpO1xuXHRcdFx0XHRpZiAobWFpbkNvbnRlbnRUYWJsZUFQSSkge1xuXHRcdFx0XHRcdHRhYmxlQVBJID0gbWFpbkNvbnRlbnRUYWJsZUFQSTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBzaWRlQ29udGVudCA9IChjb250cm9sIGFzIER5bmFtaWNTaWRlQ29udGVudCkuZ2V0U2lkZUNvbnRlbnQoKVswXTtcblx0XHRcdFx0XHRjb25zdCBzaWRlQ29udGVudFRhYmxlQVBJID0gZ2V0VGFibGVBUEkoc2lkZUNvbnRlbnQpO1xuXHRcdFx0XHRcdGlmIChzaWRlQ29udGVudFRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0XHR0YWJsZUFQSSA9IHNpZGVDb250ZW50VGFibGVBUEk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YWJsZUFQSSA9IGdldFRhYmxlQVBJKGNvbnRyb2wpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0cmV0dXJuIHRhYmxlQVBJLmNvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcmluZygpOiB2b2lkIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25CZWZvcmVSZW5kZXJpbmcuYXBwbHkodGhpcyk7XG5cdFx0Ly8gSW4gdGhlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgc2NlbmFyaW8gd2UgbmVlZCB0byBlbnN1cmUgaW4gY2FzZSBvZiByZWxvYWQvcmVmcmVzaCB0aGF0IHRoZSBtZXRhIG1vZGVsIGluIHRoZSBtZXRob2RlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgb2YgdGhlIEZpZWxkUnVudGltZSBpcyBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5vVmlldy5nZXRWaWV3RGF0YSgpPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ICYmIENvbW1vbkhlbHBlci5nZXRNZXRhTW9kZWwoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRDb21tb25IZWxwZXIuc2V0TWV0YU1vZGVsKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKTogdm9pZCB7XG5cdFx0bGV0IHN1YlNlY3Rpb25zOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdO1xuXHRcdGlmICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0Y29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFNlY3Rpb25zKCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcblx0XHRcdFx0c3ViU2VjdGlvbnMgPSBzZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0X29uQmVmb3JlQmluZGluZyhvQ29udGV4dDogT0RhdGFWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zID0ge30pOiB2b2lkIHtcblx0XHQvLyBSZXNldCBmbGFnIHRvIGFsbG93IHNlY3Rpb24gcmVzdG9yYXRpb24gb24gdGhpcyBuZXcgYmluZGluZyBjb250ZXh0LlxuXHRcdC8vIFRoaXMgZW5zdXJlcyBWaWV3U3RhdGUuYXBwbHkoKSBjYW4gcHJvcGVybHkgcmVzdG9yZSBzZWN0aW9ucyBhZnRlciBkaXNjYXJkIG9yIHJlLW5hdmlnYXRpb24uXG5cdFx0dGhpcy5za2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUgPSBmYWxzZTtcblxuXHRcdC8vIFN0b3JlIHRhcmdldENvbnRyb2xJZCBmb3Igc2Nyb2xsaW5nIGFmdGVyIGJpbmRpbmcgY29tcGxldGVzXG5cdFx0dGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gbVBhcmFtZXRlcnMudGFyZ2V0Q29udHJvbElkO1xuXG5cdFx0Ly8gQXBwbHkgdGFyZ2V0Q29udHJvbElkIG9ubHkgb24gaW5pdGlhbCBuYXZpZ2F0aW9uIC0gZG9uJ3QgYXBwbHkgZHVyaW5nIGVkaXQvc2F2ZS9kaXNjYXJkIHRyYW5zaXRpb25zXG5cdFx0Ly8gdG8gcHJlc2VydmUgdXNlcidzIHNlY3Rpb24gc2VsZWN0aW9uLiBOb3RlOiBnZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSByZXR1cm5zIHRoZSBPTEQgY29udGV4dFxuXHRcdC8vIHRoZXJlZm9yZSB0aGUgb0NvbnRleHQgcGFyYW1ldGVyIGlzIHVzZWQuXG5cdFx0Y29uc3QgY3VycmVudENvbnRleHRQYXRoID0gb0NvbnRleHQ/LmdldFBhdGgoKTtcblx0XHRjb25zdCBnZXRFbnRpdHlJZGVudGl0eSA9IChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0aWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gUmVtb3ZlIElzQWN0aXZlRW50aXR5IGZyb20gdGhlIHBhdGggdG8gZ2V0IGVudGl0eSBpZGVudGl0eVxuXHRcdFx0Ly8gZS5nLiwgXCIvUHJvZHVjdHMoSUQ9MSxJc0FjdGl2ZUVudGl0eT10cnVlKVwiIC0+IFwiL1Byb2R1Y3RzKElEPTEpXCJcblx0XHRcdHJldHVybiBwYXRoXG5cdFx0XHRcdC5yZXBsYWNlKC8sP0lzQWN0aXZlRW50aXR5PSh0cnVlfGZhbHNlKSw/LywgXCJcIilcblx0XHRcdFx0LnJlcGxhY2UoL1xcKFxccyosLywgXCIoXCIpXG5cdFx0XHRcdC5yZXBsYWNlKC8sXFxzKlxcKS8sIFwiKVwiKTtcblx0XHR9O1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlJZCA9IGdldEVudGl0eUlkZW50aXR5KGN1cnJlbnRDb250ZXh0UGF0aCk7XG5cdFx0Y29uc3QgcHJldmlvdXNFbnRpdHlJZCA9IGdldEVudGl0eUlkZW50aXR5KHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGgpO1xuXHRcdHRoaXMuaXNOZXdCaW5kaW5nQ29udGV4dCA9IHByZXZpb3VzRW50aXR5SWQgIT09IGN1cnJlbnRFbnRpdHlJZDtcblx0XHR0aGlzLnByZXZpb3VzQmluZGluZ0NvbnRleHRQYXRoID0gY3VycmVudENvbnRleHRQYXRoO1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIik7XG5cdFx0bGV0IG9GYXN0Q3JlYXRpb25Sb3c7XG5cdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0b1wiKTtcblx0XHRpZiAobVBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9jbG9zZVNpZGVDb250ZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0aWYgKFxuXHRcdFx0b3BDb250ZXh0ICYmXG5cdFx0XHRvcENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJlxuXHRcdFx0IWFCYXRjaEdyb3Vwcy5zb21lKG9wQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzLmJpbmQob3BDb250ZXh0LmdldE1vZGVsKCkpKVxuXHRcdCkge1xuXHRcdFx0LyogXHRJbiBjYXNlIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgZm9yIHRoZSBjcmVhdGlvbiByb3cgYW5kIG5vIG90aGVycyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0VE9ETzogdGhpcyBpcyBqdXN0IGEgcXVpY2sgc29sdXRpb24sIHRoaXMgbmVlZHMgdG8gYmUgcmV3b3JrZWRcblx0XHRcdFx0XHRcdFx0XHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBhVGFibGVzKSB7XG5cdFx0XHRvRmFzdENyZWF0aW9uUm93ID0gaXRlbS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0b0Zhc3RDcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uIHNvIHRoYXQgYmluZGluZ3MgYXJlIGVuYWJsZWQgZHVyaW5nIG5hdmlnYXRpb24gdGhyb3VnaCBwYWdpbmF0b3IgYnV0dG9ucywgYXMgdGhlcmUgaXMgbm8gdmlldyByZXJlbmRlcmluZy9yZWJpbmRcblx0XHRjb25zdCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24gPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRpZiAoIShvT2JqZWN0UGFnZSBhcyB7IGlzRmlyc3RSZW5kZXJpbmc/OiAoKSA9PiBib29sZWFuIH0pLmlzRmlyc3RSZW5kZXJpbmc/LigpICYmICFtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihudWxsIGFzIHVua25vd24gYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Y29uc3QgZm5PUFJlbmRlcmluZ0xheW91dCA9IHtcblx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmc6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCk/LmVkaXRhYmxlSGVhZGVyQ29udGVudCkge1xuXHRcdFx0XHRcdGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9PYmplY3RQYWdlLnJlbW92ZUV2ZW50RGVsZWdhdGUoZm5PUFJlbmRlcmluZ0xheW91dCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKGZuT1BSZW5kZXJpbmdMYXlvdXQpO1xuXG5cdFx0Ly9TZXQgdGhlIEJpbmRpbmcgZm9yIFBhZ2luYXRvcnMgdXNpbmcgTGlzdEJpbmRpbmcgSURcblx0XHR0aGlzLl9pbml0aWFsaXplUGFnaW5hdGlvbihvQ29udGV4dCwgb0ludGVybmFsTW9kZWwsIG1QYXJhbWV0ZXJzPy5saXN0QmluZGluZyk7XG5cblx0XHR0aGlzLl9kaXNhYmxlQmxvY2tzQmluZGluZ3Mob09iamVjdFBhZ2UpO1xuXG5cdFx0dGhpcy5zdWJTZWN0aW9ucyA9IHRoaXMuZGlzY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKG9PYmplY3RQYWdlKTtcblx0XHR0aGlzLndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MgPSB0aGlzLndhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQoKTtcblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIHsgb0NvbnRhaW5lcjogQ29udHJvbCB9KS5vQ29udGFpbmVyLmdldFBhcmVudCgpO1xuXHRcdFx0aWYgKG9OYXZDb250YWluZXIpIHtcblx0XHRcdFx0dGhpcy5wbGFjZWhvbGRlci5lbmFibGVBbmltYXRpb24oKTtcblx0XHRcdFx0KG9OYXZDb250YWluZXIgYXMgdW5rbm93biBhcyB7IHNob3dQbGFjZWhvbGRlcjogRnVuY3Rpb24gfSkuc2hvd1BsYWNlaG9sZGVyKHt9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCB0aGUgdmlzaWJpbGl0eSBvYnNlcnZlcnMgb2YgYWxsIEZFIHN1YnNlY3Rpb25zLlxuXHQgKiBAcGFyYW0gb2JqZWN0UGFnZUxheW91dFxuXHQgKiBAcmV0dXJucyBUaGUgc3Vic2VjdGlvbnMgaW5mb3JtYXRpb24gb3IgdW5kZWZpbmVkIGlmIG9wdGltaXphdGlvbiBpcyBkaXNhYmxlZFxuXHQgKi9cblx0ZGlzY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXRcblx0KTogeyBmZTogU3ViU2VjdGlvbltdOyBvdGhlcnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10gfSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpKSB7XG5cdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0Y29uc3Qgc3ViU2VjdGlvbnNJbmZvOiB7XG5cdFx0XHRcdGZlOiBTdWJTZWN0aW9uW107XG5cdFx0XHRcdG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXTtcblx0XHRcdH0gPSB7IGZlOiBbXSwgb3RoZXJzOiBbXSB9O1xuXHRcdFx0dGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKS5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiB7XG5cdFx0XHRcdGlmIChzdWJTZWN0aW9uLmlzQTxTdWJTZWN0aW9uPihcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuc2VjdGlvbi5TdWJTZWN0aW9uXCIpKSB7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbnNJbmZvLmZlLnB1c2goc3ViU2VjdGlvbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbnNJbmZvLm90aGVycy5wdXNoKHN1YlNlY3Rpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHN1YlNlY3Rpb25zSW5mby5mZS5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmRpc2Nvbm5lY3RWaXNpYmlsaXR5T2JzZXJ2ZXIoKSk7XG5cdFx0XHRyZXR1cm4gc3ViU2VjdGlvbnNJbmZvO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbG9hZGluZyBzdHJhdGVneSBmb3IgdGhlIG9iamVjdCBwYWdlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9hZGluZyBzdHJhdGVneSBmb3IgdGhlIG9iamVjdCBwYWdlLlxuXHQgKi9cblx0Z2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmRhdGEoXCJkaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb25cIikgPT09IFwidHJ1ZVwiO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRGaXJzdEVkaXRhYmxlSW5wdXQoKTogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZG9tRWRpdGFibGVFbGVtZW50ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCk7XG5cdFx0cmV0dXJuIGRvbUVkaXRhYmxlRWxlbWVudCA/IFVJNUVsZW1lbnQuY2xvc2VzdFRvKGRvbUVkaXRhYmxlRWxlbWVudCkgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlIE9iamVjdCBQYWdlIExheW91dCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBmb3VuZFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCk6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEluIGRpc3BsYXkgbW9kZSwgaWYgYSB2aXNpYmxlIHByaW1hcnkgYWN0aW9uIHdpdGggdGhlIGVtcGhhc2lzIGV4aXN0cyBpbiB0aGUgZm9vdGVyLCBpdCBtdXN0IGJlIHRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBvbiB0aGUgcGFnZS5cblx0XHRjb25zdCBmb290ZXIgPSBvYmplY3RQYWdlLmdldEZvb3RlcigpO1xuXHRcdGNvbnN0IGZvb3RlclByaW1hcnlBY3Rpb24gPSBmb290ZXJcblx0XHRcdD8gdGhpcy5fZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhmb290ZXIgYXMgdW5rbm93biBhcyBNYW5hZ2VkT2JqZWN0LCB0cnVlKVswXVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0aWYgKGZvb3RlclByaW1hcnlBY3Rpb24pIHtcblx0XHRcdHJldHVybiBmb290ZXJQcmltYXJ5QWN0aW9uO1xuXHRcdH1cblx0XHQvLyBGYWxsYmFjazogZmlyc3QgdmlzaWJsZSAmIGVuYWJsZWQgaGVhZGVyIGFjdGlvbiAoRWRpdCwgZXRjLilcblx0XHRsZXQgZmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBvYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgJiYgKG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlKS5nZXRBY3Rpb25zKCk7XG5cdFx0aWYgKGFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Zmlyc3RDbGlja2FibGVFbGVtZW50ID0gYWN0aW9ucy5maW5kKGZ1bmN0aW9uIChhY3Rpb246IENvbnRyb2wpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChhY3Rpb24uaXNBPFN1bW1hcml6YXRpb25CdXR0b24+KFwic2FwLmZlLm1hY3Jvcy5haS5TdW1tYXJpemF0aW9uQnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRDb250ZW50KCk/LmdldFZpc2libGUoKSA/PyBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRhY3Rpb24uaXNBPFNoYXJlQVBJPihcInNhcC5mZS5tYWNyb3MuU2hhcmVcIikgfHxcblx0XHRcdFx0XHRhY3Rpb24uaXNBPEVhc3lGaWxsQnV0dG9uPihcInNhcC5mZS5tYWNyb3MuYWkuRWFzeUZpbGxCdXR0b25cIikgfHxcblx0XHRcdFx0XHRhY3Rpb24uaXNBPENvbGxhYm9yYXRpb25EcmFmdD4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29tcG9uZW50cy5Db2xsYWJvcmF0aW9uRHJhZnRcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gc2luY2UgU2hhcmUgYW5kIENvbGxhYm9yYXRpb25EcmFmdCBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYWJsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWFjdGlvbi5pc0E8SW52aXNpYmxlVGV4dD4oXCJzYXAudWkuY29yZS5JbnZpc2libGVUZXh0XCIpICYmICFhY3Rpb24uaXNBPFRvb2xiYXJTcGFjZXI+KFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBhY3Rpb24uZ2V0VmlzaWJsZSgpICYmIChhY3Rpb24gYXMgQnV0dG9uKS5nZXRFbmFibGVkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIGJpbmRpbmdzIG9mIGJsb2NrcyBpbiBPYmplY3QgUGFnZSBMYXlvdXQgYmFzZWQgb24gdGhlIGl0cyBvdmVyYWxsIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlIE9iamVjdCBQYWdlIExheW91dCBjb250cm9sXG5cdCAqL1xuXHRfZGlzYWJsZUJsb2Nrc0JpbmRpbmdzKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvYmplY3RQYWdlOiBPYmplY3RQYWdlTGF5b3V0KTogdm9pZCB7XG5cdFx0Y29uc3QgYVNlY3Rpb25zID0gb2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb2JqZWN0UGFnZS5nZXRVc2VJY29uVGFiQmFyKCk7XG5cdFx0bGV0IGlTa2lwID0gMzsgLy8gMyBzZWN0aW9ucy9zdWJzZWN0aW9ucyBhcmUgbG9hZGVkIGluaXRpYWxseSwgdGhlIG90aGVycyBhcmUgbG9hZGVkIGxhemlseVxuXHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRjb25zdCBmaXJzdFZpc2liaWxpdHlCaW5kaW5nID0gdGhpcy5fZ2V0Zmlyc3RTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmcoKTtcblx0XHRmb3IgKGxldCBpU2VjdGlvbiA9IDA7IGlTZWN0aW9uIDwgYVNlY3Rpb25zLmxlbmd0aDsgaVNlY3Rpb24rKykge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdGZvciAobGV0IGlTdWJTZWN0aW9uID0gMDsgaVN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBpU3ViU2VjdGlvbisrLCBpU2tpcC0tKSB7XG5cdFx0XHRcdC8vIEluIEljb25UYWJCYXIgbW9kZSBrZWVwIHRoZSBzZWNvbmQgc2VjdGlvbiBib3VuZCBpZiB0aGVyZSBpcyBhbiBlZGl0YWJsZSBoZWFkZXIgYW5kIHdlIGFyZSBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlXG5cdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uID1cblx0XHRcdFx0XHQodGhpcy5nZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKSAmJlxuXHRcdFx0XHRcdFx0KGlTa2lwIDwgMSB8fCAoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkpIHx8XG5cdFx0XHRcdFx0KCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmXG5cdFx0XHRcdFx0XHQoKCFiVXNlSWNvblRhYkJhciAmJiAoaVNraXAgPCAxIHx8IG9TdWJTZWN0aW9uLmdldEJpbmRpbmcoXCJ2aXNpYmxlXCIpKSkgfHwgLy9pZiB3ZSBhcmUgbm90IGluIEljb25UYWJCYXIgbW9kZSwgYWxsIHNlY3Rpb24gd2l0aCBpbmRleCA+PTMgb3Igd2l0aCB2aXNpYmlsaXR5IGJpbmRpbmcgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0XHRcdFx0XHQoIWJVc2VJY29uVGFiQmFyICYmICFmaXJzdFZpc2liaWxpdHlCaW5kaW5nICYmIGlTa2lwIDwgMSkgfHwgLy8gaWYgbm8gc3Vic2VjdGlvbiBoYXMgdmlzaWJpbGl0eSBiaW5kaW5nIGFuZCB3ZSBhcmUgbm90IGluIEljb25UYWJCYXIgbW9kZVxuXHRcdFx0XHRcdFx0XHQoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkpO1xuXHRcdFx0XHRpZiAoZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gU3ViU2VjdGlvbidzIGJpbmRpbmcgaXMgZW5hYmxlZC5cblx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdGNvbnN0IGJsb2NrcyA9IG9TdWJTZWN0aW9uLmdldEJsb2NrcygpO1xuXHRcdFx0XHRcdC8vIFN1YlNlY3Rpb24ncyBjb250ZW50cyBiaW5kaW5nIGlzIGRpc2FibGVkLlxuXHRcdFx0XHRcdGJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJsb2NrLmlzQTxTdWJTZWN0aW9uQmxvY2s+KFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLmNvbnRyb2xzLlN1YlNlY3Rpb25CbG9ja1wiKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBTZXQgYmluZGluZyBjb250ZXh0IHRvIG51bGwgb24gYm90aCB0aGUgYmxvY2sgYW5kIGl0cyBjb250ZW50XG5cdFx0XHRcdFx0XHRcdC8vIHRvIHN1cHBvcnQgYm90aDogc3Vic2VjdGlvbnMgd2l0aCBVSS5IaWRkZW4gYW5ub3RhdGlvbiAoY29udGVudCBuZWVkcyB0byBiZSBjbGVhcmVkKVxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgY3VzdG9tZXIgY29udHJvbGxlciBleHRlbnNpb25zIHRoYXQgc2V0IGJpbmRpbmcgY29udGV4dCBvbiB0aGUgYmxvY2sgbGV2ZWxcblx0XHRcdFx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHRcdFx0YmxvY2suY29udGVudC5zZXRCaW5kaW5nQ29udGV4dD8uKG51bGwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1N1YlNlY3Rpb24uZ2V0TW9yZUJsb2NrcygpLmZvckVhY2goKHN1YkJsb2NrKSA9PiBzdWJCbG9jay5zZXRCaW5kaW5nQ29udGV4dChudWxsKSk7XG5cdFx0XHRcdFx0b1N1YlNlY3Rpb24uZ2V0QWN0aW9ucygpLmZvckVhY2goKGFjdGlvbnMpID0+IGFjdGlvbnMuc2V0QmluZGluZ0NvbnRleHQobnVsbCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSk6IElucHV0QmFzZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Zm9yIChjb25zdCBzdWJTZWN0aW9uIG9mIGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgYUJsb2NrcyA9IHN1YlNlY3Rpb24uZ2V0QmxvY2tzKCkgYXMgKEZvcm0gfCBGb3JtQVBJKVtdO1xuXG5cdFx0XHRpZiAoYUJsb2Nrcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGJsb2NrQ29udHJvbCBvZiBhQmxvY2tzKSB7XG5cdFx0XHRcdFx0aWYgKGJsb2NrQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dD8uKCkpIHtcblx0XHRcdFx0XHRcdGxldCBhRm9ybUNvbnRhaW5lcnM7XG5cblx0XHRcdFx0XHRcdGlmIChibG9ja0NvbnRyb2wuaXNBPEZvcm0+KFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gYmxvY2tDb250cm9sLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrQ29udHJvbC5nZXRDb250ZW50ICYmIGJsb2NrQ29udHJvbC5nZXRDb250ZW50KCk/LmlzQTxGb3JtPihcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IChibG9ja0NvbnRyb2wuZ2V0Q29udGVudCgpIGFzIEZvcm0pLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrQ29udHJvbD8uZ2V0Q29udGVudD8uKCk/LmlzQTxGb3JtQVBJPihcInNhcC5mZS5tYWNyb3MuZm9ybS5Gb3JtQVBJXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9ICgoYmxvY2tDb250cm9sLmdldENvbnRlbnQoKSBhcyBGb3JtQVBJKS5nZXRDb250ZW50KCkgYXMgRm9ybSkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhRm9ybUNvbnRhaW5lcnMpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtQ29udGFpbmVyIG9mIGFGb3JtQ29udGFpbmVycykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGb3JtRWxlbWVudHMgPSBmb3JtQ29udGFpbmVyLmdldEZvcm1FbGVtZW50cygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChhRm9ybUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGZvcm1FbGVtZW50IG9mIGFGb3JtRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZpZWxkcyA9IGZvcm1FbGVtZW50LmdldEZpZWxkcygpIGFzIElucHV0QmFzZVtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBlbXB0eUZpZWxkID0gdGhpcy5nZXRGaXJzdEVtcHR5UmVxdWlyZWRGaWVsZChhRmllbGRzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVtcHR5RmllbGQpIHJldHVybiBlbXB0eUZpZWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogVmVyaWZ5IGlmIHRoZSBmaXJzdCBmaWVsZCBpcyBlbXB0eSBhbmQgcmVxdWlyZWQuXG5cdCAqIEBwYXJhbSBmaWVsZHMgVGhlIGZpZWxkcyB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUaGUgZmlyc3QgZW1wdHkgcmVxdWlyZWQgZmllbGQgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzXG5cdCAqL1xuXHRnZXRGaXJzdEVtcHR5UmVxdWlyZWRGaWVsZChmaWVsZHM6IElucHV0QmFzZVtdKTogSW5wdXRCYXNlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIWZpZWxkcyB8fCBmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHRpZiAoIWZpZWxkc1swXS5nZXRSZXF1aXJlZD8uKCkpIHJldHVybjtcblxuXHRcdGxldCBpc0VtcHR5ID0gZmFsc2U7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGZpZWxkc1swXS5pc0EoXCJzYXAuZmUubWFjcm9zLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0XHRjb25zdCBpdGVtcyA9IChmaWVsZHNbMF0gYXMgdW5rbm93biBhcyBNdWx0aVZhbHVlRmllbGRCbG9jaykuZ2V0TXVsdGlWYWx1ZUZpZWxkKCkuZ2V0SXRlbXMoKTtcblx0XHRcdFx0aXNFbXB0eSA9IGl0ZW1zLmxlbmd0aCA9PT0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gKGZpZWxkc1swXSBhcyBJbnB1dEJhc2UpLmdldFZhbHVlKCk7XG5cdFx0XHRcdGlzRW1wdHkgPSAhdmFsdWU7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hlbiBjaGVja2luZyBmaWVsZCBwcm9wZXJ0aWVzOiAke2Vycm9yfWApO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc0VtcHR5ID8gZmllbGRzWzBdIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaW5pdGlhbCBmb2N1cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwYXJhbSBhU3ViU2VjdGlvbnMgT2JqZWN0IHBhZ2Ugc3ViIHNlY3Rpb25zXG5cdCAqIEBwYXJhbSBmcm9tVGFiTmF2aWdhdGlvbiBJbmRpY2F0ZXMgaWYgdGhlIGZvY3VzIGlzIHNldCBhZnRlciBhIHRhYiBuYXZpZ2F0aW9uXG5cdCAqL1xuXHRfdXBkYXRlRm9jdXNJbkVkaXRNb2RlKGFTdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSwgZnJvbVRhYk5hdmlnYXRpb24gPSBmYWxzZSk6IHZvaWQge1xuXHRcdHNldFRpbWVvdXQoXG5cdFx0XHRmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0XHRcdFx0Ly8gV2Ugc2V0IHRoZSBmb2N1cyBpbiBhIHRpbWVlb3V0LCBvdGhlcndpc2UgdGhlIGZvY3VzIHNvbWV0aW1lcyBnb2VzIHRvIHRoZSBUYWJCYXJcblx0XHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdFx0XHRsZXQgb0ZpZWxkVG9Gb2N1czogVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0XHRcdGlmIChvTWFuZGF0b3J5RmllbGQuaXNBKFwic2FwLmZlLm1hY3Jvcy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob01hbmRhdG9yeUZpZWxkIGFzIHVua25vd24gYXMgTXVsdGlWYWx1ZUZpZWxkQmxvY2spLmdldE11bHRpVmFsdWVGaWVsZCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gKFxuXHRcdFx0XHRcdFx0XHRvTWFuZGF0b3J5RmllbGQgYXMgdW5rbm93biBhcyB7IGNvbnRlbnQ6IHsgZ2V0Q29udGVudEVkaXQ6IEZ1bmN0aW9uIH0gfVxuXHRcdFx0XHRcdFx0KS5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMgPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbnB1dCgpID8/IHRoaXMuZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0XHRcdGNvbnN0IGZvY3VzSW5mbyA9IG9GaWVsZFRvRm9jdXMuZ2V0Rm9jdXNJbmZvKCkgYXMgeyB0YXJnZXRJbmZvOiBvYmplY3QgfTtcblx0XHRcdFx0XHRmb2N1c0luZm8udGFyZ2V0SW5mbyA9IHsgc2lsZW50OiB0cnVlIH07XG5cdFx0XHRcdFx0aWYgKG9GaWVsZFRvRm9jdXMuaXNBKFwic2FwLnVpLm1kYy5maWVsZC5GaWVsZElucHV0XCIpKSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gb0ZpZWxkVG9Gb2N1cy5nZXRQYXJlbnQoKSBhcyBVSTVFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXM/LmlzQTxTZWFyY2hGaWVsZD4oXCJzYXAubS5TZWFyY2hGaWVsZFwiKSAmJlxuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5nZXRFbmFibGVTdWdnZXN0aW9ucygpICYmXG5cdFx0XHRcdFx0XHQhb0ZpZWxkVG9Gb2N1cy5pc0JvdW5kKFwiZW5hYmxlU3VnZ2VzdGlvbnNcIilcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGZvY3VzIGlzIHNldCBvbiBhIHNlYXJjaCBmaWVsZCB3aXRoIHN1Z2dlc3Rpb25zLCB3ZSB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBzdWdnZXN0aW9ucyB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZW0gb24gZm9jdXNcblx0XHRcdFx0XHRcdC8vIHVubGVzcyB0aGlzIHByb3BlcnR5IGlzIGJvdW5kICh0byBhdm9pZCBtb2RpZnlpbmcgc29tZXRoaW5nIGluIGEgbW9kZWwpXG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLnNldEVuYWJsZVN1Z2dlc3Rpb25zKGZhbHNlKTtcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoZm9jdXNJbmZvKTtcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMuc2V0RW5hYmxlU3VnZ2VzdGlvbnModHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXM/LmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LmJpbmQodGhpcyksXG5cdFx0XHRmcm9tVGFiTmF2aWdhdGlvbiA/IDMwMCA6IDBcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZmlyc3Qgc3ViLXNlY3Rpb24gd2l0aCBhIHZpc2liaWxpdHkgYm91bmQgdG8gdGhlIG1vZGVsIG9mIHRoZSB2aWV3LlxuXHQgKiBTZWN0aW9ucyB3aXRoIGJpbmRpbmdzIG9uIGludGVybmFsIG1vZGVscyBvbmx5IGFyZSBpZ25vcmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgdmlzaWJpbGl0eSBiaW5kaW5nIG9mIHRoZSBmaXJzdCBzdWItc2VjdGlvbiBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0X2dldGZpcnN0U3ViU2VjdGlvblZpc2liaWxpdHlCaW5kaW5nKCk6IEJpbmRpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGFsbHN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRjb25zdCBjdXJyZW50TW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdHJldHVybiBhbGxzdWJTZWN0aW9uc1xuXHRcdFx0LmZpbmQoXG5cdFx0XHRcdChzdWJTZWN0aW9uKSA9PlxuXHRcdFx0XHRcdChzdWJTZWN0aW9uLmdldEJpbmRpbmcoXCJ2aXNpYmxlXCIpIGFzIENvbXBvc2l0ZUJpbmRpbmcgfCB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHQ/LmdldEJpbmRpbmdzPy4oKVxuXHRcdFx0XHRcdFx0LnNvbWUoKGJpbmRpbmcpID0+IGJpbmRpbmcuZ2V0TW9kZWwoKSA9PT0gY3VycmVudE1vZGVsKVxuXHRcdFx0KVxuXHRcdFx0Py5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhbGwgc3Vic2VjdGlvbiB2aXNpYmlsaXR5IGJpbmRpbmdzIHRvIGJlIHJlc29sdmVkLlxuXHQgKiBUaGlzIG1ldGhvZCBsaXN0ZW5zIGZvciB0aGUgJ3Zpc2liaWxpdHlDaGFuZ2VkJyBldmVudCAgLiBUaGUgY2hhbmdlIGV2ZW50IGlzIGZpcmVkIGV2ZW4gaWYgdGhlIHZhbHVlcyBhcmUgbm90IGNoYW5nZWQgYnV0IGp1c3QgcmVzb2x2ZWQuXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHByb21pc2VzIHRoYXQgcmVzb2x2ZSB3aGVuIGVhY2ggdmlzaWJpbGl0eSBiaW5kaW5nIGlzIHJlc29sdmVkLlxuXHQgKi9cblx0d2FpdEZvckFsbFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZ3NSZXNvbHZlZCgpOiBQcm9taXNlPHVua25vd24+W10ge1xuXHRcdHJldHVybiB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpXG5cdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHQoc3ViU2VjdGlvbikgPT4gc3ViU2VjdGlvbi5pc0E8U3ViU2VjdGlvbj4oXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLnNlY3Rpb24uU3ViU2VjdGlvblwiKSAmJiBzdWJTZWN0aW9uLmdldEJpbmRpbmcoXCJ2aXNpYmxlXCIpXG5cdFx0XHQpIC8vZmlsdGVyaW5nIG9uIEZFIHN1YnNlY3Rpb25zIHdpdGggdmlzaWJpbGl0eSBiaW5kaW5nKVxuXHRcdFx0Lm1hcChhc3luYyAoc3ViU2VjdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHN1YlNlY3Rpb24uYXR0YWNoRXZlbnRPbmNlKFwidmlzaWJpbGl0eUNoYW5nZWRcIiwgcmVzb2x2ZSkpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfaGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydChvRXZlbnQ6IFVJNUV2ZW50PHsgc3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24gfT4pOiB2b2lkIHtcblx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdGlmIChvU3ViU2VjdGlvbi5pc0E8U3ViU2VjdGlvbj4oXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLnNlY3Rpb24uU3ViU2VjdGlvblwiKSkge1xuXHRcdFx0b1N1YlNlY3Rpb24uaGFuZGxlU3ViU2VjdGlvbkNyZWF0ZWQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdH1cblx0XHRjb25zdCBibG9ja3MgPSBvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKTtcblx0XHRibG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcblx0XHRcdGlmIChibG9jay5pc0E8U3ViU2VjdGlvbkJsb2NrPihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5jb250cm9scy5TdWJTZWN0aW9uQmxvY2tcIikpIHtcblx0XHRcdFx0Ly8gU2V0IGJpbmRpbmcgY29udGV4dCB0byB1bmRlZmluZWQgb24gYm90aCB0aGUgYmxvY2sgYW5kIGl0cyBjb250ZW50XG5cdFx0XHRcdC8vIHRvIHN1cHBvcnQgYm90aDogc3Vic2VjdGlvbnMgd2l0aCBVSS5IaWRkZW4gYW5ub3RhdGlvbiAoY29udGVudCBuZWVkcyB0byBiZSBjbGVhcmVkKVxuXHRcdFx0XHQvLyBhbmQgY3VzdG9tZXIgY29udHJvbGxlciBleHRlbnNpb25zIHRoYXQgc2V0IGJpbmRpbmcgY29udGV4dCBvbiB0aGUgYmxvY2sgbGV2ZWxcblx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0YmxvY2suY29udGVudC5zZXRCaW5kaW5nQ29udGV4dD8uKHVuZGVmaW5lZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRibG9jay5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9TdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKS5mb3JFYWNoKChzdWJCbG9jaykgPT4gc3ViQmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKSk7XG5cdFx0b1N1YlNlY3Rpb24uZ2V0QWN0aW9ucygpLmZvckVhY2goKGFjdGlvbnMpID0+IGFjdGlvbnMuc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKSk7XG5cdH1cblxuXHRfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdC8vIEZ1bmN0aW9uIHRvIG5hdmlnYXRlIGJhY2ssIG9yIGRpc3BsYXkgdGhlIGxhdW5jaHBhZCBpZiB3ZSdyZSBvbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgaGlzdG9yeVxuXHRcdGNvbnN0IG5hdkJhY2sgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBVc2UgdGhlIG5ldyBOYXZpZ2F0aW9uIEFQSSBpZiBpdCdzIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlciwgdG8gY2hlY2sgaWYgd2UgY2FuIGdvIGJhY2sgaW4gaGlzdG9yeS5cblx0XHRcdGNvbnN0IGNhbkdvQmFjayA9ICh3aW5kb3cgYXMgeyBuYXZpZ2F0aW9uPzogeyBjYW5Hb0JhY2s/OiBib29sZWFuIH0gfSkubmF2aWdhdGlvbj8uY2FuR29CYWNrO1xuXHRcdFx0aWYgKGNhbkdvQmFjayA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdH0gZWxzZSBpZiAoY2FuR29CYWNrID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEZhbGxiYWNrIGluIGNhc2UgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBOYXZpZ2F0aW9uIEFQSVxuXHRcdFx0XHRjb25zdCBjdXJyZW50VVJMID0gZG9jdW1lbnQuVVJMO1xuXHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBubyBwcmV2aW91cyBwYWdlIGluIHRoZSBoaXN0b3J5LCBoaXN0b3J5LmJhY2sgZG9lcyBub3RoaW5nLlxuXHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdXNlIG5hdmlnYXRlQmFja0Zyb21Db250ZXh0LCB0aGF0IHdpbGwgZGlzcGxheSB0aGUgaG9tZSBwYWdlXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChkb2N1bWVudC5VUkwgPT09IGN1cnJlbnRVUkwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgNTAwKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5jaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCkpIHtcblx0XHRcdC8vIEJhY2sgbmF2IHdpbGwga2VlcCB0aGUgc2FtZSBjb250ZXh0IC0tPiBubyBuZWVkIHRvIGRpc3BsYXkgdGhlIGRpYWxvZ1xuXHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0Ly8gVGhpcyBvYmplY3QgcGFnZSBkb2Vzbid0IGhhdmUgYSBiaW5kaW5nIGNvbnRleHQsIGJ1dCBzdGlsbCBoYW5kbGVzIHRoZSBzaGVsbCBiYWNrIG5hdmlnYXRpb24gLS0+IHBmb3JtIHRoZSBuYXYgYmFjayBhbmQgcmVtb3ZlIHRoZSBuYXZiYWNrIGhhbmRsZXIgYXMgaXQgbWFrZXMgbm8gc2Vuc2UgYW55IGxvbmdlclxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHQuZ2V0U2hlbGxTZXJ2aWNlcygpXG5cdFx0XHRcdC5zZXRCYWNrTmF2aWdhdGlvbih1bmRlZmluZWQpXG5cdFx0XHRcdC50aGVuKG5hdkJhY2spXG5cdFx0XHRcdC5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKFwiRXJyb3Igd2hpbGUgc2V0dGluZyBiYWNrIG5hdmlnYXRpb25cIiwgZSk7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBoaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKT8uZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKT8uZ2V0Q2FwYWJpbGl0aWVzKCk/LkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdFx0XHQ/LmVuYWJsZWQ7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5oYW5kbGVTZXNzaW9uT2ZmKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5hdkJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0aGlkZGVuRHJhZnRFbmFibGVkID8gdHJ1ZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHQvLyBgbmF2aWdhdGlvblR5cGVgIChCYWNrTmF2aWdhdGlvbiBhYm92ZSkgc3RpbGwgZHJpdmVzIHRoZSBub24tRkNMIHBhdGhzIGluc2lkZVxuXHRcdFx0XHQvLyBwcm9jZXNzRHJhZnRBZG1pbkRhdGEgKGUuZy4gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZSAvIHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSkuXG5cdFx0XHRcdC8vIGBkcmFmdERhdGFMb3NzU3RyYXRlZ3lgIGlzIGNvbnN1bWVkIGJ5IHRoZSBGQ0wgYnJhbmNoIChwcm9jZXNzRmNsTW9kZSkgb25seSDigJQgYm90aCBhcmUgbmVlZGVkLlxuXHRcdFx0XHR7IHdpdGhvdXRDaGFuZ2VzOiBkcmFmdC5EcmFmdERhdGFMb3NzT3B0aW9ucy5EaXNjYXJkIH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcoaW5wdXRCaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXc/LmdldFZpZXdEYXRhKCk/LnZpZXdMZXZlbDtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRpZiAoW05hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sIE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3NdLmluY2x1ZGVzKG1QYXJhbWV0ZXJzPy5yZWFzb24gYXMgTmF2aWdhdGlvblJlYXNvbikpIHtcblx0XHRcdHRoaXMuZWRpdEZsb3cuc3RvcmVTaWJsaW5nQ29udGV4dERhdGEoaW5wdXRCaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaWRlRWZmZWN0cy5jbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cblx0XHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0XHQvLyBOZWVkIHRvIGZpeCB3aXRoIEJMSTogRklPUklURUNIUDEtMTUyNzRcblx0XHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRcdGNvbnN0IG9UYWJsZVJvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYXBwbHkgZm9yIGJvdGggZWRpdCBhbmQgZGlzcGxheSBtb2RlIGluIHN0aWNreVxuXHRcdFx0XHRcdFx0KG9UYWJsZVJvd0JpbmRpbmcgYXMgdW5rbm93biBhcyB7IHJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzOiBGdW5jdGlvbiB9KS5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHRcdC8vIENsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFuZCB1cGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYWNjb3JkaW5nbHlcblx0XHRcdFx0Ly8gV2lsbCB0byBiZSBmaXhlZCB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSB0YWJsZUFQSSA/IEpTT04ucGFyc2UodGFibGVBUEkudGFibGVEZWZpbml0aW9uLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCkgOiB7fTtcblxuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBbXSwgXCJ0YWJsZVwiKTtcblxuXHRcdFx0XHRvVGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGU7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRcdG9GaW5hbFVJU3RhdGU6IFByb21pc2U8dW5rbm93bj4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKSxcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFRhYmxlSGVscGVyLmVuYWJsZUZhc3RDcmVhdGlvblJvdyhcblx0XHRcdFx0XHRcdG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0b0ZpbmFsVUlTdGF0ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9Nb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIFN0b3JlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiBpbnRlcm5hbCBtb2RlbCBmb3IgYWNjZXNzIGJ5IGNvbnRyb2xsZXIgZXh0ZW5zaW9uc1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcIm5hdmlnYXRpb25QYXJhbWV0ZXJzXCIsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZShiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHNcblx0XHRcdHRoaXMuX3VwZGF0ZVJlbGF0ZWRBcHBzKCk7XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBiaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwge30sIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJpbmRpbmcgaXMgcmVhZHkgaGVuY2UgY2FsbGluZyBpdCBpbiBvbkFmdGVyQmluZGluZ1xuXHRcdFx0aWYgKHRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIHVua25vd24gYXMgeyBfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50czogRnVuY3Rpb24gfSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9UbyBDb21wdXRlIHRoZSBFZGl0IEJpbmRpbmcgb2YgdGhlIHN1Yk9iamVjdCBwYWdlIHVzaW5nIHJvb3Qgb2JqZWN0IHBhZ2UsIGNyZWF0ZSBhIGNvbnRleHQgZm9yIGRyYWZ0IHJvb3QgYW5kIHVwZGF0ZSB0aGUgZWRpdCBidXR0b24gaW4gc3ViIE9QIHVzaW5nIHRoZSBjb250ZXh0XG5cdFx0XHRBY3Rpb25SdW50aW1lLnVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKFtdKTtcblx0XHR9XG5cdFx0Ly8gd2UgYXJlIGNsZWFyaW5nIGFueSBwcmV2aW91cyBkYXRhIGZyb20gcmVjb21tZW5kYXRpb25zIGV2ZXJ5IHRpbWUgd2UgY29tZSB0byBuZXcgT1Bcblx0XHQvLyBzbyB0aGF0IGNhY2hlZCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzaG93biB0byB1c2VyXG5cdFx0aWYgKHZpZXdMZXZlbCAmJiB2aWV3TGV2ZWwgPT09IDEpIHtcblx0XHRcdG9GaW5hbFVJU3RhdGU/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9ucy5jbGVhclJlY29tbWVuZGF0aW9ucygpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLmRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShtUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQpO1xuXHRcdHRoaXMuX3NldE9QTWVzc2FnZVN0cmlwSW50ZXJuYWxDb250ZXh0KCk7XG5cblx0XHRjb25zdCBhcHBseUFwcFN0YXRlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKHZpZXcpO1xuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IoYXBwbHlBcHBTdGF0ZSk7XG5cblx0XHR0aGlzLnJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdFx0dGhpcy5zdWJTZWN0aW9ucyxcblx0XHRcdG9PYmplY3RQYWdlLFxuXHRcdFx0YXBwbHlBcHBTdGF0ZSxcblx0XHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggIT09IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKVxuXHRcdCk7XG5cblx0XHQvLyBDYXB0dXJlIHN5bmNocm9ub3VzbHkgdG8gYXZvaWQgcmFjZSB3aXRoIHN1YnNlcXVlbnQgbmF2aWdhdGlvbnNcblx0XHRjb25zdCBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gdGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkO1xuXHRcdHRoaXMucGVuZGluZ1RhcmdldENvbnRyb2xJZCA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oYXBwbHlBcHBTdGF0ZSwgb09iamVjdFBhZ2UsIHBlbmRpbmdUYXJnZXRDb250cm9sSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbmF2aWdhdGlvbiB0byBhIHRhcmdldCBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gYWZ0ZXIgYXBwIHN0YXRlIGlzIGFwcGxpZWQuXG5cdCAqIFRoaXMgY29vcmRpbmF0ZXMgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb24gZnJvbSB0d28gc291cmNlczpcblx0ICogLSBJbi1hcHAgbmF2aWdhdGlvbjogcGVuZGluZ1RhcmdldENvbnRyb2xJZCBjYXB0dXJlZCBiZWZvcmUgYXBwbHlBcHBTdGF0ZS5cblx0ICogLSBDcm9zcy1hcHAgbmF2aWdhdGlvbjogeEFwcFN0YXRlIHRhcmdldENvbnRyb2xJZCBzdG9yZWQgYnkgQXBwU3RhdGVIYW5kbGVyIGR1cmluZyBMUiB0byBPUCB0cmFuc2l0aW9uLlxuXHQgKiBAcGFyYW0gYXBwbHlBcHBTdGF0ZSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhcHAgc3RhdGUgaGFzIGJlZW4gYXBwbGllZC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkIFRoZSB0YXJnZXRDb250cm9sSWQgY2FwdHVyZWQgYmVmb3JlIGFwcGx5QXBwU3RhdGUsIGlmIGFueS5cblx0ICovXG5cdHByaXZhdGUgaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oXG5cdFx0YXBwbHlBcHBTdGF0ZTogUHJvbWlzZTx2b2lkIHwgb2JqZWN0Pixcblx0XHRvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCxcblx0XHRwZW5kaW5nVGFyZ2V0Q29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0YXBwbHlBcHBTdGF0ZVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEFwcFN0YXRlSGFuZGxlcigpPy5jb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCgpO1xuXHRcdFx0XHRjb25zdCB0YXJnZXRDb250cm9sSWQgPSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID8/IHhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZDtcblx0XHRcdFx0aWYgKCF0YXJnZXRDb250cm9sSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzICAobmVlZGVkIGZvciBsYXp5IGxvYWRpbmcgc2NlbmFyaW9zKVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHRoaXMud2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8vIFNvbWUgdmlzaWJpbGl0eSBiaW5kaW5ncyBmYWlsZWQgdG8gcmVzb2x2ZSwgcHJvY2VlZGluZyBhbnl3YXlcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIHBhZ2VSZWFkeSB0byBlbnN1cmUgT2JqZWN0UGFnZSBpcyBmdWxseSBpbml0aWFsaXplZFxuXHRcdFx0XHRhd2FpdCB0aGlzLnBhZ2VSZWFkeS53YWl0UGFnZVJlYWR5KCk7XG5cblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZSwgdGFyZ2V0Q29udHJvbElkKTtcblx0XHRcdFx0cmV0dXJuOyAvLyBSZXF1aXJlZCBieSBsaW50ZXIgcnVsZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHQvLyBhcHBseUFwcFN0YXRlIGZhaWxlZCAtIHNraXAgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb25cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHRhcmdldCBzZWN0aW9uIHdpdGggYXV0b21hdGljIHJlLW5hdmlnYXRpb24gaWYgVVggcnVsZXMgcmVzZXQgdGhlIHNlbGVjdGlvbi5cblx0ICogUG9sbHMgdGhlIHNlY3Rpb24gc3RhdGUgc2luY2Ugc2V0U2VsZWN0ZWRTZWN0aW9uKCkgZG9lc24ndCBmaXJlIHRoZSBuYXZpZ2F0ZSBldmVudC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCwgdGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IHNlY3Rpb24gSUQgZm9yIGNvbXBhcmlzb25cblx0XHRjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZCh0YXJnZXRDb250cm9sSWQpO1xuXHRcdGNvbnN0IGlzU2VjdGlvbiA9IHRhcmdldENvbnRyb2w/LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpO1xuXHRcdGNvbnN0IHRhcmdldFNlY3Rpb25JZCA9IGlzU2VjdGlvbiA/IHRhcmdldENvbnRyb2w/LmdldElkKCkgOiAodGFyZ2V0Q29udHJvbD8uZ2V0UGFyZW50KCkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pPy5nZXRJZCgpO1xuXG5cdFx0Ly8gTmF2aWdhdGUgZnVuY3Rpb24gd2l0aCBndWFyZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBjYWxscyB3aGVuIGFscmVhZHkgb24gdGFyZ2V0XG5cdFx0Y29uc3QgbmF2aWdhdGVUb1RhcmdldCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvblxuXHRcdFx0fVxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkKTtcblx0XHR9O1xuXG5cdFx0Ly8gTmF2aWdhdGUgaW1tZWRpYXRlbHlcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0KCk7XG5cblx0XHQvLyBTa2lwIHBvbGxpbmcgaWYgYWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvbiAobmF2aWdhdGlvbiB3YXMgbm8tb3Agb3Igc3VjY2VlZGVkIGltbWVkaWF0ZWx5KVxuXHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgb25seSBvbiBuZXcgZW50aXR5IGJpbmRpbmcuXG5cdFx0Ly8gX2FkanVzdFNlbGVjdGVkU2VjdGlvbkJ5VVhSdWxlcygpIG9ubHkgcnVucyB3aGVuIE9iamVjdFBhZ2VMYXlvdXQgcmUtaW5pdGlhbGl6ZXMgd2l0aCBhIG5ldyBlbnRpdHkuXG5cdFx0aWYgKHRoaXMuaXNOZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0cG9sbEZvclNlY3Rpb25TdGFiaWxpdHkoe1xuXHRcdFx0XHRnZXRTZWxlY3RlZFNlY3Rpb246ICgpID0+IG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpLFxuXHRcdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRcdG9uUmVzZXREZXRlY3RlZDogbmF2aWdhdGVUb1RhcmdldFxuXHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuIC0gcG9sbGluZyBmYWlsdXJlcyBhcmUgbm9uLWNyaXRpY2FsXG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRhcmdldFN1YlNlY3Rpb24gYmFzZWQgb24gdGhlIHRhcmdldCBjb250cm9sIElEIGZvciBhcHAgc3RhdGUgcGVyc2lzdGVuY2UuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRUYXJnZXRTdWJTZWN0aW9uKHRhcmdldENvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQodGFyZ2V0Q29udHJvbElkKTtcblx0XHRpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTdWJTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTdWJTZWN0aW9uXCIpKSB7XG5cdFx0XHR0aGlzLnRhcmdldFN1YlNlY3Rpb24gPSB0YXJnZXRDb250cm9sO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpKSB7XG5cdFx0XHRjb25zdCBzdWJTZWN0aW9ucyA9IHRhcmdldENvbnRyb2wuZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb25zWzBdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBuYXZpZ2F0aW9uIHRvIHRoZSB0YXJnZXQgc2VjdGlvbiBhbmQgdGhlbiB1cGRhdGVzIHRoZSBhcHAgc3RhdGUuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGFyZ2V0U3ViU2VjdGlvbiBCRUZPUkUgbmF2aWdhdGlvbiBmb3IgYXBwIHN0YXRlIHNhdmluZy5cblx0XHQvLyBzY3JvbGxUb1NlY3Rpb24oKSBkb2Vzbid0IGZpcmUgdGhlIG5hdmlnYXRlIGV2ZW50LCBzbyBvbk5hdmlnYXRlQ2hhbmdlIHdvbid0IGJlIGNhbGxlZC5cblx0XHR0aGlzLnNldFRhcmdldFN1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdC8vIFdhaXQgZm9yIEV4dGVuc2lvbkFQSSBwb2xsaW5nIHRvIGNvbXBsZXRlICh+MTAwbXMpIHBsdXMgc2Nyb2xsIHRvIGZpbmlzaFxuXHRcdC8vIGJlZm9yZSB1cGRhdGluZyBhcHAgc3RhdGUgYW5kIHNldHRpbmcgZm9jdXMuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZS51cGRhdGVBcHBTdGF0ZURlYm91bmNlZCgpO1xuXG5cdFx0XHQvLyBTZXQgZm9jdXMgaWYgaW4gZWRpdCBtb2RlIChmb3IgaW4tYXBwIG5hdmlnYXRpb24gdG8gc3ViLW9iamVjdCBwYWdlIGluIGVkaXQgbW9kZSlcblx0XHRcdC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2Nyb2xsVG9TZWN0aW9uKCkgZG9lc24ndCBmaXJlIG9uTmF2aWdhdGVDaGFuZ2UsXG5cdFx0XHQvLyBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgZm9jdXMgc2V0dGluZyBoZXJlXG5cdFx0XHRjb25zdCBpc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdGlmIChpc0luRWRpdE1vZGUgJiYgdGhpcy50YXJnZXRTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbdGhpcy50YXJnZXRTdWJTZWN0aW9uXSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMgYWZ0ZXIgdGhlIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYW5kIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZC5cblx0ICogVGhpcyBmdW5jdGlvbiB3YWl0IGZvciB0aGUgYXBwU2F0ZSB0byBiZSBhcHBsaWVkIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIG9ic2VydmVycyBhbmQgdGhlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgc2VjdGlvbiBpZiBpdCBjaGFuZ2VkIGR1cmluZyB0aGUgYXBwU3RhdGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBzdWJTZWN0aW9uSW5mbyBTdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZHVyaW5nIGRpc2Nvbm5lY3Rpb25cblx0ICogQHBhcmFtIG9iamVjdFBhZ2VMYXlvdXQgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHBhcmFtIHdhaXRGb3JBcHBseUFwcHN0YXRlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZFxuXHQgKiBAcGFyYW0gd2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB3YWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSByZWNvbm5lY3Rpbmcgb2JzZXJ2ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIG9ic2VydmVycyB3ZXJlIHJlY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGFzeW5jIHJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdHN1YlNlY3Rpb25JbmZvOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkLFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0d2FpdEZvckFwcGx5QXBwc3RhdGU6IFByb21pc2U8dW5rbm93bj4sXG5cdFx0d2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRydWVcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmIHN1YlNlY3Rpb25JbmZvKSB7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzID8gdGhpcy53YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzIDogW10pXG5cdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdC8vd2FpdGluZyBmb3IgdGhlIGFwcCBzdGF0ZSB0byBiZSBhcHBsaWVkIGJ0byBlbnN1cmUgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VjdGlvbiBpZiByZXF1aXJlZFxuXHRcdFx0XHRcdFx0YXdhaXQgd2FpdEZvckFwcGx5QXBwc3RhdGU7XG5cdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8uZmUuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4gc3ViU2VjdGlvbi5vYnNlcnZlQ3VycmVudFNlY3Rpb24oKSk7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8ub3RoZXJzXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChzdWJzZWN0aW9uKSA9PiBzdWJzZWN0aW9uLmdldFZpc2libGUoKSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmZpcmVFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgeyBzdWJTZWN0aW9uOiBzdWJTZWN0aW9uIH0pKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGNhcmRzIHdoZW4gdGhlIGJpbmRpbmcgaXMgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY2FyZHMgQXJyYXkgb2YgY2FyZHMgdG8gYmUgdXBkYXRlZFxuXHQgKi9cblx0YXN5bmMgX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKGNhcmRzOiBXcmFwcGVkQ2FyZFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UoKTtcblx0XHQvLyBPbmx5IGNvbGxlY3QgY2FyZHMgd2hlbiBjb25zdW1lcnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY2FyZHMgY2hhbm5lbFxuXHRcdGlmIChjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UuaGFzQ29sbGFib3JhdGlvbk1hbmFnZXJDb25uZWN0ZWQoKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb2xsYWJvcmF0aW9uTWFuYWdlci5jb2xsZWN0QXZhaWxhYmxlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0aWYgKGNhcmRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgY2FyZE9iamVjdCA9IHRoaXMuY29sbGFib3JhdGlvbk1hbmFnZXIudXBkYXRlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRBcHBJZCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SWQoKTtcblx0XHRcdFx0Y29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlLmFkZENhcmRzVG9Db2xsYWJvcmF0aW9uTWFuYWdlcihjYXJkT2JqZWN0LCBwYXJlbnRBcHBJZCwgdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSk7XG5cdFx0XHRcdGNvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZS5zaGFyZUF2YWlsYWJsZUNhcmRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IG9mIHRoZSBNZXNzYWdlc3RyaXAgT1AuXG5cdCAqL1xuXHRfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIiwgeyAuLi5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIikgfSk7XG5cdFx0aWYgKGludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHQob09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyB1bmtub3duIGFzIENvbnRyb2wpXG5cdFx0XHRcdD8uZmluZEVsZW1lbnRzKHRydWUsIChlbGVtOiBDb250cm9sKSA9PiBlbGVtLmlzQShcInNhcC5tLk1lc3NhZ2VTdHJpcFwiKSlcblx0XHRcdFx0LmZvckVhY2goKG1lc3NhZ2VTdHJpcDogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VTdHJpcC5zZXRCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dCh0aGlzLmdldEV4dGVuc2lvbkFQSSgpLl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpISxcblx0XHRcdFx0XHRcdFwiaW50ZXJuYWxcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcncyBiaW5kaW5nIGNvbnRleHQgYWxyZWFkeSBoYWQgbWVzc2FnZXMgdGhhdCB3ZXJlIG5vdCBjbGVhcmVkLCB3ZSB3b3VsZCBuZWVkIHRvIHJlLWV2YWx1YXRlIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAuXG5cdFx0XHR0aGlzLl9mblNob3dPUE1lc3NhZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2hvdyBhIG1lc3NhZ2Ugc3RyaXAgaWYgYSByZWRpcmVjdGlvbiB0byBhIG5vbi1kcmFmdCBlbGVtZW50IGhhcyBiZWVuIGRvbmUuXG5cdCAqIFJlbW92ZSB0aGUgbWVzc2FnZSBzdHJpcCBpbiBjYXNlIHdlIG5hdmlnYXRlIHRvIGFub3RoZXIgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlOYW1lIE5hbWUgb2YgdGhlIEVudGl0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1lc3NhZ2Vcblx0ICovXG5cdGRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShlbnRpdHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmNvbGxhYm9yYXRpb25NZXNzYWdlXSk7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZTtcblx0XHR9XG5cblx0XHRpZiAoZW50aXR5TmFtZSkge1xuXHRcdFx0dGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlJFUk9VVEVEX05BVklHQVRJT05fVE9fU0FWRURfVkVSU0lPTlwiLCBbZW50aXR5TmFtZV0pLFxuXHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbixcblx0XHRcdFx0dGFyZ2V0OiB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpXG5cdFx0XHR9KTtcblx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhbdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZV0pO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IHsgZm9yY2VGb2N1czogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIUNvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdGlmIChvRmlyc3RDbGlja2FibGVFbGVtZW50KSB7XG5cdFx0XHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRTZWN0aW9uID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKG9TZWxlY3RlZFNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGN0eHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vIHNldHRpbmcgdGhpcyBtb2RlbCBkYXRhIHRvIGJlIHVzZWQgZm9yIHJlY29tbWVuZGF0aW9ucyBiaW5kaW5nXG5cdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5zZXRQcm9wZXJ0eShcIi9jdXJyZW50Q3R4dFwiLCBjdHh0KTtcblxuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL1Nob3cgcG9wdXAgd2hpbGUgbmF2aWdhdGluZyBiYWNrIGZyb20gb2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBkcmFmdFxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gZG8gbm90IHJlcXVlc3QgcmVjb21tZW5kYXRpb25zIGFjdGlvbiBpZiB3ZSBhcmUgaW4gRGlzcGxheSBtb2RlXG5cdFx0Y29uc3QgaXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0VkaXRhYmxlICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0YXdhaXQgdGhpcy5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyhbeyBjb250ZXh0OiBvQmluZGluZ0NvbnRleHQgfV0pO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycz8uZm9yY2VGb2N1cykge1xuXHRcdFx0c2V0Rm9jdXMoKTtcblx0XHR9XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdHRoaXMuX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGhlIGZvbGxvd2luZyBjb2RpbmcgaXMgZG9uZSB0byBtZXJnZSBhbiBvcGVuIFBBVENIIGFuZCB0aGUgZHJhZnRwcmVwYXJlL2RyYWZ0YWN0aXZhdGVcblx0XHQvL3JlcXVlc3QgaW50byBvbmUgJGJhdGNoIHJlcXVlc3Rcblx0XHQvL1RvIGFjaGlldmUgdGhpcyB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIGF0IHRoZSBtb3VzZWRvd24gZXZlbnQgKGJlZm9yZSBmb2N1c291dCkgaW5cblx0XHQvL29yZGVyIHRvIHdhaXQgZm9yIHRoZSBkcmFmdCByZXF1ZXN0IGlzc3VlZCBpbiB0aGUgc2F2ZSBidXR0b25zIHByZXNzIGV2ZW50IGhhbmRsZXIuXG5cdFx0Ly9UaGUgcXVldWUgaXMgcmVsZWFzZWQgYWdhaW4gZHVyaW5nIG1vdXNldXAgKGJlZm9yZSBwcmVzcykuXG5cdFx0Ly9UaGlzIGlzIG9ubHkgcG9zc2libGUgb24gbm9uIHRvdWNoIGRldmljZXMgYmVjYXVzZSBvbiB0b3VjaCBkZXZpY2VzIHRoZSBmb2N1c291dCBhbmQgcHJlc3Ncblx0XHQvL2V2ZW50cyBhcmUgYm90aCBpbml0aWF0ZWQgYXQgdG91Y2hlbmQgYnkgc2FwLm0uQnV0dG9uLlxuXHRcdC8vbW91c2VIYW5kbGVyU2V0IGlzIHVzZWQgdG8gZW5zdXJlcyB0aGF0IHRoZSBldmVudCBoYW5kbGVycyBhcmUgYXR0YWNoZWQgb25seSBvbmUgdGltZS5cblx0XHQvL1RoZXJlIGNhbiBiZSBtdWx0aXBsZSBvblBhZ2VSZWFkeSBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZWRpdC9kaXNwbGF5IG1vZGVcblx0XHRpZiAoIXRoaXMubWVyZ2VQYXRjaERyYWZ0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3Qgc2F2ZUJ1dHRvbiA9IG9WaWV3LmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpTdGFuZGFyZEFjdGlvbjo6U2F2ZVwiKSBhcyBCdXR0b247XG5cdFx0XHRjb25zdCBhdXRvUXVldWVVbmxvY2sgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sudW5sb2NrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F2ZUJ1dHRvbi5kZXRhY2hCcm93c2VyRXZlbnQoXCJtb3VzZXVwXCIsIGF1dG9RdWV1ZVVubG9jayk7XG5cdFx0XHRcdHNhdmVCdXR0b24uZGV0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0fTtcblxuXHRcdFx0c2F2ZUJ1dHRvbj8uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLmxvY2soXCIkYXV0b1wiKTtcblx0XHRcdFx0XHQvL3doZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgYXdheSBmcm9tIHRoZSBzYXZlIGJ1dHRvbiB3aGlsZSBwcmVzc2VkIHRoZW4gdGhlcmUgd2lsbCBiZSBub1xuXHRcdFx0XHRcdC8vbW91c2V1cCBldmVudCBvbiB0aGUgc2F2ZSBidXR0b24uIFRoZXJlZm9yZSwgdGhlIHVubG9ja2luZyBpcyBkb25lIG9uIFwibW91c2V1cFwiIGFuZCBcImJsdXJcIlxuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2V1cFwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tZXJnZVBhdGNoRHJhZnQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGU7XG5cdH1cblxuXHRfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTogT2JqZWN0UGFnZUxheW91dCB7XG5cdFx0cmV0dXJuIHRoaXMuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdH1cblxuXHRhc3luYyBfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTogUHJvbWlzZTx7IHRpdGxlOiBzdHJpbmc7IHN1YnRpdGxlOiBzdHJpbmc7IGludGVudDogc3RyaW5nOyBpY29uOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4ge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhKSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VEZXNjcmlwdGlvbiA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YSkge1xuXHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcIk9iamVjdFBhZ2VEZXNjcmlwdGlvblwiO1xuXHRcdH0pO1xuXHRcdGNvbnN0IGV4dHJhY3RQYXRocyA9IChiaW5kaW5nSW5mbz86IHsgcGFydHM/OiB7IHBhdGg/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nIH1bXSB9KTogc3RyaW5nW10gPT5cblx0XHRcdEFycmF5LmZyb20oXG5cdFx0XHRcdG5ldyBTZXQoXG5cdFx0XHRcdFx0KGJpbmRpbmdJbmZvPy5wYXJ0cyB8fCBbXSlcblx0XHRcdFx0XHRcdC5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0Lm1vZGVsKVxuXHRcdFx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXRoIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y29uc3Qgc3VidGl0bGVQYXRocyA9IGV4dHJhY3RQYXRocyhvT2JqZWN0UGFnZVN1YnRpdGxlPy5nZXRCaW5kaW5nSW5mbyhcInZhbHVlXCIpKTtcblx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGhzID0gZXh0cmFjdFBhdGhzKG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikpO1xuXHRcdGNvbnN0IHBhdGhzVG9SZXNvbHZlID0gWy4uLnN1YnRpdGxlUGF0aHMsIC4uLmRlc2NyaXB0aW9uUGF0aHNdO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGZuQ2xlYXJDYWNoZVRpdGxlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlKG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSBhcyBzdHJpbmcpO1xuXHRcdH07XG5cdFx0aWYgKChvT2JqZWN0UGFnZURlc2NyaXB0aW9uIHx8IG9PYmplY3RQYWdlU3VidGl0bGUpICYmICF0aGlzLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXApIHtcblx0XHRcdG9PYmplY3RQYWdlU3VidGl0bGU/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVRpdGxlSGllcmFyY2h5Q2FjaGVTZXRVcCA9IHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IG9PYmplY3RQYWdlQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYnVpbGQgPSAoKTogeyB0aXRsZTogc3RyaW5nOyBzdWJ0aXRsZTogc3RyaW5nOyBpbnRlbnQ6IHN0cmluZzsgaWNvbjogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0gPT4gKHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpID8/IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZT8uZ2V0VmFsdWUoKSA/PyBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBvT2JqZWN0UGFnZURlc2NyaXB0aW9uPy5nZXRWYWx1ZSgpID8/IFwiXCJcblx0XHR9KTtcblx0XHQvL2lmIG5vIGNvbnRleHQgb3Igbm90aGluZyB0byByZXNvbHZlLCBkaXJlY3QgcmV0dXJuXG5cdFx0aWYgKCFvT2JqZWN0UGFnZUNvbnRleHQgfHwgcGF0aHNUb1Jlc29sdmUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1aWxkKCkpO1xuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHBhdGhzVG9SZXNvbHZlLm1hcChhc3luYyAocCkgPT4gKG9PYmplY3RQYWdlQ29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkucmVxdWVzdFByb3BlcnR5KHApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpXG5cdFx0KTtcblx0XHRyZXR1cm4gYnVpbGQoKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSAob0V4ZWN1dGlvbi5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIENvbW1hbmRFeGVjdXRpb24pLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSEpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbLS1pU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3U2VjdGlvbikge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obmV3U2VjdGlvbik7XG5cdFx0XHRcdG5ld1NlY3Rpb24uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rm9vdGVyVmlzaWJpbGl0eSgpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdFx0Py5lbmFibGVkO1xuXHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IGlzRXJyb3JNZXNzYWdlID0gb01lc3NhZ2UudmFsaWRhdGlvbiAmJiBvTWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIjtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZVZhbGlkYXRpb24gPSBpc0hpZGRlbkRyYWZ0RW5hYmxlZFxuXHRcdFx0XHRcdD8gaXNFcnJvck1lc3NhZ2Vcblx0XHRcdFx0XHQ6IGlzRXJyb3JNZXNzYWdlICYmIG9NZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcyhzVmlld0lkKSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlVmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2hvd01lc3NhZ2VQb3BvdmVyKCk6IHZvaWQge1xuXHRcdGNvbnN0IGlzRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKGlzRWRpdE1vZGUgJiYgIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKSBhcyBMaXN0QmluZGluZztcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2VkaXREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIG9iamVjdC5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNPYmplY3QgVGhlIHNlbWFudGljIG9iamVjdFxuXHQgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgdGhlIGRlZmF1bHQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgb2JqZWN0XG5cdCAqL1xuXHRfZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmdcblx0KTogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogcHJvcGVydHlQYXRoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNlbWFudGljT2JqZWN0XG5cdFx0XHR9XG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIG9uIGEgdHJhbnNpZW50IGNvbnRleHQ6XG5cdCAqIC0gaWYgdGhlIGNvbnRleHQgZ2V0cyBkYXRhLCB3YWl0IGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgYW5kIGV4ZWN1dGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uXG5cdCAqIC0gaWYgbm8gZGF0YSBpcyBmb3VuZCBvbiB0aGlzIGNvbnRleHQsIG9ubHkgdGhlIHByZXBhcmVBY3Rpb24gaXMgcmVxdWVzdGVkXG5cdCAqIC0gb24gYSByZWd1bGFyIGNvbnRleHQsIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBpcyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb2YgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHVuZGVmaW5lZCBpZiBub3QgZXhlY3V0ZWRcblx0ICovXG5cdGFzeW5jIF92YWxpZGF0ZURvY3VtZW50KCk6IFByb21pc2U8dm9pZCB8IHVua25vd25bXSB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0XHRjb25zdCBjb250cm9sID0gVUk1RWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCkgYXMgQ29udHJvbDtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghY29udHJvbCB8fCAhY29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0bGV0IGJ5UGFzc1NpZGVFZmZlY3RzID0gZmFsc2U7XG5cdFx0aWYgKGNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0aWYgKGNvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ5UGFzc1NpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKGNvbnRyb2wpO1xuXHRcdGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdsb2JhbFZhbGlkYXRpb24oY29udGV4dCwgYnlQYXNzU2lkZUVmZmVjdHMpO1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29udHJvbCB9KTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIHRoZSBnbG9iYWwgc2lkZSBlZmZlY3RzIGFyZSBleGVjdXRlZCBpZiB0aGVzZSBzaWRlIGVmZmVjdHMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHRcblx0ICogLSB0aGUgZHJhZnQgVmFsaWRhdGlvbiBvbiB0aGUgRHJhZnRSb290IGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0XG5cdCAqIEBwYXJhbSBieVBhc3NTaWRlRWZmZWN0cyBPbmx5IHRoZSBkcmFmdCBWYWxpZGF0aW9uIHN0ZXAgaXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvZiB0aGUgZ2xvYmFsIHZhbGlkYXRpb25cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVHbG9iYWxWYWxpZGF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBieVBhc3NTaWRlRWZmZWN0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkIHwgdW5rbm93bltdIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Ly8gdGhlIGRyYWZ0IHZhbGlkYXRpb24gaXMgdHJlYXRlZCBhcyBhIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCB0aGUgc2VydmljZSBtdXN0IHJldHVybiB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFnYWluIGlmIHN0aWxsIHZhbGlkXG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoIWJ5UGFzc1NpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChnbG9iYWxTaWRlRWZmZWN0cy5tYXAoYXN5bmMgKHNpZGVFZmZlY3RzKSA9PiB0aGlzLnNpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0KSkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Ly9FeGVjdXRlIHRoZSBkcmFmdFZhbGlkYXRpb24gaWYgdGhlcmUgaXMgbm8gZ2xvYmFsU2lkZUVmZmVjdHMgKGlnbm9yZSBFVGFncyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0KVxuXHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRyZXR1cm4gZHJhZnQuZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihkcmFmdFJvb3RDb250ZXh0LCBhcHBDb21wb25lbnQsIHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZHJhZnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogSWYgZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBvbiB0aGUgY3JlYXRpb24gcm93cywgdGhlIHJlbGF0ZWQgZG9jdW1lbnRzIGFyZSBjcmVhdGVkXG5cdCAqIGJlZm9yZSBzYXZpbmcgdGhlIGRyYWZ0IHZlcnNpb24uXG5cdCAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBJbmRpY2F0ZXMgaWYgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcgc2hvdWxkIGJlIHNraXBwZWRcblx0ICogQHBhcmFtIHVzZVNhdmVBbmRMZWF2ZSBJbmRpY2F0ZXMgaWYgdGhlIHNhdmUgaXMgdHJpZ2dlcmVkIGZyb20gYSBzYXZlIGFuZCBsZWF2ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX3NhdmVEb2N1bWVudChza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sIHVzZVNhdmVBbmRMZWF2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhd2FpdENyZWF0ZURvY3VtZW50czogUHJvbWlzZTx2b2lkIHwgT0RhdGFMaXN0QmluZGluZz5bXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG1lc3NhZ2VQb3BvdmVyRXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG1vZGVsKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGRpYWxvZ0FjdGlvbiA9IGF3YWl0IG5ldyBDb2xsYWJvcmF0aW9uRGlzY2FyZCh0aGlzLmdldFZpZXcoKSwgdHJ1ZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJjYW5jZWxcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBXZSBrZWVwIHRoZSBkcmFmdCBhbmQgbGVhdmUgZm9yIExSXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBjb2xsYWJvcmF0aW9uIGRpc2NhcmQ6ICR7ZXJyfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKCh0YWJsZTogVGFibGUpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUJpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoKGNyZWF0aW9uUm93Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkKT8uZ2V0T2JqZWN0KCkgfHwge30pO1xuXHRcdFx0XHRpZiAoY29udGV4dEtleXMuZmlsdGVyKChrZXkpID0+ICFrZXkuc3RhcnRzV2l0aChcIkAkdWk1LlwiKSkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXRDcmVhdGVEb2N1bWVudHMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZURvY3VtZW50KHRhYmxlQmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGUuZGF0YShcImNyZWF0aW9uTW9kZVwiKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHRcdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0QWdncmVnYXRpb24oXCJjcmVhdGlvbk1vZGVcIikgYXMgVGFibGVDcmVhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdCk/LmdldFByb3BlcnR5KFwiY3JlYXRlQXRFbmRcIikgPT09IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiB0cnVlIC8vIHRoZSBza2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXksIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGhhbmRsZVNpZGVFZmZlY3RzIGZ1bmNpdG9uIHRvIGF2b2lkIGJhdGNoIHJlZHVuZGFuY3lcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGFibGVCaW5kaW5nKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bGV0IGlzU3RhbmRhcmRTYXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNraXBCaW5kaW5nVG9WaWV3ICYmIHR5cGVvZiBza2lwQmluZGluZ1RvVmlldyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRjb25zdCBjb21tYW5kID0gKHNraXBCaW5kaW5nVG9WaWV3IGFzIENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50KT8uZ2V0U291cmNlPy4oKT8uZ2V0Q29tbWFuZD8uKCk7XG5cdFx0XHRcdGlzU3RhbmRhcmRTYXZlID0gY29tbWFuZCA9PT0gXCJTYXZlXCI7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGF3YWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHtcblx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0XHRiaW5kaW5nczogYmluZGluZ3MgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0XHRcdFx0bWVyZ2VQYXRjaERyYWZ0OiB0aGlzLm1lcmdlUGF0Y2hEcmFmdCxcblx0XHRcdFx0XHRza2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRpc1N0YW5kYXJkU2F2ZSxcblx0XHRcdFx0XHR1c2VTYXZlQW5kTGVhdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHRpZiAoZXJyb3IgIT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRtZXNzYWdlUG9wb3ZlckVyciA9IChlcnJvciBhcyBzdHJpbmcpID8/IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQobW9kZWwpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG1vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChtZXNzYWdlUG9wb3ZlckVyciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChtZXNzYWdlUG9wb3ZlckVyci5sZW5ndGgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IobWVzc2FnZVBvcG92ZXJFcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9jYW5jZWxEb2N1bWVudChtUGFyYW1ldGVyczogeyBjYW5jZWxCdXR0b246IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBjYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikgYXMgQnV0dG9uIHwgdW5kZWZpbmVkOyAvL3RvIGdldCB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjYW5jZWwgYnV0dG9uIGZyb20gY29tbWFuZCBleGVjdXRpb25cblx0XHRjb25zdCBsYXN0Rm9jdXNlZENvbnRyb2xJZCA9IFVJNUVsZW1lbnQuZ2V0QWN0aXZlRWxlbWVudCgpPy5nZXRJZCgpO1xuXHRcdGxldCBzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCgpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkaWFsb2dBY3Rpb24gPSBhd2FpdCBuZXcgQ29sbGFib3JhdGlvbkRpc2NhcmQodGhpcy5nZXRWaWV3KCksIGZhbHNlKS5nZXRVc2VyQWN0aW9uKCk7XG5cdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdGlmIChkaWFsb2dBY3Rpb24gPT09IFwiY2FuY2VsXCIpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV2Uga2VlcCB0aGUgZHJhZnQgYW5kIGxlYXZlIGZvciBMUlxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImtlZXBEcmFmdFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFdlIGhhdmUgZGlzcGxheWVkIHRoZSBkaWFsb2cgYW5kIHRoZSB1c2VyIGNvbmZpcm1lZCB0aGUgZGlzY2FyZCAtPiBXZSBza2lwIHRoZSBkaXNjYXJkIGNvbmZpcm1hdGlvblxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImRpc2NhcmRDb25maXJtZWRcIikge1xuXHRcdFx0XHRcdHNob3VsZFNraXBEaXNjYXJkUG9wb3ZlciA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZ2V0IGNvbGxhYm9yYXRpdmUgdXNlcnNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGlzRG9jdW1lbnRNb2RpZmllZCA9XG5cdFx0XHQhIXRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fFxuXHRcdFx0KCF0aGlzLmdldFN0aWNreUVkaXRNb2RlKCkgJiYgY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UpO1xuXHRcdGNvbnN0IGFmdGVyQ2FuY2VsOiBGdW5jdGlvbiA9IChwcm9taXNlUmVzdWx0OiBPRGF0YVY0Q29udGV4dCkgPT4ge1xuXHRcdFx0Ly8gZm9jdXMgaXMgcmV0YWluZWQgb24gdGhlIGxhc3QgZm9jdXNlZCBlbGVtZW50XG5cdFx0XHRpZiAobGFzdEZvY3VzZWRDb250cm9sSWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRVSTVFbGVtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RGb2N1c2VkQ29udHJvbElkKT8uZm9jdXMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwcm9taXNlUmVzdWx0O1xuXHRcdH07XG5cdFx0aWYgKFxuXHRcdFx0KHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdCk/LmVuYWJsZWQgJiZcblx0XHRcdGlzRG9jdW1lbnRNb2RpZmllZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhZnRlckNhbmNlbCxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdFx0XHRcdHRydWVcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93XG5cdFx0XHQuY2FuY2VsRG9jdW1lbnQoY29udGV4dCwgeyBjb250cm9sOiBjYW5jZWxCdXR0b24sIHNraXBEaXNjYXJkUG9wb3Zlcjogc2hvdWxkU2tpcERpc2NhcmRQb3BvdmVyIH0pXG5cdFx0XHQudGhlbigocHJvbWlzZVJlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWZ0ZXJDYW5jZWwocHJvbWlzZVJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmFwcGx5RG9jdW1lbnQob0NvbnRleHQpLmNhdGNoKCgpID0+IHtcblx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBzaG93UmVsYXRlZEFwcHMgPSBvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpO1xuXHRcdGlmIChzaG93UmVsYXRlZEFwcHMgPT09IFwidHJ1ZVwiIHx8IHNob3dSZWxhdGVkQXBwcyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZSwgYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IENvbnRyb2xbXSwgYVN1YnNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLCBhQ29udHJvbHM6IENvbnRyb2xbXSwgYklzQ2hhcnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtMSBvZiBhUGFyZW50RWxlbWVudCkge1xuXHRcdFx0bGV0IG9FbGVtZW50ID0gKGl0ZW0xIGFzIE1hY3JvQVBJKS5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gPyAoaXRlbTEgYXMgTWFjcm9BUEkpLmdldENvbnRlbnQoKSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChiSXNDaGFydCkge1xuXHRcdFx0XHRpZiAob0VsZW1lbnQ/LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikpIHtcblx0XHRcdFx0XHRjb25zdCBpdGVtcyA9IG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikgYXMgQ29udHJvbFtdO1xuXHRcdFx0XHRcdGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW06IENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChpdGVtLmlzQTxDaGFydEJsb2NrPihcInNhcC5mZS5tYWNyb3MuQ2hhcnRcIikpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhcnRDb250cm9sID0gaXRlbS5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2goY2hhcnRDb250cm9sKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0E8RHluYW1pY1NpZGVDb250ZW50PihcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1N1YkVsZW1lbnQgPSBvRWxlbWVudC5nZXRNYWluQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQoKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAob1N1YkVsZW1lbnQgJiYgb1N1YkVsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQgPSBvU3ViRWxlbWVudFswXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhlIHRhYmxlIG1heSBjdXJyZW50bHkgYmUgc2hvd24gaW4gYSBmdWxsIHNjcmVlbiBkaWFsb2csIHdlIGNhbiB0aGVuIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYWJsZUFQSVxuXHRcdFx0XHQvLyBjb250cm9sIGZyb20gdGhlIGN1c3RvbSBkYXRhIG9mIHRoZSBwbGFjZSBob2xkZXIgcGFuZWxcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAubS5QYW5lbFwiKSAmJiBvRWxlbWVudC5kYXRhKFwiRnVsbFNjcmVlblRhYmxlUGxhY2VIb2xkZXJcIikpIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmRhdGEoXCJ0YWJsZUFQSXJlZmVyZW5jZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQTxUYWJsZUFQST4oXCJzYXAuZmUubWFjcm9zLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1N1YkVsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gPyBvRWxlbWVudC5nZXRDb250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9TdWJFbGVtZW50ICYmIG9TdWJFbGVtZW50LmlzQSAmJiBvU3ViRWxlbWVudC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob1N1YkVsZW1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRBbGxTdWJTZWN0aW9ucygpOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0bGV0IGFTdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IE9iamVjdFBhZ2VTZWN0aW9uKSB7XG5cdFx0XHRhU3ViU2VjdGlvbnMgPSBhU3ViU2VjdGlvbnMuY29uY2F0KG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhU3ViU2VjdGlvbnM7XG5cdH1cblxuXHRfZ2V0QWxsQmxvY2tzKCk6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSB7XG5cdFx0bGV0IGFCbG9ja3M6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSA9IFtdO1xuXHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uKSB7XG5cdFx0XHRhQmxvY2tzID0gYUJsb2Nrcy5jb25jYXQob1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCkgYXMgRW5oYW5jZVdpdGhVSTU8U3ViU2VjdGlvbkJsb2NrPltdKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYUJsb2Nrcztcblx0fVxuXG5cdF9maW5kVGFibGVzKCk6IFRhYmxlW10ge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogVGFibGVbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhYmxlcztcblx0fVxuXG5cdF9maW5kQ2hhcnRzKCk6IENoYXJ0W10ge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYUNoYXJ0czogQ2hhcnRbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNoYXJ0cztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCk6IHZvaWQge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogRW5oYW5jZVdpdGhVSTU8U3ViU2VjdGlvbkJsb2NrPik6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBvQmxvY2suZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9CbG9jay5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAob0NvbnRlbnQgJiYgb0NvbnRlbnQuaXNBICYmIG9Db250ZW50LmlzQTxEeW5hbWljU2lkZUNvbnRlbnQ+KFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFydCBDb250ZXh0IGlzIHJlc29sdmVkIGZvciAxOm4gbWljcm9jaGFydHMuXG5cdCAqIEBwYXJhbSBvQ2hhcnRDb250ZXh0IFRoZSBDb250ZXh0IG9mIHRoZSBNaWNyb0NoYXJ0XG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIFRoZSBjb2xsZWN0aW9uUGF0aCBvZiB0aGUgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIEF0dHJpYnV0ZXMgb2YgdGhlIGNoYXJ0IENvbnRleHRcblx0ICovXG5cdF9nZXRDaGFydENvbnRleHREYXRhKG9DaGFydENvbnRleHQ6IENvbnRleHQsIHNDaGFydFBhdGg6IHN0cmluZyk6IHVua25vd25bXSB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NoYXJ0Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgb0NoYXJ0Q29udGV4dERhdGEgPSBbb0NvbnRleHREYXRhXTtcblx0XHRpZiAob0NoYXJ0Q29udGV4dCAmJiBzQ2hhcnRQYXRoKSB7XG5cdFx0XHRpZiAob0NvbnRleHREYXRhW3NDaGFydFBhdGhdKSB7XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhID0gb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRkZWxldGUgb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YS5wdXNoKG9Db250ZXh0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQ2hhcnRDb250ZXh0RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIHRhYmxlcyB0byB0aGUgcm93IHdpdGggdGhlIHNQYXRoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUm93UGF0aCAnc1BhdGggb2YgdGhlIHRhYmxlIHJvdydcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fZmluZFRhYmxlcyAmJiB0aGlzLl9maW5kVGFibGVzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBhVGFibGVzKSB7XG5cdFx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhpdGVtLCBzUm93UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtZXJnZSBzZWxlY3RlZCBjb250ZXh0cyBhbmQgZmlsdGVycy5cblx0ICogQHBhcmFtIG9QYWdlQ29udGV4dCBQYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIGFMaW5lQ29udGV4dCBTZWxlY3RlZCBDb250ZXh0c1xuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBDb2xsZWN0aW9uIG5hbWUgb2YgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIFNlbGVjdGlvbiBWYXJpYW50IE9iamVjdFxuXHQgKi9cblx0X21lcmdlTXVsdGlwbGVDb250ZXh0cyhcblx0XHRvUGFnZUNvbnRleHQ6IENvbnRleHQsXG5cdFx0YUxpbmVDb250ZXh0OiBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdHNDaGFydFBhdGg6IHN0cmluZ1xuXHQpOiB7IHNlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQ7IGF0dHJpYnV0ZXM6IHVua25vd25bXSB9IHtcblx0XHRsZXQgYUF0dHJpYnV0ZXM6IHVua25vd25bXSA9IFtdLFxuXHRcdFx0YVBhZ2VBdHRyaWJ1dGVzID0gW10sXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdHNNZXRhUGF0aExpbmU6IHN0cmluZyxcblx0XHRcdHNQYXRoTGluZTtcblxuXHRcdGNvbnN0IHNQYWdlUGF0aCA9IG9QYWdlQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYWdlQ29udGV4dCAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKSAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0LmZvckVhY2goKG9TaW5nbGVDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob1N1YkNoYXJ0Q29udGV4dERhdGE6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1N1YkNoYXJ0Q29udGV4dERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBgJHtzTWV0YVBhdGhQYWdlfS8ke3NDaGFydFBhdGh9YFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TaW5nbGVDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhMaW5lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhUGFnZUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRjb250ZXh0RGF0YTogb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhQYWdlXG5cdFx0fSk7XG5cdFx0Ly8gQWRkaW5nIFBhZ2UgQ29udGV4dCB0byBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGFQYWdlQXR0cmlidXRlcyA9IHRoaXMuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5yZW1vdmVTZW5zaXRpdmVEYXRhKGFQYWdlQXR0cmlidXRlcywgc01ldGFQYXRoUGFnZSk7XG5cdFx0Y29uc3Qgb1BhZ2VMZXZlbFNWID0gQ29tbW9uVXRpbHMuYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQoKSwgYVBhZ2VBdHRyaWJ1dGVzLCB0aGlzLmdldFZpZXcoKSk7XG5cdFx0YUF0dHJpYnV0ZXMgPSB0aGlzLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucmVtb3ZlU2Vuc2l0aXZlRGF0YShhQXR0cmlidXRlcywgc01ldGFQYXRoUGFnZSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IG9QYWdlTGV2ZWxTVixcblx0XHRcdGF0dHJpYnV0ZXM6IGFBdHRyaWJ1dGVzXG5cdFx0fTtcblx0fVxuXG5cdF9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCksXG5cdFx0XHRvQ29uZmlndXJhdGlvbnMgPSBvVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sXG5cdFx0XHRhQ29uZmlndXJhdGlvbnMgPSBvQ29uZmlndXJhdGlvbnMgJiYgT2JqZWN0LmtleXMob0NvbmZpZ3VyYXRpb25zKSxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IFtcIiRhdXRvLkhlcm9lc1wiLCBcIiRhdXRvLkRlY29yYXRpb25cIiwgXCIkYXV0by5Xb3JrZXJzXCJdO1xuXG5cdFx0aWYgKGFDb25maWd1cmF0aW9ucyAmJiBhQ29uZmlndXJhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUNvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0tleV0gYXMgTWljcm9DaGFydE1hbmlmZXN0Q29uZmlndXJhdGlvbjtcblx0XHRcdFx0aWYgKG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkID09PSBcIkxvbmdSdW5uZXJzXCIpIHtcblx0XHRcdFx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvLkxvbmdSdW5uZXJzXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFCYXRjaEdyb3Vwcztcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gaW5pdGlhbGl6ZSBwYWdpbmF0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIG9iamVjdCBwYWdlXG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIEludGVybmFsIG1vZGVsXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBQYXJlbnQgbGlzdCBiaW5kaW5nIHRvIHVzZVxuXHQgKi9cblx0X2luaXRpYWxpemVQYWdpbmF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGxpc3RCaW5kaW5nPzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGlmICh2aWV3TGV2ZWwgPiAxKSB7XG5cdFx0XHRjb25zdCBwYWdpbmF0b3JDdXJyZW50Q29udGV4dCA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIik7XG5cdFx0XHRpZiAocGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ1RvVXNlID0gcGFnaW5hdG9yQ3VycmVudENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKGJpbmRpbmdUb1VzZSwgcGFnaW5hdG9yQ3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChsaXN0QmluZGluZykge1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKGxpc3RCaW5kaW5nLCBjb250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpOiB2b2lkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0RhdGFQb2ludHMgPSBDb21tb25VdGlscy5nZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24oXG5cdFx0XHRvVmlldy5nZXRWaWV3RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldE91dGJvdW5kcygpXG5cdFx0KTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IG9QYWdlQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlXCIsIHt9KTtcblx0XHRpZiAob1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IG9iamVjdCkge1xuXHRcdFx0XHRcdHJldHVybiBmbkdldExpbmtzKG9EYXRhUG9pbnRzLCBvRGF0YSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb0Vycm9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5PbkVycm9yKG9FcnJvcjogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmblNldExpbmtFbmFibGVtZW50KGlkOiBzdHJpbmcsIGFTdXBwb3J0ZWRMaW5rczogeyBzdXBwb3J0ZWQ/OiBib29sZWFuIH1bXSk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgc0xpbmtJZCA9IGlkO1xuXHRcdFx0Ly8gcHJvY2VzcyB2aWFibGUgbGlua3MgZnJvbSBnZXRMaW5rcyBmb3IgYWxsIGRhdGFwb2ludHMgaGF2aW5nIG91dGJvdW5kXG5cdFx0XHRpZiAoYVN1cHBvcnRlZExpbmtzICYmIGFTdXBwb3J0ZWRMaW5rcy5sZW5ndGggPT09IDEgJiYgYVN1cHBvcnRlZExpbmtzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlzSGVhZGVyRFBMaW5rVmlzaWJsZS8ke3NMaW5rSWR9YCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9TdWJEYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3MoXG5cdFx0XHRvU3ViRGF0YVBvaW50czogUmVjb3JkPFxuXHRcdFx0XHRzdHJpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc3RyaW5nO1xuXHRcdFx0XHRcdGFjdGlvbjogc3RyaW5nO1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdO1xuXHRcdFx0XHR9XG5cdFx0XHQ+LFxuXHRcdFx0b1BhZ2VEYXRhOiBvYmplY3Rcblx0XHQpOiB2b2lkIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9TdWJEYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvU3ViRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdFx0XHRjb25zdCBvTGluayA9IG9WaWV3LmJ5SWQoc0lkKTtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIGZvciBkYXRhIHBvaW50cyBjb25maWd1cmVkIGluIGFwcCBkZXNjcmlwdG9yIGJ1dCBub3QgYW5ub3RhdGVkIGluIHRoZSBoZWFkZXJcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvTGlua0NvbnRleHQgPSBvTGluay5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBvTGlua0RhdGE6IG9iamVjdCA9IG9MaW5rQ29udGV4dCAmJiBvTGlua0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBvTWl4ZWRDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IG1lcmdlKHt9LCBvUGFnZURhdGEsIG9MaW5rRGF0YSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdC8vIHByb2Nlc3Mgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdzXG5cdFx0XHRcdGlmIChvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZztcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gaW4gYVNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBhU2VtYW50aWNPYmplY3RNYXBwaW5nW2l0ZW1dO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01haW5Qcm9wZXJ0eSA9IG9NYXBwaW5nW1wiTG9jYWxQcm9wZXJ0eVwiXSFbXCIkUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01hcHBlZFByb3BlcnR5ID0gb01hcHBpbmdbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdITtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRvTmV3TWFwcGluZ1tzTWFwcGVkUHJvcGVydHldID0gb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0XHRvTWl4ZWRDb250ZXh0ID0gbWVyZ2Uoe30sIG9NaXhlZENvbnRleHQsIG9OZXdNYXBwaW5nKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmICghc0tleS5zdGFydHNXaXRoKFwiX1wiKSAmJiAhc0tleS5pbmNsdWRlcyhcIm9kYXRhLmNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRcdFx0b1BhcmFtc1tzS2V5XSA9IG9NaXhlZENvbnRleHRbc0tleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHZhbGlkYXRlIGlmIGEgbGluayBtdXN0IGJlIHJlbmRlcmVkXG5cdFx0XHRcdG9TaGVsbFNlcnZpY2VzXG5cdFx0XHRcdFx0LmlzTmF2aWdhdGlvblN1cHBvcnRlZChbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvbjogb0RhdGFQb2ludC5hY3Rpb25cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOiBvUGFyYW1zXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0XHQudGhlbigoYUxpbmtzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRMaW5rRW5hYmxlbWVudChzSWQsIGFMaW5rcyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZm5PbkVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZmluZFN1bW1hcml6ZUJ1dHRvbigpOiBCdXR0b24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGNvbnN0IG9iamVjdFBhZ2VUaXRsZSA9IG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlO1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBvYmplY3RQYWdlVGl0bGU/LmdldEFjdGlvbnMoKTtcblx0XHRsZXQgc3VtbWFyaXplQnV0dG9uOiBCdXR0b24gfCB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG5cdFx0XHRpZiAoYWN0aW9uLmlzQTxTdW1tYXJpemF0aW9uQnV0dG9uPihcInNhcC5mZS5tYWNyb3MuYWkuU3VtbWFyaXphdGlvbkJ1dHRvblwiKSkge1xuXHRcdFx0XHRjb25zdCBidXR0b24gPSBhY3Rpb24uZ2V0Q29udGVudCgpIGFzIEJ1dHRvbiB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGJ1dHRvbiAmJiBidXR0b24uZ2V0SWQoKS5lbmRzV2l0aChcIjo6U3VtbWFyaXplOjpidXR0b25cIikpIHtcblx0XHRcdFx0XHRzdW1tYXJpemVCdXR0b24gPSBidXR0b247XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3VtbWFyaXplQnV0dG9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyBzdGFydHVwIHBhcmFtZXRlcnMgYW5kIHRyaWdnZXJzIHRoZSBzbWFydCBzdW1tYXJ5IGFjdGlvbiBvbiB0aGUgT2JqZWN0IFBhZ2UgaWYgcmVxdWlyZWQuXG5cdCAqXG5cdCAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMgaW5kaWNhdGUgdGhhdCBhIHNtYXJ0IHN1bW1hcnkgc2hvdWxkIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGN1cnJlbnQgT2JqZWN0IFBhZ2UgbGV2ZWwuXG5cdCAqIFRoZSBsZXZlbCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCBPYmplY3QgUGFnZSBzaG91bGQgYmUgc3VtbWFyaXplZCwgd2hpY2ggaXMgcmVsZXZhbnQgaW4gRmxleGlibGUgQ29sdW1uIExheW91dCAoRkNMKSBzY2VuYXJpb3Mgd2hlcmVcblx0ICogbXVsdGlwbGUgT2JqZWN0IFBhZ2VzIG1heSBiZSBkaXNwbGF5ZWQgc2ltdWx0YW5lb3VzbHkuXG5cdCAqIElmIG5vIGxldmVsIGlzIHByb3ZpZGVkIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIHRoZSBtZXRob2QgZGVmYXVsdHMgdGhlIGxldmVsIHRvIDEuXG5cdCAqIElmIHRoZSBzdW1tYXJ5IGFjdGlvbiBpcyBhbGxvd2VkIGFuZCB0aGUgU21hcnRTdW1tYXJpemUgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUsIGl0IGxvY2F0ZXMgdGhlIHN1bW1hcml6ZSBidXR0b24gYW5kIHRyaWdnZXJzIGl0cyBwcmVzcyBldmVudC5cblx0ICogVGhlIG1ldGhvZCBlbnN1cmVzIHRoZSBzdW1tYXJ5IGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBwZXIgbmF2aWdhdGlvbiBhbmQgbG9ncyBlcnJvcnMgaWYgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldCBvciB0aGUgYnV0dG9uIGlzIHVuYXZhaWxhYmxlLlxuXHQgKiBBbGwgZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0IGFuZCBsb2dnZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaGFuZGxlU21hcnRTdW1tYXJ5U3RhcnR1cEFjdGlvbigpOiB2b2lkIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGFwcENvbXBvbmVudFxuXHRcdFx0Py5nZXRTdGFydHVwUGFyYW1ldGVycygpXG5cdFx0XHQ/LnRoZW4oKHN0YXJ0dXBQYXJhbXM6IFN0YXJ0dXBQYXJhbWV0ZXJzKSA9PiB7XG5cdFx0XHRcdGlmICghc3RhcnR1cFBhcmFtcy5wcmVmZXJyZWRBY3Rpb24gfHwgIXN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdLnN0YXJ0c1dpdGgoXCJzdW1tYXJ5XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBjb3JyZWN0IE9QIGJ5IGNoZWNraW5nIHRoZSBsZXZlbCBwcm92aWRlZCBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdFx0XHRcdGNvbnN0IHZpZXdMZXZlbCA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdFx0XHRjb25zdCBwcmVmZXJyZWRBY3Rpb25MZXZlbCA9XG5cdFx0XHRcdFx0c3RhcnR1cFBhcmFtcy5wcmVmZXJyZWRBY3Rpb25bMF0gPT09IFwic3VtbWFyeVwiID8gMSA6IHBhcnNlSW50KHN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdLnNwbGl0KFwiLVwiKVsxXSwgMTApO1xuXHRcdFx0XHRpZiAoaXNOYU4ocHJlZmVycmVkQWN0aW9uTGV2ZWwpIHx8IHZpZXdMZXZlbCAhPT0gcHJlZmVycmVkQWN0aW9uTGV2ZWwpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBzdW1tYXJ5IGFjdGlvbiBzaGFsbCBiZSBleGVjdXRlZCBub3cgKGl0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkIGJ5IGEgaGlnaGVyIGxldmVsIE9QKVxuXHRcdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFByZWZlcnJlZEFjdGlvblN0YXR1cygpID09PSBQcmVmZXJyZWRBY3Rpb25TdGF0dXMuQ2FuUGVyZm9ybSkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5zZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMoUHJlZmVycmVkQWN0aW9uU3RhdHVzLkFscmVhZHlQZXJmb3JtZWQpOyAvLyB0byBwcmV2ZW50IG90aGVyIE9QcyBvbiBoaWdoZXIgbGV2ZWxzIHRvIGV4ZWN1dGUgdGhlIHN1bW1hcnkgYWdhaW5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBTbWFydFN1bW1hcml6ZSBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZVxuXHRcdFx0XHRjb25zdCBlbnZpcm9ubWVudFNlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKTtcblx0XHRcdFx0aWYgKCFlbnZpcm9ubWVudFNlcnZpY2U/LmVudmlyb25tZW50Q2FwYWJpbGl0aWVzLlNtYXJ0U3VtbWFyaXplKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU21hcnQgU3VtbWFyaXphdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBiZWNhdXNlIFNtYXJ0U3VtbWFyaXplIGNhcGFiaWxpdHkgaXMgbm90IGF2YWlsYWJsZVwiKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBTdW1tYXJ5IGJ1dHRvblxuXHRcdFx0XHRjb25zdCBzdW1tYXJpemVCdXR0b24gPSB0aGlzLl9maW5kU3VtbWFyaXplQnV0dG9uKCk7XG5cblx0XHRcdFx0aWYgKHN1bW1hcml6ZUJ1dHRvbiAmJiBzdW1tYXJpemVCdXR0b24uZ2V0VmlzaWJsZSgpICYmIHN1bW1hcml6ZUJ1dHRvbi5nZXRFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzdW1tYXJpemVCdXR0b24uZmlyZVByZXNzKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFwiU21hcnQgU3VtbWFyaXphdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBiZWNhdXNlIHRoZSBTdW1tYXJpemUgYnV0dG9uIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgZW5hYmxlZCBvciBub3QgZm91bmQuXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyBzdGFydHVwIHBhcmFtZXRlcnMgb3IgdHJpZ2dlcmluZyBzbWFydCBzdW1tYXJ5OlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHRvblByaW1hcnlBY3Rpb24oXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvVmlldzogRkVWaWV3LFxuXHRcdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdH0sXG5cdFx0XHRtQ29uZGl0aW9uczoge1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdHBvc2l0aXZlQWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdFx0ZWRpdEFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXHRcdFx0fVxuXHRcdCk6IHZvaWQge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJbnZva2VzIHRoZSBwYWdlIHByaW1hcnkgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBDdHJsK0VudGVyIChDbWQrRW50ZXIgb24gbWFjT1MpLlxuXHRcdFx0ICovXG5cblx0XHRcdGNvbnN0IHByaW1hcnlDYW5kaWRhdGUgPSBvQ29udHJvbGxlci5fZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhvVmlldylbMF07XG5cblx0XHRcdC8qIEJ5IGRlc2lnbiwgdGhlcmUgbXVzdCBiZSBhdCBtb3N0IG9uZSBjYW5kaWRhdGUgZHVlIHRvIHRoZSBcInNpbmdsZSBlbXBoYXNpcyBwZXIgcGFnZVwiIHJ1bGUuXG5cdFx0XHQgICBJZiBhIHByaW1hcnktZW50ZXIgdGFyZ2V0IGlzIGZvdW5kLCBpdCBtdXN0IGZ1bGx5IHRha2Ugb3ZlciBDdHJsL0NtZCtFbnRlci4qL1xuXG5cdFx0XHRpZiAocHJpbWFyeUNhbmRpZGF0ZSkge1xuXHRcdFx0XHRpZiAoIXByaW1hcnlDYW5kaWRhdGUuZ2V0RW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gVGFrZSBvdmVyIEN0cmwvQ21kK0VudGVyLCBidXQgZG8gbm90IHRyaWdnZXIgYW55dGhpbmcgd2hlbiB0aGUgcHJpbWFyeSBhY3Rpb24gaXMgZGlzYWJsZWQuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcmltYXJ5Q2FuZGlkYXRlLmlzQShcInNhcC5tLkJ1dHRvblwiKSkge1xuXHRcdFx0XHRcdChwcmltYXJ5Q2FuZGlkYXRlIGFzIEJ1dHRvbikuZmlyZVByZXNzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKChwcmltYXJ5Q2FuZGlkYXRlIGFzIE1lbnVCdXR0b24pLmlzQShcInNhcC5tLk1lbnVCdXR0b25cIikpIHtcblx0XHRcdFx0XHQocHJpbWFyeUNhbmRpZGF0ZSBhcyBNZW51QnV0dG9uKS5maXJlRGVmYXVsdEFjdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5oYW5kbGVycy5vbkNhbGxBY3Rpb24ob1ZpZXcsIHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGUpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXREb2N1bWVudCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlWaWV3TGV2ZWwgPT09IDEgJiYgQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldykpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX3NhdmVEb2N1bWVudCgpO1xuXHRcdFx0fSBlbHNlIGlmIChDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fYXBwbHlEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIE1hbmFnZXMgdGhlIGNvbnRleHQgY2hhbmdlIGV2ZW50IG9uIHRoZSB0YWJsZXMuXG5cdFx0ICogVGhlIGZvY3VzIGlzIHNldCBpZiB0aGlzIGNoYW5nZSBpcyByZWxhdGVkIHRvIGFuIGVkaXRGbG93IGFjdGlvbiBhbmRcblx0XHQgKiBhbiBldmVudCBpcyBmaXJlZCBvbiB0aGUgb2JqZWN0UGFnZSBtZXNzYWdlQnV0dG9uLlxuXHRcdCAqIEBwYXJhbSB0aGlzIFRoZSBvYmplY3RQYWdlIGNvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gZXZlbnQgVGhlIFVJNSBldmVudFxuXHRcdCAqL1xuXHRcdGFzeW5jIG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBldmVudDogVUk1RXZlbnQ8e30sIFRhYmxlQVBJPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0Y29uc3QgdGFibGVBUEkgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGNvbnN0IHRhYmxlID0gdGFibGVBUEkuY29udGVudDtcblx0XHRcdGNvbnN0IGN1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0Y29uc3QgdGFibGVDb250ZXh0cyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyh0YWJsZSk/LmdldEFsbEN1cnJlbnRDb250ZXh0cygpO1xuXG5cdFx0XHRpZiAoY3VycmVudEFjdGlvblByb21pc2UgJiYgdGFibGVDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBjdXJyZW50QWN0aW9uUHJvbWlzZTtcblx0XHRcdFx0XHRpZiAoYWN0aW9uUmVzcG9uc2U/LmNvbnRyb2xJZCA9PT0gdGFibGUuZ2V0SWQoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aW9uRGF0YSA9IGFjdGlvblJlc3BvbnNlLm9EYXRhO1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJlc3BvbnNlLmtleXM7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdJdGVtID1cblx0XHRcdFx0XHRcdFx0dGFibGVDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCh0YWJsZUNvbnRleHQ6IENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlRGF0YSA9IHRhYmxlQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBrZXlzLmV2ZXJ5KChrZXk6IHN0cmluZykgPT4gdGFibGVEYXRhW2tleV0gPT09IGFjdGlvbkRhdGFba2V5XSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQ/LmdldEluZGV4KCkgPz8gLTE7XG5cdFx0XHRcdFx0XHRpZiAobmV3SXRlbSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGlhbG9nID0gSW5zdGFuY2VNYW5hZ2VyLmdldE9wZW5EaWFsb2dzKCkuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnkgZGVzaWduLCBhIHNhcC5tLmRpYWxvZyBzZXQgdGhlIGZvY3VzIHRvIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnQgd2hlbiBjbG9zaW5nLlxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB3YWl0IGZvciB0aGUgZGlhbG9nIHRvIGJlIGNsb3NlZCBiZWZvcmUgc2V0IHRoZSBmb2N1cyB0byBhbm90aGVyIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRkaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhuZXdJdGVtLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhuZXdJdGVtLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLmVkaXRGbG93LmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBBbiBlcnJvciBvY2N1cnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW06ICR7ZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gZmlyZSBNb2RlbENvbnRleHRDaGFuZ2Ugb24gdGhlIG1lc3NhZ2UgYnV0dG9uIHdoZW5ldmVyIHRoZSB0YWJsZSBjb250ZXh0IGNoYW5nZXNcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdG9uVGFibGVCaW5kaW5nVXBkYXRlZCh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5tZXNzYWdlQnV0dG9uLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgb25DYWxsQWN0aW9uKFxuXHRcdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG5cdFx0XHR9XG5cdFx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcjtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgVkggdmFsdWVzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIHRoZSBhY3Rpb25cblx0XHRcdGF3YWl0IG9Db250cm9sbGVyLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblx0XHRvbkRhdGFQb2ludFRpdGxlUHJlc3NlZChcblx0XHRcdG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlcixcblx0XHRcdG9Tb3VyY2U6IENvbnRyb2wsXG5cdFx0XHRvTWFuaWZlc3RPdXRib3VuZDogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RPdXRib3VuZEVudHJ5Pixcblx0XHRcdHNDb250cm9sQ29uZmlnOiBzdHJpbmcsXG5cdFx0XHRzQ29sbGVjdGlvblBhdGg6IHN0cmluZ1xuXHRcdCk6IHZvaWQge1xuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQgPSB0eXBlb2Ygb01hbmlmZXN0T3V0Ym91bmQgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9NYW5pZmVzdE91dGJvdW5kKSA6IG9NYW5pZmVzdE91dGJvdW5kO1xuXHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvTWFuaWZlc3RPdXRib3VuZFtzQ29udHJvbENvbmZpZ10sXG5cdFx0XHRcdG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkhLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0bGV0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob1RhcmdldEluZm8pLFxuXHRcdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBvQ29udHJvbGxlci5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LCBzQ29sbGVjdGlvblBhdGgpLFxuXHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cblx0XHRcdGFOYXZpZ2F0aW9uRGF0YSA9IGFOYXZpZ2F0aW9uRGF0YS5tYXAoZnVuY3Rpb24gKG9OYXZpZ2F0aW9uRGF0YTogdW5rbm93bikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGRhdGE6IG9OYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRtZXRhUGF0aDogc01ldGFQYXRoICsgKHNDb2xsZWN0aW9uUGF0aCA/IGAvJHtzQ29sbGVjdGlvblBhdGh9YCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQ2hlY2sgaWYgaW1wbGljaXQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRpZiAoYVNlbWFudGljT2JqZWN0TWFwcGluZy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tRGF0YSA9IG9Tb3VyY2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoKGRhdGEpID0+IGRhdGEuZ2V0S2V5KCkgPT09IFwiVmFsdWVQcm9wZXJ0eVBhdGhcIik7XG5cdFx0XHRcdGlmIChjdXN0b21EYXRhKSB7XG5cdFx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9Db250cm9sbGVyLl9nZXRJbXBsaWNpdFNlbWFudGljT2JqZWN0TWFwcGluZ0ZvckRhdGFQb2ludHMoXG5cdFx0XHRcdFx0XHRjdXN0b21EYXRhLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0XHRvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRhc3luYyBvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZyxcblx0XHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRcdHNDcmVhdGVQYXRoOiBzdHJpbmdcblx0XHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0LCBvQ29udGV4dCwgc0NyZWF0ZVBhdGgpO1xuXHRcdH0sXG5cblx0XHRvbk5hdmlnYXRlQ2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IFVJNUV2ZW50PHsgc3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24gfT4pOiB2b2lkIHtcblx0XHRcdC8vd2lsbCBiZSBjYWxsZWQgYWx3YXlzIHdoZW4gd2UgY2xpY2sgb24gYSBzZWN0aW9uIHRhYlxuXHRcdFx0dGhpcy5iU2VjdGlvbk5hdmlnYXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIFByZXZlbnQgVmlld1N0YXRlIGZyb20gb3ZlcnJpZGluZyB0aGUgdXNlcidzIG1hbnVhbCB0YWIgc2VsZWN0aW9uLlxuXHRcdFx0Ly8gVGhpcyBpcyBpbXBvcnRhbnQgYWZ0ZXIgZGlzY2FyZCB3aGVuIFZpZXdTdGF0ZS5hcHBseSBtaWdodCB0cnkgdG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgc2VjdGlvbi5cblx0XHRcdHRoaXMuc2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0Y29uc3Qgc3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdFx0dGhpcy50YXJnZXRTdWJTZWN0aW9uID0gc3ViU2VjdGlvbjtcblxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpICYmXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuc2VjdGlvbkxheW91dCA9PT0gXCJUYWJzXCIgJiZcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIikgPT09IGZhbHNlXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKFtzdWJTZWN0aW9uXSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMjAwMCk7XG5cdFx0fSxcblx0XHRuYXZpZ2F0ZVRvU3ViU2VjdGlvbjogZnVuY3Rpb24gKG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlciwgdkRldGFpbENvbmZpZzogc3RyaW5nIHwgb2JqZWN0KTogdm9pZCB7XG5cdFx0XHRjb25zdCBvRGV0YWlsQ29uZmlnID0gdHlwZW9mIHZEZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEZXRhaWxDb25maWcpIDogdkRldGFpbENvbmZpZztcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgSUQgYmFzZWQgb24gaW5wdXQgdHlwZVxuXHRcdFx0bGV0IHRhcmdldElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIG9EZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0dGFyZ2V0SWQgPSBvRGV0YWlsQ29uZmlnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gUHJpb3JpdHk6IHN1YlNlY3Rpb25JZCA+IHNlY3Rpb25JZFxuXHRcdFx0XHR0YXJnZXRJZCA9IG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkID8/IG9EZXRhaWxDb25maWcuc2VjdGlvbklkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGFyZ2V0SWQpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0SWQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjbG9zZUNvbGxhYm9yYXRpb25TdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFwiL3Nob3dDb2xsYWJvcmF0aW9uU3RyaXBcIiwgZmFsc2UpO1xuXHRcdH0sXG5cblx0XHRjbG9zZU9QTWVzc2FnZVN0cmlwOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHZpZXcpO1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRcdGNvbnN0IG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0ID0gaW50ZXJuYWxNb2RlbFxuXHRcdFx0XHQuYmluZENvbnRleHQodGhpcy5nZXRFeHRlbnNpb25BUEkoKS5fZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoKCkpXG5cdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKSE7XG5cdFx0XHQvLyBSZW1vdmUgY29udGV4dCBib3VuZCBtZXNzYWdlcyBhbmQgc2V0IHRoZSBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgdGhlIGJhY2tlbmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBpbiBlZGl0IG1vZGUuXG5cdFx0XHRpZiAoIWJJc0luRWRpdE1vZGUgJiYgbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJPUEJhY2tlbmRNZXNzYWdlVmlzaWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Qm91bmRNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0KG1lc3NhZ2U6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgJiYgbWVzc2FnZS5nZXRQZXJzaXN0ZW50KCkgPT09IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKGNvbnRleHRCb3VuZE1lc3NhZ2VzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJPUEJhY2tlbmRNZXNzYWdlVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLmhpZGVNZXNzYWdlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUhBLE1BQU1BLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFnQjtFQUNuRCxNQUFNRSxxQkFBcUIsR0FBR0QsU0FBUyxDQUFDRSx5QkFBeUI7O0VBRWpFO0FBQ0E7QUFDQTtFQUZBLElBSU1DLG9CQUFvQixJQUFBQyxJQUFBLEdBRHpCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsRUFBQUMsS0FBQSxHQUlqRUMsY0FBYyxDQUFDQyxXQUFXLENBQUMsRUFBQUMsS0FBQSxHQUczQkYsY0FBYyxDQUFDRyxLQUFLLENBQUNDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUc5Q04sY0FBYyxDQUFDTyxlQUFlLENBQUNILFFBQVEsQ0FBQ0ksdUJBQXVCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBR2pFVCxjQUFjLENBQUNVLFNBQVMsQ0FBQ04sUUFBUSxDQUFDTyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHckRaLGNBQWMsQ0FBQ2EsY0FBYyxDQUFDVCxRQUFRLENBQUNVLHNCQUFzQixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUcvRGYsY0FBYyxDQUFDZ0IscUJBQXFCLENBQUNaLFFBQVEsQ0FBQ2EsNkJBQTZCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBRzdFbEIsY0FBYyxDQUFDbUIsb0JBQW9CLENBQUNmLFFBQVEsQ0FBQ2dCLDRCQUE0QixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUczRXJCLGNBQWMsQ0FDZHNCLDZCQUE2QixDQUFDbEIsUUFBUSxDQUFDO0lBQ3RDbUIsaUJBQWlCLEVB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QUFBendCLE9BQUEsQ0FBQWlMLFNBQUEsZ0JBQUFyTixLQUFBO0lBQUE4eUIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFud0IsWUFBQSxHQUFBK3ZCLHlCQUFBLENBQUF6d0IsT0FBQSxDQUFBaUwsU0FBQSxxQkFBQWxOLEtBQUE7SUFBQTJ5QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQWx3QixZQUFBLEdBQUE4dkIseUJBQUEsQ0FBQXp3QixPQUFBLENBQUFpTCxTQUFBLDRCQUFBL00sS0FBQTtJQUFBd3lCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBandCLFlBQUEsR0FBQTZ2Qix5QkFBQSxDQUFBendCLE9BQUEsQ0FBQWlMLFNBQUEsMkJBQUE1TSxLQUFBO0lBQUFxeUIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFod0IsWUFBQSxHQUFBNHZCLHlCQUFBLENBQUF6d0IsT0FBQSxDQUFBaUwsU0FBQSw2QkFBQXpNLEtBQUE7SUFBQWt5QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQS92QixZQUFBLEdBQUEydkIseUJBQUEsQ0FBQXp3QixPQUFBLENBQUFpTCxTQUFBLGdCQUFBak0sS0FBQTtJQUFBMHhCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBOXZCLFlBQUEsR0FBQTB2Qix5QkFBQSxDQUFBendCLE9BQUEsQ0FBQWlMLFNBQUEsZ0JBQUE5TCxLQUFBO0lBQUF1eEIsWUFBQTtJQUFBQyxVQUFBO0lBQUFDLFFBQUE7SUFBQUMsV0FBQTtFQUFBLElBQUFKLHlCQUFBLENBQUF6d0IsT0FBQSxDQUFBaUwsU0FBQSxzQkFBQTNMLE1BQUEsRUFBQUUsTUFBQSxHQUFBZ0ksTUFBQSxDQUFBc3BCLHdCQUFBLENBQUE5d0IsT0FBQSxDQUFBaUwsU0FBQSxzQkFBQWpMLE9BQUEsQ0FBQWlMLFNBQUEsR0FBQXdsQix5QkFBQSxDQUFBendCLE9BQUEsQ0FBQWlMLFNBQUEsa0JBQUF2TCxNQUFBLEVBQUFDLE1BQUEsR0FBQTZILE1BQUEsQ0FBQXNwQix3QkFBQSxDQUFBOXdCLE9BQUEsQ0FBQWlMLFNBQUEsa0JBQUFqTCxPQUFBLENBQUFpTCxTQUFBLEdBQUFqTCxPQUFBLE1BQUFELE1BQUE7RUFBQSxPQXcwRWxDaEQsb0JBQW9CO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=