@wavemaker/app-ng-runtime 12.0.0-next.45752 → 12.0.0-rc.5849

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +46 -38
  2. app-ng-runtime/build-task/esm2022/basic/default/anchor/anchor.build.mjs +2 -2
  3. app-ng-runtime/build-task/esm2022/basic/default/html/html.build.mjs +2 -2
  4. app-ng-runtime/build-task/esm2022/basic/default/icon/icon.build.mjs +2 -2
  5. app-ng-runtime/build-task/esm2022/basic/default/label/label.build.mjs +2 -2
  6. app-ng-runtime/build-task/esm2022/basic/default/picture/picture.build.mjs +2 -2
  7. app-ng-runtime/build-task/esm2022/basic/default/spinner/spinner.build.mjs +2 -2
  8. app-ng-runtime/build-task/esm2022/basic/progress/progress-circle/progress-circle.build.mjs +7 -2
  9. app-ng-runtime/build-task/esm2022/basic/rich-text-editor/rich-text-editor.build.mjs +2 -2
  10. app-ng-runtime/build-task/esm2022/containers/tile/tile.build.mjs +2 -2
  11. app-ng-runtime/build-task/esm2022/data/form/form-field/form-field.build.mjs +2 -2
  12. app-ng-runtime/build-task/esm2022/device/barcode-scanner/barcode-scanner.build.mjs +2 -2
  13. app-ng-runtime/build-task/esm2022/device/camera/camera.build.mjs +2 -2
  14. app-ng-runtime/build-task/esm2022/dialogs/alert-dialog/alert-dialog.build.mjs +2 -2
  15. app-ng-runtime/build-task/esm2022/input/calendar/calendar.build.mjs +2 -2
  16. app-ng-runtime/build-task/esm2022/input/color-picker/color-picker.build.mjs +3 -3
  17. app-ng-runtime/build-task/esm2022/input/currency/currency.build.mjs +3 -3
  18. app-ng-runtime/build-task/esm2022/input/default/button/button.build.mjs +2 -2
  19. app-ng-runtime/build-task/esm2022/input/default/button-group/button-group.build.mjs +2 -2
  20. app-ng-runtime/build-task/esm2022/input/default/switch/switch.build.mjs +2 -2
  21. app-ng-runtime/build-task/esm2022/input/file-upload/file-upload.build.mjs +5 -1
  22. app-ng-runtime/build-task/esm2022/page/footer/footer.build.mjs +2 -2
  23. app-ng-runtime/build-task/esm2022/page/header/header.build.mjs +2 -2
  24. app-ng-runtime/build-task/esm2022/page/layout.build.mjs +2 -2
  25. app-ng-runtime/build-task/esm2022/page/left-panel/left-panel.build.mjs +2 -2
  26. app-ng-runtime/build-task/esm2022/page/page.build.mjs +2 -2
  27. app-ng-runtime/build-task/esm2022/page/right-panel/right-panel.build.mjs +2 -2
  28. app-ng-runtime/build-task/esm2022/page/top-nav/top-nav.build.mjs +2 -2
  29. app-ng-runtime/build-task/fesm2022/index.mjs +46 -38
  30. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  31. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +1 -1
  32. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +2 -2
  33. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +1 -1
  34. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  35. app-ng-runtime/components/base/bundles/index.umd.js +1 -1
  36. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +3 -3
  37. app-ng-runtime/components/base/fesm2022/index.mjs +1 -1
  38. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  39. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  40. app-ng-runtime/components/basic/default/anchor/anchor.component.d.ts +1 -0
  41. app-ng-runtime/components/basic/default/audio/audio.component.d.ts +1 -0
  42. app-ng-runtime/components/basic/default/bundles/index.umd.js +27 -18
  43. app-ng-runtime/components/basic/default/esm2022/anchor/anchor.component.mjs +4 -4
  44. app-ng-runtime/components/basic/default/esm2022/anchor/anchor.props.mjs +2 -1
  45. app-ng-runtime/components/basic/default/esm2022/audio/audio.component.mjs +5 -5
  46. app-ng-runtime/components/basic/default/esm2022/audio/audio.props.mjs +2 -1
  47. app-ng-runtime/components/basic/default/esm2022/html/html.props.mjs +2 -1
  48. app-ng-runtime/components/basic/default/esm2022/icon/icon.component.mjs +6 -7
  49. app-ng-runtime/components/basic/default/esm2022/icon/icon.props.mjs +2 -1
  50. app-ng-runtime/components/basic/default/esm2022/iframe/iframe.component.mjs +3 -3
  51. app-ng-runtime/components/basic/default/esm2022/iframe/iframe.props.mjs +3 -2
  52. app-ng-runtime/components/basic/default/esm2022/label/label.props.mjs +1 -1
  53. app-ng-runtime/components/basic/default/esm2022/picture/picture.directive.mjs +2 -2
  54. app-ng-runtime/components/basic/default/esm2022/picture/picture.props.mjs +3 -1
  55. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.props.mjs +3 -2
  56. app-ng-runtime/components/basic/default/esm2022/video/video.component.mjs +5 -4
  57. app-ng-runtime/components/basic/default/esm2022/video/video.props.mjs +2 -1
  58. app-ng-runtime/components/basic/default/fesm2022/index.mjs +27 -18
  59. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  60. app-ng-runtime/components/basic/default/icon/icon.component.d.ts +1 -0
  61. app-ng-runtime/components/basic/default/iframe/iframe.component.d.ts +1 -0
  62. app-ng-runtime/components/basic/default/picture/picture.directive.d.ts +2 -1
  63. app-ng-runtime/components/basic/default/video/video.component.d.ts +1 -0
  64. app-ng-runtime/components/basic/progress/bundles/index.umd.js +12 -8
  65. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +4 -4
  66. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.props.mjs +2 -1
  67. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +8 -6
  68. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.props.mjs +2 -1
  69. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +12 -8
  70. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  71. app-ng-runtime/components/basic/progress/progress-bar/progress-bar.component.d.ts +1 -0
  72. app-ng-runtime/components/basic/progress/progress-circle/progress-circle.component.d.ts +3 -1
  73. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +2 -0
  74. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +2 -1
  75. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.props.mjs +2 -1
  76. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +2 -0
  77. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  78. app-ng-runtime/components/basic/search/bundles/index.umd.js +11 -9
  79. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +14 -13
  80. app-ng-runtime/components/basic/search/esm2022/search.props.mjs +2 -1
  81. app-ng-runtime/components/basic/search/fesm2022/index.mjs +11 -9
  82. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  83. app-ng-runtime/components/basic/search/search.component.d.ts +1 -0
  84. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +3 -3
  85. app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.component.mjs +4 -4
  86. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +3 -3
  87. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  88. app-ng-runtime/components/containers/panel/bundles/index.umd.js +14 -14
  89. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +15 -15
  90. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +14 -14
  91. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  92. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +2 -2
  93. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +3 -3
  94. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +2 -2
  95. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  96. app-ng-runtime/components/data/live-table/bundles/index.umd.js +2 -2
  97. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +3 -3
  98. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +2 -2
  99. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  100. app-ng-runtime/components/data/pagination/bundles/index.umd.js +2 -0
  101. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +3 -1
  102. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +2 -0
  103. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  104. app-ng-runtime/components/data/table/bundles/index.umd.js +42 -8
  105. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +14 -5
  106. app-ng-runtime/components/data/table/esm2022/table.component.mjs +28 -5
  107. app-ng-runtime/components/data/table/esm2022/table.props.mjs +3 -1
  108. app-ng-runtime/components/data/table/fesm2022/index.mjs +43 -9
  109. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  110. app-ng-runtime/components/data/table/table.component.d.ts +7 -0
  111. app-ng-runtime/components/dialogs/alert-dialog/bundles/index.umd.js +6 -4
  112. app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.component.mjs +7 -5
  113. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs +6 -4
  114. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs.map +1 -1
  115. app-ng-runtime/components/dialogs/confirm-dialog/bundles/index.umd.js +8 -5
  116. app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.component.mjs +9 -6
  117. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs +8 -5
  118. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs.map +1 -1
  119. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +9 -3
  120. app-ng-runtime/components/dialogs/default/dialog-header/dialog-header.component.d.ts +2 -1
  121. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +2 -1
  122. app-ng-runtime/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +9 -4
  123. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +9 -3
  124. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  125. app-ng-runtime/components/dialogs/design-dialog/bundles/index.umd.js +4 -4
  126. app-ng-runtime/components/dialogs/design-dialog/esm2022/dialog.component.mjs +5 -5
  127. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs +4 -4
  128. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
  129. app-ng-runtime/components/dialogs/iframe-dialog/bundles/index.umd.js +9 -5
  130. app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +10 -6
  131. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs +9 -5
  132. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
  133. app-ng-runtime/components/dialogs/partial-dialog/bundles/index.umd.js +9 -5
  134. app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +10 -6
  135. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs +9 -5
  136. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
  137. app-ng-runtime/components/input/calendar/bundles/index.umd.js +2 -4
  138. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +3 -5
  139. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +2 -4
  140. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  141. app-ng-runtime/components/input/chips/bundles/index.umd.js +3 -2
  142. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +3 -3
  143. app-ng-runtime/components/input/chips/esm2022/chips.props.mjs +2 -1
  144. app-ng-runtime/components/input/chips/fesm2022/index.mjs +3 -2
  145. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  146. app-ng-runtime/components/input/color-picker/bundles/index.umd.js +5 -3
  147. app-ng-runtime/components/input/color-picker/color-picker.component.d.ts +1 -0
  148. app-ng-runtime/components/input/color-picker/esm2022/color-picker.component.mjs +6 -5
  149. app-ng-runtime/components/input/color-picker/esm2022/color-picker.props.mjs +2 -1
  150. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs +5 -3
  151. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs.map +1 -1
  152. app-ng-runtime/components/input/currency/bundles/index.umd.js +4 -3
  153. app-ng-runtime/components/input/currency/currency.component.d.ts +1 -0
  154. app-ng-runtime/components/input/currency/esm2022/currency.component.mjs +6 -6
  155. app-ng-runtime/components/input/currency/esm2022/currency.props.mjs +2 -1
  156. app-ng-runtime/components/input/currency/fesm2022/index.mjs +4 -3
  157. app-ng-runtime/components/input/currency/fesm2022/index.mjs.map +1 -1
  158. app-ng-runtime/components/input/default/bundles/index.umd.js +153 -92
  159. app-ng-runtime/components/input/default/button/button.component.d.ts +1 -0
  160. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
  161. app-ng-runtime/components/input/default/esm2022/button/button.component.mjs +1 -1
  162. app-ng-runtime/components/input/default/esm2022/button/button.props.mjs +2 -1
  163. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +8 -7
  164. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +7 -7
  165. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.props.mjs +2 -1
  166. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +21 -16
  167. app-ng-runtime/components/input/default/esm2022/number/number.component.mjs +5 -5
  168. app-ng-runtime/components/input/default/esm2022/number/number.props.mjs +3 -1
  169. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +28 -23
  170. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +7 -7
  171. app-ng-runtime/components/input/default/esm2022/select/select.props.mjs +2 -1
  172. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
  173. app-ng-runtime/components/input/default/esm2022/switch/switch.props.mjs +2 -1
  174. app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.component.mjs +5 -5
  175. app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.props.mjs +2 -1
  176. app-ng-runtime/components/input/default/esm2022/text/color/input-color.component.mjs +5 -5
  177. app-ng-runtime/components/input/default/esm2022/text/color/input-color.props.mjs +2 -1
  178. app-ng-runtime/components/input/default/esm2022/text/email/input-email.component.mjs +5 -5
  179. app-ng-runtime/components/input/default/esm2022/text/email/input-email.props.mjs +2 -1
  180. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +50 -13
  181. app-ng-runtime/components/input/default/esm2022/text/number/input-number.component.mjs +5 -5
  182. app-ng-runtime/components/input/default/esm2022/text/number/input-number.props.mjs +2 -1
  183. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +5 -5
  184. app-ng-runtime/components/input/default/esm2022/text/text/input-text.props.mjs +2 -1
  185. app-ng-runtime/components/input/default/esm2022/textarea/textarea.component.mjs +6 -6
  186. app-ng-runtime/components/input/default/esm2022/textarea/textarea.props.mjs +2 -1
  187. app-ng-runtime/components/input/default/fesm2022/index.mjs +153 -92
  188. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  189. app-ng-runtime/components/input/default/number/number.component.d.ts +1 -0
  190. app-ng-runtime/components/input/default/select/select.component.d.ts +2 -0
  191. app-ng-runtime/components/input/default/text/calendar/input-calendar.component.d.ts +1 -0
  192. app-ng-runtime/components/input/default/text/color/input-color.component.d.ts +1 -0
  193. app-ng-runtime/components/input/default/text/email/input-email.component.d.ts +1 -0
  194. app-ng-runtime/components/input/default/text/locale/number-locale.d.ts +1 -0
  195. app-ng-runtime/components/input/default/text/number/input-number.component.d.ts +1 -0
  196. app-ng-runtime/components/input/default/text/text/input-text.component.d.ts +1 -0
  197. app-ng-runtime/components/input/default/textarea/textarea.component.d.ts +1 -0
  198. app-ng-runtime/components/input/epoch/bundles/index.umd.js +12 -9
  199. app-ng-runtime/components/input/epoch/date/date.component.d.ts +1 -0
  200. app-ng-runtime/components/input/epoch/date-time/date-time.component.d.ts +2 -1
  201. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +6 -6
  202. app-ng-runtime/components/input/epoch/esm2022/date/date.props.mjs +2 -1
  203. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +7 -7
  204. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.props.mjs +2 -1
  205. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +7 -7
  206. app-ng-runtime/components/input/epoch/esm2022/time/time.props.mjs +2 -1
  207. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +12 -9
  208. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  209. app-ng-runtime/components/input/epoch/time/time.component.d.ts +1 -0
  210. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +187 -100
  211. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +184 -102
  212. app-ng-runtime/components/input/file-upload/esm2022/file-upload.props.mjs +6 -1
  213. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +187 -100
  214. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  215. app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +12 -10
  216. app-ng-runtime/components/input/slider/bundles/index.umd.js +5 -6
  217. app-ng-runtime/components/input/slider/esm2022/slider.component.mjs +6 -8
  218. app-ng-runtime/components/input/slider/esm2022/slider.props.mjs +2 -1
  219. app-ng-runtime/components/input/slider/fesm2022/index.mjs +5 -6
  220. app-ng-runtime/components/input/slider/fesm2022/index.mjs.map +1 -1
  221. app-ng-runtime/components/input/slider/slider.component.d.ts +1 -0
  222. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +8 -6
  223. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
  224. app-ng-runtime/components/navigation/menu/esm2022/menu.props.mjs +2 -1
  225. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +8 -6
  226. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  227. app-ng-runtime/components/navigation/menu/menu.component.d.ts +1 -0
  228. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +121 -13
  229. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +122 -15
  230. app-ng-runtime/components/navigation/popover/esm2022/popover.props.mjs +2 -1
  231. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +121 -13
  232. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  233. app-ng-runtime/components/navigation/popover/popover.component.d.ts +15 -3
  234. app-ng-runtime/components/page/default/bundles/index.umd.js +2 -1
  235. app-ng-runtime/components/page/default/esm2022/page.props.mjs +4 -3
  236. app-ng-runtime/components/page/default/fesm2022/index.mjs +2 -1
  237. app-ng-runtime/components/page/default/fesm2022/index.mjs.map +1 -1
  238. app-ng-runtime/components/page/footer/bundles/index.umd.js +2 -1
  239. app-ng-runtime/components/page/footer/esm2022/footer.props.mjs +3 -2
  240. app-ng-runtime/components/page/footer/fesm2022/index.mjs +2 -1
  241. app-ng-runtime/components/page/footer/fesm2022/index.mjs.map +1 -1
  242. app-ng-runtime/components/page/header/bundles/index.umd.js +2 -1
  243. app-ng-runtime/components/page/header/esm2022/header.props.mjs +3 -2
  244. app-ng-runtime/components/page/header/fesm2022/index.mjs +2 -1
  245. app-ng-runtime/components/page/header/fesm2022/index.mjs.map +1 -1
  246. app-ng-runtime/components/page/left-panel/bundles/index.umd.js +2 -1
  247. app-ng-runtime/components/page/left-panel/esm2022/left-panel.props.mjs +3 -2
  248. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs +2 -1
  249. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs.map +1 -1
  250. app-ng-runtime/components/page/right-panel/bundles/index.umd.js +2 -1
  251. app-ng-runtime/components/page/right-panel/esm2022/right-panel.props.mjs +3 -2
  252. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs +2 -1
  253. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs.map +1 -1
  254. app-ng-runtime/components/page/top-nav/bundles/index.umd.js +2 -1
  255. app-ng-runtime/components/page/top-nav/esm2022/top-nav.props.mjs +3 -2
  256. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs +2 -1
  257. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs.map +1 -1
  258. app-ng-runtime/core/bundles/index.umd.js +15 -13
  259. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  260. app-ng-runtime/core/esm2022/utils/build-utils.mjs +7 -7
  261. app-ng-runtime/core/esm2022/utils/utils.mjs +4 -5
  262. app-ng-runtime/core/fesm2022/index.mjs +11 -11
  263. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  264. app-ng-runtime/core/public_api.d.ts +1 -1
  265. app-ng-runtime/core/utils/utils.d.ts +1 -1
  266. app-ng-runtime/mobile/components/device/barcode-scanner/bundles/index.umd.js +2 -1
  267. app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.props.mjs +3 -2
  268. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs +2 -1
  269. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs.map +1 -1
  270. app-ng-runtime/mobile/components/device/camera/bundles/index.umd.js +2 -1
  271. app-ng-runtime/mobile/components/device/camera/esm2022/camera.props.mjs +3 -2
  272. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs +2 -1
  273. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs.map +1 -1
  274. app-ng-runtime/package.json +1 -1
  275. app-ng-runtime/runtime/base/bundles/index.umd.js +6 -4
  276. app-ng-runtime/runtime/base/components/app-component/app.component.d.ts +2 -3
  277. app-ng-runtime/runtime/base/esm2022/components/app-component/app.component.mjs +5 -5
  278. app-ng-runtime/runtime/base/esm2022/guards/can-deactivate-page.guard.mjs +5 -4
  279. app-ng-runtime/runtime/base/fesm2022/index.mjs +6 -4
  280. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  281. app-ng-runtime/runtime/base/guards/can-deactivate-page.guard.d.ts +2 -1
  282. app-ng-runtime/scripts/datatable/datatable.js +23 -26
@@ -1,6 +1,6 @@
1
1
  import { Attribute, Component, Inject, Injector, Optional } from '@angular/core';
2
2
  import { Subject } from 'rxjs';
3
- import { App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile } from '@wm/core';
3
+ import { App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile, AbstractDialogService } from '@wm/core';
4
4
  import { provideAsWidgetRef, StylableComponent, styler } from '@wm/components/base';
5
5
  import { registerProps } from './file-upload.props';
6
6
  import { forEach, includes, isEmpty, toLower } from "lodash-es";
@@ -14,7 +14,7 @@ const _c2 = (a0, a1) => ({ height: a0, overflow: a1 });
14
14
  const _c3 = a0 => ({ width: a0 });
15
15
  function FileUploadComponent_div_1_input_6_Template(rf, ctx) { if (rf & 1) {
16
16
  const _r3 = i0.ɵɵgetCurrentView();
17
- i0.ɵɵelementStart(0, "input", 13);
17
+ i0.ɵɵelementStart(0, "input", 15);
18
18
  i0.ɵɵlistener("click", function FileUploadComponent_div_1_input_6_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_1_input_6_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
19
19
  i0.ɵɵelementEnd();
20
20
  } if (rf & 2) {
@@ -22,6 +22,23 @@ function FileUploadComponent_div_1_input_6_Template(rf, ctx) { if (rf & 1) {
22
22
  i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
23
23
  i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
24
24
  } }
25
+ function FileUploadComponent_div_1_label_9_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelement(0, "label", 16);
27
+ } if (rf & 2) {
28
+ const ctx_r1 = i0.ɵɵnextContext(2);
29
+ i0.ɵɵproperty("innerHtml", ctx_r1.chooseFilter + " only ", i0.ɵɵsanitizeHtml);
30
+ } }
31
+ function FileUploadComponent_div_1_span_10_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelementStart(0, "span", 17);
33
+ i0.ɵɵtext(1, " . ");
34
+ i0.ɵɵelementEnd();
35
+ } }
36
+ function FileUploadComponent_div_1_label_11_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelement(0, "label", 16);
38
+ } if (rf & 2) {
39
+ const ctx_r1 = i0.ɵɵnextContext(2);
40
+ i0.ɵɵproperty("innerHtml", ctx_r1.maxfilesize + "MB max", i0.ɵɵsanitizeHtml);
41
+ } }
25
42
  function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
26
43
  const _r1 = i0.ɵɵgetCurrentView();
27
44
  i0.ɵɵelementStart(0, "div", 6)(1, "div", 7);
@@ -33,11 +50,13 @@ function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
33
50
  i0.ɵɵtemplate(6, FileUploadComponent_div_1_input_6_Template, 1, 3, "input", 11);
34
51
  i0.ɵɵelementStart(7, "a", 12);
35
52
  i0.ɵɵtext(8);
36
- i0.ɵɵelementEnd()()()()();
53
+ i0.ɵɵelementEnd()();
54
+ i0.ɵɵtemplate(9, FileUploadComponent_div_1_label_9_Template, 1, 1, "label", 13)(10, FileUploadComponent_div_1_span_10_Template, 2, 0, "span", 14)(11, FileUploadComponent_div_1_label_11_Template, 1, 1, "label", 13);
55
+ i0.ɵɵelementEnd()()();
37
56
  } if (rf & 2) {
38
57
  const ctx_r1 = i0.ɵɵnextContext();
39
58
  i0.ɵɵadvance();
40
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(8, _c1, ctx_r1.highlightDropArea));
59
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c1, ctx_r1.highlightDropArea));
41
60
  i0.ɵɵadvance();
42
61
  i0.ɵɵclassMap(ctx_r1.iconclass);
43
62
  i0.ɵɵadvance(2);
@@ -48,34 +67,40 @@ function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
48
67
  i0.ɵɵproperty("ngIf", ctx_r1.multiple);
49
68
  i0.ɵɵadvance(2);
50
69
  i0.ɵɵtextInterpolate(ctx_r1.fileUploadMessage);
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵproperty("ngIf", ctx_r1.chooseFilter);
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵproperty("ngIf", ctx_r1.chooseFilter && ctx_r1.maxfilesize);
74
+ i0.ɵɵadvance();
75
+ i0.ɵɵproperty("ngIf", ctx_r1.maxfilesize);
51
76
  } }
52
77
  function FileUploadComponent_div_2_input_3_Template(rf, ctx) { if (rf & 1) {
53
78
  const _r4 = i0.ɵɵgetCurrentView();
54
- i0.ɵɵelementStart(0, "input", 13);
55
- i0.ɵɵlistener("click", function FileUploadComponent_div_2_input_3_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_2_input_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
79
+ i0.ɵɵelementStart(0, "input", 26);
80
+ i0.ɵɵlistener("change", function FileUploadComponent_div_2_input_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); })("click", function FileUploadComponent_div_2_input_3_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); });
56
81
  i0.ɵɵelementEnd();
57
82
  } if (rf & 2) {
58
83
  const ctx_r1 = i0.ɵɵnextContext(2);
59
- i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
60
- i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
84
+ i0.ɵɵproperty("accept", ctx_r1.chooseFilter)("disabled", ctx_r1.disabled);
85
+ i0.ɵɵattribute("aria-label", ctx_r1.arialabel || "File selection field");
61
86
  } }
62
87
  function FileUploadComponent_div_2_input_4_Template(rf, ctx) { if (rf & 1) {
63
88
  const _r5 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "input", 21);
65
- i0.ɵɵlistener("click", function FileUploadComponent_div_2_input_4_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_2_input_4_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
89
+ i0.ɵɵelementStart(0, "input", 27);
90
+ i0.ɵɵlistener("change", function FileUploadComponent_div_2_input_4_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); })("click", function FileUploadComponent_div_2_input_4_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); });
66
91
  i0.ɵɵelementEnd();
67
92
  } if (rf & 2) {
68
93
  const ctx_r1 = i0.ɵɵnextContext(2);
69
- i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
70
- i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
94
+ i0.ɵɵproperty("accept", ctx_r1.chooseFilter)("disabled", ctx_r1.disabled);
95
+ i0.ɵɵattribute("aria-label", ctx_r1.arialabel || "File selection field");
71
96
  } }
72
97
  function FileUploadComponent_div_2_Template(rf, ctx) { if (rf & 1) {
73
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 15)(2, "form", 10);
74
- i0.ɵɵtemplate(3, FileUploadComponent_div_2_input_3_Template, 1, 3, "input", 11)(4, FileUploadComponent_div_2_input_4_Template, 1, 3, "input", 16);
75
- i0.ɵɵelementStart(5, "button", 17);
76
- i0.ɵɵelement(6, "i", 18)(7, "span", 19);
98
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 19)(2, "form", 10);
99
+ i0.ɵɵtemplate(3, FileUploadComponent_div_2_input_3_Template, 1, 3, "input", 20)(4, FileUploadComponent_div_2_input_4_Template, 1, 3, "input", 21);
100
+ i0.ɵɵelementStart(5, "button", 22);
101
+ i0.ɵɵelement(6, "i", 23)(7, "span", 24);
77
102
  i0.ɵɵelementEnd()()();
78
- i0.ɵɵelement(8, "div", 20);
103
+ i0.ɵɵelement(8, "div", 25);
79
104
  i0.ɵɵelementEnd();
80
105
  } if (rf & 2) {
81
106
  const ctx_r1 = i0.ɵɵnextContext();
@@ -94,9 +119,9 @@ function FileUploadComponent_div_2_Template(rf, ctx) { if (rf & 1) {
94
119
  } }
95
120
  function FileUploadComponent_button_3_Template(rf, ctx) { if (rf & 1) {
96
121
  const _r6 = i0.ɵɵgetCurrentView();
97
- i0.ɵɵelementStart(0, "button", 22);
122
+ i0.ɵɵelementStart(0, "button", 28);
98
123
  i0.ɵɵlistener("click", function FileUploadComponent_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openFileSelector()); });
99
- i0.ɵɵelement(1, "i")(2, "span", 19);
124
+ i0.ɵɵelement(1, "i")(2, "span", 24);
100
125
  i0.ɵɵelementEnd();
101
126
  } if (rf & 2) {
102
127
  const ctx_r1 = i0.ɵɵnextContext();
@@ -106,8 +131,15 @@ function FileUploadComponent_button_3_Template(rf, ctx) { if (rf & 1) {
106
131
  i0.ɵɵadvance();
107
132
  i0.ɵɵproperty("innerHTML", ctx_r1.caption, i0.ɵɵsanitizeHtml);
108
133
  } }
109
- function FileUploadComponent_ul_4_div_1_li_1_span_9_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelementStart(0, "span", 36);
134
+ function FileUploadComponent_ul_4_div_1_li_1_span_8_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelement(0, "span");
136
+ i0.ɵɵpipe(1, "stateClass");
137
+ } if (rf & 2) {
138
+ const ft_r7 = i0.ɵɵnextContext(2).$implicit;
139
+ i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(1, 3, ft_r7.status), "");
140
+ } }
141
+ function FileUploadComponent_ul_4_div_1_li_1_span_10_Template(rf, ctx) { if (rf & 1) {
142
+ i0.ɵɵelementStart(0, "span", 47);
111
143
  i0.ɵɵtext(1);
112
144
  i0.ɵɵpipe(2, "filesize");
113
145
  i0.ɵɵelementEnd();
@@ -116,95 +148,113 @@ function FileUploadComponent_ul_4_div_1_li_1_span_9_Template(rf, ctx) { if (rf &
116
148
  i0.ɵɵadvance();
117
149
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ft_r7.size, 0));
118
150
  } }
119
- function FileUploadComponent_ul_4_div_1_li_1_div_10_Template(rf, ctx) { if (rf & 1) {
120
- i0.ɵɵelementStart(0, "div", 37);
121
- i0.ɵɵelement(1, "div", 38);
151
+ function FileUploadComponent_ul_4_div_1_li_1_span_11_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelement(0, "span", 34);
153
+ i0.ɵɵpipe(1, "stateClass");
154
+ } if (rf & 2) {
155
+ const ft_r7 = i0.ɵɵnextContext(2).$implicit;
156
+ const ctx_r1 = i0.ɵɵnextContext(2);
157
+ i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(1, 4, ft_r7.status), "");
158
+ i0.ɵɵpropertyInterpolate("title", ft_r7.errMsg || ctx_r1.appLocale.MESSAGE_FILE_UPLOAD_FAILED);
159
+ } }
160
+ function FileUploadComponent_ul_4_div_1_li_1_span_12_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "span", 48);
162
+ i0.ɵɵtext(1, "Upload Failed");
163
+ i0.ɵɵelementEnd();
164
+ } }
165
+ function FileUploadComponent_ul_4_div_1_li_1_div_13_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵelementStart(0, "div", 49);
167
+ i0.ɵɵelement(1, "div", 50);
122
168
  i0.ɵɵelementEnd();
123
169
  } if (rf & 2) {
124
170
  const ft_r7 = i0.ɵɵnextContext(2).$implicit;
125
171
  i0.ɵɵadvance();
126
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(1, _c3, ft_r7.progress + "%"));
172
+ i0.ɵɵproperty("ngClass", ft_r7.status === "error" ? "progress-bar-danger" : "progress-bar-info")("ngStyle", i0.ɵɵpureFunction1(2, _c3, ft_r7.progress + "%"));
127
173
  } }
128
- function FileUploadComponent_ul_4_div_1_li_1_div_11_Template(rf, ctx) { if (rf & 1) {
129
- const _r8 = i0.ɵɵgetCurrentView();
130
- i0.ɵɵelementStart(0, "div", 39)(1, "a", 40);
131
- i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_11_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r8); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.abortFileUpload(ft_r7)); });
132
- i0.ɵɵelement(2, "i", 41);
133
- i0.ɵɵelementEnd()();
134
- } }
135
- function FileUploadComponent_ul_4_div_1_li_1_div_12_Template(rf, ctx) { if (rf & 1) {
136
- i0.ɵɵelementStart(0, "div", 39);
137
- i0.ɵɵelement(1, "span");
138
- i0.ɵɵpipe(2, "stateClass");
174
+ function FileUploadComponent_ul_4_div_1_li_1_div_14_Template(rf, ctx) { if (rf & 1) {
175
+ i0.ɵɵelementStart(0, "div", 51);
176
+ i0.ɵɵtext(1);
139
177
  i0.ɵɵelementEnd();
140
178
  } if (rf & 2) {
141
179
  const ft_r7 = i0.ɵɵnextContext(2).$implicit;
142
180
  i0.ɵɵadvance();
143
- i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(2, 3, ft_r7.status), "");
181
+ i0.ɵɵtextInterpolate1("", ft_r7.progress + "%", " ");
144
182
  } }
145
- function FileUploadComponent_ul_4_div_1_li_1_div_13_Template(rf, ctx) { if (rf & 1) {
146
- const _r9 = i0.ɵɵgetCurrentView();
147
- i0.ɵɵelementStart(0, "div", 39)(1, "a", 42);
148
- i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_13_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r9); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clear(ft_r7)); });
149
- i0.ɵɵelement(2, "i");
183
+ function FileUploadComponent_ul_4_div_1_li_1_div_15_Template(rf, ctx) { if (rf & 1) {
184
+ const _r8 = i0.ɵɵgetCurrentView();
185
+ i0.ɵɵelementStart(0, "div", 45)(1, "a", 52);
186
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_15_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r8); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.abortFileUpload(ft_r7)); });
187
+ i0.ɵɵelement(2, "i", 53);
150
188
  i0.ɵɵelementEnd()();
189
+ } }
190
+ function FileUploadComponent_ul_4_div_1_li_1_a_17_Template(rf, ctx) { if (rf & 1) {
191
+ const _r9 = i0.ɵɵgetCurrentView();
192
+ i0.ɵɵelementStart(0, "a", 54);
193
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_a_17_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r9); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clear(ft_r7)); });
194
+ i0.ɵɵelement(1, "i");
195
+ i0.ɵɵelementEnd();
151
196
  } if (rf & 2) {
152
197
  const ctx_r1 = i0.ɵɵnextContext(4);
153
- i0.ɵɵadvance();
154
198
  i0.ɵɵpropertyInterpolate("title", ctx_r1.cleariconhint);
155
199
  i0.ɵɵadvance();
156
200
  i0.ɵɵclassMap(ctx_r1.cleariconclass);
157
201
  } }
158
- function FileUploadComponent_ul_4_div_1_li_1_div_14_Template(rf, ctx) { if (rf & 1) {
159
- i0.ɵɵelementStart(0, "div", 43);
160
- i0.ɵɵelement(1, "span");
161
- i0.ɵɵpipe(2, "stateClass");
162
- i0.ɵɵelementEnd();
163
- } if (rf & 2) {
164
- const ft_r7 = i0.ɵɵnextContext(2).$implicit;
165
- const ctx_r1 = i0.ɵɵnextContext(2);
166
- i0.ɵɵpropertyInterpolate("title", ft_r7.errMsg || ctx_r1.appLocale.MESSAGE_FILE_UPLOAD_FAILED);
167
- i0.ɵɵadvance();
168
- i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(2, 4, ft_r7.status), "");
202
+ function FileUploadComponent_ul_4_div_1_li_1_div_18_Template(rf, ctx) { if (rf & 1) {
203
+ const _r10 = i0.ɵɵgetCurrentView();
204
+ i0.ɵɵelementStart(0, "div", 45)(1, "a", 55);
205
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_18_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r10); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileDelete($event, ft_r7)); });
206
+ i0.ɵɵelement(2, "i", 56);
207
+ i0.ɵɵelementEnd()();
169
208
  } }
170
209
  function FileUploadComponent_ul_4_div_1_li_1_Template(rf, ctx) { if (rf & 1) {
171
- i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
172
- i0.ɵɵelement(2, "div", 28);
210
+ i0.ɵɵelementStart(0, "li", 32)(1, "div", 33);
211
+ i0.ɵɵelement(2, "div", 34);
173
212
  i0.ɵɵpipe(3, "fileIconClass");
174
- i0.ɵɵelementStart(4, "div", 29)(5, "p", 30)(6, "label", 31);
213
+ i0.ɵɵelementStart(4, "div", 35)(5, "p", 36)(6, "span", 37);
175
214
  i0.ɵɵtext(7);
176
215
  i0.ɵɵelementEnd();
177
- i0.ɵɵelement(8, "br");
178
- i0.ɵɵtemplate(9, FileUploadComponent_ul_4_div_1_li_1_span_9_Template, 3, 4, "span", 32);
216
+ i0.ɵɵtemplate(8, FileUploadComponent_ul_4_div_1_li_1_span_8_Template, 2, 5, "span", 38);
217
+ i0.ɵɵelement(9, "br");
218
+ i0.ɵɵtemplate(10, FileUploadComponent_ul_4_div_1_li_1_span_10_Template, 3, 4, "span", 39)(11, FileUploadComponent_ul_4_div_1_li_1_span_11_Template, 2, 6, "span", 40)(12, FileUploadComponent_ul_4_div_1_li_1_span_12_Template, 2, 0, "span", 41);
219
+ i0.ɵɵelementEnd();
220
+ i0.ɵɵtemplate(13, FileUploadComponent_ul_4_div_1_li_1_div_13_Template, 2, 4, "div", 42)(14, FileUploadComponent_ul_4_div_1_li_1_div_14_Template, 2, 1, "div", 43);
179
221
  i0.ɵɵelementEnd();
180
- i0.ɵɵtemplate(10, FileUploadComponent_ul_4_div_1_li_1_div_10_Template, 2, 3, "div", 33);
222
+ i0.ɵɵtemplate(15, FileUploadComponent_ul_4_div_1_li_1_div_15_Template, 3, 0, "div", 44);
223
+ i0.ɵɵelementStart(16, "div", 45);
224
+ i0.ɵɵtemplate(17, FileUploadComponent_ul_4_div_1_li_1_a_17_Template, 2, 4, "a", 46);
181
225
  i0.ɵɵelementEnd();
182
- i0.ɵɵtemplate(11, FileUploadComponent_ul_4_div_1_li_1_div_11_Template, 3, 0, "div", 34)(12, FileUploadComponent_ul_4_div_1_li_1_div_12_Template, 3, 5, "div", 34)(13, FileUploadComponent_ul_4_div_1_li_1_div_13_Template, 3, 4, "div", 34)(14, FileUploadComponent_ul_4_div_1_li_1_div_14_Template, 3, 6, "div", 35);
226
+ i0.ɵɵtemplate(18, FileUploadComponent_ul_4_div_1_li_1_div_18_Template, 3, 0, "div", 44);
183
227
  i0.ɵɵelementEnd()();
184
228
  } if (rf & 2) {
185
229
  const ft_r7 = i0.ɵɵnextContext().$implicit;
186
230
  const ctx_r1 = i0.ɵɵnextContext(2);
187
231
  i0.ɵɵadvance(2);
188
- i0.ɵɵclassMapInterpolate1("media-left media-middle file-icon ", i0.ɵɵpipeBind1(3, 11, ctx_r1.getFileExtension(ft_r7.name)), "");
232
+ i0.ɵɵclassMapInterpolate1("media-left media-middle file-icon ", i0.ɵɵpipeBind1(3, 14, ctx_r1.getFileExtension(ft_r7.name)), "");
189
233
  i0.ɵɵpropertyInterpolate("title", ctx_r1.getFileExtension(ft_r7.name));
190
234
  i0.ɵɵadvance(5);
191
- i0.ɵɵtextInterpolate(ft_r7.name);
235
+ i0.ɵɵtextInterpolate(ft_r7.storageName || ft_r7.name);
236
+ i0.ɵɵadvance();
237
+ i0.ɵɵproperty("ngIf", ft_r7.status === "success");
192
238
  i0.ɵɵadvance(2);
193
239
  i0.ɵɵproperty("ngIf", ft_r7.fileLength !== 0);
194
240
  i0.ɵɵadvance();
195
- i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress");
241
+ i0.ɵɵproperty("ngIf", ft_r7.status === "error");
196
242
  i0.ɵɵadvance();
197
- i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ft_r7.status === "queued");
243
+ i0.ɵɵproperty("ngIf", ft_r7.status === "error");
198
244
  i0.ɵɵadvance();
199
- i0.ɵɵproperty("ngIf", ft_r7.status === "success");
245
+ i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ctx_r1.showprogressbar);
246
+ i0.ɵɵadvance();
247
+ i0.ɵɵproperty("ngIf", (ft_r7.status === "onProgress" || ctx_r1.showprogressbar && ctx_r1.showprogressbarpercentage) && ft_r7.progress);
200
248
  i0.ɵɵadvance();
249
+ i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ft_r7.status === "queued");
250
+ i0.ɵɵadvance(2);
201
251
  i0.ɵɵproperty("ngIf", ctx_r1.cleariconclass !== "" && ft_r7.status !== "onProgress");
202
252
  i0.ɵɵadvance();
203
- i0.ɵɵproperty("ngIf", ft_r7.status === "error");
253
+ i0.ɵɵproperty("ngIf", ft_r7.status === "success");
204
254
  } }
205
255
  function FileUploadComponent_ul_4_div_1_Template(rf, ctx) { if (rf & 1) {
206
256
  i0.ɵɵelementStart(0, "div");
207
- i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_li_1_Template, 15, 13, "li", 25);
257
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_li_1_Template, 19, 16, "li", 31);
208
258
  i0.ɵɵelementEnd();
209
259
  } if (rf & 2) {
210
260
  const ft_r7 = ctx.$implicit;
@@ -212,34 +262,34 @@ function FileUploadComponent_ul_4_div_1_Template(rf, ctx) { if (rf & 1) {
212
262
  i0.ɵɵproperty("ngIf", ft_r7.status !== "abort");
213
263
  } }
214
264
  function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelementStart(0, "ul", 23);
216
- i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_Template, 2, 1, "div", 24);
265
+ i0.ɵɵelementStart(0, "ul", 29);
266
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_Template, 2, 1, "div", 30);
217
267
  i0.ɵɵelementEnd();
218
268
  } if (rf & 2) {
219
269
  const ctx_r1 = i0.ɵɵnextContext();
220
270
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
221
271
  i0.ɵɵadvance();
222
- i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
272
+ i0.ɵɵproperty("ngForOf", ctx_r1.uploadedFiles);
223
273
  } }
224
274
  function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
225
- i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
226
- i0.ɵɵelement(2, "div", 46);
227
- i0.ɵɵelementStart(3, "div", 29)(4, "p", 30)(5, "label", 31);
275
+ i0.ɵɵelementStart(0, "li", 32)(1, "div", 33);
276
+ i0.ɵɵelement(2, "div", 59);
277
+ i0.ɵɵelementStart(3, "div", 35)(4, "p", 60)(5, "label", 37);
228
278
  i0.ɵɵtext(6);
229
279
  i0.ɵɵelementEnd();
230
280
  i0.ɵɵelement(7, "br");
231
281
  i0.ɵɵelementEnd()();
232
- i0.ɵɵelementStart(8, "div", 39);
233
- i0.ɵɵelement(9, "span", 47);
282
+ i0.ɵɵelementStart(8, "div", 45);
283
+ i0.ɵɵelement(9, "span", 61);
234
284
  i0.ɵɵelementEnd()()();
235
285
  } if (rf & 2) {
236
- const ft_r10 = ctx.$implicit;
286
+ const ft_r11 = ctx.$implicit;
237
287
  i0.ɵɵadvance(6);
238
- i0.ɵɵtextInterpolate(ft_r10.name);
288
+ i0.ɵɵtextInterpolate(ft_r11.name);
239
289
  } }
240
290
  function FileUploadComponent_ul_5_Template(rf, ctx) { if (rf & 1) {
241
- i0.ɵɵelementStart(0, "ul", 44);
242
- i0.ɵɵtemplate(1, FileUploadComponent_ul_5_li_1_Template, 10, 1, "li", 45);
291
+ i0.ɵɵelementStart(0, "ul", 57);
292
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_5_li_1_Template, 10, 1, "li", 58);
243
293
  i0.ɵɵelementEnd();
244
294
  } if (rf & 2) {
245
295
  const ctx_r1 = i0.ɵɵnextContext();
@@ -356,8 +406,8 @@ export class FileUploadComponent extends StylableComponent {
356
406
  * @param $files
357
407
  */
358
408
  onSelectEventCall($event, $files) {
359
- this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
360
409
  this.selectedFiles = $files;
410
+ this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;
361
411
  setTimeout(() => {
362
412
  this.invokeEventCallback('select', {
363
413
  $event: $.extend($event.$files || {}, $files),
@@ -379,12 +429,11 @@ export class FileUploadComponent extends StylableComponent {
379
429
  }
380
430
  /*this function to clear the specified file. if argument is not provided, it clears the complete list */
381
431
  clear(fileObj) {
382
- if (this.multiple) {
383
- this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
384
- }
385
- else {
386
- this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
387
- }
432
+ this.selectedFiles = (fileObj) ? this.clearFile(this.selectedFiles, fileObj) : [];
433
+ this.uploadedFiles = (fileObj) ? this.clearFile(this.uploadedFiles, fileObj) : [];
434
+ }
435
+ clearFile(files, fileObj) {
436
+ return files.filter((file) => file?._response?.fileName !== fileObj?._response?.fileName || file?.name !== fileObj?.name || file !== fileObj);
388
437
  }
389
438
  /*this function to set the class names for clear icon */
390
439
  setClearIconClass(classValue) {
@@ -450,6 +499,44 @@ export class FileUploadComponent extends StylableComponent {
450
499
  }
451
500
  }
452
501
  }
502
+ onFileDelete($event, file) {
503
+ if (!file) {
504
+ return;
505
+ }
506
+ const beforeDeleteVal = this.invokeEventCallback('beforedelete', { $event: file });
507
+ if (beforeDeleteVal !== false) {
508
+ this.dialogService.showAppConfirmDialog({
509
+ title: "Delete file",
510
+ message: "Are you sure you want to delete this file?",
511
+ oktext: "Ok",
512
+ canceltext: "Cancel",
513
+ onOk: () => {
514
+ if (this.deletedatasource) {
515
+ this.deletedatasource.setInput('file', file._response.fileName || file.name);
516
+ this.deleteFileObservable = new Subject();
517
+ this.deletedatasource._deleteFileObservable = this.deleteFileObservable;
518
+ this.deletedatasource._deleteFileObservable.asObservable().subscribe((response) => {
519
+ if (response.status === "success") {
520
+ this.selectedFiles = this.selectedFiles.filter((fileObj) => file !== fileObj) || [];
521
+ this.uploadedFiles = this.uploadedFiles.filter((fileObj) => file !== fileObj) || [];
522
+ this.deletedatasource._deleteFileObservable.unsubscribe();
523
+ }
524
+ }, (error) => {
525
+ this.deletedatasource._deleteFileObservable.unsubscribe();
526
+ });
527
+ }
528
+ this.invokeEventCallback('delete', { $event: file });
529
+ this.dialogService.closeAppConfirmDialog();
530
+ },
531
+ onCancel: () => {
532
+ this.dialogService.closeAppConfirmDialog();
533
+ },
534
+ onOpen: () => {
535
+ $('.cancel-action').focus();
536
+ }
537
+ });
538
+ }
539
+ }
453
540
  // Prevent default behavior (Prevent file from being opened)
454
541
  dragOverHandler($event) {
455
542
  $event.preventDefault();
@@ -527,12 +614,13 @@ export class FileUploadComponent extends StylableComponent {
527
614
  }
528
615
  super.onPropertyChange(key, nv, ov);
529
616
  }
530
- constructor(inj, app, onSelectEvt, explicitContext) {
617
+ constructor(inj, app, onSelectEvt, dialogService, explicitContext) {
531
618
  super(inj, WIDGET_CONFIG, explicitContext);
532
619
  this.app = app;
533
620
  this.onSelectEvt = onSelectEvt;
621
+ this.dialogService = dialogService;
534
622
  this.selectedFiles = [];
535
- this.multipleSelectedFiles = [];
623
+ this.uploadedFiles = [];
536
624
  this.selectedFolders = [];
537
625
  this.fileTransfers = {};
538
626
  this.caption = 'Upload';
@@ -558,12 +646,6 @@ export class FileUploadComponent extends StylableComponent {
558
646
  this.defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);
559
647
  this.chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;
560
648
  this.fileUploadMessage = 'Drop your files here or click here to browse';
561
- this.uploadedFiles = {
562
- fileName: '',
563
- path: '',
564
- length: '',
565
- status: ''
566
- };
567
649
  this.uploadUrl = 'services';
568
650
  // styler(this.nativeElement, this);
569
651
  }
@@ -584,12 +666,12 @@ export class FileUploadComponent extends StylableComponent {
584
666
  document.removeEventListener('mouseleave', this.dropCb);
585
667
  super.ngOnDestroy();
586
668
  }
587
- static { this.ɵfac = function FileUploadComponent_Factory(t) { return new (t || FileUploadComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵinjectAttribute('select.event'), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
669
+ static { this.ɵfac = function FileUploadComponent_Factory(t) { return new (t || FileUploadComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵinjectAttribute('select.event'), i0.ɵɵdirectiveInject(i1.AbstractDialogService), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
588
670
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FileUploadComponent, selectors: [["", "wmFileUpload", ""]], features: [i0.ɵɵProvidersFeature([
589
671
  provideAsWidgetRef(FileUploadComponent)
590
- ]), i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 6, vars: 5, consts: [["init-widget", "", 1, "app-fileupload"], ["class", "app-multi-file-upload", 4, "ngIf"], ["class", "app-single-file-upload", 4, "ngIf"], ["focus-target", "", "class", "app-button btn btn-default", 3, "disabled", "click", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", "title", 4, "ngIf"], [1, "app-multi-file-upload"], ["id", "dropzone", 1, "drop-box", 3, "click", "dragover", "drop", "ngClass"], [1, "message"], [1, "caption", 3, "innerHtml"], [1, "form-horizontal", 3, "name"], ["class", "file-input", "type", "file", "name", "files", "multiple", "", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["href", "javascript:void(0);", 1, "app-anchor"], ["type", "file", "name", "files", "multiple", "", 1, "file-input", 3, "click", "change", "disabled", "accept"], [1, "app-single-file-upload"], [1, "app-button-wrapper"], ["class", "file-input", "type", "file", "name", "files", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["id", "dropzone", "focus-target", "", 1, "app-button", "btn", "btn-default", 3, "ngClass"], ["aria-hidden", "true"], [1, "caption", 3, "innerHTML"], [1, "app-files-upload-status", "single"], ["type", "file", "name", "files", 1, "file-input", 3, "click", "change", "disabled", "accept"], ["focus-target", "", 1, "app-button", "btn", "btn-default", 3, "click", "disabled"], [1, "list-group", "file-upload", 3, "ngStyle"], [4, "ngFor", "ngForOf"], ["class", "list-group-item file-upload-status", 4, "ngIf"], [1, "list-group-item", "file-upload-status"], [1, "media", "upload-file-list"], [3, "title"], [1, "media-body", "media-middle", "file-details"], [1, "uploaddetails"], [1, "upload-title"], ["class", "filesize", 4, "ngIf"], ["class", "progress", 4, "ngIf"], ["class", "media-right media-middle", 4, "ngIf"], ["class", "media-right media-middle", 3, "title", 4, "ngIf"], [1, "filesize"], [1, "progress"], [1, "progress-bar", "progress-bar-striped", "progress-bar-info", 3, "ngStyle"], [1, "media-right", "media-middle"], ["type", "button", 1, "btn", "btn-transparent", "file-upload-stop", 3, "click"], [1, "wi", "wi-close"], ["type", "button", 1, "btn", "btn-transparent", "btn-default", "status-icon", 3, "click", "title"], [1, "media-right", "media-middle", 3, "title"], [1, "list-group", "file-upload", 3, "ngStyle", "title"], ["class", "list-group-item file-upload-status", 4, "ngFor", "ngForOf"], [1, "media-left", "media-middle", "file-icon", "fa", "fa-folder-o"], [1, "status-icon", "wi", "wi-cancel", "text-danger"]], template: function FileUploadComponent_Template(rf, ctx) { if (rf & 1) {
672
+ ]), i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 6, vars: 5, consts: [["init-widget", "", 1, "app-fileupload"], ["class", "app-multi-file-upload", 4, "ngIf"], ["class", "app-single-file-upload", 4, "ngIf"], ["focus-target", "", "class", "app-button btn btn-default", 3, "disabled", "click", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", "title", 4, "ngIf"], [1, "app-multi-file-upload"], ["id", "dropzone", 1, "drop-box", 3, "click", "dragover", "drop", "ngClass"], [1, "message"], [1, "upload-label", 3, "innerHtml"], [1, "form-horizontal", 3, "name"], ["class", "file-input", "type", "file", "name", "files", "multiple", "", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["href", "javascript:void(0);", 1, "app-anchor", "upload-label"], ["class", "upload-extensions", 3, "innerHtml", 4, "ngIf"], ["class", "upload-extensions", 4, "ngIf"], ["type", "file", "name", "files", "multiple", "", 1, "file-input", 3, "click", "change", "disabled", "accept"], [1, "upload-extensions", 3, "innerHtml"], [1, "upload-extensions"], [1, "app-single-file-upload"], [1, "app-button-wrapper"], ["class", "file-input", "multiple", "", "name", "files", "type", "file", 3, "accept", "disabled", "change", "click", 4, "ngIf"], ["class", "file-input", "name", "files", "type", "file", 3, "accept", "disabled", "change", "click", 4, "ngIf"], ["id", "dropzone", "focus-target", "", 1, "app-button", "btn", "btn-default", 3, "ngClass"], ["aria-hidden", "true"], [1, "caption", 3, "innerHTML"], [1, "app-files-upload-status", "single"], ["multiple", "", "name", "files", "type", "file", 1, "file-input", 3, "change", "click", "accept", "disabled"], ["name", "files", "type", "file", 1, "file-input", 3, "change", "click", "accept", "disabled"], ["focus-target", "", 1, "app-button", "btn", "btn-default", 3, "click", "disabled"], [1, "list-group", "file-upload", 3, "ngStyle"], [4, "ngFor", "ngForOf"], ["class", "list-group-item file-upload-status", 4, "ngIf"], [1, "list-group-item", "file-upload-status"], [1, "media", "upload-file-list"], [3, "title"], [1, "media-body", "media-middle", "file-details"], [1, "uploaddetails", "col-md-3"], [1, "upload-title"], [3, "class", 4, "ngIf"], ["class", "filesize", 4, "ngIf"], [3, "class", "title", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], ["class", "progress col-md-7 upload-progress", 4, "ngIf"], ["class", "col-md-1 upload-progress-percentage", 4, "ngIf"], ["class", "media-right media-middle", 4, "ngIf"], [1, "media-right", "media-middle"], ["class", "btn btn-transparent btn-default status-icon", "type", "button", 3, "title", "click", 4, "ngIf"], [1, "filesize"], [1, "error-message"], [1, "progress", "col-md-7", "upload-progress"], [1, "progress-bar", "progress-bar-striped", 3, "ngClass", "ngStyle"], [1, "col-md-1", "upload-progress-percentage"], ["type", "button", 1, "btn", "btn-transparent", "file-upload-stop", 3, "click"], [1, "wi", "wi-close"], ["type", "button", 1, "btn", "btn-transparent", "btn-default", "status-icon", 3, "click", "title"], ["title", "delete", "type", "button", 1, "btn", "btn-transparent", "btn-default", "status-icon", 3, "click"], [1, "wi", "wi-delete"], [1, "list-group", "file-upload", 3, "ngStyle", "title"], ["class", "list-group-item file-upload-status", 4, "ngFor", "ngForOf"], [1, "media-left", "media-middle", "file-icon", "fa", "fa-folder-o"], [1, "uploaddetails"], [1, "status-icon", "wi", "wi-cancel", "text-danger"]], template: function FileUploadComponent_Template(rf, ctx) { if (rf & 1) {
591
673
  i0.ɵɵelementStart(0, "div", 0);
592
- i0.ɵɵtemplate(1, FileUploadComponent_div_1_Template, 9, 10, "div", 1)(2, FileUploadComponent_div_2_Template, 9, 10, "div", 2)(3, FileUploadComponent_button_3_Template, 3, 5, "button", 3)(4, FileUploadComponent_ul_4_Template, 2, 5, "ul", 4)(5, FileUploadComponent_ul_5_Template, 2, 6, "ul", 5);
674
+ i0.ɵɵtemplate(1, FileUploadComponent_div_1_Template, 12, 13, "div", 1)(2, FileUploadComponent_div_2_Template, 9, 10, "div", 2)(3, FileUploadComponent_button_3_Template, 3, 5, "button", 3)(4, FileUploadComponent_ul_4_Template, 2, 5, "ul", 4)(5, FileUploadComponent_ul_5_Template, 2, 6, "ul", 5);
593
675
  i0.ɵɵelementEnd();
594
676
  } if (rf & 2) {
595
677
  i0.ɵɵadvance();
@@ -599,7 +681,7 @@ export class FileUploadComponent extends StylableComponent {
599
681
  i0.ɵɵadvance();
600
682
  i0.ɵɵproperty("ngIf", ctx._isCordova);
601
683
  i0.ɵɵadvance();
602
- i0.ɵɵproperty("ngIf", ctx.selectedFiles.length > 0);
684
+ i0.ɵɵproperty("ngIf", ctx.uploadedFiles.length > 0);
603
685
  i0.ɵɵadvance();
604
686
  i0.ɵɵproperty("ngIf", ctx.selectedFolders.length > 0);
605
687
  } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i2.NgStyle, i3.FileIconClassPipe, i3.FileSizePipe, i3.StateClassPipe], encapsulation: 2 }); }
@@ -608,15 +690,15 @@ export class FileUploadComponent extends StylableComponent {
608
690
  type: Component,
609
691
  args: [{ selector: '[wmFileUpload]', providers: [
610
692
  provideAsWidgetRef(FileUploadComponent)
611
- ], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
693
+ ], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"upload-label\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\" *ngIf=\"multiple\"\n [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n multiple name=\"files\" type=\"file\">\n <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\" *ngIf=\"!multiple\"\n [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n name=\"files\" type=\"file\">\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"uploadedFiles.length > 0\" >\n <div *ngFor=\"let ft of uploadedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success'\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <a (click)=\"onFileDelete($event, ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"delete\" type=\"button\">\n <i class=\"wi wi-delete\"></i>\n </a>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
612
694
  }], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
613
695
  type: Attribute,
614
696
  args: ['select.event']
615
- }] }, { type: undefined, decorators: [{
697
+ }] }, { type: i1.AbstractDialogService }, { type: undefined, decorators: [{
616
698
  type: Inject,
617
699
  args: ['EXPLICIT_CONTEXT']
618
700
  }, {
619
701
  type: Optional
620
702
  }] }], null); })();
621
703
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileUploadComponent, { className: "FileUploadComponent", filePath: "file-upload.component.ts", lineNumber: 27 }); })();
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7OztJQUxoTCxBQURKLDhCQUFzRSxhQUMwSDtJQUE3QixBQUF0QyxBQUFyRiw0S0FBUywwQkFBbUIsS0FBQywyS0FBb0UsOEJBQXVCLEtBQUUsbUtBQVMseUJBQWtCLEtBQUU7SUFDdkws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d0M7WUF1RXBDLEFBcENBLEFBTEEsQUFmQSxBQWJBLHFFQUFzRSx3REFha0IsNkRBZXNDLHFEQUtBLHFEQW9DZ0U7WUFlbE0saUJBQU07O1lBcEZrQyxjQUFnQztZQUFoQyx5REFBZ0M7WUFhL0IsY0FBaUQ7WUFBakQsOEVBQWlEO1lBZTdFLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUtvRSxjQUE4QjtZQUE5QixtREFBOEI7WUFvQ2dDLGNBQWdDO1lBQWhDLHFEQUFnQzs7O2lGRDdDbEwsbUJBQW1CO2NBUi9CLFNBQVM7MkJBQ0ksZ0JBQWdCLGFBRWY7b0JBQ1Asa0JBQWtCLHFCQUFxQjtpQkFDMUM7O3NCQWtXNkMsU0FBUzt1QkFBQyxjQUFjOztzQkFBdUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQS9WeEgsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBcHAsIERhdGFTb3VyY2UsIGdldFdtUHJvamVjdFByb3BlcnRpZXMsIGlzQXVkaW9GaWxlLCBpc0ltYWdlRmlsZSwgaXNWaWRlb0ZpbGV9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7cHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2ZpbGUtdXBsb2FkLnByb3BzJztcbmltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIHRvTG93ZXJ9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtZmlsZXVwbG9hZCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1maWxldXBsb2FkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t3bUZpbGVVcGxvYWRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRmlsZVVwbG9hZENvbXBvbmVudClcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgc2VsZWN0ZWRGaWxlczogYW55ID0gW107XG4gICAgbXVsdGlwbGVTZWxlY3RlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICBzZWxlY3RlZEZvbGRlcnM6IGFueSA9IFtdO1xuICAgIHByb2dyZXNzT2JzZXJ2YWJsZTtcbiAgICBuYW1lO1xuICAgIGhpbnQ7XG4gICAgbXVsdGlwbGU7XG4gICAgZmlsZVRyYW5zZmVycyA9IHt9O1xuICAgIGNhcHRpb24gPSAnVXBsb2FkJztcbiAgICBmb3JtTmFtZSA9ICcnO1xuICAgIG1heGZpbGVzaXplO1xuICAgIGNsZWFyaWNvbmNsYXNzO1xuICAgIGNsZWFyaWNvbmhpbnQ7XG4gICAgc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aDtcbiAgICBERUZBVUxUX0NBUFRJT05TID0ge1xuICAgICAgICBNVUxUSVBMRV9TRUxFQ1Q6ICdEcm9wIHlvdXIgZmlsZXMgaGVyZS4nLFxuICAgICAgICBTRUxFQ1Q6ICdTZWxlY3QnXG4gICAgfTtcbiAgICBERVZJQ0VfQ09OVEVOVFRZUEVTID0ge1xuICAgICAgICBJTUFHRTogJ2ltYWdlJyxcbiAgICAgICAgVklERU86ICd2aWRlbycsXG4gICAgICAgIEFVRElPOiAnYXVkaW8nLFxuICAgICAgICBGSUxFUzogJ2ZpbGVzJ1xuICAgIH07XG4gICAgRklMRVNJWkVfTUIgPSAxMDQ4NTc2O1xuICAgIHdpZGdldFByb3BzO1xuICAgIF9pc01vYmlsZVR5cGU7XG4gICAgX2lzQ29yZG92YTtcbiAgICAvLyBwYXJlbnRQcmVmYWJTY29wZSA9IGVsZW1lbnQuY2xvc2VzdCgnLmFwcC1wcmVmYWInKS5pc29sYXRlU2NvcGUoKSxcbiAgICBDT05TVEFOVF9GSUxFX1NFUlZJQ0UgPSAnRmlsZVNlcnZpY2UnO1xuICAgIHVwbG9hZERhdGEgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXBsb2FkUGF0aDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBhbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zO1xuICAgIGRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucyA9IHRoaXMuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpLm1hcChpdGVtID0+IGl0ZW0uZW5kc1dpdGgoJy8qJykgPyBpdGVtIDogYC4ke2l0ZW19YCk7XG4gICAgY2hvb3NlRmlsdGVyID0gdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJyovKicpID8gJycgOiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucztcbiAgICBkYXRhc291cmNlO1xuICAgIGZpbGVVcGxvYWRNZXNzYWdlID0gJ0Ryb3AgeW91ciBmaWxlcyBoZXJlIG9yIGNsaWNrIGhlcmUgdG8gYnJvd3NlJztcbiAgICB1cGxvYWRlZEZpbGVzID0ge1xuICAgICAgICBmaWxlTmFtZTogJycsXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgICBsZW5ndGg6ICcnLFxuICAgICAgICBzdGF0dXM6ICcnXG4gICAgfTtcbiAgICBoaWdobGlnaHREcm9wQXJlYTtcbiAgICAvKl9oYXNPblN1Y2Nlc3NFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25TdWNjZXNzKTtcbiAgICAgX2hhc09uRXJyb3JFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25FcnJvcik7Ki9cblxuICAgIC8vIENoZWNraW5nIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIHZhbGlkIGZvciB0aGUgY2hvb3NlbiBmaWx0ZXIgdHlwZVxuICAgIGlzVmFsaWRGaWxlKGZpbGVuYW1lLCBjb250ZW50dHlwZSwgZXh0ZW5zaW9uTmFtZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGxldCBpc1ZhbGlkLCBjb250ZW50VHlwZXM7XG5cbiAgICAgICAgaWYgKCFjb250ZW50dHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudFR5cGVzID0gdG9Mb3dlcihjb250ZW50dHlwZSkuc3BsaXQoJywnKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UvKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdpbWFnZScpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0ltYWdlRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgaW1hZ2UgYW5kIHVzZXIgdXBsb2FkcyBpbWFnZSBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpby8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2F1ZGlvJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzQXVkaW9GaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyBhdWRpby8qIGFuZCB1c2VyIHVwbG9hZHMgYXVkaW8gaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICd2aWRlbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZpZGVvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgdmlkZW8vKiBhbmQgdXNlciB1cGxvYWRzIHZpZGVvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLypjb250ZW50IHR5cGUgYW5kIHRoZSB1cGxvYWRlZCBmaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUgc2FtZSovXG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICcuJyArIHRvTG93ZXIoZXh0ZW5zaW9uTmFtZSkpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICAvKiB0aGlzIHJldHVybiB0aGUgYXJyYXkgb2YgZmlsZXMgd2hpY2ggYXJlIGhhdmluZyB0aGUgZmlsZSBzaXplIG5vdCBtb3JlIHRoYW4gbWF4ZmlsZXNpemUgYW5kIGZpbHRlcnMgYmFzZWQgb24gY29udGVudHR5cGUgKi9cbiAgICBnZXRWYWxpZEZpbGVzKCRmaWxlcykge1xuICAgICAgICBjb25zdCB2YWxpZEZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yRmlsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTUFYRklMRVVQTE9BRF9TSVpFID0gcGFyc2VGbG9hdCh0aGlzLm1heGZpbGVzaXplKSAqIHRoaXMuRklMRVNJWkVfTUIgfHwgdGhpcy5GSUxFU0laRV9NQjtcbiAgICAgICAgY29uc3QgTUFYX0ZJTEVfVVBMT0FEX0ZPUk1BVFRFRF9TSVpFID0gKHRoaXMubWF4ZmlsZXNpemUgfHwgJzEnKSArICdNQic7XG5cbiAgICAgICAgLy8gaWYgY29udGVudHR5cGUgaXMgZmlsZXMgZm9yIG1vYmlsZSBwcm9qZWN0cy5cbiAgICAgICAgaWYgKHRoaXMuY2hvb3NlRmlsdGVyID09PSB0aGlzLkRFVklDRV9DT05URU5UVFlQRVMuRklMRVMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKCRmaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIC8qIGNoZWNrIGZvciB0aGUgZmlsZSBjb250ZW50IHR5cGUgYmVmb3JlIHVwbG9hZGluZyAqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRGaWxlKGZpbGUubmFtZSwgdGhpcy5jaG9vc2VGaWx0ZXIsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLm5hbWUpLCB0aGlzLl9pc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWFRFTlRJT05fVkFMSURBVElPTl9NRVNTQUdFfSAke3RoaXMuY2hvb3NlRmlsdGVyfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZpbGVzKCdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID4gTUFYRklMRVVQTE9BRF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWENFRURfVkFMSURBVElPTl9NRVNTQUdFfSAke01BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRX1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX1NJWkUnLCBtc2csIGZpbGUsIGVycm9yRmlsZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZEZpbGVzOiB2YWxpZEZpbGVzLFxuICAgICAgICAgICAgZXJyb3JGaWxlczogZXJyb3JGaWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yRmlsZXMoa2V5LCBtc2csIGZpbGUsIGVycm9yRmlsZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXJyb3IgY2FsbGJhY2sgZXhpc3Qgb3Igbm90LiBJZiBpdCBleGlzdHMgdGhlbiBkb250IHNob3cgdGFvc3RlciBtZXNzYWdlXG4gICAgICAgIGlmICghdGhpcy5oYXNFdmVudENhbGxiYWNrKCdlcnJvcicpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAobXNnLCAnRXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogbXNnXG4gICAgICAgIH07XG4gICAgICAgIGZpbGUuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgZXJyb3JGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8qT3ZlcndyaXRlIHRoZSBjYXB0aW9uIG9ubHkgaWYgdGhleSBhcmUgZGVmYXVsdCovXG4gICAgZ2V0Q2FwdGlvbihjYXB0aW9uLCBpc011bHRpcGxlLCBpc01vYmlsZVR5cGUpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzKHRoaXMuREVGQVVMVF9DQVBUSU9OUywgY2FwdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc011bHRpcGxlICYmICFpc01vYmlsZVR5cGUgPyB0aGlzLkRFRkFVTFRfQ0FQVElPTlMuTVVMVElQTEVfU0VMRUNUIDogdGhpcy5ERUZBVUxUX0NBUFRJT05TLlNFTEVDVDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdGlvbjtcbiAgICB9XG5cbiAgICB1cGxvYWRVcmwgPSAnc2VydmljZXMnO1xuXG4gICAgLyogY2hhbmdlIHNlcnZlciBwYXRoIGJhc2VkIG9uIHVzZXIgb3B0aW9uICovXG4gICAgY2hhbmdlU2VydmVyVXBsb2FkUGF0aChwYXRoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aCA9IHBhdGg7XG4gICAgfVxuXG4gICAgLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaWxlZXh0ZW5zaW9uICovXG4gICAgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSkge1xuICAgICAgICBpZiAoZmlsZU5hbWUgJiYgaW5jbHVkZXMoZmlsZU5hbWUsICcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZmlsZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgc2VsZWN0IEV2ZW50XG4gICAgICogQHBhcmFtICRldmVudFxuICAgICAqIEBwYXJhbSAkZmlsZXNcbiAgICAgKi9cbiAgICBvblNlbGVjdEV2ZW50Q2FsbCgkZXZlbnQsICRmaWxlcykge1xuICAgICAgICB0aGlzLm11bHRpcGxlU2VsZWN0ZWRGaWxlcyA9IHRoaXMubXVsdGlwbGUgPyBbLi4udGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMsIC4uLiRmaWxlc10gOiAkZmlsZXM7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICQuZXh0ZW5kKCRldmVudC4kZmlsZXMgfHwge30sICRmaWxlcyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWxlRWxlbUNsaWNrKCRldmVudCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gdHJ1ZTtcblxuICAgICAgICAvL1RoZSBmaWxlIHVwbG9hZCB3aWRnZXQgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIHRvIHJldXBsb2FkIHRoZSBzYW1lIGZpbGUuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKVswXS52YWx1ZSA9IG51bGw7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBmaWxlcGlja2VyIGlzIG5vdCB0aGVyZSBvbiB0aGUgd2luZG93LCByZW1vdmUgdGhlIGRyb3B6b25lIGhpZ2hsaWdodFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlRHJvcFpvbmUoKSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSBmYWxzZTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUpO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBjbGVhciB0aGUgc3BlY2lmaWVkIGZpbGUuIGlmIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZCwgaXQgY2xlYXJzIHRoZSBjb21wbGV0ZSBsaXN0ICAqL1xuICAgIGNsZWFyKGZpbGVPYmopIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlICE9PSBmaWxlT2JqKSA6IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAhPT0gZmlsZU9iaikgOiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGNsYXNzIG5hbWVzIGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uQ2xhc3MoY2xhc3NWYWx1ZSkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmNsYXNzID0gY2xhc3NWYWx1ZTtcbiAgICB9XG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaGludCBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkhpbnQoaGludCkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmhpbnQgPSBoaW50O1xuICAgIH1cblxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGFwcGVuZCB1cGxvYWQgc3RhdHVzIGRvbSBlbGVtZW50cyB0byB3aWRnZXQgKi9cbiAgICBvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgbGV0IGJlZm9yZVNlbGVjdFZhbDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmdldFZhbGlkRmlsZXMoJGZpbGVzKTtcbiAgICAgICAgJGZpbGVzID0gZmlsZXMudmFsaWRGaWxlcztcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcHJldmlvdXNseSB0cmllZCB1cGxvYWRpbmcgZm9sZGVycyB1c2luZyBkcm9wLCBhbmQgdGhlbiB1cGxvYWRpbmcgdXNpbmcgY2xpY2sgbWV0aG9kIHdlIGNsZWFyIHRoZSBmb2xkZXJzIGRvbVxuICAgICAgICBpZiAoJGV2ZW50LnR5cGUgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIGVycm9yIGNhbGxiYWNrIGV2ZW50IGlmIGFueSBpbnZhbGlkIGZpbGUgZm91bmQuXG4gICAgICAgIGlmICghaXNFbXB0eShmaWxlcy5lcnJvckZpbGVzKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLmVycm9yRmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIGlmIHRoZXJlIGFyZSB2YWxpZCBmaWxlcyBlbHNlIG5vIGNhbGwgaXMgbWFkZVxuICAgICAgICBpZiAoJGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX0JFRk9SRV9TRUxFQ1RcbiAgICAgICAgICAgIGJlZm9yZVNlbGVjdFZhbCA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBmaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgocHJvZ3Jlc3NPYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnNlbGVjdGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5uYW1lID09PSBwcm9ncmVzc09iai5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBwcm9ncmVzc09iai5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NPYmouZXJyTXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVyck1zZyA9IHByb2dyZXNzT2JqLmVyck1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgLy8gc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIC8vIGFkZGluZywgZHJhZ292ZXIgYW5kIGRyb3Agb24gdGhlIGRvY3VtZW50IGFzIHdoZW4gZmlsZSBpcyBkcmFnZ2VkIG9uIHRvIHRoZSBwYWdlIGhpZ2hsaWdodCB0aGUgZHJvcHpvbmVzIGFuZCByZW1vdmUgaGlnaGxpZ2h0IG9uIGZpbGUgZHJvcFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIGFkZGluZyBtb3VzZWxlYXZlIGV2bnQgdG8gcmVtb3ZlIGhpZ2hsaWdodCB3aGVuIGZpbGUgaXMgZHJvcHBlZCBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3R5bGVyKCB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1idXR0b24sIC5kcm9wLWJveCcpLCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcHAtZmlsZXVwbG9hZFwiIGluaXQtd2lkZ2V0PlxuICAgIDwhLS0gZHJhZyBhbmQgZHJvcCBmaWxlcyBVSSBpbiB3ZWIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1tdWx0aS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc01vYmlsZVR5cGUgJiYgbXVsdGlwbGVcIj5cbiAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wLWJveFwiIChjbGljayk9XCJ0cmlnZ2VyRmlsZVNlbGVjdCgpXCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCIgKGRyYWdvdmVyKT1cImRyYWdPdmVySGFuZGxlcigkZXZlbnQpO1wiIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KTtcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtpbm5lckh0bWxdPVwiY2FwdGlvblwiIGNsYXNzPVwiY2FwdGlvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpbGUtaW5wdXRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImhpbnQgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgKm5nSWY9XCJtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIG11bHRpcGxlID5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImFwcC1hbmNob3JcIj57e2ZpbGVVcGxvYWRNZXNzYWdlfX08L2E+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc2luZ2xlIGZpbGUgdXBsb2FkIGluIHdlYiBhbmQgc2luZ2xlICwgbXVsdGlwbGUgZmlsZSB1cGxvYWQgVUkgaW4gbW9iaWxlIHJ1bm1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zaW5nbGUtZmlsZS11cGxvYWRcIiAqbmdJZj1cIiFfaXNDb3Jkb3ZhICYmICghbXVsdGlwbGUgfHwgX2lzTW9iaWxlVHlwZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1idXR0b24td3JhcHBlclwiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzdXBwb3J0IGZvciBmaWxlIHVwbG9hZCBpbiBNb2JpbGVhcHAgaW4gaXRzIHJ1bm1vZGUgKFdlYikgLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIm11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgbXVsdGlwbGU+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIiFtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZHJvcHpvbmVcIiBmb2N1cy10YXJnZXQgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tZGVmYXVsdFwiIFtuZ0NsYXNzXT1cInsnaGlnaGxpZ2h0LWRyb3AtYm94JyA6IGhpZ2hsaWdodERyb3BBcmVhfVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtZmlsZXMtdXBsb2FkLXN0YXR1cyBzaW5nbGVcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZSBBcHBsaWNhdGlvbiAoZGV2aWNlKSAtLT5cbiAgICA8YnV0dG9uICpuZ0lmPVwiX2lzQ29yZG92YVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cIm9wZW5GaWxlU2VsZWN0b3IoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmaWxlcyBVSSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZnQgb2YgKG11bHRpcGxlID8gbXVsdGlwbGVTZWxlY3RlZEZpbGVzIDogc2VsZWN0ZWRGaWxlcylcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIiAqbmdJZj1cImZ0LnN0YXR1cyAhPT0gJ2Fib3J0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24ge3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpIHwgZmlsZUljb25DbGFzc319XCIgdGl0bGU9XCJ7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSl9fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57e2Z0Lm5hbWV9fTwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGVzaXplXCIgKm5nSWY9XCJmdC5maWxlTGVuZ3RoICAhPT0gMFwiPnt7ZnQuc2l6ZSB8IGZpbGVzaXplOjB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdHJpcGVkIHByb2dyZXNzLWJhci1pbmZvXCIgW25nU3R5bGVdPVwie3dpZHRoOiAoZnQucHJvZ3Jlc3MgKyclJyl9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IGZ0LnN0YXR1cyA9PT0gJ3F1ZXVlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBmaWxlLXVwbG9hZC1zdG9wXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGVVcGxvYWQoZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjbGVhcmljb25jbGFzcyAhPT0gJycgJiYgZnQuc3RhdHVzICE9PSAnb25Qcm9ncmVzcydcIiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cImNsZWFyKGZ0KVwiIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBidG4tZGVmYXVsdCBzdGF0dXMtaWNvblwiIHRpdGxlPVwie3tjbGVhcmljb25oaW50fX1cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2NsZWFyaWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnZXJyb3InXCIgdGl0bGU9XCJ7e2Z0LmVyck1zZyB8fCB0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZJTEVfVVBMT0FEX0ZBSUxFRH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3VsPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZvbGRlcnMgVUkgdG8gc2hvdyB0aGUgZXJyb3IgaW4gdGl0bGUgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBmaWxlLXVwbG9hZFwiIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IGZpbGVsaXN0aGVpZ2h0LCBvdmVyZmxvdzogb3ZlcmZsb3d9XCIgdGl0bGU9XCJ7e3RoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRk9MREVSX1VQTE9BRFNfTk9UX0FMTE9XRUR9fVwiICpuZ0lmPVwic2VsZWN0ZWRGb2xkZXJzLmxlbmd0aCA+IDBcIiA+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZnQgb2Ygc2VsZWN0ZWRGb2xkZXJzXCIgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmlsZS11cGxvYWQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEgdXBsb2FkLWZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24gZmEgZmEtZm9sZGVyLW9cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidXBsb2FkLXRpdGxlXCI+e3tmdC5uYW1lfX08L2xhYmVsPjxici8+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uICB3aSB3aS1jYW5jZWwgdGV4dC1kYW5nZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG4iXX0=
704
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7O0lBR3hLLDRCQUFvRzs7O0lBQXhFLDZFQUFxQzs7O0lBQ2pFLGdDQUFvRTtJQUFDLG1CQUFFO0lBQUEsaUJBQU87OztJQUM5RSw0QkFBa0c7OztJQUF2RSw0RUFB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RUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7b0ZBaGFRLG1CQUFtQix3RkF3WTRCLGNBQWMsd0VBQTRFLGtCQUFrQjtvRUF4WTNKLG1CQUFtQiwwRUFMakI7Z0JBQ1Asa0JBQWtCLENBQUMsbUJBQW1CLENBQUM7YUFDMUM7WUN2QkwsOEJBQXdDO1lBMEZwQyxBQWhEQSxBQUxBLEFBbkJBLEFBaEJBLHNFQUFzRSx3REFnQmtCLDZEQW1Cc0MscURBS0EscURBZ0RnRTtZQWVsTSxpQkFBTTs7WUF2R2tDLGNBQWdDO1lBQWhDLHlEQUFnQztZQWdCL0IsY0FBaUQ7WUFBakQsOEVBQWlEO1lBbUI3RSxjQUFnQjtZQUFoQixxQ0FBZ0I7WUFLb0UsY0FBOEI7WUFBOUIsbURBQThCO1lBZ0RnQyxjQUFnQztZQUFoQyxxREFBZ0M7OztpRkRoRWxMLG1CQUFtQjtjQVIvQixTQUFTOzJCQUNJLGdCQUFnQixhQUVmO29CQUNQLGtCQUFrQixxQkFBcUI7aUJBQzFDOztzQkEyWTZDLFNBQVM7dUJBQUMsY0FBYzs7c0JBQXFFLE1BQU07dUJBQUMsa0JBQWtCOztzQkFBRyxRQUFROztrRkF4WXRLLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7QXBwLCBEYXRhU291cmNlLCBnZXRXbVByb2plY3RQcm9wZXJ0aWVzLCBpc0F1ZGlvRmlsZSwgaXNJbWFnZUZpbGUsIGlzVmlkZW9GaWxlLCBBYnN0cmFjdERpYWxvZ1NlcnZpY2V9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7cHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2ZpbGUtdXBsb2FkLnByb3BzJztcbmltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIHRvTG93ZXJ9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtZmlsZXVwbG9hZCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1maWxldXBsb2FkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t3bUZpbGVVcGxvYWRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRmlsZVVwbG9hZENvbXBvbmVudClcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgc2VsZWN0ZWRGaWxlczogYW55ID0gW107XG4gICAgdXBsb2FkZWRGaWxlczogYW55ID0gW107XG4gICAgc2VsZWN0ZWRGb2xkZXJzOiBhbnkgPSBbXTtcbiAgICBwcm9ncmVzc09ic2VydmFibGU7XG4gICAgZGVsZXRlRmlsZU9ic2VydmFibGU7XG4gICAgbmFtZTtcbiAgICBoaW50O1xuICAgIGFyaWFsYWJlbDtcbiAgICBtdWx0aXBsZTtcbiAgICBmaWxlVHJhbnNmZXJzID0ge307XG4gICAgY2FwdGlvbiA9ICdVcGxvYWQnO1xuICAgIGZvcm1OYW1lID0gJyc7XG4gICAgbWF4ZmlsZXNpemU7XG4gICAgY2xlYXJpY29uY2xhc3M7XG4gICAgY2xlYXJpY29uaGludDtcbiAgICBzZWxlY3RlZFVwbG9hZFR5cGVQYXRoO1xuICAgIERFRkFVTFRfQ0FQVElPTlMgPSB7XG4gICAgICAgIE1VTFRJUExFX1NFTEVDVDogJ0Ryb3AgeW91ciBmaWxlcyBoZXJlLicsXG4gICAgICAgIFNFTEVDVDogJ1NlbGVjdCdcbiAgICB9O1xuICAgIERFVklDRV9DT05URU5UVFlQRVMgPSB7XG4gICAgICAgIElNQUdFOiAnaW1hZ2UnLFxuICAgICAgICBWSURFTzogJ3ZpZGVvJyxcbiAgICAgICAgQVVESU86ICdhdWRpbycsXG4gICAgICAgIEZJTEVTOiAnZmlsZXMnXG4gICAgfTtcbiAgICBGSUxFU0laRV9NQiA9IDEwNDg1NzY7XG4gICAgd2lkZ2V0UHJvcHM7XG4gICAgX2lzTW9iaWxlVHlwZTtcbiAgICBfaXNDb3Jkb3ZhO1xuICAgIC8vIHBhcmVudFByZWZhYlNjb3BlID0gZWxlbWVudC5jbG9zZXN0KCcuYXBwLXByZWZhYicpLmlzb2xhdGVTY29wZSgpLFxuICAgIENPTlNUQU5UX0ZJTEVfU0VSVklDRSA9ICdGaWxlU2VydmljZSc7XG4gICAgdXBsb2FkRGF0YSA9IHtcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICB1cGxvYWRQYXRoOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucyA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnM7XG4gICAgZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zID0gdGhpcy5hbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSkubWFwKGl0ZW0gPT4gaXRlbS5lbmRzV2l0aCgnLyonKSA/IGl0ZW0gOiBgLiR7aXRlbX1gKTtcbiAgICBjaG9vc2VGaWx0ZXIgPSB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykgPyAnJyA6IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgIGRhdGFzb3VyY2U7XG4gICAgZGVsZXRlZGF0YXNvdXJjZTtcbiAgICBmaWxlVXBsb2FkTWVzc2FnZSA9ICdEcm9wIHlvdXIgZmlsZXMgaGVyZSBvciBjbGljayBoZXJlIHRvIGJyb3dzZSc7XG4gICAgaGlnaGxpZ2h0RHJvcEFyZWE7XG4gICAgc2hvd3Byb2dyZXNzYmFyO1xuICAgIHNob3dwcm9ncmVzc2JhcnBlcmNlbnRhZ2U7XG4gICAgLypfaGFzT25TdWNjZXNzRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uU3VjY2Vzcyk7XG4gICAgIF9oYXNPbkVycm9yRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uRXJyb3IpOyovXG5cbiAgICAvLyBDaGVja2luZyBpZiB0aGUgc2VsZWN0ZWQgZmlsZSBpcyB2YWxpZCBmb3IgdGhlIGNob29zZW4gZmlsdGVyIHR5cGVcbiAgICBpc1ZhbGlkRmlsZShmaWxlbmFtZSwgY29udGVudHR5cGUsIGV4dGVuc2lvbk5hbWUsIGlzTW9iaWxlVHlwZSkge1xuICAgICAgICBsZXQgaXNWYWxpZCwgY29udGVudFR5cGVzO1xuXG4gICAgICAgIGlmICghY29udGVudHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRUeXBlcyA9IHRvTG93ZXIoY29udGVudHR5cGUpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2ltYWdlLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UnKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNJbWFnZUZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIGltYWdlIGFuZCB1c2VyIHVwbG9hZHMgaW1hZ2UgaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnYXVkaW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0F1ZGlvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgYXVkaW8vKiBhbmQgdXNlciB1cGxvYWRzIGF1ZGlvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ3ZpZGVvLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8nKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNWaWRlb0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIHZpZGVvLyogYW5kIHVzZXIgdXBsb2FkcyB2aWRlbyBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qY29udGVudCB0eXBlIGFuZCB0aGUgdXBsb2FkZWQgZmlsZSBleHRlbnNpb24gc2hvdWxkIGJlIHNhbWUqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnLicgKyB0b0xvd2VyKGV4dGVuc2lvbk5hbWUpKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgLyogdGhpcyByZXR1cm4gdGhlIGFycmF5IG9mIGZpbGVzIHdoaWNoIGFyZSBoYXZpbmcgdGhlIGZpbGUgc2l6ZSBub3QgbW9yZSB0aGFuIG1heGZpbGVzaXplIGFuZCBmaWx0ZXJzIGJhc2VkIG9uIGNvbnRlbnR0eXBlICovXG4gICAgZ2V0VmFsaWRGaWxlcygkZmlsZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBlcnJvckZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IE1BWEZJTEVVUExPQURfU0laRSA9IHBhcnNlRmxvYXQodGhpcy5tYXhmaWxlc2l6ZSkgKiB0aGlzLkZJTEVTSVpFX01CIHx8IHRoaXMuRklMRVNJWkVfTUI7XG4gICAgICAgIGNvbnN0IE1BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRSA9ICh0aGlzLm1heGZpbGVzaXplIHx8ICcxJykgKyAnTUInO1xuXG4gICAgICAgIC8vIGlmIGNvbnRlbnR0eXBlIGlzIGZpbGVzIGZvciBtb2JpbGUgcHJvamVjdHMuXG4gICAgICAgIGlmICh0aGlzLmNob29zZUZpbHRlciA9PT0gdGhpcy5ERVZJQ0VfQ09OVEVOVFRZUEVTLkZJTEVTKSB7XG4gICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaCgkZmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAvKiBjaGVjayBmb3IgdGhlIGZpbGUgY29udGVudCB0eXBlIGJlZm9yZSB1cGxvYWRpbmcgKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkRmlsZShmaWxlLm5hbWUsIHRoaXMuY2hvb3NlRmlsdGVyLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKSwgdGhpcy5faXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhURU5USU9OX1ZBTElEQVRJT05fTUVTU0FHRX0gJHt0aGlzLmNob29zZUZpbHRlcn1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX0VYVEVOU0lPTicsIG1zZywgZmlsZSwgZXJyb3JGaWxlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IE1BWEZJTEVVUExPQURfU0laRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhDRUVEX1ZBTElEQVRJT05fTUVTU0FHRX0gJHtNQVhfRklMRV9VUExPQURfRk9STUFUVEVEX1NJWkV9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yRmlsZXMoJ0lOVkFMSURfRklMRV9TSVpFJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWRGaWxlczogdmFsaWRGaWxlcyxcbiAgICAgICAgICAgIGVycm9yRmlsZXM6IGVycm9yRmlsZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvckZpbGVzKGtleSwgbXNnLCBmaWxlLCBlcnJvckZpbGVzKSB7XG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGNhbGxiYWNrIGV4aXN0IG9yIG5vdC4gSWYgaXQgZXhpc3RzIHRoZW4gZG9udCBzaG93IHRhb3N0ZXIgbWVzc2FnZVxuICAgICAgICBpZiAoIXRoaXMuaGFzRXZlbnRDYWxsYmFjaygnZXJyb3InKSkge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5QXBwKG1zZywgJ0Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZ1xuICAgICAgICB9O1xuICAgICAgICBmaWxlLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGVycm9yRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvKk92ZXJ3cml0ZSB0aGUgY2FwdGlvbiBvbmx5IGlmIHRoZXkgYXJlIGRlZmF1bHQqL1xuICAgIGdldENhcHRpb24oY2FwdGlvbiwgaXNNdWx0aXBsZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGlmIChpbmNsdWRlcyh0aGlzLkRFRkFVTFRfQ0FQVElPTlMsIGNhcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNNdWx0aXBsZSAmJiAhaXNNb2JpbGVUeXBlID8gdGhpcy5ERUZBVUxUX0NBUFRJT05TLk1VTFRJUExFX1NFTEVDVCA6IHRoaXMuREVGQVVMVF9DQVBUSU9OUy5TRUxFQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHRpb247XG4gICAgfVxuXG4gICAgdXBsb2FkVXJsID0gJ3NlcnZpY2VzJztcblxuICAgIC8qIGNoYW5nZSBzZXJ2ZXIgcGF0aCBiYXNlZCBvbiB1c2VyIG9wdGlvbiAqL1xuICAgIGNoYW5nZVNlcnZlclVwbG9hZFBhdGgocGF0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXBsb2FkVHlwZVBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIC8qIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZWV4dGVuc2lvbiAqL1xuICAgIGdldEZpbGVFeHRlbnNpb24oZmlsZU5hbWUpIHtcbiAgICAgICAgaWYgKGZpbGVOYW1lICYmIGluY2x1ZGVzKGZpbGVOYW1lLCAnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHNlbGVjdCBFdmVudFxuICAgICAqIEBwYXJhbSAkZXZlbnRcbiAgICAgKiBAcGFyYW0gJGZpbGVzXG4gICAgICovXG4gICAgb25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gJGZpbGVzO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSB0aGlzLm11bHRpcGxlID8gWy4uLnRoaXMudXBsb2FkZWRGaWxlcywgLi4uJGZpbGVzXSA6ICRmaWxlcztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICQuZXh0ZW5kKCRldmVudC4kZmlsZXMgfHwge30sICRmaWxlcyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWxlRWxlbUNsaWNrKCRldmVudCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gdHJ1ZTtcblxuICAgICAgICAvL1RoZSBmaWxlIHVwbG9hZCB3aWRnZXQgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIHRvIHJldXBsb2FkIHRoZSBzYW1lIGZpbGUuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKVswXS52YWx1ZSA9IG51bGw7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBmaWxlcGlja2VyIGlzIG5vdCB0aGVyZSBvbiB0aGUgd2luZG93LCByZW1vdmUgdGhlIGRyb3B6b25lIGhpZ2hsaWdodFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlRHJvcFpvbmUoKSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSBmYWxzZTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUpO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBjbGVhciB0aGUgc3BlY2lmaWVkIGZpbGUuIGlmIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZCwgaXQgY2xlYXJzIHRoZSBjb21wbGV0ZSBsaXN0ICAqL1xuICAgIGNsZWFyKGZpbGVPYmopIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5jbGVhckZpbGUodGhpcy5zZWxlY3RlZEZpbGVzLCBmaWxlT2JqKSA6IFtdO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSAoZmlsZU9iaikgPyB0aGlzLmNsZWFyRmlsZSh0aGlzLnVwbG9hZGVkRmlsZXMsIGZpbGVPYmopIDogW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhckZpbGUoZmlsZXMsIGZpbGVPYmopIHtcbiAgICAgICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZT8uX3Jlc3BvbnNlPy5maWxlTmFtZSAhPT0gZmlsZU9iaj8uX3Jlc3BvbnNlPy5maWxlTmFtZSB8fCBmaWxlPy5uYW1lICE9PSBmaWxlT2JqPy5uYW1lIHx8IGZpbGUgIT09IGZpbGVPYmopO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGNsYXNzIG5hbWVzIGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uQ2xhc3MoY2xhc3NWYWx1ZSkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmNsYXNzID0gY2xhc3NWYWx1ZTtcbiAgICB9XG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaGludCBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkhpbnQoaGludCkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmhpbnQgPSBoaW50O1xuICAgIH1cblxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGFwcGVuZCB1cGxvYWQgc3RhdHVzIGRvbSBlbGVtZW50cyB0byB3aWRnZXQgKi9cbiAgICBvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgbGV0IGJlZm9yZVNlbGVjdFZhbDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmdldFZhbGlkRmlsZXMoJGZpbGVzKTtcbiAgICAgICAgJGZpbGVzID0gZmlsZXMudmFsaWRGaWxlcztcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcHJldmlvdXNseSB0cmllZCB1cGxvYWRpbmcgZm9sZGVycyB1c2luZyBkcm9wLCBhbmQgdGhlbiB1cGxvYWRpbmcgdXNpbmcgY2xpY2sgbWV0aG9kIHdlIGNsZWFyIHRoZSBmb2xkZXJzIGRvbVxuICAgICAgICBpZiAoJGV2ZW50LnR5cGUgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIGVycm9yIGNhbGxiYWNrIGV2ZW50IGlmIGFueSBpbnZhbGlkIGZpbGUgZm91bmQuXG4gICAgICAgIGlmICghaXNFbXB0eShmaWxlcy5lcnJvckZpbGVzKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLmVycm9yRmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIGlmIHRoZXJlIGFyZSB2YWxpZCBmaWxlcyBlbHNlIG5vIGNhbGwgaXMgbWFkZVxuICAgICAgICBpZiAoJGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX0JFRk9SRV9TRUxFQ1RcbiAgICAgICAgICAgIGJlZm9yZVNlbGVjdFZhbCA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBmaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgocHJvZ3Jlc3NPYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnNlbGVjdGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5uYW1lID09PSBwcm9ncmVzc09iai5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBwcm9ncmVzc09iai5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NPYmouZXJyTXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVyck1zZyA9IHByb2dyZXNzT2JqLmVyck1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25GaWxlRGVsZXRlKCRldmVudCwgZmlsZSkge1xuICAgICAgICBpZighZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmVmb3JlRGVsZXRlVmFsID0gdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVkZWxldGUnLCB7ICRldmVudDogZmlsZSB9KTtcblxuICAgICAgICBpZiAoYmVmb3JlRGVsZXRlVmFsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dBcHBDb25maXJtRGlhbG9nKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJEZWxldGUgZmlsZVwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/XCIsXG4gICAgICAgICAgICAgICAgb2t0ZXh0OiBcIk9rXCIsXG4gICAgICAgICAgICAgICAgY2FuY2VsdGV4dDogXCJDYW5jZWxcIixcbiAgICAgICAgICAgICAgICBvbk9rOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZGF0YXNvdXJjZS5zZXRJbnB1dCgnZmlsZScsIGZpbGUuX3Jlc3BvbnNlLmZpbGVOYW1lIHx8IGZpbGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpbGVPYnNlcnZhYmxlID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZGF0YXNvdXJjZS5fZGVsZXRlRmlsZU9ic2VydmFibGUgPSB0aGlzLmRlbGV0ZUZpbGVPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkYXRhc291cmNlLl9kZWxldGVGaWxlT2JzZXJ2YWJsZS5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlT2JqKSA9PiBmaWxlICE9PSBmaWxlT2JqKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZU9iaikgPT4gZmlsZSAhPT0gZmlsZU9iaikgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZGF0YXNvdXJjZS5fZGVsZXRlRmlsZU9ic2VydmFibGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRhdGFzb3VyY2UuX2RlbGV0ZUZpbGVPYnNlcnZhYmxlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2RlbGV0ZScsIHsgJGV2ZW50OiBmaWxlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xvc2VBcHBDb25maXJtRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xvc2VBcHBDb25maXJtRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbk9wZW46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLmNhbmNlbC1hY3Rpb24nKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG4gICAgICAgIC8vIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICAvLyBhZGRpbmcsIGRyYWdvdmVyIGFuZCBkcm9wIG9uIHRoZSBkb2N1bWVudCBhcyB3aGVuIGZpbGUgaXMgZHJhZ2dlZCBvbiB0byB0aGUgcGFnZSBoaWdobGlnaHQgdGhlIGRyb3B6b25lcyBhbmQgcmVtb3ZlIGhpZ2hsaWdodCBvbiBmaWxlIGRyb3BcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BDYi5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBhZGRpbmcgbW91c2VsZWF2ZSBldm50IHRvIHJlbW92ZSBoaWdobGlnaHQgd2hlbiBmaWxlIGlzIGRyb3BwZWQgb3V0c2lkZSB0aGUgd2luZG93XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmRyb3BDYi5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN0eWxlciggdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hcHAtYnV0dG9uLCAuZHJvcC1ib3gnKSwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnT3ZlckNiKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiKTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXBwLWZpbGV1cGxvYWRcIiBpbml0LXdpZGdldD5cbiAgICA8IS0tIGRyYWcgYW5kIGRyb3AgZmlsZXMgVUkgaW4gd2ViIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtbXVsdGktZmlsZS11cGxvYWRcIiAqbmdJZj1cIiFfaXNNb2JpbGVUeXBlICYmIG11bHRpcGxlXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkcm9wem9uZVwiIGNsYXNzPVwiZHJvcC1ib3hcIiAoY2xpY2spPVwidHJpZ2dlckZpbGVTZWxlY3QoKVwiIFtuZ0NsYXNzXT1cInsnaGlnaGxpZ2h0LWRyb3AtYm94JyA6IGhpZ2hsaWdodERyb3BBcmVhfVwiIChkcmFnb3Zlcik9XCJkcmFnT3ZlckhhbmRsZXIoJGV2ZW50KTtcIiAoZHJvcCk9XCJvbkZpbGVEcm9wKCRldmVudCk7XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbaW5uZXJIdG1sXT1cImNhcHRpb25cIiBjbGFzcz1cInVwbG9hZC1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpbGUtaW5wdXRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImhpbnQgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgKm5nSWY9XCJtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIG11bHRpcGxlID5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhcHAtYW5jaG9yIHVwbG9hZC1sYWJlbFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+e3sgZmlsZVVwbG9hZE1lc3NhZ2UgfX08L2E+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cImNob29zZUZpbHRlclwiIFtpbm5lckh0bWxdPVwiY2hvb3NlRmlsdGVyICsgJyBvbmx5ICdcIiBjbGFzcz1cInVwbG9hZC1leHRlbnNpb25zXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNob29zZUZpbHRlciAmJiBtYXhmaWxlc2l6ZVwiIGNsYXNzPVwidXBsb2FkLWV4dGVuc2lvbnNcIj4gLiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwibWF4ZmlsZXNpemVcIiBbaW5uZXJIdG1sXT1cIm1heGZpbGVzaXplICsgJ01CIG1heCdcIiBjbGFzcz1cInVwbG9hZC1leHRlbnNpb25zXCI+PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHNpbmdsZSBmaWxlIHVwbG9hZCBpbiB3ZWIgYW5kIHNpbmdsZSAsIG11bHRpcGxlIGZpbGUgdXBsb2FkIFVJIGluIG1vYmlsZSBydW5tb2RlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2luZ2xlLWZpbGUtdXBsb2FkXCIgKm5nSWY9XCIhX2lzQ29yZG92YSAmJiAoIW11bHRpcGxlIHx8IF9pc01vYmlsZVR5cGUpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtYnV0dG9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgbmFtZT1cInt7Zm9ybU5hbWV9fVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gc3VwcG9ydCBmb3IgZmlsZSB1cGxvYWQgaW4gTW9iaWxlYXBwIGluIGl0cyBydW5tb2RlIChXZWIpIC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKm5nSWY9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhbGFiZWwgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIGNsYXNzPVwiZmlsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG5hbWU9XCJmaWxlc1wiIHR5cGU9XCJmaWxlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAqbmdJZj1cIiFtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhbGFiZWwgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIGNsYXNzPVwiZmlsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmaWxlc1wiIHR5cGU9XCJmaWxlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRyb3B6b25lXCIgZm9jdXMtdGFyZ2V0IGNsYXNzPVwiYXBwLWJ1dHRvbiBidG4gYnRuLWRlZmF1bHRcIiBbbmdDbGFzc109XCJ7J2hpZ2hsaWdodC1kcm9wLWJveCcgOiBoaWdobGlnaHREcm9wQXJlYX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25jbGFzc319XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcHRpb25cIiBbaW5uZXJIVE1MXT1cImNhcHRpb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLWZpbGVzLXVwbG9hZC1zdGF0dXMgc2luZ2xlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBzdXBwb3J0IGZvciBmaWxlIHVwbG9hZCBpbiBNb2JpbGUgQXBwbGljYXRpb24gKGRldmljZSkgLS0+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIl9pc0NvcmRvdmFcIiBmb2N1cy10YXJnZXQgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tZGVmYXVsdFwiIChjbGljayk9XCJvcGVuRmlsZVNlbGVjdG9yKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25jbGFzc319XCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNhcHRpb25cIiBbaW5uZXJIVE1MXT1cImNhcHRpb25cIj48L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBsaXN0IG9mIHNlbGVjdGVkZmlsZXMgVUkgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBmaWxlLXVwbG9hZFwiIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IGZpbGVsaXN0aGVpZ2h0LCBvdmVyZmxvdzogb3ZlcmZsb3d9XCIgKm5nSWY9XCJ1cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDBcIiA+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZ0IG9mIHVwbG9hZGVkRmlsZXNcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIiAqbmdJZj1cImZ0LnN0YXR1cyAhPT0gJ2Fib3J0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24ge3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpIHwgZmlsZUljb25DbGFzc319XCIgdGl0bGU9XCJ7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSl9fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHMgY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVwbG9hZC10aXRsZVwiPnt7IGZ0LnN0b3JhZ2VOYW1lIHx8IGZ0Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdzdWNjZXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtaWNvbiB7e2Z0LnN0YXR1cyB8IHN0YXRlQ2xhc3MgfX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGVzaXplXCIgKm5nSWY9XCJmdC5maWxlTGVuZ3RoICAhPT0gMFwiPnt7ZnQuc2l6ZSB8IGZpbGVzaXplOjB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtaWNvbiB7e2Z0LnN0YXR1cyB8IHN0YXRlQ2xhc3MgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3tmdC5lcnJNc2cgfHwgdGhpcy5hcHBMb2NhbGUuTUVTU0FHRV9GSUxFX1VQTE9BRF9GQUlMRUR9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ2Vycm9yJ1wiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlVwbG9hZCBGYWlsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcycgfHwgc2hvd3Byb2dyZXNzYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9ncmVzcyBjb2wtbWQtNyB1cGxvYWQtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImZ0LnN0YXR1cyA9PT0gJ2Vycm9yJyA/ICdwcm9ncmVzcy1iYXItZGFuZ2VyJyA6ICdwcm9ncmVzcy1iYXItaW5mbydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie3dpZHRoOiAoZnQucHJvZ3Jlc3MgKyclJyl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdHJpcGVkXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcycgfHwgc2hvd3Byb2dyZXNzYmFyICYmIHNob3dwcm9ncmVzc2JhcnBlcmNlbnRhZ2UpICYmIGZ0LnByb2dyZXNzIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTEgdXBsb2FkLXByb2dyZXNzLXBlcmNlbnRhZ2VcIj57eyBmdC5wcm9ncmVzcyArICclJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdvblByb2dyZXNzJyB8fCBmdC5zdGF0dXMgPT09ICdxdWV1ZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tdHJhbnNwYXJlbnQgZmlsZS11cGxvYWQtc3RvcFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWJvcnRGaWxlVXBsb2FkKGZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwid2kgd2ktY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwiY2xlYXIoZnQpXCIgKm5nSWY9XCJjbGVhcmljb25jbGFzcyAhPT0gJycgJiYgZnQuc3RhdHVzICE9PSAnb25Qcm9ncmVzcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXRyYW5zcGFyZW50IGJ0bi1kZWZhdWx0IHN0YXR1cy1pY29uXCIgdGl0bGU9XCJ7e2NsZWFyaWNvbmhpbnR9fVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7Y2xlYXJpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib25GaWxlRGVsZXRlKCRldmVudCwgZnQpXCIgY2xhc3M9XCJidG4gYnRuLXRyYW5zcGFyZW50IGJ0bi1kZWZhdWx0IHN0YXR1cy1pY29uXCIgdGl0bGU9XCJkZWxldGVcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1kZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC91bD5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmb2xkZXJzIFVJIHRvIHNob3cgdGhlIGVycm9yIGluIHRpdGxlIC0tPlxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgZmlsZS11cGxvYWRcIiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmaWxlbGlzdGhlaWdodCwgb3ZlcmZsb3c6IG92ZXJmbG93fVwiIHRpdGxlPVwie3t0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZPTERFUl9VUExPQURTX05PVF9BTExPV0VEfX1cIiAqbmdJZj1cInNlbGVjdGVkRm9sZGVycy5sZW5ndGggPiAwXCIgPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZ0IG9mIHNlbGVjdGVkRm9sZGVyc1wiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGZpbGUtdXBsb2FkLXN0YXR1c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhIHVwbG9hZC1maWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtbGVmdCBtZWRpYS1taWRkbGUgZmlsZS1pY29uIGZhIGZhLWZvbGRlci1vXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLWJvZHkgbWVkaWEtbWlkZGxlIGZpbGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZC10aXRsZVwiPnt7ZnQubmFtZX19PC9sYWJlbD48YnIvPlxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaWNvbiAgd2kgd2ktY2FuY2VsIHRleHQtZGFuZ2VyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD5cbjwvZGl2PlxuIl19