@smartbit4all/ng-client 4.2.34 → 5.0.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 (433) hide show
  1. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +12 -12
  2. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +1 -1
  3. package/fesm2022/smartbit4all-ng-client.mjs +521 -501
  4. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  5. package/lib/smart-client/smart-component-api-client.d.ts +2 -2
  6. package/lib/smart-component-layout/smart-component-layout.component.d.ts +1 -1
  7. package/lib/smart-dialog/smartdialog.module.d.ts +2 -1
  8. package/lib/smart-grid/smart-grid.component.d.ts +1 -1
  9. package/lib/smart-grid/smart-grid.module.d.ts +21 -19
  10. package/lib/smart-map/abstract-map.d.ts +1 -1
  11. package/lib/smart-ng-client.module.d.ts +4 -3
  12. package/lib/view-context/smart-view-context.module.d.ts +42 -43
  13. package/package.json +12 -14
  14. package/smartbit4all-ng-client-5.0.1.tgz +0 -0
  15. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
  16. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
  17. package/esm2022/lib/component-factory-service/projects.mjs +0 -6
  18. package/esm2022/lib/session/api/api/api.mjs +0 -4
  19. package/esm2022/lib/session/api/api/session.service.mjs +0 -306
  20. package/esm2022/lib/session/api/configuration.mjs +0 -91
  21. package/esm2022/lib/session/api/encoder.mjs +0 -19
  22. package/esm2022/lib/session/api/index.mjs +0 -3
  23. package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
  24. package/esm2022/lib/session/api/model/apiError.mjs +0 -13
  25. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
  26. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
  27. package/esm2022/lib/session/api/model/models.mjs +0 -9
  28. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
  29. package/esm2022/lib/session/api/model/session.mjs +0 -2
  30. package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
  31. package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
  32. package/esm2022/lib/session/api/param.mjs +0 -2
  33. package/esm2022/lib/session/api/variables.mjs +0 -9
  34. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
  35. package/esm2022/lib/session/projects.mjs +0 -10
  36. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -95
  37. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -46
  38. package/esm2022/lib/session/smart-session-handler.service.mjs +0 -6
  39. package/esm2022/lib/session/smart-session.module.mjs +0 -58
  40. package/esm2022/lib/session/smart-session.service.mjs +0 -230
  41. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -35
  42. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +0 -58
  43. package/esm2022/lib/shared/projects.mjs +0 -4
  44. package/esm2022/lib/shared/shared.module.mjs +0 -19
  45. package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
  46. package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
  47. package/esm2022/lib/smart-client/projects.mjs +0 -5
  48. package/esm2022/lib/smart-client/smart-authentication.service.mjs +0 -21
  49. package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -786
  50. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -81
  51. package/esm2022/lib/smart-client/smart.component.mjs +0 -84
  52. package/esm2022/lib/smart-client/smart.service.mjs +0 -75
  53. package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
  54. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
  55. package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
  56. package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
  57. package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
  58. package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
  59. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
  60. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -20
  61. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
  62. package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -6
  63. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
  64. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
  65. package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
  66. package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
  67. package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
  68. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -111
  69. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -307
  70. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -45
  71. package/esm2022/lib/smart-dialog/projects.mjs +0 -8
  72. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
  73. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
  74. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
  75. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -90
  76. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -96
  77. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
  78. package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
  79. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -53
  80. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
  81. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
  82. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
  83. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
  84. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
  85. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
  86. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
  87. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
  88. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
  89. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
  90. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
  91. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
  92. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
  93. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
  94. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
  95. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
  96. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
  97. package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
  98. package/esm2022/lib/smart-filter/projects.mjs +0 -9
  99. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
  100. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -165
  101. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
  102. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
  103. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
  104. package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
  105. package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
  106. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
  107. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
  108. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
  109. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
  110. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
  111. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
  112. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
  113. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
  114. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
  115. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
  116. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
  117. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
  118. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
  119. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
  120. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
  121. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
  122. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
  123. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
  124. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
  125. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
  126. package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
  127. package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
  128. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
  129. package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
  130. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
  131. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
  132. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -273
  133. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
  134. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
  135. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -47
  136. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
  137. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
  138. package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
  139. package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
  140. package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
  141. package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
  142. package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
  143. package/esm2022/lib/smart-form/api/index.mjs +0 -7
  144. package/esm2022/lib/smart-form/api/model/models.mjs +0 -12
  145. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
  146. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -7
  147. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
  148. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
  149. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -46
  150. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
  151. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
  152. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
  153. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
  154. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
  155. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -20
  156. package/esm2022/lib/smart-form/api/param.mjs +0 -2
  157. package/esm2022/lib/smart-form/api/variables.mjs +0 -9
  158. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
  159. package/esm2022/lib/smart-form/projects.mjs +0 -15
  160. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -613
  161. package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -673
  162. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
  163. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -78
  164. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
  165. package/esm2022/lib/smart-form/smartform.component.mjs +0 -185
  166. package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
  167. package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
  168. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -84
  169. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -36
  170. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
  171. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -874
  172. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
  173. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
  174. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
  175. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -451
  176. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
  177. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
  178. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
  179. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
  180. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
  181. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
  182. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
  183. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
  184. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
  185. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
  186. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
  187. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
  188. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
  189. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
  190. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
  191. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
  192. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
  193. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -14
  194. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
  195. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
  196. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
  197. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -66
  198. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -182
  199. package/esm2022/lib/smart-grid/models/model.mjs +0 -29
  200. package/esm2022/lib/smart-grid/projects.mjs +0 -9
  201. package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -934
  202. package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -100
  203. package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -80
  204. package/esm2022/lib/smart-icon/projects.mjs +0 -7
  205. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -53
  206. package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -22
  207. package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -74
  208. package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
  209. package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
  210. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
  211. package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
  212. package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
  213. package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
  214. package/esm2022/lib/smart-map/api/index.mjs +0 -7
  215. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
  216. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
  217. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
  218. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
  219. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
  220. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
  221. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
  222. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
  223. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
  224. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
  225. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
  226. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
  227. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
  228. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
  229. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
  230. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
  231. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
  232. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
  233. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
  234. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
  235. package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
  236. package/esm2022/lib/smart-map/api/param.mjs +0 -2
  237. package/esm2022/lib/smart-map/api/variables.mjs +0 -9
  238. package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
  239. package/esm2022/lib/smart-map/impl/google-map.mjs +0 -221
  240. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -264
  241. package/esm2022/lib/smart-map/projects.mjs +0 -9
  242. package/esm2022/lib/smart-map/smart-map.component.mjs +0 -218
  243. package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
  244. package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
  245. package/esm2022/lib/smart-navbar/projects.mjs +0 -8
  246. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
  247. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
  248. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
  249. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
  250. package/esm2022/lib/smart-navigation/projects.mjs +0 -6
  251. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
  252. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
  253. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -56
  254. package/esm2022/lib/smart-ng-client.module.mjs +0 -130
  255. package/esm2022/lib/smart-ng-client.service.mjs +0 -19
  256. package/esm2022/lib/smart-subject/projects.mjs +0 -5
  257. package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
  258. package/esm2022/lib/smart-tab-group/projects.mjs +0 -9
  259. package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +0 -43
  260. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -25
  261. package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +0 -14
  262. package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +0 -31
  263. package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +0 -66
  264. package/esm2022/lib/smart-tab-group/tabTile.model.mjs +0 -2
  265. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
  266. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
  267. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
  268. package/esm2022/lib/smart-table/projects.mjs +0 -8
  269. package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
  270. package/esm2022/lib/smart-table/smarttable.model.mjs +0 -169
  271. package/esm2022/lib/smart-table/smarttable.module.mjs +0 -105
  272. package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
  273. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -39
  274. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
  275. package/esm2022/lib/smart-table/tables/table.mjs +0 -520
  276. package/esm2022/lib/smart-tree/projects.mjs +0 -9
  277. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -288
  278. package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -181
  279. package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
  280. package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -60
  281. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
  282. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
  283. package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
  284. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
  285. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
  286. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
  287. package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
  288. package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
  289. package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
  290. package/esm2022/lib/smart-validation/projects.mjs +0 -4
  291. package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
  292. package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
  293. package/esm2022/lib/view-context/api/api/api.mjs +0 -4
  294. package/esm2022/lib/view-context/api/api/view.service.mjs +0 -903
  295. package/esm2022/lib/view-context/api/api.module.mjs +0 -40
  296. package/esm2022/lib/view-context/api/configuration.mjs +0 -91
  297. package/esm2022/lib/view-context/api/encoder.mjs +0 -19
  298. package/esm2022/lib/view-context/api/index.mjs +0 -7
  299. package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
  300. package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
  301. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
  302. package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
  303. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
  304. package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
  305. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
  306. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
  307. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
  308. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
  309. package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
  310. package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
  311. package/esm2022/lib/view-context/api/model/link.mjs +0 -20
  312. package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
  313. package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
  314. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
  315. package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
  316. package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
  317. package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
  318. package/esm2022/lib/view-context/api/model/models.mjs +0 -54
  319. package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
  320. package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
  321. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
  322. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
  323. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
  324. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
  325. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
  326. package/esm2022/lib/view-context/api/model/style.mjs +0 -13
  327. package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
  328. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
  329. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
  330. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
  331. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
  332. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
  333. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
  334. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
  335. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
  336. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
  337. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -13
  338. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -13
  339. package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
  340. package/esm2022/lib/view-context/api/model/view.mjs +0 -2
  341. package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
  342. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
  343. package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
  344. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
  345. package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
  346. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
  347. package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
  348. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -18
  349. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
  350. package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
  351. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
  352. package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
  353. package/esm2022/lib/view-context/api/param.mjs +0 -2
  354. package/esm2022/lib/view-context/api/variables.mjs +0 -9
  355. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
  356. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -74
  357. package/esm2022/lib/view-context/projects.mjs +0 -19
  358. package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
  359. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
  360. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -63
  361. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -55
  362. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
  363. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -97
  364. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
  365. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
  366. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -59
  367. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -192
  368. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -183
  369. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
  370. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -211
  371. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -83
  372. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -29
  373. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -75
  374. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -39
  375. package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
  376. package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -327
  377. package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -696
  378. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -33
  379. package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
  380. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
  381. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
  382. package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
  383. package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
  384. package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
  385. package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
  386. package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
  387. package/esm2022/lib/view-context/value-api/index.mjs +0 -7
  388. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
  389. package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
  390. package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
  391. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
  392. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
  393. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
  394. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
  395. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
  396. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
  397. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
  398. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
  399. package/esm2022/lib/view-context/value-api/param.mjs +0 -2
  400. package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
  401. package/esm2022/projects.mjs +0 -28
  402. package/esm2022/smartbit4all-ng-client.mjs +0 -5
  403. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
  404. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
  405. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
  406. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
  407. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
  408. package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
  409. package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
  410. package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
  411. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
  412. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
  413. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
  414. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
  415. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
  416. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
  417. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
  418. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
  419. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
  420. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
  421. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
  422. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
  423. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
  424. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
  425. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
  426. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
  427. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
  428. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
  429. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
  430. package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
  431. package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
  432. package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
  433. package/smartbit4all-ng-client-4.2.34.tgz +0 -0
@@ -1,1190 +0,0 @@
1
- /**
2
- * Uitree Api
3
- * Tree domain objects
4
- *
5
- * The version of the OpenAPI document: 1.0.0
6
- * Contact: info@it4all.hu
7
- *
8
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
- * https://openapi-generator.tech
10
- * Do not edit the class manually.
11
- */
12
- /* tslint:disable:no-unused-variable member-ordering */
13
- import { Inject, Injectable, Optional } from '@angular/core';
14
- import { HttpHeaders, HttpContext, } from '@angular/common/http';
15
- import { CustomHttpParameterCodec } from '../encoder';
16
- // @ts-ignore
17
- import { BASE_PATH } from '../variables';
18
- import { Configuration } from '../configuration';
19
- import * as i0 from "@angular/core";
20
- import * as i1 from "@angular/common/http";
21
- import * as i2 from "../configuration";
22
- export class TreeService {
23
- constructor(httpClient, basePath, configuration) {
24
- this.httpClient = httpClient;
25
- this.basePath = 'http://localhost';
26
- this.defaultHeaders = new HttpHeaders();
27
- this.configuration = new Configuration();
28
- if (configuration) {
29
- this.configuration = configuration;
30
- }
31
- if (typeof this.configuration.basePath !== 'string') {
32
- if (Array.isArray(basePath) && basePath.length > 0) {
33
- basePath = basePath[0];
34
- }
35
- if (typeof basePath !== 'string') {
36
- basePath = this.basePath;
37
- }
38
- this.configuration.basePath = basePath;
39
- }
40
- this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
41
- }
42
- // @ts-ignore
43
- addToHttpParams(httpParams, value, key) {
44
- if (typeof value === 'object' && value instanceof Date === false) {
45
- httpParams = this.addToHttpParamsRecursive(httpParams, value);
46
- }
47
- else {
48
- httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
49
- }
50
- return httpParams;
51
- }
52
- addToHttpParamsRecursive(httpParams, value, key) {
53
- if (value == null) {
54
- return httpParams;
55
- }
56
- if (typeof value === 'object') {
57
- if (Array.isArray(value)) {
58
- value.forEach((elem) => (httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)));
59
- }
60
- else if (value instanceof Date) {
61
- if (key != null) {
62
- httpParams = httpParams.append(key, value.toISOString().substr(0, 10));
63
- }
64
- else {
65
- throw Error('key may not be null if value is Date');
66
- }
67
- }
68
- else {
69
- Object.keys(value).forEach((k) => (httpParams = this.addToHttpParamsRecursive(httpParams, value[k], key != null ? `${key}.${k}` : k)));
70
- }
71
- }
72
- else if (key != null) {
73
- httpParams = httpParams.append(key, value);
74
- }
75
- else {
76
- throw Error('key may not be null if value is not object or array');
77
- }
78
- return httpParams;
79
- }
80
- collapseNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
81
- if (viewUuid === null || viewUuid === undefined) {
82
- throw new Error('Required parameter viewUuid was null or undefined when calling collapseNode.');
83
- }
84
- if (treeId === null || treeId === undefined) {
85
- throw new Error('Required parameter treeId was null or undefined when calling collapseNode.');
86
- }
87
- if (nodeId === null || nodeId === undefined) {
88
- throw new Error('Required parameter nodeId was null or undefined when calling collapseNode.');
89
- }
90
- let localVarHeaders = this.defaultHeaders;
91
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
92
- if (localVarHttpHeaderAcceptSelected === undefined) {
93
- // to determine the Accept header
94
- const httpHeaderAccepts = ['application/json'];
95
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
96
- }
97
- if (localVarHttpHeaderAcceptSelected !== undefined) {
98
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
99
- }
100
- let localVarHttpContext = options && options.context;
101
- if (localVarHttpContext === undefined) {
102
- localVarHttpContext = new HttpContext();
103
- }
104
- let responseType_ = 'json';
105
- if (localVarHttpHeaderAcceptSelected) {
106
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
107
- responseType_ = 'text';
108
- }
109
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
110
- responseType_ = 'json';
111
- }
112
- else {
113
- responseType_ = 'blob';
114
- }
115
- }
116
- let localVarPath = `/tree/${this.configuration.encodeParam({
117
- name: 'viewUuid',
118
- value: viewUuid,
119
- in: 'path',
120
- style: 'simple',
121
- explode: false,
122
- dataType: 'string',
123
- dataFormat: 'uuid',
124
- })}/${this.configuration.encodeParam({
125
- name: 'treeId',
126
- value: treeId,
127
- in: 'path',
128
- style: 'simple',
129
- explode: false,
130
- dataType: 'string',
131
- dataFormat: undefined,
132
- })}/${this.configuration.encodeParam({
133
- name: 'nodeId',
134
- value: nodeId,
135
- in: 'path',
136
- style: 'simple',
137
- explode: false,
138
- dataType: 'string',
139
- dataFormat: undefined,
140
- })}/collapse`;
141
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
142
- context: localVarHttpContext,
143
- responseType: responseType_,
144
- withCredentials: this.configuration.withCredentials,
145
- headers: localVarHeaders,
146
- observe: observe,
147
- reportProgress: reportProgress,
148
- });
149
- }
150
- collapseNode2(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
151
- if (viewUuid === null || viewUuid === undefined) {
152
- throw new Error('Required parameter viewUuid was null or undefined when calling collapseNode2.');
153
- }
154
- if (treeId === null || treeId === undefined) {
155
- throw new Error('Required parameter treeId was null or undefined when calling collapseNode2.');
156
- }
157
- if (nodeId === null || nodeId === undefined) {
158
- throw new Error('Required parameter nodeId was null or undefined when calling collapseNode2.');
159
- }
160
- let localVarHeaders = this.defaultHeaders;
161
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
162
- if (localVarHttpHeaderAcceptSelected === undefined) {
163
- // to determine the Accept header
164
- const httpHeaderAccepts = ['application/json'];
165
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
166
- }
167
- if (localVarHttpHeaderAcceptSelected !== undefined) {
168
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
169
- }
170
- let localVarHttpContext = options && options.context;
171
- if (localVarHttpContext === undefined) {
172
- localVarHttpContext = new HttpContext();
173
- }
174
- let responseType_ = 'json';
175
- if (localVarHttpHeaderAcceptSelected) {
176
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
177
- responseType_ = 'text';
178
- }
179
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
180
- responseType_ = 'json';
181
- }
182
- else {
183
- responseType_ = 'blob';
184
- }
185
- }
186
- let localVarPath = `/tree2/${this.configuration.encodeParam({
187
- name: 'viewUuid',
188
- value: viewUuid,
189
- in: 'path',
190
- style: 'simple',
191
- explode: false,
192
- dataType: 'string',
193
- dataFormat: 'uuid',
194
- })}/${this.configuration.encodeParam({
195
- name: 'treeId',
196
- value: treeId,
197
- in: 'path',
198
- style: 'simple',
199
- explode: false,
200
- dataType: 'string',
201
- dataFormat: undefined,
202
- })}/${this.configuration.encodeParam({
203
- name: 'nodeId',
204
- value: nodeId,
205
- in: 'path',
206
- style: 'simple',
207
- explode: false,
208
- dataType: 'string',
209
- dataFormat: undefined,
210
- })}/collapse`;
211
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
212
- context: localVarHttpContext,
213
- responseType: responseType_,
214
- withCredentials: this.configuration.withCredentials,
215
- headers: localVarHeaders,
216
- observe: observe,
217
- reportProgress: reportProgress,
218
- });
219
- }
220
- expandNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
221
- if (viewUuid === null || viewUuid === undefined) {
222
- throw new Error('Required parameter viewUuid was null or undefined when calling expandNode.');
223
- }
224
- if (treeId === null || treeId === undefined) {
225
- throw new Error('Required parameter treeId was null or undefined when calling expandNode.');
226
- }
227
- if (nodeId === null || nodeId === undefined) {
228
- throw new Error('Required parameter nodeId was null or undefined when calling expandNode.');
229
- }
230
- let localVarHeaders = this.defaultHeaders;
231
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
232
- if (localVarHttpHeaderAcceptSelected === undefined) {
233
- // to determine the Accept header
234
- const httpHeaderAccepts = ['application/json'];
235
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
236
- }
237
- if (localVarHttpHeaderAcceptSelected !== undefined) {
238
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
239
- }
240
- let localVarHttpContext = options && options.context;
241
- if (localVarHttpContext === undefined) {
242
- localVarHttpContext = new HttpContext();
243
- }
244
- let responseType_ = 'json';
245
- if (localVarHttpHeaderAcceptSelected) {
246
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
247
- responseType_ = 'text';
248
- }
249
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
250
- responseType_ = 'json';
251
- }
252
- else {
253
- responseType_ = 'blob';
254
- }
255
- }
256
- let localVarPath = `/tree/${this.configuration.encodeParam({
257
- name: 'viewUuid',
258
- value: viewUuid,
259
- in: 'path',
260
- style: 'simple',
261
- explode: false,
262
- dataType: 'string',
263
- dataFormat: 'uuid',
264
- })}/${this.configuration.encodeParam({
265
- name: 'treeId',
266
- value: treeId,
267
- in: 'path',
268
- style: 'simple',
269
- explode: false,
270
- dataType: 'string',
271
- dataFormat: undefined,
272
- })}/${this.configuration.encodeParam({
273
- name: 'nodeId',
274
- value: nodeId,
275
- in: 'path',
276
- style: 'simple',
277
- explode: false,
278
- dataType: 'string',
279
- dataFormat: undefined,
280
- })}/expand`;
281
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
282
- context: localVarHttpContext,
283
- responseType: responseType_,
284
- withCredentials: this.configuration.withCredentials,
285
- headers: localVarHeaders,
286
- observe: observe,
287
- reportProgress: reportProgress,
288
- });
289
- }
290
- expandNode2(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
291
- if (viewUuid === null || viewUuid === undefined) {
292
- throw new Error('Required parameter viewUuid was null or undefined when calling expandNode2.');
293
- }
294
- if (treeId === null || treeId === undefined) {
295
- throw new Error('Required parameter treeId was null or undefined when calling expandNode2.');
296
- }
297
- if (nodeId === null || nodeId === undefined) {
298
- throw new Error('Required parameter nodeId was null or undefined when calling expandNode2.');
299
- }
300
- let localVarHeaders = this.defaultHeaders;
301
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
302
- if (localVarHttpHeaderAcceptSelected === undefined) {
303
- // to determine the Accept header
304
- const httpHeaderAccepts = ['application/json'];
305
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
306
- }
307
- if (localVarHttpHeaderAcceptSelected !== undefined) {
308
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
309
- }
310
- let localVarHttpContext = options && options.context;
311
- if (localVarHttpContext === undefined) {
312
- localVarHttpContext = new HttpContext();
313
- }
314
- let responseType_ = 'json';
315
- if (localVarHttpHeaderAcceptSelected) {
316
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
317
- responseType_ = 'text';
318
- }
319
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
320
- responseType_ = 'json';
321
- }
322
- else {
323
- responseType_ = 'blob';
324
- }
325
- }
326
- let localVarPath = `/tree2/${this.configuration.encodeParam({
327
- name: 'viewUuid',
328
- value: viewUuid,
329
- in: 'path',
330
- style: 'simple',
331
- explode: false,
332
- dataType: 'string',
333
- dataFormat: 'uuid',
334
- })}/${this.configuration.encodeParam({
335
- name: 'treeId',
336
- value: treeId,
337
- in: 'path',
338
- style: 'simple',
339
- explode: false,
340
- dataType: 'string',
341
- dataFormat: undefined,
342
- })}/${this.configuration.encodeParam({
343
- name: 'nodeId',
344
- value: nodeId,
345
- in: 'path',
346
- style: 'simple',
347
- explode: false,
348
- dataType: 'string',
349
- dataFormat: undefined,
350
- })}/expand`;
351
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
352
- context: localVarHttpContext,
353
- responseType: responseType_,
354
- withCredentials: this.configuration.withCredentials,
355
- headers: localVarHeaders,
356
- observe: observe,
357
- reportProgress: reportProgress,
358
- });
359
- }
360
- getChildrenNodes(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
361
- if (viewUuid === null || viewUuid === undefined) {
362
- throw new Error('Required parameter viewUuid was null or undefined when calling getChildrenNodes.');
363
- }
364
- if (treeId === null || treeId === undefined) {
365
- throw new Error('Required parameter treeId was null or undefined when calling getChildrenNodes.');
366
- }
367
- if (nodeId === null || nodeId === undefined) {
368
- throw new Error('Required parameter nodeId was null or undefined when calling getChildrenNodes.');
369
- }
370
- let localVarHeaders = this.defaultHeaders;
371
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
372
- if (localVarHttpHeaderAcceptSelected === undefined) {
373
- // to determine the Accept header
374
- const httpHeaderAccepts = ['application/json'];
375
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
376
- }
377
- if (localVarHttpHeaderAcceptSelected !== undefined) {
378
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
379
- }
380
- let localVarHttpContext = options && options.context;
381
- if (localVarHttpContext === undefined) {
382
- localVarHttpContext = new HttpContext();
383
- }
384
- let responseType_ = 'json';
385
- if (localVarHttpHeaderAcceptSelected) {
386
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
387
- responseType_ = 'text';
388
- }
389
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
390
- responseType_ = 'json';
391
- }
392
- else {
393
- responseType_ = 'blob';
394
- }
395
- }
396
- let localVarPath = `/tree/${this.configuration.encodeParam({
397
- name: 'viewUuid',
398
- value: viewUuid,
399
- in: 'path',
400
- style: 'simple',
401
- explode: false,
402
- dataType: 'string',
403
- dataFormat: 'uuid',
404
- })}/${this.configuration.encodeParam({
405
- name: 'treeId',
406
- value: treeId,
407
- in: 'path',
408
- style: 'simple',
409
- explode: false,
410
- dataType: 'string',
411
- dataFormat: undefined,
412
- })}/${this.configuration.encodeParam({
413
- name: 'nodeId',
414
- value: nodeId,
415
- in: 'path',
416
- style: 'simple',
417
- explode: false,
418
- dataType: 'string',
419
- dataFormat: undefined,
420
- })}`;
421
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
422
- context: localVarHttpContext,
423
- responseType: responseType_,
424
- withCredentials: this.configuration.withCredentials,
425
- headers: localVarHeaders,
426
- observe: observe,
427
- reportProgress: reportProgress,
428
- });
429
- }
430
- getChildrenNodes2(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
431
- if (viewUuid === null || viewUuid === undefined) {
432
- throw new Error('Required parameter viewUuid was null or undefined when calling getChildrenNodes2.');
433
- }
434
- if (treeId === null || treeId === undefined) {
435
- throw new Error('Required parameter treeId was null or undefined when calling getChildrenNodes2.');
436
- }
437
- if (nodeId === null || nodeId === undefined) {
438
- throw new Error('Required parameter nodeId was null or undefined when calling getChildrenNodes2.');
439
- }
440
- let localVarHeaders = this.defaultHeaders;
441
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
442
- if (localVarHttpHeaderAcceptSelected === undefined) {
443
- // to determine the Accept header
444
- const httpHeaderAccepts = ['application/json'];
445
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
446
- }
447
- if (localVarHttpHeaderAcceptSelected !== undefined) {
448
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
449
- }
450
- let localVarHttpContext = options && options.context;
451
- if (localVarHttpContext === undefined) {
452
- localVarHttpContext = new HttpContext();
453
- }
454
- let responseType_ = 'json';
455
- if (localVarHttpHeaderAcceptSelected) {
456
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
457
- responseType_ = 'text';
458
- }
459
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
460
- responseType_ = 'json';
461
- }
462
- else {
463
- responseType_ = 'blob';
464
- }
465
- }
466
- let localVarPath = `/tree2/${this.configuration.encodeParam({
467
- name: 'viewUuid',
468
- value: viewUuid,
469
- in: 'path',
470
- style: 'simple',
471
- explode: false,
472
- dataType: 'string',
473
- dataFormat: 'uuid',
474
- })}/${this.configuration.encodeParam({
475
- name: 'treeId',
476
- value: treeId,
477
- in: 'path',
478
- style: 'simple',
479
- explode: false,
480
- dataType: 'string',
481
- dataFormat: undefined,
482
- })}/${this.configuration.encodeParam({
483
- name: 'nodeId',
484
- value: nodeId,
485
- in: 'path',
486
- style: 'simple',
487
- explode: false,
488
- dataType: 'string',
489
- dataFormat: undefined,
490
- })}`;
491
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
492
- context: localVarHttpContext,
493
- responseType: responseType_,
494
- withCredentials: this.configuration.withCredentials,
495
- headers: localVarHeaders,
496
- observe: observe,
497
- reportProgress: reportProgress,
498
- });
499
- }
500
- getMainActions(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
501
- if (viewUuid === null || viewUuid === undefined) {
502
- throw new Error('Required parameter viewUuid was null or undefined when calling getMainActions.');
503
- }
504
- if (treeId === null || treeId === undefined) {
505
- throw new Error('Required parameter treeId was null or undefined when calling getMainActions.');
506
- }
507
- let localVarHeaders = this.defaultHeaders;
508
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
509
- if (localVarHttpHeaderAcceptSelected === undefined) {
510
- // to determine the Accept header
511
- const httpHeaderAccepts = ['application/json'];
512
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
513
- }
514
- if (localVarHttpHeaderAcceptSelected !== undefined) {
515
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
516
- }
517
- let localVarHttpContext = options && options.context;
518
- if (localVarHttpContext === undefined) {
519
- localVarHttpContext = new HttpContext();
520
- }
521
- let responseType_ = 'json';
522
- if (localVarHttpHeaderAcceptSelected) {
523
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
524
- responseType_ = 'text';
525
- }
526
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
527
- responseType_ = 'json';
528
- }
529
- else {
530
- responseType_ = 'blob';
531
- }
532
- }
533
- let localVarPath = `/tree/${this.configuration.encodeParam({
534
- name: 'viewUuid',
535
- value: viewUuid,
536
- in: 'path',
537
- style: 'simple',
538
- explode: false,
539
- dataType: 'string',
540
- dataFormat: 'uuid',
541
- })}/${this.configuration.encodeParam({
542
- name: 'treeId',
543
- value: treeId,
544
- in: 'path',
545
- style: 'simple',
546
- explode: false,
547
- dataType: 'string',
548
- dataFormat: undefined,
549
- })}/action`;
550
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
551
- context: localVarHttpContext,
552
- responseType: responseType_,
553
- withCredentials: this.configuration.withCredentials,
554
- headers: localVarHeaders,
555
- observe: observe,
556
- reportProgress: reportProgress,
557
- });
558
- }
559
- getMainActions2(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
560
- if (viewUuid === null || viewUuid === undefined) {
561
- throw new Error('Required parameter viewUuid was null or undefined when calling getMainActions2.');
562
- }
563
- if (treeId === null || treeId === undefined) {
564
- throw new Error('Required parameter treeId was null or undefined when calling getMainActions2.');
565
- }
566
- let localVarHeaders = this.defaultHeaders;
567
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
568
- if (localVarHttpHeaderAcceptSelected === undefined) {
569
- // to determine the Accept header
570
- const httpHeaderAccepts = ['application/json'];
571
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
572
- }
573
- if (localVarHttpHeaderAcceptSelected !== undefined) {
574
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
575
- }
576
- let localVarHttpContext = options && options.context;
577
- if (localVarHttpContext === undefined) {
578
- localVarHttpContext = new HttpContext();
579
- }
580
- let responseType_ = 'json';
581
- if (localVarHttpHeaderAcceptSelected) {
582
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
583
- responseType_ = 'text';
584
- }
585
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
586
- responseType_ = 'json';
587
- }
588
- else {
589
- responseType_ = 'blob';
590
- }
591
- }
592
- let localVarPath = `/tree2/${this.configuration.encodeParam({
593
- name: 'viewUuid',
594
- value: viewUuid,
595
- in: 'path',
596
- style: 'simple',
597
- explode: false,
598
- dataType: 'string',
599
- dataFormat: 'uuid',
600
- })}/${this.configuration.encodeParam({
601
- name: 'treeId',
602
- value: treeId,
603
- in: 'path',
604
- style: 'simple',
605
- explode: false,
606
- dataType: 'string',
607
- dataFormat: undefined,
608
- })}/action`;
609
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
610
- context: localVarHttpContext,
611
- responseType: responseType_,
612
- withCredentials: this.configuration.withCredentials,
613
- headers: localVarHeaders,
614
- observe: observe,
615
- reportProgress: reportProgress,
616
- });
617
- }
618
- getRootNodes(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
619
- if (viewUuid === null || viewUuid === undefined) {
620
- throw new Error('Required parameter viewUuid was null or undefined when calling getRootNodes.');
621
- }
622
- if (treeId === null || treeId === undefined) {
623
- throw new Error('Required parameter treeId was null or undefined when calling getRootNodes.');
624
- }
625
- let localVarHeaders = this.defaultHeaders;
626
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
627
- if (localVarHttpHeaderAcceptSelected === undefined) {
628
- // to determine the Accept header
629
- const httpHeaderAccepts = ['application/json'];
630
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
631
- }
632
- if (localVarHttpHeaderAcceptSelected !== undefined) {
633
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
634
- }
635
- let localVarHttpContext = options && options.context;
636
- if (localVarHttpContext === undefined) {
637
- localVarHttpContext = new HttpContext();
638
- }
639
- let responseType_ = 'json';
640
- if (localVarHttpHeaderAcceptSelected) {
641
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
642
- responseType_ = 'text';
643
- }
644
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
645
- responseType_ = 'json';
646
- }
647
- else {
648
- responseType_ = 'blob';
649
- }
650
- }
651
- let localVarPath = `/tree/${this.configuration.encodeParam({
652
- name: 'viewUuid',
653
- value: viewUuid,
654
- in: 'path',
655
- style: 'simple',
656
- explode: false,
657
- dataType: 'string',
658
- dataFormat: 'uuid',
659
- })}/${this.configuration.encodeParam({
660
- name: 'treeId',
661
- value: treeId,
662
- in: 'path',
663
- style: 'simple',
664
- explode: false,
665
- dataType: 'string',
666
- dataFormat: undefined,
667
- })}`;
668
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
669
- context: localVarHttpContext,
670
- responseType: responseType_,
671
- withCredentials: this.configuration.withCredentials,
672
- headers: localVarHeaders,
673
- observe: observe,
674
- reportProgress: reportProgress,
675
- });
676
- }
677
- getRootNodes2(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
678
- if (viewUuid === null || viewUuid === undefined) {
679
- throw new Error('Required parameter viewUuid was null or undefined when calling getRootNodes2.');
680
- }
681
- if (treeId === null || treeId === undefined) {
682
- throw new Error('Required parameter treeId was null or undefined when calling getRootNodes2.');
683
- }
684
- let localVarHeaders = this.defaultHeaders;
685
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
686
- if (localVarHttpHeaderAcceptSelected === undefined) {
687
- // to determine the Accept header
688
- const httpHeaderAccepts = ['application/json'];
689
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
690
- }
691
- if (localVarHttpHeaderAcceptSelected !== undefined) {
692
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
693
- }
694
- let localVarHttpContext = options && options.context;
695
- if (localVarHttpContext === undefined) {
696
- localVarHttpContext = new HttpContext();
697
- }
698
- let responseType_ = 'json';
699
- if (localVarHttpHeaderAcceptSelected) {
700
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
701
- responseType_ = 'text';
702
- }
703
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
704
- responseType_ = 'json';
705
- }
706
- else {
707
- responseType_ = 'blob';
708
- }
709
- }
710
- let localVarPath = `/tree2/${this.configuration.encodeParam({
711
- name: 'viewUuid',
712
- value: viewUuid,
713
- in: 'path',
714
- style: 'simple',
715
- explode: false,
716
- dataType: 'string',
717
- dataFormat: 'uuid',
718
- })}/${this.configuration.encodeParam({
719
- name: 'treeId',
720
- value: treeId,
721
- in: 'path',
722
- style: 'simple',
723
- explode: false,
724
- dataType: 'string',
725
- dataFormat: undefined,
726
- })}`;
727
- return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
728
- context: localVarHttpContext,
729
- responseType: responseType_,
730
- withCredentials: this.configuration.withCredentials,
731
- headers: localVarHeaders,
732
- observe: observe,
733
- reportProgress: reportProgress,
734
- });
735
- }
736
- performAction(viewUuid, treeId, nodeId, body, observe = 'body', reportProgress = false, options) {
737
- if (viewUuid === null || viewUuid === undefined) {
738
- throw new Error('Required parameter viewUuid was null or undefined when calling performAction.');
739
- }
740
- if (treeId === null || treeId === undefined) {
741
- throw new Error('Required parameter treeId was null or undefined when calling performAction.');
742
- }
743
- if (nodeId === null || nodeId === undefined) {
744
- throw new Error('Required parameter nodeId was null or undefined when calling performAction.');
745
- }
746
- if (body === null || body === undefined) {
747
- throw new Error('Required parameter body was null or undefined when calling performAction.');
748
- }
749
- let localVarHeaders = this.defaultHeaders;
750
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
751
- if (localVarHttpHeaderAcceptSelected === undefined) {
752
- // to determine the Accept header
753
- const httpHeaderAccepts = ['application/json'];
754
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
755
- }
756
- if (localVarHttpHeaderAcceptSelected !== undefined) {
757
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
758
- }
759
- let localVarHttpContext = options && options.context;
760
- if (localVarHttpContext === undefined) {
761
- localVarHttpContext = new HttpContext();
762
- }
763
- // to determine the Content-Type header
764
- const consumes = ['application/json'];
765
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
766
- if (httpContentTypeSelected !== undefined) {
767
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
768
- }
769
- let responseType_ = 'json';
770
- if (localVarHttpHeaderAcceptSelected) {
771
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
772
- responseType_ = 'text';
773
- }
774
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
775
- responseType_ = 'json';
776
- }
777
- else {
778
- responseType_ = 'blob';
779
- }
780
- }
781
- let localVarPath = `/tree/${this.configuration.encodeParam({
782
- name: 'viewUuid',
783
- value: viewUuid,
784
- in: 'path',
785
- style: 'simple',
786
- explode: false,
787
- dataType: 'string',
788
- dataFormat: 'uuid',
789
- })}/${this.configuration.encodeParam({
790
- name: 'treeId',
791
- value: treeId,
792
- in: 'path',
793
- style: 'simple',
794
- explode: false,
795
- dataType: 'string',
796
- dataFormat: undefined,
797
- })}/${this.configuration.encodeParam({
798
- name: 'nodeId',
799
- value: nodeId,
800
- in: 'path',
801
- style: 'simple',
802
- explode: false,
803
- dataType: 'string',
804
- dataFormat: undefined,
805
- })}/action`;
806
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
807
- context: localVarHttpContext,
808
- body: body,
809
- responseType: responseType_,
810
- withCredentials: this.configuration.withCredentials,
811
- headers: localVarHeaders,
812
- observe: observe,
813
- reportProgress: reportProgress,
814
- });
815
- }
816
- performAction2(viewUuid, treeId, nodeId, body, observe = 'body', reportProgress = false, options) {
817
- if (viewUuid === null || viewUuid === undefined) {
818
- throw new Error('Required parameter viewUuid was null or undefined when calling performAction2.');
819
- }
820
- if (treeId === null || treeId === undefined) {
821
- throw new Error('Required parameter treeId was null or undefined when calling performAction2.');
822
- }
823
- if (nodeId === null || nodeId === undefined) {
824
- throw new Error('Required parameter nodeId was null or undefined when calling performAction2.');
825
- }
826
- if (body === null || body === undefined) {
827
- throw new Error('Required parameter body was null or undefined when calling performAction2.');
828
- }
829
- let localVarHeaders = this.defaultHeaders;
830
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
831
- if (localVarHttpHeaderAcceptSelected === undefined) {
832
- // to determine the Accept header
833
- const httpHeaderAccepts = ['application/json'];
834
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
835
- }
836
- if (localVarHttpHeaderAcceptSelected !== undefined) {
837
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
838
- }
839
- let localVarHttpContext = options && options.context;
840
- if (localVarHttpContext === undefined) {
841
- localVarHttpContext = new HttpContext();
842
- }
843
- // to determine the Content-Type header
844
- const consumes = ['application/json'];
845
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
846
- if (httpContentTypeSelected !== undefined) {
847
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
848
- }
849
- let responseType_ = 'json';
850
- if (localVarHttpHeaderAcceptSelected) {
851
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
852
- responseType_ = 'text';
853
- }
854
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
855
- responseType_ = 'json';
856
- }
857
- else {
858
- responseType_ = 'blob';
859
- }
860
- }
861
- let localVarPath = `/tree2/${this.configuration.encodeParam({
862
- name: 'viewUuid',
863
- value: viewUuid,
864
- in: 'path',
865
- style: 'simple',
866
- explode: false,
867
- dataType: 'string',
868
- dataFormat: 'uuid',
869
- })}/${this.configuration.encodeParam({
870
- name: 'treeId',
871
- value: treeId,
872
- in: 'path',
873
- style: 'simple',
874
- explode: false,
875
- dataType: 'string',
876
- dataFormat: undefined,
877
- })}/${this.configuration.encodeParam({
878
- name: 'nodeId',
879
- value: nodeId,
880
- in: 'path',
881
- style: 'simple',
882
- explode: false,
883
- dataType: 'string',
884
- dataFormat: undefined,
885
- })}/action`;
886
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
887
- context: localVarHttpContext,
888
- body: body,
889
- responseType: responseType_,
890
- withCredentials: this.configuration.withCredentials,
891
- headers: localVarHeaders,
892
- observe: observe,
893
- reportProgress: reportProgress,
894
- });
895
- }
896
- performMainAction(viewUuid, treeId, body, observe = 'body', reportProgress = false, options) {
897
- if (viewUuid === null || viewUuid === undefined) {
898
- throw new Error('Required parameter viewUuid was null or undefined when calling performMainAction.');
899
- }
900
- if (treeId === null || treeId === undefined) {
901
- throw new Error('Required parameter treeId was null or undefined when calling performMainAction.');
902
- }
903
- if (body === null || body === undefined) {
904
- throw new Error('Required parameter body was null or undefined when calling performMainAction.');
905
- }
906
- let localVarHeaders = this.defaultHeaders;
907
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
908
- if (localVarHttpHeaderAcceptSelected === undefined) {
909
- // to determine the Accept header
910
- const httpHeaderAccepts = ['application/json'];
911
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
912
- }
913
- if (localVarHttpHeaderAcceptSelected !== undefined) {
914
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
915
- }
916
- let localVarHttpContext = options && options.context;
917
- if (localVarHttpContext === undefined) {
918
- localVarHttpContext = new HttpContext();
919
- }
920
- // to determine the Content-Type header
921
- const consumes = ['application/json'];
922
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
923
- if (httpContentTypeSelected !== undefined) {
924
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
925
- }
926
- let responseType_ = 'json';
927
- if (localVarHttpHeaderAcceptSelected) {
928
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
929
- responseType_ = 'text';
930
- }
931
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
932
- responseType_ = 'json';
933
- }
934
- else {
935
- responseType_ = 'blob';
936
- }
937
- }
938
- let localVarPath = `/tree/${this.configuration.encodeParam({
939
- name: 'viewUuid',
940
- value: viewUuid,
941
- in: 'path',
942
- style: 'simple',
943
- explode: false,
944
- dataType: 'string',
945
- dataFormat: 'uuid',
946
- })}/${this.configuration.encodeParam({
947
- name: 'treeId',
948
- value: treeId,
949
- in: 'path',
950
- style: 'simple',
951
- explode: false,
952
- dataType: 'string',
953
- dataFormat: undefined,
954
- })}/action`;
955
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
956
- context: localVarHttpContext,
957
- body: body,
958
- responseType: responseType_,
959
- withCredentials: this.configuration.withCredentials,
960
- headers: localVarHeaders,
961
- observe: observe,
962
- reportProgress: reportProgress,
963
- });
964
- }
965
- performMainAction2(viewUuid, treeId, body, observe = 'body', reportProgress = false, options) {
966
- if (viewUuid === null || viewUuid === undefined) {
967
- throw new Error('Required parameter viewUuid was null or undefined when calling performMainAction2.');
968
- }
969
- if (treeId === null || treeId === undefined) {
970
- throw new Error('Required parameter treeId was null or undefined when calling performMainAction2.');
971
- }
972
- if (body === null || body === undefined) {
973
- throw new Error('Required parameter body was null or undefined when calling performMainAction2.');
974
- }
975
- let localVarHeaders = this.defaultHeaders;
976
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
977
- if (localVarHttpHeaderAcceptSelected === undefined) {
978
- // to determine the Accept header
979
- const httpHeaderAccepts = ['application/json'];
980
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
981
- }
982
- if (localVarHttpHeaderAcceptSelected !== undefined) {
983
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
984
- }
985
- let localVarHttpContext = options && options.context;
986
- if (localVarHttpContext === undefined) {
987
- localVarHttpContext = new HttpContext();
988
- }
989
- // to determine the Content-Type header
990
- const consumes = ['application/json'];
991
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
992
- if (httpContentTypeSelected !== undefined) {
993
- localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
994
- }
995
- let responseType_ = 'json';
996
- if (localVarHttpHeaderAcceptSelected) {
997
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
998
- responseType_ = 'text';
999
- }
1000
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1001
- responseType_ = 'json';
1002
- }
1003
- else {
1004
- responseType_ = 'blob';
1005
- }
1006
- }
1007
- let localVarPath = `/tree2/${this.configuration.encodeParam({
1008
- name: 'viewUuid',
1009
- value: viewUuid,
1010
- in: 'path',
1011
- style: 'simple',
1012
- explode: false,
1013
- dataType: 'string',
1014
- dataFormat: 'uuid',
1015
- })}/${this.configuration.encodeParam({
1016
- name: 'treeId',
1017
- value: treeId,
1018
- in: 'path',
1019
- style: 'simple',
1020
- explode: false,
1021
- dataType: 'string',
1022
- dataFormat: undefined,
1023
- })}/action`;
1024
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
1025
- context: localVarHttpContext,
1026
- body: body,
1027
- responseType: responseType_,
1028
- withCredentials: this.configuration.withCredentials,
1029
- headers: localVarHeaders,
1030
- observe: observe,
1031
- reportProgress: reportProgress,
1032
- });
1033
- }
1034
- selectNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
1035
- if (viewUuid === null || viewUuid === undefined) {
1036
- throw new Error('Required parameter viewUuid was null or undefined when calling selectNode.');
1037
- }
1038
- if (treeId === null || treeId === undefined) {
1039
- throw new Error('Required parameter treeId was null or undefined when calling selectNode.');
1040
- }
1041
- if (nodeId === null || nodeId === undefined) {
1042
- throw new Error('Required parameter nodeId was null or undefined when calling selectNode.');
1043
- }
1044
- let localVarHeaders = this.defaultHeaders;
1045
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1046
- if (localVarHttpHeaderAcceptSelected === undefined) {
1047
- // to determine the Accept header
1048
- const httpHeaderAccepts = ['application/json'];
1049
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1050
- }
1051
- if (localVarHttpHeaderAcceptSelected !== undefined) {
1052
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1053
- }
1054
- let localVarHttpContext = options && options.context;
1055
- if (localVarHttpContext === undefined) {
1056
- localVarHttpContext = new HttpContext();
1057
- }
1058
- let responseType_ = 'json';
1059
- if (localVarHttpHeaderAcceptSelected) {
1060
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1061
- responseType_ = 'text';
1062
- }
1063
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1064
- responseType_ = 'json';
1065
- }
1066
- else {
1067
- responseType_ = 'blob';
1068
- }
1069
- }
1070
- let localVarPath = `/tree/${this.configuration.encodeParam({
1071
- name: 'viewUuid',
1072
- value: viewUuid,
1073
- in: 'path',
1074
- style: 'simple',
1075
- explode: false,
1076
- dataType: 'string',
1077
- dataFormat: 'uuid',
1078
- })}/${this.configuration.encodeParam({
1079
- name: 'treeId',
1080
- value: treeId,
1081
- in: 'path',
1082
- style: 'simple',
1083
- explode: false,
1084
- dataType: 'string',
1085
- dataFormat: undefined,
1086
- })}/${this.configuration.encodeParam({
1087
- name: 'nodeId',
1088
- value: nodeId,
1089
- in: 'path',
1090
- style: 'simple',
1091
- explode: false,
1092
- dataType: 'string',
1093
- dataFormat: undefined,
1094
- })}/select`;
1095
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
1096
- context: localVarHttpContext,
1097
- responseType: responseType_,
1098
- withCredentials: this.configuration.withCredentials,
1099
- headers: localVarHeaders,
1100
- observe: observe,
1101
- reportProgress: reportProgress,
1102
- });
1103
- }
1104
- selectNode2(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
1105
- if (viewUuid === null || viewUuid === undefined) {
1106
- throw new Error('Required parameter viewUuid was null or undefined when calling selectNode2.');
1107
- }
1108
- if (treeId === null || treeId === undefined) {
1109
- throw new Error('Required parameter treeId was null or undefined when calling selectNode2.');
1110
- }
1111
- if (nodeId === null || nodeId === undefined) {
1112
- throw new Error('Required parameter nodeId was null or undefined when calling selectNode2.');
1113
- }
1114
- let localVarHeaders = this.defaultHeaders;
1115
- let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1116
- if (localVarHttpHeaderAcceptSelected === undefined) {
1117
- // to determine the Accept header
1118
- const httpHeaderAccepts = ['application/json'];
1119
- localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1120
- }
1121
- if (localVarHttpHeaderAcceptSelected !== undefined) {
1122
- localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1123
- }
1124
- let localVarHttpContext = options && options.context;
1125
- if (localVarHttpContext === undefined) {
1126
- localVarHttpContext = new HttpContext();
1127
- }
1128
- let responseType_ = 'json';
1129
- if (localVarHttpHeaderAcceptSelected) {
1130
- if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1131
- responseType_ = 'text';
1132
- }
1133
- else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1134
- responseType_ = 'json';
1135
- }
1136
- else {
1137
- responseType_ = 'blob';
1138
- }
1139
- }
1140
- let localVarPath = `/tree2/${this.configuration.encodeParam({
1141
- name: 'viewUuid',
1142
- value: viewUuid,
1143
- in: 'path',
1144
- style: 'simple',
1145
- explode: false,
1146
- dataType: 'string',
1147
- dataFormat: 'uuid',
1148
- })}/${this.configuration.encodeParam({
1149
- name: 'treeId',
1150
- value: treeId,
1151
- in: 'path',
1152
- style: 'simple',
1153
- explode: false,
1154
- dataType: 'string',
1155
- dataFormat: undefined,
1156
- })}/${this.configuration.encodeParam({
1157
- name: 'nodeId',
1158
- value: nodeId,
1159
- in: 'path',
1160
- style: 'simple',
1161
- explode: false,
1162
- dataType: 'string',
1163
- dataFormat: undefined,
1164
- })}/select`;
1165
- return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
1166
- context: localVarHttpContext,
1167
- responseType: responseType_,
1168
- withCredentials: this.configuration.withCredentials,
1169
- headers: localVarHeaders,
1170
- observe: observe,
1171
- reportProgress: reportProgress,
1172
- });
1173
- }
1174
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TreeService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1175
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TreeService, providedIn: 'root' }); }
1176
- }
1177
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TreeService, decorators: [{
1178
- type: Injectable,
1179
- args: [{
1180
- providedIn: 'root',
1181
- }]
1182
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
1183
- type: Optional
1184
- }, {
1185
- type: Inject,
1186
- args: [BASE_PATH]
1187
- }] }, { type: i2.Configuration, decorators: [{
1188
- type: Optional
1189
- }] }] });
1190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtdHJlZS90cmVlLWFwaS9hcGkvdHJlZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFFTCxXQUFXLEVBS1gsV0FBVyxHQUNaLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBUXRELGFBQWE7QUFDYixPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLakQsTUFBTSxPQUFPLFdBQVc7SUFNdEIsWUFDWSxVQUFzQixFQUNELFFBQTJCLEVBQzlDLGFBQTRCO1FBRjlCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFOeEIsYUFBUSxHQUFHLGtCQUFrQixDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFRekMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxRQUFRLEdBQUcsUUFBUSxDQUFD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LEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQ0YsQ0FBQztJQUNKLENBQUM7K0dBdjdEVSxXQUFXLDRDQVFBLFNBQVM7bUhBUnBCLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBU0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxTQUFTOzswQkFDNUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBVaXRyZWUgQXBpXHJcbiAqIFRyZWUgZG9tYWluIG9iamVjdHNcclxuICpcclxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDEuMC4wXHJcbiAqIENvbnRhY3Q6IGluZm9AaXQ0YWxsLmh1XHJcbiAqXHJcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXHJcbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxyXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXHJcbiAqL1xyXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgSHR0cENsaWVudCxcclxuICBIdHRwSGVhZGVycyxcclxuICBIdHRwUGFyYW1zLFxyXG4gIEh0dHBSZXNwb25zZSxcclxuICBIdHRwRXZlbnQsXHJcbiAgSHR0cFBhcmFtZXRlckNvZGVjLFxyXG4gIEh0dHBDb250ZXh0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gZnJvbSAnLi4vZW5jb2Rlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHsgU21hcnRUcmVlTm9kZSB9IGZyb20gJy4uLy4uJztcclxuLy8gQHRzLWlnbm9yZVxyXG5pbXBvcnQgeyBVaUFjdGlvbiwgVWlBY3Rpb25SZXF1ZXN0LCBWaWV3Q29udGV4dENoYW5nZSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5cclxuLy8gQHRzLWlnbm9yZVxyXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlU2VydmljZSB7XHJcbiAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG4gIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcclxuICBwdWJsaWMgZW5jb2RlcjogSHR0cFBhcmFtZXRlckNvZGVjO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSxcclxuICAgIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25cclxuICApIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZVBhdGgpICYmIGJhc2VQYXRoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBiYXNlUGF0aCA9IGJhc2VQYXRoWzBdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcclxuICAgIH1cclxuICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcclxuICB9XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSwga2V5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBodHRwUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU/OiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKFxyXG4gICAgICAgICAgKGVsZW0pID0+IChodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgZWxlbSwga2V5KSlcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgKHZhbHVlIGFzIERhdGUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDAsIDEwKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGUnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goXHJcbiAgICAgICAgICAoaykgPT5cclxuICAgICAgICAgICAgKGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShcclxuICAgICAgICAgICAgICBodHRwUGFyYW1zLFxyXG4gICAgICAgICAgICAgIHZhbHVlW2tdLFxyXG4gICAgICAgICAgICAgIGtleSAhPSBudWxsID8gYCR7a2V5fS4ke2t9YCA6IGtcclxuICAgICAgICAgICAgKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7XHJcbiAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXknKTtcclxuICAgIH1cclxuICAgIHJldHVybiBodHRwUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2VzIHRoZSBnaXZlbiB0cmVlbm9kZS4gVGhlIHZpZXdjb250ZXh0IHdpbGwgaG9sZCB0aGUgYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb24gIGZvciB0aGUgdWkuIFJldHVybnMgdGhlIGNvbGxhcHNlZCBTbWFydFRyZWVOb2RlLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxTbWFydFRyZWVOb2RlPjtcclxuICBwdWJsaWMgY29sbGFwc2VOb2RlKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBjb2xsYXBzZU5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBjb2xsYXBzZU5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNvbGxhcHNlTm9kZS4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNvbGxhcHNlTm9kZS4nKTtcclxuICAgIH1cclxuICAgIGlmIChub2RlSWQgPT09IG51bGwgfHwgbm9kZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbm9kZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY29sbGFwc2VOb2RlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2NvbGxhcHNlYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxTbWFydFRyZWVOb2RlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlcyB0aGUgZ2l2ZW4gdHJlZW5vZGUuIFRoZSB2aWV3Y29udGV4dCB3aWxsIGhvbGQgdGhlIGFwcHJvcHJpYXRlIGluc3RydWN0aW9uICBmb3IgdGhlIHVpLiBSZXR1cm5zIHRoZSBjb2xsYXBzZWQgU21hcnRUcmVlTm9kZS5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIG5vZGVJZFxyXG4gICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXHJcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb2xsYXBzZU5vZGUyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPFZpZXdDb250ZXh0Q2hhbmdlPjtcclxuICBwdWJsaWMgY29sbGFwc2VOb2RlMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZpZXdDb250ZXh0Q2hhbmdlPj47XHJcbiAgcHVibGljIGNvbGxhcHNlTm9kZTIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgY29sbGFwc2VOb2RlMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh2aWV3VXVpZCA9PT0gbnVsbCB8fCB2aWV3VXVpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHZpZXdVdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY29sbGFwc2VOb2RlMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNvbGxhcHNlTm9kZTIuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjb2xsYXBzZU5vZGUyLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlMi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vY29sbGFwc2VgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZpZXdDb250ZXh0Q2hhbmdlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cGFuZHMgdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aSwgaWYgYW55LiBSZXR1cm5zIHRoZSBleHBhbmRlZCBTbWFydFRyZWVOb2RlLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGV4cGFuZE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8U21hcnRUcmVlTm9kZT47XHJcbiAgcHVibGljIGV4cGFuZE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIGV4cGFuZE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBleHBhbmROb2RlKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBleHBhbmROb2RlLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBleHBhbmROb2RlLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBleHBhbmROb2RlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2V4cGFuZGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8U21hcnRUcmVlTm9kZT4oXHJcbiAgICAgICdwb3N0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmRzIHRoZSBnaXZlbiB0cmVlbm9kZS4gVGhlIHZpZXdjb250ZXh0IHdpbGwgaG9sZCB0aGUgYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb24gIGZvciB0aGUgdWksIGlmIGFueS4gUmV0dXJucyB0aGUgZXhwYW5kZWQgU21hcnRUcmVlTm9kZS5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIG5vZGVJZFxyXG4gICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXHJcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBleHBhbmROb2RlMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxWaWV3Q29udGV4dENoYW5nZT47XHJcbiAgcHVibGljIGV4cGFuZE5vZGUyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgZXhwYW5kTm9kZTIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgZXhwYW5kTm9kZTIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGV4cGFuZE5vZGUyLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZXhwYW5kTm9kZTIuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGV4cGFuZE5vZGUyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUyLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3ZpZXdVdWlkJyxcclxuICAgICAgdmFsdWU6IHZpZXdVdWlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6ICd1dWlkJyxcclxuICAgIH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd0cmVlSWQnLFxyXG4gICAgICB2YWx1ZTogdHJlZUlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZCxcclxuICAgIH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICdub2RlSWQnLFxyXG4gICAgICB2YWx1ZTogbm9kZUlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZCxcclxuICAgIH0pfS9leHBhbmRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZpZXdDb250ZXh0Q2hhbmdlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5IHRoZSBjaGlsZCBub2RlcyBvZiB0aGUgdHJlZVxcJiMzOTtzIG5vZGUgZ2l2ZW4gaW4gdGhlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoaWxkcmVuTm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8QXJyYXk8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8U21hcnRUcmVlTm9kZT4+PjtcclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW5Ob2RlcyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRDaGlsZHJlbk5vZGVzLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0Q2hpbGRyZW5Ob2Rlcy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldENoaWxkcmVuTm9kZXMuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcnJheTxTbWFydFRyZWVOb2RlPj4oXHJcbiAgICAgICdnZXQnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5IHRoZSBjaGlsZCBub2RlcyBvZiB0aGUgdHJlZVxcJiMzOTtzIG5vZGUgZ2l2ZW4gaW4gdGhlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoaWxkcmVuTm9kZXMyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPFZpZXdDb250ZXh0Q2hhbmdlPjtcclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW5Ob2RlczIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWaWV3Q29udGV4dENoYW5nZT4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWaWV3Q29udGV4dENoYW5nZT4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh2aWV3VXVpZCA9PT0gbnVsbCB8fCB2aWV3VXVpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHZpZXdVdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0Q2hpbGRyZW5Ob2RlczIuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRDaGlsZHJlbk5vZGVzMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldENoaWxkcmVuTm9kZXMyLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlMi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZpZXdDb250ZXh0Q2hhbmdlPihcclxuICAgICAgJ2dldCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUXVlcnkgYWxsIHRyZWUgbm9kZXMuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXHJcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRNYWluQWN0aW9ucyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8QXJyYXk8VWlBY3Rpb24+PjtcclxuICBwdWJsaWMgZ2V0TWFpbkFjdGlvbnMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8VWlBY3Rpb24+Pj47XHJcbiAgcHVibGljIGdldE1haW5BY3Rpb25zKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxVaUFjdGlvbj4+PjtcclxuICBwdWJsaWMgZ2V0TWFpbkFjdGlvbnMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRNYWluQWN0aW9ucy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldE1haW5BY3Rpb25zLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3ZpZXdVdWlkJyxcclxuICAgICAgdmFsdWU6IHZpZXdVdWlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6ICd1dWlkJyxcclxuICAgIH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd0cmVlSWQnLFxyXG4gICAgICB2YWx1ZTogdHJlZUlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZCxcclxuICAgIH0pfS9hY3Rpb25gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFycmF5PFVpQWN0aW9uPj4oXHJcbiAgICAgICdnZXQnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5IGFsbCB0cmVlIG5vZGVzLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0TWFpbkFjdGlvbnMyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxWaWV3Q29udGV4dENoYW5nZT47XHJcbiAgcHVibGljIGdldE1haW5BY3Rpb25zMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWaWV3Q29udGV4dENoYW5nZT4+O1xyXG4gIHB1YmxpYyBnZXRNYWluQWN0aW9uczIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZpZXdDb250ZXh0Q2hhbmdlPj47XHJcbiAgcHVibGljIGdldE1haW5BY3Rpb25zMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldE1haW5BY3Rpb25zMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldE1haW5BY3Rpb25zMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZTIvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2FjdGlvbmA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8Vmlld0NvbnRleHRDaGFuZ2U+KFxyXG4gICAgICAnZ2V0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBRdWVyeSBhbGwgdHJlZSBub2Rlcy5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFJvb3ROb2RlcyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8QXJyYXk8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBnZXRSb290Tm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8U21hcnRUcmVlTm9kZT4+PjtcclxuICBwdWJsaWMgZ2V0Um9vdE5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBnZXRSb290Tm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRSb290Tm9kZXMuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRSb290Tm9kZXMuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFycmF5PFNtYXJ0VHJlZU5vZGU+PihcclxuICAgICAgJ2dldCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUXVlcnkgYWxsIHRyZWUgbm9kZXMuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXHJcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSb290Tm9kZXMyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxWaWV3Q29udGV4dENoYW5nZT47XHJcbiAgcHVibGljIGdldFJvb3ROb2RlczIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgZ2V0Um9vdE5vZGVzMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgZ2V0Um9vdE5vZGVzMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFJvb3ROb2RlczIuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRSb290Tm9kZXMyLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlMi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZpZXdDb250ZXh0Q2hhbmdlPihcclxuICAgICAgJ2dldCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgYW4gYWN0aW9uIG9uIHRoZSBnaXZlbiB0cmVlbm9kZS4gVGhlIHZpZXdjb250ZXh0IHdpbGwgaG9sZCB0aGUgYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb24gIGZvciB0aGUgdWkuIFJldHVybnMgdGhlIFNtYXJ0VHJlZU5vZGUgd2hpY2ggdGhlIGFjdGlvbiB3YXMgcGVyZm9ybWVkIG9uLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIGJvZHlcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgcGVyZm9ybUFjdGlvbihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIHBlcmZvcm1BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBwZXJmb3JtQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5PFNtYXJ0VHJlZU5vZGU+Pj47XHJcbiAgcHVibGljIHBlcmZvcm1BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24uJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwZXJmb3JtQWN0aW9uLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChub2RlSWQgPT09IG51bGwgfHwgbm9kZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgbm9kZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGVyZm9ybUFjdGlvbi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxyXG4gICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcclxuICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2FjdGlvbmA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXJyYXk8U21hcnRUcmVlTm9kZT4+KFxyXG4gICAgICAncG9zdCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICBib2R5OiBib2R5LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtcyBhbiBhY3Rpb24gb24gdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aS4gUmV0dXJucyB0aGUgU21hcnRUcmVlTm9kZSB3aGljaCB0aGUgYWN0aW9uIHdhcyBwZXJmb3JtZWQgb24uXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBub2RlSWRcclxuICAgKiBAcGFyYW0gYm9keVxyXG4gICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXHJcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwZXJmb3JtQWN0aW9uMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxWaWV3Q29udGV4dENoYW5nZT47XHJcbiAgcHVibGljIHBlcmZvcm1BY3Rpb24yKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgcGVyZm9ybUFjdGlvbjIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Vmlld0NvbnRleHRDaGFuZ2U+PjtcclxuICBwdWJsaWMgcGVyZm9ybUFjdGlvbjIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24yLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGVyZm9ybUFjdGlvbjIuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwZXJmb3JtQWN0aW9uMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24yLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcclxuICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XHJcbiAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlMi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vYWN0aW9uYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWaWV3Q29udGV4dENoYW5nZT4oXHJcbiAgICAgICdwb3N0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIGJvZHk6IGJvZHksXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgZ2l2ZW4gdHJlZW5vZGUuIFRoZSB2aWV3Y29udGV4dCB3aWxsIGhvbGQgdGhlIGFwcHJvcHJpYXRlIGluc3RydWN0aW9uICBmb3IgdGhlIHVpLiBSZXR1cm5zIHRoZSBTbWFydFRyZWVOb2RlIHdoaWNoIHRoZSBhY3Rpb24gd2FzIHBlcmZvcm1lZCBvbi5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIGJvZHlcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgcGVyZm9ybU1haW5BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEFycmF5PFNtYXJ0VHJlZU5vZGU+PjtcclxuICBwdWJsaWMgcGVyZm9ybU1haW5BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8U21hcnRUcmVlTm9kZT4+PjtcclxuICBwdWJsaWMgcGVyZm9ybU1haW5BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5PFNtYXJ0VHJlZU5vZGU+Pj47XHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh2aWV3VXVpZCA9PT0gbnVsbCB8fCB2aWV3VXVpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHZpZXdVdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGVyZm9ybU1haW5BY3Rpb24uJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwZXJmb3JtTWFpbkFjdGlvbi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1NYWluQWN0aW9uLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXHJcbiAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xyXG4gICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vYWN0aW9uYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcnJheTxTbWFydFRyZWVOb2RlPj4oXHJcbiAgICAgICdwb3N0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIGJvZHk6IGJvZHksXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgZ2l2ZW4gdHJlZW5vZGUuIFRoZSB2aWV3Y29udGV4dCB3aWxsIGhvbGQgdGhlIGFwcHJvcHJpYXRlIGluc3RydWN0aW9uICBmb3IgdGhlIHVpLiBSZXR1cm5zIHRoZSBTbWFydFRyZWVOb2RlIHdoaWNoIHRoZSBhY3Rpb24gd2FzIHBlcmZvcm1lZCBvbi5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIGJvZHlcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgcGVyZm9ybU1haW5BY3Rpb24yKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxWaWV3Q29udGV4dENoYW5nZT47XHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWaWV3Q29udGV4dENoYW5nZT4+O1xyXG4gIHB1YmxpYyBwZXJmb3JtTWFpbkFjdGlvbjIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZpZXdDb250ZXh0Q2hhbmdlPj47XHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1NYWluQWN0aW9uMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1NYWluQWN0aW9uMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1NYWluQWN0aW9uMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxyXG4gICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcclxuICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUyLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3ZpZXdVdWlkJyxcclxuICAgICAgdmFsdWU6IHZpZXdVdWlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6ICd1dWlkJyxcclxuICAgIH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd0cmVlSWQnLFxyXG4gICAgICB2YWx1ZTogdHJlZUlkLFxyXG4gICAgICBpbjogJ3BhdGgnLFxyXG4gICAgICBzdHlsZTogJ3NpbXBsZScsXHJcbiAgICAgIGV4cGxvZGU6IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZCxcclxuICAgIH0pfS9hY3Rpb25gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZpZXdDb250ZXh0Q2hhbmdlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgYm9keTogYm9keSxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2VzIHRoZSBnaXZlbiB0cmVlbm9kZS4gVGhlIHZpZXdjb250ZXh0IHdpbGwgaG9sZCB0aGUgYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb24gIGZvciB0aGUgdWkuIFJldHVybnMgdGhlIGNvbGxhcHNlZCBTbWFydFRyZWVOb2RlLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8U21hcnRUcmVlTm9kZT47XHJcbiAgcHVibGljIHNlbGVjdE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIHNlbGVjdE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBzZWxlY3ROb2RlKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBzZWxlY3ROb2RlLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBzZWxlY3ROb2RlLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBzZWxlY3ROb2RlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L3NlbGVjdGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8U21hcnRUcmVlTm9kZT4oXHJcbiAgICAgICdwb3N0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZXMgdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aS4gUmV0dXJucyB0aGUgY29sbGFwc2VkIFNtYXJ0VHJlZU5vZGUuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBub2RlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0Tm9kZTIoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8Vmlld0NvbnRleHRDaGFuZ2U+O1xyXG4gIHB1YmxpYyBzZWxlY3ROb2RlMihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZpZXdDb250ZXh0Q2hhbmdlPj47XHJcbiAgcHVibGljIHNlbGVjdE5vZGUyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZpZXdDb250ZXh0Q2hhbmdlPj47XHJcbiAgcHVibGljIHNlbGVjdE5vZGUyKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBzZWxlY3ROb2RlMi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNlbGVjdE5vZGUyLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBzZWxlY3ROb2RlMi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXHJcbiAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFsnYXBwbGljYXRpb24vanNvbiddO1xyXG4gICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xyXG4gICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC90cmVlMi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vc2VsZWN0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWaWV3Q29udGV4dENoYW5nZT4oXHJcbiAgICAgICdwb3N0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==