@wavemaker/app-ng-runtime 11.8.0-next.24904 → 11.8.0-next.27301

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 (346) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +5 -5
  2. app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
  3. app-ng-runtime/build-task/esm2022/page/page.build.mjs +3 -2
  4. app-ng-runtime/build-task/fesm2022/index.mjs +2 -1
  5. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  6. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +5 -5
  7. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +3 -2
  8. app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +1 -1
  9. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +2 -1
  10. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  11. app-ng-runtime/components/advanced/login/bundles/index.umd.js +6 -6
  12. app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +4 -3
  13. app-ng-runtime/components/advanced/login/fesm2022/index.mjs +3 -2
  14. app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
  15. app-ng-runtime/components/base/bundles/index.umd.js +203 -171
  16. app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +1 -1
  17. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +12 -11
  18. app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +3 -2
  19. app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +30 -29
  20. app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +47 -41
  21. app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +8 -7
  22. app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +28 -27
  23. app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +4 -3
  24. app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +24 -21
  25. app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +12 -11
  26. app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +40 -14
  27. app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +3 -2
  28. app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +3 -2
  29. app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +1 -1
  30. app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +3 -2
  31. app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +3 -2
  32. app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +6 -5
  33. app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
  34. app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +3 -2
  35. app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +4 -3
  36. app-ng-runtime/components/base/fesm2022/index.mjs +206 -173
  37. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  38. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  39. app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
  40. app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
  41. app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
  42. app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
  43. app-ng-runtime/components/basic/default/bundles/index.umd.js +10 -10
  44. app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +4 -3
  45. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +6 -5
  46. app-ng-runtime/components/basic/default/fesm2022/index.mjs +7 -6
  47. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  48. app-ng-runtime/components/basic/progress/bundles/index.umd.js +13 -13
  49. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +5 -4
  50. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +6 -5
  51. app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
  52. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +10 -9
  53. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  54. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +15 -10
  55. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +14 -8
  56. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +13 -7
  57. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  58. app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
  59. app-ng-runtime/components/basic/search/bundles/index.umd.js +67 -65
  60. app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
  61. app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +26 -23
  62. app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +12 -11
  63. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +31 -30
  64. app-ng-runtime/components/basic/search/fesm2022/index.mjs +66 -63
  65. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  66. app-ng-runtime/components/basic/tree/bundles/index.umd.js +9 -9
  67. app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +7 -6
  68. app-ng-runtime/components/basic/tree/fesm2022/index.mjs +6 -5
  69. app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
  70. app-ng-runtime/components/chart/bundles/index.umd.js +72 -63
  71. app-ng-runtime/components/chart/chart.component.d.ts +1 -1
  72. app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
  73. app-ng-runtime/components/chart/esm2022/chart.component.mjs +58 -48
  74. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +14 -13
  75. app-ng-runtime/components/chart/fesm2022/index.mjs +69 -59
  76. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  77. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +16 -16
  78. app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +14 -13
  79. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +13 -12
  80. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  81. app-ng-runtime/components/containers/panel/bundles/index.umd.js +5 -5
  82. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +3 -2
  83. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +2 -1
  84. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  85. app-ng-runtime/components/containers/panel/panel.component.d.ts +1 -1
  86. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +17 -17
  87. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +15 -14
  88. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +14 -13
  89. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  90. app-ng-runtime/components/data/form/bundles/index.umd.js +75 -75
  91. app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +3 -2
  92. app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +10 -9
  93. app-ng-runtime/components/data/form/esm2022/form.component.mjs +54 -53
  94. app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +3 -2
  95. app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +11 -10
  96. app-ng-runtime/components/data/form/fesm2022/index.mjs +77 -76
  97. app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
  98. app-ng-runtime/components/data/form/form.component.d.ts +2 -2
  99. app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
  100. app-ng-runtime/components/data/list/bundles/index.umd.js +692 -687
  101. app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +1 -1
  102. app-ng-runtime/components/data/list/esm2022/list.animator.mjs +5 -3
  103. app-ng-runtime/components/data/list/esm2022/list.component.mjs +687 -682
  104. app-ng-runtime/components/data/list/fesm2022/index.mjs +690 -684
  105. app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
  106. app-ng-runtime/components/data/list/list.component.d.ts +53 -53
  107. app-ng-runtime/components/data/live-table/bundles/index.umd.js +1 -1
  108. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +2 -2
  109. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +1 -1
  110. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  111. app-ng-runtime/components/data/pagination/bundles/index.umd.js +14 -14
  112. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +12 -11
  113. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +11 -10
  114. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  115. app-ng-runtime/components/data/table/bundles/index.umd.js +175 -172
  116. app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +3 -2
  117. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +19 -18
  118. app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +7 -6
  119. app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +53 -55
  120. app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +3 -2
  121. app-ng-runtime/components/data/table/esm2022/table.component.mjs +98 -91
  122. app-ng-runtime/components/data/table/fesm2022/index.mjs +172 -168
  123. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  124. app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +6 -6
  125. app-ng-runtime/components/data/table/table.component.d.ts +2 -2
  126. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +2 -2
  127. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +3 -3
  128. app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +1 -1
  129. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +1 -1
  130. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  131. app-ng-runtime/components/input/calendar/bundles/index.umd.js +33 -31
  132. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +31 -28
  133. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +30 -27
  134. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  135. app-ng-runtime/components/input/chips/bundles/index.umd.js +29 -28
  136. app-ng-runtime/components/input/chips/chips.component.d.ts +1 -1
  137. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +27 -25
  138. app-ng-runtime/components/input/chips/fesm2022/index.mjs +26 -24
  139. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  140. app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
  141. app-ng-runtime/components/input/default/bundles/index.umd.js +75 -62
  142. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
  143. app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
  144. app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +14 -8
  145. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +3 -2
  146. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +2 -2
  147. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +6 -4
  148. app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +29 -23
  149. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +4 -3
  150. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +4 -3
  151. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
  152. app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +4 -3
  153. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +20 -18
  154. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +2 -2
  155. app-ng-runtime/components/input/default/fesm2022/index.mjs +75 -62
  156. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  157. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +1 -1
  158. app-ng-runtime/components/input/epoch/bundles/index.umd.js +53 -51
  159. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +34 -31
  160. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +5 -4
  161. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +5 -4
  162. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +7 -6
  163. app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +1 -1
  164. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +6 -5
  165. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +48 -45
  166. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  167. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +15 -15
  168. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +13 -12
  169. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +12 -11
  170. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  171. app-ng-runtime/components/input/rating/bundles/index.umd.js +12 -12
  172. app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +10 -9
  173. app-ng-runtime/components/input/rating/fesm2022/index.mjs +9 -8
  174. app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
  175. app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +1 -1
  176. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +2 -2
  177. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +1 -1
  178. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  179. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +23 -22
  180. app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +3 -2
  181. app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +6 -5
  182. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
  183. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +10 -8
  184. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +20 -18
  185. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  186. app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +12 -1
  187. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +1 -1
  188. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  189. app-ng-runtime/components/prefab/bundles/index.umd.js +6 -6
  190. app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +3 -2
  191. app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +3 -2
  192. app-ng-runtime/components/prefab/fesm2022/index.mjs +3 -2
  193. app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
  194. app-ng-runtime/core/bundles/index.umd.js +119 -130
  195. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  196. app-ng-runtime/core/esm2022/services/field-type.service.mjs +3 -2
  197. app-ng-runtime/core/esm2022/services/field-widget.service.mjs +3 -2
  198. app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -6
  199. app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -16
  200. app-ng-runtime/core/esm2022/services/utils.service.mjs +3 -2
  201. app-ng-runtime/core/esm2022/services/viewport.service.mjs +3 -2
  202. app-ng-runtime/core/esm2022/utils/build-utils.mjs +5 -4
  203. app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -4
  204. app-ng-runtime/core/esm2022/utils/lru-cache.mjs +3 -2
  205. app-ng-runtime/core/esm2022/utils/utils.mjs +79 -82
  206. app-ng-runtime/core/esm2022/utils/watcher.mjs +9 -7
  207. app-ng-runtime/core/fesm2022/index.mjs +117 -123
  208. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  209. app-ng-runtime/core/public_api.d.ts +1 -1
  210. app-ng-runtime/core/services/pagination.service.d.ts +1 -1
  211. app-ng-runtime/core/utils/utils.d.ts +5 -9
  212. app-ng-runtime/http/bundles/index.umd.js +7 -7
  213. app-ng-runtime/http/esm2022/http.service.mjs +5 -4
  214. app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
  215. app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
  216. app-ng-runtime/http/fesm2022/index.mjs +4 -3
  217. app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
  218. app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +24 -20
  219. app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +5 -4
  220. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +12 -8
  221. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -3
  222. app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +3 -2
  223. app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +5 -4
  224. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +21 -16
  225. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
  226. app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +7 -7
  227. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +2 -2
  228. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +4 -3
  229. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +4 -3
  230. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
  231. app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +8 -8
  232. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +4 -3
  233. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +3 -2
  234. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
  235. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +5 -5
  236. app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +3 -2
  237. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +2 -1
  238. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
  239. app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +9 -9
  240. app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +7 -6
  241. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +6 -5
  242. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
  243. app-ng-runtime/mobile/core/bundles/index.umd.js +25 -25
  244. app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +5 -4
  245. app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +3 -2
  246. app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +4 -3
  247. app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +6 -5
  248. app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +3 -2
  249. app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +5 -4
  250. app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +9 -8
  251. app-ng-runtime/mobile/core/fesm2022/index.mjs +22 -21
  252. app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
  253. app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
  254. app-ng-runtime/mobile/core/services/network.service.d.ts +7 -1
  255. app-ng-runtime/mobile/offline/bundles/index.umd.js +161 -144
  256. app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +23 -21
  257. app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +7 -6
  258. app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -35
  259. app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +54 -45
  260. app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +5 -4
  261. app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +4 -3
  262. app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +18 -13
  263. app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +9 -5
  264. app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +12 -11
  265. app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +5 -4
  266. app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +3 -2
  267. app-ng-runtime/mobile/offline/fesm2022/index.mjs +156 -138
  268. app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
  269. app-ng-runtime/mobile/runtime/bundles/index.umd.js +11 -8
  270. app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +3 -2
  271. app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +6 -2
  272. app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +4 -3
  273. app-ng-runtime/mobile/runtime/fesm2022/index.mjs +8 -4
  274. app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
  275. app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +2 -2
  276. app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +3 -3
  277. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +2 -2
  278. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
  279. app-ng-runtime/mobile/variables/bundles/index.umd.js +23 -16
  280. app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +2 -2
  281. app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +10 -9
  282. app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +11 -3
  283. app-ng-runtime/mobile/variables/fesm2022/index.mjs +19 -11
  284. app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
  285. app-ng-runtime/oAuth/bundles/index.umd.js +12 -12
  286. app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +4 -3
  287. app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +8 -7
  288. app-ng-runtime/oAuth/fesm2022/index.mjs +9 -8
  289. app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
  290. app-ng-runtime/package.json +1 -1
  291. app-ng-runtime/runtime/base/bundles/index.umd.js +121 -120
  292. app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -3
  293. app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +14 -13
  294. app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +13 -12
  295. app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +15 -14
  296. app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +14 -13
  297. app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +6 -5
  298. app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +11 -10
  299. app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +1 -1
  300. app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +3 -2
  301. app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +1 -1
  302. app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +17 -14
  303. app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +7 -6
  304. app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +3 -2
  305. app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +4 -3
  306. app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +12 -10
  307. app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +8 -7
  308. app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +3 -2
  309. app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +7 -6
  310. app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +6 -5
  311. app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +6 -7
  312. app-ng-runtime/runtime/base/fesm2022/index.mjs +119 -117
  313. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  314. app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
  315. app-ng-runtime/runtime/dynamic/bundles/index.umd.js +7 -7
  316. app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +4 -3
  317. app-ng-runtime/runtime/dynamic/esm2022/main.mjs +3 -2
  318. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +4 -3
  319. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  320. app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
  321. app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +13 -10
  322. app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
  323. app-ng-runtime/security/bundles/index.umd.js +14 -14
  324. app-ng-runtime/security/esm2022/security.service.mjs +12 -11
  325. app-ng-runtime/security/fesm2022/index.mjs +11 -10
  326. app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
  327. app-ng-runtime/security/security.service.d.ts +1 -1
  328. app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
  329. app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
  330. app-ng-runtime/transpiler/bundles/index.umd.js +10 -9
  331. app-ng-runtime/transpiler/esm2022/build.mjs +8 -6
  332. app-ng-runtime/transpiler/fesm2022/index.mjs +7 -5
  333. app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
  334. app-ng-runtime/variables/bundles/index.umd.js +155 -145
  335. app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +15 -14
  336. app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +9 -8
  337. app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +3 -2
  338. app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +11 -10
  339. app-ng-runtime/variables/esm2022/service/variables.service.mjs +7 -6
  340. app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
  341. app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +30 -23
  342. app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +29 -28
  343. app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +75 -70
  344. app-ng-runtime/variables/fesm2022/index.mjs +169 -158
  345. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  346. app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  import { $parseEvent, $watch, DataType, DEFAULT_FORMATS, extractType, findValueOf, getBlob, getClonedObject, stringStartsWith, triggerFn } from '@wm/core';
2
2
  import { CONSTANTS, VARIABLE_CONSTANTS, WS_CONSTANTS } from '../../constants/variables.constants';
3
+ import { debounce, filter, forEach, get, includes, isArray, isDate, isEmpty, isFunction, isNumber, isObject, isString, isUndefined, join, keys, last, map, noop, pickBy, remove, replace, set, slice, split, toLower, toUpper, trim } from "lodash-es";
3
4
  const exportTypesMap = { 'EXCEL': '.xlsx', 'CSV': '.csv' };
4
5
  export let appManager;
5
6
  export let httpService;
@@ -12,16 +13,16 @@ export let securityService;
12
13
  export let dialogService;
13
14
  const DOT_EXPR_REX = /^\[("|')[\w\W]*(\1)\]$/, internalBoundNodeMap = new Map(), timers = new Map();
14
15
  const _invoke = (variable, op) => {
15
- let debouncedFn, cancelFn = _.noop, retVal;
16
+ let debouncedFn, cancelFn = noop, retVal;
16
17
  if (timers.has(variable)) {
17
18
  cancelFn = timers.get(variable).cancel;
18
19
  }
19
20
  cancelFn();
20
- debouncedFn = _.debounce(function () {
21
+ debouncedFn = debounce(function () {
21
22
  retVal = variable[op]();
22
23
  // handle promises to avoid uncaught promise errors in console
23
24
  if (retVal instanceof Promise) {
24
- retVal.catch(_.noop);
25
+ retVal.catch(noop);
25
26
  }
26
27
  }, 100);
27
28
  timers.set(variable, debouncedFn);
@@ -32,7 +33,7 @@ const processVariablePostBindUpdate = (nodeName, nodeVal, nodeType, variable, no
32
33
  case VARIABLE_CONSTANTS.CATEGORY.LIVE:
33
34
  if (variable.operation === 'read') {
34
35
  if (nodeName === 'dataBinding') {
35
- _.forEach(nodeVal, function (val, key) {
36
+ forEach(nodeVal, function (val, key) {
36
37
  variable.filterFields[key] = {
37
38
  'value': val
38
39
  };
@@ -45,7 +46,7 @@ const processVariablePostBindUpdate = (nodeName, nodeVal, nodeType, variable, no
45
46
  };
46
47
  }
47
48
  /* if auto-update set for the variable with read operation only, get its data */
48
- if (variable.autoUpdate && !_.isUndefined(nodeVal) && _.isFunction(variable.listRecords) && !noUpdate) {
49
+ if (variable.autoUpdate && !isUndefined(nodeVal) && isFunction(variable.listRecords) && !noUpdate) {
49
50
  _invoke(variable, 'listRecords');
50
51
  }
51
52
  }
@@ -57,25 +58,25 @@ const processVariablePostBindUpdate = (nodeName, nodeVal, nodeType, variable, no
57
58
  variable.inputFields[nodeName] = nodeVal;
58
59
  }
59
60
  /* if auto-update set for the variable with read operation only, get its data */
60
- if (variable.autoUpdate && !_.isUndefined(nodeVal) && _.isFunction(variable[variable.operation + 'Record']) && !noUpdate) {
61
+ if (variable.autoUpdate && !isUndefined(nodeVal) && isFunction(variable[variable.operation + 'Record']) && !noUpdate) {
61
62
  _invoke(variable, variable.operation + 'Record');
62
63
  }
63
64
  }
64
65
  break;
65
66
  case VARIABLE_CONSTANTS.CATEGORY.CRUD:
66
- if (variable.operationType === 'list' && variable.autoUpdate && !_.isUndefined(nodeVal) && _.isFunction(variable.invoke) && !noUpdate) {
67
+ if (variable.operationType === 'list' && variable.autoUpdate && !isUndefined(nodeVal) && isFunction(variable.invoke) && !noUpdate) {
67
68
  _invoke(variable, 'invoke');
68
69
  }
69
70
  break;
70
71
  case VARIABLE_CONSTANTS.CATEGORY.SERVICE:
71
72
  case VARIABLE_CONSTANTS.CATEGORY.LOGIN:
72
- if (variable.autoUpdate && !_.isUndefined(nodeVal) && _.isFunction(variable.invoke) && !noUpdate) {
73
+ if (variable.autoUpdate && !isUndefined(nodeVal) && isFunction(variable.invoke) && !noUpdate) {
73
74
  _invoke(variable, 'invoke');
74
75
  }
75
76
  break;
76
77
  case VARIABLE_CONSTANTS.CATEGORY.DEVICE:
77
78
  variable[nodeName] = nodeVal;
78
- if (variable.autoUpdate && !_.isUndefined(nodeVal) && _.isFunction(variable.invoke) && !noUpdate) {
79
+ if (variable.autoUpdate && !isUndefined(nodeVal) && isFunction(variable.invoke) && !noUpdate) {
79
80
  _invoke(variable, 'invoke');
80
81
  }
81
82
  break;
@@ -127,7 +128,7 @@ export const initiateCallback = (type, variable, data, options, skipDefaultNotif
127
128
  errorVariable = callBackScope.Actions[VARIABLE_CONSTANTS.DEFAULT_VAR.NOTIFICATION];
128
129
  if (errorVariable) {
129
130
  data = errorVariable.getMessage() || data;
130
- data = _.isString(data) ? data : 'An error has occured. Please check the app logs.';
131
+ data = isString(data) ? data : 'An error has occured. Please check the app logs.';
131
132
  errorVariable.invoke({ 'message': data }, undefined, undefined);
132
133
  // $rootScope.$evalAsync(function () {
133
134
  // $rootScope.$emit("invoke-service", VARIABLE_CONSTANTS.DEFAULT_VAR.NOTIFICATION, {scope: callBackScope, message: response});
@@ -238,10 +239,10 @@ const getService = (serviceName) => {
238
239
  * @param params
239
240
  */
240
241
  const setParamsFromURL = (queryParams, params) => {
241
- queryParams = _.split(queryParams, '&');
242
- _.forEach(queryParams, function (param) {
243
- param = _.split(param, '=');
244
- params[param[0]] = decodeURIComponent(_.join(_.slice(param, 1), '='));
242
+ queryParams = split(queryParams, '&');
243
+ forEach(queryParams, function (param) {
244
+ param = split(param, '=');
245
+ params[param[0]] = decodeURIComponent(join(slice(param, 1), '='));
245
246
  });
246
247
  };
247
248
  /**
@@ -269,7 +270,9 @@ const downloadThroughIframe = (requestParams, success, dataBinding) => {
269
270
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
270
271
  }
271
272
  let iFrameElement, formEl, paramElement, queryParams = '', data;
272
- const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
273
+ const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = get(requestParams.headers, CONTENT_TYPE), params = pickBy(requestParams.headers, function (val, key) {
274
+ return key !== CONTENT_TYPE;
275
+ });
273
276
  /* Todo: shubham : define getService method
274
277
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
275
278
  /* look for existing iframe. If exists, remove it first */
@@ -286,20 +289,20 @@ const downloadThroughIframe = (requestParams, success, dataBinding) => {
286
289
  'target': iFrameElement.attr('name'),
287
290
  'action': url,
288
291
  'method': requestParams.method,
289
- 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
292
+ 'enctype': !(isEmpty(requestParams.data) && isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
290
293
  });
291
294
  // For Non body methods only, set the input fields from query parameters
292
- if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
295
+ if (includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, toUpper(requestParams.method))) {
293
296
  setParamsFromURL(queryParams, params); // Set params for URL query params
294
297
  }
295
- if (!_.isEmpty(requestParams.data)) {
298
+ if (!isEmpty(requestParams.data)) {
296
299
  setParamsFromURL(requestParams.data, params); // Set params for request data
297
300
  data = params;
298
301
  }
299
302
  else {
300
- data = _.isEmpty(dataBinding) ? params : dataBinding;
303
+ data = isEmpty(dataBinding) ? params : dataBinding;
301
304
  }
302
- _.forEach(data, function (val, key) {
305
+ forEach(data, function (val, key) {
303
306
  paramElement = $('<input type="hidden">');
304
307
  paramElement.attr({
305
308
  'name': key,
@@ -358,8 +361,8 @@ const getModifiedFileName = (fileName, exportFormat) => {
358
361
  fileExtension = exportTypesMap[exportFormat];
359
362
  }
360
363
  else {
361
- fileExtension = '.' + _.last(_.split(fileName, '.'));
362
- fileName = _.replace(fileName, fileExtension, '');
364
+ fileExtension = '.' + last(split(fileName, '.'));
365
+ fileName = replace(fileName, fileExtension, '');
363
366
  }
364
367
  return fileName + '_' + currentTimestamp + fileExtension;
365
368
  };
@@ -449,7 +452,7 @@ const getTargetNodeKey = (target) => {
449
452
  };
450
453
  const setValueToNode = (target, obj, root, variable, value, noUpdate) => {
451
454
  const targetNodeKey = getTargetNodeKey(target), targetObj = getTargetObj(obj, root, variable);
452
- value = !_.isUndefined(value) ? value : obj.value;
455
+ value = !isUndefined(value) ? value : obj.value;
453
456
  /* sanity check, user can bind parent nodes to non-object values, so child node bindings may fail */
454
457
  if (targetObj) {
455
458
  targetObj[targetNodeKey] = value;
@@ -491,18 +494,18 @@ const setValueToNode = (target, obj, root, variable, value, noUpdate) => {
491
494
  * @param variable
492
495
  */
493
496
  const updateInternalNodes = (target, root, variable) => {
494
- const boundInternalNodes = _.keys(_.get(internalBoundNodeMap.get(variable), [variable.name, root])), targetNodeKey = getTargetNodeKey(target);
497
+ const boundInternalNodes = keys(get(internalBoundNodeMap.get(variable), [variable.name, root])), targetNodeKey = getTargetNodeKey(target);
495
498
  let internalNodes;
496
499
  function findInternalNodeBound() {
497
- return _.filter(boundInternalNodes, function (node) {
500
+ return filter(boundInternalNodes, function (node) {
498
501
  // the later condition in check (targetNodeKey === root || targetNodeKey === 'dataBinding') is specifically for live variable of insert/update types
499
- return (node !== targetNodeKey && _.includes(node, targetNodeKey)) || ((targetNodeKey === root || targetNodeKey === 'dataBinding') && node !== targetNodeKey);
502
+ return (node !== targetNodeKey && includes(node, targetNodeKey)) || ((targetNodeKey === root || targetNodeKey === 'dataBinding') && node !== targetNodeKey);
500
503
  });
501
504
  }
502
505
  internalNodes = findInternalNodeBound();
503
506
  if ((internalNodes.length)) {
504
- _.forEach(internalNodes, function (node) {
505
- setValueToNode(node, { target: node }, root, variable, _.get(internalBoundNodeMap.get(variable), [variable.name, root, node]));
507
+ forEach(internalNodes, function (node) {
508
+ setValueToNode(node, { target: node }, root, variable, get(internalBoundNodeMap.get(variable), [variable.name, root, node]));
506
509
  });
507
510
  }
508
511
  };
@@ -516,14 +519,14 @@ const updateInternalNodes = (target, root, variable) => {
516
519
  */
517
520
  const processBindObject = (obj, scope, root, variable) => {
518
521
  const target = obj.target, targetObj = getTargetObj(obj, root, variable), targetNodeKey = getTargetNodeKey(target), runMode = true;
519
- const destroyFn = scope.registerDestroyListener ? scope.registerDestroyListener.bind(scope) : _.noop;
522
+ const destroyFn = scope.registerDestroyListener ? scope.registerDestroyListener.bind(scope) : noop;
520
523
  if (stringStartsWith(obj.value, 'bind:')) {
521
524
  const listener = (newVal, oldVal) => {
522
- if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && (!_.isUndefined(oldVal) || !_.isUndefined(targetObj[targetNodeKey])))) {
525
+ if ((newVal === oldVal && isUndefined(newVal)) || (isUndefined(newVal) && (!isUndefined(oldVal) || !isUndefined(targetObj[targetNodeKey])))) {
523
526
  return;
524
527
  }
525
528
  // Skip cloning for blob column
526
- if (!_.includes(['blob', 'file'], obj.type)) {
529
+ if (!includes(['blob', 'file'], obj.type)) {
527
530
  newVal = getClonedObject(newVal);
528
531
  }
529
532
  setValueToNode(target, obj, root, variable, newVal); // cloning newVal to keep the source clean
@@ -532,22 +535,22 @@ const processBindObject = (obj, scope, root, variable) => {
532
535
  if (!internalBoundNodeMap.has(variable)) {
533
536
  internalBoundNodeMap.set(variable, {});
534
537
  }
535
- _.set(internalBoundNodeMap.get(variable), [variable.name, root, target], newVal);
538
+ set(internalBoundNodeMap.get(variable), [variable.name, root, target], newVal);
536
539
  /*update the internal nodes after internal node map is set*/
537
- if (_.isObject(newVal)) {
540
+ if (isObject(newVal)) {
538
541
  updateInternalNodes(target, root, variable);
539
542
  }
540
543
  }
541
544
  };
542
545
  destroyFn($watch(obj.value.replace('bind:', ''), scope, {}, listener, undefined, undefined, undefined, () => variable.isMuted));
543
546
  }
544
- else if (!_.isUndefined(obj.value)) {
547
+ else if (!isUndefined(obj.value)) {
545
548
  setValueToNode(target, obj, root, variable, obj.value, true);
546
549
  if (runMode && root !== targetNodeKey) {
547
550
  if (!internalBoundNodeMap.has(variable)) {
548
551
  internalBoundNodeMap.set(variable, {});
549
552
  }
550
- _.set(internalBoundNodeMap.get(variable), [variable.name, root, target], obj.value);
553
+ set(internalBoundNodeMap.get(variable), [variable.name, root, target], obj.value);
551
554
  }
552
555
  }
553
556
  };
@@ -567,7 +570,7 @@ export const processBinding = (variable, context, bindSource, bindTarget) => {
567
570
  const bindMap = variable[bindSource];
568
571
  variable[bindSource] = {};
569
572
  variable['_bind' + bindSource] = bindMap;
570
- if (!bindMap || !_.isArray(bindMap)) {
573
+ if (!bindMap || !isArray(bindMap)) {
571
574
  return;
572
575
  }
573
576
  bindMap.forEach(function (node) {
@@ -605,7 +608,7 @@ export const simulateFileDownload = (requestParams, fileName, exportFormat, succ
605
608
  }
606
609
  appManager.notify('device-file-download', { url: requestParams.url, name: fileName, extension: fileExtension, headers: requestParams.headers, successCb: success, errorCb: error });
607
610
  }
608
- else if (!_.isEmpty(requestParams.headers) || isXsrfEnabled()) {
611
+ else if (!isEmpty(requestParams.headers) || isXsrfEnabled()) {
609
612
  downloadThroughAnchor(requestParams, success, error);
610
613
  }
611
614
  else {
@@ -629,17 +632,19 @@ export const setInput = (targetObj, key, val, options) => {
629
632
  targetObj = targetObj || {};
630
633
  let keys, lastKey, paramObj = {};
631
634
  // content type check
632
- if (_.isObject(options)) {
635
+ if (isObject(options)) {
636
+ // @ts-ignore
633
637
  switch (options.type) {
634
638
  case 'file':
639
+ // @ts-ignore
635
640
  val = getBlob(val, options.contentType);
636
641
  break;
637
642
  case 'number':
638
- val = _.isNumber(val) ? val : parseInt(val, 10);
643
+ val = isNumber(val) ? val : parseInt(val, 10);
639
644
  break;
640
645
  }
641
646
  }
642
- if (_.isObject(key)) {
647
+ if (isObject(key)) {
643
648
  // check if the passed parameter is an object itself
644
649
  paramObj = key;
645
650
  }
@@ -655,7 +660,7 @@ export const setInput = (targetObj, key, val, options) => {
655
660
  else {
656
661
  paramObj[key] = val;
657
662
  }
658
- _.forEach(paramObj, function (paramVal, paramKey) {
663
+ forEach(paramObj, function (paramVal, paramKey) {
659
664
  targetObj[paramKey] = paramVal;
660
665
  });
661
666
  return targetObj;
@@ -676,7 +681,7 @@ export const isFileUploadSupported = () => {
676
681
  export const getEvaluatedOrderBy = (varOrder, optionsOrder) => {
677
682
  let optionFields, varOrderBy;
678
683
  // If options order by is not defined, return variable order
679
- if (!optionsOrder || _.isEmpty(optionsOrder)) {
684
+ if (!optionsOrder || isEmpty(optionsOrder)) {
680
685
  return varOrder;
681
686
  }
682
687
  // If variable order by is not defined, return options order
@@ -684,17 +689,17 @@ export const getEvaluatedOrderBy = (varOrder, optionsOrder) => {
684
689
  return optionsOrder;
685
690
  }
686
691
  // If both are present, combine the options order and variable order, with options order as precedence
687
- varOrder = _.split(varOrder, ',');
688
- optionsOrder = _.split(optionsOrder, ',');
689
- optionFields = _.map(optionsOrder, function (order) {
690
- return _.split(_.trim(order), ' ')[0];
692
+ varOrder = split(varOrder, ',');
693
+ optionsOrder = split(optionsOrder, ',');
694
+ optionFields = map(optionsOrder, function (order) {
695
+ return split(trim(order), ' ')[0];
691
696
  });
692
697
  // If a field is present in both options and variable, remove the variable orderby
693
- _.remove(varOrder, function (orderBy) {
694
- return _.includes(optionFields, _.split(_.trim(orderBy), ' ')[0]);
698
+ remove(varOrder, function (orderBy) {
699
+ return includes(optionFields, split(trim(orderBy), ' ')[0]);
695
700
  });
696
- varOrderBy = varOrder.length ? ',' + _.join(varOrder, ',') : '';
697
- return _.join(optionsOrder, ',') + varOrderBy;
701
+ varOrderBy = varOrder.length ? ',' + join(varOrder, ',') : '';
702
+ return join(optionsOrder, ',') + varOrderBy;
698
703
  };
699
704
  /**
700
705
  * formatting the expression as required by backend which was enclosed by ${<expression>}.
@@ -702,7 +707,7 @@ export const getEvaluatedOrderBy = (varOrder, optionsOrder) => {
702
707
  * returns fieldDefs
703
708
  */
704
709
  export const formatExportExpression = fieldDefs => {
705
- _.forEach(fieldDefs, function (fieldDef) {
710
+ forEach(fieldDefs, function (fieldDef) {
706
711
  if (fieldDef.expression) {
707
712
  fieldDef.expression = '${' + fieldDef.expression + '}';
708
713
  }
@@ -711,12 +716,12 @@ export const formatExportExpression = fieldDefs => {
711
716
  };
712
717
  export const debounceVariableCall = _invoke;
713
718
  const getDateTimeFormatForType = (type) => {
714
- return DEFAULT_FORMATS[_.toUpper(type)];
719
+ return DEFAULT_FORMATS[toUpper(type)];
715
720
  };
716
721
  // Format value for datetime types
717
722
  const _formatDate = (dateValue, type) => {
718
723
  let epoch;
719
- if (_.isDate(dateValue)) {
724
+ if (isDate(dateValue)) {
720
725
  epoch = dateValue.getTime();
721
726
  }
722
727
  else {
@@ -738,11 +743,11 @@ const _formatDate = (dateValue, type) => {
738
743
  };
739
744
  // Function to convert values of date time types into default formats
740
745
  export const formatDate = (value, type) => {
741
- if (_.includes(type, '.')) {
742
- type = _.toLower(extractType(type));
746
+ if (includes(type, '.')) {
747
+ type = toLower(extractType(type));
743
748
  }
744
- if (_.isArray(value)) {
745
- return _.map(value, function (val) {
749
+ if (isArray(value)) {
750
+ return map(value, function (val) {
746
751
  return _formatDate(val, type);
747
752
  });
748
753
  }
@@ -758,34 +763,34 @@ export const decodeData = (responseContent) => {
758
763
  if (!responseContent) {
759
764
  return responseContent;
760
765
  }
761
- if (_.isArray(responseContent)) {
762
- _.forEach(responseContent, data => {
763
- if (_.isString(data)) {
766
+ if (isArray(responseContent)) {
767
+ forEach(responseContent, data => {
768
+ if (isString(data)) {
764
769
  data = htmlDecode(data);
765
770
  }
766
- else if (_.isObject(data)) {
767
- _.forEach(data, (value, key) => {
768
- if (value && _.isString(value)) {
771
+ else if (isObject(data)) {
772
+ forEach(data, (value, key) => {
773
+ if (value && isString(value)) {
769
774
  data[key] = htmlDecode(value);
770
775
  }
771
- else if (_.isObject(value)) {
776
+ else if (isObject(value)) {
772
777
  decodeData(value);
773
778
  }
774
779
  });
775
780
  }
776
781
  });
777
782
  }
778
- else if (_.isObject(responseContent)) {
779
- _.forEach(responseContent, (value, key) => {
780
- if (value && _.isString(value)) {
783
+ else if (isObject(responseContent)) {
784
+ forEach(responseContent, (value, key) => {
785
+ if (value && isString(value)) {
781
786
  responseContent[key] = htmlDecode(value);
782
787
  }
783
- else if (_.isObject(value)) {
788
+ else if (isObject(value)) {
784
789
  decodeData(value);
785
790
  }
786
791
  });
787
792
  }
788
- else if (_.isString(responseContent)) {
793
+ else if (isString(responseContent)) {
789
794
  responseContent = htmlDecode(responseContent);
790
795
  return responseContent;
791
796
  }
@@ -793,4 +798,4 @@ export const decodeData = (responseContent) => {
793
798
  function htmlDecode(input) {
794
799
  return he.unescape(input);
795
800
  }
796
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJaEcsTUFBTSxjQUFjLEdBQUssRUFBRSxPQUFPLEVBQUcsT0FBTyxFQUFFLEtBQUssRUFBRyxNQUFNLEVBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDdEIsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQztBQUM3QixNQUFNLENBQUMsSUFBSSxhQUFhLENBQUM7QUFDekIsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQztBQUN4QixNQUFNLENBQUMsSUFBSSxlQUFlLENBQUM7QUFDM0IsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDO0FBRXpCLE1BQU0sWUFBWSxHQUFHLHdCQUF3QixFQUN6QyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUNoQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUV2QixNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLFdBQVcsRUFDWCxRQUFRLEdBQUcsQ0FBQyxD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LE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO1NBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDckMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsU0FBUyxVQUFVLENBQUMsS0FBSztJQUNyQixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgJHBhcnNlRXZlbnQsXG4gICAgJHdhdGNoLFxuICAgIERhdGFUeXBlLFxuICAgIERFRkFVTFRfRk9STUFUUyxcbiAgICBleHRyYWN0VHlwZSxcbiAgICBmaW5kVmFsdWVPZixcbiAgICBnZXRCbG9iLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBzdHJpbmdTdGFydHNXaXRoLFxuICAgIHRyaWdnZXJGblxufSBmcm9tICdAd20vY29yZSc7XG5cbmltcG9ydCB7Q09OU1RBTlRTLCBWQVJJQUJMRV9DT05TVEFOVFMsIFdTX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdywgXywgJCwgbW9tZW50LCBoZTtcblxuY29uc3QgZXhwb3J0VHlwZXNNYXAgICA9IHsgJ0VYQ0VMJyA6ICcueGxzeCcsICdDU1YnIDogJy5jc3YnfTtcblxuZXhwb3J0IGxldCBhcHBNYW5hZ2VyO1xuZXhwb3J0IGxldCBodHRwU2VydmljZTtcbmV4cG9ydCBsZXQgbWV0YWRhdGFTZXJ2aWNlO1xuZXhwb3J0IGxldCBuYXZpZ2F0aW9uU2VydmljZTtcbmV4cG9ydCBsZXQgcm91dGVyU2VydmljZTtcbmV4cG9ydCBsZXQgdG9hc3RlclNlcnZpY2U7XG5leHBvcnQgbGV0IG9hdXRoU2VydmljZTtcbmV4cG9ydCBsZXQgc2VjdXJpdHlTZXJ2aWNlO1xuZXhwb3J0IGxldCBkaWFsb2dTZXJ2aWNlO1xuXG5jb25zdCBET1RfRVhQUl9SRVggPSAvXlxcWyhcInwnKVtcXHdcXFddKihcXDEpXFxdJC8sXG4gICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAgPSBuZXcgTWFwKCksXG4gICAgdGltZXJzID0gbmV3IE1hcCgpO1xuXG5jb25zdCBfaW52b2tlID0gKHZhcmlhYmxlLCBvcCkgPT4ge1xuICAgIGxldCBkZWJvdW5jZWRGbixcbiAgICAgICAgY2FuY2VsRm4gPSBfLm5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBfLmRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0VmFsID0gdmFyaWFibGVbb3BdKCk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9taXNlcyB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIGVycm9ycyBpbiBjb25zb2xlXG4gICAgICAgIGlmIChyZXRWYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXRWYWwuY2F0Y2goXy5ub29wKTtcbiAgICAgICAgfVxuICAgIH0sIDEwMCk7XG4gICAgdGltZXJzLnNldCh2YXJpYWJsZSwgZGVib3VuY2VkRm4pO1xuICAgIGRlYm91bmNlZEZuKCk7XG59O1xuXG5jb25zdCBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSA9IChub2RlTmFtZSwgbm9kZVZhbCwgbm9kZVR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFibGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuTElWRTpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGUubGlzdFJlY29yZHMpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnbGlzdFJlY29yZHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkcyA9IG5vZGVWYWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuaW5wdXRGaWVsZHNbbm9kZU5hbWVdID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGVbdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCddKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5DUlVEOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvblR5cGUgPT09ICdsaXN0JyAmJiB2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5ERVZJQ0U6XG4gICAgICAgICAgICB2YXJpYWJsZVtub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldERlcGVuZGVuY3kgPSAodHlwZTogc3RyaW5nLCByZWY6IGFueSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhcHBNYW5hZ2VyJzpcbiAgICAgICAgICAgIGFwcE1hbmFnZXIgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgICAgICBodHRwU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmF2aWdhdGlvblNlcnZpY2UnOlxuICAgICAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncm91dGVyJzpcbiAgICAgICAgICAgIHJvdXRlclNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9hc3Rlcic6XG4gICAgICAgICAgICB0b2FzdGVyU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb0F1dGgnOlxuICAgICAgICAgICAgb2F1dGhTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWN1cml0eSc6XG4gICAgICAgICAgICBzZWN1cml0eVNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICAgICAgICBkaWFsb2dTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2FsbGJhY2sgPSAodHlwZTogc3RyaW5nLCB2YXJpYWJsZTogYW55LCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnksIHNraXBEZWZhdWx0Tm90aWZpY2F0aW9uPzogYm9vbGVhbikgPT4ge1xuXG4gICAgLypjaGVja2luZyBpZiBldmVudCBpcyBhdmFpbGFibGUgYW5kIHZhcmlhYmxlIGhhcyBldmVudCBwcm9wZXJ0eSBhbmQgdmFyaWFibGUgZXZlbnQgcHJvcGVydHkgYm91bmQgdG8gZnVuY3Rpb24qL1xuICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdmFyaWFibGVbdHlwZV0sXG4gICAgICAgIGNhbGxCYWNrU2NvcGUgPSB2YXJpYWJsZS5fY29udGV4dDtcbiAgICBsZXQgZXJyb3JWYXJpYWJsZTtcbiAgICAvKipcbiAgICAgKiBGb3IgZXJyb3IgZXZlbnQ6XG4gICAgICogdHJpZ2dlciBhcHAgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICAgKiBpZiBubyBldmVudCBpcyBhc3NpZ25lZCwgdHJpZ2dlciBkZWZhdWx0IGFwcE5vdGlmaWNhdGlvbiB2YXJpYWJsZS5cbiAgICAgKi9cbiAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuRVJST1IgJiYgIXNraXBEZWZhdWx0Tm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICghZXZlbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGlmIG5vIGV2ZW50IGFzc2lnbmVkLCBoYW5kbGUgdGhyb3VnaCBkZWZhdWx0IG5vdGlmaWNhdGlvbiB2YXJpYWJsZSAqL1xuICAgICAgICAgICAgZXJyb3JWYXJpYWJsZSA9IGNhbGxCYWNrU2NvcGUuQWN0aW9uc1tWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OXTtcbiAgICAgICAgICAgIGlmIChlcnJvclZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yVmFyaWFibGUuZ2V0TWVzc2FnZSgpIHx8IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IF8uaXNTdHJpbmcoZGF0YSkgPyBkYXRhIDogJ0FuIGVycm9yIGhhcyBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGFwcCBsb2dzLic7XG4gICAgICAgICAgICAgICAgZXJyb3JWYXJpYWJsZS5pbnZva2UoeyAnbWVzc2FnZScgOiBkYXRhfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRlbWl0KFwiaW52b2tlLXNlcnZpY2VcIiwgVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTiwge3Njb3BlOiBjYWxsQmFja1Njb3BlLCBtZXNzYWdlOiByZXNwb25zZX0pO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IFtWaWJodV0sIGNoZWNrIHdoZXRoZXIgdG8gc3VwcG9ydCBsZWdhY3kgZXZlbnQgY2FsbGluZyBtZWNoYW5pc20gKGlkZWFsbHksIGl0IHNob3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQpXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudCh2YXJpYWJsZVt0eXBlXSk7XG4gICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5CRUZPUkVfVVBEQVRFKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YUZpbHRlcjogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBpbnB1dERhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRyaWdnZXJPblRpbWVvdXQgPSAoc3VjY2VzcykgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0cmlnZ2VyRm4oc3VjY2Vzcyk7IH0sIDUwMCk7XG59O1xuXG5jb25zdCBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UgPSAocmVzcG9uc2UsIGhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcbiAgICBsZXQgZmlsZW5hbWUgPSAnJyxcbiAgICAgICAgZmlsZW5hbWVSZWdleCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYmxvYixcbiAgICAgICAgVVJMLFxuICAgICAgICBkb3dubG9hZFVybCxcbiAgICAgICAgcG9wdXA7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xuICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XG4gICAgICAgIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcbiAgICAgICAgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXNbMV0pIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIGJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6IHR5cGUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBVUkwgICAgICAgICA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGV0IHJlYWRlcjtcbiAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRyaWdnZXJPblRpbWVvdXQuYmluZCh1bmRlZmluZWQsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbihkb3dubG9hZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXG4gICAgfVxufTtcblxuY29uc3QgZ2V0U2VydmljZSA9IChzZXJ2aWNlTmFtZSkgPT4ge1xuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgLy8gVG9kbzogU2h1YmhhbSwgdW5jb21tZW50IGJlbG93IGNvZGVcbiAgICAvKiAvISogZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdoZXJlIG5nLWFwcCBpcyBkZWZpbmVkICohL1xuICAgICBsZXQgYXBwRWwgPSBXTS5lbGVtZW50KCdbaWQ9bmctYXBwXScpLCBpbmplY3RvcjtcbiAgICAgaWYgKGFwcEVsKSB7XG4gICAgIHRyeSB7XG4gICAgIGluamVjdG9yID0gYXBwRWwuaW5qZWN0b3IoKTsgLy8gZ2V0IHRoZSBhbmd1bGFyIGluamVjdG9yXG4gICAgIGlmIChpbmplY3Rvcikge1xuICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lKTsgLy8gcmV0dXJuIHRoZSBzZXJ2aWNlXG4gICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9XG4gICAgIH0qL1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhlIGZvcm0gZGF0YSBwYXJhbXMgZnJvbSB0aGUgVVJMXG4gKiBAcGFyYW0gcXVlcnlQYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqL1xuY29uc3Qgc2V0UGFyYW1zRnJvbVVSTCA9IChxdWVyeVBhcmFtcywgcGFyYW1zKSA9PiB7XG4gICAgcXVlcnlQYXJhbXMgPSBfLnNwbGl0KHF1ZXJ5UGFyYW1zLCAnJicpO1xuICAgIF8uZm9yRWFjaChxdWVyeVBhcmFtcywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtID0gXy5zcGxpdChwYXJhbSwgJz0nKTtcbiAgICAgICAgcGFyYW1zW3BhcmFtWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChfLmpvaW4oXy5zbGljZShwYXJhbSwgMSksICc9JykpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBbVG9kbzogU2h1YmhhbV0sIEltcGxlbWVudCBEb3dubG9hZCB0aHJvdWdoIEkgZnJhbWVcbiAqIFNpbXVsYXRlcyBmaWxlIGRvd25sb2FkIGluIGFuIGFwcCB0aHJvdWdoIGNyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgaGlkZGVuIGZvcm0gaW4gRE9NLlxuICogVGhlIGFjdGlvbiB3aWxsIGJlIGluaXRpYXRlZCB0aHJvdWdoIGEgU2VydmljZSBWYXJpYWJsZVxuICpcbiAqIFF1ZXJ5IFBhcmFtc1xuICogVGhlIHJlcXVlc3QgcGFyYW1zIGxpa2UgcXVlcnkgcGFyYW1zIGFyZSBhZGRlZCBhcyBoaWRkZW4gaW5wdXQgZWxlbWVudHNcbiAqXG4gKiBIZWFkZXIgUGFyYW1zXG4gKiBUaGUgaGVhZGVyIHBhcmFtcyBmb3IgYSByZXF1ZXN0IGFyZSBhbHNvIGFkZGVkIGFsb25nIHdpdGggaGlkZGVuIGlucHV0IGVsZW1lbnRzLlxuICogVGhpcyBpcyBkb25lIGFzIGhlYWRlcnMgY2FuIG5vdCBiZSBzZXQgZm9yIGEgZm9ybSBQT1NUIGNhbGwgZnJvbSBKYXZhU2NyaXB0XG4gKlxuICogRmluYWxseSwgcmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBzZW50IGFzIGZvbGxvd3M6XG4gKiBGb3IgYSBHRVQgcmVxdWVzdCwgdGhlIHJlcXVlc3QgZGF0YSBpcyBzZW50IGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtcy5cbiAqIEZvciBQT1NULCBpdCBpcyBzZW50IGFzIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGU6IHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNhbGxlZCBmcm9tIHVzZXIgYWN0aW9uXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyBvYmplY3QgY29uc2lzdGluZyB0aGUgaW5mbyB0byBjb25zdHJ1Y3QgdGhlIFhIUiByZXF1ZXN0IGZvciB0aGUgc2VydmljZVxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hJZnJhbWUgPSAocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZGF0YUJpbmRpbmcpID0+IHtcbiAgICAvLyBUb2RvOiBTSHViaGFtOiBVUkwgY29udGFpbnMgJy8vJyBpbiBiZXR3ZWVuIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGF0IHRoZSBVUkwgZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAocmVxdWVzdFBhcmFtcy51cmxbMV0gPT09ICcvJyAmJiByZXF1ZXN0UGFyYW1zLnVybFsyXSA9PT0gJy8nKSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gcmVxdWVzdFBhcmFtcy51cmwuc2xpY2UoMCwgMSkgKyByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgyKTtcbiAgICB9XG4gICAgbGV0IGlGcmFtZUVsZW1lbnQsXG4gICAgICAgIGZvcm1FbCxcbiAgICAgICAgcGFyYW1FbGVtZW50LFxuICAgICAgICBxdWVyeVBhcmFtcyA9ICcnLFxuICAgICAgICBkYXRhO1xuICAgIGNvbnN0IElGUkFNRV9OQU1FICAgICA9ICdmaWxlRG93bmxvYWRJRnJhbWUnLFxuICAgICAgICBGT1JNX05BTUUgICAgICAgPSAnZmlsZURvd25sb2FkRm9ybScsXG4gICAgICAgIENPTlRFTlRfVFlQRSAgICA9ICdDb250ZW50LVR5cGUnLFxuICAgICAgICB1cmwgICAgICAgICAgICAgPSByZXF1ZXN0UGFyYW1zLnVybCxcbiAgICAgICAgZW5jVHlwZSAgICAgICAgID0gXy5nZXQocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBDT05URU5UX1RZUEUpLFxuICAgICAgICBwYXJhbXMgICAgICAgICAgPSBfLnBpY2tCeShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge3JldHVybiBrZXkgIT09IENPTlRFTlRfVFlQRTsgfSk7XG4gICAgLyogVG9kbzogc2h1YmhhbSA6IGRlZmluZSBnZXRTZXJ2aWNlIG1ldGhvZFxuICAgICBXU19DT05TVEFOVFMgICAgPSBnZXRTZXJ2aWNlKCdXU19DT05TVEFOVFMnKTsqL1xuXG4gICAgLyogbG9vayBmb3IgZXhpc3RpbmcgaWZyYW1lLiBJZiBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdCAqL1xuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCcjJyArIElGUkFNRV9OQU1FKTtcbiAgICBpZiAoaUZyYW1lRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5maXJzdCgpLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnPGlmcmFtZSBpZD1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBuYW1lPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIGNsYXNzPVwibmctaGlkZVwiPjwvaWZyYW1lPicpO1xuICAgIGZvcm1FbCAgICAgICAgPSAkKCc8Zm9ybSBpZD1cIicgKyBGT1JNX05BTUUgKyAnXCIgbmFtZT1cIicgKyBGT1JNX05BTUUgKyAnXCI+PC9mb3JtPicpO1xuXG4gICAgLyogcHJvY2VzcyBxdWVyeSBwYXJhbXMsIGFwcGVuZCBhIGhpZGRlbiBpbnB1dCBlbGVtZW50IGluIHRoZSBmb3JtIGFnYWluc3QgZWFjaCBwYXJhbSAqL1xuICAgIHF1ZXJ5UGFyYW1zICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZignPycpICsgMSkgOiAnJztcbiAgICBxdWVyeVBhcmFtcyArPSBlbmNUeXBlID09PSBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5GT1JNX1VSTF9FTkNPREVEID8gKChxdWVyeVBhcmFtcyA/ICcmJyA6ICcnKSArIHJlcXVlc3RQYXJhbXMuZGF0YVBhcmFtcykgOiAnJztcblxuICAgIGZvcm1FbC5hdHRyKHtcbiAgICAgICAgJ3RhcmdldCcgIDogaUZyYW1lRWxlbWVudC5hdHRyKCduYW1lJyksXG4gICAgICAgICdhY3Rpb24nICA6IHVybCxcbiAgICAgICAgJ21ldGhvZCcgIDogcmVxdWVzdFBhcmFtcy5tZXRob2QsXG4gICAgICAgICdlbmN0eXBlJzogIShfLmlzRW1wdHkocmVxdWVzdFBhcmFtcy5kYXRhKSAmJiBfLmlzRW1wdHkocXVlcnlQYXJhbXMpKSA/IGVuY1R5cGUgOiBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5NVUxUSVBBUlRfRk9STURBVEFcbiAgICB9KTtcblxuICAgIC8vIEZvciBOb24gYm9keSBtZXRob2RzIG9ubHksIHNldCB0aGUgaW5wdXQgZmllbGRzIGZyb20gcXVlcnkgcGFyYW1ldGVyc1xuICAgIGlmIChfLmluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIF8udG9VcHBlcihyZXF1ZXN0UGFyYW1zLm1ldGhvZCkpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocXVlcnlQYXJhbXMsIHBhcmFtcyk7IC8vIFNldCBwYXJhbXMgZm9yIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkocmVxdWVzdFBhcmFtcy5kYXRhKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHJlcXVlc3RQYXJhbXMuZGF0YSwgcGFyYW1zKTsvLyBTZXQgcGFyYW1zIGZvciByZXF1ZXN0IGRhdGFcbiAgICAgICAgZGF0YSA9IHBhcmFtcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gXy5pc0VtcHR5KGRhdGFCaW5kaW5nKSA/IHBhcmFtcyA6IGRhdGFCaW5kaW5nO1xuICAgIH1cbiAgICBfLmZvckVhY2goZGF0YSwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgIHBhcmFtRWxlbWVudCA9ICQoJzxpbnB1dCB0eXBlPVwiaGlkZGVuXCI+Jyk7XG4gICAgICAgIHBhcmFtRWxlbWVudC5hdHRyKHtcbiAgICAgICAgICAgICduYW1lJyAgOiBrZXksXG4gICAgICAgICAgICAndmFsdWUnIDogdmFsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtRWwuYXBwZW5kKHBhcmFtRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICAvKiBhcHBlbmQgZm9ybSB0byBpRnJhbWUgYW5kIGlGcmFtZSB0byB0aGUgZG9jdW1lbnQgYW5kIHN1Ym1pdCB0aGUgZm9ybSAqL1xuICAgICQoJ2JvZHknKS5hcHBlbmQoaUZyYW1lRWxlbWVudCk7XG5cbiAgICAvLyB0aW1lb3V0IGZvciBJRSAxMCwgaWZyYW1lRWxlbWVudC5jb250ZW50cygpIGlzIGVtcHR5IGluIElFIDEwIHdpdGhvdXQgdGltZW91dFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpRnJhbWVFbGVtZW50LmNvbnRlbnRzKCkuZmluZCgnYm9keScpLmFwcGVuZChmb3JtRWwpO1xuICAgICAgICBmb3JtRWwuc3VibWl0KCk7XG4gICAgICAgIHRyaWdnZXJGbihzdWNjZXNzKTtcbiAgICB9LCAxMDApO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbiBYSFIgY2FsbCBhZ2FpbnN0IHRoZSBjb25maWdcbiAqIHRoZSByZXNwb25zZSBpcyBjb252ZXJ0ZWQgaW50byBhIGJsb2IgdXJsLCB3aGljaCBpcyBhc3NpZ25lZCB0byB0aGUgc3JjIGF0dHJpYnV0ZSBvZiBhbiBhbmNob3IgZWxlbWVudCB3aXRoIGRvd25sb2FkPXRydWVcbiAqIGEgY2xpY2sgaXMgc2ltdWxhdGVkIG9uIHRoZSBhbmNob3IgdG8gZG93bmxvYWQgdGhlIGZpbGVcbiAqIEBwYXJhbSBjb25maWdcbiAqIEBwYXJhbSBzdWNjZXNzXG4gKiBAcGFyYW0gZXJyb3JcbiAqL1xuY29uc3QgZG93bmxvYWRUaHJvdWdoQW5jaG9yID0gKGNvbmZpZywgc3VjY2VzcywgZXJyb3IpID0+IHtcbiAgICBjb25zdCB1cmwgICAgID0gY29uZmlnLnVybCxcbiAgICAgICAgbWV0aG9kICA9IGNvbmZpZy5tZXRob2QsXG4gICAgICAgIGRhdGEgICAgPSBjb25maWcuZGF0YVBhcmFtcyB8fCBjb25maWcuZGF0YSxcbiAgICAgICAgaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSB8fCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJztcblxuICAgIC8vIFRvZG86IFJlcGxhY2UgaHR0cCB3aXRoIGdldFNlcnZpY2VcbiAgICBodHRwU2VydmljZS5zZW5kKHtcbiAgICAgICAgJ3RhcmdldCcgOiAnV2ViU2VydmljZScsXG4gICAgICAgICdhY3Rpb24nIDogJ2ludm9rZVJ1bnRpbWVSZXN0Q2FsbCcsXG4gICAgICAgICdtZXRob2QnIDogbWV0aG9kLFxuICAgICAgICAndXJsJyAgICA6IHVybCxcbiAgICAgICAgJ2hlYWRlcnMnOiBoZWFkZXJzLFxuICAgICAgICAnZGF0YScgICA6IGRhdGEsXG4gICAgICAgICdyZXNwb25zZVR5cGUnOiAnYXJyYXlidWZmZXInXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuaGVhZGVycywgc3VjY2VzcywgZXJyb3IpO1xuICAgICAgICB9LCA5MDApO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdHJpZ2dlckZuKGVycm9yLCBlcnIpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBhcHBlbmRzIGEgdGltZXN0YW1wIG9uIHRoZSBwYXNzZWQgZmlsZW5hbWUgdG8gcHJldmVudCBjYWNoaW5nXG4gKiByZXR1cm5zIHRoZSBtb2RpZmllZCBmaWxlIG5hbWVcbiAqIEBwYXJhbSBmaWxlTmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0TW9kaWZpZWRGaWxlTmFtZSA9IChmaWxlTmFtZSwgZXhwb3J0Rm9ybWF0KSA9PiB7XG4gICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgY29uc3QgY3VycmVudFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVFeHRlbnNpb24gPSAnLicgKyBfLmxhc3QoXy5zcGxpdChmaWxlTmFtZSwgJy4nKSk7XG4gICAgICAgIGZpbGVOYW1lID0gXy5yZXBsYWNlKGZpbGVOYW1lLCBmaWxlRXh0ZW5zaW9uLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlTmFtZSArICdfJyArIGN1cnJlbnRUaW1lc3RhbXAgKyBmaWxlRXh0ZW5zaW9uO1xufTtcblxuY29uc3QgZ2V0Q29va2llQnlOYW1lID0gKG5hbWUpID0+IHtcbiAgICAvLyBUb2RvOiBTaHViaGFtIEltcGxlbWVudCBjb29raWUgbmF0aXZlIGpzXG4gICAgcmV0dXJuICdjb29raWUnO1xufTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvb2tpZVZhbHVlIGlmIHhzcmYgaXMgZW5hYmxlZC5cbiAqIEluIGRldmljZSwgeHNyZiBjb29raWUgaXMgc3RvcmVkIGluIGxvY2FsU3RvcmFnZS5cbiAqIEByZXR1cm5zIHhzcmYgY29va2llIHZhbHVlXG4gKi9cbmNvbnN0IGlzWHNyZkVuYWJsZWQgPSAoKSA9PiB7XG4gICAgaWYgKENPTlNUQU5UUy5oYXNDb3Jkb3ZhKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDT05TVEFOVFMuWFNSRl9DT09LSUVfTkFNRSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2JqZWN0IG5vZGUgZm9yIGEgYmluZCBvYmplY3QsIHdoZXJlIHRoZSB2YWx1ZSBoYXMgdG8gYmUgdXBkYXRlZFxuICogb2JqLnRhcmdldCA9IFwiYVwiXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcm9vdFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuY29uc3QgZ2V0VGFyZ2V0T2JqID0gKG9iaiwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICAvKlxuICAgICAqIGlmIHRoZSB0YXJnZXQga2V5IGlzIGluIHRoZSBmb3JtIGFzIFwiWydteS5wYXJhbSddXCJcbiAgICAgKiBrZWVwIHRoZSB0YXJnZXQga2V5IGFzIFwibXkucGFyYW1cIiBhbmQgZG8gbm90IHNwbGl0IGZ1cnRoZXJcbiAgICAgKiB0aGlzIGlzIGRvbmUsIHNvIHRoYXQsIHRoZSBjb21wdXRlZCB2YWx1ZSBhZ2FpbnN0IHRoaXMgYmluZGluZyBpcyBhc3NpZ25lZCBhc1xuICAgICAqICAgICAge1wibXkucGFyYW1cIjogXCJ2YWx1ZVwifVxuICAgICAqIGFuZCBub3QgYXNcbiAgICAgKiAgICAgIHtcbiAgICAgKiAgICAgICAgICBcIm15XCI6IHtcbiAgICAgKiAgICAgICAgICAgICAgXCJwYXJhbVwiOiBcInZhbHVlXCJcbiAgICAgKiAgICAgICAgICB9XG4gICAgICogICAgICB9XG4gICAgICovXG4gICAgbGV0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iajtcbiAgICBjb25zdCByb290Tm9kZSA9IHZhcmlhYmxlW3Jvb3RdO1xuICAgIGlmIChET1RfRVhQUl9SRVgudGVzdCh0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldE9iaiA9IHJvb3ROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zdWJzdHIoMCwgdGFyZ2V0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICBpZiAob2JqLnRhcmdldCA9PT0gcm9vdCkge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gdmFyaWFibGU7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSBmaW5kVmFsdWVPZihyb290Tm9kZSwgdGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IHJvb3ROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGtleSBmb3IgdGhlIHRhcmdldCBvYmplY3RcbiAqIHRoZSBjb21wdXRlZCB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQgYWdhaW5zdCB0aGlzIGtleSBpbiB0aGUgdGFyZ2V0T2JqZWN0KGNvbXB1dGVkIGJ5IGdldFRhcmdldE9iaigpKVxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHJlZ2V4XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuY29uc3QgZ2V0VGFyZ2V0Tm9kZUtleSA9ICh0YXJnZXQpID0+IHtcbiAgICAvKlxuICAgICAqIGlmIHRoZSB0YXJnZXQga2V5IGlzIGluIHRoZSBmb3JtIGFzIFwiWydteS5wYXJhbSddXCJcbiAgICAgKiBrZWVwIHRoZSB0YXJnZXQga2V5IGFzIFwibXkucGFyYW1cIiBhbmQgZG8gbm90IHNwbGl0IGZ1cnRoZXJcbiAgICAgKiB0aGlzIGlzIGRvbmUsIHNvIHRoYXQsIHRoZSBjb21wdXRlZCB2YWx1ZSBhZ2FpbnN0IHRoaXMgYmluZGluZyBpcyBhc3NpZ25lZCBhc1xuICAgICAqICAgICAge1wibXkucGFyYW1cIjogXCJ2YWx1ZVwifVxuICAgICAqIGFuZCBub3QgYXNcbiAgICAgKiAgICAgIHtcbiAgICAgKiAgICAgICAgICBcIm15XCI6IHtcbiAgICAgKiAgICAgICAgICAgICAgXCJwYXJhbVwiOiBcInZhbHVlXCJcbiAgICAgKiAgICAgICAgICB9XG4gICAgICogICAgICB9XG4gICAgICovXG4gICAgbGV0IHRhcmdldE5vZGVLZXk7XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IHRhcmdldC5yZXBsYWNlKC9eKFxcW1tcIiddKXwoW1wiJ11cXF0pJC9nLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IHRhcmdldC5zcGxpdCgnLicpLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0Tm9kZUtleTtcbn07XG5cbmNvbnN0IHNldFZhbHVlVG9Ob2RlID0gKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgdmFsdWUsIG5vVXBkYXRlPykgPT4ge1xuICAgIGNvbnN0IHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCksXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKTtcbiAgICB2YWx1ZSA9ICFfLmlzVW5kZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogb2JqLnZhbHVlO1xuICAgIC8qIHNhbml0eSBjaGVjaywgdXNlciBjYW4gYmluZCBwYXJlbnQgbm9kZXMgdG8gbm9uLW9iamVjdCB2YWx1ZXMsIHNvIGNoaWxkIG5vZGUgYmluZGluZ3MgbWF5IGZhaWwgKi9cbiAgICBpZiAodGFyZ2V0T2JqKSB7XG4gICAgICAgIHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSh0YXJnZXROb2RlS2V5LCB2YWx1ZSwgb2JqLnR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSk7XG59O1xuXG4vKipcbiAqIFRoZSBtb2RlbCBpbnRlcm5hbEJvdW5kTm9kZU1hcCBzdG9yZXMgdGhlIHJlZmVyZW5jZSB0byBsYXRlc3QgY29tcHV0ZWQgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwobmVzdGVkKSBib3VuZCBub2Rlc1xuICogVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIGludGVybmFsIG5vZGUncyBjb21wdXRlZCB2YWx1ZSBpcyBub3QgbG9zdCwgb25jZSBpdHMgcGFyZW50IG5vZGUncyB2YWx1ZSBpcyBjb21wdXRlZCBhdCBhIGxhdGVyIHBvaW50XG4gKiBFLmcuXG4gKiBWYXJpYWJsZS5lbXBsb3llZVZhciBoYXMgZm9sbG93aW5nIGJpbmRpbmdzXG4gKiBcImRhdGFCaW5kaW5nXCI6IFtcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50LmJ1ZGdldFwiLFxuICAgICAgICAgXCJ2YWx1ZVwiOiBcImJpbmQ6VmFyaWFibGVzLmJ1ZGdldFZhci5kYXRhU2V0XCJcbiAgICAgfSxcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuZGVwYXJ0bWVudFZhci5kYXRhU2V0XCJcbiAgICAgfVxuIF1cbiAqIFdoZW4gZGVwYXJ0bWVudC5idWRnZXQgaXMgY29tcHV0ZWQsIGVtcGxveWVlVmFyLmRhdGFTZXQgPSB7XG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJidWRnZXRcIjoge1wicTFcIjogMTExMX1cbiAqICB9XG4gKiB9XG4gKlxuICogV2hlbiBkZXBhcnRtZW50IGlzIGNvbXB1dGVkXG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJuYW1lXCI6IFwiSFJcIixcbiAqICAgICAgXCJsb2NhdGlvblwiOiBcIkh5ZGVyYWJhZFwiXG4gKiAgfVxuICogVGhlIGJ1ZGdldCBmaWVsZCAoY29tcHV0ZWQgZWFybGllcikgaXMgTE9TVC5cbiAqXG4gKiBUbyBhdm9pZCB0aGlzLCB0aGUgbGF0ZXN0IHZhbHVlcyBhZ2FpbnN0IGludGVybmFsIG5vZGVzIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudC5idWRnZXQpIGFyZSBzdG9yZWQgaW4gYSBtYXBcbiAqIFRoZXNlIHZhbHVlcyBhcmUgYXNzaWduZWQgYmFjayB0byBpbnRlcm5hbCBmaWVsZHMgaWYgdGhlIHBhcmVudCBpcyBjb21wdXRlZCAoaW4gdGhpcyBjYXNlIGRlcGFydG1lbnQpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcm9vdFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKi9cbmNvbnN0IHVwZGF0ZUludGVybmFsTm9kZXMgPSAodGFyZ2V0LCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IGJvdW5kSW50ZXJuYWxOb2RlcyA9IF8ua2V5cyhfLmdldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdF0pKSxcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KTtcbiAgICBsZXQgaW50ZXJuYWxOb2RlcztcbiAgICBmdW5jdGlvbiBmaW5kSW50ZXJuYWxOb2RlQm91bmQoKSB7XG4gICAgICAgIHJldHVybiBfLmZpbHRlcihib3VuZEludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXIgY29uZGl0aW9uIGluIGNoZWNrICh0YXJnZXROb2RlS2V5ID09PSByb290IHx8IHRhcmdldE5vZGVLZXkgPT09ICdkYXRhQmluZGluZycpIGlzIHNwZWNpZmljYWxseSBmb3IgbGl2ZSB2YXJpYWJsZSBvZiBpbnNlcnQvdXBkYXRlIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gKG5vZGUgIT09IHRhcmdldE5vZGVLZXkgJiYgXy5pbmNsdWRlcyhub2RlLCB0YXJnZXROb2RlS2V5KSkgfHwgKCh0YXJnZXROb2RlS2V5ID09PSByb290IHx8IHRhcmdldE5vZGVLZXkgPT09ICdkYXRhQmluZGluZycpICYmIG5vZGUgIT09IHRhcmdldE5vZGVLZXkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50ZXJuYWxOb2RlcyA9IGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpO1xuICAgIGlmICgoaW50ZXJuYWxOb2Rlcy5sZW5ndGgpKSB7XG4gICAgICAgIF8uZm9yRWFjaChpbnRlcm5hbE5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgc2V0VmFsdWVUb05vZGUobm9kZSwge3RhcmdldDogbm9kZX0sIHJvb3QsIHZhcmlhYmxlLCBfLmdldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgbm9kZV0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBOZXcgSW1wbGVtZW50YXRpb24gKERhdGFCaW5kaW5nIEZsYXQgU3RydWN0dXJlIHdpdGggeC1wYXRoIHRhcmdldHMpXG4gKiBwcm9jZXNzZXMgYSBkYXRhQmluZGluZyBvYmplY3QsIGlmIGJvdW5kIHRvIGV4cHJlc3Npb24sIHdhdGNoZXMgb3ZlciBpdCwgZWxzZSBhc3NpZ25zIHZhbHVlIHRvIHRoZSBleHByZXNzaW9uXG4gKiBAcGFyYW0gb2JqIGRhdGFCaW5kaW5nIG9iamVjdFxuICogQHBhcmFtIHNjb3BlIHNjb3BlIG9mIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHJvb3Qgcm9vdCBub2RlIHN0cmluZyAoZGF0YUJpbmRpbmcgZm9yIGFsbCB2YXJpYWJsZXMsIGRhdGFTZXQgZm9yIHN0YXRpYyB2YXJpYWJsZSlcbiAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSBvYmplY3RcbiAqL1xuY29uc3QgcHJvY2Vzc0JpbmRPYmplY3QgPSAob2JqLCBzY29wZSwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBvYmoudGFyZ2V0LFxuICAgICAgICB0YXJnZXRPYmogPSBnZXRUYXJnZXRPYmoob2JqLCByb290LCB2YXJpYWJsZSksXG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCksXG4gICAgICAgIHJ1bk1vZGUgPSB0cnVlO1xuICAgIGNvbnN0IGRlc3Ryb3lGbiA9IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyID8gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIuYmluZChzY29wZSkgOiBfLm5vb3A7XG5cbiAgICBpZiAoc3RyaW5nU3RhcnRzV2l0aChvYmoudmFsdWUsICdiaW5kOicpKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAoKG5ld1ZhbCA9PT0gb2xkVmFsICYmIF8uaXNVbmRlZmluZWQobmV3VmFsKSkgfHwgKF8uaXNVbmRlZmluZWQobmV3VmFsKSAmJiAoIV8uaXNVbmRlZmluZWQob2xkVmFsKSB8fCAhXy5pc1VuZGVmaW5lZCh0YXJnZXRPYmpbdGFyZ2V0Tm9kZUtleV0pKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTa2lwIGNsb25pbmcgZm9yIGJsb2IgY29sdW1uXG4gICAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoWydibG9iJywgJ2ZpbGUnXSwgb2JqLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0Q2xvbmVkT2JqZWN0KG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG5ld1ZhbCk7IC8vIGNsb25pbmcgbmV3VmFsIHRvIGtlZXAgdGhlIHNvdXJjZSBjbGVhblxuXG4gICAgICAgICAgICBpZiAocnVuTW9kZSkge1xuICAgICAgICAgICAgICAgIC8qc2V0IHRoZSBpbnRlcm5hbCBib3VuZCBub2RlIG1hcCB3aXRoIHRoZSBsYXRlc3QgdXBkYXRlZCB2YWx1ZSovXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfLnNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgdGFyZ2V0XSwgbmV3VmFsKTtcbiAgICAgICAgICAgICAgICAvKnVwZGF0ZSB0aGUgaW50ZXJuYWwgbm9kZXMgYWZ0ZXIgaW50ZXJuYWwgbm9kZSBtYXAgaXMgc2V0Ki9cbiAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChuZXdWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUludGVybmFsTm9kZXModGFyZ2V0LCByb290LCB2YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkZXN0cm95Rm4oJHdhdGNoKG9iai52YWx1ZS5yZXBsYWNlKCdiaW5kOicsICcnKSwgc2NvcGUsIHt9LCBsaXN0ZW5lciwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKCkgPT4gdmFyaWFibGUuaXNNdXRlZCkpO1xuICAgIH0gZWxzZSBpZiAoIV8uaXNVbmRlZmluZWQob2JqLnZhbHVlKSkge1xuICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG9iai52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChydW5Nb2RlICYmIHJvb3QgIT09IHRhcmdldE5vZGVLZXkpIHtcbiAgICAgICAgICAgIGlmICghaW50ZXJuYWxCb3VuZE5vZGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXy5zZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIHRhcmdldF0sIG9iai52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQVUJMSUMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy9cblxuLyoqXG4gKiBJbml0aWFsaXplcyB3YXRjaGVycyBmb3IgYmluZGluZyBleHByZXNzaW9ucyBjb25maWd1cmVkIGluIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcGFyYW0gY29udGV4dCwgc2NvcGUgY29udGV4dCBpbiB3aGljaCB0aGUgdmFyaWFibGUgZXhpc3RzXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluZFNvdXJjZSwgIHRoZSBmaWVsZCBpbiB2YXJpYWJsZSB3aGVyZSB0aGUgZGF0YWJpbmRpbmdzIGFyZSBjb25maWd1cmVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3N0IHZhcmlhYmxlcywgaXQgd2lsbCBiZSAnZGF0YUJpbmRpbmcnLCBoZW5jZSBkZWZhdWx0IGZhbGxiYWNrIGlzIHRvICdkYXRhQmluZGluZydcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNvbWUgaXQgY2FuIGJlICdkYXRhU2V0JyBhbmQgaGVuY2Ugd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5kVGFyZ2V0LCB0aGUgb2JqZWN0IGZpZWxkIGluIHZhcmlhYmxlIHdoZXJlIHRoZSBjb21wdXRlZCBiaW5kaW5ncyB3aWxsIGJlIHNldFxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc0JpbmRpbmcgPSAodmFyaWFibGU6IGFueSwgY29udGV4dDogYW55LCBiaW5kU291cmNlPzogc3RyaW5nLCBiaW5kVGFyZ2V0Pzogc3RyaW5nKSA9PiB7XG4gICAgYmluZFNvdXJjZSA9IGJpbmRTb3VyY2UgfHwgJ2RhdGFCaW5kaW5nJztcbiAgICBiaW5kVGFyZ2V0ID0gYmluZFRhcmdldCB8fCAnZGF0YUJpbmRpbmcnO1xuXG4gICAgY29uc3QgYmluZE1hcCA9IHZhcmlhYmxlW2JpbmRTb3VyY2VdO1xuICAgIHZhcmlhYmxlW2JpbmRTb3VyY2VdID0ge307XG4gICAgdmFyaWFibGVbJ19iaW5kJyArIGJpbmRTb3VyY2VdID0gYmluZE1hcDtcbiAgICBpZiAoIWJpbmRNYXAgfHwgIV8uaXNBcnJheShiaW5kTWFwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJpbmRNYXAuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAvKiBmb3Igc3RhdGljIHZhcmlhYmxlIGNoYW5nZSB0aGUgYmluZGluZyB3aXRoIHRhcmdldCAnZGF0YUJpbmRpbmcnIHRvICdkYXRhU2V0JywgYXMgdGhlIHJlc3VsdHMgaGF2ZSB0byByZWZsZWN0IGRpcmVjdGx5IGluIHRoZSBkYXRhU2V0ICovXG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLlZhcmlhYmxlJyAmJiBub2RlLnRhcmdldCA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgbm9kZS50YXJnZXQgPSAnZGF0YVNldCc7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0JpbmRPYmplY3Qobm9kZSwgY29udGV4dCwgYmluZFRhcmdldCwgdmFyaWFibGUpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBEb3dubG9hZHMgYSBmaWxlIGluIHRoZSBicm93c2VyLlxuICogVHdvIG1ldGhvZHMgdG8gZG8gc28sIG5hbWVseTpcbiAqIDEuIGRvd25sb2FkVGhyb3VnaEFuY2hvciwgY2FsbGVkIGlmXG4gKiAgICAgIC0gaWYgYSBoZWFkZXIgaXMgdG8gYmUgcGFzc2VkXG4gKiAgICAgIE9SXG4gKiAgICAgIC0gaWYgc2VjdXJpdHkgaXMgT04gYW5kIFhTUkYgdG9rZW4gaXMgdG8gYmUgc2VudCBhcyB3ZWxsXG4gKiBOT1RFOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIHZlcnNpb24gMTAuMCBhbmQgYmVsb3dcbiAqXG4gKiAyLiBkb3dubG9hZFRocm91Z2hJZnJhbWVcbiAqICAgICAgLSB0aGlzIG1ldGhvZCB3b3JrcyBhY3Jvc3MgYnJvd3NlcnMgYW5kIHVzZXMgYW4gaWZyYW1lIHRvIGRvd25sYWQgdGhlIGZpbGUuXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyByZXF1ZXN0IHBhcmFtcyBvYmplY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSByZXByZXNlbnRzIHRoZSBmaWxlIG5hbWVcbiAqIEBwYXJhbSBleHBvcnRGb3JtYXQgZG93bmxvYWRlZCBmaWxlIGZvcm1hdFxuICogQHBhcmFtIHN1Y2Nlc3Mgc3VjY2VzcyBjYWxsYmFja1xuICogQHBhcmFtIGVycm9yIGVycm9yIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBjb25zdCBzaW11bGF0ZUZpbGVEb3dubG9hZCA9IChyZXF1ZXN0UGFyYW1zLCBmaWxlTmFtZSwgZXhwb3J0Rm9ybWF0LCBzdWNjZXNzLCBlcnJvciwgZGF0YUJpbmRpbmcpID0+IHtcbiAgICAvKnN1Y2Nlc3MgYW5kIGVycm9yIGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQgaW5jYXNlIG9mIGRvd25sb2FkVGhyb3VnaEFuY2hvclxuICAgICBEdWUgdG8gdGVjaG5pY2FsIGxpbWl0YXRpb24gY2Fubm90IGJlIGV4ZWN1dGVkIGluY2FzZSBvZiBpZnJhbWUqL1xuICAgIGlmIChDT05TVEFOVFMuaGFzQ29yZG92YSkge1xuICAgICAgICBsZXQgZmlsZUV4dGVuc2lvbjtcbiAgICAgICAgaWYgKGV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgZmlsZUV4dGVuc2lvbiA9IGV4cG9ydFR5cGVzTWFwW2V4cG9ydEZvcm1hdF07XG4gICAgICAgIH1cbiAgICAgICAgYXBwTWFuYWdlci5ub3RpZnkoJ2RldmljZS1maWxlLWRvd25sb2FkJywgeyB1cmw6IHJlcXVlc3RQYXJhbXMudXJsLCBuYW1lOiBmaWxlTmFtZSwgZXh0ZW5zaW9uOiBmaWxlRXh0ZW5zaW9uLCBoZWFkZXJzOiByZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIHN1Y2Nlc3NDYjogc3VjY2VzcywgZXJyb3JDYjogZXJyb3J9KTtcbiAgICB9IGVsc2UgaWYgKCFfLmlzRW1wdHkocmVxdWVzdFBhcmFtcy5oZWFkZXJzKSB8fCBpc1hzcmZFbmFibGVkKCkpIHtcbiAgICAgICAgZG93bmxvYWRUaHJvdWdoQW5jaG9yKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkb3dubG9hZFRocm91Z2hJZnJhbWUocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZGF0YUJpbmRpbmcpO1xuICAgIH1cbn07XG5cbi8qKlxuICogc2V0cyB0aGUgdmFsdWUgYWdhaW5zdCBwYXNzZWQga2V5IG9uIHRoZSBcImlucHV0RmllbGRzXCIgb2JqZWN0IGluIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHRhcmdldE9iajogdGhlIG9iamVjdCBpbiB3aGljaCB0aGUga2V5LCB2YWx1ZSBpcyB0byBiZSBzZXRcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGtleTogY2FuIGJlOlxuICogIC0gYSBzdHJpbmcgZS5nLiBcInVzZXJuYW1lXCJcbiAqICAtIGFuIG9iamVjdCwgZS5nLiB7XCJ1c2VybmFtZVwiOiBcImpvaG5cIiwgXCJzc25cIjogXCIxMTExMVwifVxuICogQHBhcmFtIHZhbFxuICogLSBpZiBrZXkgaXMgc3RyaW5nLCB0aGUgdmFsdWUgYWdhaW5zdCBpdCAoZm9yIHRoYXQgZGF0YSB0eXBlKVxuICogLSBpZiBrZXkgaXMgb2JqZWN0LCBub3QgcmVxdWlyZWRcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgY29uc3Qgc2V0SW5wdXQgPSAodGFyZ2V0T2JqOiBhbnksIGtleTogYW55LCB2YWw6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgdGFyZ2V0T2JqID0gdGFyZ2V0T2JqIHx8IHt9O1xuICAgIGxldCBrZXlzLFxuICAgICAgICBsYXN0S2V5LFxuICAgICAgICBwYXJhbU9iaiA9IHt9O1xuXG4gICAgLy8gY29udGVudCB0eXBlIGNoZWNrXG4gICAgaWYgKF8uaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgIHZhbCA9IGdldEJsb2IodmFsLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsID0gXy5pc051bWJlcih2YWwpID8gdmFsIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXy5pc09iamVjdChrZXkpKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBpdHNlbGZcbiAgICAgICAgcGFyYW1PYmogPSBrZXk7XG4gICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yICcuJyBpbiBrZXkgZS5nLiAnZW1wbG95ZWUuZGVwYXJ0bWVudCdcbiAgICAgICAga2V5cyA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICBsYXN0S2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgLy8gRmluZGluZyB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBrZXlcbiAgICAgICAgdGFyZ2V0T2JqID0gZmluZFZhbHVlT2YodGFyZ2V0T2JqLCBrZXlzLmpvaW4oJy4nKSwgdHJ1ZSk7XG4gICAgICAgIGtleSA9IGxhc3RLZXk7XG4gICAgICAgIHBhcmFtT2JqW2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICBfLmZvckVhY2gocGFyYW1PYmosIGZ1bmN0aW9uIChwYXJhbVZhbCwgcGFyYW1LZXkpIHtcbiAgICAgICAgdGFyZ2V0T2JqW3BhcmFtS2V5XSA9IHBhcmFtVmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBIVE1MNSBGaWxlIEFQSSBpcyBhdmFpbGFibGUgZWxzZSBmYWxzZVxuICogQHJldHVybnMge3twcm90b3R5cGU6IEJsb2I7IG5ldyhibG9iUGFydHM/OiBhbnlbXSwgb3B0aW9ucz86IEJsb2JQcm9wZXJ0eUJhZyk6IEJsb2J9fVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlVXBsb2FkU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgIHJldHVybiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YXJPcmRlclxuICogQHBhcmFtIG9wdGlvbnNPcmRlclxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV2YWx1YXRlZE9yZGVyQnkgPSAodmFyT3JkZXIsIG9wdGlvbnNPcmRlcikgPT4ge1xuICAgIGxldCBvcHRpb25GaWVsZHMsXG4gICAgICAgIHZhck9yZGVyQnk7XG4gICAgLy8gSWYgb3B0aW9ucyBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHZhcmlhYmxlIG9yZGVyXG4gICAgaWYgKCFvcHRpb25zT3JkZXIgfHwgXy5pc0VtcHR5KG9wdGlvbnNPcmRlcikpIHtcbiAgICAgICAgcmV0dXJuIHZhck9yZGVyO1xuICAgIH1cbiAgICAvLyBJZiB2YXJpYWJsZSBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIG9wdGlvbnMgb3JkZXJcbiAgICBpZiAoIXZhck9yZGVyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zT3JkZXI7XG4gICAgfVxuICAgIC8vIElmIGJvdGggYXJlIHByZXNlbnQsIGNvbWJpbmUgdGhlIG9wdGlvbnMgb3JkZXIgYW5kIHZhcmlhYmxlIG9yZGVyLCB3aXRoIG9wdGlvbnMgb3JkZXIgYXMgcHJlY2VkZW5jZVxuICAgIHZhck9yZGVyICAgICA9IF8uc3BsaXQodmFyT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uc09yZGVyID0gXy5zcGxpdChvcHRpb25zT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uRmllbGRzID0gXy5tYXAob3B0aW9uc09yZGVyLCBmdW5jdGlvbiAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIF8uc3BsaXQoXy50cmltKG9yZGVyKSwgJyAnKVswXTtcbiAgICB9KTtcbiAgICAvLyBJZiBhIGZpZWxkIGlzIHByZXNlbnQgaW4gYm90aCBvcHRpb25zIGFuZCB2YXJpYWJsZSwgcmVtb3ZlIHRoZSB2YXJpYWJsZSBvcmRlcmJ5XG4gICAgXy5yZW1vdmUodmFyT3JkZXIsIGZ1bmN0aW9uIChvcmRlckJ5KSB7XG4gICAgICAgIHJldHVybiBfLmluY2x1ZGVzKG9wdGlvbkZpZWxkcywgXy5zcGxpdChfLnRyaW0ob3JkZXJCeSksICcgJylbMF0pO1xuICAgIH0pO1xuICAgIHZhck9yZGVyQnkgPSB2YXJPcmRlci5sZW5ndGggPyAnLCcgKyBfLmpvaW4odmFyT3JkZXIsICcsJykgOiAnJztcbiAgICByZXR1cm4gXy5qb2luKG9wdGlvbnNPcmRlciwgJywnKSArIHZhck9yZGVyQnk7XG59O1xuXG4vKipcbiAqIGZvcm1hdHRpbmcgdGhlIGV4cHJlc3Npb24gYXMgcmVxdWlyZWQgYnkgYmFja2VuZCB3aGljaCB3YXMgZW5jbG9zZWQgYnkgJHs8ZXhwcmVzc2lvbj59LlxuICogQHBhcmFtIGZpZWxkRGVmc1xuICogcmV0dXJucyBmaWVsZERlZnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEV4cG9ydEV4cHJlc3Npb24gPSBmaWVsZERlZnMgPT4ge1xuICAgIF8uZm9yRWFjaChmaWVsZERlZnMsIGZ1bmN0aW9uIChmaWVsZERlZikge1xuICAgICAgICBpZiAoZmllbGREZWYuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgZmllbGREZWYuZXhwcmVzc2lvbiA9ICckeycgKyBmaWVsZERlZi5leHByZXNzaW9uICsgJ30nO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkRGVmcztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZVZhcmlhYmxlQ2FsbCA9IF9pbnZva2U7XG5cbmNvbnN0IGdldERhdGVUaW1lRm9ybWF0Rm9yVHlwZSA9ICh0eXBlKSA9PiB7XG4gICAgcmV0dXJuIERFRkFVTFRfRk9STUFUU1tfLnRvVXBwZXIodHlwZSldO1xufTtcblxuLy8gRm9ybWF0IHZhbHVlIGZvciBkYXRldGltZSB0eXBlc1xuY29uc3QgX2Zvcm1hdERhdGUgPSAoZGF0ZVZhbHVlLCB0eXBlKSA9PiB7XG4gICAgbGV0IGVwb2NoO1xuICAgIGlmIChfLmlzRGF0ZShkYXRlVmFsdWUpKSB7XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGVWYWx1ZSA9IHBhcnNlSW50KGRhdGVWYWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlICYmIG1vbWVudChkYXRlVmFsdWUpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGVwb2NoKSAmJiB0eXBlICE9PSBEYXRhVHlwZS5USU1FKSB7XG4gICAgICAgIHJldHVybiBlcG9jaDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IERhdGFUeXBlLlRJTUVTVEFNUCkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FICYmICFlcG9jaCkge1xuICAgICAgICBlcG9jaCA9IG1vbWVudChuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpICsgJyAnICsgZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlVmFsdWUgJiYgYXBwTWFuYWdlci5nZXRQaXBlKCdkYXRlJykudHJhbnNmb3JtKGVwb2NoLCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUodHlwZSkpO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gY29udmVydCB2YWx1ZXMgb2YgZGF0ZSB0aW1lIHR5cGVzIGludG8gZGVmYXVsdCBmb3JtYXRzXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmIChfLmluY2x1ZGVzKHR5cGUsICcuJykpIHtcbiAgICAgICAgdHlwZSA9IF8udG9Mb3dlcihleHRyYWN0VHlwZSh0eXBlKSk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBfLm1hcCh2YWx1ZSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9mb3JtYXREYXRlKHZhbCwgdHlwZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsdWUsIHR5cGUpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSB2YXJpYWJsZSBkYXRhIHdoaWNoIGlzIGVuY29kZWQgZnJvbSBiYWNrZW5kIGJlZm9yZSBzaG93aW5nIGluIHRoZSB3aWRnZXRzLlxuICogSXQgdGFrZXMgdmFyaWFibGUgcmVzcG9uc2UgY29udGVudCBhcyBpbnB1dCBhbmQgaXRlcmF0ZXMgcmVjdXJzaXZlbHksXG4gKiBpZiB0aGUgdmFsdWUgaXMgc3RyaW5nIHR5cGUgdGhlbiBpdCB3aWxsIGRlY29kZSB0aGUgZGF0YS5cbiAqIEBwYXJhbSByZXNwb25zZUNvbnRlbnQgKEFycmF5IG9mIG9iamVjdHMpXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVEYXRhID0gKHJlc3BvbnNlQ29udGVudCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VDb250ZW50KSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBfLmZvckVhY2gocmVzcG9uc2VDb250ZW50LCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGh0bWxEZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIF8uaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBodG1sRGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudFtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIHJlc3BvbnNlQ29udGVudCA9IGh0bWxEZWNvZGUocmVzcG9uc2VDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBodG1sRGVjb2RlKGlucHV0KSB7XG4gICAgcmV0dXJuIGhlLnVuZXNjYXBlKGlucHV0KTtcbn1cbiJdfQ==
801
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDaEcsT0FBTyxFQUNILFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE9BQU8sRUFDUCxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQzlCLE9BQU8sRUFDUCxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDOUIsUUFBUSxFQUNSLFdBQVcsRUFDWCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQ3JCLElBQUksRUFDSixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQzVCLEtBQUssRUFDTCxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2hDLE1BQU0sV0FBVyxDQUFDO0FBT25CLE1BQU0sY0FBYyxHQUFLLEVBQUUsT0FBTyxFQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUcsTUFBTSxFQUFDLENBQUM7QUFFOUQsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxJQUFJLFdBQVcsQ0FBQztBQUN2QixNQUFNLENBQUMsSUFBSSxlQUFlLENBQUM7QUFDM0IsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUM7QUFDN0IsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDO0FB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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICAkcGFyc2VFdmVudCxcbiAgICAkd2F0Y2gsXG4gICAgRGF0YVR5cGUsXG4gICAgREVGQVVMVF9GT1JNQVRTLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGdldEJsb2IsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgdHJpZ2dlckZuXG59IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHtDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdmFyaWFibGVzLmNvbnN0YW50cyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlLCBmaWx0ZXIsXG4gICAgZm9yRWFjaCxcbiAgICBnZXQsIGluY2x1ZGVzLCBpc0FycmF5LCBpc0RhdGUsXG4gICAgaXNFbXB0eSxcbiAgICBpc0Z1bmN0aW9uLCBpc051bWJlciwgaXNPYmplY3QsXG4gICAgaXNTdHJpbmcsXG4gICAgaXNVbmRlZmluZWQsXG4gICAgam9pbiwga2V5cywgbGFzdCwgbWFwLFxuICAgIG5vb3AsXG4gICAgcGlja0J5LCByZW1vdmUsIHJlcGxhY2UsIHNldCxcbiAgICBzbGljZSxcbiAgICBzcGxpdCwgdG9Mb3dlciwgdG9VcHBlciwgdHJpbVxufSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmRlY2xhcmUgY29uc3QgJDtcbmRlY2xhcmUgY29uc3QgaGU7XG5kZWNsYXJlIGNvbnN0IG1vbWVudDtcbmRlY2xhcmUgY29uc3Qgd2luZG93O1xuXG5jb25zdCBleHBvcnRUeXBlc01hcCAgID0geyAnRVhDRUwnIDogJy54bHN4JywgJ0NTVicgOiAnLmNzdid9O1xuXG5leHBvcnQgbGV0IGFwcE1hbmFnZXI7XG5leHBvcnQgbGV0IGh0dHBTZXJ2aWNlO1xuZXhwb3J0IGxldCBtZXRhZGF0YVNlcnZpY2U7XG5leHBvcnQgbGV0IG5hdmlnYXRpb25TZXJ2aWNlO1xuZXhwb3J0IGxldCByb3V0ZXJTZXJ2aWNlO1xuZXhwb3J0IGxldCB0b2FzdGVyU2VydmljZTtcbmV4cG9ydCBsZXQgb2F1dGhTZXJ2aWNlO1xuZXhwb3J0IGxldCBzZWN1cml0eVNlcnZpY2U7XG5leHBvcnQgbGV0IGRpYWxvZ1NlcnZpY2U7XG5cbmNvbnN0IERPVF9FWFBSX1JFWCA9IC9eXFxbKFwifCcpW1xcd1xcV10qKFxcMSlcXF0kLyxcbiAgICBpbnRlcm5hbEJvdW5kTm9kZU1hcCA9IG5ldyBNYXAoKSxcbiAgICB0aW1lcnMgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IF9pbnZva2UgPSAodmFyaWFibGUsIG9wKSA9PiB7XG4gICAgbGV0IGRlYm91bmNlZEZuLFxuICAgICAgICBjYW5jZWxGbiA9IG5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldFZhbCA9IHZhcmlhYmxlW29wXSgpO1xuICAgICAgICAvLyBoYW5kbGUgcHJvbWlzZXMgdG8gYXZvaWQgdW5jYXVnaHQgcHJvbWlzZSBlcnJvcnMgaW4gY29uc29sZVxuICAgICAgICBpZiAocmV0VmFsIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0VmFsLmNhdGNoKG5vb3ApO1xuICAgICAgICB9XG4gICAgfSwgMTAwKTtcbiAgICB0aW1lcnMuc2V0KHZhcmlhYmxlLCBkZWJvdW5jZWRGbik7XG4gICAgZGVib3VuY2VkRm4oKTtcbn07XG5cbmNvbnN0IHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlID0gKG5vZGVOYW1lLCBub2RlVmFsLCBub2RlVHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKSA9PiB7XG4gICAgc3dpdGNoICh2YXJpYWJsZS5jYXRlZ29yeSkge1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MSVZFOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvbiA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgaXNGdW5jdGlvbih2YXJpYWJsZS5saXN0UmVjb3JkcykgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdsaXN0UmVjb3JkcycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmlucHV0RmllbGRzID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkc1tub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpZiBhdXRvLXVwZGF0ZSBzZXQgZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHJlYWQgb3BlcmF0aW9uIG9ubHksIGdldCBpdHMgZGF0YSAqL1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlW3ZhcmlhYmxlLm9wZXJhdGlvbiArICdSZWNvcmQnXSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsIHZhcmlhYmxlLm9wZXJhdGlvbiArICdSZWNvcmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuQ1JVRDpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb25UeXBlID09PSAnbGlzdCcgJiYgdmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkRFVklDRTpcbiAgICAgICAgICAgIHZhcmlhYmxlW25vZGVOYW1lXSA9IG5vZGVWYWw7XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZXBlbmRlbmN5ID0gKHR5cGU6IHN0cmluZywgcmVmOiBhbnkpID0+IHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwTWFuYWdlcic6XG4gICAgICAgICAgICBhcHBNYW5hZ2VyID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0dHAnOlxuICAgICAgICAgICAgaHR0cFNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWV0YWRhdGEnOlxuICAgICAgICAgICAgbWV0YWRhdGFTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25hdmlnYXRpb25TZXJ2aWNlJzpcbiAgICAgICAgICAgIG5hdmlnYXRpb25TZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JvdXRlcic6XG4gICAgICAgICAgICByb3V0ZXJTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvYXN0ZXInOlxuICAgICAgICAgICAgdG9hc3RlclNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29BdXRoJzpcbiAgICAgICAgICAgIG9hdXRoU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VjdXJpdHknOlxuICAgICAgICAgICAgc2VjdXJpdHlTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgICAgICAgZGlhbG9nU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpbml0aWF0ZUNhbGxiYWNrID0gKHR5cGU6IHN0cmluZywgdmFyaWFibGU6IGFueSwgZGF0YTogYW55LCBvcHRpb25zPzogYW55LCBza2lwRGVmYXVsdE5vdGlmaWNhdGlvbj86IGJvb2xlYW4pID0+IHtcblxuICAgIC8qY2hlY2tpbmcgaWYgZXZlbnQgaXMgYXZhaWxhYmxlIGFuZCB2YXJpYWJsZSBoYXMgZXZlbnQgcHJvcGVydHkgYW5kIHZhcmlhYmxlIGV2ZW50IHByb3BlcnR5IGJvdW5kIHRvIGZ1bmN0aW9uKi9cbiAgICBjb25zdCBldmVudFZhbHVlcyA9IHZhcmlhYmxlW3R5cGVdLFxuICAgICAgICBjYWxsQmFja1Njb3BlID0gdmFyaWFibGUuX2NvbnRleHQ7XG4gICAgbGV0IGVycm9yVmFyaWFibGU7XG4gICAgLyoqXG4gICAgICogRm9yIGVycm9yIGV2ZW50OlxuICAgICAqIHRyaWdnZXIgYXBwIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gICAgICogaWYgbm8gZXZlbnQgaXMgYXNzaWduZWQsIHRyaWdnZXIgZGVmYXVsdCBhcHBOb3RpZmljYXRpb24gdmFyaWFibGUuXG4gICAgICovXG4gICBpZiAodHlwZSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkVWRU5ULkVSUk9SICYmICFza2lwRGVmYXVsdE5vdGlmaWNhdGlvbikge1xuICAgICAgICBpZiAoIWV2ZW50VmFsdWVzKSB7XG4gICAgICAgICAgICAvKiBpbiBjYXNlIG9mIGVycm9yLCBpZiBubyBldmVudCBhc3NpZ25lZCwgaGFuZGxlIHRocm91Z2ggZGVmYXVsdCBub3RpZmljYXRpb24gdmFyaWFibGUgKi9cbiAgICAgICAgICAgIGVycm9yVmFyaWFibGUgPSBjYWxsQmFja1Njb3BlLkFjdGlvbnNbVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTl07XG4gICAgICAgICAgICBpZiAoZXJyb3JWYXJpYWJsZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBlcnJvclZhcmlhYmxlLmdldE1lc3NhZ2UoKSB8fCBkYXRhO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBpc1N0cmluZyhkYXRhKSA/IGRhdGEgOiAnQW4gZXJyb3IgaGFzIG9jY3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgYXBwIGxvZ3MuJztcbiAgICAgICAgICAgICAgICBlcnJvclZhcmlhYmxlLmludm9rZSh7ICdtZXNzYWdlJyA6IGRhdGF9LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgIC8vICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICRyb290U2NvcGUuJGVtaXQoXCJpbnZva2Utc2VydmljZVwiLCBWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OLCB7c2NvcGU6IGNhbGxCYWNrU2NvcGUsIG1lc3NhZ2U6IHJlc3BvbnNlfSk7XG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVE9ETzogW1ZpYmh1XSwgY2hlY2sgd2hldGhlciB0byBzdXBwb3J0IGxlZ2FjeSBldmVudCBjYWxsaW5nIG1lY2hhbmlzbSAoaWRlYWxseSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBtaWdyYXRlZClcbiAgICBjb25zdCBmbiA9ICRwYXJzZUV2ZW50KHZhcmlhYmxlW3R5cGVdKTtcbiAgICBpZiAodHlwZSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkVWRU5ULkJFRk9SRV9VUERBVEUpIHtcbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uTGl2ZVZhcmlhYmxlJyAmJiB2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBkYXRhRmlsdGVyOiBkYXRhLCBvcHRpb25zOiBvcHRpb25zfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFyaWFibGUuX2NvbnRleHQsIHt2YXJpYWJsZTogdmFyaWFibGUsIGlucHV0RGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBkYXRhOiBkYXRhLCBvcHRpb25zOiBvcHRpb25zfSk7XG4gICAgfVxufTtcblxuY29uc3QgdHJpZ2dlck9uVGltZW91dCA9IChzdWNjZXNzKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRyaWdnZXJGbihzdWNjZXNzKTsgfSwgNTAwKTtcbn07XG5cbmNvbnN0IGRvd25sb2FkRmlsZWZyb21SZXNwb25zZSA9IChyZXNwb25zZSwgaGVhZGVycywgc3VjY2VzcywgZXJyb3IpID0+IHtcbiAgICAvLyBjaGVjayBmb3IgYSBmaWxlbmFtZVxuICAgIGxldCBmaWxlbmFtZSA9ICcnLFxuICAgICAgICBmaWxlbmFtZVJlZ2V4LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICB0eXBlLFxuICAgICAgICBibG9iLFxuICAgICAgICBVUkwsXG4gICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICBwb3B1cDtcbiAgICBjb25zdCBkaXNwb3NpdGlvbiA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJyk7XG4gICAgaWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcbiAgICAgICAgZmlsZW5hbWVSZWdleCA9IC9maWxlbmFtZVteOz1cXG5dKj0oKFsnXCJdKS4qP1xcMnxbXjtcXG5dKikvO1xuICAgICAgICBtYXRjaGVzID0gZmlsZW5hbWVSZWdleC5leGVjKGRpc3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xuICAgICAgICAgICAgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGUgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgYmxvYiA9IG5ldyBCbG9iKFtyZXNwb25zZV0sIHsgdHlwZTogdHlwZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBJRSB3b3JrYXJvdW5kIGZvciBcIkhUTUw3MDA3OiBPbmUgb3IgbW9yZSBibG9iIFVSTHMgd2VyZSByZXZva2VkIGJ5IGNsb3NpbmcgdGhlIGJsb2IgZm9yIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLiBUaGVzZSBVUkxzIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgYXMgdGhlIGRhdGEgYmFja2luZyB0aGUgVVJMIGhhcyBiZWVuIGZyZWVkLlwiXG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckZuKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIFVSTCAgICAgICAgID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuICAgICAgICBkb3dubG9hZFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAvLyB1c2UgSFRNTDUgYVtkb3dubG9hZF0gYXR0cmlidXRlIHRvIHNwZWNpZnkgZmlsZW5hbWVcbiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsZXQgcmVhZGVyO1xuICAgICAgICAgICAgLy8gc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhLmRvd25sb2FkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmVhZGVyLnJlc3VsdC5yZXBsYWNlKC9eZGF0YTpbXjtdKjsvLCAnZGF0YTphdHRhY2htZW50L2ZpbGU7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcG9wdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gdHJpZ2dlck9uVGltZW91dC5iaW5kKHVuZGVmaW5lZCwgc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYS5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJPblRpbWVvdXQoc3VjY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKGRvd25sb2FkVXJsLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaWdnZXJPblRpbWVvdXQoc3VjY2Vzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgVVJMLnJldm9rZU9iamVjdFVSTChkb3dubG9hZFVybCk7IH0sIDEwMCk7IC8vIGNsZWFudXBcbiAgICB9XG59O1xuXG5jb25zdCBnZXRTZXJ2aWNlID0gKHNlcnZpY2VOYW1lKSA9PiB7XG4gICAgaWYgKCFzZXJ2aWNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcbiAgICAvLyBUb2RvOiBTaHViaGFtLCB1bmNvbW1lbnQgYmVsb3cgY29kZVxuICAgIC8qIC8hKiBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgd2hlcmUgbmctYXBwIGlzIGRlZmluZWQgKiEvXG4gICAgIGxldCBhcHBFbCA9IFdNLmVsZW1lbnQoJ1tpZD1uZy1hcHBdJyksIGluamVjdG9yO1xuICAgICBpZiAoYXBwRWwpIHtcbiAgICAgdHJ5IHtcbiAgICAgaW5qZWN0b3IgPSBhcHBFbC5pbmplY3RvcigpOyAvLyBnZXQgdGhlIGFuZ3VsYXIgaW5qZWN0b3JcbiAgICAgaWYgKGluamVjdG9yKSB7XG4gICAgIHJldHVybiBpbmplY3Rvci5nZXQoc2VydmljZU5hbWUpOyAvLyByZXR1cm4gdGhlIHNlcnZpY2VcbiAgICAgfVxuICAgICB9IGNhdGNoIChlKSB7XG4gICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgIH1cbiAgICAgfSovXG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCB0aGUgZm9ybSBkYXRhIHBhcmFtcyBmcm9tIHRoZSBVUkxcbiAqIEBwYXJhbSBxdWVyeVBhcmFtc1xuICogQHBhcmFtIHBhcmFtc1xuICovXG5jb25zdCBzZXRQYXJhbXNGcm9tVVJMID0gKHF1ZXJ5UGFyYW1zLCBwYXJhbXMpID0+IHtcbiAgICBxdWVyeVBhcmFtcyA9IHNwbGl0KHF1ZXJ5UGFyYW1zLCAnJicpO1xuICAgIGZvckVhY2gocXVlcnlQYXJhbXMsIGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICBwYXJhbSA9IHNwbGl0KHBhcmFtLCAnPScpO1xuICAgICAgICBwYXJhbXNbcGFyYW1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGpvaW4oc2xpY2UocGFyYW0sIDEpLCAnPScpKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogW1RvZG86IFNodWJoYW1dLCBJbXBsZW1lbnQgRG93bmxvYWQgdGhyb3VnaCBJIGZyYW1lXG4gKiBTaW11bGF0ZXMgZmlsZSBkb3dubG9hZCBpbiBhbiBhcHAgdGhyb3VnaCBjcmVhdGluZyBhbmQgc3VibWl0dGluZyBhIGhpZGRlbiBmb3JtIGluIERPTS5cbiAqIFRoZSBhY3Rpb24gd2lsbCBiZSBpbml0aWF0ZWQgdGhyb3VnaCBhIFNlcnZpY2UgVmFyaWFibGVcbiAqXG4gKiBRdWVyeSBQYXJhbXNcbiAqIFRoZSByZXF1ZXN0IHBhcmFtcyBsaWtlIHF1ZXJ5IHBhcmFtcyBhcmUgYWRkZWQgYXMgaGlkZGVuIGlucHV0IGVsZW1lbnRzXG4gKlxuICogSGVhZGVyIFBhcmFtc1xuICogVGhlIGhlYWRlciBwYXJhbXMgZm9yIGEgcmVxdWVzdCBhcmUgYWxzbyBhZGRlZCBhbG9uZyB3aXRoIGhpZGRlbiBpbnB1dCBlbGVtZW50cy5cbiAqIFRoaXMgaXMgZG9uZSBhcyBoZWFkZXJzIGNhbiBub3QgYmUgc2V0IGZvciBhIGZvcm0gUE9TVCBjYWxsIGZyb20gSmF2YVNjcmlwdFxuICpcbiAqIEZpbmFsbHksIHJlcXVlc3QgcGFyYW1ldGVycyBhcmUgc2VudCBhcyBmb2xsb3dzOlxuICogRm9yIGEgR0VUIHJlcXVlc3QsIHRoZSByZXF1ZXN0IGRhdGEgaXMgc2VudCBhbG9uZyB3aXRoIHRoZSBxdWVyeSBwYXJhbXMuXG4gKiBGb3IgUE9TVCwgaXQgaXMgc2VudCBhcyByZXF1ZXN0IGJvZHkuXG4gKlxuICogQHBhcmFtIHZhcmlhYmxlOiB0aGUgdmFyaWFibGUgdGhhdCBpcyBjYWxsZWQgZnJvbSB1c2VyIGFjdGlvblxuICogQHBhcmFtIHJlcXVlc3RQYXJhbXMgb2JqZWN0IGNvbnNpc3RpbmcgdGhlIGluZm8gdG8gY29uc3RydWN0IHRoZSBYSFIgcmVxdWVzdCBmb3IgdGhlIHNlcnZpY2VcbiAqL1xuY29uc3QgZG93bmxvYWRUaHJvdWdoSWZyYW1lID0gKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MsIGRhdGFCaW5kaW5nKSA9PiB7XG4gICAgLy8gVG9kbzogU0h1YmhhbTogVVJMIGNvbnRhaW5zICcvLycgaW4gYmV0d2VlbiB3aGljaCBzaG91bGQgYmUgaGFuZGxlZCBhdCB0aGUgVVJMIGZvcm1hdGlvbiBvbmx5XG4gICAgaWYgKHJlcXVlc3RQYXJhbXMudXJsWzFdID09PSAnLycgJiYgcmVxdWVzdFBhcmFtcy51cmxbMl0gPT09ICcvJykge1xuICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHJlcXVlc3RQYXJhbXMudXJsLnNsaWNlKDAsIDEpICsgcmVxdWVzdFBhcmFtcy51cmwuc2xpY2UoMik7XG4gICAgfVxuICAgIGxldCBpRnJhbWVFbGVtZW50LFxuICAgICAgICBmb3JtRWwsXG4gICAgICAgIHBhcmFtRWxlbWVudCxcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAnJyxcbiAgICAgICAgZGF0YTtcbiAgICBjb25zdCBJRlJBTUVfTkFNRSAgICAgPSAnZmlsZURvd25sb2FkSUZyYW1lJyxcbiAgICAgICAgRk9STV9OQU1FICAgICAgID0gJ2ZpbGVEb3dubG9hZEZvcm0nLFxuICAgICAgICBDT05URU5UX1RZUEUgICAgPSAnQ29udGVudC1UeXBlJyxcbiAgICAgICAgdXJsICAgICAgICAgICAgID0gcmVxdWVzdFBhcmFtcy51cmwsXG4gICAgICAgIGVuY1R5cGUgPSBnZXQocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBDT05URU5UX1RZUEUpLFxuICAgICAgICBwYXJhbXMgPSBwaWNrQnkocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgIT09IENPTlRFTlRfVFlQRTtcbiAgICAgICAgfSk7XG4gICAgLyogVG9kbzogc2h1YmhhbSA6IGRlZmluZSBnZXRTZXJ2aWNlIG1ldGhvZFxuICAgICBXU19DT05TVEFOVFMgICAgPSBnZXRTZXJ2aWNlKCdXU19DT05TVEFOVFMnKTsqL1xuXG4gICAgLyogbG9vayBmb3IgZXhpc3RpbmcgaWZyYW1lLiBJZiBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdCAqL1xuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCcjJyArIElGUkFNRV9OQU1FKTtcbiAgICBpZiAoaUZyYW1lRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5maXJzdCgpLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnPGlmcmFtZSBpZD1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBuYW1lPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIGNsYXNzPVwibmctaGlkZVwiPjwvaWZyYW1lPicpO1xuICAgIGZvcm1FbCAgICAgICAgPSAkKCc8Zm9ybSBpZD1cIicgKyBGT1JNX05BTUUgKyAnXCIgbmFtZT1cIicgKyBGT1JNX05BTUUgKyAnXCI+PC9mb3JtPicpO1xuXG4gICAgLyogcHJvY2VzcyBxdWVyeSBwYXJhbXMsIGFwcGVuZCBhIGhpZGRlbiBpbnB1dCBlbGVtZW50IGluIHRoZSBmb3JtIGFnYWluc3QgZWFjaCBwYXJhbSAqL1xuICAgIHF1ZXJ5UGFyYW1zICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZignPycpICsgMSkgOiAnJztcbiAgICBxdWVyeVBhcmFtcyArPSBlbmNUeXBlID09PSBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5GT1JNX1VSTF9FTkNPREVEID8gKChxdWVyeVBhcmFtcyA/ICcmJyA6ICcnKSArIHJlcXVlc3RQYXJhbXMuZGF0YVBhcmFtcykgOiAnJztcblxuICAgIGZvcm1FbC5hdHRyKHtcbiAgICAgICAgJ3RhcmdldCcgIDogaUZyYW1lRWxlbWVudC5hdHRyKCduYW1lJyksXG4gICAgICAgICdhY3Rpb24nICA6IHVybCxcbiAgICAgICAgJ21ldGhvZCcgIDogcmVxdWVzdFBhcmFtcy5tZXRob2QsXG4gICAgICAgICdlbmN0eXBlJzogIShpc0VtcHR5KHJlcXVlc3RQYXJhbXMuZGF0YSkgJiYgaXNFbXB0eShxdWVyeVBhcmFtcykpID8gZW5jVHlwZSA6IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLk1VTFRJUEFSVF9GT1JNREFUQVxuICAgIH0pO1xuXG4gICAgLy8gRm9yIE5vbiBib2R5IG1ldGhvZHMgb25seSwgc2V0IHRoZSBpbnB1dCBmaWVsZHMgZnJvbSBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgaWYgKGluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIHRvVXBwZXIocmVxdWVzdFBhcmFtcy5tZXRob2QpKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHF1ZXJ5UGFyYW1zLCBwYXJhbXMpOyAvLyBTZXQgcGFyYW1zIGZvciBVUkwgcXVlcnkgcGFyYW1zXG4gICAgfVxuICAgIGlmICghaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmRhdGEpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocmVxdWVzdFBhcmFtcy5kYXRhLCBwYXJhbXMpOy8vIFNldCBwYXJhbXMgZm9yIHJlcXVlc3QgZGF0YVxuICAgICAgICBkYXRhID0gcGFyYW1zO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBpc0VtcHR5KGRhdGFCaW5kaW5nKSA/IHBhcmFtcyA6IGRhdGFCaW5kaW5nO1xuICAgIH1cbiAgICBmb3JFYWNoKGRhdGEsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICBwYXJhbUVsZW1lbnQgPSAkKCc8aW5wdXQgdHlwZT1cImhpZGRlblwiPicpO1xuICAgICAgICBwYXJhbUVsZW1lbnQuYXR0cih7XG4gICAgICAgICAgICAnbmFtZScgIDoga2V5LFxuICAgICAgICAgICAgJ3ZhbHVlJyA6IHZhbFxuICAgICAgICB9KTtcbiAgICAgICAgZm9ybUVsLmFwcGVuZChwYXJhbUVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgLyogYXBwZW5kIGZvcm0gdG8gaUZyYW1lIGFuZCBpRnJhbWUgdG8gdGhlIGRvY3VtZW50IGFuZCBzdWJtaXQgdGhlIGZvcm0gKi9cbiAgICAkKCdib2R5JykuYXBwZW5kKGlGcmFtZUVsZW1lbnQpO1xuXG4gICAgLy8gdGltZW91dCBmb3IgSUUgMTAsIGlmcmFtZUVsZW1lbnQuY29udGVudHMoKSBpcyBlbXB0eSBpbiBJRSAxMCB3aXRob3V0IHRpbWVvdXRcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5jb250ZW50cygpLmZpbmQoJ2JvZHknKS5hcHBlbmQoZm9ybUVsKTtcbiAgICAgICAgZm9ybUVsLnN1Ym1pdCgpO1xuICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzcyk7XG4gICAgfSwgMTAwKTtcbn07XG5cbi8qKlxuICogTWFrZXMgYW4gWEhSIGNhbGwgYWdhaW5zdCB0aGUgY29uZmlnXG4gKiB0aGUgcmVzcG9uc2UgaXMgY29udmVydGVkIGludG8gYSBibG9iIHVybCwgd2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIHNyYyBhdHRyaWJ1dGUgb2YgYW4gYW5jaG9yIGVsZW1lbnQgd2l0aCBkb3dubG9hZD10cnVlXG4gKiBhIGNsaWNrIGlzIHNpbXVsYXRlZCBvbiB0aGUgYW5jaG9yIHRvIGRvd25sb2FkIHRoZSBmaWxlXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gc3VjY2Vzc1xuICogQHBhcmFtIGVycm9yXG4gKi9cbmNvbnN0IGRvd25sb2FkVGhyb3VnaEFuY2hvciA9IChjb25maWcsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgY29uc3QgdXJsICAgICA9IGNvbmZpZy51cmwsXG4gICAgICAgIG1ldGhvZCAgPSBjb25maWcubWV0aG9kLFxuICAgICAgICBkYXRhICAgID0gY29uZmlnLmRhdGFQYXJhbXMgfHwgY29uZmlnLmRhdGEsXG4gICAgICAgIGhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG5cbiAgICAvLyBUb2RvOiBSZXBsYWNlIGh0dHAgd2l0aCBnZXRTZXJ2aWNlXG4gICAgaHR0cFNlcnZpY2Uuc2VuZCh7XG4gICAgICAgICd0YXJnZXQnIDogJ1dlYlNlcnZpY2UnLFxuICAgICAgICAnYWN0aW9uJyA6ICdpbnZva2VSdW50aW1lUmVzdENhbGwnLFxuICAgICAgICAnbWV0aG9kJyA6IG1ldGhvZCxcbiAgICAgICAgJ3VybCcgICAgOiB1cmwsXG4gICAgICAgICdoZWFkZXJzJzogaGVhZGVycyxcbiAgICAgICAgJ2RhdGEnICAgOiBkYXRhLFxuICAgICAgICAncmVzcG9uc2VUeXBlJzogJ2FycmF5YnVmZmVyJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG93bmxvYWRGaWxlZnJvbVJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlLmhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICAgICAgfSwgOTAwKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRyaWdnZXJGbihlcnJvciwgZXJyKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogYXBwZW5kcyBhIHRpbWVzdGFtcCBvbiB0aGUgcGFzc2VkIGZpbGVuYW1lIHRvIHByZXZlbnQgY2FjaGluZ1xuICogcmV0dXJucyB0aGUgbW9kaWZpZWQgZmlsZSBuYW1lXG4gKiBAcGFyYW0gZmlsZU5hbWVcbiAqIEBwYXJhbSBleHBvcnRGb3JtYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldE1vZGlmaWVkRmlsZU5hbWUgPSAoZmlsZU5hbWUsIGV4cG9ydEZvcm1hdCkgPT4ge1xuICAgIGxldCBmaWxlRXh0ZW5zaW9uO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGV4cG9ydEZvcm1hdCkge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gZXhwb3J0VHlwZXNNYXBbZXhwb3J0Rm9ybWF0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gJy4nICsgbGFzdChzcGxpdChmaWxlTmFtZSwgJy4nKSk7XG4gICAgICAgIGZpbGVOYW1lID0gcmVwbGFjZShmaWxlTmFtZSwgZmlsZUV4dGVuc2lvbiwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZU5hbWUgKyAnXycgKyBjdXJyZW50VGltZXN0YW1wICsgZmlsZUV4dGVuc2lvbjtcbn07XG5cbmNvbnN0IGdldENvb2tpZUJ5TmFtZSA9IChuYW1lKSA9PiB7XG4gICAgLy8gVG9kbzogU2h1YmhhbSBJbXBsZW1lbnQgY29va2llIG5hdGl2ZSBqc1xuICAgIHJldHVybiAnY29va2llJztcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb29raWVWYWx1ZSBpZiB4c3JmIGlzIGVuYWJsZWQuXG4gKiBJbiBkZXZpY2UsIHhzcmYgY29va2llIGlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gKiBAcmV0dXJucyB4c3JmIGNvb2tpZSB2YWx1ZVxuICovXG5jb25zdCBpc1hzcmZFbmFibGVkID0gKCkgPT4ge1xuICAgIGlmIChDT05TVEFOVFMuaGFzQ29yZG92YSkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ09OU1RBTlRTLlhTUkZfQ09PS0lFX05BTUUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9iamVjdCBub2RlIGZvciBhIGJpbmQgb2JqZWN0LCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRvIGJlIHVwZGF0ZWRcbiAqIG9iai50YXJnZXQgPSBcImFcIlxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHJvb3RcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmNvbnN0IGdldFRhcmdldE9iaiA9IChvYmosIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgLypcbiAgICAgKiBpZiB0aGUgdGFyZ2V0IGtleSBpcyBpbiB0aGUgZm9ybSBhcyBcIlsnbXkucGFyYW0nXVwiXG4gICAgICoga2VlcCB0aGUgdGFyZ2V0IGtleSBhcyBcIm15LnBhcmFtXCIgYW5kIGRvIG5vdCBzcGxpdCBmdXJ0aGVyXG4gICAgICogdGhpcyBpcyBkb25lLCBzbyB0aGF0LCB0aGUgY29tcHV0ZWQgdmFsdWUgYWdhaW5zdCB0aGlzIGJpbmRpbmcgaXMgYXNzaWduZWQgYXNcbiAgICAgKiAgICAgIHtcIm15LnBhcmFtXCI6IFwidmFsdWVcIn1cbiAgICAgKiBhbmQgbm90IGFzXG4gICAgICogICAgICB7XG4gICAgICogICAgICAgICAgXCJteVwiOiB7XG4gICAgICogICAgICAgICAgICAgIFwicGFyYW1cIjogXCJ2YWx1ZVwiXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICAgfVxuICAgICAqL1xuICAgIGxldCB0YXJnZXQgPSBvYmoudGFyZ2V0LFxuICAgICAgICB0YXJnZXRPYmo7XG4gICAgY29uc3Qgcm9vdE5vZGUgPSB2YXJpYWJsZVtyb290XTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXRPYmogPSByb290Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc3Vic3RyKDAsIHRhcmdldC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgaWYgKG9iai50YXJnZXQgPT09IHJvb3QpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IHZhcmlhYmxlO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gZmluZFZhbHVlT2Yocm9vdE5vZGUsIHRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSByb290Tm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0T2JqO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSB0YXJnZXQgb2JqZWN0XG4gKiB0aGUgY29tcHV0ZWQgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIGFnYWluc3QgdGhpcyBrZXkgaW4gdGhlIHRhcmdldE9iamVjdChjb21wdXRlZCBieSBnZXRUYXJnZXRPYmooKSlcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByZWdleFxuICogQHJldHVybnMgeyp9XG4gKi9cbmNvbnN0IGdldFRhcmdldE5vZGVLZXkgPSAodGFyZ2V0KSA9PiB7XG4gICAgLypcbiAgICAgKiBpZiB0aGUgdGFyZ2V0IGtleSBpcyBpbiB0aGUgZm9ybSBhcyBcIlsnbXkucGFyYW0nXVwiXG4gICAgICoga2VlcCB0aGUgdGFyZ2V0IGtleSBhcyBcIm15LnBhcmFtXCIgYW5kIGRvIG5vdCBzcGxpdCBmdXJ0aGVyXG4gICAgICogdGhpcyBpcyBkb25lLCBzbyB0aGF0LCB0aGUgY29tcHV0ZWQgdmFsdWUgYWdhaW5zdCB0aGlzIGJpbmRpbmcgaXMgYXNzaWduZWQgYXNcbiAgICAgKiAgICAgIHtcIm15LnBhcmFtXCI6IFwidmFsdWVcIn1cbiAgICAgKiBhbmQgbm90IGFzXG4gICAgICogICAgICB7XG4gICAgICogICAgICAgICAgXCJteVwiOiB7XG4gICAgICogICAgICAgICAgICAgIFwicGFyYW1cIjogXCJ2YWx1ZVwiXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICAgfVxuICAgICAqL1xuICAgIGxldCB0YXJnZXROb2RlS2V5O1xuICAgIGlmIChET1RfRVhQUl9SRVgudGVzdCh0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSB0YXJnZXQucmVwbGFjZSgvXihcXFtbXCInXSl8KFtcIiddXFxdKSQvZywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSB0YXJnZXQuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE5vZGVLZXk7XG59O1xuXG5jb25zdCBzZXRWYWx1ZVRvTm9kZSA9ICh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIHZhbHVlLCBub1VwZGF0ZT8pID0+IHtcbiAgICBjb25zdCB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpLFxuICAgICAgICB0YXJnZXRPYmogPSBnZXRUYXJnZXRPYmoob2JqLCByb290LCB2YXJpYWJsZSk7XG4gICAgdmFsdWUgPSAhaXNVbmRlZmluZWQodmFsdWUpID8gdmFsdWUgOiBvYmoudmFsdWU7XG4gICAgLyogc2FuaXR5IGNoZWNrLCB1c2VyIGNhbiBiaW5kIHBhcmVudCBub2RlcyB0byBub24tb2JqZWN0IHZhbHVlcywgc28gY2hpbGQgbm9kZSBiaW5kaW5ncyBtYXkgZmFpbCAqL1xuICAgIGlmICh0YXJnZXRPYmopIHtcbiAgICAgICAgdGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlKHRhcmdldE5vZGVLZXksIHZhbHVlLCBvYmoudHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKTtcbn07XG5cbi8qKlxuICogVGhlIG1vZGVsIGludGVybmFsQm91bmROb2RlTWFwIHN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIGxhdGVzdCBjb21wdXRlZCB2YWx1ZXMgYWdhaW5zdCBpbnRlcm5hbChuZXN0ZWQpIGJvdW5kIG5vZGVzXG4gKiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgaW50ZXJuYWwgbm9kZSdzIGNvbXB1dGVkIHZhbHVlIGlzIG5vdCBsb3N0LCBvbmNlIGl0cyBwYXJlbnQgbm9kZSdzIHZhbHVlIGlzIGNvbXB1dGVkIGF0IGEgbGF0ZXIgcG9pbnRcbiAqIEUuZy5cbiAqIFZhcmlhYmxlLmVtcGxveWVlVmFyIGhhcyBmb2xsb3dpbmcgYmluZGluZ3NcbiAqIFwiZGF0YUJpbmRpbmdcIjogW1xuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnQuYnVkZ2V0XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuYnVkZ2V0VmFyLmRhdGFTZXRcIlxuICAgICB9LFxuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnRcIixcbiAgICAgICAgIFwidmFsdWVcIjogXCJiaW5kOlZhcmlhYmxlcy5kZXBhcnRtZW50VmFyLmRhdGFTZXRcIlxuICAgICB9XG4gXVxuICogV2hlbiBkZXBhcnRtZW50LmJ1ZGdldCBpcyBjb21wdXRlZCwgZW1wbG95ZWVWYXIuZGF0YVNldCA9IHtcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcImJ1ZGdldFwiOiB7XCJxMVwiOiAxMTExfVxuICogIH1cbiAqIH1cbiAqXG4gKiBXaGVuIGRlcGFydG1lbnQgaXMgY29tcHV0ZWRcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcIm5hbWVcIjogXCJIUlwiLFxuICogICAgICBcImxvY2F0aW9uXCI6IFwiSHlkZXJhYmFkXCJcbiAqICB9XG4gKiBUaGUgYnVkZ2V0IGZpZWxkIChjb21wdXRlZCBlYXJsaWVyKSBpcyBMT1NULlxuICpcbiAqIFRvIGF2b2lkIHRoaXMsIHRoZSBsYXRlc3QgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwgbm9kZXMgKGluIHRoaXMgY2FzZSBkZXBhcnRtZW50LmJ1ZGdldCkgYXJlIHN0b3JlZCBpbiBhIG1hcFxuICogVGhlc2UgdmFsdWVzIGFyZSBhc3NpZ25lZCBiYWNrIHRvIGludGVybmFsIGZpZWxkcyBpZiB0aGUgcGFyZW50IGlzIGNvbXB1dGVkIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudClcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqL1xuY29uc3QgdXBkYXRlSW50ZXJuYWxOb2RlcyA9ICh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgY29uc3QgYm91bmRJbnRlcm5hbE5vZGVzID0ga2V5cyhnZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3RdKSksXG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCk7XG4gICAgbGV0IGludGVybmFsTm9kZXM7XG4gICAgZnVuY3Rpb24gZmluZEludGVybmFsTm9kZUJvdW5kKCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyKGJvdW5kSW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXRlciBjb25kaXRpb24gaW4gY2hlY2sgKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgaXMgc3BlY2lmaWNhbGx5IGZvciBsaXZlIHZhcmlhYmxlIG9mIGluc2VydC91cGRhdGUgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiAobm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSAmJiBpbmNsdWRlcyhub2RlLCB0YXJnZXROb2RlS2V5KSkgfHwgKCh0YXJnZXROb2RlS2V5ID09PSByb290IHx8IHRhcmdldE5vZGVLZXkgPT09ICdkYXRhQmluZGluZycpICYmIG5vZGUgIT09IHRhcmdldE5vZGVLZXkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50ZXJuYWxOb2RlcyA9IGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpO1xuICAgIGlmICgoaW50ZXJuYWxOb2Rlcy5sZW5ndGgpKSB7XG4gICAgICAgIGZvckVhY2goaW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKG5vZGUsIHt0YXJnZXQ6IG5vZGV9LCByb290LCB2YXJpYWJsZSwgZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCBub2RlXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE5ldyBJbXBsZW1lbnRhdGlvbiAoRGF0YUJpbmRpbmcgRmxhdCBTdHJ1Y3R1cmUgd2l0aCB4LXBhdGggdGFyZ2V0cylcbiAqIHByb2Nlc3NlcyBhIGRhdGFCaW5kaW5nIG9iamVjdCwgaWYgYm91bmQgdG8gZXhwcmVzc2lvbiwgd2F0Y2hlcyBvdmVyIGl0LCBlbHNlIGFzc2lnbnMgdmFsdWUgdG8gdGhlIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBvYmogZGF0YUJpbmRpbmcgb2JqZWN0XG4gKiBAcGFyYW0gc2NvcGUgc2NvcGUgb2YgdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gcm9vdCByb290IG5vZGUgc3RyaW5nIChkYXRhQmluZGluZyBmb3IgYWxsIHZhcmlhYmxlcywgZGF0YVNldCBmb3Igc3RhdGljIHZhcmlhYmxlKVxuICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIG9iamVjdFxuICovXG5jb25zdCBwcm9jZXNzQmluZE9iamVjdCA9IChvYmosIHNjb3BlLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKSxcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgcnVuTW9kZSA9IHRydWU7XG4gICAgY29uc3QgZGVzdHJveUZuID0gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIgPyBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lci5iaW5kKHNjb3BlKSA6IG5vb3A7XG5cbiAgICBpZiAoc3RyaW5nU3RhcnRzV2l0aChvYmoudmFsdWUsICdiaW5kOicpKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAoKG5ld1ZhbCA9PT0gb2xkVmFsICYmIGlzVW5kZWZpbmVkKG5ld1ZhbCkpIHx8IChpc1VuZGVmaW5lZChuZXdWYWwpICYmICghaXNVbmRlZmluZWQob2xkVmFsKSB8fCAhaXNVbmRlZmluZWQodGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2tpcCBjbG9uaW5nIGZvciBibG9iIGNvbHVtblxuICAgICAgICAgICAgaWYgKCFpbmNsdWRlcyhbJ2Jsb2InLCAnZmlsZSddLCBvYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXRDbG9uZWRPYmplY3QobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgbmV3VmFsKTsgLy8gY2xvbmluZyBuZXdWYWwgdG8ga2VlcCB0aGUgc291cmNlIGNsZWFuXG5cbiAgICAgICAgICAgIGlmIChydW5Nb2RlKSB7XG4gICAgICAgICAgICAgICAgLypzZXQgdGhlIGludGVybmFsIGJvdW5kIG5vZGUgbWFwIHdpdGggdGhlIGxhdGVzdCB1cGRhdGVkIHZhbHVlKi9cbiAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgdGFyZ2V0XSwgbmV3VmFsKTtcbiAgICAgICAgICAgICAgICAvKnVwZGF0ZSB0aGUgaW50ZXJuYWwgbm9kZXMgYWZ0ZXIgaW50ZXJuYWwgbm9kZSBtYXAgaXMgc2V0Ki9cbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJbnRlcm5hbE5vZGVzKHRhcmdldCwgcm9vdCwgdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZGVzdHJveUZuKCR3YXRjaChvYmoudmFsdWUucmVwbGFjZSgnYmluZDonLCAnJyksIHNjb3BlLCB7fSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICgpID0+IHZhcmlhYmxlLmlzTXV0ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChvYmoudmFsdWUpKSB7XG4gICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgb2JqLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHJ1bk1vZGUgJiYgcm9vdCAhPT0gdGFyZ2V0Tm9kZUtleSkge1xuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIHRhcmdldF0sIG9iai52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQVUJMSUMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy9cblxuLyoqXG4gKiBJbml0aWFsaXplcyB3YXRjaGVycyBmb3IgYmluZGluZyBleHByZXNzaW9ucyBjb25maWd1cmVkIGluIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcGFyYW0gY29udGV4dCwgc2NvcGUgY29udGV4dCBpbiB3aGljaCB0aGUgdmFyaWFibGUgZXhpc3RzXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluZFNvdXJjZSwgIHRoZSBmaWVsZCBpbiB2YXJpYWJsZSB3aGVyZSB0aGUgZGF0YWJpbmRpbmdzIGFyZSBjb25maWd1cmVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3N0IHZhcmlhYmxlcywgaXQgd2lsbCBiZSAnZGF0YUJpbmRpbmcnLCBoZW5jZSBkZWZhdWx0IGZhbGxiYWNrIGlzIHRvICdkYXRhQmluZGluZydcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNvbWUgaXQgY2FuIGJlICdkYXRhU2V0JyBhbmQgaGVuY2Ugd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5kVGFyZ2V0LCB0aGUgb2JqZWN0IGZpZWxkIGluIHZhcmlhYmxlIHdoZXJlIHRoZSBjb21wdXRlZCBiaW5kaW5ncyB3aWxsIGJlIHNldFxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc0JpbmRpbmcgPSAodmFyaWFibGU6IGFueSwgY29udGV4dDogYW55LCBiaW5kU291cmNlPzogc3RyaW5nLCBiaW5kVGFyZ2V0Pzogc3RyaW5nKSA9PiB7XG4gICAgYmluZFNvdXJjZSA9IGJpbmRTb3VyY2UgfHwgJ2RhdGFCaW5kaW5nJztcbiAgICBiaW5kVGFyZ2V0ID0gYmluZFRhcmdldCB8fCAnZGF0YUJpbmRpbmcnO1xuXG4gICAgY29uc3QgYmluZE1hcCA9IHZhcmlhYmxlW2JpbmRTb3VyY2VdO1xuICAgIHZhcmlhYmxlW2JpbmRTb3VyY2VdID0ge307XG4gICAgdmFyaWFibGVbJ19iaW5kJyArIGJpbmRTb3VyY2VdID0gYmluZE1hcDtcbiAgICBpZiAoIWJpbmRNYXAgfHwgIWlzQXJyYXkoYmluZE1hcCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBiaW5kTWFwLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgLyogZm9yIHN0YXRpYyB2YXJpYWJsZSBjaGFuZ2UgdGhlIGJpbmRpbmcgd2l0aCB0YXJnZXQgJ2RhdGFCaW5kaW5nJyB0byAnZGF0YVNldCcsIGFzIHRoZSByZXN1bHRzIGhhdmUgdG8gcmVmbGVjdCBkaXJlY3RseSBpbiB0aGUgZGF0YVNldCAqL1xuICAgICAgICBpZiAodmFyaWFibGUuY2F0ZWdvcnkgPT09ICd3bS5WYXJpYWJsZScgJiYgbm9kZS50YXJnZXQgPT09ICdkYXRhQmluZGluZycpIHtcbiAgICAgICAgICAgIG5vZGUudGFyZ2V0ID0gJ2RhdGFTZXQnO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NCaW5kT2JqZWN0KG5vZGUsIGNvbnRleHQsIGJpbmRUYXJnZXQsIHZhcmlhYmxlKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogRG93bmxvYWRzIGEgZmlsZSBpbiB0aGUgYnJvd3Nlci5cbiAqIFR3byBtZXRob2RzIHRvIGRvIHNvLCBuYW1lbHk6XG4gKiAxLiBkb3dubG9hZFRocm91Z2hBbmNob3IsIGNhbGxlZCBpZlxuICogICAgICAtIGlmIGEgaGVhZGVyIGlzIHRvIGJlIHBhc3NlZFxuICogICAgICBPUlxuICogICAgICAtIGlmIHNlY3VyaXR5IGlzIE9OIGFuZCBYU1JGIHRva2VuIGlzIHRvIGJlIHNlbnQgYXMgd2VsbFxuICogTk9URTogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSB2ZXJzaW9uIDEwLjAgYW5kIGJlbG93XG4gKlxuICogMi4gZG93bmxvYWRUaHJvdWdoSWZyYW1lXG4gKiAgICAgIC0gdGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIGJyb3dzZXJzIGFuZCB1c2VzIGFuIGlmcmFtZSB0byBkb3dubGFkIHRoZSBmaWxlLlxuICogQHBhcmFtIHJlcXVlc3RQYXJhbXMgcmVxdWVzdCBwYXJhbXMgb2JqZWN0XG4gKiBAcGFyYW0gZmlsZU5hbWUgcmVwcmVzZW50cyB0aGUgZmlsZSBuYW1lXG4gKiBAcGFyYW0gZXhwb3J0Rm9ybWF0IGRvd25sb2FkZWQgZmlsZSBmb3JtYXRcbiAqIEBwYXJhbSBzdWNjZXNzIHN1Y2Nlc3MgY2FsbGJhY2tcbiAqIEBwYXJhbSBlcnJvciBlcnJvciBjYWxsYmFja1xuICovXG5leHBvcnQgY29uc3Qgc2ltdWxhdGVGaWxlRG93bmxvYWQgPSAocmVxdWVzdFBhcmFtcywgZmlsZU5hbWUsIGV4cG9ydEZvcm1hdCwgc3VjY2VzcywgZXJyb3IsIGRhdGFCaW5kaW5nKSA9PiB7XG4gICAgLypzdWNjZXNzIGFuZCBlcnJvciBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIGluY2FzZSBvZiBkb3dubG9hZFRocm91Z2hBbmNob3JcbiAgICAgRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBpbmNhc2Ugb2YgaWZyYW1lKi9cbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgICAgICB9XG4gICAgICAgIGFwcE1hbmFnZXIubm90aWZ5KCdkZXZpY2UtZmlsZS1kb3dubG9hZCcsIHsgdXJsOiByZXF1ZXN0UGFyYW1zLnVybCwgbmFtZTogZmlsZU5hbWUsIGV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiwgaGVhZGVyczogcmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBzdWNjZXNzQ2I6IHN1Y2Nlc3MsIGVycm9yQ2I6IGVycm9yfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMpIHx8IGlzWHNyZkVuYWJsZWQoKSkge1xuICAgICAgICBkb3dubG9hZFRocm91Z2hBbmNob3IocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaElmcmFtZShyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBkYXRhQmluZGluZyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBzZXRzIHRoZSB2YWx1ZSBhZ2FpbnN0IHBhc3NlZCBrZXkgb24gdGhlIFwiaW5wdXRGaWVsZHNcIiBvYmplY3QgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdGFyZ2V0T2JqOiB0aGUgb2JqZWN0IGluIHdoaWNoIHRoZSBrZXksIHZhbHVlIGlzIHRvIGJlIHNldFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcGFyYW0ga2V5OiBjYW4gYmU6XG4gKiAgLSBhIHN0cmluZyBlLmcuIFwidXNlcm5hbWVcIlxuICogIC0gYW4gb2JqZWN0LCBlLmcuIHtcInVzZXJuYW1lXCI6IFwiam9oblwiLCBcInNzblwiOiBcIjExMTExXCJ9XG4gKiBAcGFyYW0gdmFsXG4gKiAtIGlmIGtleSBpcyBzdHJpbmcsIHRoZSB2YWx1ZSBhZ2FpbnN0IGl0IChmb3IgdGhhdCBkYXRhIHR5cGUpXG4gKiAtIGlmIGtleSBpcyBvYmplY3QsIG5vdCByZXF1aXJlZFxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRJbnB1dCA9ICh0YXJnZXRPYmo6IGFueSwga2V5OiBhbnksIHZhbDogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICB0YXJnZXRPYmogPSB0YXJnZXRPYmogfHwge307XG4gICAgbGV0IGtleXMsXG4gICAgICAgIGxhc3RLZXksXG4gICAgICAgIHBhcmFtT2JqID0ge307XG5cbiAgICAvLyBjb250ZW50IHR5cGUgY2hlY2tcbiAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHZhbCA9IGdldEJsb2IodmFsLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsID0gaXNOdW1iZXIodmFsKSA/IHZhbCA6IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IGl0c2VsZlxuICAgICAgICBwYXJhbU9iaiA9IGtleTtcbiAgICB9IGVsc2UgaWYgKGtleS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICAvLyBjaGVjayBmb3IgJy4nIGluIGtleSBlLmcuICdlbXBsb3llZS5kZXBhcnRtZW50J1xuICAgICAgICBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGxhc3RLZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICAvLyBGaW5kaW5nIHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGtleVxuICAgICAgICB0YXJnZXRPYmogPSBmaW5kVmFsdWVPZih0YXJnZXRPYmosIGtleXMuam9pbignLicpLCB0cnVlKTtcbiAgICAgICAga2V5ID0gbGFzdEtleTtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbU9ialtrZXldID0gdmFsO1xuICAgIH1cblxuICAgIGZvckVhY2gocGFyYW1PYmosIGZ1bmN0aW9uIChwYXJhbVZhbCwgcGFyYW1LZXkpIHtcbiAgICAgICAgdGFyZ2V0T2JqW3BhcmFtS2V5XSA9IHBhcmFtVmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBIVE1MNSBGaWxlIEFQSSBpcyBhdmFpbGFibGUgZWxzZSBmYWxzZVxuICogQHJldHVybnMge3twcm90b3R5cGU6IEJsb2I7IG5ldyhibG9iUGFydHM/OiBhbnlbXSwgb3B0aW9ucz86IEJsb2JQcm9wZXJ0eUJhZyk6IEJsb2J9fVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlVXBsb2FkU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgIHJldHVybiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YXJPcmRlclxuICogQHBhcmFtIG9wdGlvbnNPcmRlclxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV2YWx1YXRlZE9yZGVyQnkgPSAodmFyT3JkZXIsIG9wdGlvbnNPcmRlcikgPT4ge1xuICAgIGxldCBvcHRpb25GaWVsZHMsXG4gICAgICAgIHZhck9yZGVyQnk7XG4gICAgLy8gSWYgb3B0aW9ucyBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHZhcmlhYmxlIG9yZGVyXG4gICAgaWYgKCFvcHRpb25zT3JkZXIgfHwgaXNFbXB0eShvcHRpb25zT3JkZXIpKSB7XG4gICAgICAgIHJldHVybiB2YXJPcmRlcjtcbiAgICB9XG4gICAgLy8gSWYgdmFyaWFibGUgb3JkZXIgYnkgaXMgbm90IGRlZmluZWQsIHJldHVybiBvcHRpb25zIG9yZGVyXG4gICAgaWYgKCF2YXJPcmRlcikge1xuICAgICAgICByZXR1cm4gb3B0aW9uc09yZGVyO1xuICAgIH1cbiAgICAvLyBJZiBib3RoIGFyZSBwcmVzZW50LCBjb21iaW5lIHRoZSBvcHRpb25zIG9yZGVyIGFuZCB2YXJpYWJsZSBvcmRlciwgd2l0aCBvcHRpb25zIG9yZGVyIGFzIHByZWNlZGVuY2VcbiAgICB2YXJPcmRlciA9IHNwbGl0KHZhck9yZGVyLCAnLCcpO1xuICAgIG9wdGlvbnNPcmRlciA9IHNwbGl0KG9wdGlvbnNPcmRlciwgJywnKTtcbiAgICBvcHRpb25GaWVsZHMgPSBtYXAob3B0aW9uc09yZGVyLCBmdW5jdGlvbiAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0KHRyaW0ob3JkZXIpLCAnICcpWzBdO1xuICAgIH0pO1xuICAgIC8vIElmIGEgZmllbGQgaXMgcHJlc2VudCBpbiBib3RoIG9wdGlvbnMgYW5kIHZhcmlhYmxlLCByZW1vdmUgdGhlIHZhcmlhYmxlIG9yZGVyYnlcbiAgICByZW1vdmUodmFyT3JkZXIsIGZ1bmN0aW9uIChvcmRlckJ5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGluY2x1ZGVzKG9wdGlvbkZpZWxkcywgc3BsaXQodHJpbShvcmRlckJ5KSwgJyAnKVswXSk7XG4gICAgfSk7XG4gICAgdmFyT3JkZXJCeSA9IHZhck9yZGVyLmxlbmd0aCA/ICcsJyArIGpvaW4odmFyT3JkZXIsICcsJykgOiAnJztcbiAgICByZXR1cm4gam9pbihvcHRpb25zT3JkZXIsICcsJykgKyB2YXJPcmRlckJ5O1xufTtcblxuLyoqXG4gKiBmb3JtYXR0aW5nIHRoZSBleHByZXNzaW9uIGFzIHJlcXVpcmVkIGJ5IGJhY2tlbmQgd2hpY2ggd2FzIGVuY2xvc2VkIGJ5ICR7PGV4cHJlc3Npb24+fS5cbiAqIEBwYXJhbSBmaWVsZERlZnNcbiAqIHJldHVybnMgZmllbGREZWZzXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFeHBvcnRFeHByZXNzaW9uID0gZmllbGREZWZzID0+IHtcbiAgICBmb3JFYWNoKGZpZWxkRGVmcywgZnVuY3Rpb24gKGZpZWxkRGVmKSB7XG4gICAgICAgIGlmIChmaWVsZERlZi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWVsZERlZi5leHByZXNzaW9uID0gJyR7JyArIGZpZWxkRGVmLmV4cHJlc3Npb24gKyAnfSc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGREZWZzO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlVmFyaWFibGVDYWxsID0gX2ludm9rZTtcblxuY29uc3QgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlID0gKHR5cGUpID0+IHtcbiAgICByZXR1cm4gREVGQVVMVF9GT1JNQVRTW3RvVXBwZXIodHlwZSldO1xufTtcblxuLy8gRm9ybWF0IHZhbHVlIGZvciBkYXRldGltZSB0eXBlc1xuY29uc3QgX2Zvcm1hdERhdGUgPSAoZGF0ZVZhbHVlLCB0eXBlKSA9PiB7XG4gICAgbGV0IGVwb2NoO1xuICAgIGlmIChpc0RhdGUoZGF0ZVZhbHVlKSkge1xuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZS5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFpc05hTihkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgICBkYXRlVmFsdWUgPSBwYXJzZUludChkYXRlVmFsdWUsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZSAmJiBtb21lbnQoZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIGlmIChpc05hTihlcG9jaCkgJiYgdHlwZSAhPT0gRGF0YVR5cGUuVElNRSkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FU1RBTVApIHtcbiAgICAgICAgcmV0dXJuIGVwb2NoO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRGF0YVR5cGUuVElNRSAmJiAhZXBvY2gpIHtcbiAgICAgICAgZXBvY2ggPSBtb21lbnQobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIGRhdGVWYWx1ZSkudmFsdWVPZigpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZVZhbHVlICYmIGFwcE1hbmFnZXIuZ2V0UGlwZSgnZGF0ZScpLnRyYW5zZm9ybShlcG9jaCwgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlKHR5cGUpKTtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgdmFsdWVzIG9mIGRhdGUgdGltZSB0eXBlcyBpbnRvIGRlZmF1bHQgZm9ybWF0c1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGUgPSAodmFsdWUsIHR5cGUpID0+IHtcbiAgICBpZiAoaW5jbHVkZXModHlwZSwgJy4nKSkge1xuICAgICAgICB0eXBlID0gdG9Mb3dlcihleHRyYWN0VHlwZSh0eXBlKSk7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWFwKHZhbHVlLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsLCB0eXBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfZm9ybWF0RGF0ZSh2YWx1ZSwgdHlwZSk7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHZhcmlhYmxlIGRhdGEgd2hpY2ggaXMgZW5jb2RlZCBmcm9tIGJhY2tlbmQgYmVmb3JlIHNob3dpbmcgaW4gdGhlIHdpZGdldHMuXG4gKiBJdCB0YWtlcyB2YXJpYWJsZSByZXNwb25zZSBjb250ZW50IGFzIGlucHV0IGFuZCBpdGVyYXRlcyByZWN1cnNpdmVseSxcbiAqIGlmIHRoZSB2YWx1ZSBpcyBzdHJpbmcgdHlwZSB0aGVuIGl0IHdpbGwgZGVjb2RlIHRoZSBkYXRhLlxuICogQHBhcmFtIHJlc3BvbnNlQ29udGVudCAoQXJyYXkgb2Ygb2JqZWN0cylcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29kZURhdGEgPSAocmVzcG9uc2VDb250ZW50KSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBmb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gaHRtbERlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKGRhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IGh0bWxEZWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIGZvckVhY2gocmVzcG9uc2VDb250ZW50LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudFtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRlY29kZURhdGEodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgcmVzcG9uc2VDb250ZW50ID0gaHRtbERlY29kZShyZXNwb25zZUNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZW50O1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGh0bWxEZWNvZGUoaW5wdXQpIHtcbiAgICByZXR1cm4gaGUudW5lc2NhcGUoaW5wdXQpO1xufVxuIl19