@colijnit/corecomponents_v12 12.2.20 → 12.2.22

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