@colijnit/corecomponents_v12 261.1.1 → 261.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/{fesm2015/colijnit-corecomponents_v12.js → fesm2022/colijnit-corecomponents_v12.mjs} +20197 -15310
  2. package/fesm2022/colijnit-corecomponents_v12.mjs.map +1 -0
  3. package/index.d.ts +3985 -0
  4. package/lib/components/popup/popup-message-display.component.scss +0 -2
  5. package/lib/components/scroll-container/style/_layout.scss +68 -0
  6. package/lib/components/scroll-container/style/_material-definition.scss +0 -0
  7. package/lib/components/scroll-container/style/_theme.scss +4 -0
  8. package/lib/components/scroll-container/style/material.scss +4 -0
  9. package/package.json +17 -13
  10. package/bundles/colijnit-corecomponents_v12.umd.js +0 -16057
  11. package/bundles/colijnit-corecomponents_v12.umd.js.map +0 -1
  12. package/colijnit-corecomponents_v12-261.1.0.tgz +0 -0
  13. package/colijnit-corecomponents_v12.d.ts +0 -45
  14. package/colijnit-corecomponents_v12.metadata.json +0 -1
  15. package/esm2015/colijnit-corecomponents_v12.js +0 -46
  16. package/esm2015/lib/components/article-tile/article-tile.component.js +0 -81
  17. package/esm2015/lib/components/article-tile/article-tile.module.js +0 -35
  18. package/esm2015/lib/components/base/base-input.component.js +0 -849
  19. package/esm2015/lib/components/base/base.module.js +0 -22
  20. package/esm2015/lib/components/base/commit-buttons/commit-buttons.component.js +0 -103
  21. package/esm2015/lib/components/base/commit-buttons/commit-buttons.module.js +0 -21
  22. package/esm2015/lib/components/base/dialog-base.component.js +0 -6
  23. package/esm2015/lib/components/base-input-date-picker/base-input-date-picker.directive.js +0 -25
  24. package/esm2015/lib/components/base-input-time/base-input-time-directive.js +0 -25
  25. package/esm2015/lib/components/button/button.component.js +0 -79
  26. package/esm2015/lib/components/button/button.module.js +0 -19
  27. package/esm2015/lib/components/calendar/calendar-template.component.js +0 -404
  28. package/esm2015/lib/components/calendar/calendar.component.js +0 -46
  29. package/esm2015/lib/components/calendar/calendar.module.js +0 -30
  30. package/esm2015/lib/components/card/card.component.js +0 -72
  31. package/esm2015/lib/components/card/card.module.js +0 -35
  32. package/esm2015/lib/components/carousel/carousel.component.js +0 -130
  33. package/esm2015/lib/components/carousel/carousel.module.js +0 -32
  34. package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +0 -315
  35. package/esm2015/lib/components/carousel-3d/carousel-3d.module.js +0 -19
  36. package/esm2015/lib/components/carousel-3d/carouselItem.js +0 -54
  37. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.component.js +0 -87
  38. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.module.js +0 -19
  39. package/esm2015/lib/components/co-dialog/co-dialog.component.js +0 -113
  40. package/esm2015/lib/components/co-dialog/co-dialog.module.js +0 -19
  41. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +0 -51
  42. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.module.js +0 -17
  43. package/esm2015/lib/components/collapsible/collapsible.component.js +0 -92
  44. package/esm2015/lib/components/collapsible/collapsible.module.js +0 -19
  45. package/esm2015/lib/components/color-picker/color-picker.component.js +0 -41
  46. package/esm2015/lib/components/color-picker/color-picker.module.js +0 -21
  47. package/esm2015/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.js +0 -79
  48. package/esm2015/lib/components/core-dialog/core-dialog.module.js +0 -39
  49. package/esm2015/lib/components/core-dialog/core-dialog.service.js +0 -67
  50. package/esm2015/lib/components/core-dialog/core-dynamic-component.service.js +0 -93
  51. package/esm2015/lib/components/double-calendar/double-calendar.component.js +0 -112
  52. package/esm2015/lib/components/double-calendar/double-calendar.module.js +0 -25
  53. package/esm2015/lib/components/filter-item/filter-item-viewmodel.js +0 -13
  54. package/esm2015/lib/components/filter-item/filter-item.component.js +0 -1019
  55. package/esm2015/lib/components/filter-item/filter-item.module.js +0 -43
  56. package/esm2015/lib/components/filter-item/filter-viewmodel.js +0 -11
  57. package/esm2015/lib/components/form/form.component.js +0 -184
  58. package/esm2015/lib/components/form/form.module.js +0 -23
  59. package/esm2015/lib/components/grid-toolbar/grid-toolbar.component.js +0 -57
  60. package/esm2015/lib/components/grid-toolbar/grid-toolbar.module.js +0 -23
  61. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.component.js +0 -28
  62. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.module.js +0 -19
  63. package/esm2015/lib/components/hour-scheduling/components/hour-scheduling-test-object/hour-scheduling-test-object.component.js +0 -22
  64. package/esm2015/lib/components/hour-scheduling/hour-scheduling.component.js +0 -276
  65. package/esm2015/lib/components/hour-scheduling/hour-scheduling.module.js +0 -23
  66. package/esm2015/lib/components/hour-scheduling/model/enum/scheduling-object.interface.js +0 -2
  67. package/esm2015/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.component.js +0 -111
  68. package/esm2015/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.module.js +0 -20
  69. package/esm2015/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.component.js +0 -337
  70. package/esm2015/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.module.js +0 -24
  71. package/esm2015/lib/components/icon/icon-cache.service.js +0 -52
  72. package/esm2015/lib/components/icon/icon.component.js +0 -48
  73. package/esm2015/lib/components/icon/icon.module.js +0 -25
  74. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.component.js +0 -64
  75. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.module.js +0 -23
  76. package/esm2015/lib/components/image/image.component.js +0 -42
  77. package/esm2015/lib/components/image/image.module.js +0 -14
  78. package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +0 -79
  79. package/esm2015/lib/components/input-checkbox/input-checkbox.module.js +0 -19
  80. package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +0 -145
  81. package/esm2015/lib/components/input-date-picker/input-date-picker.module.js +0 -28
  82. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.component.js +0 -178
  83. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.module.js +0 -27
  84. package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +0 -320
  85. package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +0 -23
  86. package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +0 -84
  87. package/esm2015/lib/components/input-radio-button/input-radio-button.module.js +0 -19
  88. package/esm2015/lib/components/input-scanner/bar-code-scanner.js +0 -36
  89. package/esm2015/lib/components/input-scanner/input-scanner.component.js +0 -94
  90. package/esm2015/lib/components/input-scanner/input-scanner.module.js +0 -21
  91. package/esm2015/lib/components/input-scanner/scanner.service.js +0 -28
  92. package/esm2015/lib/components/input-search/input-search.component.js +0 -92
  93. package/esm2015/lib/components/input-search/input-search.module.js +0 -21
  94. package/esm2015/lib/components/input-text/input-text.component.js +0 -381
  95. package/esm2015/lib/components/input-text/input-text.module.js +0 -33
  96. package/esm2015/lib/components/input-textarea/input-textarea.component.js +0 -78
  97. package/esm2015/lib/components/input-textarea/input-textarea.module.js +0 -27
  98. package/esm2015/lib/components/input-time/input-time.component.js +0 -74
  99. package/esm2015/lib/components/input-time/input-time.module.js +0 -24
  100. package/esm2015/lib/components/level-indicator/level-indicator-level.enum.js +0 -7
  101. package/esm2015/lib/components/level-indicator/level-indicator.component.js +0 -36
  102. package/esm2015/lib/components/level-indicator/level-indicator.module.js +0 -15
  103. package/esm2015/lib/components/list-of-icons/list-of-icons.component.js +0 -98
  104. package/esm2015/lib/components/list-of-icons/list-of-icons.module.js +0 -27
  105. package/esm2015/lib/components/list-of-values/list-of-values-multiselect-popup.component.js +0 -112
  106. package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +0 -321
  107. package/esm2015/lib/components/list-of-values/list-of-values.component.js +0 -344
  108. package/esm2015/lib/components/list-of-values/list-of-values.module.js +0 -39
  109. package/esm2015/lib/components/loader/loader.component.js +0 -84
  110. package/esm2015/lib/components/loader/loader.module.js +0 -19
  111. package/esm2015/lib/components/pagination/paginate.pipe.js +0 -99
  112. package/esm2015/lib/components/pagination/pagination-instance.js +0 -2
  113. package/esm2015/lib/components/pagination/pagination.component.js +0 -126
  114. package/esm2015/lib/components/pagination/pagination.module.js +0 -28
  115. package/esm2015/lib/components/pagination/pagination.service.js +0 -88
  116. package/esm2015/lib/components/pagination-bar/pagination-bar.component.js +0 -151
  117. package/esm2015/lib/components/pagination-bar/pagination-bar.module.js +0 -19
  118. package/esm2015/lib/components/popup/const/popup-window-token.js +0 -3
  119. package/esm2015/lib/components/popup/interface/popup-button.js +0 -8
  120. package/esm2015/lib/components/popup/interface/popup-close-event.js +0 -2
  121. package/esm2015/lib/components/popup/interface/popup-settings.js +0 -42
  122. package/esm2015/lib/components/popup/interface/popup.js +0 -2
  123. package/esm2015/lib/components/popup/model/popup-button-globals.js +0 -11
  124. package/esm2015/lib/components/popup/model/popup-window.js +0 -38
  125. package/esm2015/lib/components/popup/popup-buttons.component.js +0 -53
  126. package/esm2015/lib/components/popup/popup-message-display.component.js +0 -48
  127. package/esm2015/lib/components/popup/popup-window-shell.component.js +0 -159
  128. package/esm2015/lib/components/popup/popup.module.js +0 -49
  129. package/esm2015/lib/components/popup/service/popup-shower.service.js +0 -90
  130. package/esm2015/lib/components/popup/service/prompt.service.js +0 -127
  131. package/esm2015/lib/components/popup/text-input-popup.component.js +0 -36
  132. package/esm2015/lib/components/responsive-text/responsive-text.component.js +0 -24
  133. package/esm2015/lib/components/responsive-text/responsive-text.module.js +0 -19
  134. package/esm2015/lib/components/simple-grid/base-simple-grid.component.js +0 -193
  135. package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +0 -172
  136. package/esm2015/lib/components/simple-grid/simple-grid-column.directive.js +0 -113
  137. package/esm2015/lib/components/simple-grid/simple-grid.component.js +0 -773
  138. package/esm2015/lib/components/simple-grid/simple-grid.module.js +0 -47
  139. package/esm2015/lib/components/tile/tile.component.js +0 -73
  140. package/esm2015/lib/components/tile/tile.module.js +0 -23
  141. package/esm2015/lib/components/tile-select/tile-select.component.js +0 -36
  142. package/esm2015/lib/components/tile-select/tile-select.module.js +0 -21
  143. package/esm2015/lib/components/tooltip/tooltip.component.js +0 -95
  144. package/esm2015/lib/components/tooltip/tooltip.module.js +0 -19
  145. package/esm2015/lib/components/validation-error/validation-error.component.js +0 -38
  146. package/esm2015/lib/components/validation-error/validation-error.module.js +0 -25
  147. package/esm2015/lib/components/view-mode-buttons/content-view-mode.enum.js +0 -11
  148. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.component.js +0 -64
  149. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.module.js +0 -21
  150. package/esm2015/lib/core/constant/default-upper-bound-for-range-components.js +0 -4
  151. package/esm2015/lib/core/constant/java-max-int.js +0 -2
  152. package/esm2015/lib/core/constant/number-inputs-key-down-white-list.js +0 -45
  153. package/esm2015/lib/core/decorator/input-boolean.decorator.js +0 -34
  154. package/esm2015/lib/core/enum/co-direction.js +0 -9
  155. package/esm2015/lib/core/enum/co-document-type.enum.js +0 -11
  156. package/esm2015/lib/core/enum/co-orientation.js +0 -17
  157. package/esm2015/lib/core/enum/core-components-icon.enum.js +0 -307
  158. package/esm2015/lib/core/enum/file-type-internal.enum.js +0 -17
  159. package/esm2015/lib/core/enum/file-type.enum.js +0 -11
  160. package/esm2015/lib/core/enum/filterItem-mode.enum.js +0 -49
  161. package/esm2015/lib/core/enum/input-number-picker-show-mode.enum.js +0 -8
  162. package/esm2015/lib/core/enum/keyboard-code.enum.js +0 -74
  163. package/esm2015/lib/core/enum/keyboard-key.enum.js +0 -76
  164. package/esm2015/lib/core/enum/popup-button-type.enum.js +0 -12
  165. package/esm2015/lib/core/enum/popup-type.enum.js +0 -11
  166. package/esm2015/lib/core/function/any-nill.function.js +0 -6
  167. package/esm2015/lib/core/function/is-nill.function.js +0 -5
  168. package/esm2015/lib/core/function/none-nill.function.js +0 -17
  169. package/esm2015/lib/core/function/not-nill.function.js +0 -5
  170. package/esm2015/lib/core/model/bounds-constrained-number-value.js +0 -171
  171. package/esm2015/lib/core/model/check-precision-and-scale-result.js +0 -2
  172. package/esm2015/lib/core/model/check-within-stepped-bounds-result.js +0 -2
  173. package/esm2015/lib/core/model/core-components-icon-svg.js +0 -306
  174. package/esm2015/lib/core/model/element-position.js +0 -10
  175. package/esm2015/lib/core/model/event/string-prompt-result-event.js +0 -8
  176. package/esm2015/lib/core/service/form-input-user-change-listener.service.js +0 -25
  177. package/esm2015/lib/core/service/form-master.service.js +0 -102
  178. package/esm2015/lib/core/service/ng-zone-wrapper.service.js +0 -20
  179. package/esm2015/lib/core/utils/array-utils.js +0 -264
  180. package/esm2015/lib/core/utils/browser-utils.js +0 -100
  181. package/esm2015/lib/core/utils/direction-enum-utils.js +0 -14
  182. package/esm2015/lib/core/utils/event-utils.js +0 -53
  183. package/esm2015/lib/core/utils/file-utils.js +0 -267
  184. package/esm2015/lib/core/utils/number-utils.js +0 -309
  185. package/esm2015/lib/core/utils/object-utils.js +0 -186
  186. package/esm2015/lib/core/utils/string-utils.js +0 -94
  187. package/esm2015/lib/core/validator/email.validator.js +0 -6
  188. package/esm2015/lib/core/validator/equal.validator.js +0 -11
  189. package/esm2015/lib/core/validator/max-string-length.validator.js +0 -10
  190. package/esm2015/lib/core/validator/password.validator.js +0 -31
  191. package/esm2015/lib/core/validator/precision-scale.validator.js +0 -11
  192. package/esm2015/lib/core/validator/required.validator.js +0 -5
  193. package/esm2015/lib/directives/clickoutside/click-outside-master.service.js +0 -57
  194. package/esm2015/lib/directives/clickoutside/click-outside.directive.js +0 -71
  195. package/esm2015/lib/directives/clickoutside/clickoutside.module.js +0 -19
  196. package/esm2015/lib/directives/observe-visibility/observe-visibility.directive.js +0 -53
  197. package/esm2015/lib/directives/observe-visibility/observe-visibility.module.js +0 -15
  198. package/esm2015/lib/directives/overlay/overlay-parent.directive.js +0 -19
  199. package/esm2015/lib/directives/overlay/overlay.directive.js +0 -161
  200. package/esm2015/lib/directives/overlay/overlay.module.js +0 -18
  201. package/esm2015/lib/directives/ripple/ripple-ref.js +0 -26
  202. package/esm2015/lib/directives/ripple/ripple-renderer.js +0 -160
  203. package/esm2015/lib/directives/ripple/ripple.directive.js +0 -80
  204. package/esm2015/lib/directives/ripple/ripple.module.js +0 -24
  205. package/esm2015/lib/directives/ripple/scroll-dispatcher.service.js +0 -108
  206. package/esm2015/lib/directives/ripple/scrollable.directive.js +0 -40
  207. package/esm2015/lib/directives/ripple/viewport-ruler.service.js +0 -73
  208. package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +0 -159
  209. package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +0 -19
  210. package/esm2015/lib/directives/stopclick/stop-click.directive.js +0 -38
  211. package/esm2015/lib/directives/stopclick/stop-click.module.js +0 -15
  212. package/esm2015/lib/directives/template-wrapper/template-wrapper.directive.js +0 -68
  213. package/esm2015/lib/directives/template-wrapper/template-wrapper.module.js +0 -15
  214. package/esm2015/lib/directives/tooltip/tooltip-directive.module.js +0 -19
  215. package/esm2015/lib/directives/tooltip/tooltip.directive.js +0 -78
  216. package/esm2015/lib/interfaces/dialog-response.interface.js +0 -2
  217. package/esm2015/lib/interfaces/scanner-input.interface.js +0 -2
  218. package/esm2015/lib/interfaces/screen-config-adapter-component-interface-name.js +0 -4
  219. package/esm2015/lib/interfaces/screen-config-adapter.component.interface.js +0 -2
  220. package/esm2015/lib/model/enum/app-button-type.enum.js +0 -11
  221. package/esm2015/lib/model/enum/app-popup-type.enum.js +0 -8
  222. package/esm2015/lib/model/icon-list-item.js +0 -2
  223. package/esm2015/lib/pipes/append.pipe.js +0 -17
  224. package/esm2015/lib/pipes/append.pipe.module.js +0 -15
  225. package/esm2015/lib/pipes/filter.pipe.js +0 -16
  226. package/esm2015/lib/pipes/filter.pipe.module.js +0 -15
  227. package/esm2015/lib/pipes/prepend.pipe.js +0 -17
  228. package/esm2015/lib/pipes/prepend.pipe.module.js +0 -15
  229. package/esm2015/lib/pipes/price-display-pipe.module.js +0 -15
  230. package/esm2015/lib/pipes/price-display.pipe.js +0 -20
  231. package/esm2015/lib/service/base-module-screen-config.service.js +0 -205
  232. package/esm2015/lib/service/base-module.service.js +0 -42
  233. package/esm2015/lib/service/color-sequence.service.js +0 -49
  234. package/esm2015/lib/service/excel-export.service.js +0 -128
  235. package/esm2015/lib/service/overlay.service.js +0 -75
  236. package/esm2015/lib/translation/core-components-translation.module.js +0 -26
  237. package/esm2015/lib/translation/core-components-translation.service.js +0 -17
  238. package/esm2015/lib/translation/core-dictionary.service.js +0 -29
  239. package/esm2015/lib/translation/core-localize.pipe.js +0 -26
  240. package/esm2015/public-api.js +0 -142
  241. package/fesm2015/colijnit-corecomponents_v12.js.map +0 -1
  242. package/lib/components/article-tile/article-tile.component.d.ts +0 -22
  243. package/lib/components/article-tile/article-tile.module.d.ts +0 -2
  244. package/lib/components/base/base-input.component.d.ts +0 -189
  245. package/lib/components/base/base.module.d.ts +0 -2
  246. package/lib/components/base/commit-buttons/commit-buttons.component.d.ts +0 -21
  247. package/lib/components/base/commit-buttons/commit-buttons.module.d.ts +0 -2
  248. package/lib/components/base/dialog-base.component.d.ts +0 -4
  249. package/lib/components/base-input-date-picker/base-input-date-picker.directive.d.ts +0 -15
  250. package/lib/components/base-input-time/base-input-time-directive.d.ts +0 -14
  251. package/lib/components/button/button.component.d.ts +0 -31
  252. package/lib/components/button/button.module.d.ts +0 -2
  253. package/lib/components/calendar/calendar-template.component.d.ts +0 -70
  254. package/lib/components/calendar/calendar.component.d.ts +0 -13
  255. package/lib/components/calendar/calendar.module.d.ts +0 -2
  256. package/lib/components/card/card.component.d.ts +0 -23
  257. package/lib/components/card/card.module.d.ts +0 -2
  258. package/lib/components/carousel/carousel.component.d.ts +0 -23
  259. package/lib/components/carousel/carousel.module.d.ts +0 -6
  260. package/lib/components/carousel-3d/carousel-3d.component.d.ts +0 -55
  261. package/lib/components/carousel-3d/carousel-3d.module.d.ts +0 -2
  262. package/lib/components/carousel-3d/carouselItem.d.ts +0 -13
  263. package/lib/components/checkmark-overlay/checkmark-overlay.component.d.ts +0 -17
  264. package/lib/components/checkmark-overlay/checkmark-overlay.module.d.ts +0 -2
  265. package/lib/components/co-dialog/co-dialog.component.d.ts +0 -23
  266. package/lib/components/co-dialog/co-dialog.module.d.ts +0 -2
  267. package/lib/components/co-dialog-wizard/co-dialog-wizard.component.d.ts +0 -9
  268. package/lib/components/co-dialog-wizard/co-dialog-wizard.module.d.ts +0 -2
  269. package/lib/components/collapsible/collapsible.component.d.ts +0 -22
  270. package/lib/components/collapsible/collapsible.module.d.ts +0 -2
  271. package/lib/components/color-picker/color-picker.component.d.ts +0 -6
  272. package/lib/components/color-picker/color-picker.module.d.ts +0 -2
  273. package/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +0 -20
  274. package/lib/components/core-dialog/core-dialog.module.d.ts +0 -4
  275. package/lib/components/core-dialog/core-dialog.service.d.ts +0 -15
  276. package/lib/components/core-dialog/core-dynamic-component.service.d.ts +0 -12
  277. package/lib/components/double-calendar/double-calendar.component.d.ts +0 -20
  278. package/lib/components/double-calendar/double-calendar.module.d.ts +0 -2
  279. package/lib/components/filter-item/filter-item-viewmodel.d.ts +0 -9
  280. package/lib/components/filter-item/filter-item.component.d.ts +0 -126
  281. package/lib/components/filter-item/filter-item.module.d.ts +0 -2
  282. package/lib/components/filter-item/filter-viewmodel.d.ts +0 -8
  283. package/lib/components/form/form.component.d.ts +0 -39
  284. package/lib/components/form/form.module.d.ts +0 -2
  285. package/lib/components/grid-toolbar/grid-toolbar.component.d.ts +0 -19
  286. package/lib/components/grid-toolbar/grid-toolbar.module.d.ts +0 -2
  287. package/lib/components/grid-toolbar-button/grid-toolbar-button.component.d.ts +0 -8
  288. package/lib/components/grid-toolbar-button/grid-toolbar-button.module.d.ts +0 -2
  289. package/lib/components/hour-scheduling/components/hour-scheduling-test-object/hour-scheduling-test-object.component.d.ts +0 -5
  290. package/lib/components/hour-scheduling/hour-scheduling.component.d.ts +0 -48
  291. package/lib/components/hour-scheduling/hour-scheduling.module.d.ts +0 -2
  292. package/lib/components/hour-scheduling/model/enum/scheduling-object.interface.d.ts +0 -10
  293. package/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.component.d.ts +0 -23
  294. package/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.module.d.ts +0 -2
  295. package/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.component.d.ts +0 -78
  296. package/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.module.d.ts +0 -2
  297. package/lib/components/icon/icon-cache.service.d.ts +0 -20
  298. package/lib/components/icon/icon.component.d.ts +0 -17
  299. package/lib/components/icon/icon.module.d.ts +0 -2
  300. package/lib/components/icon-collapse-handle/icon-collapse-handle.component.d.ts +0 -21
  301. package/lib/components/icon-collapse-handle/icon-collapse-handle.module.d.ts +0 -2
  302. package/lib/components/image/image.component.d.ts +0 -20
  303. package/lib/components/image/image.module.d.ts +0 -2
  304. package/lib/components/input-checkbox/input-checkbox.component.d.ts +0 -24
  305. package/lib/components/input-checkbox/input-checkbox.module.d.ts +0 -2
  306. package/lib/components/input-date-picker/input-date-picker.component.d.ts +0 -30
  307. package/lib/components/input-date-picker/input-date-picker.module.d.ts +0 -2
  308. package/lib/components/input-date-range-picker/input-date-range-picker.component.d.ts +0 -27
  309. package/lib/components/input-date-range-picker/input-date-range-picker.module.d.ts +0 -2
  310. package/lib/components/input-number-picker/input-number-picker.component.d.ts +0 -74
  311. package/lib/components/input-number-picker/input-number-picker.module.d.ts +0 -2
  312. package/lib/components/input-radio-button/input-radio-button.component.d.ts +0 -19
  313. package/lib/components/input-radio-button/input-radio-button.module.d.ts +0 -2
  314. package/lib/components/input-scanner/bar-code-scanner.d.ts +0 -10
  315. package/lib/components/input-scanner/input-scanner.component.d.ts +0 -29
  316. package/lib/components/input-scanner/input-scanner.module.d.ts +0 -2
  317. package/lib/components/input-scanner/scanner.service.d.ts +0 -11
  318. package/lib/components/input-search/input-search.component.d.ts +0 -22
  319. package/lib/components/input-search/input-search.module.d.ts +0 -2
  320. package/lib/components/input-text/input-text.component.d.ts +0 -78
  321. package/lib/components/input-text/input-text.module.d.ts +0 -2
  322. package/lib/components/input-textarea/input-textarea.component.d.ts +0 -19
  323. package/lib/components/input-textarea/input-textarea.module.d.ts +0 -2
  324. package/lib/components/input-time/input-time.component.d.ts +0 -8
  325. package/lib/components/input-time/input-time.module.d.ts +0 -2
  326. package/lib/components/level-indicator/level-indicator-level.enum.d.ts +0 -5
  327. package/lib/components/level-indicator/level-indicator.component.d.ts +0 -10
  328. package/lib/components/level-indicator/level-indicator.module.d.ts +0 -2
  329. package/lib/components/list-of-icons/list-of-icons.component.d.ts +0 -22
  330. package/lib/components/list-of-icons/list-of-icons.module.d.ts +0 -2
  331. package/lib/components/list-of-values/list-of-values-multiselect-popup.component.d.ts +0 -25
  332. package/lib/components/list-of-values/list-of-values-popup.component.d.ts +0 -58
  333. package/lib/components/list-of-values/list-of-values.component.d.ts +0 -63
  334. package/lib/components/list-of-values/list-of-values.module.d.ts +0 -2
  335. package/lib/components/loader/loader.component.d.ts +0 -3
  336. package/lib/components/loader/loader.module.d.ts +0 -2
  337. package/lib/components/pagination/paginate.pipe.d.ts +0 -15
  338. package/lib/components/pagination/pagination-instance.d.ts +0 -14
  339. package/lib/components/pagination/pagination.component.d.ts +0 -38
  340. package/lib/components/pagination/pagination.module.d.ts +0 -2
  341. package/lib/components/pagination/pagination.service.d.ts +0 -24
  342. package/lib/components/pagination-bar/pagination-bar.component.d.ts +0 -33
  343. package/lib/components/pagination-bar/pagination-bar.module.d.ts +0 -2
  344. package/lib/components/popup/const/popup-window-token.d.ts +0 -3
  345. package/lib/components/popup/interface/popup-button.d.ts +0 -8
  346. package/lib/components/popup/interface/popup-close-event.d.ts +0 -5
  347. package/lib/components/popup/interface/popup-settings.d.ts +0 -21
  348. package/lib/components/popup/interface/popup.d.ts +0 -9
  349. package/lib/components/popup/model/popup-button-globals.d.ts +0 -9
  350. package/lib/components/popup/model/popup-window.d.ts +0 -21
  351. package/lib/components/popup/popup-buttons.component.d.ts +0 -13
  352. package/lib/components/popup/popup-message-display.component.d.ts +0 -12
  353. package/lib/components/popup/popup-window-shell.component.d.ts +0 -42
  354. package/lib/components/popup/popup.module.d.ts +0 -4
  355. package/lib/components/popup/service/popup-shower.service.d.ts +0 -17
  356. package/lib/components/popup/service/prompt.service.d.ts +0 -17
  357. package/lib/components/popup/text-input-popup.component.d.ts +0 -12
  358. package/lib/components/responsive-text/responsive-text.component.d.ts +0 -4
  359. package/lib/components/responsive-text/responsive-text.module.d.ts +0 -2
  360. package/lib/components/simple-grid/base-simple-grid.component.d.ts +0 -59
  361. package/lib/components/simple-grid/simple-grid-cell.component.d.ts +0 -30
  362. package/lib/components/simple-grid/simple-grid-column.directive.d.ts +0 -43
  363. package/lib/components/simple-grid/simple-grid.component.d.ts +0 -87
  364. package/lib/components/simple-grid/simple-grid.module.d.ts +0 -2
  365. package/lib/components/tile/tile.component.d.ts +0 -16
  366. package/lib/components/tile/tile.module.d.ts +0 -2
  367. package/lib/components/tile-select/tile-select.component.d.ts +0 -8
  368. package/lib/components/tile-select/tile-select.module.d.ts +0 -2
  369. package/lib/components/tooltip/tooltip.component.d.ts +0 -23
  370. package/lib/components/tooltip/tooltip.module.d.ts +0 -2
  371. package/lib/components/validation-error/validation-error.component.d.ts +0 -12
  372. package/lib/components/validation-error/validation-error.module.d.ts +0 -2
  373. package/lib/components/view-mode-buttons/content-view-mode.enum.d.ts +0 -8
  374. package/lib/components/view-mode-buttons/view-mode-buttons.component.d.ts +0 -17
  375. package/lib/components/view-mode-buttons/view-mode-buttons.module.d.ts +0 -2
  376. package/lib/core/constant/default-upper-bound-for-range-components.d.ts +0 -2
  377. package/lib/core/constant/java-max-int.d.ts +0 -1
  378. package/lib/core/constant/number-inputs-key-down-white-list.d.ts +0 -2
  379. package/lib/core/decorator/input-boolean.decorator.d.ts +0 -8
  380. package/lib/core/enum/co-direction.d.ts +0 -6
  381. package/lib/core/enum/co-document-type.enum.d.ts +0 -5
  382. package/lib/core/enum/co-orientation.d.ts +0 -6
  383. package/lib/core/enum/core-components-icon.enum.d.ts +0 -305
  384. package/lib/core/enum/file-type-internal.enum.d.ts +0 -15
  385. package/lib/core/enum/file-type.enum.d.ts +0 -5
  386. package/lib/core/enum/filterItem-mode.enum.d.ts +0 -17
  387. package/lib/core/enum/input-number-picker-show-mode.enum.d.ts +0 -5
  388. package/lib/core/enum/keyboard-code.enum.d.ts +0 -71
  389. package/lib/core/enum/keyboard-key.enum.d.ts +0 -70
  390. package/lib/core/enum/popup-button-type.enum.d.ts +0 -9
  391. package/lib/core/enum/popup-type.enum.d.ts +0 -9
  392. package/lib/core/function/any-nill.function.d.ts +0 -1
  393. package/lib/core/function/is-nill.function.d.ts +0 -1
  394. package/lib/core/function/none-nill.function.d.ts +0 -1
  395. package/lib/core/function/not-nill.function.d.ts +0 -1
  396. package/lib/core/model/bounds-constrained-number-value.d.ts +0 -46
  397. package/lib/core/model/check-precision-and-scale-result.d.ts +0 -4
  398. package/lib/core/model/check-within-stepped-bounds-result.d.ts +0 -8
  399. package/lib/core/model/core-components-icon-svg.d.ts +0 -4
  400. package/lib/core/model/element-position.d.ts +0 -7
  401. package/lib/core/model/event/string-prompt-result-event.d.ts +0 -6
  402. package/lib/core/service/form-input-user-change-listener.service.d.ts +0 -10
  403. package/lib/core/service/form-master.service.d.ts +0 -26
  404. package/lib/core/service/ng-zone-wrapper.service.d.ts +0 -6
  405. package/lib/core/utils/array-utils.d.ts +0 -85
  406. package/lib/core/utils/browser-utils.d.ts +0 -15
  407. package/lib/core/utils/direction-enum-utils.d.ts +0 -5
  408. package/lib/core/utils/event-utils.d.ts +0 -12
  409. package/lib/core/utils/file-utils.d.ts +0 -29
  410. package/lib/core/utils/number-utils.d.ts +0 -89
  411. package/lib/core/utils/object-utils.d.ts +0 -31
  412. package/lib/core/utils/string-utils.d.ts +0 -25
  413. package/lib/core/validator/email.validator.d.ts +0 -2
  414. package/lib/core/validator/equal.validator.d.ts +0 -2
  415. package/lib/core/validator/max-string-length.validator.d.ts +0 -2
  416. package/lib/core/validator/password.validator.d.ts +0 -3
  417. package/lib/core/validator/precision-scale.validator.d.ts +0 -2
  418. package/lib/core/validator/required.validator.d.ts +0 -2
  419. package/lib/directives/clickoutside/click-outside-master.service.d.ts +0 -15
  420. package/lib/directives/clickoutside/click-outside.directive.d.ts +0 -18
  421. package/lib/directives/clickoutside/clickoutside.module.d.ts +0 -2
  422. package/lib/directives/observe-visibility/observe-visibility.directive.d.ts +0 -14
  423. package/lib/directives/observe-visibility/observe-visibility.module.d.ts +0 -2
  424. package/lib/directives/overlay/overlay-parent.directive.d.ts +0 -6
  425. package/lib/directives/overlay/overlay.directive.d.ts +0 -25
  426. package/lib/directives/overlay/overlay.module.d.ts +0 -2
  427. package/lib/directives/ripple/ripple-ref.d.ts +0 -21
  428. package/lib/directives/ripple/ripple-renderer.d.ts +0 -56
  429. package/lib/directives/ripple/ripple.directive.d.ts +0 -56
  430. package/lib/directives/ripple/ripple.module.d.ts +0 -2
  431. package/lib/directives/ripple/scroll-dispatcher.service.d.ts +0 -51
  432. package/lib/directives/ripple/scrollable.directive.d.ts +0 -20
  433. package/lib/directives/ripple/viewport-ruler.service.d.ts +0 -29
  434. package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +0 -32
  435. package/lib/directives/screen-configuration/screen-configuration.module.d.ts +0 -2
  436. package/lib/directives/stopclick/stop-click.directive.d.ts +0 -10
  437. package/lib/directives/stopclick/stop-click.module.d.ts +0 -2
  438. package/lib/directives/template-wrapper/template-wrapper.directive.d.ts +0 -13
  439. package/lib/directives/template-wrapper/template-wrapper.module.d.ts +0 -2
  440. package/lib/directives/tooltip/tooltip-directive.module.d.ts +0 -2
  441. package/lib/directives/tooltip/tooltip.directive.d.ts +0 -20
  442. package/lib/interfaces/dialog-response.interface.d.ts +0 -6
  443. package/lib/interfaces/scanner-input.interface.d.ts +0 -3
  444. package/lib/interfaces/screen-config-adapter-component-interface-name.d.ts +0 -3
  445. package/lib/interfaces/screen-config-adapter.component.interface.d.ts +0 -14
  446. package/lib/model/enum/app-button-type.enum.d.ts +0 -9
  447. package/lib/model/enum/app-popup-type.enum.d.ts +0 -6
  448. package/lib/model/icon-list-item.d.ts +0 -7
  449. package/lib/pipes/append.pipe.d.ts +0 -4
  450. package/lib/pipes/append.pipe.module.d.ts +0 -2
  451. package/lib/pipes/filter.pipe.d.ts +0 -4
  452. package/lib/pipes/filter.pipe.module.d.ts +0 -2
  453. package/lib/pipes/prepend.pipe.d.ts +0 -4
  454. package/lib/pipes/prepend.pipe.module.d.ts +0 -2
  455. package/lib/pipes/price-display-pipe.module.d.ts +0 -2
  456. package/lib/pipes/price-display.pipe.d.ts +0 -4
  457. package/lib/service/base-module-screen-config.service.d.ts +0 -47
  458. package/lib/service/base-module.service.d.ts +0 -22
  459. package/lib/service/color-sequence.service.d.ts +0 -7
  460. package/lib/service/excel-export.service.d.ts +0 -45
  461. package/lib/service/overlay.service.d.ts +0 -13
  462. package/lib/translation/core-components-translation.module.d.ts +0 -4
  463. package/lib/translation/core-components-translation.service.d.ts +0 -6
  464. package/lib/translation/core-dictionary.service.d.ts +0 -12
  465. package/lib/translation/core-localize.pipe.d.ts +0 -7
  466. package/public-api.d.ts +0 -138
@@ -1,849 +0,0 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Injectable, Input, Optional, Output, ViewChild, ViewContainerRef } from '@angular/core';
3
- import { NgModel } from '@angular/forms';
4
- import { isNill } from '../../core/function/is-nill.function';
5
- import { notNill } from '../../core/function/not-nill.function';
6
- import { InputBoolean, InputBooleanDecorator } from '../../core/decorator/input-boolean.decorator';
7
- import { requiredValidator } from '../../core/validator/required.validator';
8
- import { precisionScaleValidator } from '../../core/validator/precision-scale.validator';
9
- import { maxStringLengthValidator } from '../../core/validator/max-string-length.validator';
10
- import { StringUtils } from '../../core/utils/string-utils';
11
- import { FormInputUserModelChangeListenerService } from '../../core/service/form-input-user-change-listener.service';
12
- import { NumberUtils } from '../../core/utils/number-utils';
13
- import { NgZoneWrapperService } from '../../core/service/ng-zone-wrapper.service';
14
- import { CoreComponentsIcon } from '../../core/enum/core-components-icon.enum';
15
- import { ValidationErrorComponent } from '../validation-error/validation-error.component';
16
- import { OverlayService } from '../../service/overlay.service';
17
- import { CommitButtonsComponent } from './commit-buttons/commit-buttons.component';
18
- /**
19
- * Abstract base class for all concrete form input components that contain a native <input> element. Provides common data and functionality, such as
20
- * adding self as a control to the parent form.
21
- */
22
- export class BaseInputComponent {
23
- constructor(changeDetector, componentFactoryResolver, overlayService, formUserChangeListener, ngZoneWrapper, elementRef) {
24
- this.changeDetector = changeDetector;
25
- this.componentFactoryResolver = componentFactoryResolver;
26
- this.overlayService = overlayService;
27
- this.formUserChangeListener = formUserChangeListener;
28
- this.ngZoneWrapper = ngZoneWrapper;
29
- this.elementRef = elementRef;
30
- this.icons = CoreComponentsIcon;
31
- this.showSaveCancel = false;
32
- this.noValidation = false;
33
- this.forceRequired = false; // a force outside of [cfgName]'s influence
34
- // Goal: ability to emulate the red background of input fields (form-submitted invalid state)
35
- this.redErrorBackground = false;
36
- this.commitOnBlur = true;
37
- // @Output()
38
- // public commit: EventEmitter<any> = new EventEmitter<any>();
39
- this.nativeBlur = new EventEmitter();
40
- this.blur = new EventEmitter();
41
- // emits when the enter button on keyboard was pressed while this form input had focussed
42
- this.enter = new EventEmitter();
43
- this.focus = new EventEmitter();
44
- this.keyDown = new EventEmitter();
45
- this.keyUp = new EventEmitter();
46
- this.modelChange = new EventEmitter();
47
- this.selectedValueChange = new EventEmitter();
48
- this.userModelChange = new EventEmitter();
49
- this.hiddenChange = new EventEmitter();
50
- this.cancelClicked = new EventEmitter();
51
- this.focused = false;
52
- this.formInput = true;
53
- this.customWidth = false;
54
- this.customHeight = false;
55
- this.noTriangleGraphic = false;
56
- this.keepFocussed = false;
57
- this.halfWidth = false;
58
- this.fullWidth = false;
59
- this.excludeUserModelChange = false;
60
- this.noFormGroupControl = false;
61
- this.keepFocus = false;
62
- this.validationError = '';
63
- this.shouldCommit = true;
64
- this._markedAsUserTouched = false;
65
- this._destroyed = false;
66
- this._hasOnPushCdStrategy = false;
67
- this._modelDirtyForCommit = false;
68
- this._initialModelSet = false;
69
- this._forceReadonly = undefined;
70
- this._validators = [];
71
- this._asyncValidators = [];
72
- this._canSaveOrCancel = false;
73
- // descendents should override this
74
- this.commit = (model) => __awaiter(this, void 0, void 0, function* () {
75
- return Promise.resolve(true);
76
- });
77
- BaseInputComponent.BaseFormInputComponentIndex++;
78
- this.name = BaseInputComponent.BaseFormInputComponentIndex.toString();
79
- if (this.formUserChangeListener) {
80
- this._clearMarkedAsUserTouchedSub = this.formUserChangeListener.clearAllMarkedAsUserTouched.subscribe(() => {
81
- this._markedAsUserTouched = false;
82
- });
83
- }
84
- }
85
- get ngModel() {
86
- if (this._myFormInputInstance) {
87
- return this._myFormInputInstance.ngModel;
88
- }
89
- else {
90
- return this._ngModel;
91
- }
92
- }
93
- set model(value) {
94
- if (!this._initialModelSet) {
95
- this._initialModel = this._model;
96
- this._initialModelSet = true;
97
- }
98
- this._model = value;
99
- this.canSaveOrCancel = this._model !== this._initialModel;
100
- this._modelDirtyForCommit = this._model !== this._initialModel;
101
- this._clearErrorComponent();
102
- this.modelSet();
103
- }
104
- get model() {
105
- return this._model;
106
- }
107
- set disabled(disabled) {
108
- if (disabled === this._disabled) {
109
- return;
110
- }
111
- this._disabled = InputBooleanDecorator.InputValueToBoolean(disabled);
112
- this._updateControlValidatorsAndOwnFlags();
113
- }
114
- get disabled() {
115
- return this._disabled;
116
- }
117
- set maxLength(maxLength) {
118
- this.setMaxLength(maxLength);
119
- }
120
- get maxLength() {
121
- return notNill(this.forcedMaxLength) ? this.forcedMaxLength : this._maxLength;
122
- }
123
- set defaultValue(defaultValue) {
124
- this._defaultValue = defaultValue;
125
- }
126
- get defaultValue() {
127
- return this._defaultValue;
128
- }
129
- set readonly(readonly) {
130
- if (this._forceReadonly !== undefined || readonly === this._readonly) {
131
- return;
132
- }
133
- this._readonly = InputBooleanDecorator.InputValueToBoolean(readonly);
134
- this._updateControlValidatorsAndOwnFlags();
135
- if (this._hasOnPushCdStrategy) {
136
- this.detectChanges();
137
- }
138
- }
139
- get readonly() {
140
- return this.forceReadonly || this._readonly;
141
- }
142
- set forceReadonly(forceReadonly) {
143
- if (forceReadonly === this._forceReadonly) {
144
- return;
145
- }
146
- this._forceReadonly = InputBooleanDecorator.InputValueToBoolean(forceReadonly);
147
- this._updateControlValidatorsAndOwnFlags();
148
- }
149
- get forceReadonly() {
150
- return this._forceReadonly;
151
- }
152
- set required(required) {
153
- if (required === this._required) {
154
- return;
155
- }
156
- this._required = InputBooleanDecorator.InputValueToBoolean(required);
157
- this._updateControlValidatorsAndOwnFlags();
158
- }
159
- get required() {
160
- return this.forceRequired || this._required;
161
- }
162
- set validators(validators) {
163
- if (validators === this._validators) {
164
- return;
165
- }
166
- this._validators = validators;
167
- this._updateControlValidatorsAndOwnFlags();
168
- }
169
- get validators() {
170
- return this._validators;
171
- }
172
- set asyncValidators(validators) {
173
- this._asyncValidators = validators;
174
- this._updateControlValidatorsAndOwnFlags();
175
- }
176
- get asyncValidators() {
177
- return this._asyncValidators;
178
- }
179
- set hidden(hidden) {
180
- if (hidden === this._hidden) {
181
- return;
182
- }
183
- this._hidden = hidden;
184
- this._addOrRemoveSelfFromForm();
185
- if (!this._destroyed) {
186
- if (hidden) {
187
- this.changeDetector.detach();
188
- }
189
- else {
190
- this.changeDetector.reattach();
191
- if (this._hasOnPushCdStrategy) {
192
- this.detectChangesAfterAngular();
193
- }
194
- }
195
- }
196
- this.hiddenChange.emit(hidden);
197
- }
198
- get hidden() {
199
- return this._hidden;
200
- }
201
- // no custom setter logic as with the other 'screen config props', because concrete form input components handle this themselves.
202
- set decimals(value) {
203
- this._decimals = value;
204
- }
205
- get decimals() {
206
- return this._decimals;
207
- }
208
- set myFormInputInstance(value) {
209
- if (value === this._myFormInputInstance) {
210
- return;
211
- }
212
- this._myFormInputInstance = value;
213
- this._updateControlValidatorsAndOwnFlags();
214
- }
215
- get myFormInputInstance() {
216
- return this._myFormInputInstance;
217
- }
218
- get formSubmitted() {
219
- return this.formComponent && this.formComponent.submitted;
220
- }
221
- get hasNoLabel() {
222
- return isNill(this.label);
223
- }
224
- get hasValue() {
225
- return (!Array.isArray(this.model) && !!this.model || StringUtils.IsStringWithLength(this.model) || NumberUtils.IsNumber(this.model)) ||
226
- (Array.isArray(this.model) && this.model.length > 0);
227
- }
228
- get invalid() {
229
- return this._checkState() && !this.control.valid;
230
- }
231
- get isDisabled() {
232
- return this._disabled;
233
- }
234
- get isReadonly() {
235
- return this.readonly;
236
- }
237
- get isRequired() {
238
- return this.required;
239
- }
240
- get touchedInvalid() {
241
- return this._controlExists() && this.control.touched && !this.control.valid;
242
- }
243
- get valid() {
244
- return this._checkState() && this.control.valid;
245
- }
246
- get validationDisabled() {
247
- return this.readonly || this.disabled || this.noValidation;
248
- }
249
- onClick(event) {
250
- if (this.canChange && !this.noClickFocus) {
251
- this.requestFocus();
252
- if (!this.excludeUserModelChange) {
253
- this.markAsUserTouched();
254
- }
255
- }
256
- }
257
- onFocusIn() {
258
- if (!this.excludeUserModelChange) {
259
- this.markAsUserTouched();
260
- }
261
- }
262
- // @HostListener("document:scroll")
263
- // public handleDocumentScroll(): void {
264
- // this._positionValidationError();
265
- // }
266
- // @HostListener("window:resize")
267
- // public handleWindowResize(): void {
268
- // this._positionValidationError();
269
- // }
270
- handleKeyDown(event) {
271
- this.keyDown.next(event);
272
- if (this.showSaveCancel && this.canSaveOrCancel) {
273
- this._handleKeyDown(event);
274
- }
275
- // this._positionValidationError();
276
- }
277
- get canChange() {
278
- return !this.readonly && !this.disabled;
279
- }
280
- get control() {
281
- return this._myFormInputInstance ? this._myFormInputInstance.control : this.ngModel && this.ngModel.control;
282
- }
283
- get formInputInstance() {
284
- return this._myFormInputInstance || this;
285
- }
286
- get isDestroyed() {
287
- return this._destroyed;
288
- }
289
- set canSaveOrCancel(value) {
290
- this._canSaveOrCancel = value;
291
- if (this.showSaveCancel && this.focused && this._canSaveOrCancel) {
292
- if (!this._commitButtonsComponentRef) {
293
- this._commitButtonsComponentRef = this.overlayService.createComponent(CommitButtonsComponent, {
294
- parentForOverlay: this.elementRef,
295
- committing: false,
296
- commitFinished: false
297
- }, {
298
- commitClick: (event) => this._handleCommit(event),
299
- cancelClick: (event) => this.cancelClick(event)
300
- });
301
- }
302
- }
303
- else {
304
- this.overlayService.removeComponent(this._commitButtonsComponentRef);
305
- this._commitButtonsComponentRef = undefined;
306
- }
307
- }
308
- get canSaveOrCancel() {
309
- return this._canSaveOrCancel;
310
- }
311
- ngOnInit() {
312
- this._modelChangeSub = this.modelChange.subscribe((val) => {
313
- this.model = val;
314
- });
315
- }
316
- ngAfterViewInit() {
317
- this._prepareInput();
318
- this._updateControlValidatorsAndOwnFlags();
319
- this._addOrRemoveSelfFromForm();
320
- if (this.formComponent) {
321
- this.readonly = this.readonly || this.formComponent.readonly;
322
- this._formReadonlyChangeSub = this.formComponent.readonlyChange.subscribe((isFormReadonly) => {
323
- this.readonly = isFormReadonly;
324
- });
325
- }
326
- if (this.initFocus) {
327
- setTimeout(this.requestFocus.bind(this));
328
- }
329
- }
330
- ngOnDestroy() {
331
- this._removeSelfFromForm();
332
- if (this.input) {
333
- this.input.removeEventListener('blur', (event) => this.doBlur(event));
334
- this.input.removeEventListener('focus', (event) => this.doFocus(event));
335
- }
336
- this._destroyed = true;
337
- this._clearErrorComponent();
338
- // if (this.tooltipManager && this.elementRef) {
339
- // this.tooltipManager.destroyErrorTooltipOfElement(this.elementRef.nativeElement);
340
- // }
341
- if (this._modelChangeSub) {
342
- this._modelChangeSub.unsubscribe();
343
- }
344
- if (this._speechSub) {
345
- this._speechSub.unsubscribe();
346
- }
347
- if (this._formAnySubmitSub) {
348
- this._formAnySubmitSub.unsubscribe();
349
- }
350
- if (this._formReadonlyChangeSub) {
351
- this._formReadonlyChangeSub.unsubscribe();
352
- }
353
- if (this._clearMarkedAsUserTouchedSub) {
354
- this._clearMarkedAsUserTouchedSub.unsubscribe();
355
- }
356
- // this._removeSelfFromForm();
357
- this.elementRef = undefined;
358
- this.changeDetector = undefined;
359
- this.input = undefined;
360
- }
361
- cancelClick(event) {
362
- this.shouldCommit = false;
363
- this.keepFocus = true;
364
- if (this._initialModelSet) {
365
- this.model = this._initialModel;
366
- }
367
- this.keepFocus = false;
368
- this.cancelClicked.emit();
369
- }
370
- showValidationError(error) {
371
- this.validationError = error;
372
- this._validationComponentRef = this.overlayService.createComponent(ValidationErrorComponent, { parentForOverlay: this.elementRef, error: error });
373
- }
374
- /**
375
- * Emits a modelChange event with given value, indicating that the model of this form input
376
- * has changed and its new value is given value. Also emits userModelChange if markedAsUserTouched.
377
- */
378
- setModel(value) {
379
- this.model = value;
380
- this.modelChange.emit(value);
381
- if (this.control) {
382
- this.control.markAsDirty({ onlySelf: true });
383
- }
384
- if (this.formComponent) {
385
- this.formComponent.formGroup.markAsDirty({ onlySelf: true });
386
- }
387
- if (this._markedAsUserTouched && this.formUserChangeListener) {
388
- this.formUserChangeListener.userModelChange.next(value);
389
- this.userModelChange.next(value);
390
- }
391
- if (this._hasOnPushCdStrategy) {
392
- this.detectChanges();
393
- }
394
- }
395
- requestFocus() {
396
- if (this.canChange && this.input) {
397
- this.input.focus();
398
- this.focused = true;
399
- if (this._hasOnPushCdStrategy) {
400
- this.markForCheck();
401
- }
402
- }
403
- }
404
- doFocus(event) {
405
- if (this.disabled) {
406
- return;
407
- }
408
- this._initialModelSet = false;
409
- this.focused = true;
410
- this.canSaveOrCancel = false;
411
- if (this._hasOnPushCdStrategy) {
412
- this.markForCheck();
413
- }
414
- this.focus.next();
415
- }
416
- doBlur(event, handleCommit = true) {
417
- return __awaiter(this, void 0, void 0, function* () {
418
- if (this.showSaveCancel && handleCommit && this._modelDirtyForCommit && this.shouldCommit) {
419
- yield this._handleCommit(event, false);
420
- }
421
- setTimeout(() => {
422
- if (this.keepFocus || this.keepFocussed) {
423
- if (event) {
424
- event.preventDefault;
425
- }
426
- return false;
427
- }
428
- this.focused = false;
429
- if (this._hasOnPushCdStrategy) {
430
- this.markForCheck();
431
- }
432
- if (this.input) {
433
- this.input.blur();
434
- }
435
- this.blur.next();
436
- }, 200);
437
- });
438
- }
439
- detectChanges() {
440
- if (!this._destroyed) {
441
- this.changeDetector.detectChanges();
442
- }
443
- }
444
- markForCheck() {
445
- if (!this._destroyed) {
446
- this.changeDetector.markForCheck();
447
- }
448
- }
449
- detectChangesAfterAngular() {
450
- if (!!this.ngZoneWrapper) {
451
- this.ngZoneWrapper.setTimeoutOutsideAngular(() => {
452
- if (!this._destroyed) {
453
- if (this._hasOnPushCdStrategy) {
454
- this.changeDetector.markForCheck();
455
- }
456
- this.changeDetector.detectChanges();
457
- }
458
- });
459
- }
460
- }
461
- /**
462
- * Links the given formComp.submit event to the firing of detectChanges() of given change detector. This is a 'utility-like' method,
463
- * but we manage the actual subscription (with UNSUBSCRIBE()!) on this base class.
464
- * @param formComp The form whose submit we want to link with the call of .detectChanges() on given change detector ref.
465
- * @param changeDetectorRef This should be given as param. I choose not to make this part of our (BaseFormInputComponent) constructor,
466
- * because we already have 21 extenders.
467
- */
468
- // public linkFormAnySubmitWithDetectChanges(formComp: FormComponent, changeDetectorRef: ChangeDetectorRef): void {
469
- // if (formComp && changeDetectorRef) {
470
- // this._formAnySubmitSub = formComp.anySubmit.subscribe((() => {
471
- // if (!this._destroyed) {
472
- // changeDetectorRef.detectChanges();
473
- // }
474
- // }));
475
- // }
476
- // }
477
- markAsUserTouched() {
478
- this._markedAsUserTouched = true;
479
- this.redErrorBackground = false; // not sure if this is the right place to do that
480
- }
481
- clearMarkedAsUserTouched() {
482
- this._markedAsUserTouched = false;
483
- }
484
- modelSet() {
485
- }
486
- //used for descendents, because descendents can't set super properties, see InputNumberComponent
487
- setMaxLength(maxLength) {
488
- if (notNill(this.forcedMaxLength) || maxLength === this._maxLength) {
489
- return;
490
- }
491
- if (!isNaN(maxLength)) {
492
- this._maxLength = maxLength;
493
- this._updateControlValidatorsAndOwnFlags();
494
- }
495
- }
496
- _markAsOnPush() {
497
- this._hasOnPushCdStrategy = true;
498
- }
499
- _checkState() {
500
- if (this.ngModel) {
501
- return this.formSubmitted || (this._controlExists() && this.control.touched);
502
- }
503
- else {
504
- return false;
505
- }
506
- }
507
- // Place validators onto our Angular's FormControl.
508
- _updateControlValidatorsAndOwnFlags() {
509
- const er = this.myFormInputInstance ? this.myFormInputInstance.elementRef : this.elementRef;
510
- // if (this.tooltipManager && er) {
511
- // this.tooltipManager.destroyErrorTooltipOfElement(er.nativeElement);
512
- // }
513
- this._setNativeRequired(this.required);
514
- this._setNativeMaxLength(this.maxLength);
515
- this._setNativeDisabled(this.disabled);
516
- this._setNativeReadOnly(this.readonly || this.forceReadonly);
517
- this.redErrorBackground = false;
518
- if (this._controlExists()) {
519
- const validators = [];
520
- // add required
521
- if (this.required) {
522
- validators.push(requiredValidator);
523
- }
524
- // add maxlength
525
- if (notNill(this._maxLength)) {
526
- if (this.decimals) {
527
- validators.push(precisionScaleValidator(this._maxLength, this.decimals));
528
- }
529
- else {
530
- validators.push(maxStringLengthValidator(this._maxLength));
531
- }
532
- }
533
- // add @Input()-ed validators
534
- validators.push(...this._validators);
535
- if (this._validators) {
536
- this._validators.forEach(validator => {
537
- if (validator === requiredValidator) {
538
- this._required = true;
539
- this._setNativeRequired(true);
540
- }
541
- });
542
- }
543
- this.control.setValidators(validators);
544
- this.control.setAsyncValidators(this._asyncValidators);
545
- this.control.updateValueAndValidity();
546
- }
547
- }
548
- _handleCommit(event, doBlur = true) {
549
- return __awaiter(this, void 0, void 0, function* () {
550
- if (!this.showSaveCancel || (!this._modelDirtyForCommit)) {
551
- return true;
552
- }
553
- this.keepFocus = true;
554
- this.shouldCommit = true;
555
- if (this._commitButtonsComponentRef) {
556
- this._commitButtonsComponentRef.instance.commitFinished = false;
557
- this._commitButtonsComponentRef.instance.committing = true;
558
- }
559
- this._modelDirtyForCommit = false;
560
- const success = yield this.commit(this.model);
561
- this.keepFocus = false;
562
- yield this._commitFinished();
563
- if (success && doBlur) {
564
- this.doBlur(event, false);
565
- }
566
- return success;
567
- });
568
- }
569
- _commitFinished() {
570
- return new Promise((resolve) => {
571
- if (this._commitButtonsComponentRef) {
572
- this._commitButtonsComponentRef.instance.commitFinished = true;
573
- this._commitButtonsComponentRef.instance.committing = false;
574
- setTimeout(() => {
575
- // this._commitButtonsComponentRef.instance.commitFinished = false;
576
- this.overlayService.removeComponent(this._commitButtonsComponentRef);
577
- resolve();
578
- }, 800);
579
- }
580
- else {
581
- resolve();
582
- }
583
- });
584
- }
585
- _clearErrorComponent() {
586
- this.overlayService.removeComponent(this._validationComponentRef);
587
- }
588
- // whether this.ngModel.control has safe access
589
- _controlExists() {
590
- return this.ngModel && !!this.control;
591
- }
592
- _controlIsValid() {
593
- return this._controlExists() && this.control.valid;
594
- }
595
- _setNativeDisabled(disabled) {
596
- if (this.input) {
597
- this.input.disabled = disabled;
598
- }
599
- }
600
- _setNativeMaxLength(maxlength) {
601
- if (this.input && !isNaN(maxlength)) {
602
- this.input.maxLength = maxlength;
603
- }
604
- }
605
- _setNativeReadOnly(readonly) {
606
- if (this.input) {
607
- this.input.readOnly = readonly;
608
- }
609
- }
610
- _setNativeRequired(required) {
611
- if (this.input) {
612
- this.input.required = required;
613
- }
614
- }
615
- _subscribeToSpeechInput() {
616
- // this._speechSub = this.speechInput.speechInput.subscribe((data) => {
617
- // if (this.focused && this._controlExists()) {
618
- // const val: string = this.control.value;
619
- // this.setModel((StringUtils.IsString(val) ? val : '') + data);
620
- // }
621
- // });
622
- }
623
- _addOrRemoveSelfFromForm() {
624
- if (this.hidden) {
625
- this._removeSelfFromForm();
626
- }
627
- else {
628
- this._addSelfToForm();
629
- }
630
- }
631
- _updateSelfInForm() {
632
- if (this.formComponent) {
633
- this.formComponent.updateFormInput(this);
634
- }
635
- }
636
- _removeSelfFromForm() {
637
- if (this.formComponent && this.ngModel) {
638
- this.formComponent.removeFormInput(this);
639
- }
640
- }
641
- _addSelfToForm() {
642
- if (this.formComponent && this.ngModel && !this.noFormGroupControl) {
643
- this.formComponent.removeFormInput(this); // preventing there are two controls in formgroup when myFormInputInstance is (being) set
644
- this.formComponent.addFormInput(this.myFormInputInstance ? this.myFormInputInstance : this);
645
- }
646
- }
647
- _prepareInput() {
648
- if (this.elementRef && this.elementRef.nativeElement) {
649
- //try to find input element
650
- this._findInputNode(this.elementRef.nativeElement.children);
651
- if (this.input) {
652
- this.input.addEventListener('blur', (event) => this.doBlur(event));
653
- this.input.addEventListener('focus', (event) => this.doFocus(event));
654
- }
655
- }
656
- }
657
- _findInputNode(nodes) {
658
- for (let i = 0; i < nodes.length; i++) {
659
- const node = nodes[i];
660
- if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement) {
661
- this.input = node;
662
- break;
663
- }
664
- else if (node.children.length > 0) {
665
- this._findInputNode(node.children);
666
- }
667
- }
668
- }
669
- _positionValidationError() {
670
- if (this.elementRef && this.elementRef.nativeElement && this._errorValidationComponent) {
671
- const clientRect = this.elementRef.nativeElement.getBoundingClientRect();
672
- this._errorValidationComponent.instance.top = clientRect.bottom;
673
- this._errorValidationComponent.instance.left = clientRect.left;
674
- }
675
- }
676
- _handleKeyDown(event) {
677
- return __awaiter(this, void 0, void 0, function* () {
678
- switch (event.code) {
679
- case 'Enter':
680
- case 'NumpadEnter':
681
- if (!event.shiftKey) {
682
- event.preventDefault();
683
- yield this._handleCommit();
684
- return false;
685
- }
686
- return true;
687
- case 'Tab':
688
- const nextSiblingToFocus = event.shiftKey ? event.currentTarget.previousSibling : event.currentTarget.nextSibling;
689
- event.preventDefault();
690
- const success = yield this._handleCommit();
691
- if (success) {
692
- if (nextSiblingToFocus) {
693
- try {
694
- this._setFocusOnNextPossibleInput(nextSiblingToFocus, event.shiftKey);
695
- }
696
- catch (e) {
697
- }
698
- }
699
- }
700
- return false;
701
- case 'Escape':
702
- this.cancelClick();
703
- event.preventDefault();
704
- return false;
705
- }
706
- });
707
- }
708
- _createNewFocusEvent(element) {
709
- let eventType = 'onfocusin' in element ? 'focusin' : 'focus', bubbles = 'onfocusin' in element, focusEvent;
710
- if ('createEvent' in document) {
711
- focusEvent = document.createEvent('Event');
712
- focusEvent.initEvent(eventType, bubbles, true);
713
- }
714
- else if ('Event' in window) {
715
- focusEvent = new Event(eventType, { bubbles: bubbles, cancelable: true });
716
- }
717
- return focusEvent;
718
- }
719
- _setFocusOnNextPossibleInput(element, previous) {
720
- let elementColl = element.getElementsByTagName('input');
721
- if (!elementColl || elementColl.length < 1) {
722
- elementColl = element.getElementsByTagName('textarea');
723
- }
724
- if (elementColl && elementColl.length > 0) {
725
- const inputElement = elementColl[0];
726
- if (inputElement.disabled || inputElement.readOnly) {
727
- this._setFocusOnNextPossibleInput(previous ? element.previousSibling : element.nextSibling, previous);
728
- }
729
- else {
730
- const focusEvent = this._createNewFocusEvent(element);
731
- inputElement.focus();
732
- inputElement.dispatchEvent(focusEvent);
733
- }
734
- }
735
- }
736
- }
737
- BaseInputComponent.BaseFormInputComponentIndex = 0;
738
- BaseInputComponent.HiddenClass = 'hidden';
739
- BaseInputComponent.decorators = [
740
- { type: Directive },
741
- { type: Injectable }
742
- ];
743
- BaseInputComponent.ctorParameters = () => [
744
- { type: ChangeDetectorRef },
745
- { type: ComponentFactoryResolver },
746
- { type: OverlayService },
747
- { type: FormInputUserModelChangeListenerService, decorators: [{ type: Optional }] },
748
- { type: NgZoneWrapperService, decorators: [{ type: Optional }] },
749
- { type: ElementRef, decorators: [{ type: Optional }] }
750
- ];
751
- BaseInputComponent.propDecorators = {
752
- validationErrorContainer: [{ type: ViewChild, args: ['validationError', { read: ViewContainerRef },] }],
753
- _ngModel: [{ type: ViewChild, args: [NgModel, { static: true },] }],
754
- showSaveCancel: [{ type: Input }],
755
- model: [{ type: Input }],
756
- label: [{ type: Input }],
757
- noValidation: [{ type: Input }],
758
- initFocus: [{ type: Input }],
759
- noClickFocus: [{ type: Input }],
760
- businessObjectId: [{ type: Input }],
761
- disabled: [{ type: Input }],
762
- maxLength: [{ type: Input }],
763
- defaultValue: [{ type: Input }],
764
- forcedMaxLength: [{ type: Input }],
765
- readonly: [{ type: Input }],
766
- forceReadonly: [{ type: Input }],
767
- required: [{ type: Input }],
768
- forceRequired: [{ type: Input }],
769
- validators: [{ type: Input }],
770
- asyncValidators: [{ type: Input }],
771
- hidden: [{ type: Input }, { type: HostBinding, args: ['class.' + BaseInputComponent.HiddenClass,] }],
772
- decimals: [{ type: Input }],
773
- icon: [{ type: Input }],
774
- customCssClass: [{ type: Input }],
775
- redErrorBackground: [{ type: Input }, { type: HostBinding, args: ['class.cc-red-error-background',] }],
776
- myFormInputInstance: [{ type: Input }],
777
- commitOnBlur: [{ type: Input }],
778
- nativeBlur: [{ type: Output }],
779
- blur: [{ type: Output }],
780
- enter: [{ type: Output }],
781
- focus: [{ type: Output }],
782
- keyDown: [{ type: Output }],
783
- keyUp: [{ type: Output }],
784
- modelChange: [{ type: Output }],
785
- selectedValueChange: [{ type: Output }],
786
- userModelChange: [{ type: Output }],
787
- hiddenChange: [{ type: Output }],
788
- cancelClicked: [{ type: Output }],
789
- focused: [{ type: HostBinding, args: ['class.cc-input-focused',] }],
790
- formInput: [{ type: HostBinding, args: ['class.form-input',] }],
791
- customWidth: [{ type: Input }, { type: HostBinding, args: ['class.custom-width',] }],
792
- customHeight: [{ type: Input }, { type: HostBinding, args: ['class.custom-height',] }],
793
- noTriangleGraphic: [{ type: Input }],
794
- keepFocussed: [{ type: Input }],
795
- halfWidth: [{ type: Input }, { type: HostBinding, args: ['class.half-width',] }],
796
- fullWidth: [{ type: Input }, { type: HostBinding, args: ['class.full-width-important',] }],
797
- excludeUserModelChange: [{ type: Input }],
798
- noFormGroupControl: [{ type: Input }],
799
- formSubmitted: [{ type: HostBinding, args: ['class.form-submitted',] }],
800
- hasNoLabel: [{ type: HostBinding, args: ['class.hasnolabel',] }],
801
- hasValue: [{ type: HostBinding, args: ['class.hasvalue',] }],
802
- invalid: [{ type: HostBinding, args: ['class.invalid',] }],
803
- isDisabled: [{ type: HostBinding, args: ['class.disabled',] }],
804
- isReadonly: [{ type: HostBinding, args: ['class.read-only',] }],
805
- isRequired: [{ type: HostBinding, args: ['class.required',] }],
806
- touchedInvalid: [{ type: HostBinding, args: ['class.cc-touched-invalid',] }],
807
- valid: [{ type: HostBinding, args: ['class.valid',] }],
808
- validationDisabled: [{ type: HostBinding, args: ['class.no-validation',] }],
809
- onClick: [{ type: HostListener, args: ['click', ['$event'],] }],
810
- onFocusIn: [{ type: HostListener, args: ['focusin',] }],
811
- handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]
812
- };
813
- __decorate([
814
- InputBoolean()
815
- ], BaseInputComponent.prototype, "noValidation", void 0);
816
- __decorate([
817
- InputBoolean()
818
- ], BaseInputComponent.prototype, "initFocus", void 0);
819
- __decorate([
820
- InputBoolean()
821
- ], BaseInputComponent.prototype, "noClickFocus", void 0);
822
- __decorate([
823
- InputBoolean()
824
- ], BaseInputComponent.prototype, "forceRequired", void 0);
825
- __decorate([
826
- InputBoolean()
827
- ], BaseInputComponent.prototype, "customWidth", void 0);
828
- __decorate([
829
- InputBoolean()
830
- ], BaseInputComponent.prototype, "customHeight", void 0);
831
- __decorate([
832
- InputBoolean()
833
- ], BaseInputComponent.prototype, "noTriangleGraphic", void 0);
834
- __decorate([
835
- InputBoolean()
836
- ], BaseInputComponent.prototype, "keepFocussed", void 0);
837
- __decorate([
838
- InputBoolean()
839
- ], BaseInputComponent.prototype, "halfWidth", void 0);
840
- __decorate([
841
- InputBoolean()
842
- ], BaseInputComponent.prototype, "fullWidth", void 0);
843
- __decorate([
844
- InputBoolean()
845
- ], BaseInputComponent.prototype, "excludeUserModelChange", void 0);
846
- __decorate([
847
- InputBoolean()
848
- ], BaseInputComponent.prototype, "noFormGroupControl", void 0);
849
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS9iYXNlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUVqQix3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWdDLE9BQU8sRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDOUQsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUNuSCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7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QUFZLEVBQUU7eURBQ2M7QUF1SXRDO0lBRFUsWUFBWSxFQUFFO3VEQUNZO0FBR3BDO0lBRFUsWUFBWSxFQUFFO3dEQUNhO0FBR3JDO0lBRFUsWUFBWSxFQUFFOzZEQUNrQjtBQUcxQztJQURVLFlBQVksRUFBRTt3REFDYTtBQUdyQztJQURVLFlBQVksRUFBRTtxREFDVTtBQUdsQztJQURVLFlBQVksRUFBRTtxREFDVTtBQUdsQztJQURVLFlBQVksRUFBRTtrRUFDdUI7QUFHL0M7SUFEVSxZQUFZLEVBQUU7OERBQ21CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnksXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZiwgQ29udGVudENoaWxkLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0FzeW5jVmFsaWRhdG9yRm4sIEZvcm1Db250cm9sLCBOZ01vZGVsLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vY29yZS9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtub3ROaWxsfSBmcm9tICcuLi8uLi9jb3JlL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtJbnB1dEJvb2xlYW4sIElucHV0Qm9vbGVhbkRlY29yYXRvcn0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3IvaW5wdXQtYm9vbGVhbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQge3JlcXVpcmVkVmFsaWRhdG9yfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRvci9yZXF1aXJlZC52YWxpZGF0b3InO1xyXG5pbXBvcnQge3ByZWNpc2lvblNjYWxlVmFsaWRhdG9yfSBmcm9tICcuLi8uLi9jb3JlL3ZhbGlkYXRvci9wcmVjaXNpb24tc2NhbGUudmFsaWRhdG9yJztcclxuaW1wb3J0IHttYXhTdHJpbmdMZW5ndGhWYWxpZGF0b3J9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdG9yL21heC1zdHJpbmctbGVuZ3RoLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvc3RyaW5nLXV0aWxzJztcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0Zvcm1JbnB1dFVzZXJNb2RlbENoYW5nZUxpc3RlbmVyU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlL2Zvcm0taW5wdXQtdXNlci1jaGFuZ2UtbGlzdGVuZXIuc2VydmljZSc7XHJcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbnVtYmVyLXV0aWxzJztcclxuaW1wb3J0IHtOZ1pvbmVXcmFwcGVyU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlL25nLXpvbmUtd3JhcHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb3JlQ29tcG9uZW50c0ljb259IGZyb20gJy4uLy4uL2NvcmUvZW51bS9jb3JlLWNvbXBvbmVudHMtaWNvbi5lbnVtJztcclxuaW1wb3J0IHtGb3JtQ29tcG9uZW50fSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JDb21wb25lbnR9IGZyb20gJy4uL3ZhbGlkYXRpb24tZXJyb3IvdmFsaWRhdGlvbi1lcnJvci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1NjcmVlbkNvbmZpZ0FkYXB0ZXJDb21wb25lbnR9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NyZWVuLWNvbmZpZy1hZGFwdGVyLmNvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge092ZXJsYXlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlL292ZXJsYXkuc2VydmljZSc7XHJcbmltcG9ydCB7Q29tbWl0QnV0dG9uc0NvbXBvbmVudH0gZnJvbSAnLi9jb21taXQtYnV0dG9ucy9jb21taXQtYnV0dG9ucy5jb21wb25lbnQnO1xyXG5pbXBvcnQge09iamVjdENvbmZpZ3VyYXRpb25EZWZhdWx0VmFsdWVUeXBlfSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC90eXBlL29iamVjdC1jb25maWd1cmF0aW9uLWRlZmF1bHQtdmFsdWUtdHlwZSc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGNvbmNyZXRlIGZvcm0gaW5wdXQgY29tcG9uZW50cyB0aGF0IGNvbnRhaW4gYSBuYXRpdmUgPGlucHV0PiBlbGVtZW50LiBQcm92aWRlcyBjb21tb24gZGF0YSBhbmQgZnVuY3Rpb25hbGl0eSwgc3VjaCBhc1xyXG4gKiBhZGRpbmcgc2VsZiBhcyBhIGNvbnRyb2wgdG8gdGhlIHBhcmVudCBmb3JtLlxyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VJbnB1dENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBTY3JlZW5Db25maWdBZGFwdGVyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWNvbnM6IHR5cGVvZiBDb3JlQ29tcG9uZW50c0ljb24gPSBDb3JlQ29tcG9uZW50c0ljb247XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZhbGlkYXRpb25FcnJvcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcclxuICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICBAVmlld0NoaWxkKE5nTW9kZWwsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHB1YmxpYyBfbmdNb2RlbDogTmdNb2RlbDtcclxuXHJcbiAgcHVibGljIGdldCBuZ01vZGVsKCk6IE5nTW9kZWwge1xyXG4gICAgaWYgKHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UubmdNb2RlbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZ01vZGVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBCYXNlRm9ybUlucHV0Q29tcG9uZW50SW5kZXg6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHN0YXRpYyBIaWRkZW5DbGFzczogc3RyaW5nID0gJ2hpZGRlbic7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dTYXZlQ2FuY2VsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBtb2RlbCh2YWx1ZTogVCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsTW9kZWxTZXQpIHtcclxuICAgICAgdGhpcy5faW5pdGlhbE1vZGVsID0gdGhpcy5fbW9kZWw7XHJcbiAgICAgIHRoaXMuX2luaXRpYWxNb2RlbFNldCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb2RlbCA9IHZhbHVlO1xyXG4gICAgdGhpcy5jYW5TYXZlT3JDYW5jZWwgPSB0aGlzLl9tb2RlbCAhPT0gdGhpcy5faW5pdGlhbE1vZGVsO1xyXG4gICAgdGhpcy5fbW9kZWxEaXJ0eUZvckNvbW1pdCA9IHRoaXMuX21vZGVsICE9PSB0aGlzLl9pbml0aWFsTW9kZWw7XHJcbiAgICB0aGlzLl9jbGVhckVycm9yQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLm1vZGVsU2V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG1vZGVsKCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIG5vVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgaW5pdEZvY3VzOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgbm9DbGlja0ZvY3VzOiBib29sZWFuO1xyXG5cclxuICAvLyB1c2VkIHRvIGxpbmsgZmllbGQgdG8gYnVzaW5lc3Mgb2JqZWN0IGZvciBkZWVwLXZhbGlkYXRpb25cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBidXNpbmVzc09iamVjdElkOiBhbnk7XHJcblxyXG4gIC8vIEBJbnB1dCgpXHJcbiAgLy8gcHVibGljIGVycm9yTWVzc2FnZTogVmFsaWRhdGlvbk1lc3NhZ2U7XHJcblxyXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKGRpc2FibGVkID09PSB0aGlzLl9kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IElucHV0Qm9vbGVhbkRlY29yYXRvci5JbnB1dFZhbHVlVG9Cb29sZWFuKGRpc2FibGVkKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNldE1heExlbmd0aChtYXhMZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBub3ROaWxsKHRoaXMuZm9yY2VkTWF4TGVuZ3RoKSA/IHRoaXMuZm9yY2VkTWF4TGVuZ3RoIDogdGhpcy5fbWF4TGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWU6IE9iamVjdENvbmZpZ3VyYXRpb25EZWZhdWx0VmFsdWVUeXBlKSB7XHJcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBPYmplY3RDb25maWd1cmF0aW9uRGVmYXVsdFZhbHVlVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZm9yY2VkTWF4TGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX2ZvcmNlUmVhZG9ubHkgIT09IHVuZGVmaW5lZCB8fCByZWFkb25seSA9PT0gdGhpcy5fcmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVhZG9ubHkgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihyZWFkb25seSk7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgICBpZiAodGhpcy5faGFzT25QdXNoQ2RTdHJhdGVneSkge1xyXG4gICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JjZVJlYWRvbmx5IHx8IHRoaXMuX3JlYWRvbmx5O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGZvcmNlUmVhZG9ubHkoZm9yY2VSZWFkb25seTogYm9vbGVhbikge1xyXG4gICAgaWYgKGZvcmNlUmVhZG9ubHkgPT09IHRoaXMuX2ZvcmNlUmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZm9yY2VSZWFkb25seSA9IElucHV0Qm9vbGVhbkRlY29yYXRvci5JbnB1dFZhbHVlVG9Cb29sZWFuKGZvcmNlUmVhZG9ubHkpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JjZVJlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVhZG9ubHk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQocmVxdWlyZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmIChyZXF1aXJlZCA9PT0gdGhpcy5fcmVxdWlyZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihyZXF1aXJlZCk7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9yY2VSZXF1aXJlZCB8fCB0aGlzLl9yZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBmb3JjZVJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7ICAvLyBhIGZvcmNlIG91dHNpZGUgb2YgW2NmZ05hbWVdJ3MgaW5mbHVlbmNlXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10pIHtcclxuICAgIGlmICh2YWxpZGF0b3JzID09PSB0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvcnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgYXN5bmNWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yRm5bXSkge1xyXG4gICAgdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gdmFsaWRhdG9ycztcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXN5bmNWYWxpZGF0b3JzKCk6IEFzeW5jVmFsaWRhdG9yRm5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXN5bmNWYWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgQEhvc3RCaW5kaW5nKCdjbGFzcy4nICsgQmFzZUlucHV0Q29tcG9uZW50LkhpZGRlbkNsYXNzKVxyXG4gIHB1YmxpYyBzZXQgaGlkZGVuKGhpZGRlbjogYm9vbGVhbikge1xyXG4gICAgaWYgKGhpZGRlbiA9PT0gdGhpcy5faGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9oaWRkZW4gPSBoaWRkZW47XHJcblxyXG4gICAgdGhpcy5fYWRkT3JSZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICBpZiAoaGlkZGVuKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRhY2goKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLnJlYXR0YWNoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc0FmdGVyQW5ndWxhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGlkZGVuQ2hhbmdlLmVtaXQoaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlbjtcclxuICB9XHJcblxyXG4gIC8vIG5vIGN1c3RvbSBzZXR0ZXIgbG9naWMgYXMgd2l0aCB0aGUgb3RoZXIgJ3NjcmVlbiBjb25maWcgcHJvcHMnLCBiZWNhdXNlIGNvbmNyZXRlIGZvcm0gaW5wdXQgY29tcG9uZW50cyBoYW5kbGUgdGhpcyB0aGVtc2VsdmVzLlxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBkZWNpbWFscyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9kZWNpbWFscyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWNpbWFscygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY2ltYWxzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWNvbjogQ29yZUNvbXBvbmVudHNJY29uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21Dc3NDbGFzczogc3RyaW5nO1xyXG5cclxuICAvLyBHb2FsOiBhYmlsaXR5IHRvIGVtdWxhdGUgdGhlIHJlZCBiYWNrZ3JvdW5kIG9mIGlucHV0IGZpZWxkcyAoZm9ybS1zdWJtaXR0ZWQgaW52YWxpZCBzdGF0ZSlcclxuICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmNjLXJlZC1lcnJvci1iYWNrZ3JvdW5kJylcclxuICBwdWJsaWMgcmVkRXJyb3JCYWNrZ3JvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG15Rm9ybUlucHV0SW5zdGFuY2UodmFsdWU6IEJhc2VJbnB1dENvbXBvbmVudDxUPikge1xyXG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIGdldCBteUZvcm1JbnB1dEluc3RhbmNlKCk6IEJhc2VJbnB1dENvbXBvbmVudDxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNvbW1pdE9uQmx1cjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIEBPdXRwdXQoKVxyXG4gIC8vIHB1YmxpYyBjb21taXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBuYXRpdmVCbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBlbWl0cyB3aGVuIHRoZSBlbnRlciBidXR0b24gb24ga2V5Ym9hcmQgd2FzIHByZXNzZWQgd2hpbGUgdGhpcyBmb3JtIGlucHV0IGhhZCBmb2N1c3NlZFxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBlbnRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBmb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBrZXlEb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGtleVVwOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHVzZXJNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGhpZGRlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNjLWlucHV0LWZvY3VzZWQnKVxyXG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBmb3JtQ29tcG9uZW50OiBGb3JtQ29tcG9uZW50O1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taW5wdXQnKVxyXG4gIHB1YmxpYyBmb3JtSW5wdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQEhvc3RCaW5kaW5nKCdjbGFzcy5jdXN0b20td2lkdGgnKVxyXG4gIHB1YmxpYyBjdXN0b21XaWR0aDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQEhvc3RCaW5kaW5nKCdjbGFzcy5jdXN0b20taGVpZ2h0JylcclxuICBwdWJsaWMgY3VzdG9tSGVpZ2h0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBub1RyaWFuZ2xlR3JhcGhpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMga2VlcEZvY3Vzc2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhbGYtd2lkdGgnKVxyXG4gIHB1YmxpYyBoYWxmV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIEBIb3N0QmluZGluZygnY2xhc3MuZnVsbC13aWR0aC1pbXBvcnRhbnQnKVxyXG4gIHB1YmxpYyBmdWxsV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIGV4Y2x1ZGVVc2VyTW9kZWxDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIG5vRm9ybUdyb3VwQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0tc3VibWl0dGVkJylcclxuICBwdWJsaWMgZ2V0IGZvcm1TdWJtaXR0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMuZm9ybUNvbXBvbmVudC5zdWJtaXR0ZWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhc25vbGFiZWwnKVxyXG4gIHB1YmxpYyBnZXQgaGFzTm9MYWJlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc05pbGwodGhpcy5sYWJlbCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhc3ZhbHVlJylcclxuICBwdWJsaWMgZ2V0IGhhc1ZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICghQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSAmJiAhIXRoaXMubW9kZWwgfHwgU3RyaW5nVXRpbHMuSXNTdHJpbmdXaXRoTGVuZ3RoKHRoaXMubW9kZWwpIHx8IE51bWJlclV0aWxzLklzTnVtYmVyKHRoaXMubW9kZWwpKSB8fFxyXG4gICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSAmJiB0aGlzLm1vZGVsLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbnZhbGlkJylcclxuICBwdWJsaWMgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZSgpICYmICF0aGlzLmNvbnRyb2wudmFsaWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcclxuICBwdWJsaWMgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnJlYWQtb25seScpXHJcbiAgcHVibGljIGdldCBpc1JlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnJlcXVpcmVkJylcclxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY2MtdG91Y2hlZC1pbnZhbGlkJylcclxuICBwdWJsaWMgZ2V0IHRvdWNoZWRJbnZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xFeGlzdHMoKSAmJiB0aGlzLmNvbnRyb2wudG91Y2hlZCAmJiAhdGhpcy5jb250cm9sLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy52YWxpZCcpXHJcbiAgcHVibGljIGdldCB2YWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja1N0YXRlKCkgJiYgdGhpcy5jb250cm9sLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5uby12YWxpZGF0aW9uJylcclxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5ub1ZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuQ2hhbmdlICYmICF0aGlzLm5vQ2xpY2tGb2N1cykge1xyXG4gICAgICB0aGlzLnJlcXVlc3RGb2N1cygpO1xyXG4gICAgICBpZiAoIXRoaXMuZXhjbHVkZVVzZXJNb2RlbENoYW5nZSkge1xyXG4gICAgICAgIHRoaXMubWFya0FzVXNlclRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpXHJcbiAgb25Gb2N1c0luKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmV4Y2x1ZGVVc2VyTW9kZWxDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5tYXJrQXNVc2VyVG91Y2hlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OnNjcm9sbFwiKVxyXG4gIC8vIHB1YmxpYyBoYW5kbGVEb2N1bWVudFNjcm9sbCgpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuX3Bvc2l0aW9uVmFsaWRhdGlvbkVycm9yKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIC8vIHB1YmxpYyBoYW5kbGVXaW5kb3dSZXNpemUoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLl9wb3NpdGlvblZhbGlkYXRpb25FcnJvcigpO1xyXG4gIC8vIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMua2V5RG93bi5uZXh0KGV2ZW50KTtcclxuICAgIGlmICh0aGlzLnNob3dTYXZlQ2FuY2VsICYmIHRoaXMuY2FuU2F2ZU9yQ2FuY2VsKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5fcG9zaXRpb25WYWxpZGF0aW9uRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FuQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLmRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb250cm9sKCk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlID8gdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZS5jb250cm9sIDogdGhpcy5uZ01vZGVsICYmIHRoaXMubmdNb2RlbC5jb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JtSW5wdXRJbnN0YW5jZSgpOiBCYXNlSW5wdXRDb21wb25lbnQ8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UgfHwgdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuXHJcbiAgcHVibGljIGtlZXBGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgc2V0IGNhblNhdmVPckNhbmNlbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fY2FuU2F2ZU9yQ2FuY2VsID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5zaG93U2F2ZUNhbmNlbCAmJiB0aGlzLmZvY3VzZWQgJiYgdGhpcy5fY2FuU2F2ZU9yQ2FuY2VsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZikge1xyXG4gICAgICAgIHRoaXMuX2NvbW1pdEJ1dHRvbnNDb21wb25lbnRSZWYgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChDb21taXRCdXR0b25zQ29tcG9uZW50LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRGb3JPdmVybGF5OiB0aGlzLmVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgIGNvbW1pdHRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb21taXRGaW5pc2hlZDogZmFsc2VcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgY29tbWl0Q2xpY2s6IChldmVudCkgPT4gdGhpcy5faGFuZGxlQ29tbWl0KGV2ZW50KSxcclxuICAgICAgICAgICAgY2FuY2VsQ2xpY2s6IChldmVudCkgPT4gdGhpcy5jYW5jZWxDbGljayhldmVudClcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLnJlbW92ZUNvbXBvbmVudCh0aGlzLl9jb21taXRCdXR0b25zQ29tcG9uZW50UmVmKTtcclxuICAgICAgdGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FuU2F2ZU9yQ2FuY2VsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhblNhdmVPckNhbmNlbDtcclxuICB9XHJcblxyXG4gIC8vIEBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25BZGFwdGVyQ29tcG9uZW50XHJcbiAgcHVibGljIG9iamVjdENvbmZpZ05hbWU6IHN0cmluZztcclxuICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yOiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgc2hvdWxkQ29tbWl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgX21hcmtlZEFzVXNlclRvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2hhc09uUHVzaENkU3RyYXRlZ3k6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX21vZGVsOiBUO1xyXG4gIHByb3RlY3RlZCBfbW9kZWxEaXJ0eUZvckNvbW1pdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE1vZGVsOiBUO1xyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE1vZGVsU2V0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX215Rm9ybUlucHV0SW5zdGFuY2U6IEJhc2VJbnB1dENvbXBvbmVudDxUPjtcclxuICBwcml2YXRlIF9lcnJvclZhbGlkYXRpb25Db21wb25lbnQ6IENvbXBvbmVudFJlZjxWYWxpZGF0aW9uRXJyb3JDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgX2RlY2ltYWxzOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfaGlkZGVuOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogT2JqZWN0Q29uZmlndXJhdGlvbkRlZmF1bHRWYWx1ZVR5cGU7XHJcbiAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgX2ZvcmNlUmVhZG9ubHk6IGJvb2xlYW4gPSB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICBwcml2YXRlIF9hc3luY1ZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9zcGVlY2hTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9tb2RlbENoYW5nZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2Zvcm1BbnlTdWJtaXRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9mb3JtUmVhZG9ubHlDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9jbGVhck1hcmtlZEFzVXNlclRvdWNoZWRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9jYW5TYXZlT3JDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGlvbkNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByb3RlY3RlZCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lcj86IEZvcm1JbnB1dFVzZXJNb2RlbENoYW5nZUxpc3RlbmVyU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBuZ1pvbmVXcmFwcGVyPzogTmdab25lV3JhcHBlclNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZWxlbWVudFJlZj86IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIEJhc2VJbnB1dENvbXBvbmVudC5CYXNlRm9ybUlucHV0Q29tcG9uZW50SW5kZXgrKztcclxuICAgIHRoaXMubmFtZSA9IEJhc2VJbnB1dENvbXBvbmVudC5CYXNlRm9ybUlucHV0Q29tcG9uZW50SW5kZXgudG9TdHJpbmcoKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtVXNlckNoYW5nZUxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMuX2NsZWFyTWFya2VkQXNVc2VyVG91Y2hlZFN1YiA9IHRoaXMuZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lci5jbGVhckFsbE1hcmtlZEFzVXNlclRvdWNoZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9tYXJrZWRBc1VzZXJUb3VjaGVkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RlbENoYW5nZVN1YiA9IHRoaXMubW9kZWxDaGFuZ2Uuc3Vic2NyaWJlKCh2YWw6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1vZGVsID0gdmFsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmVwYXJlSW5wdXQoKTtcclxuXHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcblxyXG4gICAgdGhpcy5fYWRkT3JSZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbXBvbmVudC5yZWFkb25seTtcclxuICAgICAgdGhpcy5fZm9ybVJlYWRvbmx5Q2hhbmdlU3ViID0gdGhpcy5mb3JtQ29tcG9uZW50LnJlYWRvbmx5Q2hhbmdlLnN1YnNjcmliZSgoaXNGb3JtUmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gaXNGb3JtUmVhZG9ubHk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmluaXRGb2N1cykge1xyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMucmVxdWVzdEZvY3VzLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICB0aGlzLmlucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoZXZlbnQpID0+IHRoaXMuZG9CbHVyKGV2ZW50KSk7XHJcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoZXZlbnQpID0+IHRoaXMuZG9Gb2N1cyhldmVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XHJcbiAgICB0aGlzLl9jbGVhckVycm9yQ29tcG9uZW50KCk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMudG9vbHRpcE1hbmFnZXIgJiYgdGhpcy5lbGVtZW50UmVmKSB7XHJcbiAgICAvLyAgICAgdGhpcy50b29sdGlwTWFuYWdlci5kZXN0cm95RXJyb3JUb29sdGlwT2ZFbGVtZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbW9kZWxDaGFuZ2VTdWIpIHtcclxuICAgICAgdGhpcy5fbW9kZWxDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9zcGVlY2hTdWIpIHtcclxuICAgICAgdGhpcy5fc3BlZWNoU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fZm9ybUFueVN1Ym1pdFN1Yikge1xyXG4gICAgICB0aGlzLl9mb3JtQW55U3VibWl0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fZm9ybVJlYWRvbmx5Q2hhbmdlU3ViKSB7XHJcbiAgICAgIHRoaXMuX2Zvcm1SZWFkb25seUNoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2NsZWFyTWFya2VkQXNVc2VyVG91Y2hlZFN1Yikge1xyXG4gICAgICB0aGlzLl9jbGVhck1hcmtlZEFzVXNlclRvdWNoZWRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3JlbW92ZVNlbGZGcm9tRm9ybSgpO1xyXG4gICAgdGhpcy5lbGVtZW50UmVmID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaW5wdXQgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvLyBkZXNjZW5kZW50cyBzaG91bGQgb3ZlcnJpZGUgdGhpc1xyXG4gIHB1YmxpYyBjb21taXQgPSBhc3luYyAobW9kZWw6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgY2FuY2VsQ2xpY2soZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3VsZENvbW1pdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5rZWVwRm9jdXMgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxNb2RlbFNldCkge1xyXG4gICAgICB0aGlzLm1vZGVsID0gdGhpcy5faW5pdGlhbE1vZGVsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5rZWVwRm9jdXMgPSBmYWxzZTtcclxuICAgIHRoaXMuY2FuY2VsQ2xpY2tlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1ZhbGlkYXRpb25FcnJvcihlcnJvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvciA9IGVycm9yO1xyXG4gICAgdGhpcy5fdmFsaWRhdGlvbkNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KFZhbGlkYXRpb25FcnJvckNvbXBvbmVudCwge3BhcmVudEZvck92ZXJsYXk6IHRoaXMuZWxlbWVudFJlZiwgZXJyb3I6IGVycm9yfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyBhIG1vZGVsQ2hhbmdlIGV2ZW50IHdpdGggZ2l2ZW4gdmFsdWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgb2YgdGhpcyBmb3JtIGlucHV0XHJcbiAgICogaGFzIGNoYW5nZWQgYW5kIGl0cyBuZXcgdmFsdWUgaXMgZ2l2ZW4gdmFsdWUuIEFsc28gZW1pdHMgdXNlck1vZGVsQ2hhbmdlIGlmIG1hcmtlZEFzVXNlclRvdWNoZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE1vZGVsKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcclxuICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzRGlydHkoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtR3JvdXAubWFya0FzRGlydHkoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX21hcmtlZEFzVXNlclRvdWNoZWQgJiYgdGhpcy5mb3JtVXNlckNoYW5nZUxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMuZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lci51c2VyTW9kZWxDaGFuZ2UubmV4dCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudXNlck1vZGVsQ2hhbmdlLm5leHQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9oYXNPblB1c2hDZFN0cmF0ZWd5KSB7XHJcbiAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RGb2N1cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNhbkNoYW5nZSAmJiB0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG9Gb2N1cyhldmVudD86IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsTW9kZWxTZXQgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmNhblNhdmVPckNhbmNlbCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgIHRoaXMuZm9jdXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRvQmx1cihldmVudD86IGFueSwgaGFuZGxlQ29tbWl0OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5zaG93U2F2ZUNhbmNlbCAmJiBoYW5kbGVDb21taXQgJiYgdGhpcy5fbW9kZWxEaXJ0eUZvckNvbW1pdCAmJiB0aGlzLnNob3VsZENvbW1pdCkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb21taXQoZXZlbnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5rZWVwRm9jdXMgfHwgdGhpcy5rZWVwRm9jdXNzZWQpIHtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLl9oYXNPblB1c2hDZFN0cmF0ZWd5KSB7XHJcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQuYmx1cigpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYmx1ci5uZXh0KCk7XHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRldGVjdENoYW5nZXNBZnRlckFuZ3VsYXIoKTogdm9pZCB7XHJcbiAgICBpZiAoISF0aGlzLm5nWm9uZVdyYXBwZXIpIHtcclxuICAgICAgdGhpcy5uZ1pvbmVXcmFwcGVyLnNldFRpbWVvdXRPdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9oYXNPblB1c2hDZFN0cmF0ZWd5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlua3MgdGhlIGdpdmVuIGZvcm1Db21wLnN1Ym1pdCBldmVudCB0byB0aGUgZmlyaW5nIG9mIGRldGVjdENoYW5nZXMoKSBvZiBnaXZlbiBjaGFuZ2UgZGV0ZWN0b3IuIFRoaXMgaXMgYSAndXRpbGl0eS1saWtlJyBtZXRob2QsXHJcbiAgICogYnV0IHdlIG1hbmFnZSB0aGUgYWN0dWFsIHN1YnNjcmlwdGlvbiAod2l0aCBVTlNVQlNDUklCRSgpISkgb24gdGhpcyBiYXNlIGNsYXNzLlxyXG4gICAqIEBwYXJhbSBmb3JtQ29tcCBUaGUgZm9ybSB3aG9zZSBzdWJtaXQgd2Ugd2FudCB0byBsaW5rIHdpdGggdGhlIGNhbGwgb2YgLmRldGVjdENoYW5nZXMoKSBvbiBnaXZlbiBjaGFuZ2UgZGV0ZWN0b3IgcmVmLlxyXG4gICAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiBUaGlzIHNob3VsZCBiZSBnaXZlbiBhcyBwYXJhbS4gSSBjaG9vc2Ugbm90IHRvIG1ha2UgdGhpcyBwYXJ0IG9mIG91ciAoQmFzZUZvcm1JbnB1dENvbXBvbmVudCkgY29uc3RydWN0b3IsXHJcbiAgICogYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgMjEgZXh0ZW5kZXJzLlxyXG4gICAqL1xyXG4gIC8vIHB1YmxpYyBsaW5rRm9ybUFueVN1Ym1pdFdpdGhEZXRlY3RDaGFuZ2VzKGZvcm1Db21wOiBGb3JtQ29tcG9uZW50LCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpOiB2b2lkIHtcclxuICAvLyAgICAgaWYgKGZvcm1Db21wICYmIGNoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLl9mb3JtQW55U3VibWl0U3ViID0gZm9ybUNvbXAuYW55U3VibWl0LnN1YnNjcmliZSgoKCkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBtYXJrQXNVc2VyVG91Y2hlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21hcmtlZEFzVXNlclRvdWNoZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZWRFcnJvckJhY2tncm91bmQgPSBmYWxzZTsgLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gdGhhdFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyTWFya2VkQXNVc2VyVG91Y2hlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21hcmtlZEFzVXNlclRvdWNoZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb2RlbFNldCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICAvL3VzZWQgZm9yIGRlc2NlbmRlbnRzLCBiZWNhdXNlIGRlc2NlbmRlbnRzIGNhbid0IHNldCBzdXBlciBwcm9wZXJ0aWVzLCBzZWUgSW5wdXROdW1iZXJDb21wb25lbnRcclxuICBwcm90ZWN0ZWQgc2V0TWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAobm90TmlsbCh0aGlzLmZvcmNlZE1heExlbmd0aCkgfHwgbWF4TGVuZ3RoID09PSB0aGlzLl9tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNOYU4obWF4TGVuZ3RoKSkge1xyXG4gICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfbWFya0FzT25QdXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faGFzT25QdXNoQ2RTdHJhdGVneSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2NoZWNrU3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5uZ01vZGVsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZvcm1TdWJtaXR0ZWQgfHwgKHRoaXMuX2NvbnRyb2xFeGlzdHMoKSAmJiB0aGlzLmNvbnRyb2wudG91Y2hlZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBQbGFjZSB2YWxpZGF0b3JzIG9udG8gb3VyIEFuZ3VsYXIncyBGb3JtQ29udHJvbC5cclxuICBwcm90ZWN0ZWQgX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlcjogRWxlbWVudFJlZiA9IHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZSA/IHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZS5lbGVtZW50UmVmIDogdGhpcy5lbGVtZW50UmVmO1xyXG4gICAgLy8gaWYgKHRoaXMudG9vbHRpcE1hbmFnZXIgJiYgZXIpIHtcclxuICAgIC8vICAgICB0aGlzLnRvb2x0aXBNYW5hZ2VyLmRlc3Ryb3lFcnJvclRvb2x0aXBPZkVsZW1lbnQoZXIubmF0aXZlRWxlbWVudCk7XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLl9zZXROYXRpdmVSZXF1aXJlZCh0aGlzLnJlcXVpcmVkKTtcclxuICAgIHRoaXMuX3NldE5hdGl2ZU1heExlbmd0aCh0aGlzLm1heExlbmd0aCk7XHJcbiAgICB0aGlzLl9zZXROYXRpdmVEaXNhYmxlZCh0aGlzLmRpc2FibGVkKTtcclxuICAgIHRoaXMuX3NldE5hdGl2ZVJlYWRPbmx5KHRoaXMucmVhZG9ubHkgfHwgdGhpcy5mb3JjZVJlYWRvbmx5KTtcclxuXHJcbiAgICB0aGlzLnJlZEVycm9yQmFja2dyb3VuZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xFeGlzdHMoKSkge1xyXG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gICAgICAvLyBhZGQgcmVxdWlyZWRcclxuICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2gocmVxdWlyZWRWYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZGQgbWF4bGVuZ3RoXHJcbiAgICAgIGlmIChub3ROaWxsKHRoaXMuX21heExlbmd0aCkpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWNpbWFscykge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHByZWNpc2lvblNjYWxlVmFsaWRhdG9yKHRoaXMuX21heExlbmd0aCwgdGhpcy5kZWNpbWFscykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2gobWF4U3RyaW5nTGVuZ3RoVmFsaWRhdG9yKHRoaXMuX21heExlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIEBJbnB1dCgpLWVkIHZhbGlkYXRvcnNcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKC4uLnRoaXMuX3ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMpIHtcclxuICAgICAgICB0aGlzLl92YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcclxuICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT09IHJlcXVpcmVkVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0TmF0aXZlUmVxdWlyZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMuX2FzeW5jVmFsaWRhdG9ycyk7XHJcbiAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVDb21taXQoZXZlbnQ/OiBNb3VzZUV2ZW50LCBkb0JsdXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd1NhdmVDYW5jZWwgfHwgKCF0aGlzLl9tb2RlbERpcnR5Rm9yQ29tbWl0KSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMua2VlcEZvY3VzID0gdHJ1ZTtcclxuICAgIHRoaXMuc2hvdWxkQ29tbWl0ID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLl9jb21taXRCdXR0b25zQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuX2NvbW1pdEJ1dHRvbnNDb21wb25lbnRSZWYuaW5zdGFuY2UuY29tbWl0RmluaXNoZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZi5pbnN0YW5jZS5jb21taXR0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuX21vZGVsRGlydHlGb3JDb21taXQgPSBmYWxzZTtcclxuICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNvbW1pdCh0aGlzLm1vZGVsKTtcclxuICAgIHRoaXMua2VlcEZvY3VzID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLl9jb21taXRGaW5pc2hlZCgpO1xyXG4gICAgaWYgKHN1Y2Nlc3MgJiYgZG9CbHVyKSB7XHJcbiAgICAgIHRoaXMuZG9CbHVyKGV2ZW50LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VzcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbW1pdEZpbmlzaGVkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBpZiAodGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZikge1xyXG4gICAgICAgIHRoaXMuX2NvbW1pdEJ1dHRvbnNDb21wb25lbnRSZWYuaW5zdGFuY2UuY29tbWl0RmluaXNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2NvbW1pdEJ1dHRvbnNDb21wb25lbnRSZWYuaW5zdGFuY2UuY29tbWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZi5pbnN0YW5jZS5jb21taXRGaW5pc2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5yZW1vdmVDb21wb25lbnQodGhpcy5fY29tbWl0QnV0dG9uc0NvbXBvbmVudFJlZik7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSwgODAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJFcnJvckNvbXBvbmVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3ZlcmxheVNlcnZpY2UucmVtb3ZlQ29tcG9uZW50KHRoaXMuX3ZhbGlkYXRpb25Db21wb25lbnRSZWYpO1xyXG4gIH1cclxuXHJcbiAgLy8gd2hldGhlciB0aGlzLm5nTW9kZWwuY29udHJvbCBoYXMgc2FmZSBhY2Nlc3NcclxuICBwcml2YXRlIF9jb250cm9sRXhpc3RzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmdNb2RlbCAmJiAhIXRoaXMuY29udHJvbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnRyb2xJc1ZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xFeGlzdHMoKSAmJiB0aGlzLmNvbnRyb2wudmFsaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXROYXRpdmVEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcclxuICAgICAgdGhpcy5pbnB1dC5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TmF0aXZlTWF4TGVuZ3RoKG1heGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnB1dCAmJiAhaXNOYU4obWF4bGVuZ3RoKSkge1xyXG4gICAgICB0aGlzLmlucHV0Lm1heExlbmd0aCA9IG1heGxlbmd0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfc2V0TmF0aXZlUmVhZE9ubHkocmVhZG9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQucmVhZE9ubHkgPSByZWFkb25seTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE5hdGl2ZVJlcXVpcmVkKHJlcXVpcmVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICB0aGlzLmlucHV0LnJlcXVpcmVkID0gcmVxdWlyZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdWJzY3JpYmVUb1NwZWVjaElucHV0KCk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5fc3BlZWNoU3ViID0gdGhpcy5zcGVlY2hJbnB1dC5zcGVlY2hJbnB1dC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgIC8vICAgICBpZiAodGhpcy5mb2N1c2VkICYmIHRoaXMuX2NvbnRyb2xFeGlzdHMoKSkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCB2YWw6IHN0cmluZyA9IHRoaXMuY29udHJvbC52YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5zZXRNb2RlbCgoU3RyaW5nVXRpbHMuSXNTdHJpbmcodmFsKSA/IHZhbCA6ICcnKSArIGRhdGEpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkT3JSZW1vdmVTZWxmRnJvbUZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oaWRkZW4pIHtcclxuICAgICAgdGhpcy5fcmVtb3ZlU2VsZkZyb21Gb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9hZGRTZWxmVG9Gb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVTZWxmSW5Gb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQudXBkYXRlRm9ybUlucHV0KHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlU2VsZkZyb21Gb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbXBvbmVudCAmJiB0aGlzLm5nTW9kZWwpIHtcclxuICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnJlbW92ZUZvcm1JbnB1dCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZFNlbGZUb0Zvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMubmdNb2RlbCAmJiAhdGhpcy5ub0Zvcm1Hcm91cENvbnRyb2wpIHtcclxuICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnJlbW92ZUZvcm1JbnB1dCh0aGlzKTsgLy8gcHJldmVudGluZyB0aGVyZSBhcmUgdHdvIGNvbnRyb2xzIGluIGZvcm1ncm91cCB3aGVuIG15Rm9ybUlucHV0SW5zdGFuY2UgaXMgKGJlaW5nKSBzZXRcclxuICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LmFkZEZvcm1JbnB1dCh0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UgPyB0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UgOiB0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVJbnB1dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgLy90cnkgdG8gZmluZCBpbnB1dCBlbGVtZW50XHJcbiAgICAgIHRoaXMuX2ZpbmRJbnB1dE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pO1xyXG4gICAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIChldmVudCkgPT4gdGhpcy5kb0JsdXIoZXZlbnQpKTtcclxuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKGV2ZW50KSA9PiB0aGlzLmRvRm9jdXMoZXZlbnQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmluZElucHV0Tm9kZShub2Rlcyk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XHJcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQgPSBub2RlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX2ZpbmRJbnB1dE5vZGUobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Bvc2l0aW9uVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZiAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQpIHtcclxuICAgICAgY29uc3QgY2xpZW50UmVjdDogQ2xpZW50UmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQuaW5zdGFuY2UudG9wID0gY2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgIHRoaXMuX2Vycm9yVmFsaWRhdGlvbkNvbXBvbmVudC5pbnN0YW5jZS5sZWZ0ID0gY2xpZW50UmVjdC5sZWZ0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9oYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xyXG4gICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgIGNhc2UgJ051bXBhZEVudGVyJzpcclxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29tbWl0KCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBjYXNlICdUYWInOlxyXG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nVG9Gb2N1cyA9IGV2ZW50LnNoaWZ0S2V5ID8gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgYW55KS5wcmV2aW91c1NpYmxpbmcgOiAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBhbnkpLm5leHRTaWJsaW5nO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3Qgc3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuX2hhbmRsZUNvbW1pdCgpO1xyXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICBpZiAobmV4dFNpYmxpbmdUb0ZvY3VzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2V0Rm9jdXNPbk5leHRQb3NzaWJsZUlucHV0KG5leHRTaWJsaW5nVG9Gb2N1cywgZXZlbnQuc2hpZnRLZXkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ2xpY2soKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU5ld0ZvY3VzRXZlbnQoZWxlbWVudDogYW55KTogRXZlbnQge1xyXG4gICAgbGV0IGV2ZW50VHlwZSA9ICdvbmZvY3VzaW4nIGluIGVsZW1lbnQgPyAnZm9jdXNpbicgOiAnZm9jdXMnLFxyXG4gICAgICBidWJibGVzID0gJ29uZm9jdXNpbicgaW4gZWxlbWVudCxcclxuICAgICAgZm9jdXNFdmVudDtcclxuXHJcbiAgICBpZiAoJ2NyZWF0ZUV2ZW50JyBpbiBkb2N1bWVudCkge1xyXG4gICAgICBmb2N1c0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XHJcbiAgICAgIGZvY3VzRXZlbnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgYnViYmxlcywgdHJ1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKCdFdmVudCcgaW4gd2luZG93KSB7XHJcbiAgICAgIGZvY3VzRXZlbnQgPSBuZXcgRXZlbnQoZXZlbnRUeXBlLCB7YnViYmxlczogYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZX0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvY3VzRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRGb2N1c09uTmV4dFBvc3NpYmxlSW5wdXQoZWxlbWVudDogYW55LCBwcmV2aW91czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGVsZW1lbnRDb2xsID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcclxuICAgIGlmICghZWxlbWVudENvbGwgfHwgZWxlbWVudENvbGwubGVuZ3RoIDwgMSkge1xyXG4gICAgICBlbGVtZW50Q29sbCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZWxlbWVudENvbGwgJiYgZWxlbWVudENvbGwubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBlbGVtZW50Q29sbFswXTtcclxuICAgICAgaWYgKGlucHV0RWxlbWVudC5kaXNhYmxlZCB8fCBpbnB1dEVsZW1lbnQucmVhZE9ubHkpIHtcclxuICAgICAgICB0aGlzLl9zZXRGb2N1c09uTmV4dFBvc3NpYmxlSW5wdXQocHJldmlvdXMgPyBlbGVtZW50LnByZXZpb3VzU2libGluZyA6IGVsZW1lbnQubmV4dFNpYmxpbmcsIHByZXZpb3VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBmb2N1c0V2ZW50ID0gdGhpcy5fY3JlYXRlTmV3Rm9jdXNFdmVudChlbGVtZW50KTtcclxuICAgICAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICBpbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChmb2N1c0V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=