@sapui5/sap.fe.core 1.95.0 → 1.98.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 (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -27,11 +27,18 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
27
27
 
28
28
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
29
 
30
+ var filterFieldType;
31
+
32
+ (function (filterFieldType) {
33
+ filterFieldType["Default"] = "Default";
34
+ filterFieldType["Slot"] = "Slot";
35
+ })(filterFieldType || (filterFieldType = {}));
36
+
30
37
  /**
31
38
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
32
39
  *
33
40
  * @param {AnnotationTerm<FieldGroupType>} fieldGroup
34
- * @returns {Record<string, FilterGroup>} The map of facets for the given fieldGroup
41
+ * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
35
42
  */
36
43
  function getFieldGroupFilterGroups(fieldGroup) {
37
44
  var filterFacetMap = {};
@@ -57,8 +64,8 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
57
64
  }, {});
58
65
  }
59
66
  /**
60
- * Check that all the tables for a dedicated entityset are configured as analytical table.
61
- * @param {TableVisualization[]} listReportTables List Report tables
67
+ * Check that all the tables for a dedicated entity set are configured as analytical table.
68
+ * @param {TableVisualization[]} listReportTables List report tables
62
69
  * @param {string} contextPath
63
70
  * @returns {boolean} Is FilterBar search field hidden or not
64
71
  */
@@ -102,10 +109,10 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
102
109
  }, []);
103
110
  }
104
111
  /**
105
- * Returns the condition path required for the condition model. It looks like follow:
112
+ * Returns the condition path required for the condition model. It looks as follows:
106
113
  * <1:N-PropertyName>*\/<1:1-PropertyName>/<PropertyName>.
107
114
  *
108
- * @param entityType The root EntityTy[e
115
+ * @param entityType The root EntityType
109
116
  * @param propertyPath The full path to the target property
110
117
  * @returns {string} The formatted condition path
111
118
  */
@@ -187,7 +194,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
187
194
  if (property._type === "NavigationProperty") {
188
195
  // handle navigation properties
189
196
  localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.entityProperties, includeHidden, converterContext);
190
- } else if (property.targetType !== undefined) {
197
+ } else if (property.targetType !== undefined && property.targetType._type === "ComplexType") {
191
198
  // handle ComplexType properties
192
199
  localSelectionFields = _getSelectionFields(entityType, propertyPath, property.targetType.properties, includeHidden, converterContext);
193
200
  } else {
@@ -276,7 +283,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
276
283
  return selectionFields;
277
284
  };
278
285
  /**
279
- * Get all Parameter filterFields in case of a parameterized service.
286
+ * Get all parameter filter fields in case of a parameterized service.
280
287
  * @param {ConverterContext} converterContext
281
288
  * @returns {FilterField[]} An array of parameter filterfields
282
289
  */
@@ -306,12 +313,19 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
306
313
  var getFilterBarhideBasicSearch = function (listReportTables, converterContext) {
307
314
  if (converterContext.getManifestWrapper().hasMultipleVisualizations() || converterContext.getTemplateType() === TemplateType.AnalyticalListPage) {
308
315
  return true;
309
- } // Tries to find a non-analytical table with the main entity set (page entity set) as collection
310
- // if at least one table matches these conditions, basic search field must be displayed.
316
+ } // If all tables are analytical and none of them allow for search
317
+ // then the search field must be hidden
311
318
 
312
319
 
313
- var sContextPath = converterContext.getContextPath();
314
- return checkAllTableForEntitySetAreAnalytical(listReportTables, sContextPath);
320
+ var contextPath = converterContext.getContextPath();
321
+
322
+ if (contextPath && listReportTables.length > 0) {
323
+ return listReportTables.every(function (visualization) {
324
+ return visualization.enableAnalytics && !visualization.enableAnalyticsSearch;
325
+ });
326
+ } else {
327
+ return false;
328
+ }
315
329
  };
316
330
  /**
317
331
  * Retrieves filter fields from the manifest.
@@ -338,9 +352,11 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
338
352
  var filterField = definedFilterFields[sKey];
339
353
  var propertyName = KeyHelper.getPathFromSelectionFieldKey(sKey);
340
354
  var selectionField = selectionFields[propertyName];
341
- var visualFilter = getVisualFilters(entityType, converterContext, sKey, definedFilterFields);
355
+ var type = filterField.type === "Slot" ? filterFieldType.Slot : filterFieldType.Default;
356
+ var visualFilter = filterField && filterField !== null && filterField !== void 0 && filterField.visualFilter ? getVisualFilters(entityType, converterContext, sKey, definedFilterFields) : undefined;
342
357
  filterFields[sKey] = {
343
358
  key: sKey,
359
+ type: type,
344
360
  annotationPath: selectionField === null || selectionField === void 0 ? void 0 : selectionField.annotationPath,
345
361
  conditionPath: (selectionField === null || selectionField === void 0 ? void 0 : selectionField.conditionPath) || propertyName,
346
362
  template: filterField.template,
@@ -468,6 +484,7 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
468
484
  var selectionFields = insertCustomElements(allFilters, getManifestFilterFields(entityType, converterContext), {
469
485
  "availability": "overwrite",
470
486
  label: "overwrite",
487
+ type: "overwrite",
471
488
  position: "overwrite",
472
489
  template: "overwrite",
473
490
  settings: "overwrite",
@@ -484,4 +501,4 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
484
501
  _exports.getSelectionFields = getSelectionFields;
485
502
  return _exports;
486
503
  }, false);
487
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyRmllbGQiLCJnZXRTZWxlY3Rpb25GaWVsZHMiLCJsclRhYmxlcyIsImdldEVudGl0eVR5cGUiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJhRmllbGRHcm91cHMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImkiLCJmaWx0ZXJGYWNldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJJRCIsInRvU3RyaW5nIiwiZ2V0U2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdE9wdGlvbnMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwiU2VsZWN0aW9uRmllbGRzIiwiZGVmYXVsdEZpbHRlcnMiLCJhbGxGaWx0ZXJzIiwiZmlsdGVyIiwiYXNzaWduIiwiYWdncmVnYXRlcyIsImFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMiLCJhZ2dyZWdhdGVLZXkiLCJyZWxhdGl2ZVBhdGgiLCJpbnNlcnRDdXN0b21FbGVtZW50cyIsImlzQ2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImNhc2VTZW5zaXRpdmUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVNBLHlCQUFULENBQW1DQyxVQUFuQyxFQUE0RztBQUMzRyxRQUFNQyxjQUEyQyxHQUFHLEVBQXBEO0FBQ0FELElBQUFBLFVBQVUsQ0FBQ0UsSUFBWCxDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBQ0MsU0FBRCxFQUF1QztBQUM5RCxVQUFJQSxTQUFTLENBQUNDLEtBQVYsS0FBb0Isc0NBQXhCLEVBQWdFO0FBQUE7O0FBQy9ESixRQUFBQSxjQUFjLENBQUNHLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQkMsSUFBakIsQ0FBZCxHQUF1QztBQUN0Q0MsVUFBQUEsS0FBSyxFQUFFUixVQUFVLENBQUNTLGtCQURvQjtBQUV0Q0MsVUFBQUEsVUFBVSxFQUNUQyxjQUFjLENBQ2JDLG9CQUFvQixDQUFDWixVQUFVLENBQUNhLEtBQVgsOEJBQW9CYixVQUFVLENBQUNjLFdBQS9CLG9GQUFvQixzQkFBd0JDLE1BQTVDLDJEQUFvQix1QkFB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LFVBQUQsRUFBYXBDLHVCQUF1QixDQUFDMUYsVUFBRCxFQUFhbkIsZ0JBQWIsQ0FBcEMsRUFBb0U7QUFDL0csc0JBQWdCLFdBRCtGO0FBRS9HZ0QsTUFBQUEsS0FBSyxFQUFFLFdBRndHO0FBRy9Hd0UsTUFBQUEsUUFBUSxFQUFFLFdBSHFHO0FBSS9HRCxNQUFBQSxRQUFRLEVBQUUsV0FKcUc7QUFLL0dLLE1BQUFBLFFBQVEsRUFBRSxXQUxxRztBQU0vR1AsTUFBQUEsWUFBWSxFQUFFO0FBTmlHLEtBQXBFLENBQTVDLENBMUdnQixDQW1IaEI7O0FBQ0EsUUFBTW9DLGVBQWUsR0FBR0Msd0JBQXdCLENBQUMxSixnQkFBRCxDQUFoRDtBQUNBMEQsSUFBQUEsZUFBZSxDQUFDMUYsT0FBaEIsQ0FBd0IsVUFBQWtHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDeUYsYUFBWixHQUE0QkYsZUFBNUI7QUFDQSxLQUZEO0FBSUEsV0FBTy9GLGVBQVA7QUFDQSxHQTlITSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0RmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0RmlsdGVyU2V0dGluZ3MsXG5cdFRlbXBsYXRlVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlVmlzdWFsaXphdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMsIFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIEZpZWxkR3JvdXBUeXBlLCBGaWVsZEdyb3VwIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBJc3N1ZVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlQ2F0ZWdvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmlsdGVyR3JvdXAgPSB7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkID0gQ3VzdG9tRWxlbWVudDxGaWx0ZXJGaWVsZD47XG5cbi8qKlxuICogRW50ZXIgYWxsIERhdGFGaWVsZHMgb2YgYSBnaXZlbiBGaWVsZEdyb3VwIGludG8gdGhlIGZpbHRlckZhY2V0TWFwLlxuICpcbiAqIEBwYXJhbSB7QW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+fSBmaWVsZEdyb3VwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+fSBUaGUgbWFwIG9mIGZhY2V0cyBmb3IgdGhlIGdpdmVuIGZpZWxkR3JvdXBcbiAqL1xuZnVuY3Rpb24gZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhmaWVsZEdyb3VwOiBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4ge1xuXHRjb25zdCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cdGZpZWxkR3JvdXAuRGF0YS5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFwiKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcFtkYXRhRmllbGQuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdGdyb3VwOiBmaWVsZEdyb3VwLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDpcblx0XHRcdFx0XHRjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKGZpZWxkR3JvdXAuTGFiZWwgfHwgZmllbGRHcm91cC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbCB8fCBmaWVsZEdyb3VwLnF1YWxpZmllcilcblx0XHRcdFx0XHQpIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyXG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJGYWNldE1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuXHRyZXR1cm4gc2VsZWN0aW9uVmFyaWFudHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgc2VsZWN0aW9uVmFyaWFudCkgPT4ge1xuXHRcdHNlbGVjdGlvblZhcmlhbnQucHJvcGVydHlOYW1lcy5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRwcmV2aW91c1ZhbHVlW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHR9LCB7fSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCBhbGwgdGhlIHRhYmxlcyBmb3IgYSBkZWRpY2F0ZWQgZW50aXR5c2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGUuXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIExpc3QgUmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBsaWtlIGZvbGxvdzpcbiAqIDwxOk4tUHJvcGVydHlOYW1lPipcXC88MToxLVByb3BlcnR5TmFtZT4vPFByb3BlcnR5TmFtZT4uXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHJvb3QgRW50aXR5VHlbZVxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZGl0aW9uIHBhdGhcbiAqL1xuY29uc3QgX2dldENvbmRpdGlvblBhdGggPSBmdW5jdGlvbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IHBhcnRpYWxQYXRoO1xuXHRsZXQga2V5ID0gXCJcIjtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBwYXJ0ID0gcGFydHMuc2hpZnQoKSBhcyBzdHJpbmc7XG5cdFx0cGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aCA/IHBhcnRpYWxQYXRoICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0XHRjb25zdCBwcm9wZXJ0eTogUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHBhcnRpYWxQYXRoKTtcblx0XHRpZiAocHJvcGVydHkuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgcHJvcGVydHkuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRwYXJ0ICs9IFwiKlwiO1xuXHRcdH1cblx0XHRrZXkgPSBrZXkgPyBrZXkgKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHR9XG5cdHJldHVybiBrZXk7XG59O1xuXG5jb25zdCBfY3JlYXRlRmlsdGVyU2VsZWN0aW9uRmllbGQgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0Ly8gaWdub3JlIGNvbXBsZXggcHJvcGVydHkgdHlwZXMgYW5kIGhpZGRlbiBhbm5vdGF0ZWQgb25lc1xuXHRpZiAoXG5cdFx0cHJvcGVydHkgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHByb3BlcnR5LnRhcmdldFR5cGUgPT09IHVuZGVmaW5lZCAmJlxuXHRcdChpbmNsdWRlSGlkZGVuIHx8IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgIT09IHRydWUpXG5cdCkge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKHByb3BlcnR5KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRjb25kaXRpb25QYXRoOiBfZ2V0Q29uZGl0aW9uUGF0aChlbnRpdHlUeXBlLCBmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW5GaWx0ZXI/LnZhbHVlT2YoKSA9PT0gdHJ1ZSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdFx0bGFiZWw6IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCBwcm9wZXJ0eS5uYW1lKSksXG5cdFx0XHRncm91cDogdGFyZ2V0RW50aXR5VHlwZS5uYW1lLFxuXHRcdFx0Z3JvdXBMYWJlbDogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgdGFyZ2V0RW50aXR5VHlwZS5uYW1lKVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZyxcblx0cHJvcGVydGllczogQXJyYXk8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGNvbnN0IGZ1bGxQYXRoOiBzdHJpbmcgPSAobmF2aWdhdGlvblBhdGggPyBuYXZpZ2F0aW9uUGF0aCArIFwiL1wiIDogXCJcIikgKyBwcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBwcm9wZXJ0eSwgZnVsbFBhdGgsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKHNlbGVjdGlvbkZpZWxkKSB7XG5cdFx0XHRcdHNlbGVjdGlvbkZpZWxkTWFwW2Z1bGxQYXRoXSA9IHNlbGVjdGlvbkZpZWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZE1hcDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGggPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUlTU0lOR19TRUxFQ1RJT05GSUVMRCk7XG5cdH1cblx0Ly8gZGVmaW5lZCBTZWxlY3Rpb25GaWVsZHMgYXJlIGF2YWlsYWJsZSBieSBkZWZhdWx0XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSA9IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdDtcblx0XHRmaWx0ZXJGaWVsZC5pc1BhcmFtZXRlciA9ICEhZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZDtcbn07XG5cbmNvbnN0IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRhU2VsZWN0T3B0aW9uczogYW55W10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogUHJvcGVydHlQYXRoW11cbik6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBbXTtcblx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHQvLyBVc2luZyBlbnRpdHlUeXBlIGluc3RlYWQgb2YgZW50aXR5U2V0XG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRcdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEoUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKFByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgUGFyYW1ldGVyIGZpbHRlckZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0Y29uc3QgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCA9XG5cdFx0aXNQYXJhbWV0ZXJpemVkICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihcIi9cIiArIGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSk7XG5cblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gKHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHRcblx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sIHByb3BlcnR5Lm5hbWUsIHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQsIHBhcmFtZXRlckVudGl0eVR5cGUpO1xuXHRcdCAgfSlcblx0XHQ6IFtdKSBhcyBGaWx0ZXJGaWVsZFtdO1xuXG5cdHJldHVybiBwYXJhbWV0ZXJGaWVsZHM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxpc3RSZXBvcnRUYWJsZXMgVGhlIGxpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJCYXJoaWRlQmFzaWNTZWFyY2ggPSBmdW5jdGlvbihsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKCkgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8vIFRyaWVzIHRvIGZpbmQgYSBub24tYW5hbHl0aWNhbCB0YWJsZSB3aXRoIHRoZSBtYWluIGVudGl0eSBzZXQgKHBhZ2UgZW50aXR5IHNldCkgYXMgY29sbGVjdGlvblxuXHQvLyBpZiBhdCBsZWFzdCBvbmUgdGFibGUgbWF0Y2hlcyB0aGVzZSBjb25kaXRpb25zLCBiYXNpYyBzZWFyY2ggZmllbGQgbXVzdCBiZSBkaXNwbGF5ZWQuXG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0cmV0dXJuIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXMsIHNDb250ZXh0UGF0aCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+IHtcblx0Y29uc3QgZmJDb25maWc6IEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZpbmVkRmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj4gPSBmYkNvbmZpZz8uZmlsdGVyRmllbGRzIHx8IHt9O1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRPYmplY3Qua2V5cyhkZWZpbmVkRmlsdGVyRmllbGRzKS5tYXAoa2V5ID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHZpc3VhbEZpbHRlciA9IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcyk7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5hbm5vdGF0aW9uUGF0aCxcblx0XHRcdGNvbmRpdGlvblBhdGg6IHNlbGVjdGlvbkZpZWxkPy5jb25kaXRpb25QYXRoIHx8IHByb3BlcnR5TmFtZSxcblx0XHRcdHRlbXBsYXRlOiBmaWx0ZXJGaWVsZC50ZW1wbGF0ZSxcblx0XHRcdGxhYmVsOiBmaWx0ZXJGaWVsZC5sYWJlbCxcblx0XHRcdHBvc2l0aW9uOiBmaWx0ZXJGaWVsZC5wb3NpdGlvbiB8fCB7IHBsYWNlbWVudDogUGxhY2VtZW50LkFmdGVyIH0sXG5cdFx0XHRhdmFpbGFiaWxpdHk6IGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSB8fCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRzZXR0aW5nczogZmlsdGVyRmllbGQuc2V0dGluZ3MsXG5cdFx0XHR2aXN1YWxGaWx0ZXI6IHZpc3VhbEZpbHRlclxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJGaWVsZCA9IGZ1bmN0aW9uKHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XG5cdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30sIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VsZWN0aW9uIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGZpbHRlciBiYXJcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYW5ub3RhdGlvbiBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxyVGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblBhdGhcbiAqIEByZXR1cm5zIHtGaWx0ZXJTZWxlY3Rpb25GaWVsZFtdfSBBbiBhcnJheSBvZiBzZWxlY3Rpb24gZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pOiBGaWx0ZXJGaWVsZFtdIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRjb25zdCBmaWx0ZXJGYWNldHMgPSBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5GaWx0ZXJGYWNldHM7XG5cdGxldCBmaWx0ZXJGYWNldE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+ID0ge307XG5cblx0Y29uc3QgYUZpZWxkR3JvdXBzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXApO1xuXG5cdGlmIChmaWx0ZXJGYWNldHMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJGYWNldHMubGVuZ3RoIDwgMCkge1xuXHRcdGZvciAoY29uc3QgaSBpbiBhRmllbGRHcm91cHMpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwID0ge1xuXHRcdFx0XHQuLi5maWx0ZXJGYWNldE1hcCxcblx0XHRcdFx0Li4uZ2V0RmllbGRHcm91cEZpbHRlckdyb3VwcyhhRmllbGRHcm91cHNbaV0gYXMgQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0ZmlsdGVyRmFjZXRNYXAgPSBmaWx0ZXJGYWNldHMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4sIGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldFR5cGVzKSA9PiB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHByZXZpb3VzVmFsdWVbKChmaWx0ZXJGYWNldC5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhW2ldIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0XHRncm91cDogZmlsdGVyRmFjZXQ/LklEPy50b1N0cmluZygpLFxuXHRcdFx0XHRcdGdyb3VwTGFiZWw6IGZpbHRlckZhY2V0Py5MYWJlbD8udG9TdHJpbmcoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0bGV0IGFTZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtdO1xuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50ID0gZ2V0U2VsZWN0aW9uVmFyaWFudChlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0aWYgKHNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRhU2VsZWN0T3B0aW9ucyA9IHNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucztcblx0fVxuXG5cdC8vIGNyZWF0ZSBhIG1hcCBvZiBhbGwgcG90ZW50aWFsIGZpbHRlciBmaWVsZHMgYmFzZWQgb24uLi5cblx0Y29uc3QgZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7XG5cdFx0Ly8gLi4ubm9uIGhpZGRlbiBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHlcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIFwiXCIsIGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcywgZmFsc2UsIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdC8vIC4uLmFkZGl0aW9uYWwgbWFuaWZlc3QgZGVmaW5lZCBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHQuLi5fZ2V0U2VsZWN0aW9uRmllbGRzQnlQYXRoKFxuXHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0KVxuXHR9O1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9ICgoYW5ub3RhdGlvblBhdGggJiYgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aCk/LmFubm90YXRpb24pIHx8XG5cdFx0ZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LlNlbGVjdGlvbkZpZWxkcyB8fFxuXHRcdFtdKSBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0Y29uc3QgZGVmYXVsdEZpbHRlcnMgPSBfZ2V0RGVmYXVsdEZpbHRlckZpZWxkcyhcblx0XHRmaWx0ZXJGaWVsZHMsXG5cdFx0YVNlbGVjdE9wdGlvbnMsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHNcblx0KTtcblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBmaW5hbGx5IGNyZWF0ZSBmaW5hbCBsaXN0IG9mIGZpbHRlciBmaWVsZHMgYnkgYWRkaW5nIHRoZSBTZWxlY3Rpb25GaWVsZHMgZmlyc3QgKG9yZGVyIG1hdHRlcnMpLi4uXG5cdGxldCBhbGxGaWx0ZXJzID0gcGFyYW1ldGVyRmllbGRzXG5cdFx0LmNvbmNhdChcblx0XHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0XHRpZiAoIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHRcdH0sIFtdKSB8fCBbXVxuXHRcdClcblx0XHQvLyBUbyBhZGQgdGhlIEZpbHRlckZpZWxkIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBTZWxlY3Rpb24gRmllbGRzIGJ1dCB0aGUgcHJvcGVydHkgaXMgbWVudGlvbmVkIGluIHRoZSBTZWxlY3Rpb24gVmFyaWFudFxuXHRcdC5jb25jYXQoZGVmYXVsdEZpbHRlcnMgfHwgW10pXG5cdFx0Ly8gLi4uYW5kIGFkZGluZyByZW1haW5pbmcgZmlsdGVyIGZpZWxkcywgdGhhdCBhcmUgbm90IHVzZWQgaW4gYSBTZWxlY3Rpb25WYXJpYW50IChvcmRlciBkb2Vzbid0IG1hdHRlcilcblx0XHQuY29uY2F0KFxuXHRcdFx0T2JqZWN0LmtleXMoZmlsdGVyRmllbGRzKVxuXHRcdFx0XHQuZmlsdGVyKHByb3BlcnR5UGF0aCA9PiAhKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKVxuXHRcdFx0XHQubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF0sIGZpbHRlckZhY2V0TWFwW3Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblxuXHQvL2lmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgdGFibGVzIFwiYWdncmVnYXRhYmxlXCIgcHJvcGVydGllcyBtdXN0IGJlIGV4Y2x1ZGVkXG5cdGlmIChjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbChsclRhYmxlcywgc0NvbnRleHRQYXRoKSkge1xuXHRcdC8vIEN1cnJlbnRseSBhbGwgYWdyZWdhdGVzIGFyZSByb290IGVudGl0eSBwcm9wZXJ0aWVzIChubyBwcm9wZXJ0aWVzIGNvbWluZyBmcm9tIG5hdmlnYXRpb24pIGFuZCBhbGxcblx0XHQvLyB0YWJsZXMgd2l0aCBzYW1lIGVudGl0eVNldCBnZXRzIHNhbWUgYWdncmVhZ3RlIGNvbmZpZ3VyYXRpb24gdGhhdCdzIHdoeSB3ZSBjYW4gdXNlIGZpcnN0IHRhYmxlIGludG9cblx0XHQvLyBMUiB0byBnZXQgYWdncmVnYXRlcyAod2l0aG91dCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMgc2luY2Ugd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gZmlsdGVyIHRoZW0pLlxuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXMgPSBsclRhYmxlc1swXS5hZ2dyZWdhdGVzO1xuXHRcdGlmIChhZ2dyZWdhdGVzKSB7XG5cdFx0XHRjb25zdCBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0ZXMpLm1hcChhZ2dyZWdhdGVLZXkgPT4gYWdncmVnYXRlc1thZ2dyZWdhdGVLZXldLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRhbGxGaWx0ZXJzID0gYWxsRmlsdGVycy5maWx0ZXIoZmlsdGVyRmllbGQgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWdncmVnYXRhYmxlUHJvcGVydGllcy5pbmRleE9mKGZpbHRlckZpZWxkLmtleSkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRzID0gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYWxsRmlsdGVycywgZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCksIHtcblx0XHRcImF2YWlsYWJpbGl0eVwiOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGxhYmVsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIlxuXHR9KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaChmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG4iXX0=
504
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImdldENvbnRleHRQYXRoIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidHlwZSIsIlNsb3QiLCJ2aXN1YWxGaWx0ZXIiLCJnZXRWaXN1YWxGaWx0ZXJzIiwidGVtcGxhdGUiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwic2V0dGluZ3MiLCJnZXRGaWx0ZXJGaWVsZCIsImdldFNlbGVjdGlvbkZpZWxkcyIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImZpbHRlckZhY2V0cyIsIkZpbHRlckZhY2V0cyIsImFGaWVsZEdyb3VwcyIsImdldEFubm90YXRpb25zQnlUZXJtIiwiaSIsImZpbHRlckZhY2V0IiwiVGFyZ2V0IiwiJHRhcmdldCIsIklEIiwidG9TdHJpbmciLCJnZXRTZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0T3B0aW9ucyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJTZWxlY3Rpb25GaWVsZHMiLCJkZWZhdWx0RmlsdGVycyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJhc3NpZ24iLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiaXNDYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiY2FzZVNlbnNpdGl2ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEyQ0tBLGU7O2FBQUFBLGU7QUFBQUEsSUFBQUEsZTtBQUFBQSxJQUFBQSxlO0tBQUFBLGUsS0FBQUEsZTs7QUFPTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQyx5QkFBVCxDQUFtQ0MsVUFBbkMsRUFBNEc7QUFDM0csUUFBTUMsY0FBMkMsR0FBRyxFQUFwRDtBQUNBRCxJQUFBQSxVQUFVLENBQUNFLElBQVgsQ0FBZ0JDLE9BQWhCLENBQXdCLFVBQUNDLFNBQUQsRUFBdUM7QUFDOUQsVUFBSUEsU0FBUyxDQUFDQyxLQUFWLEtBQW9CLHNDQUF4QixFQUFnRTtBQUFBOztBQUMvREosUUFBQUEsY0FBYyxDQUFDRyxTQUFTLENBQUNFLEtBQVYsQ0FBZ0JDLElBQWpCLENBQWQsR0FBdUM7QUFDdENDLFVBQUFBLEtBQUssRUFBRVIsVUFBVSxDQUFDUyxrQkFEb0I7QUFFdENDLFVBQUFBLFVBQVUsRUFDVEMsY0FBYyxDQUNiQyxvQkFBb0IsQ0FBQ1osVUFBVSxDQUFDYSxLQUFYLDhCQUFvQmIsVUFBVSxDQUFDYyxXQUEvQixvRkFBb0Isc0JBQXdCQyxNQUE1QywyREFBb0IsdUJBQWdDRixLQUFwRCxLQUE2RGIsVUFBVSxDQUFDZ0IsU0FBekUsQ0FEUCxDQUFkLElBRUtoQixVQUFVLENBQUNnQjtBQUxxQixTQUF2QztBQU9BO0FBQ0QsS0FWRDtBQVdBLFdBQU9mLGNBQVA7QUFDQTs7QUFFRCxXQUFTZ0IsMkJBQVQsQ0FBcUNDLGlCQUFyQyxFQUFrSDtBQUNqSCxXQUFPQSxpQkFBaUIsQ0FBQ0MsTUFBbEIsQ0FBeUIsVUFBQ0MsYUFBRCxFQUF5Q0MsZ0JBQXpDLEVBQThEO0FBQzdGQSxNQUFBQSxnQkFBZ0IsQ0FBQ0MsYUFBakIsQ0FBK0JuQixPQUEvQixDQUF1QyxVQUFBb0IsWUFBWSxFQUFJO0FBQ3RESCxRQUFBQSxhQUFhLENBQUNHLFlBQUQsQ0FBYixHQUE4QixJQUE5QjtBQUNBLE9BRkQ7QUFHQSxhQUFPSCxhQUFQO0FBQ0EsS0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1BO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTSSxzQ0FBVCxDQUFnREMsZ0JBQWhELEVBQXdGQyxXQUF4RixFQUF5SDtBQUN4SCxRQUFJQSxXQUFXLElBQUlELGdCQUFnQixDQUFDRSxNQUFqQixHQUEwQixDQUE3QyxFQUFnRDtBQUMvQyxhQUFPRixnQkFBZ0IsQ0FBQ0csS0FBakIsQ0FBdUIsVUFBQUMsYUFBYSxFQUFJO0FBQzlDLGVBQU9BLGFBQWEsQ0FBQ0MsZUFBZCxJQUFpQ0osV0FBVyxLQUFLRyxhQUFhLENBQUNFLFVBQWQsQ0FBeUJDLFVBQWpGO0FBQ0EsT0FGTSxDQUFQO0FBR0E7O0FBQ0QsV0FBTyxLQUFQO0FBQ0E7O0FBRUQsV0FBU0Msb0JBQVQsQ0FDQ0MscUJBREQsRUFFQ0MsZ0JBRkQsRUFHbUM7QUFDbEMsUUFBTUMscUJBQStCLEdBQUcsRUFBeEM7QUFDQSxXQUFPRixxQkFBcUIsQ0FDMUJHLEdBREssQ0FDRCxVQUFBUixhQUFhLEVBQUk7QUFDckIsVUFBTVMsWUFBWSxHQUFHVCxhQUFhLENBQUNVLE9BQWQsQ0FBc0JDLE9BQTNDO0FBQ0EsVUFBTUMsY0FBK0MsR0FBRyxFQUF4RDs7QUFDQSxXQUFLLElBQU1DLEdBQVgsSUFBa0JKLFlBQWxCLEVBQWdDO0FBQy9CLFlBQUlLLEtBQUssQ0FBQ0MsT0FBTixDQUFjTixZQUFZLENBQUNJLEdBQUQsQ0FBWixDQUFrQkcsS0FBaEMsQ0FBSixFQUE0QztBQUMzQyxjQUFNQSxLQUFLLEdBQUdQLFlBQVksQ0FBQ0ksR0FBRCxDQUFaLENBQWtCRyxLQUFoQztBQUNBQSxVQUFBQSxLQUFLLENBQUMxQyxPQUFOLENBQWMsVUFBQUksSUFBSSxFQUFJO0FBQ3JCLGdCQUFJQSxJQUFJLElBQUlBLElBQUksQ0FBQ3VDLGNBQWIsSUFBK0JWLHFCQUFxQixDQUFDVyxPQUF0QixDQUE4QnhDLElBQUksQ0FBQ3VDLGNBQW5DLE1BQXVELENBQUMsQ0FBM0YsRUFBOEY7QUFDN0ZWLGNBQUFBLHFCQUFxQixDQUFDWSxJQUF0QixDQUEyQnpDLElBQUksQ0FBQ3VDLGNBQWhDO0FBQ0Esa0JBQU1HLHNCQUFzQixHQUFHQyxnQ0FBZ0MsQ0FBQzNDLElBQUksQ0FBQ3VDLGNBQU4sRUFBc0JYLGdCQUF0QixDQUEvRDs7QUFDQSxrQkFBSWMsc0JBQUosRUFBNEI7QUFDM0JSLGdCQUFBQSxjQUFjLENBQUNPLElBQWYsQ0FBb0JDLHNCQUFwQjtBQUNBO0FBQ0Q7QUFDRCxXQVJEO0FBU0E7QUFDRDs7QUFDRCxhQUFPUixjQUFQO0FBQ0EsS0FuQkssRUFvQkx0QixNQXBCSyxDQW9CRSxVQUFDZ0MsU0FBRCxFQUFZOUIsZ0JBQVo7QUFBQSxhQUFpQzhCLFNBQVMsQ0FBQ0MsTUFBVixDQUFpQi9CLGdCQUFqQixDQUFqQztBQUFBLEtBcEJGLEVBb0J1RSxFQXBCdkUsQ0FBUDtBQXFCQTtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE1BQU1nQyxpQkFBaUIsR0FBRyxVQUFTQyxVQUFULEVBQWlDQyxZQUFqQyxFQUErRDtBQUN4RixRQUFNQyxLQUFLLEdBQUdELFlBQVksQ0FBQ0UsS0FBYixDQUFtQixHQUFuQixDQUFkO0FBQ0EsUUFBSUMsV0FBSjtBQUNBLFFBQUloQixHQUFHLEdBQUcsRUFBVjs7QUFDQSxXQUFPYyxLQUFLLENBQUM3QixNQUFiLEVBQXFCO0FBQ3BCLFVBQUlnQyxJQUFJLEdBQUdILEtBQUssQ0FBQ0ksS0FBTixFQUFYO0FBQ0FGLE1BQUFBLFdBQVcsR0FBR0EsV0FBVyxHQUFHQSxXQUFXLEdBQUcsR0FBZCxHQUFvQkMsSUFBdkIsR0FBOEJBLElBQXZEO0FBQ0EsVUFBTUUsUUFBdUMsR0FBR1AsVUFBVSxDQUFDUSxXQUFYLENBQXVCSixXQUF2QixDQUFoRDs7QUFDQSxVQUFJRyxRQUFRLENBQUNFLEtBQVQsS0FBbUIsb0JBQW5CLElBQTJDRixRQUFRLENBQUNHLFlBQXhELEVBQXNFO0FBQ3JFTCxRQUFBQSxJQUFJLElBQUksR0FBUjtBQUNBOztBQUNEakIsTUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUdBLEdBQUcsR0FBRyxHQUFOLEdBQVlpQixJQUFmLEdBQXNCQSxJQUEvQjtBQUNBOztBQUNELFdBQU9qQixHQUFQO0FBQ0EsR0FkRDs7QUFnQkEsTUFBTXVCLDJCQUEyQixHQUFHLFVBQ25DWCxVQURtQyxFQUVuQ08sUUFGbUMsRUFHbkNLLGdCQUhtQyxFQUluQ0MsYUFKbUMsRUFLbkNoQyxnQkFMbUMsRUFNVDtBQUFBOztBQUMxQjtBQUNBLFFBQ0MwQixRQUFRLEtBQUtPLFNBQWIsSUFDQVAsUUFBUSxDQUFDUSxVQUFULEtBQXdCRCxTQUR4QixLQUVDRCxhQUFhLElBQUksMEJBQUFOLFFBQVEsQ0FBQy9DLFdBQVQsMEdBQXNCd0QsRUFBdEIsNEdBQTBCQyxNQUExQixrRkFBa0NDLE9BQWxDLFFBQWdELElBRmxFLENBREQsRUFJRTtBQUFBOztBQUNELFVBQU1DLGdCQUFnQixHQUFHdEMsZ0JBQWdCLENBQUN1Qyx1QkFBakIsQ0FBeUNiLFFBQXpDLENBQXpCO0FBQ0EsYUFBTztBQUNObkIsUUFBQUEsR0FBRyxFQUFFaUMsU0FBUyxDQUFDQyw0QkFBVixDQUF1Q1YsZ0JBQXZDLENBREM7QUFFTnBCLFFBQUFBLGNBQWMsRUFBRVgsZ0JBQWdCLENBQUMwQyx5QkFBakIsQ0FBMkNYLGdCQUEzQyxDQUZWO0FBR05ZLFFBQUFBLGFBQWEsRUFBRXpCLGlCQUFpQixDQUFDQyxVQUFELEVBQWFZLGdCQUFiLENBSDFCO0FBSU5hLFFBQUFBLFlBQVksRUFDWCwyQkFBQWxCLFFBQVEsQ0FBQy9DLFdBQVQsNEdBQXNCd0QsRUFBdEIsNEdBQTBCVSxZQUExQixrRkFBd0NSLE9BQXhDLFFBQXNELElBQXRELEdBQTZEUyxnQkFBZ0IsQ0FBQ1YsTUFBOUUsR0FBdUZVLGdCQUFnQixDQUFDQyxVQUxuRztBQU1OQyxRQUFBQSxLQUFLLEVBQUV4RSxjQUFjLENBQUNDLG9CQUFvQixDQUFDLDJCQUFBaUQsUUFBUSxDQUFDL0MsV0FBVCxDQUFxQkMsTUFBckIsNEdBQTZCRixLQUE3QixrRkFBb0MyRCxPQUFwQyxPQUFpRFgsUUFBUSxDQUFDdUIsSUFBM0QsQ0FBckIsQ0FOZjtBQU9ONUUsUUFBQUEsS0FBSyxFQUFFaUUsZ0JBQWdCLENBQUNXLElBUGxCO0FBUU4xRSxRQUFBQSxVQUFVLEVBQUVDLGNBQWMsQ0FDekJDLG9CQUFvQixDQUFDLENBQUE2RCxnQkFBZ0IsU0FBaEIsSUFBQUEsZ0JBQWdCLFdBQWhCLHFDQUFBQSxnQkFBZ0IsQ0FBRTNELFdBQWxCLDBHQUErQkMsTUFBL0IsNEdBQXVDRixLQUF2QyxrRkFBOEMyRCxPQUE5QyxPQUEyREMsZ0JBQWdCLENBQUNXLElBQTdFLENBREs7QUFScEIsT0FBUDtBQVlBOztBQUNELFdBQU9oQixTQUFQO0FBQ0EsR0E1QkQ7O0FBOEJBLE1BQU1pQixtQkFBbUIsR0FBRyxVQUMzQi9CLFVBRDJCLEVBRTNCZ0MsY0FGMkIsRUFHM0JDLFVBSDJCLEVBSTNCcEIsYUFKMkIsRUFLM0JoQyxnQkFMMkIsRUFNRztBQUM5QixRQUFNcUQsaUJBQThDLEdBQUcsRUFBdkQ7O0FBQ0EsUUFBSUQsVUFBSixFQUFnQjtBQUNmQSxNQUFBQSxVQUFVLENBQUNwRixPQUFYLENBQW1CLFVBQUMwRCxRQUFELEVBQXdCO0FBQzFDLFlBQU1OLFlBQW9CLEdBQUdNLFFBQVEsQ0FBQ3VCLElBQXRDO0FBQ0EsWUFBTUssUUFBZ0IsR0FBRyxDQUFDSCxjQUFjLEdBQUdBLGNBQWMsR0FBRyxHQUFwQixHQUEwQixFQUF6QyxJQUErQy9CLFlBQXhFOztBQUNBLFlBQU1tQyxjQUFjLEdBQUd6QiwyQkFBMkIsQ0FBQ1gsVUFBRCxFQUFhTyxRQUFiLEVBQXVCNEIsUUFBdkIsRUFBaUN0QixhQUFqQyxFQUFnRGhDLGdCQUFoRCxDQUFsRDs7QUFDQSxZQUFJdUQsY0FBSixFQUFvQjtBQUNuQkYsVUFBQUEsaUJBQWlCLENBQUNDLFFBQUQsQ0FBakIsR0FBOEJDLGNBQTlCO0FBQ0E7QUFDRCxPQVBEO0FBUUE7O0FBQ0QsV0FBT0YsaUJBQVA7QUFDQSxHQW5CRDs7QUFxQkEsTUFBTUcseUJBQXlCLEdBQUcsVUFDakNyQyxVQURpQyxFQUVqQ3NDLGFBRmlDLEVBR2pDekIsYUFIaUMsRUFJakNoQyxnQkFKaUMsRUFLSDtBQUM5QixRQUFJMEQsZUFBNEMsR0FBRyxFQUFuRDs7QUFDQSxRQUFJRCxhQUFKLEVBQW1CO0FBQ2xCQSxNQUFBQSxhQUFhLENBQUN6RixPQUFkLENBQXNCLFVBQUNvRCxZQUFELEVBQTBCO0FBQy9DLFlBQUl1QyxvQkFBSjtBQUVBLFlBQU1qQyxRQUF1QyxHQUFHUCxVQUFVLENBQUNRLFdBQVgsQ0FBdUJQLFlBQXZCLENBQWhEOztBQUNBLFlBQUlNLFFBQVEsS0FBS08sU0FBakIsRUFBNEI7QUFDM0I7QUFDQTs7QUFDRCxZQUFJUCxRQUFRLENBQUNFLEtBQVQsS0FBbUIsb0JBQXZCLEVBQTZDO0FBQzVDO0FBQ0ErQixVQUFBQSxvQkFBb0IsR0FBR1QsbUJBQW1CLENBQ3pDL0IsVUFEeUMsRUFFekNDLFlBRnlDLEVBR3pDTSxRQUFRLENBQUNRLFVBQVQsQ0FBb0IwQixnQkFIcUIsRUFJekM1QixhQUp5QyxFQUt6Q2hDLGdCQUx5QyxDQUExQztBQU9BLFNBVEQsTUFTTyxJQUFJMEIsUUFBUSxDQUFDUSxVQUFULEtBQXdCRCxTQUF4QixJQUFxQ1AsUUFBUSxDQUFDUSxVQUFULENBQW9CTixLQUFwQixLQUE4QixhQUF2RSxFQUFzRjtBQUM1RjtBQUNBK0IsVUFBQUEsb0JBQW9CLEdBQUdULG1CQUFtQixDQUN6Qy9CLFVBRHlDLEVBRXpDQyxZQUZ5QyxFQUd6Q00sUUFBUSxDQUFDUSxVQUFULENBQW9Ca0IsVUFIcUIsRUFJekNwQixhQUp5QyxFQUt6Q2hDLGdCQUx5QyxDQUExQztBQU9BLFNBVE0sTUFTQTtBQUNOLGNBQU1tRCxjQUFjLEdBQUcvQixZQUFZLENBQUN5QyxRQUFiLENBQXNCLEdBQXRCLElBQ3BCekMsWUFBWSxDQUNYRSxLQURELENBQ08sR0FEUCxFQUVDd0MsTUFGRCxDQUVRLENBRlIsRUFFVyxDQUZYLEVBR0NDLElBSEQsQ0FHTSxHQUhOLENBRG9CLEdBS3BCLEVBTEg7QUFNQUosVUFBQUEsb0JBQW9CLEdBQUdULG1CQUFtQixDQUFDL0IsVUFBRCxFQUFhZ0MsY0FBYixFQUE2QixDQUFDekIsUUFBRCxDQUE3QixFQUF5Q00sYUFBekMsRUFBd0RoQyxnQkFBeEQsQ0FBMUM7QUFDQTs7QUFFRDBELFFBQUFBLGVBQWUsbUNBQ1hBLGVBRFcsR0FFWEMsb0JBRlcsQ0FBZjtBQUlBLE9BdkNEO0FBd0NBOztBQUNELFdBQU9ELGVBQVA7QUFDQSxHQWxERDs7QUFvREEsTUFBTU0sZUFBZSxHQUFHLFVBQ3ZCQyxZQUR1QixFQUV2QjdDLFlBRnVCLEVBR3ZCcEIsZ0JBSHVCLEVBSXZCbUIsVUFKdUIsRUFLRztBQUMxQixRQUFJK0MsV0FBb0MsR0FBR0QsWUFBWSxDQUFDN0MsWUFBRCxDQUF2RDs7QUFDQSxRQUFJOEMsV0FBSixFQUFpQjtBQUNoQixhQUFPRCxZQUFZLENBQUM3QyxZQUFELENBQW5CO0FBQ0EsS0FGRCxNQUVPO0FBQ044QyxNQUFBQSxXQUFXLEdBQUdwQywyQkFBMkIsQ0FBQ1gsVUFBRCxFQUFhQSxVQUFVLENBQUNRLFdBQVgsQ0FBdUJQLFlBQXZCLENBQWIsRUFBbURBLFlBQW5ELEVBQWlFLElBQWpFLEVBQXVFcEIsZ0JBQXZFLENBQXpDO0FBQ0E7O0FBQ0QsUUFBSSxDQUFDa0UsV0FBTCxFQUFrQjtBQUNqQmxFLE1BQUFBLGdCQUFnQixDQUFDbUUsY0FBakIsR0FBa0NDLFFBQWxDLENBQTJDQyxhQUFhLENBQUNDLFVBQXpELEVBQXFFQyxhQUFhLENBQUNDLElBQW5GLEVBQXlGQyxTQUFTLENBQUNDLHNCQUFuRztBQUNBLEtBVHlCLENBVTFCOzs7QUFDQSxRQUFJUixXQUFKLEVBQWlCO0FBQUE7O0FBQ2hCQSxNQUFBQSxXQUFXLENBQUN0QixZQUFaLEdBQTJCRSxnQkFBZ0IsQ0FBQzZCLE9BQTVDO0FBQ0FULE1BQUFBLFdBQVcsQ0FBQ1UsV0FBWixHQUEwQixDQUFDLDJCQUFDekQsVUFBVSxDQUFDeEMsV0FBWiw0RUFBQyxzQkFBd0JDLE1BQXpCLG1EQUFDLHVCQUFnQ2lHLGFBQWpDLENBQTNCO0FBQ0E7O0FBQ0QsV0FBT1gsV0FBUDtBQUNBLEdBckJEOztBQXVCQSxNQUFNWSx1QkFBdUIsR0FBRyxVQUMvQmIsWUFEK0IsRUFFL0JjLGNBRitCLEVBRy9CNUQsVUFIK0IsRUFJL0JuQixnQkFKK0IsRUFLL0JnRix3QkFMK0IsRUFNL0JDLHdCQU4rQixFQU9mO0FBQ2hCLFFBQU12QixlQUE4QixHQUFHLEVBQXZDO0FBQ0EsUUFBTXdCLGlCQUFzQixHQUFHLEVBQS9CO0FBQ0EsUUFBTTlCLFVBQVUsR0FBR2pDLFVBQVUsQ0FBQ3lDLGdCQUE5QixDQUhnQixDQUloQjs7QUFDQXFCLElBQUFBLHdCQUF3QixTQUF4QixJQUFBQSx3QkFBd0IsV0FBeEIsWUFBQUEsd0JBQXdCLENBQUVqSCxPQUExQixDQUFrQyxVQUFBbUgsY0FBYyxFQUFJO0FBQ25ERCxNQUFBQSxpQkFBaUIsQ0FBQ0MsY0FBYyxDQUFDQyxLQUFoQixDQUFqQixHQUEwQyxJQUExQztBQUNBLEtBRkQ7O0FBR0EsUUFBSUwsY0FBYyxJQUFJQSxjQUFjLENBQUN2RixNQUFmLEdBQXdCLENBQTlDLEVBQWlEO0FBQ2hEdUYsTUFBQUEsY0FBYyxTQUFkLElBQUFBLGNBQWMsV0FBZCxZQUFBQSxjQUFjLENBQUUvRyxPQUFoQixDQUF3QixVQUFDcUgsWUFBRCxFQUFvQztBQUMzRCxZQUFNakcsWUFBaUIsR0FBR2lHLFlBQVksQ0FBQ0MsWUFBdkM7QUFDQSxZQUFNQyxhQUFxQixHQUFHbkcsWUFBWSxDQUFDZ0csS0FBM0M7QUFDQSxZQUFNRixpQkFBc0IsR0FBRyxFQUEvQjtBQUNBRCxRQUFBQSx3QkFBd0IsU0FBeEIsSUFBQUEsd0JBQXdCLFdBQXhCLFlBQUFBLHdCQUF3QixDQUFFakgsT0FBMUIsQ0FBa0MsVUFBQW1ILGNBQWMsRUFBSTtBQUNuREQsVUFBQUEsaUJBQWlCLENBQUNDLGNBQWMsQ0FBQ0MsS0FBaEIsQ0FBakIsR0FBMEMsSUFBMUM7QUFDQSxTQUZEOztBQUdBLFlBQUksRUFBRUcsYUFBYSxJQUFJUCx3QkFBbkIsQ0FBSixFQUFrRDtBQUNqRCxjQUFJLEVBQUVPLGFBQWEsSUFBSUwsaUJBQW5CLENBQUosRUFBMkM7QUFDMUMsZ0JBQU1NLFlBQW9DLEdBQUd4QixlQUFlLENBQUNDLFlBQUQsRUFBZXNCLGFBQWYsRUFBOEJ2RixnQkFBOUIsRUFBZ0RtQixVQUFoRCxDQUE1RDs7QUFDQSxnQkFBSXFFLFlBQUosRUFBaUI7QUFDaEI5QixjQUFBQSxlQUFlLENBQUM3QyxJQUFoQixDQUFxQjJFLFlBQXJCO0FBQ0E7QUFDRDtBQUNEO0FBQ0QsT0FmRDtBQWdCQSxLQWpCRCxNQWlCTyxJQUFJcEMsVUFBSixFQUFnQjtBQUN0QkEsTUFBQUEsVUFBVSxDQUFDcEYsT0FBWCxDQUFtQixVQUFDMEQsUUFBRCxFQUF3QjtBQUFBOztBQUMxQyxZQUFNK0Qsa0JBQWtCLDZCQUFHL0QsUUFBUSxDQUFDL0MsV0FBWixzRkFBRyx1QkFBc0JDLE1BQXpCLDREQUFHLHdCQUE4QjhHLGtCQUF6RDtBQUNBLFlBQU1DLFlBQVksR0FBR2pFLFFBQVEsQ0FBQ3VCLElBQTlCOztBQUNBLFlBQUksRUFBRTBDLFlBQVksSUFBSVgsd0JBQWxCLENBQUosRUFBaUQ7QUFDaEQsY0FBSVMsa0JBQWtCLElBQUksRUFBRUUsWUFBWSxJQUFJVCxpQkFBbEIsQ0FBMUIsRUFBZ0U7QUFDL0QsZ0JBQU1NLGFBQW9DLEdBQUd4QixlQUFlLENBQUNDLFlBQUQsRUFBZTBCLFlBQWYsRUFBNkIzRixnQkFBN0IsRUFBK0NtQixVQUEvQyxDQUE1RDs7QUFDQSxnQkFBSXFFLGFBQUosRUFBaUI7QUFDaEI5QixjQUFBQSxlQUFlLENBQUM3QyxJQUFoQixDQUFxQjJFLGFBQXJCO0FBQ0E7QUFDRDtBQUNEO0FBQ0QsT0FYRDtBQVlBOztBQUNELFdBQU85QixlQUFQO0FBQ0EsR0EvQ0Q7QUFpREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU2tDLG1CQUFULENBQTZCNUYsZ0JBQTdCLEVBQWdGO0FBQUE7O0FBQy9FLFFBQU02RixtQkFBbUIsR0FBRzdGLGdCQUFnQixDQUFDOEYsc0JBQWpCLEVBQTVCO0FBQ0EsUUFBTUMsbUJBQW1CLEdBQUdGLG1CQUFtQixDQUFDRyxpQkFBcEIsQ0FBc0M3RSxVQUFsRTtBQUNBLFFBQU04RSxlQUFlLEdBQUcsQ0FBQywyQkFBQ0YsbUJBQW1CLENBQUNwSCxXQUFyQiw0RUFBQyxzQkFBaUNDLE1BQWxDLG1EQUFDLHVCQUF5Q2lHLGFBQTFDLENBQXpCO0FBQ0EsUUFBTXFCLHlCQUF5QixHQUM5QkQsZUFBZSxJQUFJakcsZ0JBQWdCLENBQUNtRyxzQkFBakIsQ0FBd0MsTUFBTU4sbUJBQW1CLENBQUNHLGlCQUFwQixDQUFzQy9DLElBQXBGLENBRHBCO0FBR0EsUUFBTW1ELGVBQWUsR0FBSUYseUJBQXlCLEdBQy9DSCxtQkFBbUIsQ0FBQ25DLGdCQUFwQixDQUFxQzFELEdBQXJDLENBQXlDLFVBQVN3QixRQUFULEVBQW1CO0FBQzVELGFBQU9zQyxlQUFlLENBQUMsRUFBRCxFQUFvQ3RDLFFBQVEsQ0FBQ3VCLElBQTdDLEVBQW1EaUQseUJBQW5ELEVBQThFSCxtQkFBOUUsQ0FBdEI7QUFDQyxLQUZELENBRCtDLEdBSS9DLEVBSkg7QUFNQSxXQUFPSyxlQUFQO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sTUFBTUMsMkJBQTJCLEdBQUcsVUFBUy9HLGdCQUFULEVBQWlEVSxnQkFBakQsRUFBOEY7QUFDeEksUUFDQ0EsZ0JBQWdCLENBQUNzRyxrQkFBakIsR0FBc0NDLHlCQUF0QyxNQUNBdkcsZ0JBQWdCLENBQUN3RyxlQUFqQixPQUF1Q0MsWUFBWSxDQUFDQyxrQkFGckQsRUFHRTtBQUNELGFBQU8sSUFBUDtBQUNBLEtBTnVJLENBUXhJO0FBQ0E7OztBQUNBLFFBQU1uSCxXQUFXLEdBQUdTLGdCQUFnQixDQUFDMkcsY0FBakIsRUFBcEI7O0FBQ0EsUUFBSXBILFdBQVcsSUFBSUQsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTdDLEVBQWdEO0FBQy9DLGFBQU9GLGdCQUFnQixDQUFDRyxLQUFqQixDQUF1QixVQUFBQyxhQUFhLEVBQUk7QUFDOUMsZUFBT0EsYUFBYSxDQUFDQyxlQUFkLElBQWlDLENBQUNELGFBQWEsQ0FBQ2tILHFCQUF2RDtBQUNBLE9BRk0sQ0FBUDtBQUdBLEtBSkQsTUFJTztBQUNOLGFBQU8sS0FBUDtBQUNBO0FBQ0QsR0FsQk07QUFvQlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTUMsdUJBQXVCLEdBQUcsVUFDdEMxRixVQURzQyxFQUV0Q25CLGdCQUZzQyxFQUdLO0FBQzNDLFFBQU04RyxRQUFxQyxHQUFHOUcsZ0JBQWdCLENBQUNzRyxrQkFBakIsR0FBc0NTLHNCQUF0QyxFQUE5QztBQUNBLFFBQU1DLG1CQUFxRSxHQUFHLENBQUFGLFFBQVEsU0FBUixJQUFBQSxRQUFRLFdBQVIsWUFBQUEsUUFBUSxDQUFFN0MsWUFBVixLQUEwQixFQUF4Rzs7QUFDQSxRQUFNUCxlQUE0QyxHQUFHRix5QkFBeUIsQ0FDN0VyQyxVQUQ2RSxFQUU3RThGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZRixtQkFBWixFQUFpQzlHLEdBQWpDLENBQXFDLFVBQUFLLEdBQUc7QUFBQSxhQUFJaUMsU0FBUyxDQUFDMkUsNEJBQVYsQ0FBdUM1RyxHQUF2QyxDQUFKO0FBQUEsS0FBeEMsQ0FGNkUsRUFHN0UsSUFINkUsRUFJN0VQLGdCQUo2RSxDQUE5RTs7QUFNQSxRQUFNaUUsWUFBc0QsR0FBRyxFQUEvRDs7QUFFQSxTQUFLLElBQU1tRCxJQUFYLElBQW1CSixtQkFBbkIsRUFBd0M7QUFDdkMsVUFBTTlDLFdBQVcsR0FBRzhDLG1CQUFtQixDQUFDSSxJQUFELENBQXZDO0FBQ0EsVUFBTWhJLFlBQVksR0FBR29ELFNBQVMsQ0FBQzJFLDRCQUFWLENBQXVDQyxJQUF2QyxDQUFyQjtBQUNBLFVBQU03RCxjQUFjLEdBQUdHLGVBQWUsQ0FBQ3RFLFlBQUQsQ0FBdEM7QUFDQSxVQUFNaUksSUFBSSxHQUFHbkQsV0FBVyxDQUFDbUQsSUFBWixLQUFxQixNQUFyQixHQUE4QjFKLGVBQWUsQ0FBQzJKLElBQTlDLEdBQXFEM0osZUFBZSxDQUFDZ0gsT0FBbEY7QUFDQSxVQUFNNEMsWUFBWSxHQUNqQnJELFdBQVcsSUFBSUEsV0FBSixhQUFJQSxXQUFKLGVBQUlBLFdBQVcsQ0FBRXFELFlBQTVCLEdBQ0dDLGdCQUFnQixDQUFDckcsVUFBRCxFQUFhbkIsZ0JBQWIsRUFBK0JvSCxJQUEvQixFQUFxQ0osbUJBQXJDLENBRG5CLEdBRUcvRSxTQUhKO0FBSUFnQyxNQUFBQSxZQUFZLENBQUNtRCxJQUFELENBQVosR0FBcUI7QUFDcEI3RyxRQUFBQSxHQUFHLEVBQUU2RyxJQURlO0FBRXBCQyxRQUFBQSxJQUFJLEVBQUVBLElBRmM7QUFHcEIxRyxRQUFBQSxjQUFjLEVBQUU0QyxjQUFGLGFBQUVBLGNBQUYsdUJBQUVBLGNBQWMsQ0FBRTVDLGNBSFo7QUFJcEJnQyxRQUFBQSxhQUFhLEVBQUUsQ0FBQVksY0FBYyxTQUFkLElBQUFBLGNBQWMsV0FBZCxZQUFBQSxjQUFjLENBQUVaLGFBQWhCLEtBQWlDdkQsWUFKNUI7QUFLcEJxSSxRQUFBQSxRQUFRLEVBQUV2RCxXQUFXLENBQUN1RCxRQUxGO0FBTXBCekUsUUFBQUEsS0FBSyxFQUFFa0IsV0FBVyxDQUFDbEIsS0FOQztBQU9wQjBFLFFBQUFBLFFBQVEsRUFBRXhELFdBQVcsQ0FBQ3dELFFBQVosSUFBd0I7QUFBRUMsVUFBQUEsU0FBUyxFQUFFQyxTQUFTLENBQUNDO0FBQXZCLFNBUGQ7QUFRcEJqRixRQUFBQSxZQUFZLEVBQUVzQixXQUFXLENBQUN0QixZQUFaLElBQTRCRSxnQkFBZ0IsQ0FBQzZCLE9BUnZDO0FBU3BCbUQsUUFBQUEsUUFBUSxFQUFFNUQsV0FBVyxDQUFDNEQsUUFURjtBQVVwQlAsUUFBQUEsWUFBWSxFQUFFQTtBQVZNLE9BQXJCO0FBWUE7O0FBQ0QsV0FBT3RELFlBQVA7QUFDQSxHQXJDTTs7OztBQXVDQSxNQUFNOEQsY0FBYyxHQUFHLFVBQVMzRyxZQUFULEVBQStCcEIsZ0JBQS9CLEVBQW1FbUIsVUFBbkUsRUFBMkY7QUFDeEgsV0FBTzZDLGVBQWUsQ0FBQyxFQUFELEVBQUs1QyxZQUFMLEVBQW1CcEIsZ0JBQW5CLEVBQXFDbUIsVUFBckMsQ0FBdEI7QUFDQSxHQUZNO0FBSVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLE1BQU02RyxrQkFBa0IsR0FBRyxVQUNqQ2hJLGdCQURpQyxFQUlqQjtBQUFBOztBQUFBLFFBRmhCaUksUUFFZ0IsdUVBRmlCLEVBRWpCO0FBQUEsUUFEaEJ0SCxjQUNnQix1RUFEUyxFQUNUO0FBQ2hCO0FBQ0EsUUFBTTVCLGlCQUFrRCxHQUFHZSxvQkFBb0IsQ0FBQ21JLFFBQUQsRUFBV2pJLGdCQUFYLENBQS9FLENBRmdCLENBSWhCOztBQUNBLFFBQU1nRix3QkFBaUQsR0FBR2xHLDJCQUEyQixDQUFDQyxpQkFBRCxDQUFyRjtBQUNBLFFBQU1vQyxVQUFVLEdBQUduQixnQkFBZ0IsQ0FBQ2tJLGFBQWpCLEVBQW5CO0FBQ0EsUUFBTUMsWUFBWSw2QkFBR2hILFVBQVUsQ0FBQ3hDLFdBQVgsQ0FBdUJ3RCxFQUExQiwyREFBRyx1QkFBMkJpRyxZQUFoRDtBQUNBLFFBQUl0SyxjQUEyQyxHQUFHLEVBQWxEO0FBRUEsUUFBTXVLLFlBQVksR0FBR3JJLGdCQUFnQixDQUFDc0ksb0JBQWpCLENBQXNDLElBQXRDLDBDQUFyQjs7QUFFQSxRQUFJSCxZQUFZLEtBQUtsRyxTQUFqQixJQUE4QmtHLFlBQVksQ0FBQzNJLE1BQWIsR0FBc0IsQ0FBeEQsRUFBMkQ7QUFDMUQsV0FBSyxJQUFNK0ksQ0FBWCxJQUFnQkYsWUFBaEIsRUFBOEI7QUFDN0J2SyxRQUFBQSxjQUFjLG1DQUNWQSxjQURVLEdBRVZGLHlCQUF5QixDQUFDeUssWUFBWSxDQUFDRSxDQUFELENBQWIsQ0FGZixDQUFkO0FBSUE7QUFDRCxLQVBELE1BT087QUFDTnpLLE1BQUFBLGNBQWMsR0FBR3FLLFlBQVksQ0FBQ25KLE1BQWIsQ0FBb0IsVUFBQ0MsYUFBRCxFQUE2Q3VKLFdBQTdDLEVBQWtGO0FBQ3RILGFBQUssSUFBSUQsRUFBQyxHQUFHLENBQWIsRUFBZ0JBLEVBQUMsR0FBSUMsV0FBVyxDQUFDQyxNQUFaLENBQW1CQyxPQUFwQixDQUEyQzNLLElBQTNDLENBQWdEeUIsTUFBcEUsRUFBNEUrSSxFQUFDLEVBQTdFLEVBQWlGO0FBQUE7O0FBQ2hGdEosVUFBQUEsYUFBYSxDQUFHdUosV0FBVyxDQUFDQyxNQUFaLENBQW1CQyxPQUFwQixDQUEyQzNLLElBQTNDLENBQWdEd0ssRUFBaEQsQ0FBRCxDQUF1RXBLLEtBQXZFLENBQTZFQyxJQUE5RSxDQUFiLEdBQW1HO0FBQ2xHQyxZQUFBQSxLQUFLLEVBQUVtSyxXQUFGLGFBQUVBLFdBQUYsMENBQUVBLFdBQVcsQ0FBRUcsRUFBZixvREFBRSxnQkFBaUJDLFFBQWpCLEVBRDJGO0FBRWxHckssWUFBQUEsVUFBVSxFQUFFaUssV0FBRixhQUFFQSxXQUFGLDZDQUFFQSxXQUFXLENBQUU5SixLQUFmLHVEQUFFLG1CQUFvQmtLLFFBQXBCO0FBRnNGLFdBQW5HO0FBSUE7O0FBQ0QsZUFBTzNKLGFBQVA7QUFDQSxPQVJnQixFQVFkLEVBUmMsQ0FBakI7QUFTQTs7QUFFRCxRQUFJOEYsY0FBcUIsR0FBRyxFQUE1QjtBQUNBLFFBQU03RixnQkFBZ0IsR0FBRzJKLG1CQUFtQixDQUFDMUgsVUFBRCxFQUFhbkIsZ0JBQWIsQ0FBNUM7O0FBQ0EsUUFBSWQsZ0JBQUosRUFBc0I7QUFDckI2RixNQUFBQSxjQUFjLEdBQUc3RixnQkFBZ0IsQ0FBQzRKLGFBQWxDO0FBQ0EsS0FuQ2UsQ0FxQ2hCOzs7QUFDQSxRQUFNN0UsWUFBeUMsbUNBRTNDZixtQkFBbUIsQ0FBQy9CLFVBQUQsRUFBYSxFQUFiLEVBQWlCQSxVQUFVLENBQUN5QyxnQkFBNUIsRUFBOEMsS0FBOUMsRUFBcUQ1RCxnQkFBckQsQ0FGd0IsR0FJM0N3RCx5QkFBeUIsQ0FDM0JyQyxVQUQyQixFQUUzQm5CLGdCQUFnQixDQUFDc0csa0JBQWpCLEdBQXNDUyxzQkFBdEMsR0FBK0RnQyxvQkFGcEMsRUFHM0IsS0FIMkIsRUFJM0IvSSxnQkFKMkIsQ0FKa0IsQ0FBL0MsQ0F0Q2dCLENBa0RoQjs7O0FBQ0EsUUFBTWlGLHdCQUF3QixHQUFLdEUsY0FBYyw4QkFBSVgsZ0JBQWdCLENBQUNnSix1QkFBakIsQ0FBeUNySSxjQUF6QyxDQUFKLDBEQUFJLHNCQUEwRGYsVUFBOUQsQ0FBZiwrQkFDakN1QixVQUFVLENBQUN4QyxXQURzQixxRkFDakMsdUJBQXdCd0QsRUFEUywyREFDakMsdUJBQTRCOEcsZUFESyxLQUVqQyxFQUZEOztBQUdBLFFBQU1DLGNBQWMsR0FBR3BFLHVCQUF1QixDQUM3Q2IsWUFENkMsRUFFN0NjLGNBRjZDLEVBRzdDNUQsVUFINkMsRUFJN0NuQixnQkFKNkMsRUFLN0NnRix3QkFMNkMsRUFNN0NDLHdCQU42QyxDQUE5Qzs7QUFRQSxRQUFNbUIsZUFBZSxHQUFHUixtQkFBbUIsQ0FBQzVGLGdCQUFELENBQTNDLENBOURnQixDQWdFaEI7OztBQUNBLFFBQUltSixVQUFVLEdBQUcvQyxlQUFlLENBQzlCbkYsTUFEZSxDQUVmLENBQUFnRSx3QkFBd0IsU0FBeEIsSUFBQUEsd0JBQXdCLFdBQXhCLFlBQUFBLHdCQUF3QixDQUFFakcsTUFBMUIsQ0FBaUMsVUFBQzBFLGVBQUQsRUFBaUNILGNBQWpDLEVBQW9EO0FBQ3BGLFVBQU1uQyxZQUFZLEdBQUdtQyxjQUFjLENBQUM2QixLQUFwQzs7QUFDQSxVQUFJLEVBQUVoRSxZQUFZLElBQUk0RCx3QkFBbEIsQ0FBSixFQUFpRDtBQUNoRCxZQUFNZCxXQUFvQyxHQUFHRixlQUFlLENBQUNDLFlBQUQsRUFBZTdDLFlBQWYsRUFBNkJwQixnQkFBN0IsRUFBK0NtQixVQUEvQyxDQUE1RDs7QUFDQSxZQUFJK0MsV0FBSixFQUFpQjtBQUNoQkEsVUFBQUEsV0FBVyxDQUFDN0YsS0FBWixHQUFvQixFQUFwQjtBQUNBNkYsVUFBQUEsV0FBVyxDQUFDM0YsVUFBWixHQUF5QixFQUF6QjtBQUNBbUYsVUFBQUEsZUFBZSxDQUFDN0MsSUFBaEIsQ0FBcUJxRCxXQUFyQjtBQUNBO0FBQ0Q7O0FBQ0QsYUFBT1IsZUFBUDtBQUNBLEtBWEQsRUFXRyxFQVhILE1BV1UsRUFiSyxFQWVoQjtBQWZnQixLQWdCZnpDLE1BaEJlLENBZ0JSaUksY0FBYyxJQUFJLEVBaEJWLEVBaUJoQjtBQWpCZ0IsS0FrQmZqSSxNQWxCZSxDQW1CZmdHLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZakQsWUFBWixFQUNFbUYsTUFERixDQUNTLFVBQUFoSSxZQUFZO0FBQUEsYUFBSSxFQUFFQSxZQUFZLElBQUk0RCx3QkFBbEIsQ0FBSjtBQUFBLEtBRHJCLEVBRUU5RSxHQUZGLENBRU0sVUFBQWtCLFlBQVksRUFBSTtBQUNwQixhQUFPNkYsTUFBTSxDQUFDb0MsTUFBUCxDQUFjcEYsWUFBWSxDQUFDN0MsWUFBRCxDQUExQixFQUEwQ3RELGNBQWMsQ0FBQ3NELFlBQUQsQ0FBeEQsQ0FBUDtBQUNBLEtBSkYsQ0FuQmUsQ0FBakI7QUF5QkEsUUFBTWtJLFlBQVksR0FBR3RKLGdCQUFnQixDQUFDMkcsY0FBakIsRUFBckIsQ0ExRmdCLENBNEZoQjs7QUFDQSxRQUFJdEgsc0NBQXNDLENBQUM0SSxRQUFELEVBQVdxQixZQUFYLENBQTFDLEVBQW9FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLFVBQU1DLFVBQVUsR0FBR3RCLFFBQVEsQ0FBQyxDQUFELENBQVIsQ0FBWXNCLFVBQS9COztBQUNBLFVBQUlBLFVBQUosRUFBZ0I7QUFDZixZQUFNQyxzQkFBZ0MsR0FBR3ZDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZcUMsVUFBWixFQUF3QnJKLEdBQXhCLENBQTRCLFVBQUF1SixZQUFZO0FBQUEsaUJBQUlGLFVBQVUsQ0FBQ0UsWUFBRCxDQUFWLENBQXlCQyxZQUE3QjtBQUFBLFNBQXhDLENBQXpDO0FBQ0FQLFFBQUFBLFVBQVUsR0FBR0EsVUFBVSxDQUFDQyxNQUFYLENBQWtCLFVBQUFsRixXQUFXLEVBQUk7QUFDN0MsaUJBQU9zRixzQkFBc0IsQ0FBQzVJLE9BQXZCLENBQStCc0QsV0FBVyxDQUFDM0QsR0FBM0MsTUFBb0QsQ0FBQyxDQUE1RDtBQUNBLFNBRlksQ0FBYjtBQUdBO0FBQ0Q7O0FBRUQsUUFBTW1ELGVBQWUsR0FBR2lHLG9CQUFvQixDQUFDUixVQUFELEVBQWF0Qyx1QkFBdUIsQ0FBQzFGLFVBQUQsRUFBYW5CLGdCQUFiLENBQXBDLEVBQW9FO0FBQy9HLHNCQUFnQixXQUQrRjtBQUUvR2dELE1BQUFBLEtBQUssRUFBRSxXQUZ3RztBQUcvR3FFLE1BQUFBLElBQUksRUFBRSxXQUh5RztBQUkvR0ssTUFBQUEsUUFBUSxFQUFFLFdBSnFHO0FBSy9HRCxNQUFBQSxRQUFRLEVBQUUsV0FMcUc7QUFNL0dLLE1BQUFBLFFBQVEsRUFBRSxXQU5xRztBQU8vR1AsTUFBQUEsWUFBWSxFQUFFO0FBUGlHLEtBQXBFLENBQTVDLENBMUdnQixDQW9IaEI7O0FBQ0EsUUFBTXFDLGVBQWUsR0FBR0Msd0JBQXdCLENBQUM3SixnQkFBRCxDQUFoRDtBQUNBMEQsSUFBQUEsZUFBZSxDQUFDMUYsT0FBaEIsQ0FBd0IsVUFBQWtHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDNEYsYUFBWixHQUE0QkYsZUFBNUI7QUFDQSxLQUZEO0FBSUEsV0FBT2xHLGVBQVA7QUFDQSxHQS9ITSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0RmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0RmlsdGVyU2V0dGluZ3MsXG5cdFRlbXBsYXRlVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlVmlzdWFsaXphdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMsIFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIEZpZWxkR3JvdXBUeXBlLCBGaWVsZEdyb3VwIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBJc3N1ZVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlQ2F0ZWdvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmlsdGVyR3JvdXAgPSB7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xufTtcblxuZW51bSBmaWx0ZXJGaWVsZFR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQgPSBDdXN0b21FbGVtZW50PEZpbHRlckZpZWxkPjtcblxuLyoqXG4gKiBFbnRlciBhbGwgRGF0YUZpZWxkcyBvZiBhIGdpdmVuIEZpZWxkR3JvdXAgaW50byB0aGUgZmlsdGVyRmFjZXRNYXAuXG4gKlxuICogQHBhcmFtIHtBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT59IGZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD59IFRoZSBtYXAgb2YgZmFjZXRzIGZvciB0aGUgZ2l2ZW4gRmllbGRHcm91cFxuICovXG5mdW5jdGlvbiBnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGZpZWxkR3JvdXA6IEFubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiB7XG5cdGNvbnN0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblx0ZmllbGRHcm91cC5EYXRhLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwW2RhdGFGaWVsZC5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0Z3JvdXA6IGZpZWxkR3JvdXAuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOlxuXHRcdFx0XHRcdGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRHcm91cC5MYWJlbCB8fCBmaWVsZEdyb3VwLmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyKVxuXHRcdFx0XHRcdCkgfHwgZmllbGRHcm91cC5xdWFsaWZpZXJcblx0XHRcdH07XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZpbHRlckZhY2V0TWFwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10pOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB7XG5cdHJldHVybiBzZWxlY3Rpb25WYXJpYW50cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBzZWxlY3Rpb25WYXJpYW50KSA9PiB7XG5cdFx0c2VsZWN0aW9uVmFyaWFudC5wcm9wZXJ0eU5hbWVzLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHByZXZpb3VzVmFsdWVbcHJvcGVydHlOYW1lXSA9IHRydWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdH0sIHt9KTtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IGFsbCB0aGUgdGFibGVzIGZvciBhIGRlZGljYXRlZCBlbnRpdHkgc2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGUuXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIExpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBhcyBmb2xsb3dzOlxuICogPDE6Ti1Qcm9wZXJ0eU5hbWU+KlxcLzwxOjEtUHJvcGVydHlOYW1lPi88UHJvcGVydHlOYW1lPi5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgcm9vdCBFbnRpdHlUeXBlXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25kaXRpb24gcGF0aFxuICovXG5jb25zdCBfZ2V0Q29uZGl0aW9uUGF0aCA9IGZ1bmN0aW9uKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgcGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRsZXQgcGFydGlhbFBhdGg7XG5cdGxldCBrZXkgPSBcIlwiO1xuXHR3aGlsZSAocGFydHMubGVuZ3RoKSB7XG5cdFx0bGV0IHBhcnQgPSBwYXJ0cy5zaGlmdCgpIGFzIHN0cmluZztcblx0XHRwYXJ0aWFsUGF0aCA9IHBhcnRpYWxQYXRoID8gcGFydGlhbFBhdGggKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocGFydGlhbFBhdGgpO1xuXHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBwcm9wZXJ0eS5pc0NvbGxlY3Rpb24pIHtcblx0XHRcdHBhcnQgKz0gXCIqXCI7XG5cdFx0fVxuXHRcdGtleSA9IGtleSA/IGtleSArIFwiL1wiICsgcGFydCA6IHBhcnQ7XG5cdH1cblx0cmV0dXJuIGtleTtcbn07XG5cbmNvbnN0IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHQvLyBpZ25vcmUgY29tcGxleCBwcm9wZXJ0eSB0eXBlcyBhbmQgaGlkZGVuIGFubm90YXRlZCBvbmVzXG5cdGlmIChcblx0XHRwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0cHJvcGVydHkudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0KGluY2x1ZGVIaWRkZW4gfHwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0KSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUocHJvcGVydHkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGNvbmRpdGlvblBhdGg6IF9nZXRDb25kaXRpb25QYXRoKGVudGl0eVR5cGUsIGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YXZhaWxhYmlsaXR5OlxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpID09PSB0cnVlID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0XHRsYWJlbDogY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKSxcblx0XHRcdGdyb3VwOiB0YXJnZXRFbnRpdHlUeXBlLm5hbWUsXG5cdFx0XHRncm91cExhYmVsOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCB0YXJnZXRFbnRpdHlUeXBlLm5hbWUpXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eVBhdGhzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRsZXQgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnR5UGF0aHMpIHtcblx0XHRwcm9wZXJ0eVBhdGhzLmZvckVhY2goKHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYWxTZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPjtcblxuXHRcdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0aWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkudGFyZ2V0VHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5LnRhcmdldFR5cGUuX3R5cGUgPT09IFwiQ29tcGxleFR5cGVcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUlTU0lOR19TRUxFQ1RJT05GSUVMRCk7XG5cdH1cblx0Ly8gZGVmaW5lZCBTZWxlY3Rpb25GaWVsZHMgYXJlIGF2YWlsYWJsZSBieSBkZWZhdWx0XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSA9IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdDtcblx0XHRmaWx0ZXJGaWVsZC5pc1BhcmFtZXRlciA9ICEhZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZDtcbn07XG5cbmNvbnN0IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRhU2VsZWN0T3B0aW9uczogYW55W10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogUHJvcGVydHlQYXRoW11cbik6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBbXTtcblx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHQvLyBVc2luZyBlbnRpdHlUeXBlIGluc3RlYWQgb2YgZW50aXR5U2V0XG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRcdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEoUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKFByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcGFyYW1ldGVyIGZpbHRlciBmaWVsZHMgaW4gY2FzZSBvZiBhIHBhcmFtZXRlcml6ZWQgc2VydmljZS5cbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge0ZpbHRlckZpZWxkW119IEFuIGFycmF5IG9mIHBhcmFtZXRlciBmaWx0ZXJmaWVsZHNcbiAqL1xuZnVuY3Rpb24gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogRmlsdGVyRmllbGRbXSB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0Y29uc3QgaXNQYXJhbWV0ZXJpemVkID0gISFwYXJhbWV0ZXJFbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdGNvbnN0IHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQgPVxuXHRcdGlzUGFyYW1ldGVyaXplZCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWUpO1xuXG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IChwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0XG5cdFx0PyBwYXJhbWV0ZXJFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKGZ1bmN0aW9uKHByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30gYXMgUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LCBwcm9wZXJ0eS5uYW1lLCBwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0LCBwYXJhbWV0ZXJFbnRpdHlUeXBlKTtcblx0XHQgIH0pXG5cdFx0OiBbXSkgYXMgRmlsdGVyRmllbGRbXTtcblxuXHRyZXR1cm4gcGFyYW1ldGVyRmllbGRzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIFRoZSBsaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgaW5mb3JtYXRpb24gaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoID0gZnVuY3Rpb24obGlzdFJlcG9ydFRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucygpIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIElmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgYW5kIG5vbmUgb2YgdGhlbSBhbGxvdyBmb3Igc2VhcmNoXG5cdC8vIHRoZW4gdGhlIHNlYXJjaCBmaWVsZCBtdXN0IGJlIGhpZGRlblxuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0aWYgKGNvbnRleHRQYXRoICYmIGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KHZpc3VhbGl6YXRpb24gPT4ge1xuXHRcdFx0cmV0dXJuIHZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICYmICF2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljc1NlYXJjaDtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGZpbHRlciBmaWVsZHMgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5VHlwZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPn0gVGhlIGZpbHRlciBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBmYkNvbmZpZzogRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmluZWRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPiA9IGZiQ29uZmlnPy5maWx0ZXJGaWVsZHMgfHwge307XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRlbnRpdHlUeXBlLFxuXHRcdE9iamVjdC5rZXlzKGRlZmluZWRGaWx0ZXJGaWVsZHMpLm1hcChrZXkgPT4gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoa2V5KSksXG5cdFx0dHJ1ZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdCk7XG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBkZWZpbmVkRmlsdGVyRmllbGRzKSB7XG5cdFx0Y29uc3QgZmlsdGVyRmllbGQgPSBkZWZpbmVkRmlsdGVyRmllbGRzW3NLZXldO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KHNLZXkpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzW3Byb3BlcnR5TmFtZV07XG5cdFx0Y29uc3QgdHlwZSA9IGZpbHRlckZpZWxkLnR5cGUgPT09IFwiU2xvdFwiID8gZmlsdGVyRmllbGRUeXBlLlNsb3QgOiBmaWx0ZXJGaWVsZFR5cGUuRGVmYXVsdDtcblx0XHRjb25zdCB2aXN1YWxGaWx0ZXIgPVxuXHRcdFx0ZmlsdGVyRmllbGQgJiYgZmlsdGVyRmllbGQ/LnZpc3VhbEZpbHRlclxuXHRcdFx0XHQ/IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRjb25kaXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uY29uZGl0aW9uUGF0aCB8fCBwcm9wZXJ0eU5hbWUsXG5cdFx0XHR0ZW1wbGF0ZTogZmlsdGVyRmllbGQudGVtcGxhdGUsXG5cdFx0XHRsYWJlbDogZmlsdGVyRmllbGQubGFiZWwsXG5cdFx0XHRwb3NpdGlvbjogZmlsdGVyRmllbGQucG9zaXRpb24gfHwgeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5BZnRlciB9LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgfHwgQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0LFxuXHRcdFx0c2V0dGluZ3M6IGZpbHRlckZpZWxkLnNldHRpbmdzLFxuXHRcdFx0dmlzdWFsRmlsdGVyOiB2aXN1YWxGaWx0ZXJcblx0XHR9O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xuXHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9LCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsclRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGFubm90YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7RmlsdGVyU2VsZWN0aW9uRmllbGRbXX0gQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIlxuKTogRmlsdGVyRmllbGRbXSB7XG5cdC8vIEZldGNoIGFsbCBzZWxlY3Rpb25WYXJpYW50cyBkZWZpbmVkIGluIHRoZSBkaWZmZXJlbnQgdmlzdWFsaXphdGlvbnMgYW5kIGRpZmZlcmVudCB2aWV3cyAobXVsdGkgdGFibGUgbW9kZSlcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBnZXRTZWxlY3Rpb25WYXJpYW50cyhsclRhYmxlcywgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50cyk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uRmlsdGVyRmFjZXRzO1xuXHRsZXQgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXG5cdGNvbnN0IGFGaWVsZEdyb3VwcyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJVSVwiLCBVSUFubm90YXRpb25UZXJtcy5GaWVsZEdyb3VwKTtcblxuXHRpZiAoZmlsdGVyRmFjZXRzID09PSB1bmRlZmluZWQgfHwgZmlsdGVyRmFjZXRzLmxlbmd0aCA8IDApIHtcblx0XHRmb3IgKGNvbnN0IGkgaW4gYUZpZWxkR3JvdXBzKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcCA9IHtcblx0XHRcdFx0Li4uZmlsdGVyRmFjZXRNYXAsXG5cdFx0XHRcdC4uLmdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoYUZpZWxkR3JvdXBzW2ldIGFzIEFubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPilcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZhY2V0TWFwID0gZmlsdGVyRmFjZXRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+LCBmaWx0ZXJGYWNldDogUmVmZXJlbmNlRmFjZXRUeXBlcykgPT4ge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAoZmlsdGVyRmFjZXQuVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRwcmV2aW91c1ZhbHVlWygoZmlsdGVyRmFjZXQuVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YVtpXSBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdFx0Z3JvdXA6IGZpbHRlckZhY2V0Py5JRD8udG9TdHJpbmcoKSxcblx0XHRcdFx0XHRncm91cExhYmVsOiBmaWx0ZXJGYWNldD8uTGFiZWw/LnRvU3RyaW5nKClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHRcdH0sIHt9KTtcblx0fVxuXG5cdGxldCBhU2VsZWN0T3B0aW9uczogYW55W10gPSBbXTtcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudCA9IGdldFNlbGVjdGlvblZhcmlhbnQoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0YVNlbGVjdE9wdGlvbnMgPSBzZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnM7XG5cdH1cblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGZhbHNlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdClcblx0fTtcblxuXHQvL0ZpbHRlcnMgd2hpY2ggaGFzIHRvIGJlIGFkZGVkIHdoaWNoIGlzIHBhcnQgb2YgU1YvRGVmYXVsdCBhbm5vdGF0aW9ucyBidXQgbm90IHByZXNlbnQgaW4gdGhlIFNlbGVjdGlvbkZpZWxkc1xuXHRjb25zdCBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMgPSAoKGFubm90YXRpb25QYXRoICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGgpPy5hbm5vdGF0aW9uKSB8fFxuXHRcdGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5TZWxlY3Rpb25GaWVsZHMgfHxcblx0XHRbXSkgYXMgUHJvcGVydHlQYXRoW107XG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMoXG5cdFx0ZmlsdGVyRmllbGRzLFxuXHRcdGFTZWxlY3RPcHRpb25zLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzXG5cdCk7XG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gZmluYWxseSBjcmVhdGUgZmluYWwgbGlzdCBvZiBmaWx0ZXIgZmllbGRzIGJ5IGFkZGluZyB0aGUgU2VsZWN0aW9uRmllbGRzIGZpcnN0IChvcmRlciBtYXR0ZXJzKS4uLlxuXHRsZXQgYWxsRmlsdGVycyA9IHBhcmFtZXRlckZpZWxkc1xuXHRcdC5jb25jYXQoXG5cdFx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LnJlZHVjZSgoc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdLCBzZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3Rpb25GaWVsZC52YWx1ZTtcblx0XHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXBMYWJlbCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChmaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG5cdFx0XHR9LCBbXSkgfHwgW11cblx0XHQpXG5cdFx0Ly8gVG8gYWRkIHRoZSBGaWx0ZXJGaWVsZCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgU2VsZWN0aW9uIEZpZWxkcyBidXQgdGhlIHByb3BlcnR5IGlzIG1lbnRpb25lZCBpbiB0aGUgU2VsZWN0aW9uIFZhcmlhbnRcblx0XHQuY29uY2F0KGRlZmF1bHRGaWx0ZXJzIHx8IFtdKVxuXHRcdC8vIC4uLmFuZCBhZGRpbmcgcmVtYWluaW5nIGZpbHRlciBmaWVsZHMsIHRoYXQgYXJlIG5vdCB1c2VkIGluIGEgU2VsZWN0aW9uVmFyaWFudCAob3JkZXIgZG9lc24ndCBtYXR0ZXIpXG5cdFx0LmNvbmNhdChcblx0XHRcdE9iamVjdC5rZXlzKGZpbHRlckZpZWxkcylcblx0XHRcdFx0LmZpbHRlcihwcm9wZXJ0eVBhdGggPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdLCBmaWx0ZXJGYWNldE1hcFtwcm9wZXJ0eVBhdGhdKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRjb25zdCBzQ29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cblx0Ly9pZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIHRhYmxlcyBcImFnZ3JlZ2F0YWJsZVwiIHByb3BlcnRpZXMgbXVzdCBiZSBleGNsdWRlZFxuXHRpZiAoY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobHJUYWJsZXMsIHNDb250ZXh0UGF0aCkpIHtcblx0XHQvLyBDdXJyZW50bHkgYWxsIGFncmVnYXRlcyBhcmUgcm9vdCBlbnRpdHkgcHJvcGVydGllcyAobm8gcHJvcGVydGllcyBjb21pbmcgZnJvbSBuYXZpZ2F0aW9uKSBhbmQgYWxsXG5cdFx0Ly8gdGFibGVzIHdpdGggc2FtZSBlbnRpdHlTZXQgZ2V0cyBzYW1lIGFnZ3JlYWd0ZSBjb25maWd1cmF0aW9uIHRoYXQncyB3aHkgd2UgY2FuIHVzZSBmaXJzdCB0YWJsZSBpbnRvXG5cdFx0Ly8gTFIgdG8gZ2V0IGFnZ3JlZ2F0ZXMgKHdpdGhvdXQgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzIHNpbmNlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGVtKS5cblx0XHRjb25zdCBhZ2dyZWdhdGVzID0gbHJUYWJsZXNbMF0uYWdncmVnYXRlcztcblx0XHRpZiAoYWdncmVnYXRlcykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhZ2dyZWdhdGVzKS5tYXAoYWdncmVnYXRlS2V5ID0+IGFnZ3JlZ2F0ZXNbYWdncmVnYXRlS2V5XS5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0YWxsRmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKGZpbHRlckZpZWxkID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFsbEZpbHRlcnMsIGdldE1hbmlmZXN0RmlsdGVyRmllbGRzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLCB7XG5cdFx0XCJhdmFpbGFiaWxpdHlcIjogXCJvdmVyd3JpdGVcIixcblx0XHRsYWJlbDogXCJvdmVyd3JpdGVcIixcblx0XHR0eXBlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIlxuXHR9KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaChmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG4iXX0=
@@ -24,6 +24,7 @@ import { IssueType, IssueSeverity, IssueCategory } from "sap/fe/core/converters/
24
24
  import { PropertyPath } from "@sap-ux/vocabularies-types/dist/Edm";
25
25
 
26
26
  export type FilterField = ConfigurableObject & {
27
+ type?: string;
27
28
  conditionPath: string;
28
29
  availability: AvailabilityType;
29
30
  annotationPath: string;
@@ -42,13 +43,18 @@ type FilterGroup = {
42
43
  groupLabel?: string;
43
44
  };
44
45
 
46
+ enum filterFieldType {
47
+ Default = "Default",
48
+ Slot = "Slot"
49
+ }
50
+
45
51
  export type CustomElementFilterField = CustomElement<FilterField>;
46
52
 
47
53
  /**
48
54
  * Enter all DataFields of a given FieldGroup into the filterFacetMap.
49
55
  *
50
56
  * @param {AnnotationTerm<FieldGroupType>} fieldGroup
51
- * @returns {Record<string, FilterGroup>} The map of facets for the given fieldGroup
57
+ * @returns {Record<string, FilterGroup>} The map of facets for the given FieldGroup
52
58
  */
53
59
  function getFieldGroupFilterGroups(fieldGroup: AnnotationTerm<FieldGroupType>): Record<string, FilterGroup> {
54
60
  const filterFacetMap: Record<string, FilterGroup> = {};
@@ -76,8 +82,8 @@ function getExcludedFilterProperties(selectionVariants: SelectionVariantConfigur
76
82
  }
77
83
 
78
84
  /**
79
- * Check that all the tables for a dedicated entityset are configured as analytical table.
80
- * @param {TableVisualization[]} listReportTables List Report tables
85
+ * Check that all the tables for a dedicated entity set are configured as analytical table.
86
+ * @param {TableVisualization[]} listReportTables List report tables
81
87
  * @param {string} contextPath
82
88
  * @returns {boolean} Is FilterBar search field hidden or not
83
89
  */
@@ -119,10 +125,10 @@ function getSelectionVariants(
119
125
  }
120
126
 
121
127
  /**
122
- * Returns the condition path required for the condition model. It looks like follow:
128
+ * Returns the condition path required for the condition model. It looks as follows:
123
129
  * <1:N-PropertyName>*\/<1:1-PropertyName>/<PropertyName>.
124
130
  *
125
- * @param entityType The root EntityTy[e
131
+ * @param entityType The root EntityType
126
132
  * @param propertyPath The full path to the target property
127
133
  * @returns {string} The formatted condition path
128
134
  */
@@ -217,7 +223,7 @@ const _getSelectionFieldsByPath = function(
217
223
  includeHidden,
218
224
  converterContext
219
225
  );
220
- } else if (property.targetType !== undefined) {
226
+ } else if (property.targetType !== undefined && property.targetType._type === "ComplexType") {
221
227
  // handle ComplexType properties
222
228
  localSelectionFields = _getSelectionFields(
223
229
  entityType,
@@ -318,7 +324,7 @@ const _getDefaultFilterFields = function(
318
324
  };
319
325
 
320
326
  /**
321
- * Get all Parameter filterFields in case of a parameterized service.
327
+ * Get all parameter filter fields in case of a parameterized service.
322
328
  * @param {ConverterContext} converterContext
323
329
  * @returns {FilterField[]} An array of parameter filterfields
324
330
  */
@@ -352,10 +358,17 @@ export const getFilterBarhideBasicSearch = function(listReportTables: TableVisua
352
358
  ) {
353
359
  return true;
354
360
  }
355
- // Tries to find a non-analytical table with the main entity set (page entity set) as collection
356
- // if at least one table matches these conditions, basic search field must be displayed.
357
- const sContextPath = converterContext.getContextPath();
358
- return checkAllTableForEntitySetAreAnalytical(listReportTables, sContextPath);
361
+
362
+ // If all tables are analytical and none of them allow for search
363
+ // then the search field must be hidden
364
+ const contextPath = converterContext.getContextPath();
365
+ if (contextPath && listReportTables.length > 0) {
366
+ return listReportTables.every(visualization => {
367
+ return visualization.enableAnalytics && !visualization.enableAnalyticsSearch;
368
+ });
369
+ } else {
370
+ return false;
371
+ }
359
372
  };
360
373
 
361
374
  /**
@@ -383,9 +396,14 @@ export const getManifestFilterFields = function(
383
396
  const filterField = definedFilterFields[sKey];
384
397
  const propertyName = KeyHelper.getPathFromSelectionFieldKey(sKey);
385
398
  const selectionField = selectionFields[propertyName];
386
- const visualFilter = getVisualFilters(entityType, converterContext, sKey, definedFilterFields);
399
+ const type = filterField.type === "Slot" ? filterFieldType.Slot : filterFieldType.Default;
400
+ const visualFilter =
401
+ filterField && filterField?.visualFilter
402
+ ? getVisualFilters(entityType, converterContext, sKey, definedFilterFields)
403
+ : undefined;
387
404
  filterFields[sKey] = {
388
405
  key: sKey,
406
+ type: type,
389
407
  annotationPath: selectionField?.annotationPath,
390
408
  conditionPath: selectionField?.conditionPath || propertyName,
391
409
  template: filterField.template,
@@ -525,6 +543,7 @@ export const getSelectionFields = function(
525
543
  const selectionFields = insertCustomElements(allFilters, getManifestFilterFields(entityType, converterContext), {
526
544
  "availability": "overwrite",
527
545
  label: "overwrite",
546
+ type: "overwrite",
528
547
  position: "overwrite",
529
548
  template: "overwrite",
530
549
  settings: "overwrite",