@sapui5/sap.fe.core 1.98.0 → 1.99.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 (231) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +3 -2
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2399
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -2
  14. package/src/sap/fe/core/PageController.js +84 -125
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -823
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -164
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +63 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1664
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +559 -608
  27. package/src/sap/fe/core/actions/draft.ts +593 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -514
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1215
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +54 -211
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +47 -45
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
  50. package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  57. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  58. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  59. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
  60. package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
  61. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  62. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
  63. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  64. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  65. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  66. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  67. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  68. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  69. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
  70. package/src/sap/fe/core/converters/ConverterContext.js +2 -2
  71. package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  72. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  73. package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  74. package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
  75. package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  76. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
  77. package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  78. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  79. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  80. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  81. package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
  82. package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  83. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  84. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  85. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  86. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  87. package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
  88. package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  89. package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
  90. package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  91. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
  92. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  93. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
  94. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  95. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  96. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  97. package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
  98. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  99. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  100. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  101. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  102. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  103. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  104. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  105. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  106. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  107. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  108. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  109. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  110. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  111. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  112. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  113. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  114. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  116. package/src/sap/fe/core/fpm/Component.js +3 -2
  117. package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
  118. package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  119. package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
  120. package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  121. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  122. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  123. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  124. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  125. package/src/sap/fe/core/helpers/EditState.js +81 -84
  126. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  127. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  128. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  129. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  130. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  131. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  132. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  133. package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
  134. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  135. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  136. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  137. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  138. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  139. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  140. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  141. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  142. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  143. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  144. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  145. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  146. package/src/sap/fe/core/library.js +4 -3
  147. package/src/sap/fe/core/library.support.js +3 -2
  148. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  149. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  150. package/src/sap/fe/core/messagebundle.properties +23 -10
  151. package/src/sap/fe/core/messagebundle_ar.properties +9 -0
  152. package/src/sap/fe/core/messagebundle_bg.properties +9 -0
  153. package/src/sap/fe/core/messagebundle_ca.properties +9 -0
  154. package/src/sap/fe/core/messagebundle_cs.properties +10 -1
  155. package/src/sap/fe/core/messagebundle_cy.properties +9 -0
  156. package/src/sap/fe/core/messagebundle_da.properties +9 -0
  157. package/src/sap/fe/core/messagebundle_de.properties +9 -0
  158. package/src/sap/fe/core/messagebundle_el.properties +9 -0
  159. package/src/sap/fe/core/messagebundle_en.properties +9 -0
  160. package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  161. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  162. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  163. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  164. package/src/sap/fe/core/messagebundle_es.properties +9 -0
  165. package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  166. package/src/sap/fe/core/messagebundle_et.properties +9 -0
  167. package/src/sap/fe/core/messagebundle_fi.properties +9 -0
  168. package/src/sap/fe/core/messagebundle_fr.properties +13 -4
  169. package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  170. package/src/sap/fe/core/messagebundle_hi.properties +15 -6
  171. package/src/sap/fe/core/messagebundle_hr.properties +15 -6
  172. package/src/sap/fe/core/messagebundle_hu.properties +9 -0
  173. package/src/sap/fe/core/messagebundle_id.properties +10 -1
  174. package/src/sap/fe/core/messagebundle_it.properties +9 -0
  175. package/src/sap/fe/core/messagebundle_iw.properties +9 -0
  176. package/src/sap/fe/core/messagebundle_ja.properties +9 -0
  177. package/src/sap/fe/core/messagebundle_kk.properties +15 -6
  178. package/src/sap/fe/core/messagebundle_ko.properties +9 -0
  179. package/src/sap/fe/core/messagebundle_lt.properties +9 -0
  180. package/src/sap/fe/core/messagebundle_lv.properties +15 -6
  181. package/src/sap/fe/core/messagebundle_ms.properties +14 -5
  182. package/src/sap/fe/core/messagebundle_nl.properties +9 -0
  183. package/src/sap/fe/core/messagebundle_no.properties +9 -0
  184. package/src/sap/fe/core/messagebundle_pl.properties +9 -0
  185. package/src/sap/fe/core/messagebundle_pt.properties +9 -0
  186. package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  187. package/src/sap/fe/core/messagebundle_ro.properties +9 -0
  188. package/src/sap/fe/core/messagebundle_ru.properties +9 -0
  189. package/src/sap/fe/core/messagebundle_sh.properties +11 -2
  190. package/src/sap/fe/core/messagebundle_sk.properties +9 -0
  191. package/src/sap/fe/core/messagebundle_sl.properties +15 -6
  192. package/src/sap/fe/core/messagebundle_sv.properties +9 -0
  193. package/src/sap/fe/core/messagebundle_th.properties +9 -0
  194. package/src/sap/fe/core/messagebundle_tr.properties +9 -0
  195. package/src/sap/fe/core/messagebundle_uk.properties +9 -0
  196. package/src/sap/fe/core/messagebundle_vi.properties +9 -0
  197. package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  198. package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  199. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  200. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  201. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  202. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  203. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  204. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  205. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  206. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  207. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  208. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  209. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
  210. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  211. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  212. package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  213. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
  214. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  215. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
  216. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  217. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  218. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  219. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  220. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  221. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  222. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  223. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  224. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  225. package/src/sap/fe/core/templating/FilterHelper.js +138 -72
  226. package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  227. package/src/sap/fe/core/templating/UIFormatters.js +31 -1
  228. package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  229. package/src/sap/fe/core/type/Email.js +1 -1
  230. package/src/sap/fe/core/type/Email.ts +4 -6
  231. package/ui5.yaml +0 -3
@@ -6,6 +6,10 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
+ var getRestrictions = StandardActions.getRestrictions;
10
+ var getMassEditVisibility = StandardActions.getMassEditVisibility;
11
+ var isInDisplayMode = StandardActions.isInDisplayMode;
12
+ var getCreateVisibility = StandardActions.getCreateVisibility;
9
13
  var getInsertUpdateActionsTemplating = StandardActions.getInsertUpdateActionsTemplating;
10
14
  var isDraftOrStickySupported = StandardActions.isDraftOrStickySupported;
11
15
  var getStandardActionMassEdit = StandardActions.getStandardActionMassEdit;
@@ -38,7 +42,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
38
42
  var KeyHelper = Key.KeyHelper;
39
43
  var UI = BindingHelper.UI;
40
44
  var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
41
- var Draft = BindingHelper.Draft;
45
+ var Entity = BindingHelper.Entity;
42
46
  var resolveBindingString = BindingExpression.resolveBindingString;
43
47
  var or = BindingExpression.or;
44
48
  var not = BindingExpression.not;
@@ -320,17 +324,25 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
320
324
  });
321
325
 
322
326
  if (oProperty) {
323
- var _getAssociatedCurrenc, _getAssociatedUnitPro, _oProperty$annotation;
327
+ var _oProperty$annotation5;
324
328
 
325
- var sUnit = ((_getAssociatedCurrenc = getAssociatedCurrencyProperty(oProperty)) === null || _getAssociatedCurrenc === void 0 ? void 0 : _getAssociatedCurrenc.name) || ((_getAssociatedUnitPro = getAssociatedUnitProperty(oProperty)) === null || _getAssociatedUnitPro === void 0 ? void 0 : _getAssociatedUnitPro.name);
329
+ var oUnit = getAssociatedCurrencyProperty(oProperty) || getAssociatedUnitProperty(oProperty);
326
330
 
327
- if (sUnit) {
328
- var oUnitColumn = findColumnByPath(sUnit);
331
+ if (oUnit) {
332
+ var oUnitColumn = findColumnByPath(oUnit.name);
329
333
  oTableColumn.unit = oUnitColumn === null || oUnitColumn === void 0 ? void 0 : oUnitColumn.name;
334
+ } else {
335
+ var _oProperty$annotation, _oProperty$annotation2, _oProperty$annotation3, _oProperty$annotation4;
336
+
337
+ var sUnit = (oProperty === null || oProperty === void 0 ? void 0 : (_oProperty$annotation = oProperty.annotations) === null || _oProperty$annotation === void 0 ? void 0 : (_oProperty$annotation2 = _oProperty$annotation.Measures) === null || _oProperty$annotation2 === void 0 ? void 0 : _oProperty$annotation2.ISOCurrency) || (oProperty === null || oProperty === void 0 ? void 0 : (_oProperty$annotation3 = oProperty.annotations) === null || _oProperty$annotation3 === void 0 ? void 0 : (_oProperty$annotation4 = _oProperty$annotation3.Measures) === null || _oProperty$annotation4 === void 0 ? void 0 : _oProperty$annotation4.Unit);
338
+
339
+ if (sUnit) {
340
+ oTableColumn.unitText = "".concat(sUnit);
341
+ }
330
342
  }
331
343
 
332
344
  var displayMode = getDisplayMode(oProperty),
333
- textAnnotation = (_oProperty$annotation = oProperty.annotations.Common) === null || _oProperty$annotation === void 0 ? void 0 : _oProperty$annotation.Text;
345
+ textAnnotation = (_oProperty$annotation5 = oProperty.annotations.Common) === null || _oProperty$annotation5 === void 0 ? void 0 : _oProperty$annotation5.Text;
334
346
 
335
347
  if (isPathExpression(textAnnotation) && displayMode !== "Value") {
336
348
  var oTextColumn = findColumnByPath(textAnnotation.path);
@@ -365,7 +377,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
365
377
  control: tableManifestConfig,
366
378
  actions: removeDuplicateActions(getTableActions(lineItemAnnotation, visualizationPath, converterContext, navigationSettings)),
367
379
  columns: columns,
368
- enableDataStateFilter: converterContext.getTemplateType() === "ObjectPage",
369
380
  operationAvailableMap: JSON.stringify(operationAvailableMap),
370
381
  operationAvailableProperties: getOperationAvailableProperties(operationAvailableMap, converterContext)
371
382
  };
@@ -386,7 +397,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
386
397
  control: tableManifestConfig,
387
398
  actions: [],
388
399
  columns: columns,
389
- enableDataStateFilter: converterContext.getTemplateType() === "ObjectPage",
390
400
  operationAvailableMap: JSON.stringify(operationAvailableMap),
391
401
  operationAvailableProperties: getOperationAvailableProperties(operationAvailableMap, converterContext)
392
402
  };
@@ -448,6 +458,24 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
448
458
 
449
459
  return operationAvailableMap;
450
460
  }
461
+ /**
462
+ * Gets updatable propertyPath for the current entityset if valid.
463
+ *
464
+ * @param converterContext The instance of the converter context
465
+ * @returns {string} The updatable property for the rows
466
+ */
467
+
468
+
469
+ function getCurrentEntitySetUpdatablePath(converterContext) {
470
+ var _entitySet$annotation, _entitySet$annotation2, _entitySet$annotation3;
471
+
472
+ var restrictions = getRestrictions(converterContext);
473
+ var entitySet = converterContext.getEntitySet();
474
+ var updatable = restrictions.isUpdatable;
475
+ var isOnlyDynamicOnCurrentEntity = updatable.isOnlyCurrentEntityExpression && !isConstant(updatable.expression);
476
+ var updatablePropertyPath = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation = entitySet.annotations.Capabilities) === null || _entitySet$annotation === void 0 ? void 0 : (_entitySet$annotation2 = _entitySet$annotation.UpdateRestrictions) === null || _entitySet$annotation2 === void 0 ? void 0 : (_entitySet$annotation3 = _entitySet$annotation2.Updatable) === null || _entitySet$annotation3 === void 0 ? void 0 : _entitySet$annotation3.path;
477
+ return isOnlyDynamicOnCurrentEntity ? updatablePropertyPath : "";
478
+ }
451
479
  /**
452
480
  * Method to retrieve all property paths assigned to the Core.OperationAvailable annotation.
453
481
  *
@@ -670,9 +698,11 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
670
698
 
671
699
  _exports.getCapabilityRestriction = getCapabilityRestriction;
672
700
 
673
- function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities, isDeleteButtonVisible) {
701
+ function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities, deleteButtonVisibilityExpression) {
674
702
  var _tableManifestSetting;
675
703
 
704
+ var massEditVisibilityExpression = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : constant(false);
705
+
676
706
  if (!lineItemAnnotation) {
677
707
  return SelectionMode.None;
678
708
  }
@@ -689,14 +719,28 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
689
719
  parentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable, true) : isParentDeletable;
690
720
  }
691
721
 
692
- if (selectionMode && selectionMode === SelectionMode.None && isDeleteButtonVisible) {
693
- return compileBinding(ifElse(isDeleteButtonVisible, constant("Multi"), constant("None")));
722
+ var bMassEditEnabled = !isConstant(massEditVisibilityExpression) || massEditVisibilityExpression.value !== false;
723
+
724
+ if (selectionMode && selectionMode === SelectionMode.None && deleteButtonVisibilityExpression) {
725
+ if (converterContext.getTemplateType() === TemplateType.ObjectPage && bMassEditEnabled) {
726
+ // Mass Edit in OP is enabled only in edit mode.
727
+ return compileBinding(ifElse(and(equal(bindingExpression("/editMode", "ui"), "Editable"), massEditVisibilityExpression), constant("Multi"), ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None"))));
728
+ } else if (bMassEditEnabled) {
729
+ return SelectionMode.Multi;
730
+ }
731
+
732
+ return compileBinding(ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None")));
694
733
  }
695
734
 
696
735
  if (!selectionMode || selectionMode === SelectionMode.Auto) {
697
736
  selectionMode = SelectionMode.Multi;
698
737
  }
699
738
 
739
+ if (bMassEditEnabled) {
740
+ // Override default selection mode when mass edit is visible
741
+ selectionMode = selectionMode === SelectionMode.Single ? SelectionMode.Single : SelectionMode.Multi;
742
+ }
743
+
700
744
  if (hasBoundActionsAlwaysVisibleInToolBar(lineItemAnnotation, converterContext.getEntityType()) || hasCustomActionsAlwaysVisibleInToolBar(manifestActions)) {
701
745
  return selectionMode;
702
746
  }
@@ -704,31 +748,42 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
704
748
  aHiddenBindingExpressions = getUIHiddenExpForActionsRequiringContext(lineItemAnnotation, converterContext.getEntityType(), converterContext.getDataModelObjectPath(), isEntitySet);
705
749
  aVisibleBindingExpressions = getVisibleExpForCustomActionsRequiringContext(manifestActions); // No action requiring a context:
706
750
 
707
- if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 && isDeleteButtonVisible) {
751
+ if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 && (deleteButtonVisibilityExpression || bMassEditEnabled)) {
708
752
  if (!isEntitySet) {
709
- if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false") {
710
- return compileBinding(ifElse(and(equal(bindingExpression("/editMode", "ui"), "Editable"), isDeleteButtonVisible), constant(selectionMode), constant(SelectionMode.None)));
753
+ // Example: OP case
754
+ if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false" || bMassEditEnabled) {
755
+ // Building expression for delete and mass edit
756
+ var buttonVisibilityExpression = or(deleteButtonVisibilityExpression || true, // default delete visibility as true
757
+ massEditVisibilityExpression);
758
+ return compileBinding(ifElse(and(equal(bindingExpression("/editMode", "ui"), "Editable"), buttonVisibilityExpression), constant(selectionMode), constant(SelectionMode.None)));
711
759
  } else {
712
760
  return SelectionMode.None;
713
761
  } // EntitySet deletable:
714
762
 
715
- } else if (targetCapabilities.isDeletable && isDeleteButtonVisible) {
716
- return compileBinding(ifElse(isDeleteButtonVisible, constant(selectionMode), constant("None"))); // EntitySet not deletable:
763
+ } else if (bMassEditEnabled) {
764
+ // example: LR scenario
765
+ return selectionMode;
766
+ } else if (targetCapabilities.isDeletable && deleteButtonVisibilityExpression) {
767
+ return compileBinding(ifElse(deleteButtonVisibilityExpression, constant(selectionMode), constant("None"))); // EntitySet not deletable:
717
768
  } else {
718
769
  return SelectionMode.None;
719
770
  } // There are actions requiring a context:
720
771
 
721
772
  } else if (!isEntitySet) {
722
- if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false") {
723
- return compileBinding(ifElse(equal(bindingExpression("/editMode", "ui"), "Editable"), constant(selectionMode), ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None))));
773
+ // Example: OP case
774
+ if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false" || bMassEditEnabled) {
775
+ // Use selectionMode in edit mode if delete is enabled or mass edit is visible
776
+ var editModebuttonVisibilityExpression = ifElse(bMassEditEnabled && !targetCapabilities.isDeletable, massEditVisibilityExpression, constant(true));
777
+ return compileBinding(ifElse(and(equal(bindingExpression("/editMode", "ui"), "Editable"), editModebuttonVisibilityExpression), constant(selectionMode), ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None))));
724
778
  } else {
725
779
  return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None)));
726
780
  } //EntitySet deletable:
727
781
 
728
- } else if (targetCapabilities.isDeletable) {
729
- return SelectionMode.Multi; //EntitySet not deletable:
782
+ } else if (targetCapabilities.isDeletable || bMassEditEnabled) {
783
+ // Example: LR scenario
784
+ return selectionMode; //EntitySet not deletable:
730
785
  } else {
731
- return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None)));
786
+ return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions)).concat([massEditVisibilityExpression])), constant(selectionMode), constant(SelectionMode.None)));
732
787
  }
733
788
  }
734
789
  /**
@@ -810,7 +865,13 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
810
865
  }
811
866
  }
812
867
 
813
- return ifElse(isDraftRoot && Draft.IsNewObject, MessageType.Information, formatResult([defaultHighlightRowDefinition, bindingExpression("filteredMessages", "internal")], tableFormatters.rowHighlighting, targetEntityType));
868
+ var aMissingKeys = [];
869
+ targetEntityType === null || targetEntityType === void 0 ? void 0 : targetEntityType.keys.forEach(function (key) {
870
+ if (key.name !== "IsActiveEntity") {
871
+ aMissingKeys.push(bindingExpression(key.name, undefined));
872
+ }
873
+ });
874
+ return formatResult([defaultHighlightRowDefinition, bindingExpression("filteredMessages", "internal"), isDraftRoot && Entity.HasActive, isDraftRoot && Entity.IsActive, "".concat(isDraftRoot)].concat(aMissingKeys), tableFormatters.rowHighlighting, targetEntityType);
814
875
  }
815
876
 
816
877
  function _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings) {
@@ -1093,9 +1154,10 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1093
1154
  */
1094
1155
 
1095
1156
 
1096
- var _getVisibleExpression = function (dataFieldModelPath, formatOptions, returnExpression) {
1157
+ var _getVisibleExpression = function (dataFieldModelPath, formatOptions) {
1097
1158
  var _targetObject$Target, _targetObject$Target$, _targetObject$annotat, _targetObject$annotat2, _propertyValue$annota, _propertyValue$annota2;
1098
1159
 
1160
+ var returnExpression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1099
1161
  var targetObject = dataFieldModelPath.targetObject;
1100
1162
  var propertyValue;
1101
1163
 
@@ -1161,6 +1223,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1161
1223
  }, fieldFormatOptions, true));
1162
1224
  });
1163
1225
  return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aFieldGroupHiddenExpressions)), constant(true), constant(false)));
1226
+ } else {
1227
+ return undefined;
1164
1228
  }
1165
1229
  };
1166
1230
  /**
@@ -1563,7 +1627,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1563
1627
  // for charts
1564
1628
  visualSettings.widthCalculation = null;
1565
1629
  } // TODO: For situation POC - increase width of the column with the situations indicator - works for the situations demo app only!
1566
- // Might be a good idea to move the complete column width determination to the converter, that would allow us to widen the columns as needed. This workaround only deals with Date columns.
1630
+ // Might be a good idea to move the complete column width determination to the converter, that would allow us to widen
1631
+ // the columns as needed. This workaround only deals with Date columns.
1567
1632
 
1568
1633
 
1569
1634
  var _getDefaultDraftIndic = getDefaultDraftIndicatorForColumn(name, semanticKeys),
@@ -1799,9 +1864,10 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1799
1864
  aPersonalization.push("Sort");
1800
1865
  aPersonalization.push("Column");
1801
1866
 
1802
- if (variantManagement === VariantManagementType.Control) {
1867
+ if (variantManagement === VariantManagementType.Control || _isFilterBarHidden(manifestWrapper, converterContext)) {
1803
1868
  // Feature parity with V2.
1804
1869
  // Enable table filtering by default only in case of Control level variant management.
1870
+ // Or when the LR filter bar is hidden via manifest setting
1805
1871
  aPersonalization.push("Filter");
1806
1872
  }
1807
1873
 
@@ -1815,6 +1881,23 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1815
1881
 
1816
1882
  return undefined;
1817
1883
  }
1884
+ /**
1885
+ * Returns a boolean suggesting if a filter bar is being used on the page.
1886
+ *
1887
+ * Chart has a dependency to filter bar (issue with loading data). Once resolved, the check for chart should be removed here.
1888
+ * Until then, hiding filter bar is now allowed if a chart is being used on LR.
1889
+ *
1890
+ * @param {ManifestWrapper} manifestWrapper Manifest settings getter for the page
1891
+ * @param {ConverterContext} converterContext The instance of the converter context
1892
+ * @returns {boolean} Boolean suggesting if a filter bar is being used on the page.
1893
+ */
1894
+
1895
+
1896
+ _exports.getP13nMode = getP13nMode;
1897
+
1898
+ function _isFilterBarHidden(manifestWrapper, converterContext) {
1899
+ return manifestWrapper.isFilterBarHidden() && !converterContext.getManifestWrapper().hasMultipleVisualizations() && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage;
1900
+ }
1818
1901
  /**
1819
1902
  * Returns a JSON string containing the sort conditions for the presentation variant.
1820
1903
  *
@@ -1825,8 +1908,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1825
1908
  */
1826
1909
 
1827
1910
 
1828
- _exports.getP13nMode = getP13nMode;
1829
-
1830
1911
  function getSortConditions(converterContext, presentationVariantAnnotation, columns) {
1831
1912
  // Currently navigation property is not supported as sorter
1832
1913
  var nonSortableProperties = getNonSortablePropertiesRestrictions(converterContext.getEntitySet());
@@ -1954,8 +2035,11 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1954
2035
  var navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
1955
2036
  var navigationSettings = pageManifestSettings.getNavigationConfiguration(navigationTargetPath);
1956
2037
  var standardActionsContext = generateStandardActionsContext(converterContext, navigationSettings, tableManifestConfiguration, viewConfiguration);
1957
- var isDeleteButtonVisible = getDeleteVisibility(converterContext, standardActionsContext);
1958
- var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, isDeleteButtonVisible);
2038
+ var deleteButtonVisibilityExpression = getDeleteVisibility(converterContext, standardActionsContext);
2039
+ var createButtonVisibilityExpression = getCreateVisibility(converterContext, standardActionsContext);
2040
+ var massEditButtonVisibilityExpression = getMassEditVisibility(converterContext, standardActionsContext);
2041
+ var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), compileBinding(createButtonVisibilityExpression) === "false");
2042
+ var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, deleteButtonVisibilityExpression, massEditButtonVisibilityExpression);
1959
2043
  var threshold = navigationPropertyPath ? 10 : 30;
1960
2044
 
1961
2045
  if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.MaxItems) {
@@ -1966,13 +2050,12 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1966
2050
 
1967
2051
  var variantManagement = pageManifestSettings.getVariantManagement();
1968
2052
  var isSearchable = isPathSearchable(converterContext.getDataModelObjectPath());
1969
- var tableActions = {
2053
+ var standardActions = {
1970
2054
  create: getStandardActionCreate(converterContext, standardActionsContext),
1971
2055
  "delete": getStandardActionDelete(converterContext, standardActionsContext),
1972
- paste: getStandardActionPaste(converterContext, standardActionsContext),
1973
- massEdit: getStandardActionMassEdit(converterContext, standardActionsContext, selectionMode)
2056
+ paste: getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateTemplated),
2057
+ massEdit: getStandardActionMassEdit(converterContext, standardActionsContext)
1974
2058
  };
1975
- var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), tableActions.create.visible === "false");
1976
2059
  return {
1977
2060
  id: id,
1978
2061
  entityName: entitySet ? entitySet.name : "",
@@ -1981,13 +2064,14 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
1981
2064
  row: _getRowConfigurationProperty(lineItemAnnotation, visualizationPath, converterContext, navigationSettings, navigationTargetPath),
1982
2065
  p13nMode: p13nMode,
1983
2066
  standardActions: {
1984
- actions: tableActions,
1985
- isInsertUpdateTemplated: isInsertUpdateTemplated
2067
+ actions: standardActions,
2068
+ isInsertUpdateTemplated: isInsertUpdateTemplated,
2069
+ updatablePropertyPath: getCurrentEntitySetUpdatablePath(converterContext)
1986
2070
  },
1987
2071
  displayMode: isInDisplayMode(converterContext, viewConfiguration),
1988
2072
  create: creationBehaviour,
1989
2073
  selectionMode: selectionMode,
1990
- autoBindOnInit: converterContext.getTemplateType() !== TemplateType.ListReport && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage && !(viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)),
2074
+ autoBindOnInit: _isFilterBarHidden(pageManifestSettings, converterContext) || converterContext.getTemplateType() !== TemplateType.ListReport && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage && !(viewConfiguration && pageManifestSettings.hasMultipleVisualizations(viewConfiguration)),
1991
2075
  variantManagement: variantManagement === "Control" && !p13nMode ? VariantManagementType.None : variantManagement,
1992
2076
  threshold: threshold,
1993
2077
  sortConditions: getSortConditions(converterContext, presentationVariantAnnotation, columns),
@@ -2038,17 +2122,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2038
2122
 
2039
2123
  return exportDataType;
2040
2124
  }
2041
-
2042
- function isInDisplayMode(converterContext, viewConfiguration) {
2043
- var templateType = converterContext.getTemplateType();
2044
-
2045
- if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
2046
- return true;
2047
- } // updatable will be handled at the property level
2048
-
2049
-
2050
- return false;
2051
- }
2052
2125
  /**
2053
2126
  * Split the visualization path into the navigation property path and annotation.
2054
2127
  *
@@ -2103,153 +2176,184 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2103
2176
 
2104
2177
  _exports.getSelectionVariantConfiguration = getSelectionVariantConfiguration;
2105
2178
 
2106
- function getTableManifestConfiguration(lineItemAnnotation, visualizationPath, converterContext) {
2107
- var _tableSettings$quickV5, _converterContext$get11;
2179
+ function _getFullScreenBasedOnDevice(tableSettings, converterContext, isIphone) {
2180
+ var _tableSettings$enable;
2108
2181
 
2109
- var checkCondensedLayout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2110
- var tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
2111
- var tableSettings = tableManifestSettings && tableManifestSettings.tableSettings || {};
2112
- var quickSelectionVariant;
2113
- var quickFilterPaths = [];
2114
- var enableExport = true;
2115
- var creationMode = CreationMode.NewPage;
2116
- var filters;
2117
- var createAtEnd = true;
2118
- var disableAddRowButtonForEmptyData = false;
2119
- var customValidationFunction;
2120
- var condensedTableLayout = false;
2121
- var hideTableTitle = false;
2122
- var tableType = "ResponsiveTable";
2123
- var enableFullScreen = false;
2124
- var selectionLimit = 200;
2125
- var multiSelectMode;
2126
- var enableAutoColumnWidth = !converterContext.getManifestWrapper().isPhone();
2127
- var enablePaste = tableSettings.enablePaste !== undefined ? tableSettings.enablePaste : converterContext.getTemplateType() === "ObjectPage"; // Paste is disabled by default excepted for OP
2182
+ // If enableFullScreen is not set, use as default true on phone and false otherwise
2183
+ var enableFullScreen = (_tableSettings$enable = tableSettings.enableFullScreen) !== null && _tableSettings$enable !== void 0 ? _tableSettings$enable : isIphone; // Make sure that enableFullScreen is not set on ListReport for desktop or tablet
2128
2184
 
2129
- var isCondensedTableLayoutCompliant = checkCondensedLayout && converterContext.getManifestWrapper().isCondensedLayoutCompliant();
2130
- var entityType = converterContext.getEntityType();
2131
- var aggregationHelper = new AggregationHelper(entityType, converterContext);
2185
+ if (!isIphone && enableFullScreen && converterContext.getTemplateType() === TemplateType.ListReport) {
2186
+ enableFullScreen = false;
2187
+ converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, IssueType.FULLSCREENMODE_NOT_ON_LISTREPORT);
2188
+ }
2132
2189
 
2133
- if (lineItemAnnotation) {
2134
- var _tableSettings$quickV, _tableSettings$quickV2, _tableSettings$creati, _tableSettings$creati2, _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$quickV4, _tableSettings$enable;
2190
+ return enableFullScreen;
2191
+ }
2135
2192
 
2136
- var targetEntityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
2137
- tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV = tableSettings.quickVariantSelection) === null || _tableSettings$quickV === void 0 ? void 0 : (_tableSettings$quickV2 = _tableSettings$quickV.paths) === null || _tableSettings$quickV2 === void 0 ? void 0 : _tableSettings$quickV2.forEach(function (path) {
2138
- var _tableSettings$quickV3;
2193
+ function _getMultiSelectMode(tableSettings, tableType, converterContext) {
2194
+ var multiSelectMode;
2139
2195
 
2140
- quickSelectionVariant = targetEntityType.resolvePath("@" + path.annotationPath); // quickSelectionVariant = converterContext.getEntityTypeAnnotation(path.annotationPath);
2196
+ if (tableType !== "ResponsiveTable") {
2197
+ return undefined;
2198
+ }
2141
2199
 
2142
- if (quickSelectionVariant) {
2143
- quickFilterPaths.push({
2144
- annotationPath: path.annotationPath
2145
- });
2146
- }
2200
+ switch (converterContext.getTemplateType()) {
2201
+ case TemplateType.ListReport:
2202
+ case TemplateType.AnalyticalListPage:
2203
+ multiSelectMode = !tableSettings.selectAll ? "ClearAll" : "Default";
2204
+ break;
2147
2205
 
2148
- filters = {
2149
- quickFilters: {
2150
- enabled: converterContext.getTemplateType() === TemplateType.ListReport ? "{= ${pageInternal>hasPendingFilters} !== true}" : true,
2151
- showCounts: tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV3 = tableSettings.quickVariantSelection) === null || _tableSettings$quickV3 === void 0 ? void 0 : _tableSettings$quickV3.showCounts,
2152
- paths: quickFilterPaths
2153
- }
2154
- };
2155
- });
2156
- creationMode = ((_tableSettings$creati = tableSettings.creationMode) === null || _tableSettings$creati === void 0 ? void 0 : _tableSettings$creati.name) || creationMode;
2157
- createAtEnd = ((_tableSettings$creati2 = tableSettings.creationMode) === null || _tableSettings$creati2 === void 0 ? void 0 : _tableSettings$creati2.createAtEnd) !== undefined ? (_tableSettings$creati3 = tableSettings.creationMode) === null || _tableSettings$creati3 === void 0 ? void 0 : _tableSettings$creati3.createAtEnd : true;
2158
- customValidationFunction = (_tableSettings$creati4 = tableSettings.creationMode) === null || _tableSettings$creati4 === void 0 ? void 0 : _tableSettings$creati4.customValidationFunction; // if a custom validation function is provided, disableAddRowButtonForEmptyData should not be considered, i.e. set to false
2159
-
2160
- disableAddRowButtonForEmptyData = !customValidationFunction ? !!((_tableSettings$creati5 = tableSettings.creationMode) !== null && _tableSettings$creati5 !== void 0 && _tableSettings$creati5.disableAddRowButtonForEmptyData) : false;
2161
- condensedTableLayout = tableSettings.condensedTableLayout !== undefined ? tableSettings.condensedTableLayout : false;
2162
- hideTableTitle = !!((_tableSettings$quickV4 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV4 !== void 0 && _tableSettings$quickV4.hideTableTitle);
2163
- tableType = (tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) || "ResponsiveTable";
2164
-
2165
- if (converterContext.getTemplateType() !== "ObjectPage") {
2166
- if ((tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) === "AnalyticalTable" && !aggregationHelper.isAnalyticsSupported()) {
2167
- tableType = "GridTable";
2168
- }
2206
+ case TemplateType.ObjectPage:
2207
+ multiSelectMode = tableSettings.selectAll === false ? "ClearAll" : "Default";
2169
2208
 
2170
- if (!(tableSettings !== null && tableSettings !== void 0 && tableSettings.type)) {
2171
- if (converterContext.getManifestWrapper().isDesktop() && aggregationHelper.isAnalyticsSupported()) {
2172
- tableType = "AnalyticalTable";
2173
- } else {
2174
- tableType = "ResponsiveTable";
2175
- }
2209
+ if (converterContext.getManifestWrapper().useIconTabBar()) {
2210
+ multiSelectMode = !tableSettings.selectAll ? "ClearAll" : "Default";
2176
2211
  }
2177
- } // If enableFullScreen is not set, use as default true on phone and false otherwise
2178
2212
 
2213
+ break;
2179
2214
 
2180
- enableFullScreen = (_tableSettings$enable = tableSettings.enableFullScreen) !== null && _tableSettings$enable !== void 0 ? _tableSettings$enable : converterContext.getManifestWrapper().isPhone(); // Make sure that enableFullScreen is not set on ListReport for desktop or tablet
2215
+ default:
2216
+ }
2181
2217
 
2182
- if (!converterContext.getManifestWrapper().isPhone() && enableFullScreen && converterContext.getTemplateType() === TemplateType.ListReport) {
2183
- enableFullScreen = false;
2184
- converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, IssueType.FULLSCREENMODE_NOT_ON_LISTREPORT);
2185
- }
2218
+ return multiSelectMode;
2219
+ }
2186
2220
 
2187
- selectionLimit = tableSettings.selectAll === true || tableSettings.selectionLimit === 0 ? 0 : tableSettings.selectionLimit || 200;
2221
+ function _getTableType(tableSettings, aggregationHelper, converterContext) {
2222
+ var tableType = (tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) || "ResponsiveTable";
2188
2223
 
2189
- if (tableType === "ResponsiveTable") {
2190
- if (converterContext.getTemplateType() === TemplateType.ListReport || converterContext.getTemplateType() === TemplateType.AnalyticalListPage) {
2191
- multiSelectMode = !!tableSettings.selectAll ? "Default" : "ClearAll";
2192
- }
2224
+ if (converterContext.getTemplateType() !== "ObjectPage") {
2225
+ if ((tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) === "AnalyticalTable" && !aggregationHelper.isAnalyticsSupported()) {
2226
+ tableType = "GridTable";
2227
+ }
2193
2228
 
2194
- if (converterContext.getTemplateType() === TemplateType.ObjectPage) {
2195
- if (converterContext.getManifestWrapper().useIconTabBar()) {
2196
- multiSelectMode = !!tableSettings.selectAll ? "Default" : "ClearAll";
2197
- } else {
2198
- multiSelectMode = tableSettings.selectAll === false ? "ClearAll" : "Default";
2199
- }
2229
+ if (!(tableSettings !== null && tableSettings !== void 0 && tableSettings.type)) {
2230
+ if (converterContext.getManifestWrapper().isDesktop() && aggregationHelper.isAnalyticsSupported()) {
2231
+ tableType = "AnalyticalTable";
2232
+ } else {
2233
+ tableType = "ResponsiveTable";
2200
2234
  }
2201
2235
  }
2236
+ }
2237
+
2238
+ return tableType;
2239
+ }
2240
+
2241
+ function _getFilters(tableSettings, quickFilterPaths, quickSelectionVariant, path, converterContext) {
2242
+ var _tableSettings$quickV;
2202
2243
 
2203
- enableExport = tableSettings.enableExport !== undefined ? tableSettings.enableExport : converterContext.getTemplateType() !== "ObjectPage" || enablePaste;
2244
+ if (quickSelectionVariant) {
2245
+ quickFilterPaths.push({
2246
+ annotationPath: path.annotationPath
2247
+ });
2204
2248
  }
2205
2249
 
2250
+ return {
2251
+ quickFilters: {
2252
+ enabled: converterContext.getTemplateType() === TemplateType.ListReport ? "{= ${pageInternal>hasPendingFilters} !== true}" : true,
2253
+ showCounts: tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV = tableSettings.quickVariantSelection) === null || _tableSettings$quickV === void 0 ? void 0 : _tableSettings$quickV.showCounts,
2254
+ paths: quickFilterPaths
2255
+ }
2256
+ };
2257
+ }
2258
+
2259
+ function _getEnableExport(tableSettings, converterContext, enablePaste) {
2260
+ return tableSettings.enableExport !== undefined ? tableSettings.enableExport : converterContext.getTemplateType() !== "ObjectPage" || enablePaste;
2261
+ }
2262
+
2263
+ function _getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext) {
2264
+ var _tableSettings$quickV2, _tableSettings$quickV3, _tableSettings$quickV4;
2265
+
2266
+ if (!lineItemAnnotation) {
2267
+ return {};
2268
+ }
2269
+
2270
+ var quickFilterPaths = [];
2271
+ var targetEntityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
2272
+ var quickSelectionVariant;
2273
+ var filters;
2274
+ tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV2 = tableSettings.quickVariantSelection) === null || _tableSettings$quickV2 === void 0 ? void 0 : (_tableSettings$quickV3 = _tableSettings$quickV2.paths) === null || _tableSettings$quickV3 === void 0 ? void 0 : _tableSettings$quickV3.forEach(function (path) {
2275
+ quickSelectionVariant = targetEntityType.resolvePath("@" + path.annotationPath);
2276
+ filters = _getFilters(tableSettings, quickFilterPaths, quickSelectionVariant, path, converterContext);
2277
+ });
2278
+ var hideTableTitle = false;
2279
+ hideTableTitle = !!((_tableSettings$quickV4 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV4 !== void 0 && _tableSettings$quickV4.hideTableTitle);
2206
2280
  return {
2207
2281
  filters: filters,
2208
- type: tableType,
2209
- enableFullScreen: enableFullScreen,
2210
- headerVisible: !(quickSelectionVariant && hideTableTitle),
2211
- enableExport: enableExport,
2212
- creationMode: creationMode,
2213
- createAtEnd: createAtEnd,
2214
- disableAddRowButtonForEmptyData: disableAddRowButtonForEmptyData,
2282
+ headerVisible: !(quickSelectionVariant && hideTableTitle)
2283
+ };
2284
+ }
2285
+
2286
+ function getTableManifestConfiguration(lineItemAnnotation, visualizationPath, converterContext) {
2287
+ var _tableSettings$creati, _tableSettings$creati2, _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$quickV5, _converterContext$get11;
2288
+
2289
+ var checkCondensedLayout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2290
+ var tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
2291
+ var tableSettings = tableManifestSettings && tableManifestSettings.tableSettings || {};
2292
+ var creationMode = CreationMode.NewPage;
2293
+ var enableAutoColumnWidth = !converterContext.getManifestWrapper().isPhone();
2294
+ var enablePaste = tableSettings.enablePaste !== undefined ? tableSettings.enablePaste : converterContext.getTemplateType() === "ObjectPage"; // Paste is disabled by default excepted for OP
2295
+
2296
+ var dataStateIndicatorFilter = converterContext.getTemplateType() === TemplateType.ListReport ? "API.dataStateIndicatorFilter" : undefined;
2297
+ var isCondensedTableLayoutCompliant = checkCondensedLayout && converterContext.getManifestWrapper().isCondensedLayoutCompliant();
2298
+
2299
+ var oFilterConfiguration = _getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext);
2300
+
2301
+ var customValidationFunction = (_tableSettings$creati = tableSettings.creationMode) === null || _tableSettings$creati === void 0 ? void 0 : _tableSettings$creati.customValidationFunction;
2302
+ var condensedTableLayout = tableSettings.condensedTableLayout !== undefined ? tableSettings.condensedTableLayout : false;
2303
+ var entityType = converterContext.getEntityType();
2304
+ var aggregationHelper = new AggregationHelper(entityType, converterContext);
2305
+
2306
+ var tableType = _getTableType(tableSettings, aggregationHelper, converterContext);
2307
+
2308
+ var oConfiguration = {
2309
+ createAtEnd: ((_tableSettings$creati2 = tableSettings.creationMode) === null || _tableSettings$creati2 === void 0 ? void 0 : _tableSettings$creati2.createAtEnd) !== undefined ? (_tableSettings$creati3 = tableSettings.creationMode) === null || _tableSettings$creati3 === void 0 ? void 0 : _tableSettings$creati3.createAtEnd : true,
2310
+ creationMode: ((_tableSettings$creati4 = tableSettings.creationMode) === null || _tableSettings$creati4 === void 0 ? void 0 : _tableSettings$creati4.name) || creationMode,
2215
2311
  customValidationFunction: customValidationFunction,
2216
- useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant,
2217
- selectionLimit: selectionLimit,
2218
- multiSelectMode: multiSelectMode,
2312
+ dataStateIndicatorFilter: dataStateIndicatorFilter,
2313
+ // if a custom validation function is provided, disableAddRowButtonForEmptyData should not be considered, i.e. set to false
2314
+ disableAddRowButtonForEmptyData: !customValidationFunction ? !!((_tableSettings$creati5 = tableSettings.creationMode) !== null && _tableSettings$creati5 !== void 0 && _tableSettings$creati5.disableAddRowButtonForEmptyData) : false,
2315
+ enableAutoColumnWidth: enableAutoColumnWidth,
2316
+ enableExport: _getEnableExport(tableSettings, converterContext, enablePaste),
2317
+ enableFullScreen: _getFullScreenBasedOnDevice(tableSettings, converterContext, converterContext.getManifestWrapper().isPhone()),
2318
+ enableMassEdit: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableMassEdit,
2219
2319
  enablePaste: enablePaste,
2320
+ headerVisible: true,
2321
+ multiSelectMode: _getMultiSelectMode(tableSettings, tableType, converterContext),
2322
+ selectionLimit: tableSettings.selectAll === true || tableSettings.selectionLimit === 0 ? 0 : tableSettings.selectionLimit || 200,
2220
2323
  showRowCount: !(tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV5 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV5 !== void 0 && _tableSettings$quickV5.showCounts) && !((_converterContext$get11 = converterContext.getManifestWrapper().getViewConfiguration()) !== null && _converterContext$get11 !== void 0 && _converterContext$get11.showCounts),
2221
- enableMassEdit: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableMassEdit,
2222
- enableAutoColumnWidth: enableAutoColumnWidth
2324
+ type: tableType,
2325
+ useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant
2223
2326
  };
2327
+ return _objectSpread(_objectSpread({}, oConfiguration), oFilterConfiguration);
2224
2328
  }
2225
2329
 
2226
2330
  _exports.getTableManifestConfiguration = getTableManifestConfiguration;
2227
2331
 
2228
2332
  function getTypeConfig(oProperty, dataType) {
2229
- var _targetType, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
2333
+ var _targetType, _oTargetMapping, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
2230
2334
 
2231
2335
  var oTargetMapping = EDM_TYPE_MAPPING[oProperty === null || oProperty === void 0 ? void 0 : oProperty.type] || (dataType ? EDM_TYPE_MAPPING[dataType] : undefined);
2232
2336
 
2233
- if (!oTargetMapping && oProperty.targetType && ((_targetType = oProperty.targetType) === null || _targetType === void 0 ? void 0 : _targetType._type) === "TypeDefinition") {
2337
+ if (!oTargetMapping && oProperty !== null && oProperty !== void 0 && oProperty.targetType && ((_targetType = oProperty.targetType) === null || _targetType === void 0 ? void 0 : _targetType._type) === "TypeDefinition") {
2234
2338
  oTargetMapping = EDM_TYPE_MAPPING[oProperty.targetType.underlyingType];
2235
2339
  }
2236
2340
 
2237
2341
  var propertyTypeConfig = {
2238
- type: oTargetMapping.type,
2342
+ type: (_oTargetMapping = oTargetMapping) === null || _oTargetMapping === void 0 ? void 0 : _oTargetMapping.type,
2239
2343
  constraints: {},
2240
2344
  formatOptions: {}
2241
2345
  };
2242
2346
 
2243
2347
  if (isProperty(oProperty)) {
2244
- var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation2, _oProperty$annotation3, _oProperty$annotation4, _oProperty$annotation5, _oTargetMapping$const6, _oProperty$annotation6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oTargetMapping$const7, _annotations3, _annotations3$Common;
2348
+ var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oTargetMapping$const6, _oProperty$annotation10, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oTargetMapping$const7, _annotations3, _annotations3$Common;
2245
2349
 
2246
2350
  propertyTypeConfig.constraints = {
2247
2351
  scale: (_oTargetMapping$const = oTargetMapping.constraints) !== null && _oTargetMapping$const !== void 0 && _oTargetMapping$const.$Scale ? oProperty.scale : undefined,
2248
2352
  precision: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Precision ? oProperty.precision : undefined,
2249
2353
  maxLength: (_oTargetMapping$const3 = oTargetMapping.constraints) !== null && _oTargetMapping$const3 !== void 0 && _oTargetMapping$const3.$MaxLength ? oProperty.maxLength : undefined,
2250
2354
  nullable: (_oTargetMapping$const4 = oTargetMapping.constraints) !== null && _oTargetMapping$const4 !== void 0 && _oTargetMapping$const4.$Nullable ? oProperty.nullable : undefined,
2251
- minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation2 = oProperty.annotations) === null || _oProperty$annotation2 === void 0 ? void 0 : (_oProperty$annotation3 = _oProperty$annotation2.Validation) === null || _oProperty$annotation3 === void 0 ? void 0 : _oProperty$annotation3.Minimum) ? "".concat((_oProperty$annotation4 = oProperty.annotations) === null || _oProperty$annotation4 === void 0 ? void 0 : (_oProperty$annotation5 = _oProperty$annotation4.Validation) === null || _oProperty$annotation5 === void 0 ? void 0 : _oProperty$annotation5.Minimum) : undefined,
2252
- maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation6 = oProperty.annotations) === null || _oProperty$annotation6 === void 0 ? void 0 : (_oProperty$annotation7 = _oProperty$annotation6.Validation) === null || _oProperty$annotation7 === void 0 ? void 0 : _oProperty$annotation7.Maximum) ? "".concat((_oProperty$annotation8 = oProperty.annotations) === null || _oProperty$annotation8 === void 0 ? void 0 : (_oProperty$annotation9 = _oProperty$annotation8.Validation) === null || _oProperty$annotation9 === void 0 ? void 0 : _oProperty$annotation9.Maximum) : undefined,
2355
+ minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation6 = oProperty.annotations) === null || _oProperty$annotation6 === void 0 ? void 0 : (_oProperty$annotation7 = _oProperty$annotation6.Validation) === null || _oProperty$annotation7 === void 0 ? void 0 : _oProperty$annotation7.Minimum) ? "".concat((_oProperty$annotation8 = oProperty.annotations) === null || _oProperty$annotation8 === void 0 ? void 0 : (_oProperty$annotation9 = _oProperty$annotation8.Validation) === null || _oProperty$annotation9 === void 0 ? void 0 : _oProperty$annotation9.Minimum) : undefined,
2356
+ maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation10 = oProperty.annotations) === null || _oProperty$annotation10 === void 0 ? void 0 : (_oProperty$annotation11 = _oProperty$annotation10.Validation) === null || _oProperty$annotation11 === void 0 ? void 0 : _oProperty$annotation11.Maximum) ? "".concat((_oProperty$annotation12 = oProperty.annotations) === null || _oProperty$annotation12 === void 0 ? void 0 : (_oProperty$annotation13 = _oProperty$annotation12.Validation) === null || _oProperty$annotation13 === void 0 ? void 0 : _oProperty$annotation13.Maximum) : undefined,
2253
2357
  isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations3 = oProperty.annotations) !== null && _annotations3 !== void 0 && (_annotations3$Common = _annotations3.Common) !== null && _annotations3$Common !== void 0 && _annotations3$Common.IsDigitSequence ? true : undefined
2254
2358
  };
2255
2359
  }
@@ -2265,4 +2369,4 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
2265
2369
  _exports.getTypeConfig = getTypeConfig;
2266
2370
  return _exports;
2267
2371
  }, false);
2268
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImhvcml6b250YWxBbGlnbiIsImZvcm1hdE9wdGlvbnMiLCJnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJmaW5kQ29sdW1uRnJvbVBhdGgiLCJwYXRoIiwiZmluZCIsImNvbHVtbiIsImFubm90YXRpb25Db2x1bW4iLCJwcm9wZXJ0eUluZm9zIiwidW5kZWZpbmVkIiwicmVsYXRpdmVQYXRoIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiZm9yRWFjaCIsIm9Db2x1bW4iLCJvVGFibGVDb2x1bW4iLCJ1bml0IiwiYWRkIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJtUmF3RGVmaW5pdGlvbnMiLCJhbm5vdGF0aW9uIiwib0FnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsIm9Qcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwib0N0eERlZlByb3BlcnR5IiwidmFsdWUiLCJtUmVzdWx0IiwiYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJoYXMiLCJpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eSIsImRlZmF1bHRBZ2dyZWdhdGUiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUiLCJwdXNoIiwibGVuZ3RoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsInR5cGUiLCJhZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJlbmFibGVBbmFseXRpY3MiLCJhZ2dyZWdhdGVzIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJpbmRleE9mIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImZpbmRDb2x1bW5CeVBhdGgiLCJvUHJvcCIsInNVbml0IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5Iiwib1VuaXRDb2x1bW4iLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJDb21tb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJlbmFibGVEYXRhU3RhdGVGaWx0ZXIiLCJnZXRUZW1wbGF0ZVR5cGUiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiRGV0ZXJtaW5pbmciLCJhY3Rpb25UYXJnZXQiLCJBY3Rpb25UYXJnZXQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwicGFyYW1ldGVycyIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldEV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEJpbmRpbmdFeHBGcm9tQ29udGV4dCIsInNvdXJjZSIsInNFeHByZXNzaW9uIiwidmlzaWJsZSIsInNQYXRoIiwic3Vic3RyaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic05hdmlnYXRpb25QYXRoIiwidGFyZ2V0T2JqZWN0IiwiX3R5cGUiLCJwYXJ0bmVyIiwiYmluZGluZ0V4cHJlc3Npb24iLCJzbGljZSIsImNvbnN0YW50IiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsInNvbWUiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsIm1hbmlmZXN0QWN0aW9ucyIsImFjdGlvbktleSIsImFjdGlvbiIsInJlcXVpcmVzU2VsZWN0aW9uIiwidG9TdHJpbmciLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1VwZGF0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzQ29uc3RhbnQiLCJnZXRTZWxlY3Rpb25Nb2RlIiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiaXNEZWxldGVCdXR0b25WaXNpYmxlIiwiU2VsZWN0aW9uTW9kZSIsIk5vbmUiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiVGVtcGxhdGVUeXBlIiwiT2JqZWN0UGFnZSIsImNvbXBpbGVCaW5kaW5nIiwiaWZFbHNlIiwiQXV0byIsIk11bHRpIiwiYW5kIiwib3IiLCJjb25jYXQiLCJ0YWJsZUFjdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwibm90IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsIkRlZmF1bHQiLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJJbmZvcm1hdGlvbiIsImZvcm1hdFJlc3VsdCIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibmF2aWdhdGlvbiIsImNyZWF0ZSIsImRldGFpbCIsImlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsIm5ld0FjdGlvbiIsInRhcmdldEFubm90YXRpb25zIiwiZ2V0RW50aXR5U2V0IiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJhcHBlbmQiLCJjcmVhdGVBdEVuZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJOZXdQYWdlIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJwcmVzc1Byb3BlcnR5IiwibmF2aWdhdGlvblRhcmdldCIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJkaXNwbGF5IiwidGFyZ2V0IiwiQ3JpdGljYWxpdHkiLCJEcmFmdE5vZGUiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJyb3dOYXZpZ2F0ZWQiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsInNlbWFudGljS2V5cyIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJfZ2V0RXhwb3J0RGF0YVR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJvVHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsIm9Gb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaW5wdXRGb3JtYXQiLCJzY2FsZSIsImRlbGltaXRlciIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJpc0dyb3VwYWJsZSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJBbm5vdGF0aW9uIiwibGFiZWwiLCJfZ2V0TGFiZWwiLCJncm91cExhYmVsIiwiZ3JvdXAiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXQiLCIkdGFyZ2V0Iiwic29ydGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJ0eXBlQ29uZmlnIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwic1Rvb2x0aXAiLCJfZ2V0VG9vbHRpcCIsInRvb2x0aXAiLCJfaXNWYWxpZENvbHVtbiIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInJldHVybkV4cHJlc3Npb24iLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJOb2RlTGV2ZWwiLCJleHByZXNzaW9uIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRGb3JtYXRPcHRpb25zIiwiYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImlzUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZENvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsIm9Db2x1bW5zIiwiYUNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsImlzU29ydGFibGUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJpc0FycmF5IiwiZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJiU2VtYW50aWNLZXlGb3VuZCIsImFTZW1hbnRpY0tleVZhbHVlcyIsImkiLCJoYXNEcmFmdEluZGljYXRvciIsInNlbWFudGlja2V5cyIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImxpbmVJdGVtIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJzTGFiZWwiLCJpc0ZpZWxkR3JvdXBDb2x1bW4iLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJ2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwid2lkdGhPdmVycmlkZSIsIkZFIiwiU2l0dWF0aW9ucyIsIkZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImV4cG9ydENvbnRhY3RQcm9wZXJ0eSIsImV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5IiwiX2dldFByb3BlcnR5TmFtZXMiLCJtYXRjaGVkUHJvcGVydGllcyIsInJlc29sdmVQYXRoIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJpc0Fubm90YXRpb25Db2x1bW4iLCJpbnRlcm5hbENvbHVtbnMiLCJtYW5pZmVzdENvbHVtbiIsInZhbGlkYXRlS2V5IiwiTWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJpZCIsImhlYWRlciIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiU2xvdCIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc0FjdGlvbk5hdmlnYWJsZSIsImZpZWxkTGFiZWwiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJhUGVyc29uYWxpemF0aW9uIiwiYkFuYWx5dGljYWxUYWJsZSIsInBlcnNvbmFsaXphdGlvbiIsInNvcnQiLCJmaWx0ZXIiLCJhZ2dyZWdhdGUiLCJWYXJpYW50TWFuYWdlbWVudFR5cGUiLCJDb250cm9sIiwiZ2V0U29ydENvbmRpdGlvbnMiLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJzb3J0Q29uZGl0aW9ucyIsIlNvcnRPcmRlciIsInNvcnRlcnMiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwicGF0aHMiLCJpbmZvTmFtZXMiLCJjdXJyZW50UGF0aCIsIkdyb3VwQnkiLCJhR3JvdXBCeSIsImFHcm91cExldmVscyIsImdyb3VwTGV2ZWxzIiwiVG90YWwiLCJhVG90YWxzIiwidGl0bGUiLCJUeXBlTmFtZVBsdXJhbCIsImVudGl0eVNldCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJUYWJsZUlEIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImNyZWF0aW9uQmVoYXZpb3VyIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJwYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uUGFzdGUiLCJtYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwiZW50aXR5TmFtZSIsImNvbGxlY3Rpb24iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwibmF2aWdhdGlvblBhdGgiLCJyb3ciLCJzdGFuZGFyZEFjdGlvbnMiLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsIkxpc3RSZXBvcnQiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJoYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwic2VhcmNoYWJsZSIsImlzQ29tcGxleFByb3BlcnR5IiwiZXhwb3J0RGF0YVR5cGUiLCJ0ZW1wbGF0ZVR5cGUiLCJzdWJzdHIiLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInNlbGVjdGlvbiIsInByb3BlcnR5TmFtZXMiLCJTZWxlY3RPcHRpb25zIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwiUHJvcGVydHlQYXRoIiwidGV4dCIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwicXVpY2tTZWxlY3Rpb25WYXJpYW50IiwicXVpY2tGaWx0ZXJQYXRocyIsImVuYWJsZUV4cG9ydCIsImZpbHRlcnMiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJoaWRlVGFibGVUaXRsZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJzZWxlY3Rpb25MaW1pdCIsIm11bHRpU2VsZWN0TW9kZSIsImVuYWJsZUF1dG9Db2x1bW5XaWR0aCIsImlzUGhvbmUiLCJlbmFibGVQYXN0ZSIsImlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50IiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwicXVpY2tGaWx0ZXJzIiwic2hvd0NvdW50cyIsImlzRGVza3RvcCIsIklzc3VlVHlwZSIsIkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsImhlYWRlclZpc2libGUiLCJ1c2VDb25kZW5zZWRUYWJsZUxheW91dCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwiZW5hYmxlTWFzc0VkaXQiLCJvVGFyZ2V0TWFwcGluZyIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwi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a0MsZ0NBQWxDLE9BQXdFLENBRHhFLEdBRUcsS0FGSCxHQUdHL0MsU0FMOEI7QUFNbEMrakIsTUFBQUEsV0FBVyxFQUNWLENBQUFsUixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHNDQUFBQSxrQkFBa0IsQ0FBRXJRLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsNkJBQWxDLE9BQXFFLENBQXJFLElBQ0EsQ0FBQThQLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFclEsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyxnQ0FBbEMsT0FBd0UsQ0FEeEUsR0FFRyxFQUZILEdBR0cvQyxTQVY4QjtBQVdsQ2drQixNQUFBQSxxQkFBcUIsRUFBRW5SLGtCQUFrQixDQUFDclEsSUFBbkIsS0FBNEIsZ0NBQTVCLEdBQStELElBQS9ELEdBQXNFeEM7QUFYM0QsS0FBbkM7QUFhQSxXQUFPNlMsa0JBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEVudW1WYWx1ZSxcblx0TGluZUl0ZW0sXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5LCBUeXBlRGVmaW5pdGlvbiB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdEN1c3RvbUFjdGlvbixcblx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdCxcblx0aXNBY3Rpb25OYXZpZ2FibGUsXG5cdHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZFR5cGVzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlLCBJc3N1ZUNhdGVnb3J5VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5cbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGlzUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZSwgRURNX1RZUEVfTUFQUElORywgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IEZpbHRlckZ1bmN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCxcblx0U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlLFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uUGFzdGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCxcblx0Z2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmdcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGF1dG9CaW5kT25Jbml0OiBib29sZWFuO1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IHN0cmluZztcblx0cm93Pzoge1xuXHRcdGFjdGlvbj86IHN0cmluZztcblx0XHRwcmVzcz86IHN0cmluZztcblx0XHRyb3dIaWdobGlnaHRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHRyb3dOYXZpZ2F0ZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZT47XG5cdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGJvb2xlYW47XG5cdH07XG5cdGRpc3BsYXlNb2RlPzogYm9vbGVhbjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdGVudGl0eU5hbWU6IHN0cmluZztcblx0c29ydENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGdyb3VwQ29uZGl0aW9ucz86IHN0cmluZztcblx0YWdncmVnYXRlQ29uZGl0aW9ucz86IHN0cmluZztcblxuXHQvKiogQ3JlYXRlIG5ldyBlbnRyaWVzICovXG5cdGNyZWF0ZTogQ3JlYXRlQmVoYXZpb3VyIHwgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWw7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYXBwIChkZWZhdWx0IGNhc2UpXG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogQm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiIHwgXCJSZXNwb25zaXZlVGFibGVcIiB8IFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cbmVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlXG5cdEFubm90YXRpb24gPSBcIkFubm90YXRpb25cIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmV4cG9ydCB0eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0aWQ6IHN0cmluZztcblx0d2lkdGg/OiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb20sXG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRzZW1hbnRpY09iamVjdFBhdGg/OiBzdHJpbmc7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0Y2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG5cdHNvcnRhYmxlOiBib29sZWFuO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0b29sdGlwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHRleHBvcnRTZXR0aW5ncz86IHtcblx0XHR0ZW1wbGF0ZT86IHN0cmluZztcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRmaWVsZExhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0aW5wdXRGb3JtYXQ/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdHNjYWxlPzogbnVtYmVyO1xuXHRcdGRlbGltaXRlcj86IGJvb2xlYW47XG5cdFx0dHJ1ZVZhbHVlPzogYm9vbGVhbjtcblx0XHRmYWxzZVZhbHVlPzogYm9vbGVhbjtcblx0fTtcblx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk/OiBib29sZWFuO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGV4cG9ydENvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0dmlzdWFsU2V0dGluZ3M/OiBWaXN1YWxTZXR0aW5ncztcblx0dHlwZUNvbmZpZz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFZpc3VhbFNldHRpbmdzID0ge1xuXHR3aWR0aENhbGN1bGF0aW9uPzogV2lkdGhDYWxjdWxhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdpZHRoQ2FsY3VsYXRpb24gPSBudWxsIHwge1xuXHRtaW5XaWR0aD86IG51bWJlcjtcblx0bWF4V2lkdGg/OiBudW1iZXI7XG5cdGRlZmF1bHRXaWR0aD86IG51bWJlcjtcblx0aW5jbHVkZUxhYmVsPzogYm9vbGVhbjtcblx0Z2FwPzogbnVtYmVyO1xuXHQvLyBvbmx5IHJlbGV2YW50IGZvciBjb21wbGV4IHR5cGVzXG5cdGV4Y2x1ZGVQcm9wZXJ0aWVzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cdHZlcnRpY2FsQXJyYW5nZW1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21UYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj47XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZURhdGEgPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGU6IHtcblx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH07XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUFuYWx5dGljc1NlYXJjaD86IGJvb2xlYW47XG5cdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcbn07XG5cbnR5cGUgU29ydGVyVHlwZSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRkZXNjZW5kaW5nOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhbm5vdGF0aW9uLWJhc2VkIGFuZCBtYW5pZmVzdC1iYXNlZCB0YWJsZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7QmFzZUFjdGlvbn0gVGhlIGNvbXBsZXRlIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgYVRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGFBbm5vdGF0aW9uQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMudGFibGVBY3Rpb25zO1xuXHRjb25zdCBhSGlkZGVuQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMuaGlkZGVuVGFibGVBY3Rpb25zO1xuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoXG5cdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdGFIaWRkZW5BY3Rpb25zXG5cdFx0KSxcblx0XHR7XG5cdFx0XHRpc05hdmlnYWJsZTogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZU9uU2VsZWN0OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZWQ6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IFwib3ZlcndyaXRlXCJcblx0XHR9XG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0IGJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zLFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQ29sdW1ucywgbWFuaWZlc3RDb2x1bW5zLCB7XG5cdFx0d2lkdGg6IFwib3ZlcndyaXRlXCIsXG5cdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0YXZhaWxhYmlsaXR5OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGhvcml6b250YWxBbGlnbjogXCJvdmVyd3JpdGVcIixcblx0XHRmb3JtYXRPcHRpb25zOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjdXN0b20gYWdncmVnYXRpb24gZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gZmluZENvbHVtbkZyb21QYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2gob0NvbHVtbiA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQob1Byb3BlcnR5ID0+IHtcblx0XHRcdHJldHVybiBvUHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cblx0XHRpZiAob0FnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdG1SYXdEZWZpbml0aW9uc1tvQWdncmVnYXRlZFByb3BlcnR5Lm5hbWVdID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcblx0XHRcdFx0PyBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5tYXAob0N0eERlZlByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gbVJhd0RlZmluaXRpb25zW29UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdO1xuXG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZSBhbmQgZHVtbXkgY3JlYXRlZCBwcm9wZXJ0eSBmb3IgZGF0YXBvaW50IHRhcmdldCBWYWx1ZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJlxuXHRcdFx0XHQhbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXMob1RhYmxlQ29sdW1uLm5hbWUpICYmXG5cdFx0XHRcdCFvVGFibGVDb2x1bW4uaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHlcblx0XHRcdCkge1xuXHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXSA9IHtcblx0XHRcdFx0XHRkZWZhdWx0QWdncmVnYXRlOiB7fSxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmZvckVhY2goY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQ29sdW1uID0gZmluZENvbHVtbkZyb21QYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0aWYgKG9Db2x1bW4pIHtcblx0XHRcdFx0XHRcdGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLnB1c2gob0NvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXS5kZWZhdWx0QWdncmVnYXRlLmNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG1SZXN1bHQ7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uIChpZiBhbnkpXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0dGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlc1xuKSB7XG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRlc0RlZmluaXRpb25zID0gZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCk7XG5cblx0XHRpZiAoYWdncmVnYXRlc0RlZmluaXRpb25zKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hZ2dyZWdhdGVzID0gYWdncmVnYXRlc0RlZmluaXRpb25zO1xuXG5cdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzU2VhcmNoID0gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA/IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMuaW5kZXhPZihcInNlYXJjaFwiKSA+PSAwIDogdHJ1ZTtcblxuXHRcdFx0Ly8gQWRkIGdyb3VwIGFuZCBzb3J0IGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uYWdncmVnYXRlQ29uZGl0aW9ucyA9IGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1uc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID0gXCJHcmlkVGFibGVcIjsgLy8gQW5hbHl0aWNhbFRhYmxlIGlzbid0IGEgcmVhbCB0eXBlIGZvciB0aGUgTURDOlRhYmxlLCBzbyB3ZSBhbHdheXMgc3dpdGNoIGJhY2sgdG8gR3JpZFxuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYXZpZ2F0aW9uIHRhcmdldCBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoIHRvIGNoZWNrIGluIHRoZSBtYW5pZmVzdCBzZXR0aW5nc1xuICogQHJldHVybnMgTmF2aWdhdGlvbiBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBuYXZDb25maWdGb3JDb250ZXh0UGF0aCA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihjb250ZXh0UGF0aCk7XG5cdGlmIChuYXZDb25maWdGb3JDb250ZXh0UGF0aCAmJiBPYmplY3Qua2V5cyhuYXZDb25maWdGb3JDb250ZXh0UGF0aCkubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBjb250ZXh0UGF0aDtcblx0fVxuXG5cdHJldHVybiBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldCA/IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWUgOiBkYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnIGFuZCAndGV4dEFycmFuZ2VtZW50JyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHtcblx0ZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKG9Qcm9wID0+IG9Qcm9wLm5hbWUgPT09IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBzVW5pdCA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSk/Lm5hbWUgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpPy5uYW1lO1xuXHRcdFx0XHRpZiAoc1VuaXQpIHtcblx0XHRcdFx0XHRjb25zdCBvVW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoc1VuaXQpO1xuXG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnVuaXQgPSBvVW5pdENvbHVtbj8ubmFtZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHR0ZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHRleHRBbm5vdGF0aW9uKSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgpO1xuXHRcdFx0XHRcdGlmIChvVGV4dENvbHVtbiAmJiBvVGV4dENvbHVtbi5uYW1lICE9PSBvVGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5OiBvVGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ/OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdFx0Y29sdW1ucyxcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0XHQpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyhnZXRUYWJsZUFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKSksXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSwgY29sdW1ucyk7XG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0XHRvVmlzdWFsaXphdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSh7fSwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIFtdLCBbXSwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZy50eXBlKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcsIGNvbHVtbnMpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogW10sXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKG9WaXN1YWxpemF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGxpbmUgaXRlbVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRjb25zdCBhZGRUb01hcCA9IGZ1bmN0aW9uKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKGtleSkge1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nO1xuXHRcdFx0XHRpZiAoYWN0aW9uTmFtZT8uaW5kZXhPZihcIi9cIikgPCAwICYmICFkYXRhRmllbGQuRGV0ZXJtaW5pbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb25UYXJnZXQgPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0O1xuXHRcdFx0XHRcdGlmIChhY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdC8vIEFubm90YXRpb24gZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggbnVsbCAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsYXRlZClcblx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIG51bGwpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0RXhwcmVzc2lvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpXG5cdFx0XHRcdFx0XHRcdCkgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz47XG5cblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFeHByZXNzaW9uPy5wYXRoKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaChkYXRhRmllbGQgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRcdGlzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0bGV0IHNFeHByZXNzaW9uOiBhbnkgfCB1bmRlZmluZWQ7XG5cdGlmIChcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cblx0KSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHR9IGVsc2Uge1xuXHRcdHNFeHByZXNzaW9uID0gKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlO1xuXHR9XG5cdGxldCBzUGF0aDogc3RyaW5nO1xuXHRpZiAoc0V4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0c1BhdGggPSBzRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoc1BhdGgpIHtcblx0XHRpZiAoKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlKSB7XG5cdFx0XHRzUGF0aCA9IHNQYXRoLnN1YnN0cmluZygxLCBzUGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFTcGxpdFBhdGhbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBzTmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYVNwbGl0UGF0aC5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gcHJvcGVydHksIGlmIGl0J3MgYW4gZW50aXR5U2V0LCB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGhhcyB0byBiZSByZXR1cm5lZDpcblx0XHR9IGVsc2UgaWYgKGlzRW50aXR5U2V0KSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oc1BhdGgpO1xuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgY2Fubm90IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlIGV2YWx1YXRpb246XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kIGNoZWNrXG4gKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciAoYW5kIHJlcXVpcmVzIGEgY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKGRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoYWN0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goYWN0aW9uS2V5ID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblxuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbn0gVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGlzRGVsZXRlQnV0dG9uVmlzaWJsZT86IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuTm9uZTtcblx0fVxuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRsZXQgc2VsZWN0aW9uTW9kZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy5zZWxlY3Rpb25Nb2RlO1xuXHRsZXQgYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW10sXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRmYWxzZVxuXHQpO1xuXHRsZXQgaXNQYXJlbnREZWxldGFibGUsIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHVuZGVmaW5lZCk7XG5cdFx0cGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID0gaXNQYXJlbnREZWxldGFibGUgPyBjb21waWxlQmluZGluZyhpc1BhcmVudERlbGV0YWJsZSwgdHJ1ZSkgOiBpc1BhcmVudERlbGV0YWJsZTtcblx0fVxuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgaXNEZWxldGVCdXR0b25WaXNpYmxlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmIGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJiBpc0RlbGV0ZUJ1dHRvblZpc2libGUpIHtcblx0XHRpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRhbmQoZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSwgaXNEZWxldGVCdXR0b25WaXNpYmxlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGlzRGVsZXRlQnV0dG9uVmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLCBjb25zdGFudChcIk5vbmVcIikpKTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0fSBlbHNlIGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxCYXNlQWN0aW9uLCBCYXNlQWN0aW9uPn0gVGhlIHRhYmxlIGFubm90YXRpb24gYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0Y29uc3QgdGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0Y29uc3QgaGlkZGVuVGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGxldCB0YWJsZUFjdGlvbjogQW5ub3RhdGlvbkFjdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQpICYmXG5cdFx0XHRcdCEoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuSW5saW5lICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuRGV0ZXJtaW5pbmdcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0aGlkZGVuVGFibGVBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmICh0YWJsZUFjdGlvbikge1xuXHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0YWJsZUFjdGlvbnM6IHRhYmxlQWN0aW9ucyxcblx0XHRoaWRkZW5UYWJsZUFjdGlvbnM6IGhpZGRlblRhYmxlQWN0aW9uc1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRjcml0aWNhbGl0eUFubm90YXRpb246IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+IHwgRW51bVZhbHVlPENyaXRpY2FsaXR5VHlwZT4gfCB1bmRlZmluZWQsXG5cdGlzRHJhZnRSb290OiBib29sZWFuLFxuXHR0YXJnZXRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpZkVsc2UoXG5cdFx0aXNEcmFmdFJvb3QgJiYgRHJhZnQuSXNOZXdPYmplY3QsXG5cdFx0TWVzc2FnZVR5cGUuSW5mb3JtYXRpb24gYXMgTWVzc2FnZVR5cGUsXG5cdFx0Zm9ybWF0UmVzdWx0KFxuXHRcdFx0W2RlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLCBiaW5kaW5nRXhwcmVzc2lvbihgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0dGFibGVGb3JtYXR0ZXJzLnJvd0hpZ2hsaWdodGluZyxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpXG5cdCk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbltcImNyZWF0ZVwiXSB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSB8fCBuYXZpZ2F0aW9uU2V0dGluZ3M/LmRldGFpbDtcblxuXHQvLyBjcm9zcy1hcHBcblx0aWYgKGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncykgJiYgbmF2aWdhdGlvbikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCBhcyBzdHJpbmcsXG5cdFx0XHRvdXRib3VuZERldGFpbDogbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5nczogbmF2aWdhdGlvblNldHRpbmdzXG5cdFx0fTtcblx0fVxuXG5cdGxldCBuZXdBY3Rpb247XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHQvLyBpbi1hcHBcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdG5ld0FjdGlvbiA9IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247IC8vIFRPRE86IElzIHRoZXJlIHJlYWxseSBubyAnTmV3QWN0aW9uJyBvbiBEcmFmdE5vZGU/IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZT8uTmV3QWN0aW9uXG5cblx0XHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbmV3QWN0aW9uKSB7XG5cdFx0XHQvLyBBIGNvbWJpbmF0aW9uIG9mICdDcmVhdGlvblJvdycgYW5kICdOZXdBY3Rpb24nIGRvZXMgbm90IG1ha2Ugc2Vuc2Vcblx0XHRcdC8vIFRPRE86IE9yIGRvZXMgaXQ/XG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb24/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uLnJvdXRlIDogdW5kZWZpbmVkIC8vIG5hdmlnYXRlIG9ubHkgaW4gTmV3UGFnZSBtb2RlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuXG5jb25zdCBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XCIuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKCAkY29udHJvbGxlciAsJ1wiICsgbmF2aWdhdGlvblRhcmdldCArIFwiJywgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0pXCI7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksXG5cdFx0XHRcdFx0ISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCAhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlLFxuXHRcdFx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0XCJBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LCB7IGNhbGxFeHRlbnNpb246IHRydWUsIHRhcmdldFBhdGg6ICdcIiArXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCArXG5cdFx0XHRcdFx0XCInLCBlZGl0YWJsZSA6IFwiICtcblx0XHRcdFx0XHQodGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGVcblx0XHRcdFx0XHRcdD8gXCIhJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0uZ2V0UHJvcGVydHkoJ0lzQWN0aXZlRW50aXR5JylcIlxuXHRcdFx0XHRcdFx0OiBcInVuZGVmaW5lZFwiKSArXG5cdFx0XHRcdFx0XCJ9KVwiOyAvL05lZWQgdG8gYWNjZXNzIHRvIERyYWZ0Um9vdCBhbmQgRHJhZnROb2RlICEhISEhISFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LCBmYWxzZSwgdGFyZ2V0RW50aXR5VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W2JpbmRpbmdFeHByZXNzaW9uKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUJpbmRpbmcoY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlQmluZGluZyhyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKVxuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24gc29ydGFibGUgY29sdW1uIG5hbWVzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbihcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZVxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCB0YWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdFx0XSlbMF07XG5cdFx0XHRjb25zdCBvQ29sdW1uRHJhZnRJbmRpY2F0b3IgPSBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oY29sdW1uSW5mby5uYW1lLCBzZW1hbnRpY0tleXMpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGFibGVDb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXNcbiAqIEBwYXJhbSB7QWdncmVnYXRpb25IZWxwZXJ9IGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbn0gVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGl2ZVBhdGg7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRUeXBlOiBzdHJpbmcgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgPyBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9UeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBleHBvcnRTZXR0aW5ncyA9IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdHRlbXBsYXRlOiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KVxuXHRcdCAgfVxuXHRcdDoge1xuXHRcdFx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogc0RhdGVJbnB1dEZvcm1hdCxcblx0XHRcdFx0c2NhbGU6IHByb3BlcnR5LnNjYWxlLFxuXHRcdFx0XHRkZWxpbWl0ZXI6IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJZZXNcIiA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZmFsc2VWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJOb1wiIDogdW5kZWZpbmVkXG5cdFx0ICB9O1xuXG5cdGNvbnN0IG9Db2x1bW46IGFueSA9IHtcblx0XHRrZXk6IGtleSxcblx0XHRpc0dyb3VwYWJsZTogIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5ICYmICFpc0hpZGRlbiA/IGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpIDogZmFsc2UsXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHksXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5OiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdHZpc3VhbFNldHRpbmdzOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9IDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpO1xuXHRpZiAoc1Rvb2x0aXApIHtcblx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0fVxuXG5cdHJldHVybiBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0Ly8gIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBEYXRhRmllbGQgQWJzdHJhY3QgdHlwZTogXCIgKyBkYXRhRmllbGQuJFR5cGUpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBhIERhdGFGaWVsZCBvciBEYXRhUG9pbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBTQVAgRmlvcmkgZWxlbWVudHMgd2lsbCBldmFsdWF0ZSBlaXRoZXIgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGRlZmluZWQgb24gdGhlIGFubm90YXRpb24gaXRzZWxmIG9yIG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcGFyYW0ge0ZpZWxkRm9ybWF0T3B0aW9uc30gW2Zvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVybkV4cHJlc3Npb25dIFJldHVybkV4cHJlc3Npb24gb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gQW4gZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gYmluZCB0byB0aGUgVUkuXG4gKi9cbmV4cG9ydCBjb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbihcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXRPcHRpb25zPzogYW55LFxuXHRyZXR1cm5FeHByZXNzaW9uPzogQm9vbGVhblxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRjb25zdCBleHByZXNzaW9uID0gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKCEhcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSwgdHJ1ZSksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xuXHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbiA/IChleHByZXNzaW9uIGFzIEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4pIDogY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmaWVsZEZvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24oXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IGFueVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0YUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCB0cnVlKVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRpZkVsc2Uob3IoLi4uKGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSlcblx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgcHJvcGVydHkgYW5kIGRhdGFGaWVsZC5cbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5fSBbcHJvcGVydHldIFByb3BlcnR5IG9yIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGlzR3JvdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9IExhYmVsIG9mIHRoZSBwcm9wZXJ0eSBvciBEYXRhRmllbGRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRMYWJlbCA9IGZ1bmN0aW9uKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKClcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFByb3BlcnR5Pn0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc29ydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24oXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaChuYW1lID0+IHtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSxcblx0XHRcdGFubm90YXRpb25QYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG5hbWUpLFxuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgcmVsYXRlZCBjb2x1bW4gYWxyZWFkeSBleGlzdHMuXG5cdFx0XHRyZWxhdGVkQ29sdW1uID0gZXhpc3RpbmdDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goXG5cdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8XG5cdFx0XHQocmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zICYmIHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcy5pbmRleE9mKG5hbWUpICE9PSAtMSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtbiBhbmRcblx0XHRcdC8vIGJvdGggY2FzZXMgcmVxdWlyZSBhIGR1bW15IFByb3BlcnR5SW5mbyBmb3Igc2V0dGluZyBjb3JyZWN0IGV4cG9ydCBzZXR0aW5ncy5cblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IFwiUHJvcGVydHk6OlwiICsgbmFtZTtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuXHRcdGNvbHVtbi5wcm9wZXJ0eUluZm9zID0gY29sdW1uLnByb3BlcnR5SW5mb3M/Lm1hcChwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHRwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3Qgb0NvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBhQ29sdW1uS2V5cyA9IG9Db2x1bW5zICYmIE9iamVjdC5rZXlzKG9Db2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRhQ29sdW1uS2V5cyAmJlxuXHRcdCEhYUNvbHVtbktleXMuZmluZChmdW5jdGlvbihrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgb0NvbHVtbnNba2V5XS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblxuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgbm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRpZiAobm9uU29ydGFibGVDb2x1bW5zLmluZGV4T2YocHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHQvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRcdGlzU29ydGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdFx0Ly8gQWN0aW9uIGNvbHVtbnMgYXJlIG5vdCBzb3J0YWJsZVxuXHRcdFx0XHRpc1NvcnRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaXNTb3J0YWJsZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpOiBGb3JtYXRPcHRpb25zVHlwZSB7XG5cdHJldHVybiB7XG5cdFx0dGV4dExpbmVzRWRpdDogNFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZTogc3RyaW5nLCBzZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdGlmIChiU2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNlbWFudGlja2V5czogYVNlbWFudGljS2V5VmFsdWVzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB3aXRoIHRoZWlyIGFubm90YXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ29sdW1uW119IFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2gobGluZUl0ZW0gPT4ge1xuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihsaW5lSXRlbSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9XG5cdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMobGluZUl0ZW0pICYmIGxpbmVJdGVtLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBsaW5lSXRlbSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IF9nZXRSZWxhdGl2ZVBhdGgobGluZUl0ZW0pO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShsaW5lSXRlbSwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyA9IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gX2dldExhYmVsKGxpbmVJdGVtLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEdyb3VwQ29sdW1uOiBib29sZWFuID0gZ3JvdXBQYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFwiKSA+IC0xO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGxpbmVJdGVtKTtcblx0XHRcdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cylcblx0XHRcdH07XG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRsaW5lSXRlbS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRsaW5lSXRlbS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMobGluZUl0ZW0sIGZvcm1hdE9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzV3JhcHBpbmcsXG5cdFx0XHRcdHR5cGU6IGRhdGFUeXBlID8gX2dldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAxKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0aW5wdXRGb3JtYXQ6IHNEYXRlSW5wdXRGb3JtYXQsXG5cdFx0XHRcdGRlbGltaXRlcjogZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogZGF0YVR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiWWVzXCIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZhbHNlVmFsdWU6IGRhdGFUeXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIk5vXCIgOiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBkYXRhVHlwZSAmJiBnZXRUeXBlQ29uZmlnKGxpbmVJdGVtLCBkYXRhVHlwZSk7XG5cdFx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IHByb3BlcnR5VHlwZUNvbmZpZ1xuXHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUsXG5cdFx0XHRcdFx0XHRvRm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHQuLi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9Db25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0XHRcdCAgfVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGxldCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8udmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24gd2l0aCBkaXNwbGF5IG1vZGUgYXMgdGV4dCBvbmx5LCBleGNsdWRlIHRleHQgcHJvcGVydHkgZnJvbSB0aGUgd2lkdGggY2FsY3VsYXRpb25cblx0XHRcdFx0dmlzdWFsU2V0dGluZ3MgPSB7XG5cdFx0XHRcdFx0d2lkdGhDYWxjdWxhdGlvbjoge1xuXHRcdFx0XHRcdFx0ZXhjbHVkZVByb3BlcnRpZXM6IFwiUHJvcGVydHk6OlwiICsgcmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICghZGF0YVR5cGUgfHwgIW9UeXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRPRE86IEZvciBzaXR1YXRpb24gUE9DIC0gaW5jcmVhc2Ugd2lkdGggb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciAtIHdvcmtzIGZvciB0aGUgc2l0dWF0aW9ucyBkZW1vIGFwcCBvbmx5IVxuXHRcdFx0Ly8gTWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gbW92ZSB0aGUgY29tcGxldGUgY29sdW1uIHdpZHRoIGRldGVybWluYXRpb24gdG8gdGhlIGNvbnZlcnRlciwgdGhhdCB3b3VsZCBhbGxvdyB1cyB0byB3aWRlbiB0aGUgY29sdW1ucyBhcyBuZWVkZWQuIFRoaXMgd29ya2Fyb3VuZCBvbmx5IGRlYWxzIHdpdGggRGF0ZSBjb2x1bW5zLlxuXHRcdFx0Y29uc3QgeyBoYXNEcmFmdEluZGljYXRvciB9ID0gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cyk7XG5cdFx0XHRjb25zdCB3aWR0aE92ZXJyaWRlID1cblx0XHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmFubm90YXRpb25zIGFzIGFueSkuRkU/LlNpdHVhdGlvbnMgJiZcblx0XHRcdFx0aGFzRHJhZnRJbmRpY2F0b3IgJiZcblx0XHRcdFx0bGluZUl0ZW0uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCAmJlxuXHRcdFx0XHRsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0LnR5cGUgPT09IFwiRWRtLkRhdGVcIlxuXHRcdFx0XHRcdD8gXCIxMWVtXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3Qgb0NvbHVtbjogYW55ID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQobGluZUl0ZW0pLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwobGluZUl0ZW0pIDogbnVsbCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiBudWxsLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChsaW5lSXRlbS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogaXNEYXRhRmllbGRBbHdheXNIaWRkZW4obGluZUl0ZW0pID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogX2lzQ29sdW1uU29ydGFibGUobGluZUl0ZW0sIHJlbGF0aXZlUGF0aCwgbm9uU29ydGFibGVDb2x1bW5zKSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiBsaW5lSXRlbS5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aCB8fCB3aWR0aE92ZXJyaWRlIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3Ncblx0XHRcdH07XG5cdFx0XHRjb25zdCBzVG9vbHRpcCA9IF9nZXRUb29sdGlwKGxpbmVJdGVtKTtcblx0XHRcdGlmIChzVG9vbHRpcCkge1xuXHRcdFx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbik7XG5cblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0bGV0IHRhYmxlQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGVcblx0KTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChhbm5vdGF0aW9uQ29sdW1ucyk7XG5cblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKGNvbHVtbnNUb0JlQ3JlYXRlZCwgdGFibGVDb2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24ocHJvcGVydGllczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdC5tYXAocHJvcGVydHkgPT4ge1xuXHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdH0pXG5cdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB0YWJsZSBjb2x1bW4gcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIE1hbmlmZXN0IGRlZmluZWQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSAvIGFubm90YXRpb24gY29sdW1uc1xuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIGNvbHVtbiBpZiBub3Qgb3ZlcndyaXR0ZW4gaW4gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHByb3BlcnR5IFRoZSBjb2x1bW4gcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQW5ub3RhdGlvbkNvbHVtbiBXaGV0aGVyIHRoZSBjb2x1bW4sIGRlZmluZWQgaW4gbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gY29sdW1uLlxuICogQHJldHVybnMge2FueX0gRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbHVtblxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBpc0Fubm90YXRpb25Db2x1bW46IGJvb2xlYW4pOiBhbnkge1xuXHRpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIElmIGFubm90YXRpb24gY29sdW1uIGhhcyBubyBwcm9wZXJ0eSBkZWZpbmVkIGluIG1hbmlmZXN0LFxuXHRcdC8vIGRvIG5vdCBvdmVyd3JpdGUgaXQgd2l0aCBtYW5pZmVzdCBjb2x1bW4ncyBkZWZhdWx0IHZhbHVlLlxuXHRcdHJldHVybiBpc0Fubm90YXRpb25Db2x1bW4gPyB1bmRlZmluZWQgOiBkZWZhdWx0VmFsdWU7XG5cdH1cblx0Ly8gUmV0dXJuIHdoYXQgaXMgZGVmaW5lZCBpbiBtYW5pZmVzdC5cblx0cmV0dXJuIHByb3BlcnR5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tQ29sdW1uPn0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRlbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRpZiAoIW1hbmlmZXN0Q29sdW1uPy50ZW1wbGF0ZSAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gXCJUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJ1wiICsga2V5ICsgXCInIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZFwiO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRcdG5hbWU6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0aGVhZGVyOiBtYW5pZmVzdENvbHVtbi5oZWFkZXIsXG5cdFx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLCBpc0Fubm90YXRpb25Db2x1bW4pLFxuXHRcdFx0XHR0eXBlOiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBcIlNsb3RcIiA/IENvbHVtblR5cGUuU2xvdCA6IENvbHVtblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSB8fCBcInVuZGVmaW5lZFwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHQuLi5tYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiB7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHByb3BlcnR5SW5mb3MgPyBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcykgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZmllbGRMYWJlbDogcHJvcGVydHlJbmZvcyA/IG1hbmlmZXN0Q29sdW1uLmhlYWRlciA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR3cmFwOiBwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IGFQZXJzb25hbGl6YXRpb246IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGJBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbjogYW55ID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0cmV0dXJuIGJBbmFseXRpY2FsVGFibGUgPyBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cCxBZ2dyZWdhdGVcIiA6IFwiU29ydCxDb2x1bW4sRmlsdGVyXCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcGVyc29uYWxpemF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBTcGVjaWZpYyBwZXJzb25hbGl6YXRpb24gb3B0aW9ucyBlbmFibGVkIGluIG1hbmlmZXN0LiBVc2UgdGhlbSBhcyBpcy5cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uc29ydCkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5maWx0ZXIpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5ncm91cCAmJiBiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVBlcnNvbmFsaXphdGlvbi5sZW5ndGggPiAwID8gYVBlcnNvbmFsaXphdGlvbi5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCkge1xuXHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXHRcdGlmIChiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc29ydCBjb25kaXRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBUYWJsZSBjb2x1bW5zIHByb2Nlc3NlZCBieSB0aGUgY29udmVydGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3J0IGNvbmRpdGlvbnMgZm9yIGEgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRDb25kaXRpb25zKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRsZXQgc29ydENvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRjb25zdCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb25kaXRpb25zID0ge1xuXHRcdFx0c29ydGVyczogc29ydGVyc1xuXHRcdH07XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uU29ydE9yZGVyLmZvckVhY2goY29uZGl0aW9uID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblByb3BlcnR5ID0gY29uZGl0aW9uLlByb3BlcnR5O1xuXHRcdFx0aWYgKGNvbmRpdGlvblByb3BlcnR5ICYmIG5vblNvcnRhYmxlUHJvcGVydGllcy5pbmRleE9mKGNvbmRpdGlvblByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdGNvbmRpdGlvbnMuc29ydGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IGluZm9OYW1lLFxuXHRcdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c29ydENvbmRpdGlvbnMgPSBjb25kaXRpb25zLnNvcnRlcnMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucykgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHNvcnRDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKlxuICogQHBhcmFtIHBhdGhzIHRoZSBhcnJheSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBjb2x1bW5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eUluZm9zXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXNcbiAqL1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwYXRocy5mb3JFYWNoKGN1cnJlbnRQYXRoID0+IHtcblx0XHRpZiAoY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdFx0cmV0dXJuICFhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBpbmZvTmFtZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgZ3JvdXAgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGdyb3VwQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRjb25zdCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnkgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0Y29uc3QgYUdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKGluZm9OYW1lID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cblx0XHRncm91cENvbmRpdGlvbnMgPSBhR3JvdXBMZXZlbHMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoeyBncm91cExldmVsczogYUdyb3VwTGV2ZWxzIH0pIDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBncm91cENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgYWdncmVnYXRlIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgYWdncmVnYXRlQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlRvdGFsKSB7XG5cdFx0Y29uc3QgYVRvdGFscyA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlRvdGFsIGFzIFByb3BlcnR5UGF0aFtdO1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gPSB7fTtcblx0XHRjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKGFUb3RhbHMsIGNvbHVtbnMpLmZvckVhY2goaW5mb05hbWUgPT4ge1xuXHRcdFx0YWdncmVnYXRlc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblxuXHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShhZ2dyZWdhdGVzKTtcblx0fVxuXG5cdHJldHVybiBhZ2dyZWdhdGVDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGl0bGU6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZVBsdXJhbDtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5U2V0O1xuXHRjb25zdCBwYWdlTWFuaWZlc3RTZXR0aW5nczogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgaGFzQWJzb2x1dGVQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAsXG5cdFx0cDEzbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiksXG5cdFx0aWQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gVGFibGVJRCh2aXN1YWxpemF0aW9uUGF0aCkgOiBUYWJsZUlEKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSwgXCJMaW5lSXRlbVwiKTtcblx0Y29uc3QgdGFyZ2V0Q2FwYWJpbGl0aWVzID0gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0KTtcblx0Y29uc3QgaXNEZWxldGVCdXR0b25WaXNpYmxlID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRpc0RlbGV0ZUJ1dHRvblZpc2libGVcblx0KTtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpIGFzIG51bWJlcjtcblx0fVxuXG5cdGNvbnN0IGNyZWF0aW9uQmVoYXZpb3VyID0gX2dldENyZWF0aW9uQmVoYXZpb3VyKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgdGFibGVBY3Rpb25zID0ge1xuXHRcdGNyZWF0ZTogZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0XCJkZWxldGVcIjogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0bWFzc0VkaXQ6IGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgc2VsZWN0aW9uTW9kZSlcblx0fTtcblx0Y29uc3QgaXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZUFjdGlvbnMuY3JlYXRlLnZpc2libGUgPT09IFwiZmFsc2VcIlxuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0UGF0aFxuXHRcdCksXG5cdFx0cDEzbk1vZGU6IHAxM25Nb2RlLFxuXHRcdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdFx0YWN0aW9uczogdGFibGVBY3Rpb25zLFxuXHRcdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkXG5cdFx0fSxcblx0XHRkaXNwbGF5TW9kZTogaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQsIHZpZXdDb25maWd1cmF0aW9uKSxcblx0XHRjcmVhdGU6IGNyZWF0aW9uQmVoYXZpb3VyLFxuXHRcdHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUsXG5cdFx0YXV0b0JpbmRPbkluaXQ6XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSAmJlxuXHRcdFx0ISh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGU6IHN0cmluZywgaXNDb21wbGV4UHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZTogc3RyaW5nID0gXCJTdHJpbmdcIjtcblx0aWYgKGlzQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2goUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dDogYm9vbGVhbiA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0bGV0IHF1aWNrU2VsZWN0aW9uVmFyaWFudDogYW55O1xuXHRjb25zdCBxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdID0gW107XG5cdGxldCBlbmFibGVFeHBvcnQgPSB0cnVlO1xuXHRsZXQgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGxldCBmaWx0ZXJzO1xuXHRsZXQgY3JlYXRlQXRFbmQgPSB0cnVlO1xuXHRsZXQgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9IGZhbHNlO1xuXHRsZXQgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRsZXQgY29uZGVuc2VkVGFibGVMYXlvdXQgPSBmYWxzZTtcblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGxldCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdGxldCBzZWxlY3Rpb25MaW1pdCA9IDIwMDtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTtcblx0Y29uc3QgZW5hYmxlQXV0b0NvbHVtbldpZHRoID0gIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRjb25zdCBlbmFibGVQYXN0ZSA9XG5cdFx0dGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSAhPT0gdW5kZWZpbmVkID8gdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSA6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiOyAvLyBQYXN0ZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGV4Y2VwdGVkIGZvciBPUFxuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0XHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdFx0cXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gdGFyZ2V0RW50aXR5VHlwZS5yZXNvbHZlUGF0aChcIkBcIiArIHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Ly8gcXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0cXVpY2tGaWx0ZXJQYXRocy5wdXNoKHsgYW5ub3RhdGlvblBhdGg6IHBhdGguYW5ub3RhdGlvblBhdGggfSk7XG5cdFx0XHR9XG5cdFx0XHRmaWx0ZXJzID0ge1xuXHRcdFx0XHRxdWlja0ZpbHRlcnM6IHtcblx0XHRcdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0XHRcdFx0PyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIlxuXHRcdFx0XHRcdFx0XHQ6IHRydWUsXG5cdFx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncz8ucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5zaG93Q291bnRzLFxuXHRcdFx0XHRcdHBhdGhzOiBxdWlja0ZpbHRlclBhdGhzXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0Y3JlYXRpb25Nb2RlID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgfHwgY3JlYXRpb25Nb2RlO1xuXHRcdGNyZWF0ZUF0RW5kID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgOiB0cnVlO1xuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9ICFjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPyAhIXRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIDogZmFsc2U7XG5cdFx0Y29uZGVuc2VkVGFibGVMYXlvdXQgPSB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0ICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0IDogZmFsc2U7XG5cdFx0aGlkZVRhYmxlVGl0bGUgPSAhIXRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5oaWRlVGFibGVUaXRsZTtcblx0XHR0YWJsZVR5cGUgPSB0YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiKSB7XG5cdFx0XHRpZiAodGFibGVTZXR0aW5ncz8udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHR0YWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0YWJsZVNldHRpbmdzPy50eXBlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzRGVza3RvcCgpICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdFx0XHR0YWJsZVR5cGUgPSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRcdGlmIChcblx0XHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKSAmJlxuXHRcdFx0ZW5hYmxlRnVsbFNjcmVlbiAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHQpIHtcblx0XHRcdGVuYWJsZUZ1bGxTY3JlZW4gPSBmYWxzZTtcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHRcdH1cblx0XHRzZWxlY3Rpb25MaW1pdCA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSB0cnVlIHx8IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDA7XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHQpIHtcblx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gISF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiRGVmYXVsdFwiIDogXCJDbGVhckFsbFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICEhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkRlZmF1bHRcIiA6IFwiQ2xlYXJBbGxcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbmFibGVFeHBvcnQgPVxuXHRcdFx0dGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIgfHwgZW5hYmxlUGFzdGU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBlbmFibGVGdWxsU2NyZWVuLFxuXHRcdGhlYWRlclZpc2libGU6ICEocXVpY2tTZWxlY3Rpb25WYXJpYW50ICYmIGhpZGVUYWJsZVRpdGxlKSxcblx0XHRlbmFibGVFeHBvcnQ6IGVuYWJsZUV4cG9ydCxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRjcmVhdGVBdEVuZDogY3JlYXRlQXRFbmQsXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRzZWxlY3Rpb25MaW1pdDogc2VsZWN0aW9uTGltaXQsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBtdWx0aVNlbGVjdE1vZGUsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHRlbmFibGVNYXNzRWRpdDogdGFibGVTZXR0aW5ncz8uZW5hYmxlTWFzc0VkaXQsXG5cdFx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBlbmFibGVBdXRvQ29sdW1uV2lkdGhcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSAmJiAob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5fdHlwZSA9PT0gXCJUeXBlRGVmaW5pdGlvblwiKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWygob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlIGFzIFR5cGVEZWZpbml0aW9uKS51bmRlcmx5aW5nVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdChvUHJvcGVydHkgYXMgUHJvcGVydHkpLmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0fTtcblx0fVxuXHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRwYXJzZUFzU3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRlbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuIl19
2372
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImhvcml6b250YWxBbGlnbiIsImZvcm1hdE9wdGlvbnMiLCJnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJmaW5kQ29sdW1uRnJvbVBhdGgiLCJwYXRoIiwiZmluZCIsImNvbHVtbiIsImFubm90YXRpb25Db2x1bW4iLCJwcm9wZXJ0eUluZm9zIiwidW5kZWZpbmVkIiwicmVsYXRpdmVQYXRoIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiZm9yRWFjaCIsIm9Db2x1bW4iLCJvVGFibGVDb2x1bW4iLCJ1bml0IiwiYWRkIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJtUmF3RGVmaW5pdGlvbnMiLCJhbm5vdGF0aW9uIiwib0FnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsIm9Qcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwib0N0eERlZlByb3BlcnR5IiwidmFsdWUiLCJtUmVzdWx0IiwiYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJoYXMiLCJpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eSIsImRlZmF1bHRBZ2dyZWdhdGUiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUiLCJwdXNoIiwibGVuZ3RoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsInR5cGUiLCJhZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJlbmFibGVBbmFseXRpY3MiLCJhZ2dyZWdhdGVzIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJpbmRleE9mIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImZpbmRDb2x1bW5CeVBhdGgiLCJvUHJvcCIsIm9Vbml0IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5Iiwib1VuaXRDb2x1bW4iLCJzVW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJDb21tb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiRGV0ZXJtaW5pbmciLCJhY3Rpb25UYXJnZXQiLCJBY3Rpb25UYXJnZXQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwicGFyYW1ldGVycyIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldEV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aCIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsInVwZGF0YWJsZSIsImlzVXBkYXRhYmxlIiwiaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImV4cHJlc3Npb24iLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGgiLCJDYXBhYmlsaXRpZXMiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEJpbmRpbmdFeHBGcm9tQ29udGV4dCIsInNvdXJjZSIsInNFeHByZXNzaW9uIiwidmlzaWJsZSIsInNQYXRoIiwic3Vic3RyaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic05hdmlnYXRpb25QYXRoIiwidGFyZ2V0T2JqZWN0IiwiX3R5cGUiLCJwYXJ0bmVyIiwiYmluZGluZ0V4cHJlc3Npb24iLCJzbGljZSIsImNvbnN0YW50IiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsInNvbWUiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsIm1hbmlmZXN0QWN0aW9ucyIsImFjdGlvbktleSIsImFjdGlvbiIsInJlcXVpcmVzU2VsZWN0aW9uIiwidG9TdHJpbmciLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1BhdGhVcGRhdGFibGUiLCJnZXRTZWxlY3Rpb25Nb2RlIiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uIiwiU2VsZWN0aW9uTW9kZSIsIk5vbmUiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiT2JqZWN0UGFnZSIsImNvbXBpbGVCaW5kaW5nIiwiYk1hc3NFZGl0RW5hYmxlZCIsImlmRWxzZSIsImFuZCIsIk11bHRpIiwiQXV0byIsIlNpbmdsZSIsImJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwib3IiLCJlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiY29uY2F0IiwidGFibGVBY3Rpb24iLCJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiQWN0aW9uVHlwZSIsIkRhdGFGaWVsZEZvckFjdGlvbiIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsIm5vdCIsImdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24iLCJEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJEZWZhdWx0IiwiZ2V0SGlnaGxpZ2h0Um93QmluZGluZyIsImNyaXRpY2FsaXR5QW5ub3RhdGlvbiIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5VHlwZSIsImRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uIiwiTWVzc2FnZVR5cGUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJhTWlzc2luZ0tleXMiLCJmb3JtYXRSZXN1bHQiLCJFbnRpdHkiLCJIYXNBY3RpdmUiLCJJc0FjdGl2ZSIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibmF2aWdhdGlvbiIsImNyZWF0ZSIsImRldGFpbCIsImlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsIm5ld0FjdGlvbiIsInRhcmdldEFubm90YXRpb25zIiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJhcHBlbmQiLCJjcmVhdGVBdEVuZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJOZXdQYWdlIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJwcmVzc1Byb3BlcnR5IiwibmF2aWdhdGlvblRhcmdldCIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJkaXNwbGF5IiwidGFyZ2V0IiwiQ3JpdGljYWxpdHkiLCJEcmFmdE5vZGUiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJyb3dOYXZpZ2F0ZWQiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsInNlbWFudGljS2V5cyIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJfZ2V0RXhwb3J0RGF0YVR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJvVHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsIm9Gb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaW5wdXRGb3JtYXQiLCJzY2FsZSIsImRlbGltaXRlciIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJpc0dyb3VwYWJsZSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJBbm5vdGF0aW9uIiwibGFiZWwiLCJfZ2V0TGFiZWwiLCJncm91cExhYmVsIiwiZ3JvdXAiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXQiLCIkdGFyZ2V0Iiwic29ydGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJ0eXBlQ29uZmlnIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwic1Rvb2x0aXAiLCJfZ2V0VG9vbHRpcCIsInRvb2x0aXAiLCJfaXNWYWxpZENvbHVtbiIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInJldHVybkV4cHJlc3Npb24iLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJOb2RlTGV2ZWwiLCJfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiZGF0YUZpZWxkR3JvdXAiLCJmaWVsZEZvcm1hdE9wdGlvbnMiLCJhRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiaXNQcm9wZXJ0eSIsImRhdGFGaWVsZERlZmF1bHQiLCJMYWJlbCIsImlzRGF0YUZpZWxkVHlwZXMiLCJRdWlja0luZm8iLCJkYXRhcG9pbnRUYXJnZXQiLCJfY3JlYXRlUmVsYXRlZENvbHVtbnMiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwicmVsYXRlZENvbHVtbiIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCIsImZpZWxkR3JvdXBOYW1lIiwib0NvbHVtbnMiLCJhQ29sdW1uS2V5cyIsInNob3dEYXRhRmllbGRzTGFiZWwiLCJfZ2V0UmVsYXRpdmVQYXRoIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwiaXNTb3J0YWJsZSIsImZpbHRlckZ1bmN0aW9ucyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsImlzQXJyYXkiLCJnZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsImJTZW1hbnRpY0tleUZvdW5kIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiaSIsImhhc0RyYWZ0SW5kaWNhdG9yIiwic2VtYW50aWNrZXlzIiwiZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zIiwibGluZUl0ZW0iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsInNMYWJlbCIsImlzRmllbGRHcm91cENvbHVtbiIsImZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsInZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkIiwiZXhjbHVkZVByb3BlcnRpZXMiLCJ3aWR0aE92ZXJyaWRlIiwiRkUiLCJTaXR1YXRpb25zIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJIVE1MNSIsIkNzc0RlZmF1bHRzIiwiZXhwb3J0Q29udGFjdFByb3BlcnR5IiwiZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHkiLCJfZ2V0UHJvcGVydHlOYW1lcyIsIm1hdGNoZWRQcm9wZXJ0aWVzIiwicmVzb2x2ZVBhdGgiLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImlzQW5ub3RhdGlvbkNvbHVtbiIsImludGVybmFsQ29sdW1ucyIsIm1hbmlmZXN0Q29sdW1uIiwidmFsaWRhdGVLZXkiLCJNZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImlkIiwiaGVhZGVyIiwiSG9yaXpvbnRhbEFsaWduIiwiQmVnaW4iLCJTbG90IiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsImlzQWN0aW9uTmF2aWdhYmxlIiwiZmllbGRMYWJlbCIsImdldFAxM25Nb2RlIiwidmFyaWFudE1hbmFnZW1lbnQiLCJnZXRWYXJpYW50TWFuYWdlbWVudCIsImFQZXJzb25hbGl6YXRpb24iLCJiQW5hbHl0aWNhbFRhYmxlIiwicGVyc29uYWxpemF0aW9uIiwic29ydCIsImZpbHRlciIsImFnZ3JlZ2F0ZSIsIlZhcmlhbnRNYW5hZ2VtZW50VHlwZSIsIkNvbnRyb2wiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJpc0ZpbHRlckJhckhpZGRlbiIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJnZXRTb3J0Q29uZGl0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsInNvcnRDb25kaXRpb25zIiwiU29ydE9yZGVyIiwic29ydGVycyIsImNvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJjb25kaXRpb25Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiaW5mb05hbWUiLCJjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzIiwiZGVzY2VuZGluZyIsIkRlc2NlbmRpbmciLCJwYXRocyIsImluZm9OYW1lcyIsImN1cnJlbnRQYXRoIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwiYUdyb3VwTGV2ZWxzIiwiZ3JvdXBMZXZlbHMiLCJUb3RhbCIsImFUb3RhbHMiLCJ0aXRsZSIsIlR5cGVOYW1lUGx1cmFsIiwicGFnZU1hbmlmZXN0U2V0dGluZ3MiLCJoYXNBYnNvbHV0ZVBhdGgiLCJwMTNuTW9kZSIsIlRhYmxlSUQiLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiZ2V0RGVsZXRlVmlzaWJpbGl0eSIsImNyZWF0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwiZ2V0Q3JlYXRlVmlzaWJpbGl0eSIsIm1hc3NFZGl0QnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJnZXRNYXNzRWRpdFZpc2liaWxpdHkiLCJpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwidGhyZXNob2xkIiwiTWF4SXRlbXMiLCJjcmVhdGlvbkJlaGF2aW91ciIsImlzU2VhcmNoYWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJzdGFuZGFyZEFjdGlvbnMiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwicGFzdGUiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwibWFzc0VkaXQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwiZW50aXR5TmFtZSIsImNvbGxlY3Rpb24iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwibmF2aWdhdGlvblBhdGgiLCJyb3ciLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsIkxpc3RSZXBvcnQiLCJzZWFyY2hhYmxlIiwiaXNDb21wbGV4UHJvcGVydHkiLCJleHBvcnREYXRhVHlwZSIsInN1YnN0ciIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic2VsZWN0aW9uVmFyaWFudFBhdGgiLCJyZXNvbHZlZFRhcmdldCIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwic2VsZWN0aW9uIiwicHJvcGVydHlOYW1lcyIsIlNlbGVjdE9wdGlvbnMiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJQcm9wZXJ0eVBhdGgiLCJ0ZXh0IiwiX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlIiwiaXNJcGhvbmUiLCJlbmFibGVGdWxsU2NyZWVuIiwiSXNzdWVUeXBlIiwiRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQiLCJfZ2V0TXVsdGlTZWxlY3RNb2RlIiwibXVsdGlTZWxlY3RNb2RlIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsIl9nZXRUYWJsZVR5cGUiLCJpc0Rlc2t0b3AiLCJfZ2V0RmlsdGVycyIsInF1aWNrRmlsdGVyUGF0aHMiLCJxdWlja1NlbGVjdGlvblZhcmlhbnQiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwiX2dldEVuYWJsZUV4cG9ydCIsImVuYWJsZVBhc3RlIiwiZW5hYmxlRXhwb3J0IiwiX2dldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJmaWx0ZXJzIiwiaGlkZVRhYmxlVGl0bGUiLCJoZWFkZXJWaXNpYmxlIiwiY2hlY2tDb25kZW5zZWRMYXlvdXQiLCJlbmFibGVBdXRvQ29sdW1uV2lkdGgiLCJpc1Bob25lIiwiZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyIiwiaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQiLCJvRmlsdGVyQ29uZmlndXJhdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImNvbmRlbnNlZFRhYmxlTGF5b3V0Iiwib0NvbmZpZ3VyYXRpb24iLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlTWFzc0VkaXQiLCJzZWxlY3Rpb25MaW1pdCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwidXNlQ29uZGVuc2VkVGFibGVMYXlvdXQiLCJvVGFyZ2V0TWFwcGluZyIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF1TktBLFU7O2FBQUFBLFU7QUFBQUEs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QTFCLENBQWtDLDZCQUFsQyxPQUFxRSxDQUFyRSxJQUNBLENBQUFvUixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHNDQUFBQSxrQkFBa0IsQ0FBRTNSLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsZ0NBQWxDLE9BQXdFLENBRHhFLEdBRUcsS0FGSCxHQUdHL0MsU0FMOEI7QUFNbENpbUIsTUFBQUEsV0FBVyxFQUNWLENBQUE5UixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHNDQUFBQSxrQkFBa0IsQ0FBRTNSLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsNkJBQWxDLE9BQXFFLENBQXJFLElBQ0EsQ0FBQW9SLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFM1IsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyxnQ0FBbEMsT0FBd0UsQ0FEeEUsR0FFRyxFQUZILEdBR0cvQyxTQVY4QjtBQVdsQ2ttQixNQUFBQSxxQkFBcUIsRUFBRS9SLGtCQUFrQixDQUFDM1IsSUFBbkIsS0FBNEIsZ0NBQTVCLEdBQStELElBQS9ELEdBQXNFeEM7QUFYM0QsS0FBbkM7QUFhQSxXQUFPbVUsa0JBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEVudW1WYWx1ZSxcblx0TGluZUl0ZW0sXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5LCBUeXBlRGVmaW5pdGlvbiB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdEN1c3RvbUFjdGlvbixcblx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdCxcblx0aXNBY3Rpb25OYXZpZ2FibGUsXG5cdHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZFR5cGVzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBFbnRpdHksIGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhEZWxldGFibGUsXG5cdGlzUGF0aFNlYXJjaGFibGUsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSwgSXNzdWVDYXRlZ29yeVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuXG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCIuLi8uLi9NYW5pZmVzdFdyYXBwZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi8uLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQge1xuXHRpc1Byb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0aXNQYXRoRXhwcmVzc2lvbixcblx0Z2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgRGlzcGxheU1vZGUsIEVETV9UWVBFX01BUFBJTkcsIGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSB9IGZyb20gXCIuL0NyaXRpY2FsaXR5XCI7XG5pbXBvcnQgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgeyBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9FbnRpdHlTZXRIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQsXG5cdFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSxcblx0Z2V0RGVsZXRlVmlzaWJpbGl0eSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvblBhc3RlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0LFxuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQsXG5cdGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nLFxuXHRnZXRDcmVhdGVWaXNpYmlsaXR5LFxuXHRpc0luRGlzcGxheU1vZGUsXG5cdGdldE1hc3NFZGl0VmlzaWJpbGl0eSxcblx0Z2V0UmVzdHJpY3Rpb25zXG59IGZyb20gXCIuL3RhYmxlL1N0YW5kYXJkQWN0aW9uc1wiO1xuXG5leHBvcnQgdHlwZSBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uID0ge1xuXHRhdXRvQmluZE9uSW5pdDogYm9vbGVhbjtcblx0Y29sbGVjdGlvbjogc3RyaW5nO1xuXHR2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlO1xuXHRmaWx0ZXJJZD86IHN0cmluZztcblx0aWQ6IHN0cmluZztcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZztcblx0cDEzbk1vZGU/OiBzdHJpbmc7XG5cdHJvdz86IHtcblx0XHRhY3Rpb24/OiBzdHJpbmc7XG5cdFx0cHJlc3M/OiBzdHJpbmc7XG5cdFx0cm93SGlnaGxpZ2h0aW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT47XG5cdFx0cm93TmF2aWdhdGVkOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0c2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGU+O1xuXHRcdGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkOiBib29sZWFuO1xuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHR9O1xuXHRkaXNwbGF5TW9kZT86IGJvb2xlYW47XG5cdHRocmVzaG9sZDogbnVtYmVyO1xuXHRlbnRpdHlOYW1lOiBzdHJpbmc7XG5cdHNvcnRDb25kaXRpb25zPzogc3RyaW5nO1xuXHRncm91cENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGFnZ3JlZ2F0ZUNvbmRpdGlvbnM/OiBzdHJpbmc7XG5cblx0LyoqIENyZWF0ZSBuZXcgZW50cmllcyAqL1xuXHRjcmVhdGU6IENyZWF0ZUJlaGF2aW91ciB8IENyZWF0ZUJlaGF2aW91ckV4dGVybmFsO1xuXHR0aXRsZTogc3RyaW5nO1xuXHRzZWFyY2hhYmxlOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFwcCAoZGVmYXVsdCBjYXNlKVxuICovXG50eXBlIENyZWF0ZUJlaGF2aW91ciA9IHtcblx0bW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRhcHBlbmQ6IEJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHN0cmluZztcblx0bmF2aWdhdGVUb1RhcmdldD86IHN0cmluZztcbn07XG5cbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgYnkgbmF2aWdhdGluZyB0byBzb21lIHRhcmdldFxuICovXG50eXBlIENyZWF0ZUJlaGF2aW91ckV4dGVybmFsID0ge1xuXHRtb2RlOiBcIkV4dGVybmFsXCI7XG5cdG91dGJvdW5kOiBzdHJpbmc7XG5cdG91dGJvdW5kRGV0YWlsOiBOYXZpZ2F0aW9uVGFyZ2V0Q29uZmlndXJhdGlvbltcIm91dGJvdW5kRGV0YWlsXCJdO1xuXHRuYXZpZ2F0aW9uU2V0dGluZ3M6IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiA9IHtcblx0aXNEZWxldGFibGU6IGJvb2xlYW47XG5cdGlzVXBkYXRhYmxlOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbiA9IHtcblx0ZW5hYmxlZD86IHN0cmluZyB8IGJvb2xlYW47XG5cdHBhdGhzOiBbXG5cdFx0e1xuXHRcdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHR9XG5cdF07XG5cdHNob3dDb3VudHM/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24gPSB7XG5cdHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdO1xuXHR0ZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiA9IHtcblx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhOiBib29sZWFuO1xuXHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGJvb2xlYW47XG5cdGVuYWJsZUV4cG9ydDogYm9vbGVhbjtcblx0aGVhZGVyVmlzaWJsZTogYm9vbGVhbjtcblx0ZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIFRhYmxlRmlsdGVyc0NvbmZpZ3VyYXRpb24+O1xuXHR0eXBlOiBUYWJsZVR5cGU7XG5cdHNlbGVjdEFsbD86IGJvb2xlYW47XG5cdHNlbGVjdGlvbkxpbWl0OiBudW1iZXI7XG5cdG11bHRpU2VsZWN0TW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVQYXN0ZTogYm9vbGVhbjtcblx0ZW5hYmxlRnVsbFNjcmVlbjogYm9vbGVhbjtcblx0c2hvd1Jvd0NvdW50OiBib29sZWFuO1xuXHRlbmFibGVNYXNzRWRpdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBib29sZWFuO1xuXHRkYXRhU3RhdGVJbmRpY2F0b3JGaWx0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCIgfCBcIlJlc3BvbnNpdmVUYWJsZVwiIHwgXCJBbmFseXRpY2FsVGFibGVcIjtcblxuZW51bSBDb2x1bW5UeXBlIHtcblx0RGVmYXVsdCA9IFwiRGVmYXVsdFwiLCAvLyBEZWZhdWx0IFR5cGVcblx0QW5ub3RhdGlvbiA9IFwiQW5ub3RhdGlvblwiLFxuXHRTbG90ID0gXCJTbG90XCJcbn1cblxuZXhwb3J0IHR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHRpZDogc3RyaW5nO1xuXHR3aWR0aD86IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSxcblx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRzZXR0aW5ncz86IFRhYmxlQ29sdW1uU2V0dGluZ3M7XG5cdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcblx0Zm9ybWF0T3B0aW9uczogRm9ybWF0T3B0aW9uc1R5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucz86IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz47XG5cdHNob3dEYXRhRmllbGRzTGFiZWw/OiBib29sZWFuO1xuXHRpc0tleT86IGJvb2xlYW47XG5cdHVuaXQ/OiBzdHJpbmc7XG5cdHVuaXRUZXh0Pzogc3RyaW5nO1xuXHRleHBvcnRTZXR0aW5ncz86IHtcblx0XHR0ZW1wbGF0ZT86IHN0cmluZztcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRmaWVsZExhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0aW5wdXRGb3JtYXQ/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdHNjYWxlPzogbnVtYmVyO1xuXHRcdGRlbGltaXRlcj86IGJvb2xlYW47XG5cdFx0dHJ1ZVZhbHVlPzogYm9vbGVhbjtcblx0XHRmYWxzZVZhbHVlPzogYm9vbGVhbjtcblx0fTtcblx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk/OiBib29sZWFuO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGV4cG9ydENvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0dmlzdWFsU2V0dGluZ3M/OiBWaXN1YWxTZXR0aW5ncztcblx0dHlwZUNvbmZpZz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFZpc3VhbFNldHRpbmdzID0ge1xuXHR3aWR0aENhbGN1bGF0aW9uPzogV2lkdGhDYWxjdWxhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdpZHRoQ2FsY3VsYXRpb24gPSBudWxsIHwge1xuXHRtaW5XaWR0aD86IG51bWJlcjtcblx0bWF4V2lkdGg/OiBudW1iZXI7XG5cdGRlZmF1bHRXaWR0aD86IG51bWJlcjtcblx0aW5jbHVkZUxhYmVsPzogYm9vbGVhbjtcblx0Z2FwPzogbnVtYmVyO1xuXHQvLyBvbmx5IHJlbGV2YW50IGZvciBjb21wbGV4IHR5cGVzXG5cdGV4Y2x1ZGVQcm9wZXJ0aWVzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cdHZlcnRpY2FsQXJyYW5nZW1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21UYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj47XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZURhdGEgPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGU6IHtcblx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH07XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUFuYWx5dGljc1NlYXJjaD86IGJvb2xlYW47XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogc3RyaW5nO1xuXHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBzdHJpbmc7XG59O1xuXG50eXBlIFNvcnRlclR5cGUgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0ZGVzY2VuZGluZzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYW5ub3RhdGlvbi1iYXNlZCBhbmQgbWFuaWZlc3QtYmFzZWQgdGFibGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge05hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb259IG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMge0Jhc2VBY3Rpb259IFRoZSBjb21wbGV0ZSB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFjdGlvbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IEJhc2VBY3Rpb25bXSB7XG5cdGNvbnN0IGFUYWJsZUFjdGlvbnMgPSBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBhQW5ub3RhdGlvbkFjdGlvbnMgPSBhVGFibGVBY3Rpb25zLnRhYmxlQWN0aW9ucztcblx0Y29uc3QgYUhpZGRlbkFjdGlvbnMgPSBhVGFibGVBY3Rpb25zLmhpZGRlblRhYmxlQWN0aW9ucztcblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFBbm5vdGF0aW9uQWN0aW9ucyxcblx0XHRnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdGFBbm5vdGF0aW9uQWN0aW9ucyxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHRcdHRydWUsXG5cdFx0XHRhSGlkZGVuQWN0aW9uc1xuXHRcdCksXG5cdFx0e1xuXHRcdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRlbmFibGVPblNlbGVjdDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRlbmFibGVkOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBcIm92ZXJ3cml0ZVwiXG5cdFx0fVxuXHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGNvbHVtbnMsIGFubm90YXRpb24tYmFzZWQgYXMgd2VsbCBhcyBtYW5pZmVzdCBiYXNlZC5cbiAqIFRoZXkgYXJlIHNvcnRlZCBhbmQgc29tZSBwcm9wZXJ0aWVzIGNhbiBiZSBvdmVyd3JpdHRlbiB2aWEgdGhlIG1hbmlmZXN0IChjaGVjayBvdXQgdGhlIGtleXMgdGhhdCBjYW4gYmUgb3ZlcndyaXR0ZW4pLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge05hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb259IG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMge1RhYmxlQ29sdW1uW119IFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBtYW5pZmVzdENvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0KTtcblxuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoYW5ub3RhdGlvbkNvbHVtbnMsIG1hbmlmZXN0Q29sdW1ucywge1xuXHRcdHdpZHRoOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGlzTmF2aWdhYmxlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGF2YWlsYWJpbGl0eTogXCJvdmVyd3JpdGVcIixcblx0XHRzZXR0aW5nczogXCJvdmVyd3JpdGVcIixcblx0XHRob3Jpem9udGFsQWxpZ246IFwib3ZlcndyaXRlXCIsXG5cdFx0Zm9ybWF0T3B0aW9uczogXCJvdmVyd3JpdGVcIlxuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VzdG9tIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgZG9lc24ndCBzdXBwb3J0IGFuYWx5dGljYWwgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGZ1bmN0aW9uIGZpbmRDb2x1bW5Gcm9tUGF0aChwYXRoOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBLZWVwIGEgc2V0IG9mIGFsbCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMsIGFzIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgdGhlbSBhcyBhZ2dyZWdhdGVzXG5cdC8vIFRoZXkgYXJlIGFnZ3JlZ2F0ZXMgZm9yIHRlY2huaWNhbCByZWFzb25zICh0byBtYW5hZ2UgbXVsdGktdW5pdHMgc2l0dWF0aW9ucykgYnV0IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmcm9tIGEgdXNlciBzdGFuZHBvaW50XG5cdGNvbnN0IG1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4udW5pdCkge1xuXHRcdFx0bUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5hZGQob1RhYmxlQ29sdW1uLnVuaXQpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMoKTtcblx0Y29uc3QgbVJhd0RlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuXHRhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMuZm9yRWFjaChhbm5vdGF0aW9uID0+IHtcblx0XHRjb25zdCBvQWdncmVnYXRlZFByb3BlcnR5ID0gYWdncmVnYXRpb25IZWxwZXIuX2VudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKG9Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdH0pO1xuXG5cdFx0aWYgKG9BZ2dyZWdhdGVkUHJvcGVydHkpIHtcblx0XHRcdGNvbnN0IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRtUmF3RGVmaW5pdGlvbnNbb0FnZ3JlZ2F0ZWRQcm9wZXJ0eS5uYW1lXSA9IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzXG5cdFx0XHRcdD8gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubWFwKG9DdHhEZWZQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0N0eERlZlByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogW107XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgbVJlc3VsdDogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT4gPSB7fTtcblxuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaChvQ29sdW1uID0+IHtcblx0XHRjb25zdCBvVGFibGVDb2x1bW4gPSBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAob1RhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyA9IG1SYXdEZWZpbml0aW9uc1tvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoXTtcblxuXHRcdFx0Ly8gSWdub3JlIGFnZ3JlZ2F0ZXMgY29ycmVzcG9uZGluZyB0byBjdXJyZW5jaWVzIG9yIHVuaXRzIG9mIG1lYXN1cmUgYW5kIGR1bW15IGNyZWF0ZWQgcHJvcGVydHkgZm9yIGRhdGFwb2ludCB0YXJnZXQgVmFsdWVcblx0XHRcdGlmIChcblx0XHRcdFx0YVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgJiZcblx0XHRcdFx0IW1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMuaGFzKG9UYWJsZUNvbHVtbi5uYW1lKSAmJlxuXHRcdFx0XHQhb1RhYmxlQ29sdW1uLmlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5XG5cdFx0XHQpIHtcblx0XHRcdFx0bVJlc3VsdFtvVGFibGVDb2x1bW4ubmFtZV0gPSB7XG5cdFx0XHRcdFx0ZGVmYXVsdEFnZ3JlZ2F0ZToge30sXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoOiBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcy5mb3JFYWNoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbHVtbiA9IGZpbmRDb2x1bW5Gcm9tUGF0aChjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdGlmIChvQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5wdXNoKG9Db2x1bW4ubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bVJlc3VsdFtvVGFibGVDb2x1bW4ubmFtZV0uZGVmYXVsdEFnZ3JlZ2F0ZS5jb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBtUmVzdWx0O1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIGEgdGFibGUgdmlzdWFsaXphdGlvbiBmb3IgYW5hbHl0aWNhbCB1c2UgY2FzZXMuXG4gKlxuICogQHBhcmFtIHRhYmxlVmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gVGhlIHByZXNlbnRhdGlvblZhcmlhbnQgYW5ub3RhdGlvbiAoaWYgYW55KVxuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXNcbikge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyA9IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUoZW50aXR5VHlwZSwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdFx0aWYgKGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucykge1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyA9IHRydWU7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYWdncmVnYXRlcyA9IGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucztcblxuXHRcdFx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRjb25zdCBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljc1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluZGV4T2YoXCJzZWFyY2hcIikgPj0gMCA6IHRydWU7XG5cblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9IFwiR3JpZFRhYmxlXCI7IC8vIEFuYWx5dGljYWxUYWJsZSBpc24ndCBhIHJlYWwgdHlwZSBmb3IgdGhlIE1EQzpUYWJsZSwgc28gd2UgYWx3YXlzIHN3aXRjaCBiYWNrIHRvIEdyaWRcblx0fVxufVxuXG4vKipcbiAqIEdldCB0aGUgbmF2aWdhdGlvbiB0YXJnZXQgcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcGF0aCB0byBjaGVjayBpbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3NcbiAqIEByZXR1cm5zIE5hdmlnYXRpb24gcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKi9cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aCAmJiBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblByb3BlcnR5UGF0aCkpIHtcblx0XHRjb25zdCBuYXZDb25maWcgPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKG5hdkNvbmZpZykubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgbmF2Q29uZmlnRm9yQ29udGV4dFBhdGggPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oY29udGV4dFBhdGgpO1xuXHRpZiAobmF2Q29uZmlnRm9yQ29udGV4dFBhdGggJiYgT2JqZWN0LmtleXMobmF2Q29uZmlnRm9yQ29udGV4dFBhdGgpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gY29udGV4dFBhdGg7XG5cdH1cblxuXHRyZXR1cm4gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQgPyBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lIDogZGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JyBhbmQgJ3RleHRBcnJhbmdlbWVudCcgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdKSB7XG5cdGZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nKTogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaChvQ29sdW1uID0+IHtcblx0XHRjb25zdCBvVGFibGVDb2x1bW4gPSBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRpZiAob1RhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBvUHJvcGVydHkgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgob1Byb3A6IFByb3BlcnR5KSA9PiBvUHJvcC5uYW1lID09PSBvVGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGlmIChvUHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgb1VuaXQgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0XHRcdFx0aWYgKG9Vbml0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1VuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKG9Vbml0Lm5hbWUpO1xuXHRcdFx0XHRcdG9UYWJsZUNvbHVtbi51bml0ID0gb1VuaXRDb2x1bW4/Lm5hbWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1VuaXQgPSBvUHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgb1Byb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRcdFx0aWYgKHNVbml0KSB7XG5cdFx0XHRcdFx0XHRvVGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHtzVW5pdH1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHR0ZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHRleHRBbm5vdGF0aW9uKSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgpO1xuXHRcdFx0XHRcdGlmIChvVGV4dENvbHVtbiAmJiBvVGV4dENvbHVtbi5uYW1lICE9PSBvVGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5OiBvVGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ/OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdFx0Y29sdW1ucyxcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0XHQpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyhnZXRUYWJsZUFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKSksXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IEpTT04uc3RyaW5naWZ5KG9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllczogZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXAsIGNvbnZlcnRlckNvbnRleHQpXG5cdH07XG5cblx0dXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MoXG5cdFx0b1Zpc3VhbGl6YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb25cblx0KTtcblxuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZVZpc3VhbGl6YXRpb24ge1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0Q29uZmlnID0gZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odW5kZWZpbmVkLCBcIlwiLCBjb252ZXJ0ZXJDb250ZXh0LCBmYWxzZSk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoe30sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBbXSwgW10sIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcudHlwZSk7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCh1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24odW5kZWZpbmVkLCBcIlwiLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlnLCBjb2x1bW5zKSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IFtdLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbHVtbnMpO1xuXHR1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3Mob1Zpc3VhbGl6YXRpb24sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRyZXR1cm4gb1Zpc3VhbGl6YXRpb247XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIG9mIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzIGZvciBhbGwgRGF0YUZpZWxkRm9yQWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIFRoZSBpbnN0YW5jZSBvZiB0aGUgbGluZSBpdGVtXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gVGhlIHJlY29yZCBjb250YWluaW5nIGFsbCBhY3Rpb24gbmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdGNvbnN0IGFkZFRvTWFwID0gZnVuY3Rpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRpZiAoa2V5KSB7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXBba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0fTtcblxuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goZGF0YUZpZWxkID0+IHtcblx0XHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbikge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZGF0YUZpZWxkLkFjdGlvbiBhcyBzdHJpbmc7XG5cdFx0XHRcdGlmIChhY3Rpb25OYW1lPy5pbmRleE9mKFwiL1wiKSA8IDAgJiYgIWRhdGFGaWVsZC5EZXRlcm1pbmluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvblRhcmdldCA9IGRhdGFGaWVsZC5BY3Rpb25UYXJnZXQ7XG5cdFx0XHRcdFx0aWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCBudWxsIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxhdGVkKVxuXHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgbnVsbCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb25UYXJnZXQ/LnBhcmFtZXRlcnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlckZ1bGxOYW1lID0gYWN0aW9uVGFyZ2V0LnBhcmFtZXRlcnNbMF0uZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHQocGF0aDogc3RyaW5nKSA9PiBiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSlcblx0XHRcdFx0XHRcdFx0KSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248c3RyaW5nPjtcblxuXHRcdFx0XHRcdFx0aWYgKHRhcmdldEV4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbi5wYXRoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0YWRkVG9NYXAoYWN0aW9uTmFtZSwgdGFyZ2V0RXhwcmVzc2lvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xufVxuXG4vKipcbiAqIEdldHMgdXBkYXRhYmxlIHByb3BlcnR5UGF0aCBmb3IgdGhlIGN1cnJlbnQgZW50aXR5c2V0IGlmIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB1cGRhdGFibGUgcHJvcGVydHkgZm9yIHRoZSByb3dzXG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRFbnRpdHlTZXRVcGRhdGFibGVQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCByZXN0cmljdGlvbnMgPSBnZXRSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IHVwZGF0YWJsZSA9IHJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZTtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID0gdXBkYXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KHVwZGF0YWJsZS5leHByZXNzaW9uKTtcblx0Y29uc3QgdXBkYXRhYmxlUHJvcGVydHlQYXRoID0gKGVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5VcGRhdGVSZXN0cmljdGlvbnM/LlVwZGF0YWJsZSBhcyBhbnkpPy5wYXRoO1xuXG5cdHJldHVybiBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5ID8gKHVwZGF0YWJsZVByb3BlcnR5UGF0aCBhcyBzdHJpbmcpIDogXCJcIjtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaChkYXRhRmllbGQgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRcdGlzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0bGV0IHNFeHByZXNzaW9uOiBhbnkgfCB1bmRlZmluZWQ7XG5cdGlmIChcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cblx0KSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHR9IGVsc2Uge1xuXHRcdHNFeHByZXNzaW9uID0gKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlO1xuXHR9XG5cdGxldCBzUGF0aDogc3RyaW5nO1xuXHRpZiAoc0V4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0c1BhdGggPSBzRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoc1BhdGgpIHtcblx0XHRpZiAoKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlKSB7XG5cdFx0XHRzUGF0aCA9IHNQYXRoLnN1YnN0cmluZygxLCBzUGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFTcGxpdFBhdGhbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBzTmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYVNwbGl0UGF0aC5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gcHJvcGVydHksIGlmIGl0J3MgYW4gZW50aXR5U2V0LCB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGhhcyB0byBiZSByZXR1cm5lZDpcblx0XHR9IGVsc2UgaWYgKGlzRW50aXR5U2V0KSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oc1BhdGgpO1xuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgY2Fubm90IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlIGV2YWx1YXRpb246XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kIGNoZWNrXG4gKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciAoYW5kIHJlcXVpcmVzIGEgY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKGRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoYWN0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goYWN0aW9uS2V5ID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblxuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbn0gVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uPzogRXhwcmVzc2lvbjxib29sZWFuPixcblx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHR9XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGxldCBzZWxlY3Rpb25Nb2RlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3M/LnNlbGVjdGlvbk1vZGU7XG5cdGxldCBhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXSxcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0W10sXG5cdFx0dW5kZWZpbmVkLFxuXHRcdGZhbHNlXG5cdCk7XG5cdGxldCBpc1BhcmVudERlbGV0YWJsZSwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UpIHtcblx0XHRpc1BhcmVudERlbGV0YWJsZSA9IGlzUGF0aERlbGV0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgdW5kZWZpbmVkKTtcblx0XHRwYXJlbnRFbnRpdHlTZXREZWxldGFibGUgPSBpc1BhcmVudERlbGV0YWJsZSA/IGNvbXBpbGVCaW5kaW5nKGlzUGFyZW50RGVsZXRhYmxlLCB0cnVlKSA6IGlzUGFyZW50RGVsZXRhYmxlO1xuXHR9XG5cblx0Y29uc3QgYk1hc3NFZGl0RW5hYmxlZDogYm9vbGVhbiA9ICFpc0NvbnN0YW50KG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pIHx8IG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24udmFsdWUgIT09IGZhbHNlO1xuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pIHtcblx0XHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UgJiYgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gTWFzcyBFZGl0IGluIE9QIGlzIGVuYWJsZWQgb25seSBpbiBlZGl0IG1vZGUuXG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSwgbWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoXCJNdWx0aVwiKSxcblx0XHRcdFx0XHRpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk11bHRpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZGVsZXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24sIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXHRpZiAoYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdC8vIE92ZXJyaWRlIGRlZmF1bHQgc2VsZWN0aW9uIG1vZGUgd2hlbiBtYXNzIGVkaXQgaXMgdmlzaWJsZVxuXHRcdHNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA/IFNlbGVjdGlvbk1vZGUuU2luZ2xlIDogU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKFxuXHRcdGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG5cdFx0KGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IGJNYXNzRWRpdEVuYWJsZWQpXG5cdCkge1xuXHRcdGlmICghaXNFbnRpdHlTZXQpIHtcblx0XHRcdC8vIEV4YW1wbGU6IE9QIGNhc2Vcblx0XHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0XHQvLyBCdWlsZGluZyBleHByZXNzaW9uIGZvciBkZWxldGUgYW5kIG1hc3MgZWRpdFxuXHRcdFx0XHRjb25zdCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiA9IG9yKFxuXHRcdFx0XHRcdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIHx8IHRydWUsIC8vIGRlZmF1bHQgZGVsZXRlIHZpc2liaWxpdHkgYXMgdHJ1ZVxuXHRcdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb25cblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdGFuZChlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpLCBidXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIGV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSAmJiBkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHRcdFx0Ly8gRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGFyZSBhY3Rpb25zIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdH0gZWxzZSBpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gVXNlIHNlbGVjdGlvbk1vZGUgaW4gZWRpdCBtb2RlIGlmIGRlbGV0ZSBpcyBlbmFibGVkIG9yIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0XHRjb25zdCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0XHRiTWFzc0VkaXRFbmFibGVkICYmICF0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUsXG5cdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0XHRcdGNvbnN0YW50KHRydWUpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIiksIGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvL0VudGl0eVNldCBkZWxldGFibGU6XG5cdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBFeGFtcGxlOiBMUiBzY2VuYXJpb1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdC8vRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyksIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHRhYmxlIGFjdGlvbnMgZnJvbSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPEJhc2VBY3Rpb24sIEJhc2VBY3Rpb24+fSBUaGUgdGFibGUgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgdmlzdWFsaXphdGlvblBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRjb25zdCBoaWRkZW5UYWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0bGV0IHRhYmxlQWN0aW9uOiBBbm5vdGF0aW9uQWN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZCkgJiZcblx0XHRcdFx0IShkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSkgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5JbmxpbmUgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5EZXRlcm1pbmluZ1xuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGtleSA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCI6XG5cdFx0XHRcdFx0XHR0YWJsZUFjdGlvbiA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRcdGtleToga2V5LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdFx0XHRub3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRoaWRkZW5UYWJsZUFjdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EZWZhdWx0LFxuXHRcdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhYmxlQWN0aW9uKSB7XG5cdFx0XHRcdHRhYmxlQWN0aW9ucy5wdXNoKHRhYmxlQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHRhYmxlQWN0aW9uczogdGFibGVBY3Rpb25zLFxuXHRcdGhpZGRlblRhYmxlQWN0aW9uczogaGlkZGVuVGFibGVBY3Rpb25zXG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdGNyaXRpY2FsaXR5QW5ub3RhdGlvbjogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPENyaXRpY2FsaXR5VHlwZT4gfCBFbnVtVmFsdWU8Q3JpdGljYWxpdHlUeXBlPiB8IHVuZGVmaW5lZCxcblx0aXNEcmFmdFJvb3Q6IGJvb2xlYW4sXG5cdHRhcmdldEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiB7XG5cdGxldCBkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbjogTWVzc2FnZVR5cGUgfCBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGlmIChjcml0aWNhbGl0eUFubm90YXRpb24pIHtcblx0XHRpZiAodHlwZW9mIGNyaXRpY2FsaXR5QW5ub3RhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBhbm5vdGF0aW9uRXhwcmVzc2lvbihjcml0aWNhbGl0eUFubm90YXRpb24pIGFzIEV4cHJlc3Npb248TWVzc2FnZVR5cGU+O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBFbnVtIFZhbHVlIHNvIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgcGFydFxuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoY3JpdGljYWxpdHlBbm5vdGF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBhTWlzc2luZ0tleXM6IGFueVtdID0gW107XG5cdHRhcmdldEVudGl0eVR5cGU/LmtleXMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcblx0XHRpZiAoa2V5Lm5hbWUgIT09IFwiSXNBY3RpdmVFbnRpdHlcIikge1xuXHRcdFx0YU1pc3NpbmdLZXlzLnB1c2goYmluZGluZ0V4cHJlc3Npb24oa2V5Lm5hbWUsIHVuZGVmaW5lZCkpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbixcblx0XHRcdGJpbmRpbmdFeHByZXNzaW9uKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdGlzRHJhZnRSb290ICYmIEVudGl0eS5IYXNBY3RpdmUsXG5cdFx0XHRpc0RyYWZ0Um9vdCAmJiBFbnRpdHkuSXNBY3RpdmUsXG5cdFx0XHRgJHtpc0RyYWZ0Um9vdH1gLFxuXHRcdFx0Li4uYU1pc3NpbmdLZXlzXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cblxuZnVuY3Rpb24gX2dldENyZWF0aW9uQmVoYXZpb3VyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdIHtcblx0Y29uc3QgbmF2aWdhdGlvbiA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlIHx8IG5hdmlnYXRpb25TZXR0aW5ncz8uZGV0YWlsO1xuXG5cdC8vIGNyb3NzLWFwcFxuXHRpZiAoaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQobmF2aWdhdGlvblNldHRpbmdzKSAmJiBuYXZpZ2F0aW9uKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1vZGU6IFwiRXh0ZXJuYWxcIixcblx0XHRcdG91dGJvdW5kOiBuYXZpZ2F0aW9uLm91dGJvdW5kIGFzIHN0cmluZyxcblx0XHRcdG91dGJvdW5kRGV0YWlsOiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzOiBuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0XHR9O1xuXHR9XG5cblx0bGV0IG5ld0FjdGlvbjtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdC8vIGluLWFwcFxuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM7XG5cdFx0bmV3QWN0aW9uID0gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHwgdGFyZ2V0QW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjsgLy8gVE9ETzogSXMgdGhlcmUgcmVhbGx5IG5vICdOZXdBY3Rpb24nIG9uIERyYWZ0Tm9kZT8gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlPy5OZXdBY3Rpb25cblxuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBuZXdBY3Rpb24pIHtcblx0XHRcdC8vIEEgY29tYmluYXRpb24gb2YgJ0NyZWF0aW9uUm93JyBhbmQgJ05ld0FjdGlvbicgZG9lcyBub3QgbWFrZSBzZW5zZVxuXHRcdFx0Ly8gVE9ETzogT3IgZG9lcyBpdD9cblx0XHRcdHRocm93IEVycm9yKGBDcmVhdGlvbiBtb2RlICcke0NyZWF0aW9uTW9kZS5DcmVhdGlvblJvd30nIGNhbiBub3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tICduZXcnIGFjdGlvbiAoJHtuZXdBY3Rpb259KWApO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvbj8ucm91dGUpIHtcblx0XHRcdC8vIHJvdXRlIHNwZWNpZmllZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bW9kZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRhcHBlbmQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKSxcblx0XHRcdFx0bmF2aWdhdGVUb1RhcmdldDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSA/IG5hdmlnYXRpb24ucm91dGUgOiB1bmRlZmluZWQgLy8gbmF2aWdhdGUgb25seSBpbiBOZXdQYWdlIG1vZGVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0Ly8gbm8gbmF2aWdhdGlvbiBvciBubyByb3V0ZSBzcGVjaWZpZWQgLSBmYWxsYmFjayB0byBpbmxpbmUgY3JlYXRlIGlmIG9yaWdpbmFsIGNyZWF0aW9uIG1vZGUgd2FzICdOZXdQYWdlJ1xuXHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRhcHBlbmQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUF0RW5kLFxuXHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpXG5cdH07XG59XG5cbmNvbnN0IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkgPSBmdW5jdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRQYXRoOiBzdHJpbmdcbikge1xuXHRsZXQgcHJlc3NQcm9wZXJ0eSwgbmF2aWdhdGlvblRhcmdldDtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGlmIChuYXZpZ2F0aW9uU2V0dGluZ3MgJiYgbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kaXNwbGF5Py50YXJnZXQgfHwgbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ub3V0Ym91bmQ7XG5cdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdHByZXNzUHJvcGVydHkgPVxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoICRjb250cm9sbGVyICwnXCIgKyBuYXZpZ2F0aW9uVGFyZ2V0ICsgXCInLCAkeyRwYXJhbWV0ZXJzPmJpbmRpbmdDb250ZXh0fSlcIjtcblx0XHR9IGVsc2UgaWYgKHRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0ID0gbmF2aWdhdGlvblNldHRpbmdzLmRldGFpbD8ucm91dGU7XG5cdFx0XHRpZiAobmF2aWdhdGlvblRhcmdldCkge1xuXHRcdFx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gZ2V0SGlnaGxpZ2h0Um93QmluZGluZyhcblx0XHRcdFx0XHRsaW5lSXRlbUFubm90YXRpb24uYW5ub3RhdGlvbnM/LlVJPy5Dcml0aWNhbGl0eSxcblx0XHRcdFx0XHQhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290IHx8ICEhdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUsXG5cdFx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XHRcIkFQSS5vblRhYmxlUm93UHJlc3MoJGV2ZW50LCAkY29udHJvbGxlciwgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0sIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSwgdGFyZ2V0UGF0aDogJ1wiICtcblx0XHRcdFx0XHR0YXJnZXRQYXRoICtcblx0XHRcdFx0XHRcIicsIGVkaXRhYmxlIDogXCIgK1xuXHRcdFx0XHRcdCh0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCB0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZVxuXHRcdFx0XHRcdFx0PyBcIiEkeyRwYXJhbWV0ZXJzPmJpbmRpbmdDb250ZXh0fS5nZXRQcm9wZXJ0eSgnSXNBY3RpdmVFbnRpdHknKVwiXG5cdFx0XHRcdFx0XHQ6IFwidW5kZWZpbmVkXCIpICtcblx0XHRcdFx0XHRcIn0pXCI7IC8vTmVlZCB0byBhY2Nlc3MgdG8gRHJhZnRSb290IGFuZCBEcmFmdE5vZGUgISEhISEhIVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcobGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksIGZhbHNlLCB0YXJnZXRFbnRpdHlUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3Qgcm93TmF2aWdhdGVkRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IGZvcm1hdFJlc3VsdChcblx0XHRbYmluZGluZ0V4cHJlc3Npb24oXCIvZGVlcGVzdFBhdGhcIiwgXCJpbnRlcm5hbFwiKV0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLm5hdmlnYXRlZFJvdyxcblx0XHR0YXJnZXRFbnRpdHlUeXBlXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0cHJlc3M6IHByZXNzUHJvcGVydHksXG5cdFx0YWN0aW9uOiBwcmVzc1Byb3BlcnR5ID8gXCJOYXZpZ2F0aW9uXCIgOiB1bmRlZmluZWQsXG5cdFx0cm93SGlnaGxpZ2h0aW5nOiBjb21waWxlQmluZGluZyhjcml0aWNhbGl0eVByb3BlcnR5KSxcblx0XHRyb3dOYXZpZ2F0ZWQ6IGNvbXBpbGVCaW5kaW5nKHJvd05hdmlnYXRlZEV4cHJlc3Npb24pXG5cdH07XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb2x1bW5zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBUaGUgY29sdW1uIGZyb20gdGhlIGVudGl0eVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHRhYmxlQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXTtcblx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdFx0Y29uc3QgZXhpc3RzID0gYW5ub3RhdGlvbkNvbHVtbnMuc29tZShjb2x1bW4gPT4ge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5uYW1lID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdH0pO1xuXG5cdFx0Ly8gaWYgdGFyZ2V0IHR5cGUgZXhpc3RzLCBpdCBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIHNob3VsZCBiZSBpZ25vcmVkXG5cdFx0aWYgKCFwcm9wZXJ0eS50YXJnZXRUeXBlICYmICFleGlzdHMpIHtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRhYmxlVHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleVwiLCBbXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0XHRdKVswXTtcblx0XHRcdGNvbnN0IG9Db2x1bW5EcmFmdEluZGljYXRvciA9IGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihjb2x1bW5JbmZvLm5hbWUsIHNlbWFudGljS2V5cyk7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbHVtbkRyYWZ0SW5kaWNhdG9yKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHQuLi5vQ29sdW1uRHJhZnRJbmRpY2F0b3Jcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8ucHJvcGVydHlJbmZvcyA9IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzID0ge1xuXHRcdFx0XHRcdC4uLmNvbHVtbkluZm8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1RlbXBsYXRlLFxuXHRcdFx0XHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1dyYXBwaW5nXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaChuYW1lID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1tuYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZUNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGEgcHJvcGVydHkuXG4gKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSB1c2VEYXRhRmllbGRQcmVmaXggU2hvdWxkIGJlIHByZWZpeGVkIHdpdGggXCJEYXRhRmllbGQ6OlwiLCBlbHNlIGl0IHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBcIlByb3BlcnR5OjpcIlxuICogQHBhcmFtIHtib29sZWFufSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciBjb2x1bW4gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgYWRhcHRhdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gbm9uU29ydGFibGVDb2x1bW5zIFRoZSBhcnJheSBvZiBhbGwgbm9uIHNvcnRhYmxlIGNvbHVtbiBuYW1lc1xuICogQHBhcmFtIHtBZ2dyZWdhdGlvbkhlbHBlcn0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7QW5ub3RhdGlvblRhYmxlQ29sdW1ufSBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbiB7XG5cdGNvbnN0IG5hbWUgPSB1c2VEYXRhRmllbGRQcmVmaXggPyByZWxhdGl2ZVBhdGggOiBcIlByb3BlcnR5OjpcIiArIHJlbGF0aXZlUGF0aDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGlzSGlkZGVuID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZTtcblx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9wZXJ0eS5uYW1lID8gX3NsaWNlQXRTbGFzaChwcm9wZXJ0eS5uYW1lLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcHJvcGVydHkubmFtZTtcblx0Y29uc3QgaXNEYXRhUG9pbnRGYWtlUHJvcGVydHk6IGJvb2xlYW4gPSBuYW1lLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCIpID4gLTE7XG5cdGNvbnN0IGV4cG9ydFR5cGU6IHN0cmluZyA9IF9nZXRFeHBvcnREYXRhVHlwZShwcm9wZXJ0eS50eXBlKTtcblx0Y29uc3Qgc0RhdGVJbnB1dEZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uRGF0ZVwiID8gXCJZWVlZLU1NLUREXCIgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShwcm9wZXJ0eSk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9ICFpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IGdldFR5cGVDb25maWcocHJvcGVydHksIGRhdGFUeXBlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb1R5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHlcblx0XHQ/IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBwcm9wZXJ0eS50eXBlIHx8IGRhdGFUeXBlLFxuXHRcdFx0XHRvRm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdG9Db25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0ICB9XG5cdFx0OiB1bmRlZmluZWQ7XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzID0gaXNEYXRhUG9pbnRGYWtlUHJvcGVydHlcblx0XHQ/IHtcblx0XHRcdFx0dGVtcGxhdGU6IGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQocHJvcGVydHkpXG5cdFx0ICB9XG5cdFx0OiB7XG5cdFx0XHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0XHRcdGlucHV0Rm9ybWF0OiBzRGF0ZUlucHV0Rm9ybWF0LFxuXHRcdFx0XHRzY2FsZTogcHJvcGVydHkuc2NhbGUsXG5cdFx0XHRcdGRlbGltaXRlcjogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiBmYWxzZSxcblx0XHRcdFx0dHJ1ZVZhbHVlOiBwcm9wZXJ0eS50eXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIlllc1wiIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRmYWxzZVZhbHVlOiBwcm9wZXJ0eS50eXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIk5vXCIgOiB1bmRlZmluZWRcblx0XHQgIH07XG5cblx0Y29uc3Qgb0NvbHVtbjogYW55ID0ge1xuXHRcdGtleToga2V5LFxuXHRcdGlzR3JvdXBhYmxlOiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgJiYgIWlzSGlkZGVuID8gYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBmYWxzZSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0bGFiZWw6IF9nZXRMYWJlbChwcm9wZXJ0eSwgaXNHcm91cCksXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IF9nZXRMYWJlbChwcm9wZXJ0eSkgOiBudWxsLFxuXHRcdGdyb3VwOiBpc0dyb3VwID8gZ3JvdXBQYXRoIDogbnVsbCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0Ly8gQSBmYWtlIHByb3BlcnR5IHdhcyBjcmVhdGVkIGZvciB0aGUgVGFyZ2V0VmFsdWUgdXNlZCBvbiBEYXRhUG9pbnRzLCB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW4gYW5kIG5vbiBzb3J0YWJsZVxuXHRcdGF2YWlsYWJpbGl0eTpcblx0XHRcdCFhdmFpbGFibGVGb3JBZGFwdGF0aW9uIHx8IGlzSGlkZGVuIHx8IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0XHQ/IChwcm9wZXJ0eSBhcyBhbnkpLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdD8uVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZT8ucGF0aCB8fCAocHJvcGVydHkgYXMgYW55KS5WYWx1ZS5wYXRoXG5cdFx0XHQ6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogIWlzSGlkZGVuICYmIG5vblNvcnRhYmxlQ29sdW1ucy5pbmRleE9mKHJlbGF0aXZlUGF0aCkgPT09IC0xICYmICFpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0dHlwZUNvbmZpZzogb1R5cGVDb25maWcsXG5cdFx0dmlzdWFsU2V0dGluZ3M6IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8geyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0gOiB1bmRlZmluZWRcblx0fTtcblx0Y29uc3Qgc1Rvb2x0aXAgPSBfZ2V0VG9vbHRpcChwcm9wZXJ0eSk7XG5cdGlmIChzVG9vbHRpcCkge1xuXHRcdG9Db2x1bW4udG9vbHRpcCA9IHNUb29sdGlwO1xuXHR9XG5cblx0cmV0dXJuIG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1ucy5cbiAqXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBmb3IgdmFsaWQgY29sdW1ucywgZmFsc2UgZm9yIGludmFsaWQgY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpIHtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHJldHVybiAhIWRhdGFGaWVsZC5JbmxpbmU7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZGVmYXVsdDpcblx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHQvLyAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIERhdGFGaWVsZCBBYnN0cmFjdCB0eXBlOiBcIiArIGRhdGFGaWVsZC4kVHlwZSk7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cbiAqIEBwYXJhbSB7RmllbGRGb3JtYXRPcHRpb25zfSBbZm9ybWF0T3B0aW9uc10gRm9ybWF0T3B0aW9ucyBpcyBvcHRpb25hbCwgdXNlZCB0byBjaGVjayBpZiB0aGUgYW5hbHl0aWMgdGFibGUgaGFzIEdyb3VwSGVhZGVyIGV4cGFuZGVkLlxuICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuRXhwcmVzc2lvbl0gUmV0dXJuRXhwcmVzc2lvbiBvcHRpb25hbC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuZXhwb3J0IGNvbnN0IF9nZXRWaXNpYmxlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZvcm1hdE9wdGlvbnM/OiBhbnksXG5cdHJldHVybkV4cHJlc3Npb246IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRjb25zdCBleHByZXNzaW9uID0gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKCEhcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSwgdHJ1ZSksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xuXHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbiA/IChleHByZXNzaW9uIGFzIEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4pIDogY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmaWVsZEZvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24oXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IGFueVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0YUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCB0cnVlKVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRpZkVsc2Uob3IoLi4uKGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSlcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHl9IFtwcm9wZXJ0eV0gUHJvcGVydHkgb3IgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMge3N0cmluZ30gTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldExhYmVsID0gZnVuY3Rpb24ocHJvcGVydHk6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSwgaXNHcm91cDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFwcm9wZXJ0eSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0XHRpZiAoZGF0YUZpZWxkRGVmYXVsdCAmJiAhZGF0YUZpZWxkRGVmYXVsdC5xdWFsaWZpZXIgJiYgZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udmFsdWVPZigpKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWVcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkgfHwgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5LkxhYmVsPy52YWx1ZU9mKCkpKTtcblx0fVxufTtcblxuY29uc3QgX2dldFRvb2x0aXAgPSBmdW5jdGlvbihzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghc291cmNlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLmFubm90YXRpb25zLkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvLnZhbHVlT2YoKSkpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oc291cmNlLlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhcG9pbnRUYXJnZXQuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvLnZhbHVlT2YoKSkpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIGVhY2ggaWRlbnRpZmllZCBwcm9wZXJ0eSBjb25zdW1lZCBieSBhIExpbmVJdGVtLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUHJvcGVydHk+fSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1uIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzb3J0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZm9yIHRoZSBMaW5lSXRlbVxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkLlxuICovXG5jb25zdCBfY3JlYXRlUmVsYXRlZENvbHVtbnMgPSBmdW5jdGlvbihcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0T2JqZWN0LmtleXMoY29sdW1uc1RvQmVDcmVhdGVkKS5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpO1xuXHRcdGlmIChyZWxhdGVkQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENhc2UgMTogS2V5IGNvbnRhaW5zIERhdGFGaWVsZCBwcmVmaXggdG8gZW5zdXJlIGFsbCBwcm9wZXJ0eSBjb2x1bW5zIGhhdmUgdGhlIHNhbWUga2V5IGZvcm1hdC5cblx0XHRcdC8vIE5ldyBjcmVhdGVkIHByb3BlcnR5IGNvbHVtbiBpcyBzZXQgdG8gaGlkZGVuLlxuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChcblx0XHRcdFx0Z2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0cmVsYXRlZENvbHVtbi5hbm5vdGF0aW9uUGF0aCAhPT0gYW5ub3RhdGlvblBhdGggfHxcblx0XHRcdChyZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MgJiYgcmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zLmluZGV4T2YobmFtZSkgIT09IC0xKVxuXHRcdCkge1xuXHRcdFx0Ly8gQ2FzZSAyOiBUaGUgZXhpc3RpbmcgY29sdW1uIHBvaW50cyB0byBhIExpbmVJdGVtIChvcilcblx0XHRcdC8vIENhc2UgMzogVGhpcyBpcyBhIHNlbGYgcmVmZXJlbmNlIGZyb20gYW4gZXhpc3RpbmcgY29sdW1uIGFuZFxuXHRcdFx0Ly8gYm90aCBjYXNlcyByZXF1aXJlIGEgZHVtbXkgUHJvcGVydHlJbmZvIGZvciBzZXR0aW5nIGNvcnJlY3QgZXhwb3J0IHNldHRpbmdzLlxuXG5cdFx0XHRjb25zdCBuZXdOYW1lID0gXCJQcm9wZXJ0eTo6XCIgKyBuYW1lO1xuXG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKGNvbHVtbiA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHByb3BlcnR5IGNvbHVtbiB3aXRoICdQcm9wZXJ0eTo6JyBwcmVmaXgsXG5cdFx0XHRcdC8vIFNldCBpdCB0byBoaWRkZW4gYXMgaXQgaXMgb25seSBjb25zdW1lZCBieSBDb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Ly8gVGhlIHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKHByb3BlcnR5SW5mbyA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvKTtcblx0XHRjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBjb2x1bW4uYWRkaXRpb25hbFByb3BlcnR5SW5mb3M/Lm1hcChcblx0XHRcdHByb3BlcnR5SW5mbyA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0KTtcblx0fSk7XG5cblx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXR0aW5nIHRoZSBDb2x1bW4gTmFtZVxuICogSWYgaXQgcG9pbnRzIHRvIGEgRGF0YUZpZWxkIHdpdGggb25lIHByb3BlcnR5IG9yIERhdGFQb2ludCB3aXRoIG9uZSBwcm9wZXJ0eSwgaXQgd2lsbCB1c2UgdGhlIHByb3BlcnR5IG5hbWVcbiAqIGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBleGlzdGluZyBmbGV4IGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUgPSBmdW5jdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpIHtcblx0Ly8gVGhpcyBpcyBuZWVkZWQgYXMgd2UgaGF2ZSBmbGV4aWJpbGl0eSBjaGFuZ2VzIGFscmVhZHkgdGhhdCB3ZSBoYXZlIHRvIGNoZWNrIGFnYWluc3Rcblx0aWYgKGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkKSkge1xuXHRcdHJldHVybiBkYXRhRmllbGQuVmFsdWU/LnBhdGg7XG5cdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy5wYXRoKSB7XG5cdFx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZpbmcgZHVwbGljYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCAnUHJvZ3Jlc3MnIFByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgRGF0YVBvaW50XG5cdFx0cmV0dXJuIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhIGZpZWxkIGxhYmVscyBoYXZlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRHcm91cE5hbWUgVGhlIGBEYXRhRmllbGRgIG5hbWUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgc2hvd0RhdGFGaWVsZHNMYWJlbGAgdmFsdWUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24oZmllbGRHcm91cE5hbWU6IHN0cmluZywgdmlzdWFsaXphdGlvblBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBvQ29sdW1ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGFDb2x1bW5LZXlzID0gb0NvbHVtbnMgJiYgT2JqZWN0LmtleXMob0NvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGFDb2x1bW5LZXlzICYmXG5cdFx0ISFhQ29sdW1uS2V5cy5maW5kKGZ1bmN0aW9uKGtleTogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4ga2V5ID09PSBmaWVsZEdyb3VwTmFtZSAmJiBvQ29sdW1uc1trZXldLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoOiBzdHJpbmcgPSBcIlwiO1xuXG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGQpPy5WYWx1ZT8ucGF0aDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py52YWx1ZTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24ocGF0aDogc3RyaW5nLCBpc0xhc3RTbGFzaDogYm9vbGVhbiwgaXNMYXN0UGFydDogYm9vbGVhbikge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXG5cdGlmIChpU2xhc2hJbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXHRyZXR1cm4gaXNMYXN0UGFydCA/IHBhdGguc3Vic3RyaW5nKGlTbGFzaEluZGV4ICsgMSwgcGF0aC5sZW5ndGgpIDogcGF0aC5zdWJzdHJpbmcoMCwgaVNsYXNoSW5kZXgpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIGNvbHVtbiBpcyBzb3J0YWJsZS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb2x1bW4gaXMgc29ydGFibGVcbiAqL1xuY29uc3QgX2lzQ29sdW1uU29ydGFibGUgPSBmdW5jdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG5cdGxldCBpc1NvcnRhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cdGlmIChub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihwcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdC8vIENvbHVtbiBpcyBub3QgbWFya2VkIGFzIG5vbi1zb3J0YWJsZSB2aWEgYW5ub3RhdGlvblxuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdFx0aXNTb3J0YWJsZSA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0XHQvLyBBY3Rpb24gY29sdW1ucyBhcmUgbm90IHNvcnRhYmxlXG5cdFx0XHRcdGlzU29ydGFibGUgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpc1NvcnRhYmxlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBmdW5jdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlckZ1bmN0aW9uczogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkID1cblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eUNvbnRhaW5lcigpLmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucztcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoZmlsdGVyRnVuY3Rpb25zKSA/IChmaWx0ZXJGdW5jdGlvbnMgYXMgU3RyaW5nW10pLmluZGV4T2YoXCJ0b2xvd2VyXCIpID09PSAtMSA6IHRydWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyBmb3IgdGV4dCBmaWVsZHMgaW4gYSB0YWJsZS5cbiAqXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKCk6IEZvcm1hdE9wdGlvbnNUeXBlIHtcblx0cmV0dXJuIHtcblx0XHR0ZXh0TGluZXNFZGl0OiA0XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIHdpdGggZHJhZnRJbmRpY2F0b3IgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEByZXR1cm5zIHtGb3JtYXRPcHRpb25zVHlwZX0gQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lOiBzdHJpbmcsIHNlbWFudGljS2V5czogYW55W10pIHtcblx0bGV0IGJTZW1hbnRpY0tleUZvdW5kID0gZmFsc2U7XG5cdGNvbnN0IGFTZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRhU2VtYW50aWNLZXlWYWx1ZXMucHVzaChzZW1hbnRpY0tleXNbaV0udmFsdWUpO1xuXHRcdGlmIChzZW1hbnRpY0tleXNbaV0udmFsdWUgPT09IG5hbWUpIHtcblx0XHRcdGJTZW1hbnRpY0tleUZvdW5kID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0aWYgKGJTZW1hbnRpY0tleUZvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0c2VtYW50aWNrZXlzOiBhU2VtYW50aWNLZXlWYWx1ZXNcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7fTtcblx0fVxufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10gPSBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSksXG5cdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCksXG5cdFx0dGFibGVUeXBlOiBUYWJsZVR5cGUgPSB0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LnR5cGUgfHwgXCJSZXNwb25zaXZlVGFibGVcIjtcblx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleVwiLCBbXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKClcblx0XSlbMF07XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaChsaW5lSXRlbSA9PiB7XG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGxpbmVJdGVtKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhsaW5lSXRlbSkgJiYgbGluZUl0ZW0uVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHRcdD8gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIGxpbmVJdGVtKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChsaW5lSXRlbSk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGxpbmVJdGVtLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZVR5cGUpO1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nID0gX3NsaWNlQXRTbGFzaChyZWxhdGl2ZVBhdGgsIHRydWUsIGZhbHNlKTtcblx0XHRcdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcmVsYXRpdmVQYXRoO1xuXHRcdFx0Y29uc3Qgc0xhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBfZ2V0TGFiZWwobGluZUl0ZW0sIGlzR3JvdXApO1xuXHRcdFx0Y29uc3QgbmFtZSA9IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZShsaW5lSXRlbSk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCIpID4gLTE7XG5cdFx0XHRjb25zdCBzaG93RGF0YUZpZWxkc0xhYmVsOiBib29sZWFuID0gaXNGaWVsZEdyb3VwQ29sdW1uXG5cdFx0XHRcdD8gX2dldFNob3dEYXRhRmllbGRzTGFiZWwobmFtZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0XHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3Qgc0RhdGVJbnB1dEZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHQuLi5nZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZSwgc2VtYW50aWNLZXlzKVxuXHRcdFx0fTtcblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGxpbmVJdGVtLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGxpbmVJdGVtLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhsaW5lSXRlbSwgZm9ybWF0T3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBleHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1RlbXBsYXRlLFxuXHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZyxcblx0XHRcdFx0dHlwZTogZGF0YVR5cGUgPyBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDEpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogc0RhdGVJbnB1dEZvcm1hdCxcblx0XHRcdFx0ZGVsaW1pdGVyOiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiBmYWxzZSxcblx0XHRcdFx0dHJ1ZVZhbHVlOiBkYXRhVHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJZZXNcIiA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZmFsc2VWYWx1ZTogZGF0YVR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiTm9cIiA6IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGRhdGFUeXBlICYmIGdldFR5cGVDb25maWcobGluZUl0ZW0sIGRhdGFUeXBlKTtcblx0XHRcdGNvbnN0IG9UeXBlQ29uZmlnID0gcHJvcGVydHlUeXBlQ29uZmlnXG5cdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSxcblx0XHRcdFx0XHRcdG9Gb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdC4uLnByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0NvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdFx0ICB9XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0bGV0IHZpc3VhbFNldHRpbmdzOiBWaXN1YWxTZXR0aW5ncyA9IHt9O1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby52aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbiB3aXRoIGRpc3BsYXkgbW9kZSBhcyB0ZXh0IG9ubHksIGV4Y2x1ZGUgdGV4dCBwcm9wZXJ0eSBmcm9tIHRoZSB3aWR0aCBjYWxjdWxhdGlvblxuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHR3aWR0aENhbGN1bGF0aW9uOiB7XG5cdFx0XHRcdFx0XHRleGNsdWRlUHJvcGVydGllczogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGVkUHJvcGVydGllc0luZm8udmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKCFkYXRhVHlwZSB8fCAhb1R5cGVDb25maWcpIHtcblx0XHRcdFx0Ly8gZm9yIGNoYXJ0c1xuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncy53aWR0aENhbGN1bGF0aW9uID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVE9ETzogRm9yIHNpdHVhdGlvbiBQT0MgLSBpbmNyZWFzZSB3aWR0aCBvZiB0aGUgY29sdW1uIHdpdGggdGhlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIC0gd29ya3MgZm9yIHRoZSBzaXR1YXRpb25zIGRlbW8gYXBwIG9ubHkhXG5cdFx0XHQvLyBNaWdodCBiZSBhIGdvb2QgaWRlYSB0byBtb3ZlIHRoZSBjb21wbGV0ZSBjb2x1bW4gd2lkdGggZGV0ZXJtaW5hdGlvbiB0byB0aGUgY29udmVydGVyLCB0aGF0IHdvdWxkIGFsbG93IHVzIHRvIHdpZGVuXG5cdFx0XHQvLyB0aGUgY29sdW1ucyBhcyBuZWVkZWQuIFRoaXMgd29ya2Fyb3VuZCBvbmx5IGRlYWxzIHdpdGggRGF0ZSBjb2x1bW5zLlxuXHRcdFx0Y29uc3QgeyBoYXNEcmFmdEluZGljYXRvciB9ID0gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cyk7XG5cdFx0XHRjb25zdCB3aWR0aE92ZXJyaWRlID1cblx0XHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmFubm90YXRpb25zIGFzIGFueSkuRkU/LlNpdHVhdGlvbnMgJiZcblx0XHRcdFx0aGFzRHJhZnRJbmRpY2F0b3IgJiZcblx0XHRcdFx0bGluZUl0ZW0uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCAmJlxuXHRcdFx0XHRsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0LnR5cGUgPT09IFwiRWRtLkRhdGVcIlxuXHRcdFx0XHRcdD8gXCIxMWVtXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3Qgb0NvbHVtbjogYW55ID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQobGluZUl0ZW0pLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwobGluZUl0ZW0pIDogbnVsbCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiBudWxsLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChsaW5lSXRlbS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogaXNEYXRhRmllbGRBbHdheXNIaWRkZW4obGluZUl0ZW0pID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogX2lzQ29sdW1uU29ydGFibGUobGluZUl0ZW0sIHJlbGF0aXZlUGF0aCwgbm9uU29ydGFibGVDb2x1bW5zKSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiBsaW5lSXRlbS5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aCB8fCB3aWR0aE92ZXJyaWRlIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3Ncblx0XHRcdH07XG5cdFx0XHRjb25zdCBzVG9vbHRpcCA9IF9nZXRUb29sdGlwKGxpbmVJdGVtKTtcblx0XHRcdGlmIChzVG9vbHRpcCkge1xuXHRcdFx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbik7XG5cblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0bGV0IHRhYmxlQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGVcblx0KTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChhbm5vdGF0aW9uQ29sdW1ucyk7XG5cblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKGNvbHVtbnNUb0JlQ3JlYXRlZCwgdGFibGVDb2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24ocHJvcGVydGllczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdC5tYXAocHJvcGVydHkgPT4ge1xuXHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdH0pXG5cdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB0YWJsZSBjb2x1bW4gcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIE1hbmlmZXN0IGRlZmluZWQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSAvIGFubm90YXRpb24gY29sdW1uc1xuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIGNvbHVtbiBpZiBub3Qgb3ZlcndyaXR0ZW4gaW4gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHByb3BlcnR5IFRoZSBjb2x1bW4gcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQW5ub3RhdGlvbkNvbHVtbiBXaGV0aGVyIHRoZSBjb2x1bW4sIGRlZmluZWQgaW4gbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gY29sdW1uLlxuICogQHJldHVybnMge2FueX0gRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbHVtblxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBpc0Fubm90YXRpb25Db2x1bW46IGJvb2xlYW4pOiBhbnkge1xuXHRpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIElmIGFubm90YXRpb24gY29sdW1uIGhhcyBubyBwcm9wZXJ0eSBkZWZpbmVkIGluIG1hbmlmZXN0LFxuXHRcdC8vIGRvIG5vdCBvdmVyd3JpdGUgaXQgd2l0aCBtYW5pZmVzdCBjb2x1bW4ncyBkZWZhdWx0IHZhbHVlLlxuXHRcdHJldHVybiBpc0Fubm90YXRpb25Db2x1bW4gPyB1bmRlZmluZWQgOiBkZWZhdWx0VmFsdWU7XG5cdH1cblx0Ly8gUmV0dXJuIHdoYXQgaXMgZGVmaW5lZCBpbiBtYW5pZmVzdC5cblx0cmV0dXJuIHByb3BlcnR5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tQ29sdW1uPn0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRlbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRpZiAoIW1hbmlmZXN0Q29sdW1uPy50ZW1wbGF0ZSAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gXCJUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJ1wiICsga2V5ICsgXCInIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZFwiO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRcdG5hbWU6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0aGVhZGVyOiBtYW5pZmVzdENvbHVtbi5oZWFkZXIsXG5cdFx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLCBpc0Fubm90YXRpb25Db2x1bW4pLFxuXHRcdFx0XHR0eXBlOiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBcIlNsb3RcIiA/IENvbHVtblR5cGUuU2xvdCA6IENvbHVtblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSB8fCBcInVuZGVmaW5lZFwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHQuLi5tYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiB7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHByb3BlcnR5SW5mb3MgPyBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcykgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZmllbGRMYWJlbDogcHJvcGVydHlJbmZvcyA/IG1hbmlmZXN0Q29sdW1uLmhlYWRlciA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR3cmFwOiBwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IGFQZXJzb25hbGl6YXRpb246IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGJBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbjogYW55ID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0cmV0dXJuIGJBbmFseXRpY2FsVGFibGUgPyBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cCxBZ2dyZWdhdGVcIiA6IFwiU29ydCxDb2x1bW4sRmlsdGVyXCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcGVyc29uYWxpemF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBTcGVjaWZpYyBwZXJzb25hbGl6YXRpb24gb3B0aW9ucyBlbmFibGVkIGluIG1hbmlmZXN0LiBVc2UgdGhlbSBhcyBpcy5cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uc29ydCkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5maWx0ZXIpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5ncm91cCAmJiBiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVBlcnNvbmFsaXphdGlvbi5sZW5ndGggPiAwID8gYVBlcnNvbmFsaXphdGlvbi5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCB8fCBfaXNGaWx0ZXJCYXJIaWRkZW4obWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0KSkge1xuXHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHQvLyBPciB3aGVuIHRoZSBMUiBmaWx0ZXIgYmFyIGlzIGhpZGRlbiB2aWEgbWFuaWZlc3Qgc2V0dGluZ1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdH1cblx0XHRpZiAoYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0fVxuXHRcdHJldHVybiBhUGVyc29uYWxpemF0aW9uLmpvaW4oXCIsXCIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGJvb2xlYW4gc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqXG4gKiBDaGFydCBoYXMgYSBkZXBlbmRlbmN5IHRvIGZpbHRlciBiYXIgKGlzc3VlIHdpdGggbG9hZGluZyBkYXRhKS4gT25jZSByZXNvbHZlZCwgdGhlIGNoZWNrIGZvciBjaGFydCBzaG91bGQgYmUgcmVtb3ZlZCBoZXJlLlxuICogVW50aWwgdGhlbiwgaGlkaW5nIGZpbHRlciBiYXIgaXMgbm93IGFsbG93ZWQgaWYgYSBjaGFydCBpcyBiZWluZyB1c2VkIG9uIExSLlxuICpcbiAqIEBwYXJhbSB7TWFuaWZlc3RXcmFwcGVyfSBtYW5pZmVzdFdyYXBwZXIgTWFuaWZlc3Qgc2V0dGluZ3MgZ2V0dGVyIGZvciB0aGUgcGFnZVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBCb29sZWFuIHN1Z2dlc3RpbmcgaWYgYSBmaWx0ZXIgYmFyIGlzIGJlaW5nIHVzZWQgb24gdGhlIHBhZ2UuXG4gKi9cbmZ1bmN0aW9uIF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdG1hbmlmZXN0V3JhcHBlci5pc0ZpbHRlckJhckhpZGRlbigpICYmXG5cdFx0IWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucygpICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIHRoZSBzb3J0IGNvbmRpdGlvbnMgZm9yIHRoZSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIFRhYmxlIGNvbHVtbnMgcHJvY2Vzc2VkIGJ5IHRoZSBjb252ZXJ0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFNvcnQgY29uZGl0aW9ucyBmb3IgYSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ydENvbmRpdGlvbnMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBDdXJyZW50bHkgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGFzIHNvcnRlclxuXHRjb25zdCBub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSk7XG5cdGxldCBzb3J0Q29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlNvcnRPcmRlcikge1xuXHRcdGNvbnN0IHNvcnRlcnM6IFNvcnRlclR5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGNvbmRpdGlvbnMgPSB7XG5cdFx0XHRzb3J0ZXJzOiBzb3J0ZXJzXG5cdFx0fTtcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Tb3J0T3JkZXIuZm9yRWFjaChjb25kaXRpb24gPT4ge1xuXHRcdFx0Y29uc3QgY29uZGl0aW9uUHJvcGVydHkgPSBjb25kaXRpb24uUHJvcGVydHk7XG5cdFx0XHRpZiAoY29uZGl0aW9uUHJvcGVydHkgJiYgbm9uU29ydGFibGVQcm9wZXJ0aWVzLmluZGV4T2YoY29uZGl0aW9uUHJvcGVydHkuJHRhcmdldD8ubmFtZSkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnN0IGluZm9OYW1lID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhbY29uZGl0aW9uUHJvcGVydHldLCBjb2x1bW5zKVswXTtcblx0XHRcdFx0aWYgKGluZm9OYW1lKSB7XG5cdFx0XHRcdFx0Y29uZGl0aW9ucy5zb3J0ZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogaW5mb05hbWUsXG5cdFx0XHRcdFx0XHRkZXNjZW5kaW5nOiAhIWNvbmRpdGlvbi5EZXNjZW5kaW5nXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRzb3J0Q29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuc29ydGVycy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKSA6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gc29ydENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgcHJvcGVydHlQYXRoIHRvIGFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gcGF0aHMgdGhlIGFycmF5IHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGNvbHVtbnMgdGhlIGFycmF5IG9mIHByb3BlcnR5SW5mb3NcbiAqIEByZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5SW5mbyBuYW1lc1xuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMocGF0aHM6IFByb3BlcnR5UGF0aFtdLCBjb2x1bW5zOiBUYWJsZUNvbHVtbltdKTogc3RyaW5nW10ge1xuXHRjb25zdCBpbmZvTmFtZXM6IHN0cmluZ1tdID0gW107XG5cdHBhdGhzLmZvckVhY2goY3VycmVudFBhdGggPT4ge1xuXHRcdGlmIChjdXJyZW50UGF0aD8uJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvID0gY29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0XHRyZXR1cm4gIWFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0aW5mb05hbWVzLnB1c2gocHJvcGVydHlJbmZvLm5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGluZm9OYW1lcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBncm91cCBjb25kaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRHcm91cENvbmRpdGlvbnMoXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgZ3JvdXBDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uR3JvdXBCeSkge1xuXHRcdGNvbnN0IGFHcm91cEJ5ID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uR3JvdXBCeSBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0XHRjb25zdCBhR3JvdXBMZXZlbHMgPSBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKGFHcm91cEJ5LCBjb2x1bW5zKS5tYXAoaW5mb05hbWUgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogaW5mb05hbWUgfTtcblx0XHR9KTtcblxuXHRcdGdyb3VwQ29uZGl0aW9ucyA9IGFHcm91cExldmVscy5sZW5ndGggPyBKU09OLnN0cmluZ2lmeSh7IGdyb3VwTGV2ZWxzOiBhR3JvdXBMZXZlbHMgfSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIGdyb3VwQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBhZ2dyZWdhdGUgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QWdncmVnYXRlQ29uZGl0aW9ucyhcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBhZ2dyZWdhdGVDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVG90YWwpIHtcblx0XHRjb25zdCBhVG90YWxzID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uVG90YWwgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0Y29uc3QgYWdncmVnYXRlczogUmVjb3JkPHN0cmluZywgb2JqZWN0PiA9IHt9O1xuXHRcdGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoYVRvdGFscywgY29sdW1ucykuZm9yRWFjaChpbmZvTmFtZSA9PiB7XG5cdFx0XHRhZ2dyZWdhdGVzW2luZm9OYW1lXSA9IHt9O1xuXHRcdH0pO1xuXG5cdFx0YWdncmVnYXRlQ29uZGl0aW9ucyA9IEpTT04uc3RyaW5naWZ5KGFnZ3JlZ2F0ZXMpO1xuXHR9XG5cblx0cmV0dXJuIGFnZ3JlZ2F0ZUNvbmRpdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiB7XG5cdC8vIE5lZWQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB0aXRsZTogYW55ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lUGx1cmFsO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRFbnRpdHlTZXQ7XG5cdGNvbnN0IHBhZ2VNYW5pZmVzdFNldHRpbmdzOiBNYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCBoYXNBYnNvbHV0ZVBhdGggPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCA9PT0gMCxcblx0XHRwMTNuTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0UDEzbk1vZGUodmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKSxcblx0XHRpZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyBUYWJsZUlEKHZpc3VhbGl6YXRpb25QYXRoKSA6IFRhYmxlSUQoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpLCBcIkxpbmVJdGVtXCIpO1xuXHRjb25zdCB0YXJnZXRDYXBhYmlsaXRpZXMgPSBnZXRDYXBhYmlsaXR5UmVzdHJpY3Rpb24oY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG5hdmlnYXRpb25UYXJnZXRQYXRoID0gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdGNvbnN0IG5hdmlnYXRpb25TZXR0aW5ncyA9IHBhZ2VNYW5pZmVzdFNldHRpbmdzLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3Qgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCA9IGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdG5hdmlnYXRpb25TZXR0aW5ncyxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHR2aWV3Q29uZmlndXJhdGlvblxuXHQpO1xuXG5cdGNvbnN0IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCA9IGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGNvbXBpbGVCaW5kaW5nKGNyZWF0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSA9PT0gXCJmYWxzZVwiXG5cdCk7XG5cblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGxldCB0aHJlc2hvbGQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gMTAgOiAzMDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcykge1xuXHRcdHRocmVzaG9sZCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLk1heEl0ZW1zLnZhbHVlT2YoKSBhcyBudW1iZXI7XG5cdH1cblxuXHRjb25zdCBjcmVhdGlvbkJlaGF2aW91ciA9IF9nZXRDcmVhdGlvbkJlaGF2aW91cihsaW5lSXRlbUFubm90YXRpb24sIHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9ucyA9IHtcblx0XHRjcmVhdGU6IGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdFwiZGVsZXRlXCI6IGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdHBhc3RlOiBnZXRTdGFuZGFyZEFjdGlvblBhc3RlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkKSxcblx0XHRtYXNzRWRpdDogZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KVxuXHR9O1xuXG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0UGF0aFxuXHRcdCksXG5cdFx0cDEzbk1vZGU6IHAxM25Nb2RlLFxuXHRcdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdFx0YWN0aW9uczogc3RhbmRhcmRBY3Rpb25zLFxuXHRcdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkLFxuXHRcdFx0dXBkYXRhYmxlUHJvcGVydHlQYXRoOiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH0sXG5cdFx0ZGlzcGxheU1vZGU6IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbiksXG5cdFx0Y3JlYXRlOiBjcmVhdGlvbkJlaGF2aW91cixcblx0XHRzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlLFxuXHRcdGF1dG9CaW5kT25Jbml0OlxuXHRcdFx0X2lzRmlsdGVyQmFySGlkZGVuKHBhZ2VNYW5pZmVzdFNldHRpbmdzLCBjb252ZXJ0ZXJDb250ZXh0KSB8fFxuXHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgJiZcblx0XHRcdFx0ISh2aWV3Q29uZmlndXJhdGlvbiAmJiBwYWdlTWFuaWZlc3RTZXR0aW5ncy5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSkpLFxuXHRcdHZhcmlhbnRNYW5hZ2VtZW50OiB2YXJpYW50TWFuYWdlbWVudCA9PT0gXCJDb250cm9sXCIgJiYgIXAxM25Nb2RlID8gVmFyaWFudE1hbmFnZW1lbnRUeXBlLk5vbmUgOiB2YXJpYW50TWFuYWdlbWVudCxcblx0XHR0aHJlc2hvbGQ6IHRocmVzaG9sZCxcblx0XHRzb3J0Q29uZGl0aW9uczogZ2V0U29ydENvbmRpdGlvbnMoY29udmVydGVyQ29udGV4dCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIGNvbHVtbnMpLFxuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRzZWFyY2hhYmxlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlICE9PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmICEoaXNDb25zdGFudChpc1NlYXJjaGFibGUpICYmIGlzU2VhcmNoYWJsZS52YWx1ZSA9PT0gZmFsc2UpXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9nZXRFeHBvcnREYXRhVHlwZShkYXRhVHlwZTogc3RyaW5nLCBpc0NvbXBsZXhQcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcblx0bGV0IGV4cG9ydERhdGFUeXBlOiBzdHJpbmcgPSBcIlN0cmluZ1wiO1xuXHRpZiAoaXNDb21wbGV4UHJvcGVydHkpIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH0gZWxzZSB7XG5cdFx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdFx0Y2FzZSBcIkVkbS5EZWNpbWFsXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkludDMyXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVPZlRpbWVcIjpcblx0XHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlRpbWVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkJvb2xlYW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgdmlzdWFsaXphdGlvbiBwYXRoIGludG8gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgcGF0aCBhbmQgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGg6IHN0cmluZykge1xuXHRsZXQgW25hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGFubm90YXRpb25QYXRoXSA9IHZpc3VhbGl6YXRpb25QYXRoLnNwbGl0KFwiQFwiKTtcblxuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdC8vIERyb3AgdHJhaWxpbmcgc2xhc2hcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5zdWJzdHIoMCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggLSAxKTtcblx0fVxuXHRyZXR1cm4geyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24oXG5cdHNlbGVjdGlvblZhcmlhbnRQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKHNlbGVjdGlvblZhcmlhbnRQYXRoKTtcblx0Y29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb25WYXJpYW50VHlwZSA9IHJlc29sdmVkVGFyZ2V0LmFubm90YXRpb24gYXMgU2VsZWN0aW9uVmFyaWFudFR5cGU7XG5cblx0aWYgKHNlbGVjdGlvbikge1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gW107XG5cdFx0c2VsZWN0aW9uLlNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3QgUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWUudmFsdWU7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lcy5pbmRleE9mKFByb3BlcnR5UGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdHByb3BlcnR5TmFtZXMucHVzaChQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0ZXh0OiBzZWxlY3Rpb24/LlRleHQ/LnRvU3RyaW5nKCksXG5cdFx0XHRwcm9wZXJ0eU5hbWVzOiBwcm9wZXJ0eU5hbWVzXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlzSXBob25lOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0bGV0IGVuYWJsZUZ1bGxTY3JlZW4gPSB0YWJsZVNldHRpbmdzLmVuYWJsZUZ1bGxTY3JlZW4gPz8gaXNJcGhvbmU7XG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRpZiAoIWlzSXBob25lICYmIGVuYWJsZUZ1bGxTY3JlZW4gJiYgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQpIHtcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHR9XG5cdHJldHVybiBlbmFibGVGdWxsU2NyZWVuO1xufVxuXG5mdW5jdGlvbiBfZ2V0TXVsdGlTZWxlY3RNb2RlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAodGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRzd2l0Y2ggKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpIHtcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0OlxuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZTpcblx0XHRcdG11bHRpU2VsZWN0TW9kZSA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSBmYWxzZSA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkudXNlSWNvblRhYkJhcigpKSB7XG5cdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiQ2xlYXJBbGxcIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0fVxuXG5cdHJldHVybiBtdWx0aVNlbGVjdE1vZGU7XG59XG5cbmZ1bmN0aW9uIF9nZXRUYWJsZVR5cGUoXG5cdHRhYmxlU2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RTZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVUeXBlIHtcblx0bGV0IHRhYmxlVHlwZSA9IHRhYmxlU2V0dGluZ3M/LnR5cGUgfHwgXCJSZXNwb25zaXZlVGFibGVcIjtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiKSB7XG5cdFx0aWYgKHRhYmxlU2V0dGluZ3M/LnR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdHRhYmxlVHlwZSA9IFwiR3JpZFRhYmxlXCI7XG5cdFx0fVxuXHRcdGlmICghdGFibGVTZXR0aW5ncz8udHlwZSkge1xuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNEZXNrdG9wKCkgJiYgYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHR0YWJsZVR5cGUgPSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFibGVUeXBlID0gXCJSZXNwb25zaXZlVGFibGVcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhYmxlVHlwZTtcbn1cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJzKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLFxuXHRxdWlja1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0cGF0aDogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH0sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IGFueSB7XG5cdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRxdWlja0ZpbHRlclBhdGhzLnB1c2goeyBhbm5vdGF0aW9uUGF0aDogcGF0aC5hbm5vdGF0aW9uUGF0aCB9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHF1aWNrRmlsdGVyczoge1xuXHRcdFx0ZW5hYmxlZDpcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgPyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIiA6IHRydWUsXG5cdFx0XHRzaG93Q291bnRzOiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMsXG5cdFx0XHRwYXRoczogcXVpY2tGaWx0ZXJQYXRoc1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gX2dldEVuYWJsZUV4cG9ydChcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnRcblx0XHQ6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiIHx8IGVuYWJsZVBhc3RlO1xufVxuXG5mdW5jdGlvbiBfZ2V0RmlsdGVyQ29uZmlndXJhdGlvbihcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogYW55IHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRoczogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pO1xuXHRsZXQgcXVpY2tTZWxlY3Rpb25WYXJpYW50OiBhbnk7XG5cdGxldCBmaWx0ZXJzO1xuXHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdHF1aWNrU2VsZWN0aW9uVmFyaWFudCA9IHRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoXCJAXCIgKyBwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRmaWx0ZXJzID0gX2dldEZpbHRlcnModGFibGVTZXR0aW5ncywgcXVpY2tGaWx0ZXJQYXRocywgcXVpY2tTZWxlY3Rpb25WYXJpYW50LCBwYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fSk7XG5cblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKHF1aWNrU2VsZWN0aW9uVmFyaWFudCAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dCA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0Y29uc3QgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGNvbnN0IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCA9ICFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKTtcblx0Y29uc3QgZW5hYmxlUGFzdGUgPVxuXHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgIT09IHVuZGVmaW5lZCA/IHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgOiBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBcIk9iamVjdFBhZ2VcIjsgLy8gUGFzdGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBleGNlcHRlZCBmb3IgT1Bcblx0Y29uc3QgZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyID1cblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCA/IFwiQVBJLmRhdGFTdGF0ZUluZGljYXRvckZpbHRlclwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBvRmlsdGVyQ29uZmlndXJhdGlvbiA9IF9nZXRGaWx0ZXJDb25maWd1cmF0aW9uKHRhYmxlU2V0dGluZ3MsIGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdGNvbnN0IGNvbmRlbnNlZFRhYmxlTGF5b3V0ID0gdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCAhPT0gdW5kZWZpbmVkID8gdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCA6IGZhbHNlO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IF9nZXRUYWJsZVR5cGUodGFibGVTZXR0aW5ncywgYWdncmVnYXRpb25IZWxwZXIsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IHtcblx0XHRjcmVhdGVBdEVuZDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgOiB0cnVlLFxuXHRcdGNyZWF0aW9uTW9kZTogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgfHwgY3JlYXRpb25Nb2RlLFxuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyLFxuXHRcdC8vIGlmIGEgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkLCBpLmUuIHNldCB0byBmYWxzZVxuXHRcdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6ICFjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPyAhIXRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIDogZmFsc2UsXG5cdFx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBlbmFibGVBdXRvQ29sdW1uV2lkdGgsXG5cdFx0ZW5hYmxlRXhwb3J0OiBfZ2V0RW5hYmxlRXhwb3J0KHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIGVuYWJsZVBhc3RlKSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UodGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCwgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc1Bob25lKCkpLFxuXHRcdGVuYWJsZU1hc3NFZGl0OiB0YWJsZVNldHRpbmdzPy5lbmFibGVNYXNzRWRpdCxcblx0XHRlbmFibGVQYXN0ZTogZW5hYmxlUGFzdGUsXG5cdFx0aGVhZGVyVmlzaWJsZTogdHJ1ZSxcblx0XHRtdWx0aVNlbGVjdE1vZGU6IF9nZXRNdWx0aVNlbGVjdE1vZGUodGFibGVTZXR0aW5ncywgdGFibGVUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRzZWxlY3Rpb25MaW1pdDogdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IHRydWUgfHwgdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCA9PT0gMCA/IDAgOiB0YWJsZVNldHRpbmdzLnNlbGVjdGlvbkxpbWl0IHx8IDIwMCxcblxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHR0eXBlOiB0YWJsZVR5cGUsXG5cdFx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGNvbmRlbnNlZFRhYmxlTGF5b3V0ICYmIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0fTtcblxuXHRyZXR1cm4geyAuLi5vQ29uZmlndXJhdGlvbiwgLi4ub0ZpbHRlckNvbmZpZ3VyYXRpb24gfTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnRhcmdldFR5cGUgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZT8uX3R5cGUgPT09IFwiVHlwZURlZmluaXRpb25cIikge1xuXHRcdG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1soKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBUeXBlRGVmaW5pdGlvbikudW5kZXJseWluZ1R5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZz8udHlwZSxcblx0XHRjb25zdHJhaW50czoge30sXG5cdFx0Zm9ybWF0T3B0aW9uczoge31cblx0fTtcblx0aWYgKGlzUHJvcGVydHkob1Byb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cyA9IHtcblx0XHRcdHNjYWxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFNjYWxlID8gb1Byb3BlcnR5LnNjYWxlIDogdW5kZWZpbmVkLFxuXHRcdFx0cHJlY2lzaW9uOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFByZWNpc2lvbiA/IG9Qcm9wZXJ0eS5wcmVjaXNpb24gOiB1bmRlZmluZWQsXG5cdFx0XHRtYXhMZW5ndGg6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTWF4TGVuZ3RoID8gb1Byb3BlcnR5Lm1heExlbmd0aCA6IHVuZGVmaW5lZCxcblx0XHRcdG51bGxhYmxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE51bGxhYmxlID8gb1Byb3BlcnR5Lm51bGxhYmxlIDogdW5kZWZpbmVkLFxuXHRcdFx0bWluaW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4aW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0aXNEaWdpdFNlcXVlbmNlOlxuXHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIl0gJiZcblx0XHRcdFx0KG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG4iXX0=