@sapui5/sap.fe.macros 1.105.1 → 1.107.1

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 (236) hide show
  1. package/package.json +3 -3
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/CommonHelper.js +62 -14
  4. package/src/sap/fe/macros/CommonHelper.ts +61 -15
  5. package/src/sap/fe/macros/ODataMetaModelUtil.js +33 -4
  6. package/src/sap/fe/macros/ODataMetaModelUtil.ts +31 -3
  7. package/src/sap/fe/macros/{Chart.fragment.xml → chart/Chart.fragment.xml} +18 -17
  8. package/src/sap/fe/macros/chart/Chart.metadata.js +403 -0
  9. package/src/sap/fe/macros/chart/Chart.metadata.ts +387 -0
  10. package/src/sap/fe/macros/{ChartAPI.js → chart/ChartAPI.js} +3 -3
  11. package/src/sap/fe/macros/{ChartAPI.ts → chart/ChartAPI.ts} +2 -2
  12. package/src/sap/fe/macros/chart/ChartDelegate.js +520 -0
  13. package/src/sap/fe/macros/{ChartDelegate.ts → chart/ChartDelegate.ts} +5 -5
  14. package/src/sap/fe/macros/chart/ChartHelper.js +61 -65
  15. package/src/sap/fe/macros/chart/ChartHelper.ts +64 -63
  16. package/src/sap/fe/macros/contact/Contact.designtime.js +88 -0
  17. package/src/sap/fe/macros/contact/Contact.designtime.ts +79 -0
  18. package/src/sap/fe/macros/{Contact.fragment.xml → contact/Contact.fragment.xml} +0 -0
  19. package/src/sap/fe/macros/contact/Contact.metadata.js +77 -0
  20. package/src/sap/fe/macros/contact/Contact.metadata.ts +81 -0
  21. package/src/sap/fe/macros/{ContactHelper.js → contact/ContactHelper.js} +0 -0
  22. package/src/sap/fe/macros/{ContactHelper.ts → contact/ContactHelper.ts} +0 -0
  23. package/src/sap/fe/macros/{DraftIndicator.fragment.xml → draftIndicator/DraftIndicator.fragment.xml} +2 -2
  24. package/src/sap/fe/macros/draftIndicator/DraftIndicator.metadata.js +84 -0
  25. package/src/sap/fe/macros/draftIndicator/DraftIndicator.metadata.ts +86 -0
  26. package/src/sap/fe/macros/{DraftIndicatorRuntime.js → draftIndicator/DraftIndicatorRuntime.js} +0 -0
  27. package/src/sap/fe/macros/{DraftIndicatorRuntime.ts → draftIndicator/DraftIndicatorRuntime.ts} +0 -0
  28. package/src/sap/fe/macros/{FlexibleColumnLayoutActions.fragment.xml → fcl/FlexibleColumnLayoutActions.fragment.xml} +0 -0
  29. package/src/sap/fe/macros/fcl/FlexibleColumnLayoutActions.metadata.js +60 -0
  30. package/src/sap/fe/macros/fcl/FlexibleColumnLayoutActions.metadata.ts +49 -0
  31. package/src/sap/fe/macros/field/DraftPopOverAdminData.fragment.xml +4 -6
  32. package/src/sap/fe/macros/field/Field.metadata.js +159 -0
  33. package/src/sap/fe/macros/{Field.metadata.ts → field/Field.metadata.ts} +2 -2
  34. package/src/sap/fe/macros/field/FieldAPI.js +291 -0
  35. package/src/sap/fe/macros/{FieldAPI.ts → field/FieldAPI.ts} +2 -2
  36. package/src/sap/fe/macros/field/FieldBaseDelegate.js +138 -0
  37. package/src/sap/fe/macros/{FieldBaseDelegate.ts → field/FieldBaseDelegate.ts} +47 -7
  38. package/src/sap/fe/macros/field/FieldHelper.js +56 -96
  39. package/src/sap/fe/macros/field/FieldHelper.ts +76 -125
  40. package/src/sap/fe/macros/field/FieldRuntime.js +3 -3
  41. package/src/sap/fe/macros/field/FieldRuntime.ts +2 -2
  42. package/src/sap/fe/macros/field/FieldTemplating.js +9 -14
  43. package/src/sap/fe/macros/field/FieldTemplating.ts +15 -21
  44. package/src/sap/fe/macros/{FieldValueHelpDelegate.js → field/FieldValueHelpDelegate.js} +0 -0
  45. package/src/sap/fe/macros/{FieldValueHelpDelegate.ts → field/FieldValueHelpDelegate.ts} +0 -0
  46. package/src/sap/fe/macros/{Field.fragment.xml → field/PublicField.fragment.xml} +10 -10
  47. package/src/sap/fe/macros/field/QuickViewLinkContactContent.fragment.xml +25 -7
  48. package/src/sap/fe/macros/field/QuickViewLinkDelegate.js +134 -71
  49. package/src/sap/fe/macros/field/QuickViewLinkDelegate.ts +105 -44
  50. package/src/sap/fe/macros/field/QuickViewLinkForContact.fragment.xml +2 -2
  51. package/src/sap/fe/macros/field/QuickViewLinkForDataField.fragment.xml +7 -13
  52. package/src/sap/fe/macros/field/QuickViewLinkForEntity.fragment.xml +1 -1
  53. package/src/sap/fe/macros/field/QuickViewLinkWithFacets.fragment.xml +5 -6
  54. package/src/sap/fe/macros/filter/FilterFieldHelper.js +7 -11
  55. package/src/sap/fe/macros/filter/FilterFieldHelper.ts +7 -8
  56. package/src/sap/fe/macros/filter/FilterUtils.js +77 -38
  57. package/src/sap/fe/macros/filter/FilterUtils.ts +45 -28
  58. package/src/sap/fe/macros/filterBar/FilterBar.designtime.js +79 -0
  59. package/src/sap/fe/macros/filterBar/FilterBar.designtime.ts +69 -0
  60. package/src/sap/fe/macros/{FilterBar.fragment.xml → filterBar/FilterBar.fragment.xml} +7 -6
  61. package/src/sap/fe/macros/filterBar/FilterBar.metadata.js +349 -0
  62. package/src/sap/fe/macros/filterBar/FilterBar.metadata.ts +350 -0
  63. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +180 -0
  64. package/src/sap/fe/macros/{FilterBarAPI.ts → filterBar/FilterBarAPI.ts} +14 -2
  65. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +695 -0
  66. package/src/sap/fe/macros/{FilterBarDelegate.ts → filterBar/FilterBarDelegate.ts} +80 -4
  67. package/src/sap/fe/macros/{Form.designtime.js → form/Form.designtime.js} +0 -0
  68. package/src/sap/fe/macros/{Form.designtime.ts → form/Form.designtime.ts} +0 -0
  69. package/src/sap/fe/macros/{FormAPI.js → form/FormAPI.js} +3 -3
  70. package/src/sap/fe/macros/{FormAPI.ts → form/FormAPI.ts} +2 -2
  71. package/src/sap/fe/macros/form/FormBuildingBlock.js +56 -20
  72. package/src/sap/fe/macros/form/FormBuildingBlock.ts +76 -32
  73. package/src/sap/fe/macros/{FormContainer.designtime.js → form/FormContainer.designtime.js} +0 -0
  74. package/src/sap/fe/macros/{FormContainer.designtime.ts → form/FormContainer.designtime.ts} +0 -0
  75. package/src/sap/fe/macros/{FormContainer.fragment.xml → form/FormContainer.fragment.xml} +18 -7
  76. package/src/sap/fe/macros/{FormContainerAPI.js → form/FormContainerAPI.js} +5 -5
  77. package/src/sap/fe/macros/{FormContainerAPI.ts → form/FormContainerAPI.ts} +4 -4
  78. package/src/sap/fe/macros/form/FormContainerBuildingBlock.js +4 -4
  79. package/src/sap/fe/macros/form/FormContainerBuildingBlock.ts +3 -3
  80. package/src/sap/fe/macros/form/FormDelegate.js +301 -0
  81. package/src/sap/fe/macros/form/FormDelegate.ts +293 -0
  82. package/src/sap/fe/macros/form/FormElement.fragment.xml +19 -36
  83. package/src/sap/fe/macros/form/FormElement.metadata.js +133 -0
  84. package/src/sap/fe/macros/{FormElement.metadata.ts → form/FormElement.metadata.ts} +4 -7
  85. package/src/sap/fe/macros/form/FormElementFlexibility.fragment.xml +44 -0
  86. package/src/sap/fe/macros/form/ValueHelpWrapper.fragment.xml +13 -0
  87. package/src/sap/fe/macros/fpm/CustomFragment.metadata.js +58 -63
  88. package/src/sap/fe/macros/fpm/CustomFragment.metadata.ts +63 -0
  89. package/src/sap/fe/macros/fpm/CustomSection.metadata.js +68 -72
  90. package/src/sap/fe/macros/fpm/CustomSection.metadata.ts +72 -0
  91. package/src/sap/fe/macros/internal/CollectionField.metadata.js +1 -1
  92. package/src/sap/fe/macros/internal/CollectionField.metadata.ts +1 -1
  93. package/src/sap/fe/macros/internal/DataPoint.fragment.xml +4 -13
  94. package/src/sap/fe/macros/internal/DataPoint.metadata.js +3 -5
  95. package/src/sap/fe/macros/internal/DataPoint.metadata.ts +10 -9
  96. package/src/sap/fe/macros/internal/Field.designtime.js +823 -806
  97. package/src/sap/fe/macros/internal/Field.designtime.ts +797 -0
  98. package/src/sap/fe/macros/internal/Field.fragment.xml +3 -3
  99. package/src/sap/fe/macros/internal/Field.metadata.js +141 -29
  100. package/src/sap/fe/macros/internal/Field.metadata.ts +188 -33
  101. package/src/sap/fe/macros/internal/FilterField.designtime.js +341 -0
  102. package/src/sap/fe/macros/internal/FilterField.designtime.ts +325 -0
  103. package/src/sap/fe/macros/internal/FilterField.fragment.xml +1 -1
  104. package/src/sap/fe/macros/internal/FilterField.metadata.js +118 -119
  105. package/src/sap/fe/macros/internal/FilterField.metadata.ts +126 -0
  106. package/src/sap/fe/macros/internal/collectionField/MultiValueFieldDelegate.js +4 -7
  107. package/src/sap/fe/macros/internal/collectionField/MultiValueFieldDelegate.ts +4 -6
  108. package/src/sap/fe/macros/internal/field/FieldStructure.fragment.xml +0 -1
  109. package/src/sap/fe/macros/internal/field/displayStyle/Avatar.fragment.xml +9 -46
  110. package/src/sap/fe/macros/internal/field/displayStyle/LabelSemanticKey.fragment.xml +1 -0
  111. package/src/sap/fe/macros/internal/field/displayStyle/Link.fragment.xml +10 -1
  112. package/src/sap/fe/macros/internal/field/displayStyle/LinkWithQuickViewForm.fragment.xml +4 -2
  113. package/src/sap/fe/macros/internal/field/displayStyle/LinkWrapper.fragment.xml +12 -3
  114. package/src/sap/fe/macros/internal/field/displayStyle/ObjectStatus.fragment.xml +4 -0
  115. package/src/sap/fe/macros/internal/field/displayStyle/SemanticKeyWithDraftIndicator.fragment.xml +12 -26
  116. package/src/sap/fe/macros/internal/field/displayStyle/Text.fragment.xml +12 -1
  117. package/src/sap/fe/macros/internal/field/editStyle/InputWithValueHelp.fragment.xml +4 -4
  118. package/src/sap/fe/macros/internal/field/fragments/ObjectIdentifierContent.fragment.xml +12 -6
  119. package/src/sap/fe/macros/internal/form/FormTemplating.js +3 -2
  120. package/src/sap/fe/macros/internal/form/FormTemplating.ts +2 -2
  121. package/src/sap/fe/macros/internal/helpers/DefaultActionHandler.js +132 -0
  122. package/src/sap/fe/macros/internal/helpers/DefaultActionHandler.ts +128 -0
  123. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +2 -2
  124. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +1 -1
  125. package/src/sap/fe/macros/internal/valuehelp/ValueHelp.designtime.js +472 -462
  126. package/src/sap/fe/macros/internal/valuehelp/ValueHelp.designtime.ts +452 -0
  127. package/src/sap/fe/macros/internal/valuehelp/ValueHelpContentNew.fragment.xml +18 -15
  128. package/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.js +12 -5
  129. package/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.ts +13 -7
  130. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  131. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +19 -4
  132. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +16 -4
  133. package/src/sap/fe/macros/internal/valuehelp/ValueListHelperNew.js +57 -27
  134. package/src/sap/fe/macros/internal/valuehelp/ValueListHelperNew.ts +69 -26
  135. package/src/sap/fe/macros/{KPITag.fragment.xml → kpiTag/KPITag.fragment.xml} +3 -4
  136. package/src/sap/fe/macros/kpiTag/KPITag.metadata.js +102 -0
  137. package/src/sap/fe/macros/{KPITag.metadata.ts → kpiTag/KPITag.metadata.ts} +2 -2
  138. package/src/sap/fe/macros/library.js +3 -4
  139. package/src/sap/fe/macros/library.ts +0 -7
  140. package/src/sap/fe/macros/macroLibrary.js +39 -120
  141. package/src/sap/fe/macros/macroLibrary.ts +89 -0
  142. package/src/sap/fe/macros/microchart/MicroChart.designtime.js +365 -0
  143. package/src/sap/fe/macros/microchart/MicroChart.designtime.ts +348 -0
  144. package/src/sap/fe/macros/{MicroChart.fragment.xml → microchart/MicroChart.fragment.xml} +0 -0
  145. package/src/sap/fe/macros/microchart/MicroChart.metadata.js +158 -0
  146. package/src/sap/fe/macros/microchart/MicroChart.metadata.ts +138 -0
  147. package/src/sap/fe/macros/microchart/fragments/ComparisonMicroChart.fragment.xml +7 -7
  148. package/src/sap/fe/macros/{Paginator.fragment.xml → paginator/Paginator.fragment.xml} +0 -0
  149. package/src/sap/fe/macros/paginator/Paginator.metadata.js +63 -0
  150. package/src/sap/fe/macros/paginator/Paginator.metadata.ts +52 -0
  151. package/src/sap/fe/macros/quickView/QuickViewForm.designtime.js +214 -0
  152. package/src/sap/fe/macros/quickView/QuickViewForm.designtime.ts +201 -0
  153. package/src/sap/fe/macros/{QuickViewForm.fragment.xml → quickView/QuickViewForm.fragment.xml} +4 -4
  154. package/src/sap/fe/macros/quickView/QuickViewForm.metadata.js +162 -0
  155. package/src/sap/fe/macros/{QuickViewForm.metadata.ts → quickView/QuickViewForm.metadata.ts} +8 -4
  156. package/src/sap/fe/macros/{Share.fragment.xml → share/Share.fragment.xml} +0 -2
  157. package/src/sap/fe/macros/share/Share.metadata.js +95 -0
  158. package/src/sap/fe/macros/share/Share.metadata.ts +82 -0
  159. package/src/sap/fe/macros/{internal/situations → situations}/SituationsIndicator.fragment.js +3 -3
  160. package/src/sap/fe/macros/{internal/situations → situations}/SituationsIndicator.fragment.ts +2 -2
  161. package/src/sap/fe/macros/situations/SituationsPopover.js +235 -0
  162. package/src/sap/fe/macros/{internal/situations → situations}/SituationsPopover.ts +1 -1
  163. package/src/sap/fe/macros/{internal/situations → situations}/SituationsText.js +0 -0
  164. package/src/sap/fe/macros/{internal/situations → situations}/SituationsText.ts +0 -0
  165. package/src/sap/fe/macros/table/Actions.fragment.xml +74 -61
  166. package/src/sap/fe/macros/table/Column.fragment.xml +1 -1
  167. package/src/sap/fe/macros/table/ColumnContent.fragment.xml +30 -18
  168. package/src/sap/fe/macros/table/Columns.fragment.xml +1 -13
  169. package/src/sap/fe/macros/table/QuickFilterContainer.js +17 -3
  170. package/src/sap/fe/macros/table/QuickFilterContainer.ts +15 -2
  171. package/src/sap/fe/macros/table/SlotColumn.fragment.xml +21 -0
  172. package/src/sap/fe/macros/table/Table.fragment.xml +220 -235
  173. package/src/sap/fe/macros/table/Table.metadata.js +699 -0
  174. package/src/sap/fe/macros/table/Table.metadata.ts +659 -0
  175. package/src/sap/fe/macros/table/TableAPI.js +759 -0
  176. package/src/sap/fe/macros/{TableAPI.ts → table/TableAPI.ts} +37 -40
  177. package/src/sap/fe/macros/table/TableHelper.js +148 -157
  178. package/src/sap/fe/macros/table/TableHelper.ts +157 -212
  179. package/src/sap/fe/macros/table/TableSizeHelper.js +193 -0
  180. package/src/sap/fe/macros/{SizeHelper.ts → table/TableSizeHelper.ts} +7 -7
  181. package/src/sap/fe/macros/table/Utils.js +2 -2
  182. package/src/sap/fe/macros/table/Utils.ts +2 -2
  183. package/src/sap/fe/macros/table/delegates/ALPTableDelegateBaseMixin.js +5 -10
  184. package/src/sap/fe/macros/table/delegates/ALPTableDelegateBaseMixin.ts +3 -6
  185. package/src/sap/fe/macros/table/delegates/TableDelegate.js +86 -57
  186. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +119 -52
  187. package/src/sap/fe/macros/valuehelp/ValueHelp.metadata.js +136 -0
  188. package/src/sap/fe/macros/valuehelp/ValueHelp.metadata.ts +138 -0
  189. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +426 -0
  190. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +358 -0
  191. package/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.designtime.js +76 -79
  192. package/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.designtime.ts +70 -0
  193. package/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.fragment.xml +1 -1
  194. package/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata.js +184 -211
  195. package/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata.ts +199 -0
  196. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +53 -13
  197. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.ts +51 -13
  198. package/src/sap/fe/macros/{VisualFilter.fragment.xml → visualfilters/VisualFilter.fragment.xml} +0 -0
  199. package/src/sap/fe/macros/visualfilters/VisualFilter.metadata.js +299 -0
  200. package/src/sap/fe/macros/visualfilters/VisualFilter.metadata.ts +316 -0
  201. package/src/sap/fe/macros/visualfilters/fragments/InteractiveBarChart.fragment.xml +49 -50
  202. package/src/sap/fe/macros/visualfilters/fragments/InteractiveLineChart.fragment.xml +48 -50
  203. package/src/sap/fe/macros/Chart.metadata.js +0 -241
  204. package/src/sap/fe/macros/ChartDelegate.js +0 -518
  205. package/src/sap/fe/macros/Contact.designtime.js +0 -93
  206. package/src/sap/fe/macros/Contact.metadata.js +0 -88
  207. package/src/sap/fe/macros/DraftIndicator.metadata.js +0 -93
  208. package/src/sap/fe/macros/Field.metadata.js +0 -159
  209. package/src/sap/fe/macros/FieldAPI.js +0 -291
  210. package/src/sap/fe/macros/FieldBaseDelegate.js +0 -80
  211. package/src/sap/fe/macros/FilterBar.designtime.js +0 -83
  212. package/src/sap/fe/macros/FilterBar.metadata.js +0 -375
  213. package/src/sap/fe/macros/FilterBarAPI.js +0 -165
  214. package/src/sap/fe/macros/FilterBarDelegate.js +0 -557
  215. package/src/sap/fe/macros/FilterField.designtime.js +0 -339
  216. package/src/sap/fe/macros/FlexibleColumnLayoutActions.metadata.js +0 -65
  217. package/src/sap/fe/macros/FormElement.fragment.xml +0 -25
  218. package/src/sap/fe/macros/FormElement.metadata.js +0 -132
  219. package/src/sap/fe/macros/KPITag.metadata.js +0 -102
  220. package/src/sap/fe/macros/MicroChart.designtime.js +0 -361
  221. package/src/sap/fe/macros/MicroChart.metadata.js +0 -145
  222. package/src/sap/fe/macros/Paginator.metadata.js +0 -60
  223. package/src/sap/fe/macros/QuickViewForm.designtime.js +0 -215
  224. package/src/sap/fe/macros/QuickViewForm.metadata.js +0 -158
  225. package/src/sap/fe/macros/Share.metadata.js +0 -89
  226. package/src/sap/fe/macros/SizeHelper.js +0 -193
  227. package/src/sap/fe/macros/Table.metadata.js +0 -674
  228. package/src/sap/fe/macros/TableAPI.js +0 -757
  229. package/src/sap/fe/macros/ValueHelp.metadata.js +0 -148
  230. package/src/sap/fe/macros/ValueHelpDelegate.js +0 -580
  231. package/src/sap/fe/macros/ValueHelpDelegate.ts +0 -355
  232. package/src/sap/fe/macros/VisualFilter.metadata.js +0 -297
  233. package/src/sap/fe/macros/flexibility/FormDelegate.js +0 -148
  234. package/src/sap/fe/macros/flexibility/FormDelegate.ts +0 -121
  235. package/src/sap/fe/macros/flexibility/ValueHelpWrapper.fragment.xml +0 -3
  236. package/src/sap/fe/macros/internal/situations/SituationsPopover.js +0 -235
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.macros",
3
- "version": "1.105.1",
3
+ "version": "1.107.1",
4
4
  "description": "SAPUI5 Library sap.fe.macros",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "SAP SE (https://www.sap.com)",
7
7
  "homepage": "https://sap.github.io/ui5-tooling/pages/SAPUI5/",
8
8
  "scripts": {
9
9
  "build": "echo 'nothing to do'",
10
- "lint": "eslint --rulesdir ../../eslint/lib/rules --ext .js,.ts --quiet --fix src",
10
+ "lint": "eslint --ext .js,.ts --quiet --fix src",
11
11
  "prepare-npm-sources": "babel target/npm-sources/src --out-dir target/npm-sources/src --extensions \".ts,.tsx\" --config-file ../../.babelrc && babel target/npm-sources/src --out-dir target/npm-sources/src --extensions \".mdx\" --config-file ../../.babelrc-next",
12
- "prepare-ts-class-doc": "ts-node ../../docbuilder/prepareTSClassDoc sap.fe.macros",
12
+ "prepare-ts-class-doc": "ts-node ../../lib/docbuilder/prepareTSClassDoc sap.fe.macros",
13
13
  "prepare-ui5-build-sources": "babel target/ui5-build-tmp/src --out-dir target/ui5-build-tmp/src --extensions \".ts,.tsx\" --config-file ../../.babelrc && babel target/ui5-build-tmp/src --out-dir target/ui5-build-tmp/src --extensions \".mdx\" --config-file ../../.babelrc-next && babel target/ui5-build-tmp/test --out-dir target/ui5-build-tmp/test --extensions \".ts,.tsx\" --config-file ../../.babelrc && babel target/ui5-build-tmp/test --out-dir target/ui5-build-tmp/test --extensions \".mdx\" --config-file ../../.babelrc-next",
14
14
  "test": "jest --maxWorkers=4",
15
15
  "test-refs": "jest --runInBand --config jest.config-refs.js",
@@ -6,7 +6,7 @@
6
6
  <copyright>SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.105.1</version>
9
+ <version>1.107.1</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.macros</documentation>
12
12
 
@@ -530,20 +530,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
530
530
  /**
531
531
  * Returns a stringified JSON object containing Presentation Variant sort conditions.
532
532
  *
533
+ * @param oContext
533
534
  * @param oPresentationVariant Presentation variant Annotation
534
535
  * @param sPresentationVariantPath
535
536
  * @returns Stringified JSON object
536
537
  */
537
- getSortConditions: function (oPresentationVariant, sPresentationVariantPath) {
538
- if (oPresentationVariant && this._isPresentationVariantAnnotation(sPresentationVariantPath) && oPresentationVariant.SortOrder) {
538
+ getSortConditions: function (oContext, oPresentationVariant, sPresentationVariantPath) {
539
+ if (oPresentationVariant && CommonHelper._isPresentationVariantAnnotation(sPresentationVariantPath) && oPresentationVariant.SortOrder) {
539
540
  var aSortConditions = {
540
541
  sorters: []
541
542
  };
542
- oPresentationVariant.SortOrder.forEach(function (oCondition) {
543
+ var sEntityPath = oContext.getPath(0).split("@")[0];
544
+ oPresentationVariant.SortOrder.forEach(function () {
545
+ var oCondition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
546
+ var oSortProperty = {};
543
547
  var oSorter = {};
544
- oSorter.name = oCondition.Property.$PropertyPath;
545
- oSorter.descending = !!oCondition.Descending;
546
- aSortConditions.sorters.push(oSorter);
548
+
549
+ if (oCondition.DynamicProperty) {
550
+ var _oContext$getModel$ge;
551
+
552
+ oSortProperty = (_oContext$getModel$ge = oContext.getModel(0).getObject(sEntityPath + oCondition.DynamicProperty.$AnnotationPath)) === null || _oContext$getModel$ge === void 0 ? void 0 : _oContext$getModel$ge.Name;
553
+ } else if (oCondition.Property) {
554
+ oSortProperty = oCondition.Property.$PropertyPath;
555
+ }
556
+
557
+ if (oSortProperty) {
558
+ oSorter.name = oSortProperty;
559
+ oSorter.descending = !!oCondition.Descending;
560
+ aSortConditions.sorters.push(oSorter);
561
+ } else {
562
+ throw new Error("Please define the right path to the sort property");
563
+ }
547
564
  });
548
565
  return JSON.stringify(aSortConditions);
549
566
  }
@@ -572,7 +589,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
572
589
  if (oDataField.RequiresContext && !oDataField.Inline && bNavigateWithConfirmationDialog) {
573
590
  mNavigationParameters.applicableContexts = "${internal>ibn/" + oDataField.SemanticObject + "-" + oDataField.Action + "/aApplicable/}";
574
591
  mNavigationParameters.notApplicableContexts = "${internal>ibn/" + oDataField.SemanticObject + "-" + oDataField.Action + "/aNotApplicable/}";
575
- mNavigationParameters.label = "'" + oDataField.Label + "'";
592
+ mNavigationParameters.label = this.addSingleQuotes(oDataField.Label, true);
576
593
  }
577
594
 
578
595
  if (oDataField.Mapping) {
@@ -734,16 +751,31 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
734
751
  * @private
735
752
  */
736
753
  getMeasureAttributeIndex: function (iMeasure, oChartAnnotations) {
737
- var aMeasures = oChartAnnotations.Measures;
754
+ var _oChartAnnotations$Dy;
755
+
756
+ var aMeasures, sMeasurePropertyPath;
757
+
758
+ if (oChartAnnotations.Measures.length > 0) {
759
+ aMeasures = oChartAnnotations.Measures;
760
+ sMeasurePropertyPath = aMeasures[iMeasure].$PropertyPath;
761
+ } else if ((oChartAnnotations === null || oChartAnnotations === void 0 ? void 0 : (_oChartAnnotations$Dy = oChartAnnotations.DynamicMeasures) === null || _oChartAnnotations$Dy === void 0 ? void 0 : _oChartAnnotations$Dy.length) > 0) {
762
+ aMeasures = oChartAnnotations.DynamicMeasures;
763
+ sMeasurePropertyPath = aMeasures[iMeasure].$AnnotationPath;
764
+ }
765
+
738
766
  var bMeasureAttributeExists;
739
767
  var aMeasureAttributes = oChartAnnotations.MeasureAttributes;
740
- var sMeasurePropertyPath = aMeasures && aMeasures[iMeasure] && aMeasures[iMeasure].$PropertyPath;
741
768
  var iMeasureAttribute = -1;
742
769
 
743
- var fnCheckMeasure = function (sMeasure, oMeasureAttribute, index) {
744
- if ((oMeasureAttribute && oMeasureAttribute.Measure && oMeasureAttribute.Measure.$PropertyPath) === sMeasure) {
745
- iMeasureAttribute = index;
746
- return true;
770
+ var fnCheckMeasure = function (sMeasurePath, oMeasureAttribute, index) {
771
+ if (oMeasureAttribute) {
772
+ if (oMeasureAttribute.Measure && oMeasureAttribute.Measure.$PropertyPath === sMeasurePath) {
773
+ iMeasureAttribute = index;
774
+ return true;
775
+ } else if (oMeasureAttribute.DynamicMeasure && oMeasureAttribute.DynamicMeasure.$AnnotationPath === sMeasurePath) {
776
+ iMeasureAttribute = index;
777
+ return true;
778
+ }
747
779
  }
748
780
  };
749
781
 
@@ -753,6 +785,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
753
785
 
754
786
  return bMeasureAttributeExists && iMeasureAttribute > -1 && iMeasureAttribute;
755
787
  },
788
+ getMeasureAttribute: function (oContext) {
789
+ var oMetaModel = oContext.getModel(),
790
+ sChartAnnotationPath = oContext.getPath();
791
+ return oMetaModel.requestObject(sChartAnnotationPath).then(function (oChartAnnotations) {
792
+ var aMeasureAttributes = oChartAnnotations.MeasureAttributes,
793
+ iMeasureAttribute = CommonHelper.getMeasureAttributeIndex(0, oChartAnnotations);
794
+ var sMeasureAttributePath = iMeasureAttribute > -1 && aMeasureAttributes[iMeasureAttribute] && aMeasureAttributes[iMeasureAttribute].DataPoint ? "".concat(sChartAnnotationPath, "MeasureAttributes/").concat(iMeasureAttribute, "/") : undefined;
795
+
796
+ if (sMeasureAttributePath === undefined) {
797
+ Log.warning("DataPoint missing for the measure");
798
+ }
799
+
800
+ return sMeasureAttributePath ? "".concat(sMeasureAttributePath, "DataPoint/$AnnotationPath/") : sMeasureAttributePath;
801
+ });
802
+ },
756
803
 
757
804
  /**
758
805
  * This function returns the measureAttribute for the measure.
@@ -944,6 +991,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
944
991
  };
945
992
  CommonHelper.isPropertyFilterable.requiresIContext = true;
946
993
  CommonHelper.getPopoverText.requiresIContext = true;
994
+ CommonHelper.getSortConditions.requiresIContext = true;
947
995
  return CommonHelper;
948
996
  }, false);
949
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWx1ZUNvbG9yIiwibUxpYnJhcnkiLCJDb21tb25IZWxwZXIiLCJ1c2VGaWVsZFZhbHVlSGVscCIsImxvY2F0aW9uIiwiaHJlZiIsImluZGV4T2YiLCJnZXRQYXRoVG9LZXkiLCJvQ3R4IiwiZ2V0T2JqZWN0IiwiaXNWaXNpYmxlIiwidGFyZ2V0Iiwib0ludGVyZmFjZSIsIm9Nb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsInNQcm9wZXJ0eVBhdGgiLCJnZXRQYXRoIiwib0Fubm90YXRpb25zIiwiaGlkZGVuIiwiJFBhdGgiLCJpc0RpYWxvZyIsIm9BY3Rpb25Db250ZXh0IiwiaXNDcml0aWNhbCIsIm9BY3Rpb24iLCJBcnJheSIsImlzQXJyYXkiLCIkUGFyYW1ldGVyIiwibGVuZ3RoIiwiZ2V0UGFyYW1ldGVyRWRpdE1vZGUiLCJmaWVsZENvbnRyb2wiLCJpbW11dGFibGUiLCJjb21wdXRlZCIsInNFZGl0TW9kZSIsIkVkaXRNb2RlIiwiRWRpdGFibGUiLCJSZWFkT25seSIsIiRFbnVtTWVtYmVyIiwiRGlzYWJsZWQiLCJnZXRNZXRhUGF0aCIsInVuZGVmaW5lZCIsImlzRGVza3RvcCIsInN5c3RlbSIsImRlc2t0b3AiLCJnZXRUYXJnZXRDb2xsZWN0aW9uIiwib0NvbnRleHQiLCJuYXZDb2xsZWN0aW9uIiwic1BhdGgiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRNZXRhTW9kZWwiLCJhUGFydHMiLCJzcGxpdCIsImZpbHRlciIsInNQYXJ0IiwiZW50aXR5U2V0IiwibmF2aWdhdGlvbkNvbGxlY3Rpb24iLCJzbGljZSIsImpvaW4iLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsInByb3BlcnR5Iiwib0RhdGFGaWVsZCIsInNQcm9wZXJ0eUxvY2F0aW9uUGF0aCIsImdldExvY2F0aW9uRm9yUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5IiwicmVwbGFjZSIsIiRUeXBlIiwiQ29tbW9uVXRpbHMiLCJpTGVuZ3RoIiwic0NvbGxlY3Rpb25QYXRoIiwibGFzdEluZGV4T2YiLCJnb3RvQWN0aW9uUGFyYW1ldGVyIiwic1Byb3BlcnR5TmFtZSIsImdldFBhcmFtZXRlclBhdGgiLCJnZXRFbnRpdHlTZXROYW1lIiwib01ldGFNb2RlbCIsInNFbnRpdHlUeXBlIiwib0VudGl0eUNvbnRhaW5lciIsImtleSIsImdldEFjdGlvblBhdGgiLCJiUmV0dXJuT25seVBhdGgiLCJzQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0NvbnRleHRQYXRoIiwic0VudGl0eVR5cGVOYW1lIiwic0VudGl0eU5hbWUiLCJzQmluZGluZ1BhcmFtZXRlciIsImdldE5hdmlnYXRpb25Db250ZXh0IiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImJLZWVwUHJvcGVydHkiLCJiU3RhcnRzV2l0aEVudGl0eVR5cGUiLCJzdGFydHNXaXRoIiwicGFydCIsInNoaWZ0IiwicG9wIiwiZ2V0QWN0aW9uQ29udGV4dCIsImdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWQiLCJhZGRTaW5nbGVRdW90ZXMiLCJzVmFsdWUiLCJiRXNjYXBlIiwiZXNjYXBlU2luZ2xlUXVvdGVzIiwiZ2VuZXJhdGVGdW5jdGlvbiIsInNGdW5jTmFtZSIsInNQYXJhbXMiLCJpIiwic0Z1bmN0aW9uIiwiZ2V0SGVhZGVyRGF0YVBvaW50TGlua1Zpc2liaWxpdHkiLCJiTGluayIsImJGaWVsZFZpc2liaWxpdHkiLCJzVmlzaWJpbGl0eUV4cCIsIm9iamVjdFRvU3RyaW5nIiwib1BhcmFtcyIsImlOdW1iZXJPZktleXMiLCJPYmplY3QiLCJrZXlzIiwic0tleSIsInJlbW92ZUVzY2FwZUNoYXJhY3RlcnMiLCJzRXhwcmVzc2lvbiIsInN0cmluZ2lmeU9iamVjdCIsInNTdHJpbmdpZmllZCIsIm9PYmplY3QiLCJKU09OIiwicGFyc2UiLCJvVUk1T2JqZWN0IiwidWk1b2JqZWN0IiwiYXNzaWduIiwic3RyaW5naWZ5Iiwic1R5cGUiLCJMb2ciLCJlcnJvciIsIkVycm9yIiwic3RyaW5naWZ5Q3VzdG9tRGF0YSIsInZEYXRhIiwiQ29udGV4dCIsInBhcnNlQ3VzdG9tRGF0YSIsImhhc093blByb3BlcnR5IiwiX2dldERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZSIsInJlcXVlc3RPYmplY3QiLCJnZXRQb3BvdmVyVGV4dCIsImlDb250ZXh0IiwidGhlbiIsIm9EQURFbnRpdHlUeXBlIiwic0JpbmRpbmciLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb24iLCJnZXRDb250ZXh0UGF0aCIsIm9WYWx1ZSIsImdldFNvcnRDb25kaXRpb25zIiwib1ByZXNlbnRhdGlvblZhcmlhbnQiLCJzUHJlc2VudGF0aW9uVmFyaWFudFBhdGgiLCJfaXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsIlNvcnRPcmRlciIsImFTb3J0Q29uZGl0aW9ucyIsInNvcnRlcnMiLCJmb3JFYWNoIiwib0NvbmRpdGlvbiIsIm9Tb3J0ZXIiLCJuYW1lIiwiUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiZGVzY2VuZGluZyIsIkRlc2NlbmRpbmciLCJwdXNoIiwic0Fubm90YXRpb25QYXRoIiwiY3JlYXRlUHJlc2VudGF0aW9uUGF0aENvbnRleHQiLCJvUHJlc2VudGF0aW9uQ29udGV4dCIsImFQYXRocyIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0UHJlc3NIYW5kbGVyRm9yRGF0YUZpZWxkRm9ySUJOIiwic0NvbnRleHQiLCJiTmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nIiwibU5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2aWdhdGlvbkNvbnRleHRzIiwiUmVxdWlyZXNDb250ZXh0IiwiSW5saW5lIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiU2VtYW50aWNPYmplY3QiLCJBY3Rpb24iLCJub3RBcHBsaWNhYmxlQ29udGV4dHMiLCJsYWJlbCIsIkxhYmVsIiwiTWFwcGluZyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsImdldEVudGl0eVNldCIsIk1vZGVsSGVscGVyIiwiZ2V0RW50aXR5U2V0UGF0aCIsImhhbmRsZVZpc2liaWxpdHlPZk1lbnVBY3Rpb25zIiwic1Zpc2libGVWYWx1ZSIsImNvbWJpbmVkQ29uZGl0aW9ucyIsImdldENyaXRpY2FsaXR5Q2FsY3VsYXRpb25CaW5kaW5nIiwic0ltcHJvdmVtZW50RGlyZWN0aW9uIiwic0RldmlhdGlvbkxvdyIsInNUb2xlcmFuY2VMb3ciLCJzQWNjZXB0YW5jZUxvdyIsInNBY2NlcHRhbmNlSGlnaCIsInNUb2xlcmFuY2VIaWdoIiwic0RldmlhdGlvbkhpZ2giLCJzQ3JpdGljYWxpdHlFeHByZXNzaW9uIiwiTmV1dHJhbCIsIkluZmluaXR5IiwiR29vZCIsIkNyaXRpY2FsIiwid2FybmluZyIsIl9nZXRDcml0aWNhbGl0eUZyb21FbnVtIiwic0NyaXRpY2FsaXR5Iiwic0luZGljYXRvciIsImdldFZhbHVlQ3JpdGljYWxpdHkiLCJzRGltZW5zaW9uIiwiYVZhbHVlQ3JpdGljYWxpdHkiLCJzUmVzdWx0IiwiYVZhbHVlcyIsIm9WQyIsIlZhbHVlIiwiQ3JpdGljYWxpdHkiLCJnZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgiLCJpTWVhc3VyZSIsIm9DaGFydEFubm90YXRpb25zIiwiYU1lYXN1cmVzIiwiTWVhc3VyZXMiLCJiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cyIsImFNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmVBdHRyaWJ1dGVzIiwic01lYXN1cmVQcm9wZXJ0eVBhdGgiLCJpTWVhc3VyZUF0dHJpYnV0ZSIsImZuQ2hlY2tNZWFzdXJlIiwic01lYXN1cmUiLCJvTWVhc3VyZUF0dHJpYnV0ZSIsImluZGV4IiwiTWVhc3VyZSIsInNvbWUiLCJiaW5kIiwiZ2V0TWVhc3VyZUF0dHJpYnV0ZUZvck1lYXN1cmUiLCJzTWVhc3VyZVBhdGgiLCJzQ2hhcnRBbm5vdGF0aW9uUGF0aCIsInN1YnN0cmluZyIsInNNZWFzdXJlQXR0cmlidXRlUGF0aCIsIkRhdGFQb2ludCIsImlzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCIsIm9UYXJnZXRDb2xsZWN0aW9uQ29udGFpbnNUYXJnZXQiLCJvVGFibGVNZXRhZGF0YSIsInBhcmVudEVudGl0eVNldCIsInNQYXJlbnRFbnRpdHlTZXRQYXRoIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJnZXREYXRhRnJvbVRlbXBsYXRlIiwiZGF0YUVsZW1lbnQiLCJzcGxpdFBhdGgiLCJkYXRhS2V5IiwiY29ubmVjdGVkRGF0YVBhdGgiLCJjb25uZWN0ZWRPYmplY3QiLCJ0ZW1wbGF0ZSIsIlRlbXBsYXRlIiwic3BsaXRUZW1wIiwidGVtcEFycmF5IiwidHJpbSIsIkRhdGEiLCJub3RMYXN0SW5kZXgiLCJlbGVtZW50IiwiaXNMYXN0SW5kZXgiLCJ0ZW1wbGF0ZUluZm8iLCJnZXREZWxpbWl0ZXIiLCJzZXRNZXRhTW9kZWwiLCJnZXRQYXJhbWV0ZXJzIiwib1BhcmFtZXRlckluZm8iLCJnZXRQYXJhbWV0ZXJJbmZvIiwicGFyYW1ldGVyUHJvcGVydGllcyIsImJ1aWxkQWN0aW9uV3JhcHBlciIsIm9UaGlzIiwiYVBhcmFtcyIsInJlZiIsImhhbmRsZXJNb2R1bGUiLCJoYW5kbGVyTWV0aG9kIiwiaWQiLCJvQWRkaXRpb25hbFBhcmFtcyIsImNvbnRleHRzIiwiY29tcGlsZUV4cHJlc3Npb24iLCJmbiIsImdldEhpZGRlblBhdGhFeHByZXNzaW9uIiwiZGF0YUZpZWxkQW5ub3RhdGlvbnMiLCJyZXF1aXJlc0lDb250ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDb21tb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgZm4sIHJlZiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBtTGlicmFyeSBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IHsgc3lzdGVtIH0gZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtL0VkaXRNb2RlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0Fubm90YXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcblxuY29uc3QgVmFsdWVDb2xvciA9IG1MaWJyYXJ5LlZhbHVlQ29sb3I7XG5jb25zdCBDb21tb25IZWxwZXIgPSB7XG5cdHVzZUZpZWxkVmFsdWVIZWxwOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gU3dpdGNoIGZyb20gKG5ldykgbWRjOlZhbHVlSGVscCB0byAob2xkKSBtZGNGaWVsZDpGaWVsZFZhbHVlSGVscFxuXHRcdHJldHVybiBsb2NhdGlvbi5ocmVmLmluZGV4T2YoXCJzYXAtZmUtb2xkRmllbGRWYWx1ZUhlbHA9dHJ1ZVwiKSA+IC0xO1xuXHR9LFxuXG5cdGdldFBhdGhUb0tleTogZnVuY3Rpb24gKG9DdHg6IGFueSkge1xuXHRcdHJldHVybiBvQ3R4LmdldE9iamVjdCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIGEgZmllbGQgaXMgdmlzaWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldCBUYXJnZXQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG9JbnRlcmZhY2UgSW50ZXJmYWNlIGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSwgZmFsc2UsIG9yIGV4cHJlc3Npb24gd2l0aCBwYXRoXG5cdCAqL1xuXHRpc1Zpc2libGU6IGZ1bmN0aW9uICh0YXJnZXQ6IG9iamVjdCwgb0ludGVyZmFjZTogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9Nb2RlbC5nZXRPYmplY3QoYCR7c1Byb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRoaWRkZW4gPSBvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXG5cdFx0cmV0dXJuIHR5cGVvZiBoaWRkZW4gPT09IFwib2JqZWN0XCIgPyBcIns9ICEke1wiICsgaGlkZGVuLiRQYXRoICsgXCJ9IH1cIiA6ICFoaWRkZW47XG5cdH0sXG5cblx0LyoqXG5cdCAqIERldGVybWluZSBpZiB0aGUgYWN0aW9uIG9wZW5zIHVwIGEgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0FjdGlvbkNvbnRleHRcblx0ICogQHBhcmFtIG9JbnRlcmZhY2Vcblx0ICogQHJldHVybnMgYHRydWVgIGlmIGEgZGlhbG9nIGlzIG5lZWRlZFxuXHQgKi9cblx0aXNEaWFsb2c6IGZ1bmN0aW9uIChvQWN0aW9uQ29udGV4dDogYW55LCBvSW50ZXJmYWNlOiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdHNQcm9wZXJ0eVBhdGggPSBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0aXNDcml0aWNhbCA9IG9Nb2RlbC5nZXRPYmplY3QoYCR7c1Byb3BlcnR5UGF0aH0vQCR1aTUub3ZlcmxvYWRAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQWN0aW9uQ3JpdGljYWxgKTtcblx0XHRpZiAoaXNDcml0aWNhbCkge1xuXHRcdFx0cmV0dXJuIFwiRGlhbG9nXCI7XG5cdFx0fSBlbHNlIGlmIChvQWN0aW9uQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgb0FjdGlvbiA9IEFycmF5LmlzQXJyYXkob0FjdGlvbkNvbnRleHQpID8gb0FjdGlvbkNvbnRleHRbMF0gOiBvQWN0aW9uQ29udGV4dDtcblx0XHRcdGlmIChvQWN0aW9uLiRQYXJhbWV0ZXIgJiYgb0FjdGlvbi4kUGFyYW1ldGVyLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0cmV0dXJuIFwiRGlhbG9nXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRGV0ZXJtaW5lIGlmIGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gb0ludGVyZmFjZSBJbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHJldHVybnMgQSBCaW5kaW5nIEV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgZmllbGQgc2hvdWxkIGJlIGVkaXRhYmxlIG9yIG5vdC5cblx0ICovXG5cdGdldFBhcmFtZXRlckVkaXRNb2RlOiBmdW5jdGlvbiAodGFyZ2V0OiBvYmplY3QsIG9JbnRlcmZhY2U6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0c1Byb3BlcnR5UGF0aCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvQW5ub3RhdGlvbnMgPSBvTW9kZWwuZ2V0T2JqZWN0KGAke3NQcm9wZXJ0eVBhdGh9QGApLFxuXHRcdFx0ZmllbGRDb250cm9sID0gb0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0sXG5cdFx0XHRpbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLFxuXHRcdFx0Y29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cblx0XHRsZXQgc0VkaXRNb2RlOiBFZGl0TW9kZSB8IHN0cmluZyA9IEVkaXRNb2RlLkVkaXRhYmxlO1xuXG5cdFx0aWYgKGltbXV0YWJsZSB8fCBjb21wdXRlZCkge1xuXHRcdFx0c0VkaXRNb2RlID0gRWRpdE1vZGUuUmVhZE9ubHk7XG5cdFx0fSBlbHNlIGlmIChmaWVsZENvbnRyb2wpIHtcblx0XHRcdGlmIChmaWVsZENvbnRyb2wuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9SZWFkT25seVwiKSB7XG5cdFx0XHRcdFx0c0VkaXRNb2RlID0gRWRpdE1vZGUuUmVhZE9ubHk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGZpZWxkQ29udHJvbC4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9JbmFwcGxpY2FibGVcIiB8fFxuXHRcdFx0XHRcdGZpZWxkQ29udHJvbC4kRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9IaWRkZW5cIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzRWRpdE1vZGUgPSBFZGl0TW9kZS5EaXNhYmxlZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kUGF0aCkge1xuXHRcdFx0XHRzRWRpdE1vZGUgPVxuXHRcdFx0XHRcdFwiez0gJXtcIiArXG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPCAzID8gKCV7XCIgK1xuXHRcdFx0XHRcdGZpZWxkQ29udHJvbC4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAwID8gJ1wiICtcblx0XHRcdFx0XHRFZGl0TW9kZS5EaXNhYmxlZCArXG5cdFx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0XHRFZGl0TW9kZS5SZWFkT25seSArXG5cdFx0XHRcdFx0XCInKSA6ICdcIiArXG5cdFx0XHRcdFx0RWRpdE1vZGUuRWRpdGFibGUgK1xuXHRcdFx0XHRcdFwiJ31cIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc0VkaXRNb2RlO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IHRoZSBjb21wbGV0ZSBtZXRhcGF0aCB0byB0aGUgdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0XG5cdCAqIEBwYXJhbSBvSW50ZXJmYWNlXG5cdCAqIEByZXR1cm5zIFRoZSBtZXRhcGF0aFxuXHQgKi9cblx0Z2V0TWV0YVBhdGg6IGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwgb0ludGVyZmFjZTogYW55KSB7XG5cdFx0cmV0dXJuIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCAmJiBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0UGF0aCgpKSB8fCB1bmRlZmluZWQ7XG5cdH0sXG5cdGlzRGVza3RvcDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzeXN0ZW0uZGVza3RvcCA9PT0gdHJ1ZTtcblx0fSxcblx0Z2V0VGFyZ2V0Q29sbGVjdGlvbjogZnVuY3Rpb24gKG9Db250ZXh0OiBhbnksIG5hdkNvbGxlY3Rpb246IGFueSkge1xuXHRcdGxldCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRpZiAoXG5cdFx0XHRvQ29udGV4dC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiICYmXG5cdFx0XHQob0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHwgb0NvbnRleHQuZ2V0T2JqZWN0KFwiJENvbnRhaW5zVGFyZ2V0XCIpID09PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwpIHtcblx0XHRcdHNQYXRoID1cblx0XHRcdFx0KG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YVBhdGggJiYgb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCkpIHx8XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdH1cblx0XHQvL1N1cHBvcnRpbmcgc1BhdGggb2YgYW55IGZvcm1hdCwgZWl0aGVyICcvPGVudGl0eVNldD4vPG5hdmlnYXRpb25Db2xsZWN0aW9uPicgPE9SPiAnLzxlbnRpdHlTZXQ+LyRUeXBlLzxuYXZpZ2F0aW9uQ29sbGVjdGlvbj4nXG5cdFx0Y29uc3QgYVBhcnRzID0gc1BhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihmdW5jdGlvbiAoc1BhcnQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIHNQYXJ0ICYmIHNQYXJ0ICE9IFwiJFR5cGVcIjtcblx0XHR9KTsgLy9maWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgYW5kIHBhcnRzIHJlZmVycmluZyB0byAnJFR5cGUnXG5cdFx0Y29uc3QgZW50aXR5U2V0ID0gYC8ke2FQYXJ0c1swXX1gO1xuXHRcdGlmIChhUGFydHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gZW50aXR5U2V0O1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uQ29sbGVjdGlvbiA9IG5hdkNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCA/IGFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSA6IG5hdkNvbGxlY3Rpb247XG5cdFx0cmV0dXJuIGAke2VudGl0eVNldH0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtuYXZpZ2F0aW9uQ29sbGVjdGlvbn1gOyAvLyB1c2VkIGluIGdvdG9UYXJnZXRFbnRpdHlTZXQgbWV0aG9kIGluIHRoZSBzYW1lIGZpbGVcblx0fSxcblxuXHRpc1Byb3BlcnR5RmlsdGVyYWJsZTogZnVuY3Rpb24gKHByb3BlcnR5OiBhbnksIG9JbnRlcmZhY2U6IGFueSwgb0RhdGFGaWVsZDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdC8vIExvYWNhdGlvblBhdGggd291bGQgYmUgdGhlIHByZWZpeCBvZiBzUHJvcGVydHlQYXRoLCBleGFtcGxlOiBzUHJvcGVydHlQYXRoID0gJy9DdXN0b21lci9TZXQvTmFtZScgLT4gc1Byb3BlcnR5TG9jYXRpb25QYXRoID0gJy9DdXN0b21lci9TZXQnXG5cdFx0XHRzUHJvcGVydHlMb2NhdGlvblBhdGggPSBDb21tb25IZWxwZXIuZ2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGgob01vZGVsLCBzUHJvcGVydHlQYXRoKSxcblx0XHRcdHNQcm9wZXJ0eSA9IHNQcm9wZXJ0eVBhdGgucmVwbGFjZShgJHtzUHJvcGVydHlMb2NhdGlvblBhdGh9L2AsIFwiXCIpO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGFGaWVsZCAmJlxuXHRcdFx0KG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgfHxcblx0XHRcdFx0b0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcblx0XHQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuaXNQcm9wZXJ0eUZpbHRlcmFibGUob01vZGVsLCBzUHJvcGVydHlMb2NhdGlvblBhdGgsIHNQcm9wZXJ0eSk7XG5cdH0sXG5cblx0Z2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChvTW9kZWw6IGFueSwgc1Byb3BlcnR5UGF0aDogYW55KSB7XG5cdFx0bGV0IGlMZW5ndGg7XG5cdFx0bGV0IHNDb2xsZWN0aW9uUGF0aCA9IHNQcm9wZXJ0eVBhdGguc2xpY2UoMCwgc1Byb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdGlmIChvTW9kZWwuZ2V0T2JqZWN0KGAke3NDb2xsZWN0aW9uUGF0aH0vJGtpbmRgKSA9PT0gXCJFbnRpdHlDb250YWluZXJcIikge1xuXHRcdFx0aUxlbmd0aCA9IHNDb2xsZWN0aW9uUGF0aC5sZW5ndGggKyAxO1xuXHRcdFx0c0NvbGxlY3Rpb25QYXRoID0gc1Byb3BlcnR5UGF0aC5zbGljZShpTGVuZ3RoLCBzUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIsIGlMZW5ndGgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNDb2xsZWN0aW9uUGF0aDtcblx0fSxcblx0Z290b0FjdGlvblBhcmFtZXRlcjogZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7c1BhdGh9LyROYW1lYCk7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLmdldFBhcmFtZXRlclBhdGgoc1BhdGgsIHNQcm9wZXJ0eU5hbWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBlbnRpdHkgc2V0IG5hbWUgZnJvbSB0aGUgZW50aXR5IHR5cGUgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgT0RhdGEgdjQgbWV0YW1vZGVsIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBFbnRpdHlUeXBlIG9mIHRoZSBhY3Rpb21cblx0ICogQHJldHVybnMgVGhlIEVudGl0eVNldCBvZiB0aGUgYm91bmQgYWN0aW9uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0TmFtZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAodHlwZW9mIG9FbnRpdHlDb250YWluZXJba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBvRW50aXR5Q29udGFpbmVyW2tleV0uJFR5cGUgPT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbWV0YW1vZGVsIHBhdGggY29ycmVjdGx5IGZvciBib3VuZCBhY3Rpb25zIGlmIHVzZWQgd2l0aCBiUmV0dXJuT25seVBhdGggYXMgdHJ1ZSxcblx0ICogZWxzZSByZXR1cm5zIGFuIG9iamVjdCB3aGljaCBoYXMgMyBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIGFjdGlvbi4gVGhleSBhcmUgdGhlIGVudGl0eSBzZXQgbmFtZSxcblx0ICogdGhlICRQYXRoIHZhbHVlIG9mIHRoZSBPcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG5hbWUuIElmXG5cdCAqIGJDaGVja1N0YXRpY1ZhbHVlIGlzIHRydWUsIHJldHVybnMgdGhlIHN0YXRpYyB2YWx1ZSBvZiBPcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiwgaWYgcHJlc2VudC5cblx0ICogZS5nLiBmb3IgYm91bmQgYWN0aW9uIHNvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uXG5cdCAqIG9mIGVudGl0eSBzZXQgU29tZUVudGl0eVNldCwgdGhlIHN0cmluZyBcIi9Tb21lRW50aXR5U2V0L3NvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uXCIgaXMgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiUmV0dXJuT25seVBhdGggSWYgZmFsc2UsIGFkZGl0aW9uYWwgaW5mbyBpcyByZXR1cm5lZCBhbG9uZyB3aXRoIG1ldGFtb2RlbCBwYXRoIHRvIHRoZSBib3VuZCBhY3Rpb25cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBib3VuZCBhY3Rpb24gb2YgdGhlIGZvcm0gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cblx0ICogQHBhcmFtIGJDaGVja1N0YXRpY1ZhbHVlIElmIHRydWUsIHRoZSBzdGF0aWMgdmFsdWUgb2YgT3BlcmF0aW9uQXZhaWxhYmxlIGlzIHJldHVybmVkLCBpZiBwcmVzZW50XG5cdCAqIEByZXR1cm5zIFRoZSBzdHJpbmcgb3Igb2JqZWN0IGFzIHNwZWNpZmllZCBieSBiUmV0dXJuT25seVBhdGhcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXRoOiBmdW5jdGlvbiAob0FjdGlvbjogYW55LCBiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sIHNBY3Rpb25OYW1lPzogc3RyaW5nLCBiQ2hlY2tTdGF0aWNWYWx1ZT86IGJvb2xlYW4pIHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb0FjdGlvbi5nZXRQYXRoKCkuc3BsaXQoXCIvQFwiKVswXTtcblxuXHRcdHNBY3Rpb25OYW1lID0gIXNBY3Rpb25OYW1lID8gb0FjdGlvbi5nZXRPYmplY3Qob0FjdGlvbi5nZXRQYXRoKCkpIDogc0FjdGlvbk5hbWU7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gYWN0aW9uIGJvdW5kIHRvIGFub3RoZXIgZW50aXR5IHR5cGVcblx0XHRcdHNBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpWzBdO1xuXHRcdH0gZWxzZSBpZiAob0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKSkge1xuXHRcdFx0Ly8gVE9ETzogdGhpcyBsb2dpYyBzb3VuZHMgd3JvbmcsIHRvIGJlIGNvcnJlY3RlZFxuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGVOYW1lID0gb0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKS4kVHlwZTtcblx0XHRcdGNvbnN0IHNFbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlTZXROYW1lKG9BY3Rpb24uZ2V0TW9kZWwoKSwgc0VudGl0eVR5cGVOYW1lKTtcblx0XHRcdGlmIChzRW50aXR5TmFtZSkge1xuXHRcdFx0XHRzQ29udGV4dFBhdGggPSBgLyR7c0VudGl0eU5hbWV9YDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNDb250ZXh0UGF0aDtcblx0XHR9XG5cblx0XHRpZiAoYkNoZWNrU3RhdGljVmFsdWUpIHtcblx0XHRcdHJldHVybiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWApO1xuXHRcdH1cblx0XHRpZiAoYlJldHVybk9ubHlQYXRoKSB7XG5cdFx0XHRyZXR1cm4gYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNDb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0XHRzUHJvcGVydHk6IG9BY3Rpb24uZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlLyRQYXRoYCksXG5cdFx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyOiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlci8wLyROYW1lYClcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdGdldE5hdmlnYXRpb25Db250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlci5nZXROYXZpZ2F0aW9uUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhvdXQgdGhlIGVudGl0eSB0eXBlIChwb3RlbnRpYWxseSBmaXJzdCkgYW5kIHByb3BlcnR5IChsYXN0KSBwYXJ0IChvcHRpb25hbCkuXG5cdCAqIFRoZSByZXN1bHQgY2FuIGJlIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBhIHNpbXBsZSBkaXJlY3QgcHJvcGVydHkuXG5cdCAqXG5cdCAqIElmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBwYXRoIHN0YXJ0cyB3aXRoIGEgc2xhc2ggKC8pLCBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGVudGl0eSB0eXBlXG5cdCAqIGlzIHBhcnQgb2YgdGhlIHBhdGggYW5kIHdpbGwgYmUgc3RyaXBwZWQgYXdheS5cblx0ICpcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGhcblx0ICogQHBhcmFtIGJLZWVwUHJvcGVydHlcblx0ICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gcGF0aFxuXHQgKi9cblx0Z2V0TmF2aWdhdGlvblBhdGg6IGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBhbnksIGJLZWVwUHJvcGVydHk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgYlN0YXJ0c1dpdGhFbnRpdHlUeXBlID0gc1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKTtcblx0XHRjb25zdCBhUGFydHMgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoZnVuY3Rpb24gKHBhcnQ6IGFueSkge1xuXHRcdFx0cmV0dXJuICEhcGFydDtcblx0XHR9KTtcblx0XHRpZiAoYlN0YXJ0c1dpdGhFbnRpdHlUeXBlKSB7XG5cdFx0XHRhUGFydHMuc2hpZnQoKTtcblx0XHR9XG5cdFx0aWYgKCFiS2VlcFByb3BlcnR5KSB7XG5cdFx0XHRhUGFydHMucG9wKCk7XG5cdFx0fVxuXHRcdHJldHVybiBhUGFydHMuam9pbihcIi9cIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNvcnJlY3QgbWV0YW1vZGVsIHBhdGggZm9yIGJvdW5kIGFjdGlvbnMuXG5cdCAqXG5cdCAqIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpcnJlc3BlY3RpdmUgb2YgdGhlIGFjdGlvbiB0eXBlLCB0aGlzIHdpbGwgYmUgYXBwbGllZCB0byB1bmJvdW5kIGFjdGlvbnMuXG5cdCAqIEluIHN1Y2ggYSBjYXNlLCBpZiBhbiBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgaXQgaXMgaWdub3JlZCBkdXJpbmcgdGVtcGxhdGluZy5cblx0ICpcblx0ICogRXhhbXBsZTogZm9yIHRoZSBib3VuZCBhY3Rpb24gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb24gb2YgZW50aXR5IHNldCBTb21lRW50aXR5U2V0LFxuXHQgKiB0aGUgc3RyaW5nIFwiL1NvbWVFbnRpdHlTZXQvc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cIiBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXIuZ2V0QWN0aW9uQ29udGV4dFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIG9BY3Rpb24gQ29udGV4dCBvYmplY3QgZm9yIHRoZSBhY3Rpb25cblx0ICogQHJldHVybnMgQ29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYW5kIGluY29ycmVjdCBwYXRoIGZvciB1bmJvdW5kIGFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRBY3Rpb25Db250ZXh0OiBmdW5jdGlvbiAob0FjdGlvbjogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZXRBY3Rpb25QYXRoKG9BY3Rpb24sIHRydWUpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbWV0YW1vZGVsIHBhdGggY29ycmVjdGx5IGZvciBvdmVybG9hZGVkIGJvdW5kIGFjdGlvbnMuIEZvciB1bmJvdW5kIGFjdGlvbnMsXG5cdCAqIHRoZSBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgYnV0IGlnbm9yZWQgZHVyaW5nIHRlbXBsYXRpbmcuXG5cdCAqIGUuZy4gZm9yIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbiBvZiBlbnRpdHkgc2V0IFNvbWVFbnRpdHlTZXQsXG5cdCAqIHRoZSBzdHJpbmcgXCIvU29tZUVudGl0eVNldC9zb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbi9AJHVpNS5vdmVybG9hZC8wXCIgaXMgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyLmdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYWN0aW9uIG92ZXJsb2FkIGFuZCBpbmNvcnJlY3QgcGF0aCBmb3IgdW5ib3VuZCBhY3Rpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0UGF0aFRvQm91bmRBY3Rpb25PdmVybG9hZDogZnVuY3Rpb24gKG9BY3Rpb246IG9iamVjdCkge1xuXHRcdGNvbnN0IHNQYXRoID0gQ29tbW9uSGVscGVyLmdldEFjdGlvblBhdGgob0FjdGlvbiwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGAke3NQYXRofS9AJHVpNS5vdmVybG9hZC8wYDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgc3RyaW5nIHdpdGggc2luZ2xlIHF1b3Rlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIGludG8gc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcGFyYW0gW2JFc2NhcGVdIFNob3VsZCB0aGUgc3RyaW5nIGJlIGVzY2FwZWQgYmVmb3JlaGFuZFxuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIHNpbmdsZSBxdW90ZXNcblx0ICovXG5cdGFkZFNpbmdsZVF1b3RlczogZnVuY3Rpb24gKHNWYWx1ZTogc3RyaW5nLCBiRXNjYXBlPzogYm9vbGVhbikge1xuXHRcdGlmIChiRXNjYXBlICYmIHNWYWx1ZSkge1xuXHRcdFx0c1ZhbHVlID0gdGhpcy5lc2NhcGVTaW5nbGVRdW90ZXMoc1ZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGAnJHtzVmFsdWV9J2A7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRoIGVzY2FwZWQgc2luZ2xlIHF1b3Rlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgZXNjYXBpbmcgb2Ygc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIGVzY2FwZWQgc2luZ2xlIHF1b3Rlc1xuXHQgKi9cblx0ZXNjYXBlU2luZ2xlUXVvdGVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gc1ZhbHVlLnJlcGxhY2UoL1snXS9nLCBcIlxcXFwnXCIpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBzdHJpbmdcblx0ICogVGhlIGZpcnN0IGFyZ3VtZW50IG9mIGdlbmVyYXRlRnVuY3Rpb24gaXMgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIHN0cmluZy5cblx0ICogUmVtYWluaW5nIGFyZ3VtZW50cyBvZiBnZW5lcmF0ZUZ1bmN0aW9uIGFyZSBhcmd1bWVudHMgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCBmdW5jdGlvbiBzdHJpbmcuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIHNGdW5jTmFtZSBTb21lIHN0cmluZyBmb3IgdGhlIGZ1bmN0aW9uIG5hbWVcblx0ICogQHBhcmFtIGFyZ3MgVGhlIHJlbWFpbmluZyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgLSBGdW5jdGlvbiBzdHJpbmcgZGVwZW5kcyBvbiBhcmd1bWVudHMgcGFzc2VkXG5cdCAqL1xuXHRnZW5lcmF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoc0Z1bmNOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSB7XG5cdFx0bGV0IHNQYXJhbXMgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1BhcmFtcyArPSBhcmdzW2ldO1xuXHRcdFx0aWYgKGkgPCBhcmdzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0c1BhcmFtcyArPSBcIiwgXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNGdW5jdGlvbiA9IGAke3NGdW5jTmFtZX0oKWA7XG5cdFx0aWYgKHNQYXJhbXMpIHtcblx0XHRcdHNGdW5jdGlvbiA9IGAke3NGdW5jTmFtZX0oJHtzUGFyYW1zfSlgO1xuXHRcdH1cblx0XHRyZXR1cm4gc0Z1bmN0aW9uO1xuXHR9LFxuXHQvKlxuXHQgKiBSZXR1cm5zIHRoZSB2aXNpYmlsaXR5IGV4cHJlc3Npb24gZm9yIGRhdGFwb2ludCB0aXRsZS9saW5rXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NQYXRoXSBhbm5vdGF0aW9uIHBhdGggb2YgZGF0YSBwb2ludCBvciBNaWNyb2NoYXJ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JMaW5rXSB0cnVlIGlmIGxpbmsgdmlzaWJpbGl0eSBpcyBiZWluZyBkZXRlcm1pbmVkLCBmYWxzZSBpZiB0aXRsZSB2aXNpYmlsaXR5IGlzIGJlaW5nIGRldGVybWluZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBbYkZpZWxkVmlzaWJpbGl0eV0gdHJ1ZSBpZiBmaWVsZCBpcyB2c2lpYmxlLCBmYWxzZSBvdGhlcndpc2Vcblx0ICogQHJldHVybnMgIHtzdHJpbmd9IHNWaXNpYmlsaXR5RXhwIFVzZWQgdG8gZ2V0IHRoZSAgdmlzaWJpbGl0eSBiaW5kaW5nIGZvciBEYXRhUG9pbnRzIHRpdGxlIGluIHRoZSBIZWFkZXIuXG5cdCAqXG5cdCAqL1xuXG5cdGdldEhlYWRlckRhdGFQb2ludExpbmtWaXNpYmlsaXR5OiBmdW5jdGlvbiAoc1BhdGg6IGFueSwgYkxpbms6IGFueSwgYkZpZWxkVmlzaWJpbGl0eTogYW55KSB7XG5cdFx0bGV0IHNWaXNpYmlsaXR5RXhwO1xuXHRcdGlmIChiRmllbGRWaXNpYmlsaXR5KSB7XG5cdFx0XHRzVmlzaWJpbGl0eUV4cCA9IGJMaW5rXG5cdFx0XHRcdD8gXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ID09PSB0cnVlICYmIFwiICsgYkZpZWxkVmlzaWJpbGl0eSArIFwifVwiXG5cdFx0XHRcdDogXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ICE9PSB0cnVlICYmIFwiICsgYkZpZWxkVmlzaWJpbGl0eSArIFwifVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVmlzaWJpbGl0eUV4cCA9IGJMaW5rXG5cdFx0XHRcdD8gXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ID09PSB0cnVlfVwiXG5cdFx0XHRcdDogXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ICE9PSB0cnVlfVwiO1xuXHRcdH1cblx0XHRyZXR1cm4gc1Zpc2liaWxpdHlFeHA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIG9iamVjdCB0byBzdHJpbmcoZGlmZmVyZW50IGZyb20gSlNPTi5zdHJpbmdpZnkgb3IudG9TdHJpbmcpLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvUGFyYW1zIFNvbWUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIC0gT2JqZWN0IHN0cmluZ1xuXHQgKi9cblx0b2JqZWN0VG9TdHJpbmc6IGZ1bmN0aW9uIChvUGFyYW1zOiBhbnkpIHtcblx0XHRsZXQgaU51bWJlck9mS2V5cyA9IE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCxcblx0XHRcdHNQYXJhbXMgPSBcIlwiO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG9QYXJhbXMpIHtcblx0XHRcdGxldCBzVmFsdWUgPSBvUGFyYW1zW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSAmJiB0eXBlb2Ygc1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHNWYWx1ZSA9IHRoaXMub2JqZWN0VG9TdHJpbmcoc1ZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHNQYXJhbXMgKz0gYCR7c0tleX06ICR7c1ZhbHVlfWA7XG5cdFx0XHRpZiAoaU51bWJlck9mS2V5cyA+IDEpIHtcblx0XHRcdFx0LS1pTnVtYmVyT2ZLZXlzO1xuXHRcdFx0XHRzUGFyYW1zICs9IFwiLCBcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYHsgJHtzUGFyYW1zfX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGVzY2FwZSBjaGFyYWN0ZXJzIChcXCkgZnJvbSBhbiBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBzRXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHdpdGggZXNjYXBlIGNoYXJhY3RlcnNcblx0ICogQHJldHVybnMgRXhwcmVzc2lvbiBzdHJpbmcgd2l0aG91dCBlc2NhcGUgY2hhcmFjdGVycyBvciB1bmRlZmluZWRcblx0ICovXG5cdHJlbW92ZUVzY2FwZUNoYXJhY3RlcnM6IGZ1bmN0aW9uIChzRXhwcmVzc2lvbjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNFeHByZXNzaW9uID8gc0V4cHJlc3Npb24ucmVwbGFjZSgvXFxcXD9cXFxcKFt7fV0pL2csIFwiJDFcIikgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ha2VzIHVwZGF0ZXMgdG8gYSBzdHJpbmdpZmllZCBvYmplY3Qgc28gdGhhdCBpdCB3b3JrcyBwcm9wZXJseSBpbiBhIHRlbXBsYXRlIGJ5IGFkZGluZyB1aTVPYmplY3Q6dHJ1ZS5cblx0ICpcblx0ICogQHBhcmFtIHNTdHJpbmdpZmllZFxuXHQgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdFxuXHQgKi9cblx0c3RyaW5naWZ5T2JqZWN0OiBmdW5jdGlvbiAoc1N0cmluZ2lmaWVkOiBzdHJpbmcpIHtcblx0XHRpZiAoIXNTdHJpbmdpZmllZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb09iamVjdCA9IEpTT04ucGFyc2Uoc1N0cmluZ2lmaWVkKTtcblx0XHRcdGlmICh0eXBlb2Ygb09iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShvT2JqZWN0KSkge1xuXHRcdFx0XHRjb25zdCBvVUk1T2JqZWN0ID0ge1xuXHRcdFx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRPYmplY3QuYXNzaWduKG9VSTVPYmplY3QsIG9PYmplY3QpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob1VJNU9iamVjdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzVHlwZSA9IEFycmF5LmlzQXJyYXkob09iamVjdCkgPyBcIkFycmF5XCIgOiB0eXBlb2Ygb09iamVjdDtcblx0XHRcdFx0TG9nLmVycm9yKGBVbmV4cGVjdGVkIG9iamVjdCB0eXBlIGluIHN0cmluZ2lmeU9iamVjdCAoJHtzVHlwZX0pIC0gb25seSB3b3JrcyB3aXRoIG9iamVjdGApO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmdpZnlPYmplY3Qgb25seSB3b3JrcyB3aXRoIG9iamVjdHMhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkYXRhLCB0YWtpbmcgY2FyZSB0aGF0IGl0IGlzIG5vdCB0cmVhdGVkIGFzIGEgYmluZGluZyBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gc3RyaW5naWZ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEuXG5cdCAqL1xuXHRzdHJpbmdpZnlDdXN0b21EYXRhOiBmdW5jdGlvbiAodkRhdGE6IG9iamVjdCkge1xuXHRcdGNvbnN0IG9PYmplY3Q6IGFueSA9IHtcblx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdH07XG5cdFx0b09iamVjdFtcImN1c3RvbURhdGFcIl0gPSB2RGF0YSBpbnN0YW5jZW9mIENvbnRleHQgPyB2RGF0YS5nZXRPYmplY3QoKSA6IHZEYXRhO1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvT2JqZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBkYXRhLCBwb3RlbnRpYWxseSB1bndyYXBzIHRoZSBkYXRhLlxuXHQgKlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gcGFyc2Vcblx0ICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZGF0YSBwYXJzaW5nXG5cdCAqL1xuXHRwYXJzZUN1c3RvbURhdGE6IGZ1bmN0aW9uICh2RGF0YTogYW55KSB7XG5cdFx0dkRhdGEgPSB0eXBlb2YgdkRhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEYXRhKSA6IHZEYXRhO1xuXHRcdGlmICh2RGF0YSAmJiB2RGF0YS5oYXNPd25Qcm9wZXJ0eShcImN1c3RvbURhdGFcIikpIHtcblx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0fVxuXHRcdHJldHVybiB2RGF0YTtcblx0fSxcblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBUaGUgRW50aXR5VHlwZSBuYW1lXG5cdCAqIEByZXR1cm5zIFRoZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVxuXHQgKi9cblx0X2dldERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgLyR7c0VudGl0eVR5cGV9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL2ApO1xuXHR9LFxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFBvcG92ZXJUZXh0XG5cdCAqIEBwYXJhbSBpQ29udGV4dFxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGUgVGhlIEVudGl0eVR5cGUgbmFtZVxuXHQgKiBAcmV0dXJucyBUaGUgQmluZGluZyBFeHByZXNzaW9uIGZvciB0aGUgZHJhZnQgcG9wb3ZlclxuXHQgKi9cblx0Z2V0UG9wb3ZlclRleHQ6IGZ1bmN0aW9uIChpQ29udGV4dDogYW55LCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5fZ2V0RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlKGlDb250ZXh0LmdldE1vZGVsKCksIHNFbnRpdHlUeXBlKS50aGVuKGZ1bmN0aW9uIChvREFERW50aXR5VHlwZSkge1xuXHRcdFx0bGV0IHNCaW5kaW5nID1cblx0XHRcdFx0XCJ7cGFydHM6IFt7cGF0aDogJ0hhc0RyYWZ0RW50aXR5JywgdGFyZ2V0VHlwZTogJ2FueSd9LCBcIiArXG5cdFx0XHRcdC8vXCJ7cGF0aDogJ0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZSd9LCBcIiArXG5cdFx0XHRcdFwie3BhdGg6ICdEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9JblByb2Nlc3NCeVVzZXInfSwgXCIgK1xuXHRcdFx0XHRcIntwYXRoOiAnRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZWRCeVVzZXInfSBcIjtcblx0XHRcdGlmIChvREFERW50aXR5VHlwZS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbikge1xuXHRcdFx0XHRzQmluZGluZyArPSBcIiAse3BhdGg6ICdEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbid9XCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvREFERW50aXR5VHlwZS5MYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdHNCaW5kaW5nICs9IFwiLCB7cGF0aDogJ0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb24nfVwiO1xuXHRcdFx0fVxuXHRcdFx0c0JpbmRpbmcgKz0gXCJdLCBmb3JtYXR0ZXI6ICdzYXAuZmUubWFjcm9zLmZpZWxkLkZpZWxkUnVudGltZS5mb3JtYXREcmFmdE93bmVyVGV4dEluUG9wb3Zlcid9XCI7XG5cdFx0XHRyZXR1cm4gc0JpbmRpbmc7XG5cdFx0fSk7XG5cdH0sXG5cdGdldENvbnRleHRQYXRoOiBmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG9JbnRlcmZhY2U6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQgJiYgb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gc1BhdGhbc1BhdGgubGVuZ3RoIC0gMV0gPT09IFwiL1wiID8gc1BhdGguc2xpY2UoMCwgLTEpIDogc1BhdGg7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QgY29udGFpbmluZyAgUHJlc2VudGF0aW9uIFZhcmlhbnQgc29ydCBjb25kaXRpb25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1ByZXNlbnRhdGlvblZhcmlhbnQgUHJlc2VudGF0aW9uIHZhcmlhbnQgQW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc1ByZXNlbnRhdGlvblZhcmlhbnRQYXRoXG5cdCAqIEByZXR1cm5zIFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0XG5cdCAqL1xuXHRnZXRTb3J0Q29uZGl0aW9uczogZnVuY3Rpb24gKG9QcmVzZW50YXRpb25WYXJpYW50OiBhbnksIHNQcmVzZW50YXRpb25WYXJpYW50UGF0aDogc3RyaW5nKSB7XG5cdFx0aWYgKG9QcmVzZW50YXRpb25WYXJpYW50ICYmIHRoaXMuX2lzUHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24oc1ByZXNlbnRhdGlvblZhcmlhbnRQYXRoKSAmJiBvUHJlc2VudGF0aW9uVmFyaWFudC5Tb3J0T3JkZXIpIHtcblx0XHRcdGNvbnN0IGFTb3J0Q29uZGl0aW9uczogYW55ID0ge1xuXHRcdFx0XHRzb3J0ZXJzOiBbXVxuXHRcdFx0fTtcblx0XHRcdG9QcmVzZW50YXRpb25WYXJpYW50LlNvcnRPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChvQ29uZGl0aW9uOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb1NvcnRlcjogYW55ID0ge307XG5cdFx0XHRcdG9Tb3J0ZXIubmFtZSA9IG9Db25kaXRpb24uUHJvcGVydHkuJFByb3BlcnR5UGF0aDtcblx0XHRcdFx0b1NvcnRlci5kZXNjZW5kaW5nID0gISFvQ29uZGl0aW9uLkRlc2NlbmRpbmc7XG5cdFx0XHRcdGFTb3J0Q29uZGl0aW9ucy5zb3J0ZXJzLnB1c2gob1NvcnRlcik7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShhU29ydENvbmRpdGlvbnMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXHRfaXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogZnVuY3Rpb24gKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHNBbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRcIikgPiAtMSB8fFxuXHRcdFx0c0Fubm90YXRpb25QYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFwiKSA+IC0xXG5cdFx0KTtcblx0fSxcblx0Y3JlYXRlUHJlc2VudGF0aW9uUGF0aENvbnRleHQ6IGZ1bmN0aW9uIChvUHJlc2VudGF0aW9uQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3QgYVBhdGhzID0gb1ByZXNlbnRhdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCJAXCIpIHx8IFtdO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9QcmVzZW50YXRpb25Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggJiYgYVBhdGhzW2FQYXRocy5sZW5ndGggLSAxXS5pbmRleE9mKFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUGF0aCA9IG9QcmVzZW50YXRpb25Db250ZXh0LnNQYXRoLnNwbGl0KFwiL1ByZXNlbnRhdGlvblZhcmlhbnRcIilbMF07XG5cdFx0XHRyZXR1cm4gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NQYXRofUBzYXB1aS5uYW1lYCk7XG5cdFx0fVxuXHRcdHJldHVybiBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7b1ByZXNlbnRhdGlvbkNvbnRleHQuc1BhdGh9QHNhcHVpLm5hbWVgKTtcblx0fSxcblx0Z2V0UHJlc3NIYW5kbGVyRm9yRGF0YUZpZWxkRm9ySUJOOiBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzQ29udGV4dDogc3RyaW5nLCBiTmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgbU5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IHNDb250ZXh0ID8gc0NvbnRleHQgOiBcIiR7JHNvdXJjZT4vfS5nZXRCaW5kaW5nQ29udGV4dCgpXCJcblx0XHR9O1xuXHRcdGlmIChvRGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJiAhb0RhdGFGaWVsZC5JbmxpbmUgJiYgYk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cyA9XG5cdFx0XHRcdFwiJHtpbnRlcm5hbD5pYm4vXCIgKyBvRGF0YUZpZWxkLlNlbWFudGljT2JqZWN0ICsgXCItXCIgKyBvRGF0YUZpZWxkLkFjdGlvbiArIFwiL2FBcHBsaWNhYmxlL31cIjtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgPVxuXHRcdFx0XHRcIiR7aW50ZXJuYWw+aWJuL1wiICsgb0RhdGFGaWVsZC5TZW1hbnRpY09iamVjdCArIFwiLVwiICsgb0RhdGFGaWVsZC5BY3Rpb24gKyBcIi9hTm90QXBwbGljYWJsZS99XCI7XG5cdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubGFiZWwgPSBcIidcIiArIG9EYXRhRmllbGQuTGFiZWwgKyBcIidcIjtcblx0XHR9XG5cdFx0aWYgKG9EYXRhRmllbGQuTWFwcGluZykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzLnNlbWFudGljT2JqZWN0TWFwcGluZyA9IHRoaXMuYWRkU2luZ2xlUXVvdGVzKEpTT04uc3RyaW5naWZ5KG9EYXRhRmllbGQuTWFwcGluZykpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uKFxuXHRcdFx0Yk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZyA/IFwiLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uRGlhbG9nXCIgOiBcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlXCIsXG5cdFx0XHR0aGlzLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkLlNlbWFudGljT2JqZWN0KSxcblx0XHRcdHRoaXMuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdHRoaXMub2JqZWN0VG9TdHJpbmcobU5hdmlnYXRpb25QYXJhbWV0ZXJzKVxuXHRcdCk7XG5cdH0sXG5cdGdldEVudGl0eVNldDogZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHZpc2liaWxpdHkgb2YgZm9ybSBtZW51IGFjdGlvbnMgYm90aCBpbiBwYXRoIGJhc2VkIGFuZCBzdGF0aWMgdmFsdWUgc2NlbmFyaW9zLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBzVmlzaWJsZVZhbHVlIEVpdGhlciBzdGF0aWMgYm9vbGVhbiB2YWx1ZXMgb3IgQXJyYXkgb2YgcGF0aCBleHByZXNzaW9ucyBmb3IgdmlzaWJpbGl0eSBvZiBtZW51IGJ1dHRvbi5cblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBkZXRlcm1pbmluZyB0aGUgdmlzaWJpbGl0eSBvZiBtZW51IGFjdGlvbnMuXG5cdCAqL1xuXHRoYW5kbGVWaXNpYmlsaXR5T2ZNZW51QWN0aW9uczogZnVuY3Rpb24gKHNWaXNpYmxlVmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IGNvbWJpbmVkQ29uZGl0aW9ucyA9IFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHNWaXNpYmxlVmFsdWUpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNWaXNpYmxlVmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHNWaXNpYmxlVmFsdWVbaV0uaW5kZXhPZihcIntcIikgPiAtMSAmJiBzVmlzaWJsZVZhbHVlW2ldLmluZGV4T2YoXCJ7PVwiKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzVmlzaWJsZVZhbHVlW2ldID0gXCJ7PVwiICsgc1Zpc2libGVWYWx1ZVtpXSArIFwifVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVmlzaWJsZVZhbHVlW2ldLnNwbGl0KFwiez1cIikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHNWaXNpYmxlVmFsdWVbaV0gPSBzVmlzaWJsZVZhbHVlW2ldLnNwbGl0KFwiez1cIilbMV0uc2xpY2UoMCwgLTEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbWJpbmVkQ29uZGl0aW9ucy5wdXNoKGAoJHtzVmlzaWJsZVZhbHVlW2ldfSlgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNvbWJpbmVkQ29uZGl0aW9ucy5sZW5ndGggPiAwID8gYHs9ICR7Y29tYmluZWRDb25kaXRpb25zLmpvaW4oXCIgfHwgXCIpfX1gIDogc1Zpc2libGVWYWx1ZTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkbyB0aGUgY2FsY3VsYXRpb24gb2YgY3JpdGljYWxpdHkgaW4gY2FzZSBDcml0aWNhbGl0eUNhbGN1bGF0aW9uIHByZXNlbnQgaW4gdGhlIGFubm90YXRpb25cblx0ICpcblx0ICogVGhlIGNhbGN1bGF0aW9uIGlzIGRvbmUgYnkgY29tcGFyaW5nIGEgdmFsdWUgdG8gdGhlIHRocmVzaG9sZCB2YWx1ZXMgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpZWQgaW1wcm92ZW1lbnQgZGlyZWN0aW9uLlxuXHQgKiBGb3IgaW1wcm92ZW1lbnQgZGlyZWN0aW9uIFRhcmdldCwgdGhlIGNyaXRpY2FsaXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgYm90aCBsb3cgYW5kIGhpZ2ggdGhyZXNob2xkIHZhbHVlcy4gSXQgd2lsbCBiZVxuXHQgKlxuXHQgKiAtIFBvc2l0aXZlIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gTmV1dHJhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFRvbGVyYW5jZVJhbmdlTG93VmFsdWUgYW5kIGxvd2VyIHRoYW4gQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUgT1IgZ3JlYXRlciB0aGFuIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSBhbmQgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIENyaXRpY2FsIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSBhbmQgbG93ZXIgdGhhbiBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIE9SIGdyZWF0ZXIgdGhhbiBUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSBhbmQgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5lZ2F0aXZlIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIERldmlhdGlvblJhbmdlTG93VmFsdWUgb3IgZ3JlYXRlciB0aGFuIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqXG5cdCAqIEZvciBpbXByb3ZlbWVudCBkaXJlY3Rpb24gTWluaW1pemUsIHRoZSBjcml0aWNhbGl0eSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBoaWdoIHRocmVzaG9sZCB2YWx1ZXMuIEl0IGlzXG5cdCAqIC0gUG9zaXRpdmUgaWYgdGhlIHZhbHVlIGlzIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gTmV1dHJhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSBhbmQgbG93ZXIgdGhhbiBvciBlcXVhbCB0byBUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIENyaXRpY2FsIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBOZWdhdGl2ZSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqXG5cdCAqIEZvciBpbXByb3ZlbWVudCBkaXJlY3Rpb24gTWF4aW1pemUsIHRoZSBjcml0aWNhbGl0eSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBsb3cgdGhyZXNob2xkIHZhbHVlcy4gSXQgaXNcblx0ICpcblx0ICogLSBQb3NpdGl2ZSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXG5cdCAqIC0gTmV1dHJhbCBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZVxuXHQgKiAtIENyaXRpY2FsIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIFRvbGVyYW5jZVJhbmdlTG93VmFsdWUgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlXG5cdCAqIC0gTmVnYXRpdmUgaWYgdGhlIHZhbHVlIGlzIGxvd2VyIHRoYW4gRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZVxuXHQgKlxuXHQgKiBUaHJlc2hvbGRzIGFyZSBvcHRpb25hbC4gRm9yIHVuYXNzaWduZWQgdmFsdWVzLCBkZWZhdWx0cyBhcmUgZGV0ZXJtaW5lZCBpbiB0aGlzIG9yZGVyOlxuXHQgKlxuXHQgKiAtIEZvciBEZXZpYXRpb25SYW5nZSwgYW4gb21pdHRlZCBMb3dWYWx1ZSB0cmFuc2xhdGVzIGludG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIG51bWJlciAoLUlORiksIGFuIG9taXR0ZWQgSGlnaFZhbHVlIHRyYW5zbGF0ZXMgaW50byB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBudW1iZXIgKCtJTkYpXG5cdCAqIC0gRm9yIFRvbGVyYW5jZVJhbmdlLCBhbiBvbWl0dGVkIExvd1ZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlLCBhbiBvbWl0dGVkIEhpZ2hWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBGb3IgQWNjZXB0YW5jZVJhbmdlLCBhbiBvbWl0dGVkIExvd1ZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLCBhbiBvbWl0dGVkIEhpZ2hWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzSW1wcm92ZW1lbnREaXJlY3Rpb24gSW1wcm92ZW1lbnREaXJlY3Rpb24gdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGNyaXRpY2FsaXR5IGJpbmRpbmdcblx0ICogQHBhcmFtIHNWYWx1ZSBWYWx1ZSBmcm9tIERhdGFwb2ludCB0byBiZSBtZWFzdXJlZFxuXHQgKiBAcGFyYW0gc0RldmlhdGlvbkxvdyBFeHByZXNzaW9uQmluZGluZyBmb3IgTG93ZXIgRGV2aWF0aW9uIGxldmVsXG5cdCAqIEBwYXJhbSBzVG9sZXJhbmNlTG93IEV4cHJlc3Npb25CaW5kaW5nIGZvciBMb3dlciBUb2xlcmFuY2UgbGV2ZWxcblx0ICogQHBhcmFtIHNBY2NlcHRhbmNlTG93IEV4cHJlc3Npb25CaW5kaW5nIGZvciBMb3dlciBBY2NlcHRhbmNlIGxldmVsXG5cdCAqIEBwYXJhbSBzQWNjZXB0YW5jZUhpZ2ggRXhwcmVzc2lvbkJpbmRpbmcgZm9yIEhpZ2hlciBBY2NlcHRhbmNlIGxldmVsXG5cdCAqIEBwYXJhbSBzVG9sZXJhbmNlSGlnaCBFeHByZXNzaW9uQmluZGluZyBmb3IgSGlnaGVyIFRvbGVyYW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc0RldmlhdGlvbkhpZ2ggRXhwcmVzc2lvbkJpbmRpbmcgZm9yIEhpZ2hlciBEZXZpYXRpb24gbGV2ZWxcblx0ICogQHJldHVybnMgUmV0dXJucyBjcml0aWNhbGl0eSBjYWxjdWxhdGlvbiBhcyBleHByZXNzaW9uIGJpbmRpbmdcblx0ICovXG5cdGdldENyaXRpY2FsaXR5Q2FsY3VsYXRpb25CaW5kaW5nOiBmdW5jdGlvbiAoXG5cdFx0c0ltcHJvdmVtZW50RGlyZWN0aW9uOiBzdHJpbmcsXG5cdFx0c1ZhbHVlOiBzdHJpbmcsXG5cdFx0c0RldmlhdGlvbkxvdzogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNUb2xlcmFuY2VMb3c6IHN0cmluZyB8IG51bWJlcixcblx0XHRzQWNjZXB0YW5jZUxvdzogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNBY2NlcHRhbmNlSGlnaDogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNUb2xlcmFuY2VIaWdoOiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c0RldmlhdGlvbkhpZ2g6IHN0cmluZyB8IG51bWJlclxuXHQpIHtcblx0XHRsZXQgc0NyaXRpY2FsaXR5RXhwcmVzc2lvbjogdHlwZW9mIFZhbHVlQ29sb3IgfCBzdHJpbmcgPSBWYWx1ZUNvbG9yLk5ldXRyYWw7IC8vIERlZmF1bHQgQ3JpdGljYWxpdHkgU3RhdGVcblxuXHRcdHNWYWx1ZSA9IGAlJHtzVmFsdWV9YDtcblxuXHRcdC8vIFNldHRpbmcgVW5hc3NpZ25lZCBWYWx1ZXNcblx0XHRzRGV2aWF0aW9uTG93ID0gc0RldmlhdGlvbkxvdyB8fCAtSW5maW5pdHk7XG5cdFx0c1RvbGVyYW5jZUxvdyA9IHNUb2xlcmFuY2VMb3cgfHwgc0RldmlhdGlvbkxvdztcblx0XHRzQWNjZXB0YW5jZUxvdyA9IHNBY2NlcHRhbmNlTG93IHx8IHNUb2xlcmFuY2VMb3c7XG5cdFx0c0RldmlhdGlvbkhpZ2ggPSBzRGV2aWF0aW9uSGlnaCB8fCBJbmZpbml0eTtcblx0XHRzVG9sZXJhbmNlSGlnaCA9IHNUb2xlcmFuY2VIaWdoIHx8IHNEZXZpYXRpb25IaWdoO1xuXHRcdHNBY2NlcHRhbmNlSGlnaCA9IHNBY2NlcHRhbmNlSGlnaCB8fCBzVG9sZXJhbmNlSGlnaDtcblxuXHRcdC8vIERlYWxpbmcgd2l0aCBEZWNpbWFsIGFuZCBQYXRoIGJhc2VkIGJpbmdkaW5nc1xuXHRcdHNEZXZpYXRpb25Mb3cgPSBzRGV2aWF0aW9uTG93ICYmICgrc0RldmlhdGlvbkxvdyA/ICtzRGV2aWF0aW9uTG93IDogYCUke3NEZXZpYXRpb25Mb3d9YCk7XG5cdFx0c1RvbGVyYW5jZUxvdyA9IHNUb2xlcmFuY2VMb3cgJiYgKCtzVG9sZXJhbmNlTG93ID8gK3NUb2xlcmFuY2VMb3cgOiBgJSR7c1RvbGVyYW5jZUxvd31gKTtcblx0XHRzQWNjZXB0YW5jZUxvdyA9IHNBY2NlcHRhbmNlTG93ICYmICgrc0FjY2VwdGFuY2VMb3cgPyArc0FjY2VwdGFuY2VMb3cgOiBgJSR7c0FjY2VwdGFuY2VMb3d9YCk7XG5cdFx0c0FjY2VwdGFuY2VIaWdoID0gc0FjY2VwdGFuY2VIaWdoICYmICgrc0FjY2VwdGFuY2VIaWdoID8gK3NBY2NlcHRhbmNlSGlnaCA6IGAlJHtzQWNjZXB0YW5jZUhpZ2h9YCk7XG5cdFx0c1RvbGVyYW5jZUhpZ2ggPSBzVG9sZXJhbmNlSGlnaCAmJiAoK3NUb2xlcmFuY2VIaWdoID8gK3NUb2xlcmFuY2VIaWdoIDogYCUke3NUb2xlcmFuY2VIaWdofWApO1xuXHRcdHNEZXZpYXRpb25IaWdoID0gc0RldmlhdGlvbkhpZ2ggJiYgKCtzRGV2aWF0aW9uSGlnaCA/ICtzRGV2aWF0aW9uSGlnaCA6IGAlJHtzRGV2aWF0aW9uSGlnaH1gKTtcblxuXHRcdC8vIENyZWF0aW5nIHJ1bnRpbWUgZXhwcmVzc2lvbiBiaW5kaW5nIGZyb20gY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gZm9yIENyaXRpY2FsaXR5IFN0YXRlXG5cdFx0aWYgKHNJbXByb3ZlbWVudERpcmVjdGlvbi5pbmRleE9mKFwiTWluaW1pemVcIikgPiAtMSkge1xuXHRcdFx0c0NyaXRpY2FsaXR5RXhwcmVzc2lvbiA9XG5cdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Hb29kICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VIaWdoICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIikgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkNyaXRpY2FsICtcblx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5FcnJvciArXG5cdFx0XHRcdFwiJyB9XCI7XG5cdFx0fSBlbHNlIGlmIChzSW1wcm92ZW1lbnREaXJlY3Rpb24uaW5kZXhPZihcIk1heGltaXplXCIpID4gLTEpIHtcblx0XHRcdHNDcml0aWNhbGl0eUV4cHJlc3Npb24gPVxuXHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUxvdyArXG5cdFx0XHRcdFwiID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Hb29kICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+PSBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VMb3cgK1xuXHRcdFx0XHRcIiA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuTmV1dHJhbCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0XCIoXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIgJiYgXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIikgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkNyaXRpY2FsICtcblx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5FcnJvciArXG5cdFx0XHRcdFwiJyB9XCI7XG5cdFx0fSBlbHNlIGlmIChzSW1wcm92ZW1lbnREaXJlY3Rpb24uaW5kZXhPZihcIlRhcmdldFwiKSA+IC0xKSB7XG5cdFx0XHRzQ3JpdGljYWxpdHlFeHByZXNzaW9uID1cblx0XHRcdFx0XCJ7PSAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUxvdyArXG5cdFx0XHRcdFwiKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuR29vZCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0XCIoKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIgJiYgXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIikgfHwgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPiBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlSGlnaCArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlSGlnaCArXG5cdFx0XHRcdFwiKSkgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKChcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIiAmJiAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25Mb3cgK1xuXHRcdFx0XHRcIikgJiYgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPCBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VMb3cgK1xuXHRcdFx0XHRcIikpIHx8ICgoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA+IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUhpZ2ggK1xuXHRcdFx0XHRcIikgJiYgXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uSGlnaCArXG5cdFx0XHRcdFwiICYmIChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIikpKSA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuQ3JpdGljYWwgK1xuXHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkVycm9yICtcblx0XHRcdFx0XCInIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJDYXNlIG5vdCBzdXBwb3J0ZWQsIHJldHVybmluZyB0aGUgZGVmYXVsdCBWYWx1ZSBOZXV0cmFsXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzQ3JpdGljYWxpdHlFeHByZXNzaW9uO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjcml0aWNhbGl0eSBpbmRpY2F0b3IgZnJvbSBhbm5vdGF0aW9ucyBpZiBjcml0aWNhbGl0eSBpcyBFbnVtTWVtYmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0NyaXRpY2FsaXR5IENyaXRpY2FsaXR5IHByb3ZpZGVkIGluIHRoZSBhbm5vdGF0aW9uc1xuXHQgKiBAcmV0dXJucyBSZXR1cm4gdGhlIGluZGljYXRvciBmb3IgY3JpdGljYWxpdHlcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRDcml0aWNhbGl0eUZyb21FbnVtOiBmdW5jdGlvbiAoc0NyaXRpY2FsaXR5OiBzdHJpbmcpIHtcblx0XHRsZXQgc0luZGljYXRvcjtcblx0XHRpZiAoc0NyaXRpY2FsaXR5ID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZVwiKSB7XG5cdFx0XHRzSW5kaWNhdG9yID0gVmFsdWVDb2xvci5FcnJvcjtcblx0XHR9IGVsc2UgaWYgKHNDcml0aWNhbGl0eSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvUG9zaXRpdmVcIikge1xuXHRcdFx0c0luZGljYXRvciA9IFZhbHVlQ29sb3IuR29vZDtcblx0XHR9IGVsc2UgaWYgKHNDcml0aWNhbGl0eSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvQ3JpdGljYWxcIikge1xuXHRcdFx0c0luZGljYXRvciA9IFZhbHVlQ29sb3IuQ3JpdGljYWw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNJbmRpY2F0b3IgPSBWYWx1ZUNvbG9yLk5ldXRyYWw7XG5cdFx0fVxuXHRcdHJldHVybiBzSW5kaWNhdG9yO1xuXHR9LFxuXHRnZXRWYWx1ZUNyaXRpY2FsaXR5OiBmdW5jdGlvbiAoc0RpbWVuc2lvbjogYW55LCBhVmFsdWVDcml0aWNhbGl0eTogYW55KSB7XG5cdFx0bGV0IHNSZXN1bHQ7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRpZiAoYVZhbHVlQ3JpdGljYWxpdHkgJiYgYVZhbHVlQ3JpdGljYWxpdHkubGVuZ3RoID4gMCkge1xuXHRcdFx0YVZhbHVlQ3JpdGljYWxpdHkuZm9yRWFjaChmdW5jdGlvbiAob1ZDOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9WQy5WYWx1ZSAmJiBvVkMuQ3JpdGljYWxpdHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0XHRjb25zdCBzVmFsdWUgPVxuXHRcdFx0XHRcdFx0XCIke1wiICtcblx0XHRcdFx0XHRcdHNEaW1lbnNpb24gK1xuXHRcdFx0XHRcdFx0XCJ9ID09PSAnXCIgK1xuXHRcdFx0XHRcdFx0b1ZDLlZhbHVlICtcblx0XHRcdFx0XHRcdFwiJyA/ICdcIiArXG5cdFx0XHRcdFx0XHRDb21tb25IZWxwZXIuX2dldENyaXRpY2FsaXR5RnJvbUVudW0ob1ZDLkNyaXRpY2FsaXR5LiRFbnVtTWVtYmVyKSArXG5cdFx0XHRcdFx0XHRcIidcIjtcblx0XHRcdFx0XHRhVmFsdWVzLnB1c2goc1ZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRzUmVzdWx0ID0gYVZhbHVlcy5sZW5ndGggPiAwICYmIGFWYWx1ZXMuam9pbihcIiA6IFwiKSArIFwiIDogdW5kZWZpbmVkXCI7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0ID8gXCJ7PSBcIiArIHNSZXN1bHQgKyBcIiB9XCIgOiB1bmRlZmluZWQ7XG5cdH0sXG5cdC8qKlxuXHQgKiBUbyBmZXRjaCBtZWFzdXJlIGF0dHJpYnV0ZSBpbmRleC5cblx0ICpcblx0ICogQHBhcmFtIGlNZWFzdXJlIENoYXJ0IEFubm90YXRpb25zXG5cdCAqIEBwYXJhbSBvQ2hhcnRBbm5vdGF0aW9ucyBDaGFydCBBbm5vdGF0aW9uc1xuXHQgKiBAcmV0dXJucyBNZWFzdXJlQXR0cmlidXRlIGluZGV4LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0TWVhc3VyZUF0dHJpYnV0ZUluZGV4OiBmdW5jdGlvbiAoaU1lYXN1cmU6IGFueSwgb0NoYXJ0QW5ub3RhdGlvbnM6IGFueSkge1xuXHRcdGNvbnN0IGFNZWFzdXJlcyA9IG9DaGFydEFubm90YXRpb25zLk1lYXN1cmVzO1xuXHRcdGxldCBiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cztcblx0XHRjb25zdCBhTWVhc3VyZUF0dHJpYnV0ZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlQXR0cmlidXRlcztcblx0XHRjb25zdCBzTWVhc3VyZVByb3BlcnR5UGF0aCA9IGFNZWFzdXJlcyAmJiBhTWVhc3VyZXNbaU1lYXN1cmVdICYmIGFNZWFzdXJlc1tpTWVhc3VyZV0uJFByb3BlcnR5UGF0aDtcblx0XHRsZXQgaU1lYXN1cmVBdHRyaWJ1dGUgPSAtMTtcblx0XHRjb25zdCBmbkNoZWNrTWVhc3VyZSA9IGZ1bmN0aW9uIChzTWVhc3VyZTogYW55LCBvTWVhc3VyZUF0dHJpYnV0ZTogYW55LCBpbmRleDogYW55KSB7XG5cdFx0XHRpZiAoKG9NZWFzdXJlQXR0cmlidXRlICYmIG9NZWFzdXJlQXR0cmlidXRlLk1lYXN1cmUgJiYgb01lYXN1cmVBdHRyaWJ1dGUuTWVhc3VyZS4kUHJvcGVydHlQYXRoKSA9PT0gc01lYXN1cmUpIHtcblx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPSBpbmRleDtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYU1lYXN1cmVBdHRyaWJ1dGVzKSB7XG5cdFx0XHRiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cyA9IGFNZWFzdXJlQXR0cmlidXRlcy5zb21lKGZuQ2hlY2tNZWFzdXJlLmJpbmQobnVsbCwgc01lYXN1cmVQcm9wZXJ0eVBhdGgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJNZWFzdXJlQXR0cmlidXRlRXhpc3RzICYmIGlNZWFzdXJlQXR0cmlidXRlID4gLTEgJiYgaU1lYXN1cmVBdHRyaWJ1dGU7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1lYXN1cmVBdHRyaWJ1dGUgZm9yIHRoZSBtZWFzdXJlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byB0aGUgbWVhc3VyZSBhbm5vdGF0aW9uXG5cdCAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lYXN1cmVBdHRyaWJ1dGUgb2YgdGhlIG1lYXN1cmVcblx0ICovXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGVGb3JNZWFzdXJlOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdHNNZWFzdXJlUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdHNDaGFydEFubm90YXRpb25QYXRoID0gc01lYXN1cmVQYXRoLnN1YnN0cmluZygwLCBzTWVhc3VyZVBhdGgubGFzdEluZGV4T2YoXCJNZWFzdXJlXCIpKSxcblx0XHRcdGlNZWFzdXJlID0gc01lYXN1cmVQYXRoLnJlcGxhY2UoLy4qXFwvLywgXCJcIik7XG5cblx0XHRyZXR1cm4gb01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KHNDaGFydEFubm90YXRpb25QYXRoKS50aGVuKGZ1bmN0aW9uIChvQ2hhcnRBbm5vdGF0aW9uczogYW55KSB7XG5cdFx0XHRjb25zdCBhTWVhc3VyZUF0dHJpYnV0ZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlQXR0cmlidXRlcyxcblx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPSBDb21tb25IZWxwZXIuZ2V0TWVhc3VyZUF0dHJpYnV0ZUluZGV4KGlNZWFzdXJlLCBvQ2hhcnRBbm5vdGF0aW9ucyk7XG5cdFx0XHRjb25zdCBzTWVhc3VyZUF0dHJpYnV0ZVBhdGggPVxuXHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA+IC0xICYmIGFNZWFzdXJlQXR0cmlidXRlc1tpTWVhc3VyZUF0dHJpYnV0ZV0gJiYgYU1lYXN1cmVBdHRyaWJ1dGVzW2lNZWFzdXJlQXR0cmlidXRlXS5EYXRhUG9pbnRcblx0XHRcdFx0XHQ/IGAke3NDaGFydEFubm90YXRpb25QYXRofU1lYXN1cmVBdHRyaWJ1dGVzLyR7aU1lYXN1cmVBdHRyaWJ1dGV9L2Bcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChzTWVhc3VyZUF0dHJpYnV0ZVBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIkRhdGFQb2ludCBtaXNzaW5nIGZvciB0aGUgbWVhc3VyZVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzTWVhc3VyZUF0dHJpYnV0ZVBhdGggPyBgJHtzTWVhc3VyZUF0dHJpYnV0ZVBhdGh9RGF0YVBvaW50LyRBbm5vdGF0aW9uUGF0aC9gIDogc01lYXN1cmVBdHRyaWJ1dGVQYXRoO1xuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgY29udGFpbmVkIG5hdmlnYXRpb24gcHJvcGVydHkgaGFzIGEgZHJhZnQgcm9vdC9ub2RlIHBhcmVudCBlbnRpdHlTZXQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBpc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnRcblx0ICogQHBhcmFtIG9UYXJnZXRDb2xsZWN0aW9uQ29udGFpbnNUYXJnZXQgVGFyZ2V0IGNvbGxlY3Rpb24gaGFzIENvbnRhaW5zVGFyZ2V0IHByb3BlcnR5XG5cdCAqIEBwYXJhbSBvVGFibGVNZXRhZGF0YSBUYWJsZSBtZXRhZGF0YSBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdFxuXHQgKi9cblx0aXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50OiBmdW5jdGlvbiAob1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldDogb2JqZWN0LCBvVGFibGVNZXRhZGF0YTogYW55KSB7XG5cdFx0aWYgKG9UYXJnZXRDb2xsZWN0aW9uQ29udGFpbnNUYXJnZXQpIHtcblx0XHRcdGlmIChvVGFibGVNZXRhZGF0YSAmJiBvVGFibGVNZXRhZGF0YS5wYXJlbnRFbnRpdHlTZXQgJiYgb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0LnNQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJlbnRFbnRpdHlTZXRQYXRoID0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0LnNQYXRoO1xuXHRcdFx0XHRjb25zdCBvRHJhZnRSb290ID0gb1RhYmxlTWV0YWRhdGEucGFyZW50RW50aXR5U2V0Lm9Nb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0YCR7c1BhcmVudEVudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvVGFibGVNZXRhZGF0YS5wYXJlbnRFbnRpdHlTZXQub01vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRgJHtzUGFyZW50RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWBcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBFbnN1cmVzIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhcyBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZS5cblx0ICogU2luY2UgdGhlIHByb3BlcnR5IERhdGEgaXMgb2YgdGhlIHR5cGUgJ29iamVjdCcsIGl0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHRlbXBsYXRlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBkYXRhRWxlbWVudCBUaGUgZGF0YSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IHBhdGggYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZS5cblx0ICovXG5cdGdldERhdGFGcm9tVGVtcGxhdGU6IGZ1bmN0aW9uIChkYXRhRWxlbWVudDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHNwbGl0UGF0aCA9IGRhdGFFbGVtZW50LmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3QgY29ubmVjdGVkRGF0YVBhdGggPSBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vQGA7XG5cdFx0Y29uc3QgY29ubmVjdGVkT2JqZWN0ID0gZGF0YUVsZW1lbnQuZ2V0T2JqZWN0KGNvbm5lY3RlZERhdGFQYXRoKSBhcyBhbnk7XG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBjb25uZWN0ZWRPYmplY3QuVGVtcGxhdGU7XG5cdFx0Y29uc3Qgc3BsaXRUZW1wID0gdGVtcGxhdGUuc3BsaXQoXCJ9XCIpO1xuXHRcdGNvbnN0IHRlbXBBcnJheSA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRUZW1wLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0Y29uc3Qga2V5ID0gc3BsaXRUZW1wW2ldLnNwbGl0KFwie1wiKVsxXS50cmltKCk7XG5cdFx0XHR0ZW1wQXJyYXkucHVzaChrZXkpO1xuXHRcdH1cblx0XHRPYmplY3Qua2V5cyhjb25uZWN0ZWRPYmplY3QuRGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoc0tleS5zdGFydHNXaXRoKFwiJFwiKSkge1xuXHRcdFx0XHRkZWxldGUgY29ubmVjdGVkT2JqZWN0LkRhdGFbc0tleV07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3QgaW5kZXggPSBPYmplY3Qua2V5cyhjb25uZWN0ZWRPYmplY3QuRGF0YSkuaW5kZXhPZihkYXRhS2V5KTtcblx0XHRyZXR1cm4gYC8ke3NwbGl0UGF0aC5zbGljZSgxLCAtMikuam9pbihcIi9cIil9L0RhdGEvJHt0ZW1wQXJyYXlbaW5kZXhdfWA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZW5kIG9mIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiByZWFjaGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgY29ubmVjdGVkIGZpZWxkcy5cblx0ICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKiBAcmV0dXJucyBUcnVlIG9yIEZhbHNlIChkZXBlbmRpbmcgb24gdGhlIHRlbXBsYXRlIGluZGV4KS5cblx0ICovXG5cdG5vdExhc3RJbmRleDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBlbGVtZW50OiBvYmplY3QpIHtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRhcmdldC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xuXHRcdGxldCBpc0xhc3RJbmRleCA9IGZhbHNlO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRUZW1wLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0Y29uc3QgZGF0YUtleSA9IHNwbGl0VGVtcFtpXS5zcGxpdChcIntcIilbMV0udHJpbSgpO1xuXHRcdFx0dGVtcEFycmF5LnB1c2goZGF0YUtleSk7XG5cdFx0fVxuXG5cdFx0dGVtcEFycmF5LmZvckVhY2goZnVuY3Rpb24gKHRlbXBsYXRlSW5mbzogYW55KSB7XG5cdFx0XHRpZiAodGFyZ2V0LkRhdGFbdGVtcGxhdGVJbmZvXSA9PT0gZWxlbWVudCAmJiB0ZW1wQXJyYXkuaW5kZXhPZih0ZW1wbGF0ZUluZm8pICE9PSB0ZW1wQXJyYXkubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRpc0xhc3RJbmRleCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGlzTGFzdEluZGV4O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHRoZSBkZWxpbWl0ZXIgZnJvbSB0aGUgdGVtcGxhdGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIHRlbXBsYXRlIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG5cdCAqIEByZXR1cm5zIFRoZSBkZWxpbWl0ZXIgaW4gdGhlIHRlbXBsYXRlIHN0cmluZy5cblx0ICovXG5cdGdldERlbGltaXRlcjogZnVuY3Rpb24gKHRlbXBsYXRlOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGVtcGxhdGUuc3BsaXQoXCJ9XCIpWzFdLnNwbGl0KFwie1wiKVswXS50cmltKCk7XG5cdH0sXG5cblx0b01ldGFNb2RlbDogdW5kZWZpbmVkIGFzIGFueSxcblx0c2V0TWV0YU1vZGVsOiBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9LFxuXG5cdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKG9Db250ZXh0PzogYW55LCBvSW50ZXJmYWNlPzogYW55KSB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm9NZXRhTW9kZWw7XG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyczogZnVuY3Rpb24gKG9Db250ZXh0OiBhbnksIG9JbnRlcmZhY2U6IGFueSkge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgb1BhcmFtZXRlckluZm8gPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJJbmZvKG9NZXRhTW9kZWwsIHNQYXRoKTtcblx0XHRcdGlmIChvUGFyYW1ldGVySW5mby5wYXJhbWV0ZXJQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhvUGFyYW1ldGVySW5mby5wYXJhbWV0ZXJQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNhbGxpbmcgYW4gYWN0aW9uIGhhbmRsZXIgdmlhIHRoZSBGUE0gaGVscGVyJ3MgYWN0aW9uV3JhcHBlciBmdW5jdGlvblxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgJ0ZQTS5hY3Rpb25XcmFwcGVyKCknIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0FjdGlvbiBBY3Rpb24gbWV0YWRhdGFcblx0ICogQHBhcmFtIG9BY3Rpb24uaGFuZGxlck1vZHVsZSBNb2R1bGUgY29udGFpbmluZyB0aGUgYWN0aW9uIGhhbmRsZXIgbWV0aG9kXG5cdCAqIEBwYXJhbSBvQWN0aW9uLmhhbmRsZXJNZXRob2QgQWN0aW9uIGhhbmRsZXIgbWV0aG9kIG5hbWVcblx0ICogQHBhcmFtIFtvVGhpc10gYHRoaXNgIChpZiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBtYWNybylcblx0ICogQHBhcmFtIG9UaGlzLmlkIFRoZSB0YWJsZSdzIElEXG5cdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gd3JhcHBlciBiaW5kaW5nXHRleHByZXNzaW9uXG5cdCAqL1xuXHRidWlsZEFjdGlvbldyYXBwZXI6IGZ1bmN0aW9uIChvQWN0aW9uOiB7IGhhbmRsZXJNb2R1bGU6IHN0cmluZzsgaGFuZGxlck1ldGhvZDogc3RyaW5nIH0sIG9UaGlzOiB7IGlkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGFQYXJhbXM6IGFueVtdID0gW3JlZihcIiRldmVudFwiKSwgb0FjdGlvbi5oYW5kbGVyTW9kdWxlLCBvQWN0aW9uLmhhbmRsZXJNZXRob2RdO1xuXG5cdFx0aWYgKG9UaGlzICYmIG9UaGlzLmlkKSB7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFBhcmFtcyA9IHtcblx0XHRcdFx0Y29udGV4dHM6IHJlZihcIiR7aW50ZXJuYWw+c2VsZWN0ZWRDb250ZXh0c31cIilcblx0XHRcdH07XG5cdFx0XHRhUGFyYW1zLnB1c2gob0FkZGl0aW9uYWxQYXJhbXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZm4oXCJGUE0uYWN0aW9uV3JhcHBlclwiLCBhUGFyYW1zKSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSB3aGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBkZXBlbmRpbmcgb24gdGhlIEhpZGRlbiBhbm5vdGF0aW9uLlxuXHQgKiBJdCBpcyBpbnZlcnRlZCBhcyB0aGUgVUkgZWxlbWVudHMgaGF2ZSBhIHZpc2libGUgcHJvcGVydHkgaW5zdGVhZCBvZiBhbiBoaWRkZW4gb25lLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGF0YUZpZWxkQW5ub3RhdGlvbnMgVGhlIGRhdGFGaWVsZCBPYmplY3Rcblx0ICogQHJldHVybnMgQSBwYXRoIG9yIGEgYm9vbGVhblxuXHQgKi9cblx0Z2V0SGlkZGVuUGF0aEV4cHJlc3Npb246IGZ1bmN0aW9uIChkYXRhRmllbGRBbm5vdGF0aW9uczogYW55KSB7XG5cdFx0aWYgKGRhdGFGaWVsZEFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXSAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgaGlkZGVuID0gZGF0YUZpZWxkQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdFx0cmV0dXJuIHR5cGVvZiBoaWRkZW4gPT09IFwib2JqZWN0XCIgPyBcIns9ICEke1wiICsgaGlkZGVuLiRQYXRoICsgXCJ9IH1cIiA6ICFoaWRkZW47XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuKENvbW1vbkhlbHBlci5pc1Byb3BlcnR5RmlsdGVyYWJsZSBhcyBhbnkpLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuKENvbW1vbkhlbHBlci5nZXRQb3BvdmVyVGV4dCBhcyBhbnkpLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCBDb21tb25IZWxwZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7OztFQVdBLElBQU1BLFVBQVUsR0FBR0MsUUFBUSxDQUFDRCxVQUE1QjtFQUNBLElBQU1FLFlBQVksR0FBRztJQUNwQkMsaUJBQWlCLEVBQUUsWUFBWTtNQUM5QjtNQUNBLE9BQU9DLFFBQVEsQ0FBQ0MsSUFBVCxDQUFjQyxPQUFkLENBQXNCLCtCQUF0QixJQUF5RCxDQUFDLENBQWpFO0lBQ0EsQ0FKbUI7SUFNcEJDLFlBQVksRUFBRSxVQUFVQyxJQUFWLEVBQXFCO01BQ2xDLE9BQU9BLElBQUksQ0FBQ0MsU0FBTCxFQUFQO0lBQ0EsQ0FSbUI7O0lBVXBCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLFNBQVMsRUFBRSxVQUFVQyxNQUFWLEVBQTBCQyxVQUExQixFQUEyQztNQUNyRCxJQUFNQyxNQUFNLEdBQUdELFVBQVUsQ0FBQ0UsT0FBWCxDQUFtQkMsUUFBbkIsRUFBZjtNQUFBLElBQ0NDLGFBQWEsR0FBR0osVUFBVSxDQUFDRSxPQUFYLENBQW1CRyxPQUFuQixFQURqQjtNQUFBLElBRUNDLFlBQVksR0FBR0wsTUFBTSxDQUFDSixTQUFQLFdBQW9CTyxhQUFwQixPQUZoQjtNQUFBLElBR0NHLE1BQU0sR0FBR0QsWUFBWSxDQUFDLG9DQUFELENBSHRCO01BS0EsT0FBTyxPQUFPQyxNQUFQLEtBQWtCLFFBQWxCLEdBQTZCLFdBQVdBLE1BQU0sQ0FBQ0MsS0FBbEIsR0FBMEIsS0FBdkQsR0FBK0QsQ0FBQ0QsTUFBdkU7SUFDQSxD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
997
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWx1ZUNvbG9yIiwibUxpYnJhcnkiLCJDb21tb25IZWxwZXIiLCJ1c2VGaWVsZFZhbHVlSGVscCIsImxvY2F0aW9uIiwiaHJlZiIsImluZGV4T2YiLCJnZXRQYXRoVG9LZXkiLCJvQ3R4IiwiZ2V0T2JqZWN0IiwiaXNWaXNpYmxlIiwidGFyZ2V0Iiwib0ludGVyZmFjZSIsIm9Nb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsInNQcm9wZXJ0eVBhdGgiLCJnZXRQYXRoIiwib0Fubm90YXRpb25zIiwiaGlkZGVuIiwiJFBhdGgiLCJpc0RpYWxvZyIsIm9BY3Rpb25Db250ZXh0IiwiaXNDcml0aWNhbCIsIm9BY3Rpb24iLCJBcnJheSIsImlzQXJyYXkiLCIkUGFyYW1ldGVyIiwibGVuZ3RoIiwiZ2V0UGFyYW1ldGVyRWRpdE1vZGUiLCJmaWVsZENvbnRyb2wiLCJpbW11dGFibGUiLCJjb21wdXRlZCIsInNFZGl0TW9kZSIsIkVkaXRNb2RlIiwiRWRpdGFibGUiLCJSZWFkT25seSIsIiRFbnVtTWVtYmVyIiwiRGlzYWJsZWQiLCJnZXRNZXRhUGF0aCIsInVuZGVmaW5lZCIsImlzRGVza3RvcCIsInN5c3RlbSIsImRlc2t0b3AiLCJnZXRUYXJnZXRDb2xsZWN0aW9uIiwib0NvbnRleHQiLCJuYXZDb2xsZWN0aW9uIiwic1BhdGgiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRNZXRhTW9kZWwiLCJhUGFydHMiLCJzcGxpdCIsImZpbHRlciIsInNQYXJ0IiwiZW50aXR5U2V0IiwibmF2aWdhdGlvbkNvbGxlY3Rpb24iLCJzbGljZSIsImpvaW4iLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsInByb3BlcnR5Iiwib0RhdGFGaWVsZCIsInNQcm9wZXJ0eUxvY2F0aW9uUGF0aCIsImdldExvY2F0aW9uRm9yUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5IiwicmVwbGFjZSIsIiRUeXBlIiwiQ29tbW9uVXRpbHMiLCJpTGVuZ3RoIiwic0NvbGxlY3Rpb25QYXRoIiwibGFzdEluZGV4T2YiLCJnb3RvQWN0aW9uUGFyYW1ldGVyIiwic1Byb3BlcnR5TmFtZSIsImdldFBhcmFtZXRlclBhdGgiLCJnZXRFbnRpdHlTZXROYW1lIiwib01ldGFNb2RlbCIsInNFbnRpdHlUeXBlIiwib0VudGl0eUNvbnRhaW5lciIsImtleSIsImdldEFjdGlvblBhdGgiLCJiUmV0dXJuT25seVBhdGgiLCJzQWN0aW9uTmFtZSIsImJDaGVja1N0YXRpY1ZhbHVlIiwic0NvbnRleHRQYXRoIiwic0VudGl0eVR5cGVOYW1lIiwic0VudGl0eU5hbWUiLCJzQmluZGluZ1BhcmFtZXRlciIsImdldE5hdmlnYXRpb25Db250ZXh0IiwiT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIiLCJnZXROYXZpZ2F0aW9uUGF0aCIsImJLZWVwUHJvcGVydHkiLCJiU3RhcnRzV2l0aEVudGl0eVR5cGUiLCJzdGFydHNXaXRoIiwicGFydCIsInNoaWZ0IiwicG9wIiwiZ2V0QWN0aW9uQ29udGV4dCIsImdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWQiLCJhZGRTaW5nbGVRdW90ZXMiLCJzVmFsdWUiLCJiRXNjYXBlIiwiZXNjYXBlU2luZ2xlUXVvdGVzIiwiZ2VuZXJhdGVGdW5jdGlvbiIsInNGdW5jTmFtZSIsInNQYXJhbXMiLCJpIiwic0Z1bmN0aW9uIiwiZ2V0SGVhZGVyRGF0YVBvaW50TGlua1Zpc2liaWxpdHkiLCJiTGluayIsImJGaWVsZFZpc2liaWxpdHkiLCJzVmlzaWJpbGl0eUV4cCIsIm9iamVjdFRvU3RyaW5nIiwib1BhcmFtcyIsImlOdW1iZXJPZktleXMiLCJPYmplY3QiLCJrZXlzIiwic0tleSIsInJlbW92ZUVzY2FwZUNoYXJhY3RlcnMiLCJzRXhwcmVzc2lvbiIsInN0cmluZ2lmeU9iamVjdCIsInNTdHJpbmdpZmllZCIsIm9PYmplY3QiLCJKU09OIiwicGFyc2UiLCJvVUk1T2JqZWN0IiwidWk1b2JqZWN0IiwiYXNzaWduIiwic3RyaW5naWZ5Iiwic1R5cGUiLCJMb2ciLCJlcnJvciIsIkVycm9yIiwic3RyaW5naWZ5Q3VzdG9tRGF0YSIsInZEYXRhIiwiQ29udGV4dCIsInBhcnNlQ3VzdG9tRGF0YSIsImhhc093blByb3BlcnR5IiwiX2dldERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZSIsInJlcXVlc3RPYmplY3QiLCJnZXRQb3BvdmVyVGV4dCIsImlDb250ZXh0IiwidGhlbiIsIm9EQURFbnRpdHlUeXBlIiwic0JpbmRpbmciLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb24iLCJnZXRDb250ZXh0UGF0aCIsIm9WYWx1ZSIsImdldFNvcnRDb25kaXRpb25zIiwib1ByZXNlbnRhdGlvblZhcmlhbnQiLCJzUHJlc2VudGF0aW9uVmFyaWFudFBhdGgiLCJfaXNQcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsIlNvcnRPcmRlciIsImFTb3J0Q29uZGl0aW9ucyIsInNvcnRlcnMiLCJzRW50aXR5UGF0aCIsImZvckVhY2giLCJvQ29uZGl0aW9uIiwib1NvcnRQcm9wZXJ0eSIsIm9Tb3J0ZXIiLCJEeW5hbWljUHJvcGVydHkiLCIkQW5ub3RhdGlvblBhdGgiLCJOYW1lIiwiUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwibmFtZSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwicHVzaCIsInNBbm5vdGF0aW9uUGF0aCIsImNyZWF0ZVByZXNlbnRhdGlvblBhdGhDb250ZXh0Iiwib1ByZXNlbnRhdGlvbkNvbnRleHQiLCJhUGF0aHMiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImdldFByZXNzSGFuZGxlckZvckRhdGFGaWVsZEZvcklCTiIsInNDb250ZXh0IiwiYk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZyIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm5hdmlnYXRpb25Db250ZXh0cyIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsImFwcGxpY2FibGVDb250ZXh0cyIsIlNlbWFudGljT2JqZWN0IiwiQWN0aW9uIiwibm90QXBwbGljYWJsZUNvbnRleHRzIiwibGFiZWwiLCJMYWJlbCIsIk1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJnZXRFbnRpdHlTZXQiLCJNb2RlbEhlbHBlciIsImdldEVudGl0eVNldFBhdGgiLCJoYW5kbGVWaXNpYmlsaXR5T2ZNZW51QWN0aW9ucyIsInNWaXNpYmxlVmFsdWUiLCJjb21iaW5lZENvbmRpdGlvbnMiLCJnZXRDcml0aWNhbGl0eUNhbGN1bGF0aW9uQmluZGluZyIsInNJbXByb3ZlbWVudERpcmVjdGlvbiIsInNEZXZpYXRpb25Mb3ciLCJzVG9sZXJhbmNlTG93Iiwic0FjY2VwdGFuY2VMb3ciLCJzQWNjZXB0YW5jZUhpZ2giLCJzVG9sZXJhbmNlSGlnaCIsInNEZXZpYXRpb25IaWdoIiwic0NyaXRpY2FsaXR5RXhwcmVzc2lvbiIsIk5ldXRyYWwiLCJJbmZpbml0eSIsIkdvb2QiLCJDcml0aWNhbCIsIndhcm5pbmciLCJfZ2V0Q3JpdGljYWxpdHlGcm9tRW51bSIsInNDcml0aWNhbGl0eSIsInNJbmRpY2F0b3IiLCJnZXRWYWx1ZUNyaXRpY2FsaXR5Iiwic0RpbWVuc2lvbiIsImFWYWx1ZUNyaXRpY2FsaXR5Iiwic1Jlc3VsdCIsImFWYWx1ZXMiLCJvVkMiLCJWYWx1ZSIsIkNyaXRpY2FsaXR5IiwiZ2V0TWVhc3VyZUF0dHJpYnV0ZUluZGV4IiwiaU1lYXN1cmUiLCJvQ2hhcnRBbm5vdGF0aW9ucyIsImFNZWFzdXJlcyIsInNNZWFzdXJlUHJvcGVydHlQYXRoIiwiTWVhc3VyZXMiLCJEeW5hbWljTWVhc3VyZXMiLCJiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cyIsImFNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmVBdHRyaWJ1dGVzIiwiaU1lYXN1cmVBdHRyaWJ1dGUiLCJmbkNoZWNrTWVhc3VyZSIsInNNZWFzdXJlUGF0aCIsIm9NZWFzdXJlQXR0cmlidXRlIiwiaW5kZXgiLCJNZWFzdXJlIiwiRHluYW1pY01lYXN1cmUiLCJzb21lIiwiYmluZCIsImdldE1lYXN1cmVBdHRyaWJ1dGUiLCJzQ2hhcnRBbm5vdGF0aW9uUGF0aCIsInNNZWFzdXJlQXR0cmlidXRlUGF0aCIsIkRhdGFQb2ludCIsImdldE1lYXN1cmVBdHRyaWJ1dGVGb3JNZWFzdXJlIiwic3Vic3RyaW5nIiwiaXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50Iiwib1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCIsIm9UYWJsZU1ldGFkYXRhIiwicGFyZW50RW50aXR5U2V0Iiwic1BhcmVudEVudGl0eVNldFBhdGgiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsImdldERhdGFGcm9tVGVtcGxhdGUiLCJkYXRhRWxlbWVudCIsInNwbGl0UGF0aCIsImRhdGFLZXkiLCJjb25uZWN0ZWREYXRhUGF0aCIsImNvbm5lY3RlZE9iamVjdCIsInRlbXBsYXRlIiwiVGVtcGxhdGUiLCJzcGxpdFRlbXAiLCJ0ZW1wQXJyYXkiLCJ0cmltIiwiRGF0YSIsIm5vdExhc3RJbmRleCIsImVsZW1lbnQiLCJpc0xhc3RJbmRleCIsInRlbXBsYXRlSW5mbyIsImdldERlbGltaXRlciIsInNldE1ldGFNb2RlbCIsImdldFBhcmFtZXRlcnMiLCJvUGFyYW1ldGVySW5mbyIsImdldFBhcmFtZXRlckluZm8iLCJwYXJhbWV0ZXJQcm9wZXJ0aWVzIiwiYnVpbGRBY3Rpb25XcmFwcGVyIiwib1RoaXMiLCJhUGFyYW1zIiwicmVmIiwiaGFuZGxlck1vZHVsZSIsImhhbmRsZXJNZXRob2QiLCJpZCIsIm9BZGRpdGlvbmFsUGFyYW1zIiwiY29udGV4dHMiLCJjb21waWxlRXhwcmVzc2lvbiIsImZuIiwiZ2V0SGlkZGVuUGF0aEV4cHJlc3Npb24iLCJkYXRhRmllbGRBbm5vdGF0aW9ucyIsInJlcXVpcmVzSUNvbnRleHQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbW1vbkhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uLCBmbiwgcmVmIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IG1MaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuXG5jb25zdCBWYWx1ZUNvbG9yID0gbUxpYnJhcnkuVmFsdWVDb2xvcjtcbmNvbnN0IENvbW1vbkhlbHBlciA9IHtcblx0dXNlRmllbGRWYWx1ZUhlbHA6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBTd2l0Y2ggZnJvbSAobmV3KSBtZGM6VmFsdWVIZWxwIHRvIChvbGQpIG1kY0ZpZWxkOkZpZWxkVmFsdWVIZWxwXG5cdFx0cmV0dXJuIGxvY2F0aW9uLmhyZWYuaW5kZXhPZihcInNhcC1mZS1vbGRGaWVsZFZhbHVlSGVscD10cnVlXCIpID4gLTE7XG5cdH0sXG5cblx0Z2V0UGF0aFRvS2V5OiBmdW5jdGlvbiAob0N0eDogYW55KSB7XG5cdFx0cmV0dXJuIG9DdHguZ2V0T2JqZWN0KCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgaWYgYSBmaWVsZCBpcyB2aXNpYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gb0ludGVyZmFjZSBJbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlLCBmYWxzZSwgb3IgZXhwcmVzc2lvbiB3aXRoIHBhdGhcblx0ICovXG5cdGlzVmlzaWJsZTogZnVuY3Rpb24gKHRhcmdldDogb2JqZWN0LCBvSW50ZXJmYWNlOiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdHNQcm9wZXJ0eVBhdGggPSBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b0Fubm90YXRpb25zID0gb01vZGVsLmdldE9iamVjdChgJHtzUHJvcGVydHlQYXRofUBgKSxcblx0XHRcdGhpZGRlbiA9IG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cblx0XHRyZXR1cm4gdHlwZW9mIGhpZGRlbiA9PT0gXCJvYmplY3RcIiA/IFwiez0gISR7XCIgKyBoaWRkZW4uJFBhdGggKyBcIn0gfVwiIDogIWhpZGRlbjtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQWN0aW9uQ29udGV4dFxuXHQgKiBAcGFyYW0gb0ludGVyZmFjZVxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG5cdCAqL1xuXHRpc0RpYWxvZzogZnVuY3Rpb24gKG9BY3Rpb25Db250ZXh0OiBhbnksIG9JbnRlcmZhY2U6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0c1Byb3BlcnR5UGF0aCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRpc0NyaXRpY2FsID0gb01vZGVsLmdldE9iamVjdChgJHtzUHJvcGVydHlQYXRofS9AJHVpNS5vdmVybG9hZEBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbGApO1xuXHRcdGlmIChpc0NyaXRpY2FsKSB7XG5cdFx0XHRyZXR1cm4gXCJEaWFsb2dcIjtcblx0XHR9IGVsc2UgaWYgKG9BY3Rpb25Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBvQWN0aW9uID0gQXJyYXkuaXNBcnJheShvQWN0aW9uQ29udGV4dCkgPyBvQWN0aW9uQ29udGV4dFswXSA6IG9BY3Rpb25Db250ZXh0O1xuXHRcdFx0aWYgKG9BY3Rpb24uJFBhcmFtZXRlciAmJiBvQWN0aW9uLiRQYXJhbWV0ZXIubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gXCJEaWFsb2dcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBcIk5vbmVcIjtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgaWYgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBvSW50ZXJmYWNlIEludGVyZmFjZSBpbnN0YW5jZVxuXHQgKiBAcmV0dXJucyBBIEJpbmRpbmcgRXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgaWYgYSBmaWVsZCBzaG91bGQgYmUgZWRpdGFibGUgb3Igbm90LlxuXHQgKi9cblx0Z2V0UGFyYW1ldGVyRWRpdE1vZGU6IGZ1bmN0aW9uICh0YXJnZXQ6IG9iamVjdCwgb0ludGVyZmFjZTogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9Nb2RlbC5nZXRPYmplY3QoYCR7c1Byb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRmaWVsZENvbnRyb2wgPSBvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXSxcblx0XHRcdGltbXV0YWJsZSA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0sXG5cdFx0XHRjb21wdXRlZCA9IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXTtcblxuXHRcdGxldCBzRWRpdE1vZGU6IEVkaXRNb2RlIHwgc3RyaW5nID0gRWRpdE1vZGUuRWRpdGFibGU7XG5cblx0XHRpZiAoaW1tdXRhYmxlIHx8IGNvbXB1dGVkKSB7XG5cdFx0XHRzRWRpdE1vZGUgPSBFZGl0TW9kZS5SZWFkT25seTtcblx0XHR9IGVsc2UgaWYgKGZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKGZpZWxkQ29udHJvbC4kRW51bU1lbWJlcikge1xuXHRcdFx0XHRpZiAoZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCIpIHtcblx0XHRcdFx0XHRzRWRpdE1vZGUgPSBFZGl0TW9kZS5SZWFkT25seTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL0luYXBwbGljYWJsZVwiIHx8XG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL0hpZGRlblwiXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHNFZGl0TW9kZSA9IEVkaXRNb2RlLkRpc2FibGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZmllbGRDb250cm9sLiRQYXRoKSB7XG5cdFx0XHRcdHNFZGl0TW9kZSA9XG5cdFx0XHRcdFx0XCJ7PSAle1wiICtcblx0XHRcdFx0XHRmaWVsZENvbnRyb2wuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA8IDMgPyAoJXtcIiArXG5cdFx0XHRcdFx0ZmllbGRDb250cm9sLiRQYXRoICtcblx0XHRcdFx0XHRcIn0gPT09IDAgPyAnXCIgK1xuXHRcdFx0XHRcdEVkaXRNb2RlLkRpc2FibGVkICtcblx0XHRcdFx0XHRcIicgOiAnXCIgK1xuXHRcdFx0XHRcdEVkaXRNb2RlLlJlYWRPbmx5ICtcblx0XHRcdFx0XHRcIicpIDogJ1wiICtcblx0XHRcdFx0XHRFZGl0TW9kZS5FZGl0YWJsZSArXG5cdFx0XHRcdFx0XCInfVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBzRWRpdE1vZGU7XG5cdH0sXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbXBsZXRlIG1ldGFwYXRoIHRvIHRoZSB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRcblx0ICogQHBhcmFtIG9JbnRlcmZhY2Vcblx0ICogQHJldHVybnMgVGhlIG1ldGFwYXRoXG5cdCAqL1xuXHRnZXRNZXRhUGF0aDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBvSW50ZXJmYWNlOiBhbnkpIHtcblx0XHRyZXR1cm4gKG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0ICYmIG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCkpIHx8IHVuZGVmaW5lZDtcblx0fSxcblx0aXNEZXNrdG9wOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN5c3RlbS5kZXNrdG9wID09PSB0cnVlO1xuXHR9LFxuXHRnZXRUYXJnZXRDb2xsZWN0aW9uOiBmdW5jdGlvbiAob0NvbnRleHQ6IGFueSwgbmF2Q29sbGVjdGlvbj86IGFueSkge1xuXHRcdGxldCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRpZiAoXG5cdFx0XHRvQ29udGV4dC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiICYmXG5cdFx0XHQob0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHwgb0NvbnRleHQuZ2V0T2JqZWN0KFwiJENvbnRhaW5zVGFyZ2V0XCIpID09PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwpIHtcblx0XHRcdHNQYXRoID1cblx0XHRcdFx0KG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YVBhdGggJiYgb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCkpIHx8XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdH1cblx0XHQvL1N1cHBvcnRpbmcgc1BhdGggb2YgYW55IGZvcm1hdCwgZWl0aGVyICcvPGVudGl0eVNldD4vPG5hdmlnYXRpb25Db2xsZWN0aW9uPicgPE9SPiAnLzxlbnRpdHlTZXQ+LyRUeXBlLzxuYXZpZ2F0aW9uQ29sbGVjdGlvbj4nXG5cdFx0Y29uc3QgYVBhcnRzID0gc1BhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihmdW5jdGlvbiAoc1BhcnQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIHNQYXJ0ICYmIHNQYXJ0ICE9IFwiJFR5cGVcIjtcblx0XHR9KTsgLy9maWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgYW5kIHBhcnRzIHJlZmVycmluZyB0byAnJFR5cGUnXG5cdFx0Y29uc3QgZW50aXR5U2V0ID0gYC8ke2FQYXJ0c1swXX1gO1xuXHRcdGlmIChhUGFydHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gZW50aXR5U2V0O1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uQ29sbGVjdGlvbiA9IG5hdkNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCA/IGFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSA6IG5hdkNvbGxlY3Rpb247XG5cdFx0cmV0dXJuIGAke2VudGl0eVNldH0vJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvJHtuYXZpZ2F0aW9uQ29sbGVjdGlvbn1gOyAvLyB1c2VkIGluIGdvdG9UYXJnZXRFbnRpdHlTZXQgbWV0aG9kIGluIHRoZSBzYW1lIGZpbGVcblx0fSxcblxuXHRpc1Byb3BlcnR5RmlsdGVyYWJsZTogZnVuY3Rpb24gKHByb3BlcnR5OiBhbnksIG9JbnRlcmZhY2U6IGFueSwgb0RhdGFGaWVsZDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRzUHJvcGVydHlQYXRoID0gb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdC8vIExvYWNhdGlvblBhdGggd291bGQgYmUgdGhlIHByZWZpeCBvZiBzUHJvcGVydHlQYXRoLCBleGFtcGxlOiBzUHJvcGVydHlQYXRoID0gJy9DdXN0b21lci9TZXQvTmFtZScgLT4gc1Byb3BlcnR5TG9jYXRpb25QYXRoID0gJy9DdXN0b21lci9TZXQnXG5cdFx0XHRzUHJvcGVydHlMb2NhdGlvblBhdGggPSBDb21tb25IZWxwZXIuZ2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGgob01vZGVsLCBzUHJvcGVydHlQYXRoKSxcblx0XHRcdHNQcm9wZXJ0eSA9IHNQcm9wZXJ0eVBhdGgucmVwbGFjZShgJHtzUHJvcGVydHlMb2NhdGlvblBhdGh9L2AsIFwiXCIpO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGFGaWVsZCAmJlxuXHRcdFx0KG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgfHxcblx0XHRcdFx0b0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIilcblx0XHQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuaXNQcm9wZXJ0eUZpbHRlcmFibGUob01vZGVsLCBzUHJvcGVydHlMb2NhdGlvblBhdGgsIHNQcm9wZXJ0eSk7XG5cdH0sXG5cblx0Z2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChvTW9kZWw6IGFueSwgc1Byb3BlcnR5UGF0aDogYW55KSB7XG5cdFx0bGV0IGlMZW5ndGg7XG5cdFx0bGV0IHNDb2xsZWN0aW9uUGF0aCA9IHNQcm9wZXJ0eVBhdGguc2xpY2UoMCwgc1Byb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdGlmIChvTW9kZWwuZ2V0T2JqZWN0KGAke3NDb2xsZWN0aW9uUGF0aH0vJGtpbmRgKSA9PT0gXCJFbnRpdHlDb250YWluZXJcIikge1xuXHRcdFx0aUxlbmd0aCA9IHNDb2xsZWN0aW9uUGF0aC5sZW5ndGggKyAxO1xuXHRcdFx0c0NvbGxlY3Rpb25QYXRoID0gc1Byb3BlcnR5UGF0aC5zbGljZShpTGVuZ3RoLCBzUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIsIGlMZW5ndGgpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNDb2xsZWN0aW9uUGF0aDtcblx0fSxcblx0Z290b0FjdGlvblBhcmFtZXRlcjogZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvQ29udGV4dC5nZXRPYmplY3QoYCR7c1BhdGh9LyROYW1lYCk7XG5cblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0UGFyYW1ldGVyUGF0aChzUGF0aCwgc1Byb3BlcnR5TmFtZSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBlbnRpdHkgc2V0IG5hbWUgZnJvbSB0aGUgZW50aXR5IHR5cGUgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgT0RhdGEgdjQgbWV0YW1vZGVsIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBFbnRpdHlUeXBlIG9mIHRoZSBhY3Rpb21cblx0ICogQHJldHVybnMgVGhlIEVudGl0eVNldCBvZiB0aGUgYm91bmQgYWN0aW9uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0TmFtZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAodHlwZW9mIG9FbnRpdHlDb250YWluZXJba2V5XSA9PT0gXCJvYmplY3RcIiAmJiBvRW50aXR5Q29udGFpbmVyW2tleV0uJFR5cGUgPT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbWV0YW1vZGVsIHBhdGggY29ycmVjdGx5IGZvciBib3VuZCBhY3Rpb25zIGlmIHVzZWQgd2l0aCBiUmV0dXJuT25seVBhdGggYXMgdHJ1ZSxcblx0ICogZWxzZSByZXR1cm5zIGFuIG9iamVjdCB3aGljaCBoYXMgMyBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIGFjdGlvbi4gVGhleSBhcmUgdGhlIGVudGl0eSBzZXQgbmFtZSxcblx0ICogdGhlICRQYXRoIHZhbHVlIG9mIHRoZSBPcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG5hbWUuIElmXG5cdCAqIGJDaGVja1N0YXRpY1ZhbHVlIGlzIHRydWUsIHJldHVybnMgdGhlIHN0YXRpYyB2YWx1ZSBvZiBPcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbiwgaWYgcHJlc2VudC5cblx0ICogZS5nLiBmb3IgYm91bmQgYWN0aW9uIHNvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uXG5cdCAqIG9mIGVudGl0eSBzZXQgU29tZUVudGl0eVNldCwgdGhlIHN0cmluZyBcIi9Tb21lRW50aXR5U2V0L3NvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uXCIgaXMgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiUmV0dXJuT25seVBhdGggSWYgZmFsc2UsIGFkZGl0aW9uYWwgaW5mbyBpcyByZXR1cm5lZCBhbG9uZyB3aXRoIG1ldGFtb2RlbCBwYXRoIHRvIHRoZSBib3VuZCBhY3Rpb25cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBib3VuZCBhY3Rpb24gb2YgdGhlIGZvcm0gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cblx0ICogQHBhcmFtIGJDaGVja1N0YXRpY1ZhbHVlIElmIHRydWUsIHRoZSBzdGF0aWMgdmFsdWUgb2YgT3BlcmF0aW9uQXZhaWxhYmxlIGlzIHJldHVybmVkLCBpZiBwcmVzZW50XG5cdCAqIEByZXR1cm5zIFRoZSBzdHJpbmcgb3Igb2JqZWN0IGFzIHNwZWNpZmllZCBieSBiUmV0dXJuT25seVBhdGhcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXRoOiBmdW5jdGlvbiAob0FjdGlvbjogYW55LCBiUmV0dXJuT25seVBhdGg6IGJvb2xlYW4sIHNBY3Rpb25OYW1lPzogc3RyaW5nLCBiQ2hlY2tTdGF0aWNWYWx1ZT86IGJvb2xlYW4pIHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb0FjdGlvbi5nZXRQYXRoKCkuc3BsaXQoXCIvQFwiKVswXTtcblxuXHRcdHNBY3Rpb25OYW1lID0gIXNBY3Rpb25OYW1lID8gb0FjdGlvbi5nZXRPYmplY3Qob0FjdGlvbi5nZXRQYXRoKCkpIDogc0FjdGlvbk5hbWU7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gYWN0aW9uIGJvdW5kIHRvIGFub3RoZXIgZW50aXR5IHR5cGVcblx0XHRcdHNBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpWzBdO1xuXHRcdH0gZWxzZSBpZiAob0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKSkge1xuXHRcdFx0Ly8gVE9ETzogdGhpcyBsb2dpYyBzb3VuZHMgd3JvbmcsIHRvIGJlIGNvcnJlY3RlZFxuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGVOYW1lID0gb0FjdGlvbi5nZXRPYmplY3Qoc0NvbnRleHRQYXRoKS4kVHlwZTtcblx0XHRcdGNvbnN0IHNFbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlTZXROYW1lKG9BY3Rpb24uZ2V0TW9kZWwoKSwgc0VudGl0eVR5cGVOYW1lKTtcblx0XHRcdGlmIChzRW50aXR5TmFtZSkge1xuXHRcdFx0XHRzQ29udGV4dFBhdGggPSBgLyR7c0VudGl0eU5hbWV9YDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNDb250ZXh0UGF0aDtcblx0XHR9XG5cblx0XHRpZiAoYkNoZWNrU3RhdGljVmFsdWUpIHtcblx0XHRcdHJldHVybiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9QE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWApO1xuXHRcdH1cblx0XHRpZiAoYlJldHVybk9ubHlQYXRoKSB7XG5cdFx0XHRyZXR1cm4gYCR7c0NvbnRleHRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNDb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0XHRzUHJvcGVydHk6IG9BY3Rpb24uZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vJHtzQWN0aW9uTmFtZX1AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlLyRQYXRoYCksXG5cdFx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyOiBvQWN0aW9uLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9LyR7c0FjdGlvbk5hbWV9L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlci8wLyROYW1lYClcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdGdldE5hdmlnYXRpb25Db250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiBPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlci5nZXROYXZpZ2F0aW9uUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhvdXQgdGhlIGVudGl0eSB0eXBlIChwb3RlbnRpYWxseSBmaXJzdCkgYW5kIHByb3BlcnR5IChsYXN0KSBwYXJ0IChvcHRpb25hbCkuXG5cdCAqIFRoZSByZXN1bHQgY2FuIGJlIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBhIHNpbXBsZSBkaXJlY3QgcHJvcGVydHkuXG5cdCAqXG5cdCAqIElmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBwYXRoIHN0YXJ0cyB3aXRoIGEgc2xhc2ggKC8pLCBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGVudGl0eSB0eXBlXG5cdCAqIGlzIHBhcnQgb2YgdGhlIHBhdGggYW5kIHdpbGwgYmUgc3RyaXBwZWQgYXdheS5cblx0ICpcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGhcblx0ICogQHBhcmFtIGJLZWVwUHJvcGVydHlcblx0ICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gcGF0aFxuXHQgKi9cblx0Z2V0TmF2aWdhdGlvblBhdGg6IGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBhbnksIGJLZWVwUHJvcGVydHk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgYlN0YXJ0c1dpdGhFbnRpdHlUeXBlID0gc1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKTtcblx0XHRjb25zdCBhUGFydHMgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoZnVuY3Rpb24gKHBhcnQ6IGFueSkge1xuXHRcdFx0cmV0dXJuICEhcGFydDtcblx0XHR9KTtcblx0XHRpZiAoYlN0YXJ0c1dpdGhFbnRpdHlUeXBlKSB7XG5cdFx0XHRhUGFydHMuc2hpZnQoKTtcblx0XHR9XG5cdFx0aWYgKCFiS2VlcFByb3BlcnR5KSB7XG5cdFx0XHRhUGFydHMucG9wKCk7XG5cdFx0fVxuXHRcdHJldHVybiBhUGFydHMuam9pbihcIi9cIik7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNvcnJlY3QgbWV0YW1vZGVsIHBhdGggZm9yIGJvdW5kIGFjdGlvbnMuXG5cdCAqXG5cdCAqIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpcnJlc3BlY3RpdmUgb2YgdGhlIGFjdGlvbiB0eXBlLCB0aGlzIHdpbGwgYmUgYXBwbGllZCB0byB1bmJvdW5kIGFjdGlvbnMuXG5cdCAqIEluIHN1Y2ggYSBjYXNlLCBpZiBhbiBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgaXQgaXMgaWdub3JlZCBkdXJpbmcgdGVtcGxhdGluZy5cblx0ICpcblx0ICogRXhhbXBsZTogZm9yIHRoZSBib3VuZCBhY3Rpb24gc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb24gb2YgZW50aXR5IHNldCBTb21lRW50aXR5U2V0LFxuXHQgKiB0aGUgc3RyaW5nIFwiL1NvbWVFbnRpdHlTZXQvc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cIiBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXIuZ2V0QWN0aW9uQ29udGV4dFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIG9BY3Rpb24gQ29udGV4dCBvYmplY3QgZm9yIHRoZSBhY3Rpb25cblx0ICogQHJldHVybnMgQ29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYW5kIGluY29ycmVjdCBwYXRoIGZvciB1bmJvdW5kIGFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRBY3Rpb25Db250ZXh0OiBmdW5jdGlvbiAob0FjdGlvbjogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZXRBY3Rpb25QYXRoKG9BY3Rpb24sIHRydWUpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbWV0YW1vZGVsIHBhdGggY29ycmVjdGx5IGZvciBvdmVybG9hZGVkIGJvdW5kIGFjdGlvbnMuIEZvciB1bmJvdW5kIGFjdGlvbnMsXG5cdCAqIHRoZSBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgYnV0IGlnbm9yZWQgZHVyaW5nIHRlbXBsYXRpbmcuXG5cdCAqIGUuZy4gZm9yIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbiBvZiBlbnRpdHkgc2V0IFNvbWVFbnRpdHlTZXQsXG5cdCAqIHRoZSBzdHJpbmcgXCIvU29tZUVudGl0eVNldC9zb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbi9AJHVpNS5vdmVybG9hZC8wXCIgaXMgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyLmdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBtZXRhbW9kZWwgcGF0aCBmb3IgYm91bmQgYWN0aW9uIG92ZXJsb2FkIGFuZCBpbmNvcnJlY3QgcGF0aCBmb3IgdW5ib3VuZCBhY3Rpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0UGF0aFRvQm91bmRBY3Rpb25PdmVybG9hZDogZnVuY3Rpb24gKG9BY3Rpb246IG9iamVjdCkge1xuXHRcdGNvbnN0IHNQYXRoID0gQ29tbW9uSGVscGVyLmdldEFjdGlvblBhdGgob0FjdGlvbiwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGAke3NQYXRofS9AJHVpNS5vdmVybG9hZC8wYDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgc3RyaW5nIHdpdGggc2luZ2xlIHF1b3Rlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIGludG8gc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcGFyYW0gW2JFc2NhcGVdIFNob3VsZCB0aGUgc3RyaW5nIGJlIGVzY2FwZWQgYmVmb3JlaGFuZFxuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIHNpbmdsZSBxdW90ZXNcblx0ICovXG5cdGFkZFNpbmdsZVF1b3RlczogZnVuY3Rpb24gKHNWYWx1ZTogc3RyaW5nLCBiRXNjYXBlPzogYm9vbGVhbikge1xuXHRcdGlmIChiRXNjYXBlICYmIHNWYWx1ZSkge1xuXHRcdFx0c1ZhbHVlID0gdGhpcy5lc2NhcGVTaW5nbGVRdW90ZXMoc1ZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGAnJHtzVmFsdWV9J2A7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRoIGVzY2FwZWQgc2luZ2xlIHF1b3Rlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gc1ZhbHVlIFNvbWUgc3RyaW5nIHRoYXQgbmVlZHMgZXNjYXBpbmcgb2Ygc2luZ2xlIHF1b3Rlc1xuXHQgKiBAcmV0dXJucyAtIFN0cmluZyB3aXRoIGVzY2FwZWQgc2luZ2xlIHF1b3Rlc1xuXHQgKi9cblx0ZXNjYXBlU2luZ2xlUXVvdGVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gc1ZhbHVlLnJlcGxhY2UoL1snXS9nLCBcIlxcXFwnXCIpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBzdHJpbmdcblx0ICogVGhlIGZpcnN0IGFyZ3VtZW50IG9mIGdlbmVyYXRlRnVuY3Rpb24gaXMgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIHN0cmluZy5cblx0ICogUmVtYWluaW5nIGFyZ3VtZW50cyBvZiBnZW5lcmF0ZUZ1bmN0aW9uIGFyZSBhcmd1bWVudHMgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCBmdW5jdGlvbiBzdHJpbmcuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIHNGdW5jTmFtZSBTb21lIHN0cmluZyBmb3IgdGhlIGZ1bmN0aW9uIG5hbWVcblx0ICogQHBhcmFtIGFyZ3MgVGhlIHJlbWFpbmluZyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgLSBGdW5jdGlvbiBzdHJpbmcgZGVwZW5kcyBvbiBhcmd1bWVudHMgcGFzc2VkXG5cdCAqL1xuXHRnZW5lcmF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoc0Z1bmNOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSB7XG5cdFx0bGV0IHNQYXJhbXMgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1BhcmFtcyArPSBhcmdzW2ldO1xuXHRcdFx0aWYgKGkgPCBhcmdzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0c1BhcmFtcyArPSBcIiwgXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNGdW5jdGlvbiA9IGAke3NGdW5jTmFtZX0oKWA7XG5cdFx0aWYgKHNQYXJhbXMpIHtcblx0XHRcdHNGdW5jdGlvbiA9IGAke3NGdW5jTmFtZX0oJHtzUGFyYW1zfSlgO1xuXHRcdH1cblx0XHRyZXR1cm4gc0Z1bmN0aW9uO1xuXHR9LFxuXHQvKlxuXHQgKiBSZXR1cm5zIHRoZSB2aXNpYmlsaXR5IGV4cHJlc3Npb24gZm9yIGRhdGFwb2ludCB0aXRsZS9saW5rXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NQYXRoXSBhbm5vdGF0aW9uIHBhdGggb2YgZGF0YSBwb2ludCBvciBNaWNyb2NoYXJ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JMaW5rXSB0cnVlIGlmIGxpbmsgdmlzaWJpbGl0eSBpcyBiZWluZyBkZXRlcm1pbmVkLCBmYWxzZSBpZiB0aXRsZSB2aXNpYmlsaXR5IGlzIGJlaW5nIGRldGVybWluZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBbYkZpZWxkVmlzaWJpbGl0eV0gdHJ1ZSBpZiBmaWVsZCBpcyB2c2lpYmxlLCBmYWxzZSBvdGhlcndpc2Vcblx0ICogQHJldHVybnMgIHtzdHJpbmd9IHNWaXNpYmlsaXR5RXhwIFVzZWQgdG8gZ2V0IHRoZSAgdmlzaWJpbGl0eSBiaW5kaW5nIGZvciBEYXRhUG9pbnRzIHRpdGxlIGluIHRoZSBIZWFkZXIuXG5cdCAqXG5cdCAqL1xuXG5cdGdldEhlYWRlckRhdGFQb2ludExpbmtWaXNpYmlsaXR5OiBmdW5jdGlvbiAoc1BhdGg6IGFueSwgYkxpbms6IGFueSwgYkZpZWxkVmlzaWJpbGl0eTogYW55KSB7XG5cdFx0bGV0IHNWaXNpYmlsaXR5RXhwO1xuXHRcdGlmIChiRmllbGRWaXNpYmlsaXR5KSB7XG5cdFx0XHRzVmlzaWJpbGl0eUV4cCA9IGJMaW5rXG5cdFx0XHRcdD8gXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ID09PSB0cnVlICYmIFwiICsgYkZpZWxkVmlzaWJpbGl0eSArIFwifVwiXG5cdFx0XHRcdDogXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ICE9PSB0cnVlICYmIFwiICsgYkZpZWxkVmlzaWJpbGl0eSArIFwifVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVmlzaWJpbGl0eUV4cCA9IGJMaW5rXG5cdFx0XHRcdD8gXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ID09PSB0cnVlfVwiXG5cdFx0XHRcdDogXCJ7PSAke2ludGVybmFsPmlzSGVhZGVyRFBMaW5rVmlzaWJsZS9cIiArIHNQYXRoICsgXCJ9ICE9PSB0cnVlfVwiO1xuXHRcdH1cblx0XHRyZXR1cm4gc1Zpc2liaWxpdHlFeHA7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIG9iamVjdCB0byBzdHJpbmcoZGlmZmVyZW50IGZyb20gSlNPTi5zdHJpbmdpZnkgb3IudG9TdHJpbmcpLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvUGFyYW1zIFNvbWUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIC0gT2JqZWN0IHN0cmluZ1xuXHQgKi9cblx0b2JqZWN0VG9TdHJpbmc6IGZ1bmN0aW9uIChvUGFyYW1zOiBhbnkpIHtcblx0XHRsZXQgaU51bWJlck9mS2V5cyA9IE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCxcblx0XHRcdHNQYXJhbXMgPSBcIlwiO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIG9QYXJhbXMpIHtcblx0XHRcdGxldCBzVmFsdWUgPSBvUGFyYW1zW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSAmJiB0eXBlb2Ygc1ZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHNWYWx1ZSA9IHRoaXMub2JqZWN0VG9TdHJpbmcoc1ZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHNQYXJhbXMgKz0gYCR7c0tleX06ICR7c1ZhbHVlfWA7XG5cdFx0XHRpZiAoaU51bWJlck9mS2V5cyA+IDEpIHtcblx0XHRcdFx0LS1pTnVtYmVyT2ZLZXlzO1xuXHRcdFx0XHRzUGFyYW1zICs9IFwiLCBcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYHsgJHtzUGFyYW1zfX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGVzY2FwZSBjaGFyYWN0ZXJzIChcXCkgZnJvbSBhbiBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5tYWNyb3MuQ29tbW9uSGVscGVyXG5cdCAqIEBwYXJhbSBzRXhwcmVzc2lvbiBBbiBleHByZXNzaW9uIHdpdGggZXNjYXBlIGNoYXJhY3RlcnNcblx0ICogQHJldHVybnMgRXhwcmVzc2lvbiBzdHJpbmcgd2l0aG91dCBlc2NhcGUgY2hhcmFjdGVycyBvciB1bmRlZmluZWRcblx0ICovXG5cdHJlbW92ZUVzY2FwZUNoYXJhY3RlcnM6IGZ1bmN0aW9uIChzRXhwcmVzc2lvbjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNFeHByZXNzaW9uID8gc0V4cHJlc3Npb24ucmVwbGFjZSgvXFxcXD9cXFxcKFt7fV0pL2csIFwiJDFcIikgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ha2VzIHVwZGF0ZXMgdG8gYSBzdHJpbmdpZmllZCBvYmplY3Qgc28gdGhhdCBpdCB3b3JrcyBwcm9wZXJseSBpbiBhIHRlbXBsYXRlIGJ5IGFkZGluZyB1aTVPYmplY3Q6dHJ1ZS5cblx0ICpcblx0ICogQHBhcmFtIHNTdHJpbmdpZmllZFxuXHQgKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdFxuXHQgKi9cblx0c3RyaW5naWZ5T2JqZWN0OiBmdW5jdGlvbiAoc1N0cmluZ2lmaWVkOiBzdHJpbmcpIHtcblx0XHRpZiAoIXNTdHJpbmdpZmllZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb09iamVjdCA9IEpTT04ucGFyc2Uoc1N0cmluZ2lmaWVkKTtcblx0XHRcdGlmICh0eXBlb2Ygb09iamVjdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShvT2JqZWN0KSkge1xuXHRcdFx0XHRjb25zdCBvVUk1T2JqZWN0ID0ge1xuXHRcdFx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRPYmplY3QuYXNzaWduKG9VSTVPYmplY3QsIG9PYmplY3QpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob1VJNU9iamVjdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzVHlwZSA9IEFycmF5LmlzQXJyYXkob09iamVjdCkgPyBcIkFycmF5XCIgOiB0eXBlb2Ygb09iamVjdDtcblx0XHRcdFx0TG9nLmVycm9yKGBVbmV4cGVjdGVkIG9iamVjdCB0eXBlIGluIHN0cmluZ2lmeU9iamVjdCAoJHtzVHlwZX0pIC0gb25seSB3b3JrcyB3aXRoIG9iamVjdGApO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmdpZnlPYmplY3Qgb25seSB3b3JrcyB3aXRoIG9iamVjdHMhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkYXRhLCB0YWtpbmcgY2FyZSB0aGF0IGl0IGlzIG5vdCB0cmVhdGVkIGFzIGEgYmluZGluZyBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gc3RyaW5naWZ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEuXG5cdCAqL1xuXHRzdHJpbmdpZnlDdXN0b21EYXRhOiBmdW5jdGlvbiAodkRhdGE6IG9iamVjdCkge1xuXHRcdGNvbnN0IG9PYmplY3Q6IGFueSA9IHtcblx0XHRcdHVpNW9iamVjdDogdHJ1ZVxuXHRcdH07XG5cdFx0b09iamVjdFtcImN1c3RvbURhdGFcIl0gPSB2RGF0YSBpbnN0YW5jZW9mIENvbnRleHQgPyB2RGF0YS5nZXRPYmplY3QoKSA6IHZEYXRhO1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvT2JqZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBkYXRhLCBwb3RlbnRpYWxseSB1bndyYXBzIHRoZSBkYXRhLlxuXHQgKlxuXHQgKiBAcGFyYW0gdkRhdGEgVGhlIGRhdGEgdG8gcGFyc2Vcblx0ICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZGF0YSBwYXJzaW5nXG5cdCAqL1xuXHRwYXJzZUN1c3RvbURhdGE6IGZ1bmN0aW9uICh2RGF0YTogYW55KSB7XG5cdFx0dkRhdGEgPSB0eXBlb2YgdkRhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEYXRhKSA6IHZEYXRhO1xuXHRcdGlmICh2RGF0YSAmJiB2RGF0YS5oYXNPd25Qcm9wZXJ0eShcImN1c3RvbURhdGFcIikpIHtcblx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0fVxuXHRcdHJldHVybiB2RGF0YTtcblx0fSxcblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBUaGUgRW50aXR5VHlwZSBuYW1lXG5cdCAqIEByZXR1cm5zIFRoZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVxuXHQgKi9cblx0X2dldERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhVHlwZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgLyR7c0VudGl0eVR5cGV9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL2ApO1xuXHR9LFxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFBvcG92ZXJUZXh0XG5cdCAqIEBwYXJhbSBpQ29udGV4dFxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGUgVGhlIEVudGl0eVR5cGUgbmFtZVxuXHQgKiBAcmV0dXJucyBUaGUgQmluZGluZyBFeHByZXNzaW9uIGZvciB0aGUgZHJhZnQgcG9wb3ZlclxuXHQgKi9cblx0Z2V0UG9wb3ZlclRleHQ6IGZ1bmN0aW9uIChpQ29udGV4dDogYW55LCBzRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5fZ2V0RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFUeXBlKGlDb250ZXh0LmdldE1vZGVsKCksIHNFbnRpdHlUeXBlKS50aGVuKGZ1bmN0aW9uIChvREFERW50aXR5VHlwZSkge1xuXHRcdFx0bGV0IHNCaW5kaW5nID1cblx0XHRcdFx0XCJ7cGFydHM6IFt7cGF0aDogJ0hhc0RyYWZ0RW50aXR5JywgdGFyZ2V0VHlwZTogJ2FueSd9LCBcIiArXG5cdFx0XHRcdC8vXCJ7cGF0aDogJ0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZSd9LCBcIiArXG5cdFx0XHRcdFwie3BhdGg6ICdEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9JblByb2Nlc3NCeVVzZXInfSwgXCIgK1xuXHRcdFx0XHRcIntwYXRoOiAnRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZWRCeVVzZXInfSBcIjtcblx0XHRcdGlmIChvREFERW50aXR5VHlwZS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbikge1xuXHRcdFx0XHRzQmluZGluZyArPSBcIiAse3BhdGg6ICdEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbid9XCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvREFERW50aXR5VHlwZS5MYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdHNCaW5kaW5nICs9IFwiLCB7cGF0aDogJ0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb24nfVwiO1xuXHRcdFx0fVxuXHRcdFx0c0JpbmRpbmcgKz0gXCJdLCBmb3JtYXR0ZXI6ICdzYXAuZmUubWFjcm9zLmZpZWxkLkZpZWxkUnVudGltZS5mb3JtYXREcmFmdE93bmVyVGV4dEluUG9wb3Zlcid9XCI7XG5cdFx0XHRyZXR1cm4gc0JpbmRpbmc7XG5cdFx0fSk7XG5cdH0sXG5cdGdldENvbnRleHRQYXRoOiBmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG9JbnRlcmZhY2U6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQgJiYgb0ludGVyZmFjZS5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRyZXR1cm4gc1BhdGhbc1BhdGgubGVuZ3RoIC0gMV0gPT09IFwiL1wiID8gc1BhdGguc2xpY2UoMCwgLTEpIDogc1BhdGg7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QgY29udGFpbmluZyAgUHJlc2VudGF0aW9uIFZhcmlhbnQgc29ydCBjb25kaXRpb25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHBhcmFtIG9QcmVzZW50YXRpb25WYXJpYW50IFByZXNlbnRhdGlvbiB2YXJpYW50IEFubm90YXRpb25cblx0ICogQHBhcmFtIHNQcmVzZW50YXRpb25WYXJpYW50UGF0aFxuXHQgKiBAcmV0dXJucyBTdHJpbmdpZmllZCBKU09OIG9iamVjdFxuXHQgKi9cblx0Z2V0U29ydENvbmRpdGlvbnM6IGZ1bmN0aW9uIChvQ29udGV4dDogYW55LCBvUHJlc2VudGF0aW9uVmFyaWFudDogYW55LCBzUHJlc2VudGF0aW9uVmFyaWFudFBhdGg6IHN0cmluZykge1xuXHRcdGlmIChcblx0XHRcdG9QcmVzZW50YXRpb25WYXJpYW50ICYmXG5cdFx0XHRDb21tb25IZWxwZXIuX2lzUHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24oc1ByZXNlbnRhdGlvblZhcmlhbnRQYXRoKSAmJlxuXHRcdFx0b1ByZXNlbnRhdGlvblZhcmlhbnQuU29ydE9yZGVyXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBhU29ydENvbmRpdGlvbnM6IGFueSA9IHtcblx0XHRcdFx0c29ydGVyczogW11cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgwKS5zcGxpdChcIkBcIilbMF07XG5cdFx0XHRvUHJlc2VudGF0aW9uVmFyaWFudC5Tb3J0T3JkZXIuZm9yRWFjaChmdW5jdGlvbiAob0NvbmRpdGlvbjogYW55ID0ge30pIHtcblx0XHRcdFx0bGV0IG9Tb3J0UHJvcGVydHk6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvU29ydGVyOiBhbnkgPSB7fTtcblx0XHRcdFx0aWYgKG9Db25kaXRpb24uRHluYW1pY1Byb3BlcnR5KSB7XG5cdFx0XHRcdFx0b1NvcnRQcm9wZXJ0eSA9IG9Db250ZXh0LmdldE1vZGVsKDApLmdldE9iamVjdChzRW50aXR5UGF0aCArIG9Db25kaXRpb24uRHluYW1pY1Byb3BlcnR5LiRBbm5vdGF0aW9uUGF0aCk/Lk5hbWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0NvbmRpdGlvbi5Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdG9Tb3J0UHJvcGVydHkgPSBvQ29uZGl0aW9uLlByb3BlcnR5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9Tb3J0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRvU29ydGVyLm5hbWUgPSBvU29ydFByb3BlcnR5O1xuXHRcdFx0XHRcdG9Tb3J0ZXIuZGVzY2VuZGluZyA9ICEhb0NvbmRpdGlvbi5EZXNjZW5kaW5nO1xuXHRcdFx0XHRcdGFTb3J0Q29uZGl0aW9ucy5zb3J0ZXJzLnB1c2gob1NvcnRlcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIGRlZmluZSB0aGUgcmlnaHQgcGF0aCB0byB0aGUgc29ydCBwcm9wZXJ0eVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYVNvcnRDb25kaXRpb25zKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblx0X2lzUHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IGZ1bmN0aW9uIChzQW5ub3RhdGlvblBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiAoXG5cdFx0XHRzQW5ub3RhdGlvblBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QcmVzZW50YXRpb25WYXJpYW50XCIpID4gLTEgfHxcblx0XHRcdHNBbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cdGNyZWF0ZVByZXNlbnRhdGlvblBhdGhDb250ZXh0OiBmdW5jdGlvbiAob1ByZXNlbnRhdGlvbkNvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IGFQYXRocyA9IG9QcmVzZW50YXRpb25Db250ZXh0LnNQYXRoLnNwbGl0KFwiQFwiKSB8fCBbXTtcblx0XHRjb25zdCBvTW9kZWwgPSBvUHJlc2VudGF0aW9uQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGlmIChhUGF0aHMubGVuZ3RoICYmIGFQYXRoc1thUGF0aHMubGVuZ3RoIC0gMV0uaW5kZXhPZihcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRcIikgPiAtMSkge1xuXHRcdFx0Y29uc3Qgc1BhdGggPSBvUHJlc2VudGF0aW9uQ29udGV4dC5zUGF0aC5zcGxpdChcIi9QcmVzZW50YXRpb25WYXJpYW50XCIpWzBdO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdH1cblx0XHRyZXR1cm4gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke29QcmVzZW50YXRpb25Db250ZXh0LnNQYXRofUBzYXB1aS5uYW1lYCk7XG5cdH0sXG5cdGdldFByZXNzSGFuZGxlckZvckRhdGFGaWVsZEZvcklCTjogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0NvbnRleHQ6IHN0cmluZywgYk5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG1OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBzQ29udGV4dCA/IHNDb250ZXh0IDogXCIkeyRzb3VyY2U+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiXG5cdFx0fTtcblx0XHRpZiAob0RhdGFGaWVsZC5SZXF1aXJlc0NvbnRleHQgJiYgIW9EYXRhRmllbGQuSW5saW5lICYmIGJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2cpIHtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgPVxuXHRcdFx0XHRcIiR7aW50ZXJuYWw+aWJuL1wiICsgb0RhdGFGaWVsZC5TZW1hbnRpY09iamVjdCArIFwiLVwiICsgb0RhdGFGaWVsZC5BY3Rpb24gKyBcIi9hQXBwbGljYWJsZS99XCI7XG5cdFx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzID1cblx0XHRcdFx0XCIke2ludGVybmFsPmlibi9cIiArIG9EYXRhRmllbGQuU2VtYW50aWNPYmplY3QgKyBcIi1cIiArIG9EYXRhRmllbGQuQWN0aW9uICsgXCIvYU5vdEFwcGxpY2FibGUvfVwiO1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsID0gdGhpcy5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSk7XG5cdFx0fVxuXHRcdGlmIChvRGF0YUZpZWxkLk1hcHBpbmcpIHtcblx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmcgPSB0aGlzLmFkZFNpbmdsZVF1b3RlcyhKU09OLnN0cmluZ2lmeShvRGF0YUZpZWxkLk1hcHBpbmcpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdGJOYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2cgPyBcIi5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZ1wiIDogXCIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZVwiLFxuXHRcdFx0dGhpcy5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZC5TZW1hbnRpY09iamVjdCksXG5cdFx0XHR0aGlzLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkLkFjdGlvbiksXG5cdFx0XHR0aGlzLm9iamVjdFRvU3RyaW5nKG1OYXZpZ2F0aW9uUGFyYW1ldGVycylcblx0XHQpO1xuXHR9LFxuXHRnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGZvcm0gbWVudSBhY3Rpb25zIGJvdGggaW4gcGF0aCBiYXNlZCBhbmQgc3RhdGljIHZhbHVlIHNjZW5hcmlvcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gc1Zpc2libGVWYWx1ZSBFaXRoZXIgc3RhdGljIGJvb2xlYW4gdmFsdWVzIG9yIEFycmF5IG9mIHBhdGggZXhwcmVzc2lvbnMgZm9yIHZpc2liaWxpdHkgb2YgbWVudSBidXR0b24uXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZGV0ZXJtaW5pbmcgdGhlIHZpc2liaWxpdHkgb2YgbWVudSBhY3Rpb25zLlxuXHQgKi9cblx0aGFuZGxlVmlzaWJpbGl0eU9mTWVudUFjdGlvbnM6IGZ1bmN0aW9uIChzVmlzaWJsZVZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCBjb21iaW5lZENvbmRpdGlvbnMgPSBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShzVmlzaWJsZVZhbHVlKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzVmlzaWJsZVZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChzVmlzaWJsZVZhbHVlW2ldLmluZGV4T2YoXCJ7XCIpID4gLTEgJiYgc1Zpc2libGVWYWx1ZVtpXS5pbmRleE9mKFwiez1cIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0c1Zpc2libGVWYWx1ZVtpXSA9IFwiez1cIiArIHNWaXNpYmxlVmFsdWVbaV0gKyBcIn1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc1Zpc2libGVWYWx1ZVtpXS5zcGxpdChcIns9XCIpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRzVmlzaWJsZVZhbHVlW2ldID0gc1Zpc2libGVWYWx1ZVtpXS5zcGxpdChcIns9XCIpWzFdLnNsaWNlKDAsIC0xKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21iaW5lZENvbmRpdGlvbnMucHVzaChgKCR7c1Zpc2libGVWYWx1ZVtpXX0pYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb21iaW5lZENvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGB7PSAke2NvbWJpbmVkQ29uZGl0aW9ucy5qb2luKFwiIHx8IFwiKX19YCA6IHNWaXNpYmxlVmFsdWU7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZG8gdGhlIGNhbGN1bGF0aW9uIG9mIGNyaXRpY2FsaXR5IGluIGNhc2UgQ3JpdGljYWxpdHlDYWxjdWxhdGlvbiBwcmVzZW50IGluIHRoZSBhbm5vdGF0aW9uXG5cdCAqXG5cdCAqIFRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGJ5IGNvbXBhcmluZyBhIHZhbHVlIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWVzIHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWVkIGltcHJvdmVtZW50IGRpcmVjdGlvbi5cblx0ICogRm9yIGltcHJvdmVtZW50IGRpcmVjdGlvbiBUYXJnZXQsIHRoZSBjcml0aWNhbGl0eSBpcyBjYWxjdWxhdGVkIHVzaW5nIGJvdGggbG93IGFuZCBoaWdoIHRocmVzaG9sZCB2YWx1ZXMuIEl0IHdpbGwgYmVcblx0ICpcblx0ICogLSBQb3NpdGl2ZSBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBsb3dlciB0aGFuIEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlIE9SIGdyZWF0ZXIgdGhhbiBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlTG93VmFsdWUgYW5kIGxvd2VyIHRoYW4gVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSBPUiBncmVhdGVyIHRoYW4gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBOZWdhdGl2ZSBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUxvd1ZhbHVlIG9yIGdyZWF0ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKlxuXHQgKiBGb3IgaW1wcm92ZW1lbnQgZGlyZWN0aW9uIE1pbmltaXplLCB0aGUgY3JpdGljYWxpdHkgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgaGlnaCB0aHJlc2hvbGQgdmFsdWVzLiBJdCBpc1xuXHQgKiAtIFBvc2l0aXZlIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUgYW5kIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlIGFuZCBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gTmVnYXRpdmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZVxuXHQgKlxuXHQgKiBGb3IgaW1wcm92ZW1lbnQgZGlyZWN0aW9uIE1heGltaXplLCB0aGUgY3JpdGljYWxpdHkgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgbG93IHRocmVzaG9sZCB2YWx1ZXMuIEl0IGlzXG5cdCAqXG5cdCAqIC0gUG9zaXRpdmUgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZVxuXHQgKiAtIE5ldXRyYWwgaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiBBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFRvbGVyYW5jZVJhbmdlTG93VmFsdWVcblx0ICogLSBDcml0aWNhbCBpZiB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiBUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZVxuXHQgKiAtIE5lZ2F0aXZlIGlmIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIERldmlhdGlvblJhbmdlTG93VmFsdWVcblx0ICpcblx0ICogVGhyZXNob2xkcyBhcmUgb3B0aW9uYWwuIEZvciB1bmFzc2lnbmVkIHZhbHVlcywgZGVmYXVsdHMgYXJlIGRldGVybWluZWQgaW4gdGhpcyBvcmRlcjpcblx0ICpcblx0ICogLSBGb3IgRGV2aWF0aW9uUmFuZ2UsIGFuIG9taXR0ZWQgTG93VmFsdWUgdHJhbnNsYXRlcyBpbnRvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBudW1iZXIgKC1JTkYpLCBhbiBvbWl0dGVkIEhpZ2hWYWx1ZSB0cmFuc2xhdGVzIGludG8gdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyICgrSU5GKVxuXHQgKiAtIEZvciBUb2xlcmFuY2VSYW5nZSwgYW4gb21pdHRlZCBMb3dWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSwgYW4gb21pdHRlZCBIaWdoVmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIERldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdCAqIC0gRm9yIEFjY2VwdGFuY2VSYW5nZSwgYW4gb21pdHRlZCBMb3dWYWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSwgYW4gb21pdHRlZCBIaWdoVmFsdWUgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ltcHJvdmVtZW50RGlyZWN0aW9uIEltcHJvdmVtZW50RGlyZWN0aW9uIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBjcml0aWNhbGl0eSBiaW5kaW5nXG5cdCAqIEBwYXJhbSBzVmFsdWUgVmFsdWUgZnJvbSBEYXRhcG9pbnQgdG8gYmUgbWVhc3VyZWRcblx0ICogQHBhcmFtIHNEZXZpYXRpb25Mb3cgRXhwcmVzc2lvbkJpbmRpbmcgZm9yIExvd2VyIERldmlhdGlvbiBsZXZlbFxuXHQgKiBAcGFyYW0gc1RvbGVyYW5jZUxvdyBFeHByZXNzaW9uQmluZGluZyBmb3IgTG93ZXIgVG9sZXJhbmNlIGxldmVsXG5cdCAqIEBwYXJhbSBzQWNjZXB0YW5jZUxvdyBFeHByZXNzaW9uQmluZGluZyBmb3IgTG93ZXIgQWNjZXB0YW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc0FjY2VwdGFuY2VIaWdoIEV4cHJlc3Npb25CaW5kaW5nIGZvciBIaWdoZXIgQWNjZXB0YW5jZSBsZXZlbFxuXHQgKiBAcGFyYW0gc1RvbGVyYW5jZUhpZ2ggRXhwcmVzc2lvbkJpbmRpbmcgZm9yIEhpZ2hlciBUb2xlcmFuY2UgbGV2ZWxcblx0ICogQHBhcmFtIHNEZXZpYXRpb25IaWdoIEV4cHJlc3Npb25CaW5kaW5nIGZvciBIaWdoZXIgRGV2aWF0aW9uIGxldmVsXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY3JpdGljYWxpdHkgY2FsY3VsYXRpb24gYXMgZXhwcmVzc2lvbiBiaW5kaW5nXG5cdCAqL1xuXHRnZXRDcml0aWNhbGl0eUNhbGN1bGF0aW9uQmluZGluZzogZnVuY3Rpb24gKFxuXHRcdHNJbXByb3ZlbWVudERpcmVjdGlvbjogc3RyaW5nLFxuXHRcdHNWYWx1ZTogc3RyaW5nLFxuXHRcdHNEZXZpYXRpb25Mb3c6IHN0cmluZyB8IG51bWJlcixcblx0XHRzVG9sZXJhbmNlTG93OiBzdHJpbmcgfCBudW1iZXIsXG5cdFx0c0FjY2VwdGFuY2VMb3c6IHN0cmluZyB8IG51bWJlcixcblx0XHRzQWNjZXB0YW5jZUhpZ2g6IHN0cmluZyB8IG51bWJlcixcblx0XHRzVG9sZXJhbmNlSGlnaDogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNEZXZpYXRpb25IaWdoOiBzdHJpbmcgfCBudW1iZXJcblx0KSB7XG5cdFx0bGV0IHNDcml0aWNhbGl0eUV4cHJlc3Npb246IHR5cGVvZiBWYWx1ZUNvbG9yIHwgc3RyaW5nID0gVmFsdWVDb2xvci5OZXV0cmFsOyAvLyBEZWZhdWx0IENyaXRpY2FsaXR5IFN0YXRlXG5cblx0XHRzVmFsdWUgPSBgJSR7c1ZhbHVlfWA7XG5cblx0XHQvLyBTZXR0aW5nIFVuYXNzaWduZWQgVmFsdWVzXG5cdFx0c0RldmlhdGlvbkxvdyA9IHNEZXZpYXRpb25Mb3cgfHwgLUluZmluaXR5O1xuXHRcdHNUb2xlcmFuY2VMb3cgPSBzVG9sZXJhbmNlTG93IHx8IHNEZXZpYXRpb25Mb3c7XG5cdFx0c0FjY2VwdGFuY2VMb3cgPSBzQWNjZXB0YW5jZUxvdyB8fCBzVG9sZXJhbmNlTG93O1xuXHRcdHNEZXZpYXRpb25IaWdoID0gc0RldmlhdGlvbkhpZ2ggfHwgSW5maW5pdHk7XG5cdFx0c1RvbGVyYW5jZUhpZ2ggPSBzVG9sZXJhbmNlSGlnaCB8fCBzRGV2aWF0aW9uSGlnaDtcblx0XHRzQWNjZXB0YW5jZUhpZ2ggPSBzQWNjZXB0YW5jZUhpZ2ggfHwgc1RvbGVyYW5jZUhpZ2g7XG5cblx0XHQvLyBEZWFsaW5nIHdpdGggRGVjaW1hbCBhbmQgUGF0aCBiYXNlZCBiaW5nZGluZ3Ncblx0XHRzRGV2aWF0aW9uTG93ID0gc0RldmlhdGlvbkxvdyAmJiAoK3NEZXZpYXRpb25Mb3cgPyArc0RldmlhdGlvbkxvdyA6IGAlJHtzRGV2aWF0aW9uTG93fWApO1xuXHRcdHNUb2xlcmFuY2VMb3cgPSBzVG9sZXJhbmNlTG93ICYmICgrc1RvbGVyYW5jZUxvdyA/ICtzVG9sZXJhbmNlTG93IDogYCUke3NUb2xlcmFuY2VMb3d9YCk7XG5cdFx0c0FjY2VwdGFuY2VMb3cgPSBzQWNjZXB0YW5jZUxvdyAmJiAoK3NBY2NlcHRhbmNlTG93ID8gK3NBY2NlcHRhbmNlTG93IDogYCUke3NBY2NlcHRhbmNlTG93fWApO1xuXHRcdHNBY2NlcHRhbmNlSGlnaCA9IHNBY2NlcHRhbmNlSGlnaCAmJiAoK3NBY2NlcHRhbmNlSGlnaCA/ICtzQWNjZXB0YW5jZUhpZ2ggOiBgJSR7c0FjY2VwdGFuY2VIaWdofWApO1xuXHRcdHNUb2xlcmFuY2VIaWdoID0gc1RvbGVyYW5jZUhpZ2ggJiYgKCtzVG9sZXJhbmNlSGlnaCA/ICtzVG9sZXJhbmNlSGlnaCA6IGAlJHtzVG9sZXJhbmNlSGlnaH1gKTtcblx0XHRzRGV2aWF0aW9uSGlnaCA9IHNEZXZpYXRpb25IaWdoICYmICgrc0RldmlhdGlvbkhpZ2ggPyArc0RldmlhdGlvbkhpZ2ggOiBgJSR7c0RldmlhdGlvbkhpZ2h9YCk7XG5cblx0XHQvLyBDcmVhdGluZyBydW50aW1lIGV4cHJlc3Npb24gYmluZGluZyBmcm9tIGNyaXRpY2FsaXR5IGNhbGN1bGF0aW9uIGZvciBDcml0aWNhbGl0eSBTdGF0ZVxuXHRcdGlmIChzSW1wcm92ZW1lbnREaXJlY3Rpb24uaW5kZXhPZihcIk1pbmltaXplXCIpID4gLTEpIHtcblx0XHRcdHNDcml0aWNhbGl0eUV4cHJlc3Npb24gPVxuXHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuR29vZCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlSGlnaCArXG5cdFx0XHRcdFwiID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5OZXV0cmFsICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRcIihcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25IaWdoICtcblx0XHRcdFx0XCIgJiYgXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25IaWdoICtcblx0XHRcdFx0XCIpID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Dcml0aWNhbCArXG5cdFx0XHRcdFwiJyA6ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuRXJyb3IgK1xuXHRcdFx0XHRcIicgfVwiO1xuXHRcdH0gZWxzZSBpZiAoc0ltcHJvdmVtZW50RGlyZWN0aW9uLmluZGV4T2YoXCJNYXhpbWl6ZVwiKSA+IC0xKSB7XG5cdFx0XHRzQ3JpdGljYWxpdHlFeHByZXNzaW9uID1cblx0XHRcdFx0XCJ7PSBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIiA/ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuR29vZCArXG5cdFx0XHRcdFwiJyA6IFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLk5ldXRyYWwgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkxvdyArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIpID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5Dcml0aWNhbCArXG5cdFx0XHRcdFwiJyA6ICdcIiArXG5cdFx0XHRcdFZhbHVlQ29sb3IuRXJyb3IgK1xuXHRcdFx0XHRcIicgfVwiO1xuXHRcdH0gZWxzZSBpZiAoc0ltcHJvdmVtZW50RGlyZWN0aW9uLmluZGV4T2YoXCJUYXJnZXRcIikgPiAtMSkge1xuXHRcdFx0c0NyaXRpY2FsaXR5RXhwcmVzc2lvbiA9XG5cdFx0XHRcdFwiez0gKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPD0gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c0FjY2VwdGFuY2VMb3cgK1xuXHRcdFx0XHRcIikgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkdvb2QgK1xuXHRcdFx0XHRcIicgOiBcIiArXG5cdFx0XHRcdFwiKChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID49IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUxvdyArXG5cdFx0XHRcdFwiICYmIFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPCBcIiArXG5cdFx0XHRcdHNBY2NlcHRhbmNlTG93ICtcblx0XHRcdFx0XCIpIHx8IChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiID4gXCIgK1xuXHRcdFx0XHRzQWNjZXB0YW5jZUhpZ2ggK1xuXHRcdFx0XHRcIiAmJiBcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDw9IFwiICtcblx0XHRcdFx0c1RvbGVyYW5jZUhpZ2ggK1xuXHRcdFx0XHRcIikpID8gJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5OZXV0cmFsICtcblx0XHRcdFx0XCInIDogXCIgK1xuXHRcdFx0XHRcIigoXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIgJiYgKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPj0gXCIgK1xuXHRcdFx0XHRzRGV2aWF0aW9uTG93ICtcblx0XHRcdFx0XCIpICYmIChcIiArXG5cdFx0XHRcdHNWYWx1ZSArXG5cdFx0XHRcdFwiIDwgXCIgK1xuXHRcdFx0XHRzVG9sZXJhbmNlTG93ICtcblx0XHRcdFx0XCIpKSB8fCAoKFwiICtcblx0XHRcdFx0c1ZhbHVlICtcblx0XHRcdFx0XCIgPiBcIiArXG5cdFx0XHRcdHNUb2xlcmFuY2VIaWdoICtcblx0XHRcdFx0XCIpICYmIFwiICtcblx0XHRcdFx0c0RldmlhdGlvbkhpZ2ggK1xuXHRcdFx0XHRcIiAmJiAoXCIgK1xuXHRcdFx0XHRzVmFsdWUgK1xuXHRcdFx0XHRcIiA8PSBcIiArXG5cdFx0XHRcdHNEZXZpYXRpb25IaWdoICtcblx0XHRcdFx0XCIpKSkgPyAnXCIgK1xuXHRcdFx0XHRWYWx1ZUNvbG9yLkNyaXRpY2FsICtcblx0XHRcdFx0XCInIDogJ1wiICtcblx0XHRcdFx0VmFsdWVDb2xvci5FcnJvciArXG5cdFx0XHRcdFwiJyB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy53YXJuaW5nKFwiQ2FzZSBub3Qgc3VwcG9ydGVkLCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgVmFsdWUgTmV1dHJhbFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc0NyaXRpY2FsaXR5RXhwcmVzc2lvbjtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3JpdGljYWxpdHkgaW5kaWNhdG9yIGZyb20gYW5ub3RhdGlvbnMgaWYgY3JpdGljYWxpdHkgaXMgRW51bU1lbWJlci5cblx0ICpcblx0ICogQHBhcmFtIHNDcml0aWNhbGl0eSBDcml0aWNhbGl0eSBwcm92aWRlZCBpbiB0aGUgYW5ub3RhdGlvbnNcblx0ICogQHJldHVybnMgUmV0dXJuIHRoZSBpbmRpY2F0b3IgZm9yIGNyaXRpY2FsaXR5XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0Q3JpdGljYWxpdHlGcm9tRW51bTogZnVuY3Rpb24gKHNDcml0aWNhbGl0eTogc3RyaW5nKSB7XG5cdFx0bGV0IHNJbmRpY2F0b3I7XG5cdFx0aWYgKHNDcml0aWNhbGl0eSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIikge1xuXHRcdFx0c0luZGljYXRvciA9IFZhbHVlQ29sb3IuRXJyb3I7XG5cdFx0fSBlbHNlIGlmIChzQ3JpdGljYWxpdHkgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlXCIpIHtcblx0XHRcdHNJbmRpY2F0b3IgPSBWYWx1ZUNvbG9yLkdvb2Q7XG5cdFx0fSBlbHNlIGlmIChzQ3JpdGljYWxpdHkgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL0NyaXRpY2FsXCIpIHtcblx0XHRcdHNJbmRpY2F0b3IgPSBWYWx1ZUNvbG9yLkNyaXRpY2FsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzSW5kaWNhdG9yID0gVmFsdWVDb2xvci5OZXV0cmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gc0luZGljYXRvcjtcblx0fSxcblx0Z2V0VmFsdWVDcml0aWNhbGl0eTogZnVuY3Rpb24gKHNEaW1lbnNpb246IGFueSwgYVZhbHVlQ3JpdGljYWxpdHk6IGFueSkge1xuXHRcdGxldCBzUmVzdWx0O1xuXHRcdGNvbnN0IGFWYWx1ZXM6IGFueVtdID0gW107XG5cdFx0aWYgKGFWYWx1ZUNyaXRpY2FsaXR5ICYmIGFWYWx1ZUNyaXRpY2FsaXR5Lmxlbmd0aCA+IDApIHtcblx0XHRcdGFWYWx1ZUNyaXRpY2FsaXR5LmZvckVhY2goZnVuY3Rpb24gKG9WQzogYW55KSB7XG5cdFx0XHRcdGlmIChvVkMuVmFsdWUgJiYgb1ZDLkNyaXRpY2FsaXR5LiRFbnVtTWVtYmVyKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1ZhbHVlID1cblx0XHRcdFx0XHRcdFwiJHtcIiArXG5cdFx0XHRcdFx0XHRzRGltZW5zaW9uICtcblx0XHRcdFx0XHRcdFwifSA9PT0gJ1wiICtcblx0XHRcdFx0XHRcdG9WQy5WYWx1ZSArXG5cdFx0XHRcdFx0XHRcIicgPyAnXCIgK1xuXHRcdFx0XHRcdFx0Q29tbW9uSGVscGVyLl9nZXRDcml0aWNhbGl0eUZyb21FbnVtKG9WQy5Dcml0aWNhbGl0eS4kRW51bU1lbWJlcikgK1xuXHRcdFx0XHRcdFx0XCInXCI7XG5cdFx0XHRcdFx0YVZhbHVlcy5wdXNoKHNWYWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0c1Jlc3VsdCA9IGFWYWx1ZXMubGVuZ3RoID4gMCAmJiBhVmFsdWVzLmpvaW4oXCIgOiBcIikgKyBcIiA6IHVuZGVmaW5lZFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gc1Jlc3VsdCA/IFwiez0gXCIgKyBzUmVzdWx0ICsgXCIgfVwiIDogdW5kZWZpbmVkO1xuXHR9LFxuXHQvKipcblx0ICogVG8gZmV0Y2ggbWVhc3VyZSBhdHRyaWJ1dGUgaW5kZXguXG5cdCAqXG5cdCAqIEBwYXJhbSBpTWVhc3VyZSBDaGFydCBBbm5vdGF0aW9uc1xuXHQgKiBAcGFyYW0gb0NoYXJ0QW5ub3RhdGlvbnMgQ2hhcnQgQW5ub3RhdGlvbnNcblx0ICogQHJldHVybnMgTWVhc3VyZUF0dHJpYnV0ZSBpbmRleC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldE1lYXN1cmVBdHRyaWJ1dGVJbmRleDogZnVuY3Rpb24gKGlNZWFzdXJlOiBhbnksIG9DaGFydEFubm90YXRpb25zOiBhbnkpIHtcblx0XHRsZXQgYU1lYXN1cmVzLCBzTWVhc3VyZVByb3BlcnR5UGF0aDtcblx0XHRpZiAob0NoYXJ0QW5ub3RhdGlvbnMuTWVhc3VyZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YU1lYXN1cmVzID0gb0NoYXJ0QW5ub3RhdGlvbnMuTWVhc3VyZXM7XG5cdFx0XHRzTWVhc3VyZVByb3BlcnR5UGF0aCA9IGFNZWFzdXJlc1tpTWVhc3VyZV0uJFByb3BlcnR5UGF0aDtcblx0XHR9IGVsc2UgaWYgKG9DaGFydEFubm90YXRpb25zPy5EeW5hbWljTWVhc3VyZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdGFNZWFzdXJlcyA9IG9DaGFydEFubm90YXRpb25zLkR5bmFtaWNNZWFzdXJlcztcblx0XHRcdHNNZWFzdXJlUHJvcGVydHlQYXRoID0gYU1lYXN1cmVzW2lNZWFzdXJlXS4kQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdGxldCBiTWVhc3VyZUF0dHJpYnV0ZUV4aXN0cztcblx0XHRjb25zdCBhTWVhc3VyZUF0dHJpYnV0ZXMgPSBvQ2hhcnRBbm5vdGF0aW9ucy5NZWFzdXJlQXR0cmlidXRlcztcblx0XHRsZXQgaU1lYXN1cmVBdHRyaWJ1dGUgPSAtMTtcblx0XHRjb25zdCBmbkNoZWNrTWVhc3VyZSA9IGZ1bmN0aW9uIChzTWVhc3VyZVBhdGg6IGFueSwgb01lYXN1cmVBdHRyaWJ1dGU6IGFueSwgaW5kZXg6IGFueSkge1xuXHRcdFx0aWYgKG9NZWFzdXJlQXR0cmlidXRlKSB7XG5cdFx0XHRcdGlmIChvTWVhc3VyZUF0dHJpYnV0ZS5NZWFzdXJlICYmIG9NZWFzdXJlQXR0cmlidXRlLk1lYXN1cmUuJFByb3BlcnR5UGF0aCA9PT0gc01lYXN1cmVQYXRoKSB7XG5cdFx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPSBpbmRleDtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChvTWVhc3VyZUF0dHJpYnV0ZS5EeW5hbWljTWVhc3VyZSAmJiBvTWVhc3VyZUF0dHJpYnV0ZS5EeW5hbWljTWVhc3VyZS4kQW5ub3RhdGlvblBhdGggPT09IHNNZWFzdXJlUGF0aCkge1xuXHRcdFx0XHRcdGlNZWFzdXJlQXR0cmlidXRlID0gaW5kZXg7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChhTWVhc3VyZUF0dHJpYnV0ZXMpIHtcblx0XHRcdGJNZWFzdXJlQXR0cmlidXRlRXhpc3RzID0gYU1lYXN1cmVBdHRyaWJ1dGVzLnNvbWUoZm5DaGVja01lYXN1cmUuYmluZChudWxsLCBzTWVhc3VyZVByb3BlcnR5UGF0aCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYk1lYXN1cmVBdHRyaWJ1dGVFeGlzdHMgJiYgaU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBpTWVhc3VyZUF0dHJpYnV0ZTtcblx0fSxcblxuXHRnZXRNZWFzdXJlQXR0cmlidXRlOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdHNDaGFydEFubm90YXRpb25QYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3Qoc0NoYXJ0QW5ub3RhdGlvblBhdGgpLnRoZW4oZnVuY3Rpb24gKG9DaGFydEFubm90YXRpb25zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGFNZWFzdXJlQXR0cmlidXRlcyA9IG9DaGFydEFubm90YXRpb25zLk1lYXN1cmVBdHRyaWJ1dGVzLFxuXHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoMCwgb0NoYXJ0QW5ub3RhdGlvbnMpO1xuXHRcdFx0Y29uc3Qgc01lYXN1cmVBdHRyaWJ1dGVQYXRoID1cblx0XHRcdFx0aU1lYXN1cmVBdHRyaWJ1dGUgPiAtMSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXNbaU1lYXN1cmVBdHRyaWJ1dGVdICYmIGFNZWFzdXJlQXR0cmlidXRlc1tpTWVhc3VyZUF0dHJpYnV0ZV0uRGF0YVBvaW50XG5cdFx0XHRcdFx0PyBgJHtzQ2hhcnRBbm5vdGF0aW9uUGF0aH1NZWFzdXJlQXR0cmlidXRlcy8ke2lNZWFzdXJlQXR0cmlidXRlfS9gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc01lYXN1cmVBdHRyaWJ1dGVQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJEYXRhUG9pbnQgbWlzc2luZyBmb3IgdGhlIG1lYXN1cmVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc01lYXN1cmVBdHRyaWJ1dGVQYXRoID8gYCR7c01lYXN1cmVBdHRyaWJ1dGVQYXRofURhdGFQb2ludC8kQW5ub3RhdGlvblBhdGgvYCA6IHNNZWFzdXJlQXR0cmlidXRlUGF0aDtcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBmb3IgdGhlIG1lYXN1cmUuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIHRoZSBtZWFzdXJlIGFubm90YXRpb25cblx0ICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVhc3VyZUF0dHJpYnV0ZSBvZiB0aGUgbWVhc3VyZVxuXHQgKi9cblx0Z2V0TWVhc3VyZUF0dHJpYnV0ZUZvck1lYXN1cmU6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0c01lYXN1cmVQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0c0NoYXJ0QW5ub3RhdGlvblBhdGggPSBzTWVhc3VyZVBhdGguc3Vic3RyaW5nKDAsIHNNZWFzdXJlUGF0aC5sYXN0SW5kZXhPZihcIk1lYXN1cmVcIikpLFxuXHRcdFx0aU1lYXN1cmUgPSBzTWVhc3VyZVBhdGgucmVwbGFjZSgvLipcXC8vLCBcIlwiKTtcblxuXHRcdHJldHVybiBvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3Qoc0NoYXJ0QW5ub3RhdGlvblBhdGgpLnRoZW4oZnVuY3Rpb24gKG9DaGFydEFubm90YXRpb25zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGFNZWFzdXJlQXR0cmlidXRlcyA9IG9DaGFydEFubm90YXRpb25zLk1lYXN1cmVBdHRyaWJ1dGVzLFxuXHRcdFx0XHRpTWVhc3VyZUF0dHJpYnV0ZSA9IENvbW1vbkhlbHBlci5nZXRNZWFzdXJlQXR0cmlidXRlSW5kZXgoaU1lYXN1cmUsIG9DaGFydEFubm90YXRpb25zKTtcblx0XHRcdGNvbnN0IHNNZWFzdXJlQXR0cmlidXRlUGF0aCA9XG5cdFx0XHRcdGlNZWFzdXJlQXR0cmlidXRlID4gLTEgJiYgYU1lYXN1cmVBdHRyaWJ1dGVzW2lNZWFzdXJlQXR0cmlidXRlXSAmJiBhTWVhc3VyZUF0dHJpYnV0ZXNbaU1lYXN1cmVBdHRyaWJ1dGVdLkRhdGFQb2ludFxuXHRcdFx0XHRcdD8gYCR7c0NoYXJ0QW5ub3RhdGlvblBhdGh9TWVhc3VyZUF0dHJpYnV0ZXMvJHtpTWVhc3VyZUF0dHJpYnV0ZX0vYFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNNZWFzdXJlQXR0cmlidXRlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiRGF0YVBvaW50IG1pc3NpbmcgZm9yIHRoZSBtZWFzdXJlXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNNZWFzdXJlQXR0cmlidXRlUGF0aCA/IGAke3NNZWFzdXJlQXR0cmlidXRlUGF0aH1EYXRhUG9pbnQvJEFubm90YXRpb25QYXRoL2AgOiBzTWVhc3VyZUF0dHJpYnV0ZVBhdGg7XG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb250YWluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBoYXMgYSBkcmFmdCByb290L25vZGUgcGFyZW50IGVudGl0eVNldC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGlzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudFxuXHQgKiBAcGFyYW0gb1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCBUYXJnZXQgY29sbGVjdGlvbiBoYXMgQ29udGFpbnNUYXJnZXQgcHJvcGVydHlcblx0ICogQHBhcmFtIG9UYWJsZU1ldGFkYXRhIFRhYmxlIG1ldGFkYXRhIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGRyYWZ0XG5cdCAqL1xuXHRpc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQ6IGZ1bmN0aW9uIChvVGFyZ2V0Q29sbGVjdGlvbkNvbnRhaW5zVGFyZ2V0OiBvYmplY3QsIG9UYWJsZU1ldGFkYXRhOiBhbnkpIHtcblx0XHRpZiAob1RhcmdldENvbGxlY3Rpb25Db250YWluc1RhcmdldCkge1xuXHRcdFx0aWYgKG9UYWJsZU1ldGFkYXRhICYmIG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldCAmJiBvVGFibGVNZXRhZGF0YS5wYXJlbnRFbnRpdHlTZXQuc1BhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudEVudGl0eVNldFBhdGggPSBvVGFibGVNZXRhZGF0YS5wYXJlbnRFbnRpdHlTZXQuc1BhdGg7XG5cdFx0XHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvVGFibGVNZXRhZGF0YS5wYXJlbnRFbnRpdHlTZXQub01vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRgJHtzUGFyZW50RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGBcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9UYWJsZU1ldGFkYXRhLnBhcmVudEVudGl0eVNldC5vTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdGAke3NQYXJlbnRFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEVuc3VyZXMgdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGFzIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlLlxuXHQgKiBTaW5jZSB0aGUgcHJvcGVydHkgRGF0YSBpcyBvZiB0aGUgdHlwZSAnb2JqZWN0JywgaXQgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyByZXF1aXJlZCBieSB0aGUgdGVtcGxhdGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIGRhdGFFbGVtZW50IFRoZSBkYXRhIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICogQHJldHVybnMgVGhlIGNvcnJlY3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlLlxuXHQgKi9cblx0Z2V0RGF0YUZyb21UZW1wbGF0ZTogZnVuY3Rpb24gKGRhdGFFbGVtZW50OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc3BsaXRQYXRoID0gZGF0YUVsZW1lbnQuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBkYXRhS2V5ID0gc3BsaXRQYXRoW3NwbGl0UGF0aC5sZW5ndGggLSAxXTtcblx0XHRjb25zdCBjb25uZWN0ZWREYXRhUGF0aCA9IGAvJHtzcGxpdFBhdGguc2xpY2UoMSwgLTIpLmpvaW4oXCIvXCIpfS9AYDtcblx0XHRjb25zdCBjb25uZWN0ZWRPYmplY3QgPSBkYXRhRWxlbWVudC5nZXRPYmplY3QoY29ubmVjdGVkRGF0YVBhdGgpIGFzIGFueTtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IGNvbm5lY3RlZE9iamVjdC5UZW1wbGF0ZTtcblx0XHRjb25zdCBzcGxpdFRlbXAgPSB0ZW1wbGF0ZS5zcGxpdChcIn1cIik7XG5cdFx0Y29uc3QgdGVtcEFycmF5ID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFRlbXAubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBzcGxpdFRlbXBbaV0uc3BsaXQoXCJ7XCIpWzFdLnRyaW0oKTtcblx0XHRcdHRlbXBBcnJheS5wdXNoKGtleSk7XG5cdFx0fVxuXHRcdE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHRcdGlmIChzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpKSB7XG5cdFx0XHRcdGRlbGV0ZSBjb25uZWN0ZWRPYmplY3QuRGF0YVtzS2V5XTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRjb25zdCBpbmRleCA9IE9iamVjdC5rZXlzKGNvbm5lY3RlZE9iamVjdC5EYXRhKS5pbmRleE9mKGRhdGFLZXkpO1xuXHRcdHJldHVybiBgLyR7c3BsaXRQYXRoLnNsaWNlKDEsIC0yKS5qb2luKFwiL1wiKX0vRGF0YS8ke3RlbXBBcnJheVtpbmRleF19YDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBlbmQgb2YgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHJlYWNoZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm1hY3Jvcy5Db21tb25IZWxwZXJcblx0ICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9mIHRoZSBjb25uZWN0ZWQgZmllbGRzLlxuXHQgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgb3IgRmFsc2UgKGRlcGVuZGluZyBvbiB0aGUgdGVtcGxhdGUgaW5kZXgpLlxuXHQgKi9cblx0bm90TGFzdEluZGV4OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIGVsZW1lbnQ6IG9iamVjdCkge1xuXHRcdGNvbnN0IHRlbXBsYXRlID0gdGFyZ2V0LlRlbXBsYXRlO1xuXHRcdGNvbnN0IHNwbGl0VGVtcCA9IHRlbXBsYXRlLnNwbGl0KFwifVwiKTtcblx0XHRjb25zdCB0ZW1wQXJyYXk6IGFueVtdID0gW107XG5cdFx0bGV0IGlzTGFzdEluZGV4ID0gZmFsc2U7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFRlbXAubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRjb25zdCBkYXRhS2V5ID0gc3BsaXRUZW1wW2ldLnNwbGl0KFwie1wiKVsxXS50cmltKCk7XG5cdFx0XHR0ZW1wQXJyYXkucHVzaChkYXRhS2V5KTtcblx0XHR9XG5cblx0XHR0ZW1wQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodGVtcGxhdGVJbmZvOiBhbnkpIHtcblx0XHRcdGlmICh0YXJnZXQuRGF0YVt0ZW1wbGF0ZUluZm9dID09PSBlbGVtZW50ICYmIHRlbXBBcnJheS5pbmRleE9mKHRlbXBsYXRlSW5mbykgIT09IHRlbXBBcnJheS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGlzTGFzdEluZGV4ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gaXNMYXN0SW5kZXg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgdGhlIGRlbGltaXRlciBmcm9tIHRoZSB0ZW1wbGF0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubWFjcm9zLkNvbW1vbkhlbHBlclxuXHQgKiBAcGFyYW0gdGVtcGxhdGUgVGhlIHRlbXBsYXRlIHN0cmluZy5cblx0ICogQHJldHVybnMgVGhlIGRlbGltaXRlciBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nLlxuXHQgKi9cblx0Z2V0RGVsaW1pdGVyOiBmdW5jdGlvbiAodGVtcGxhdGU6IHN0cmluZykge1xuXHRcdHJldHVybiB0ZW1wbGF0ZS5zcGxpdChcIn1cIilbMV0uc3BsaXQoXCJ7XCIpWzBdLnRyaW0oKTtcblx0fSxcblxuXHRvTWV0YU1vZGVsOiB1bmRlZmluZWQgYXMgYW55LFxuXHRzZXRNZXRhTW9kZWw6IGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH0sXG5cblx0Z2V0TWV0YU1vZGVsOiBmdW5jdGlvbiAob0NvbnRleHQ/OiBhbnksIG9JbnRlcmZhY2U/OiBhbnkpIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvSW50ZXJmYWNlLmNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMub01ldGFNb2RlbDtcblx0fSxcblxuXHRnZXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAob0NvbnRleHQ6IGFueSwgb0ludGVyZmFjZTogYW55KSB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBzUGF0aCA9IG9JbnRlcmZhY2UuY29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBvUGFyYW1ldGVySW5mbyA9IENvbW1vblV0aWxzLmdldFBhcmFtZXRlckluZm8ob01ldGFNb2RlbCwgc1BhdGgpO1xuXHRcdFx0aWYgKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlclByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH0sXG5cblx0LyoqXG5cdCAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gY2FsbGluZyBhbiBhY3Rpb24gaGFuZGxlciB2aWEgdGhlIEZQTSBoZWxwZXIncyBhY3Rpb25XcmFwcGVyIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAnRlBNLmFjdGlvbldyYXBwZXIoKScgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQWN0aW9uIEFjdGlvbiBtZXRhZGF0YVxuXHQgKiBAcGFyYW0gb0FjdGlvbi5oYW5kbGVyTW9kdWxlIE1vZHVsZSBjb250YWluaW5nIHRoZSBhY3Rpb24gaGFuZGxlciBtZXRob2Rcblx0ICogQHBhcmFtIG9BY3Rpb24uaGFuZGxlck1ldGhvZCBBY3Rpb24gaGFuZGxlciBtZXRob2QgbmFtZVxuXHQgKiBAcGFyYW0gW29UaGlzXSBgdGhpc2AgKGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIG1hY3JvKVxuXHQgKiBAcGFyYW0gb1RoaXMuaWQgVGhlIHRhYmxlJ3MgSURcblx0ICogQHJldHVybnMgVGhlIGFjdGlvbiB3cmFwcGVyIGJpbmRpbmdcdGV4cHJlc3Npb25cblx0ICovXG5cdGJ1aWxkQWN0aW9uV3JhcHBlcjogZnVuY3Rpb24gKG9BY3Rpb246IHsgaGFuZGxlck1vZHVsZTogc3RyaW5nOyBoYW5kbGVyTWV0aG9kOiBzdHJpbmcgfSwgb1RoaXM6IHsgaWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgYVBhcmFtczogYW55W10gPSBbcmVmKFwiJGV2ZW50XCIpLCBvQWN0aW9uLmhhbmRsZXJNb2R1bGUsIG9BY3Rpb24uaGFuZGxlck1ldGhvZF07XG5cblx0XHRpZiAob1RoaXMgJiYgb1RoaXMuaWQpIHtcblx0XHRcdGNvbnN0IG9BZGRpdGlvbmFsUGFyYW1zID0ge1xuXHRcdFx0XHRjb250ZXh0czogcmVmKFwiJHtpbnRlcm5hbD5zZWxlY3RlZENvbnRleHRzfVwiKVxuXHRcdFx0fTtcblx0XHRcdGFQYXJhbXMucHVzaChvQWRkaXRpb25hbFBhcmFtcyk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmbihcIkZQTS5hY3Rpb25XcmFwcGVyXCIsIGFQYXJhbXMpKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIHdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIGRlcGVuZGluZyBvbiB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdCAqIEl0IGlzIGludmVydGVkIGFzIHRoZSBVSSBlbGVtZW50cyBoYXZlIGEgdmlzaWJsZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGFuIGhpZGRlbiBvbmUuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhRmllbGRBbm5vdGF0aW9ucyBUaGUgZGF0YUZpZWxkIE9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHBhdGggb3IgYSBib29sZWFuXG5cdCAqL1xuXHRnZXRIaWRkZW5QYXRoRXhwcmVzc2lvbjogZnVuY3Rpb24gKGRhdGFGaWVsZEFubm90YXRpb25zOiBhbnkpIHtcblx0XHRpZiAoZGF0YUZpZWxkQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBoaWRkZW4gPSBkYXRhRmllbGRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl07XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGhpZGRlbiA9PT0gXCJvYmplY3RcIiA/IFwiez0gISR7XCIgKyBoaWRkZW4uJFBhdGggKyBcIn0gfVwiIDogIWhpZGRlbjtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG4oQ29tbW9uSGVscGVyLmlzUHJvcGVydHlGaWx0ZXJhYmxlIGFzIGFueSkucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG4oQ29tbW9uSGVscGVyLmdldFBvcG92ZXJUZXh0IGFzIGFueSkucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG4oQ29tbW9uSGVscGVyLmdldFNvcnRDb25kaXRpb25zIGFzIGFueSkucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1vbkhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7O0VBV0EsSUFBTUEsVUFBVSxHQUFHQyxRQUFRLENBQUNELFVBQTVCO0VBQ0EsSUFBTUUsWUFBWSxHQUFHO0lBQ3BCQyxpQkFBaUIsRUFBRSxZQUFZO01BQzlCO01BQ0EsT0FBT0MsUUFBUSxDQUFDQyxJQUFULENBQWNDLE9BQWQsQ0FBc0IsK0JBQXRCLElBQXlELENBQUMsQ0FBakU7SUFDQSxDQUptQjtJQU1wQkMsWUFBWSxFQUFFLFVBQVVDLElBQVYsRUFBcUI7TUFDbEMsT0FBT0EsSUFBSSxDQUFDQyxTQUFMLEVBQVA7SUFDQSxDQVJt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