@colijnit/corecomponents_v12 12.2.26 → 12.2.28

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 (439) hide show
  1. package/bundles/colijnit-corecomponents_v12.umd.js +13792 -13682
  2. package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
  3. package/colijnit-corecomponents_v12.d.ts +43 -43
  4. package/colijnit-corecomponents_v12.metadata.json +1 -1
  5. package/esm2015/colijnit-corecomponents_v12.js +43 -43
  6. package/esm2015/lib/components/article-tile/article-tile.component.js +49 -49
  7. package/esm2015/lib/components/article-tile/article-tile.module.js +34 -34
  8. package/esm2015/lib/components/base/base-input.component.js +833 -833
  9. package/esm2015/lib/components/base/base.module.js +21 -21
  10. package/esm2015/lib/components/base/commit-buttons/commit-buttons.component.js +85 -85
  11. package/esm2015/lib/components/base/commit-buttons/commit-buttons.module.js +20 -20
  12. package/esm2015/lib/components/base/dialog-base.component.js +5 -5
  13. package/esm2015/lib/components/base-input-date-picker/base-input-date-picker.directive.js +24 -24
  14. package/esm2015/lib/components/button/button.component.js +73 -73
  15. package/esm2015/lib/components/button/button.module.js +18 -18
  16. package/esm2015/lib/components/calendar/calendar-template.component.js +281 -281
  17. package/esm2015/lib/components/calendar/calendar.component.js +32 -32
  18. package/esm2015/lib/components/calendar/calendar.module.js +27 -27
  19. package/esm2015/lib/components/card/card.component.js +50 -50
  20. package/esm2015/lib/components/card/card.module.js +34 -34
  21. package/esm2015/lib/components/carousel/carousel.component.js +109 -109
  22. package/esm2015/lib/components/carousel/carousel.module.js +31 -31
  23. package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +293 -293
  24. package/esm2015/lib/components/carousel-3d/carousel-3d.module.js +18 -18
  25. package/esm2015/lib/components/carousel-3d/carouselItem.js +53 -53
  26. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.component.js +72 -72
  27. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.module.js +18 -18
  28. package/esm2015/lib/components/co-dialog/co-dialog.component.js +91 -91
  29. package/esm2015/lib/components/co-dialog/co-dialog.module.js +18 -18
  30. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +35 -35
  31. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.module.js +16 -16
  32. package/esm2015/lib/components/collapsible/collapsible.component.js +67 -67
  33. package/esm2015/lib/components/collapsible/collapsible.module.js +18 -18
  34. package/esm2015/lib/components/color-picker/color-picker.component.js +33 -33
  35. package/esm2015/lib/components/color-picker/color-picker.module.js +20 -20
  36. package/esm2015/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.js +46 -46
  37. package/esm2015/lib/components/core-dialog/core-dialog.module.js +38 -38
  38. package/esm2015/lib/components/core-dialog/core-dialog.service.js +66 -66
  39. package/esm2015/lib/components/core-dialog/core-dynamic-component.service.js +92 -92
  40. package/esm2015/lib/components/double-calendar/double-calendar.component.js +62 -62
  41. package/esm2015/lib/components/double-calendar/double-calendar.module.js +24 -24
  42. package/esm2015/lib/components/filter-item/filter-item-viewmodel.js +12 -12
  43. package/esm2015/lib/components/filter-item/filter-item.component.js +496 -496
  44. package/esm2015/lib/components/filter-item/filter-item.module.js +42 -42
  45. package/esm2015/lib/components/filter-item/filter-viewmodel.js +10 -10
  46. package/esm2015/lib/components/form/form.component.js +181 -181
  47. package/esm2015/lib/components/form/form.module.js +22 -22
  48. package/esm2015/lib/components/grid-toolbar/grid-toolbar.component.js +48 -48
  49. package/esm2015/lib/components/grid-toolbar/grid-toolbar.module.js +22 -22
  50. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.component.js +23 -23
  51. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.module.js +18 -18
  52. package/esm2015/lib/components/icon/icon-cache.service.js +51 -51
  53. package/esm2015/lib/components/icon/icon.component.js +47 -47
  54. package/esm2015/lib/components/icon/icon.module.js +24 -24
  55. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.component.js +56 -56
  56. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.module.js +22 -22
  57. package/esm2015/lib/components/image/image.component.js +31 -31
  58. package/esm2015/lib/components/image/image.module.js +13 -13
  59. package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +71 -71
  60. package/esm2015/lib/components/input-checkbox/input-checkbox.module.js +18 -18
  61. package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +74 -74
  62. package/esm2015/lib/components/input-date-picker/input-date-picker.module.js +25 -25
  63. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.component.js +107 -107
  64. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.module.js +26 -26
  65. package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +285 -285
  66. package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +22 -22
  67. package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +77 -77
  68. package/esm2015/lib/components/input-radio-button/input-radio-button.module.js +18 -18
  69. package/esm2015/lib/components/input-scanner/bar-code-scanner.js +22 -22
  70. package/esm2015/lib/components/input-scanner/input-scanner.component.js +56 -56
  71. package/esm2015/lib/components/input-scanner/input-scanner.module.js +20 -20
  72. package/esm2015/lib/components/input-scanner/scanner.service.js +27 -27
  73. package/esm2015/lib/components/input-search/input-search.component.js +67 -63
  74. package/esm2015/lib/components/input-search/input-search.module.js +20 -20
  75. package/esm2015/lib/components/input-text/input-text.component.js +198 -194
  76. package/esm2015/lib/components/input-text/input-text.module.js +32 -32
  77. package/esm2015/lib/components/input-textarea/input-textarea.component.js +55 -55
  78. package/esm2015/lib/components/input-textarea/input-textarea.module.js +26 -26
  79. package/esm2015/lib/components/level-indicator/level-indicator-level.enum.js +6 -6
  80. package/esm2015/lib/components/level-indicator/level-indicator.component.js +29 -29
  81. package/esm2015/lib/components/level-indicator/level-indicator.module.js +14 -14
  82. package/esm2015/lib/components/list-of-values/list-of-values-multiselect-popup.component.js +87 -87
  83. package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +218 -218
  84. package/esm2015/lib/components/list-of-values/list-of-values.component.js +199 -199
  85. package/esm2015/lib/components/list-of-values/list-of-values.module.js +37 -37
  86. package/esm2015/lib/components/loader/loader.component.js +16 -16
  87. package/esm2015/lib/components/loader/loader.module.js +18 -18
  88. package/esm2015/lib/components/pagination/paginate.pipe.js +98 -98
  89. package/esm2015/lib/components/pagination/pagination-instance.js +1 -1
  90. package/esm2015/lib/components/pagination/pagination.component.js +107 -107
  91. package/esm2015/lib/components/pagination/pagination.module.js +27 -27
  92. package/esm2015/lib/components/pagination/pagination.service.js +87 -87
  93. package/esm2015/lib/components/pagination-bar/pagination-bar.component.js +136 -136
  94. package/esm2015/lib/components/pagination-bar/pagination-bar.module.js +18 -18
  95. package/esm2015/lib/components/popup/const/popup-window-token.js +2 -2
  96. package/esm2015/lib/components/popup/interface/popup-button.js +7 -7
  97. package/esm2015/lib/components/popup/interface/popup-close-event.js +1 -1
  98. package/esm2015/lib/components/popup/interface/popup-settings.js +41 -41
  99. package/esm2015/lib/components/popup/interface/popup.js +1 -1
  100. package/esm2015/lib/components/popup/model/popup-button-globals.js +10 -10
  101. package/esm2015/lib/components/popup/model/popup-window.js +37 -37
  102. package/esm2015/lib/components/popup/popup-buttons.component.js +42 -42
  103. package/esm2015/lib/components/popup/popup-message-display.component.js +37 -37
  104. package/esm2015/lib/components/popup/popup-window-shell.component.js +141 -141
  105. package/esm2015/lib/components/popup/popup.module.js +48 -48
  106. package/esm2015/lib/components/popup/service/popup-shower.service.js +89 -89
  107. package/esm2015/lib/components/popup/service/prompt.service.js +126 -126
  108. package/esm2015/lib/components/popup/text-input-popup.component.js +33 -33
  109. package/esm2015/lib/components/responsive-text/responsive-text.component.js +17 -17
  110. package/esm2015/lib/components/responsive-text/responsive-text.module.js +18 -18
  111. package/esm2015/lib/components/simple-grid/base-simple-grid.component.js +166 -164
  112. package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +141 -141
  113. package/esm2015/lib/components/simple-grid/simple-grid-column.directive.js +113 -111
  114. package/esm2015/lib/components/simple-grid/simple-grid.component.js +553 -412
  115. package/esm2015/lib/components/simple-grid/simple-grid.module.js +45 -41
  116. package/esm2015/lib/components/tile/tile.component.js +44 -44
  117. package/esm2015/lib/components/tile/tile.module.js +22 -22
  118. package/esm2015/lib/components/tile-select/tile-select.component.js +26 -26
  119. package/esm2015/lib/components/tile-select/tile-select.module.js +20 -20
  120. package/esm2015/lib/components/tooltip/tooltip.component.js +74 -74
  121. package/esm2015/lib/components/tooltip/tooltip.module.js +18 -18
  122. package/esm2015/lib/components/validation-error/validation-error.component.js +30 -30
  123. package/esm2015/lib/components/validation-error/validation-error.module.js +24 -24
  124. package/esm2015/lib/components/view-mode-buttons/content-view-mode.enum.js +10 -10
  125. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.component.js +41 -41
  126. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.module.js +20 -20
  127. package/esm2015/lib/core/constant/default-upper-bound-for-range-components.js +3 -3
  128. package/esm2015/lib/core/constant/java-max-int.js +1 -1
  129. package/esm2015/lib/core/constant/number-inputs-key-down-white-list.js +44 -44
  130. package/esm2015/lib/core/decorator/input-boolean.decorator.js +33 -33
  131. package/esm2015/lib/core/enum/co-direction.js +8 -8
  132. package/esm2015/lib/core/enum/co-document-image-display-kind.enum.js +6 -6
  133. package/esm2015/lib/core/enum/co-document-type.enum.js +10 -10
  134. package/esm2015/lib/core/enum/co-orientation.js +16 -16
  135. package/esm2015/lib/core/enum/core-components-icon.enum.js +299 -299
  136. package/esm2015/lib/core/enum/file-type-internal.enum.js +16 -16
  137. package/esm2015/lib/core/enum/file-type.enum.js +10 -10
  138. package/esm2015/lib/core/enum/filterItem-mode.enum.js +42 -42
  139. package/esm2015/lib/core/enum/input-number-picker-show-mode.enum.js +7 -7
  140. package/esm2015/lib/core/enum/keyboard-code.enum.js +73 -73
  141. package/esm2015/lib/core/enum/keyboard-key.enum.js +75 -75
  142. package/esm2015/lib/core/enum/object-right-type.enum.js +6 -6
  143. package/esm2015/lib/core/enum/popup-button-type.enum.js +11 -11
  144. package/esm2015/lib/core/enum/popup-type.enum.js +10 -10
  145. package/esm2015/lib/core/enum/table-name.enum.js +80 -80
  146. package/esm2015/lib/core/function/any-nill.function.js +5 -5
  147. package/esm2015/lib/core/function/is-nill.function.js +4 -4
  148. package/esm2015/lib/core/function/none-nill.function.js +16 -16
  149. package/esm2015/lib/core/function/not-nill.function.js +4 -4
  150. package/esm2015/lib/core/model/bounds-constrained-number-value.js +170 -170
  151. package/esm2015/lib/core/model/check-precision-and-scale-result.js +1 -1
  152. package/esm2015/lib/core/model/check-within-stepped-bounds-result.js +1 -1
  153. package/esm2015/lib/core/model/co-document-right.bo.js +2 -2
  154. package/esm2015/lib/core/model/co-document.bo.js +120 -120
  155. package/esm2015/lib/core/model/core-components-icon-svg.js +298 -298
  156. package/esm2015/lib/core/model/element-position.js +9 -9
  157. package/esm2015/lib/core/model/event/string-prompt-result-event.js +7 -7
  158. package/esm2015/lib/core/service/form-input-user-change-listener.service.js +24 -24
  159. package/esm2015/lib/core/service/form-master.service.js +101 -101
  160. package/esm2015/lib/core/service/ng-zone-wrapper.service.js +19 -19
  161. package/esm2015/lib/core/utils/array-utils.js +263 -263
  162. package/esm2015/lib/core/utils/browser-utils.js +99 -99
  163. package/esm2015/lib/core/utils/direction-enum-utils.js +13 -13
  164. package/esm2015/lib/core/utils/event-utils.js +52 -52
  165. package/esm2015/lib/core/utils/file-utils.js +266 -266
  166. package/esm2015/lib/core/utils/number-utils.js +308 -308
  167. package/esm2015/lib/core/utils/object-utils.js +185 -185
  168. package/esm2015/lib/core/utils/string-utils.js +93 -93
  169. package/esm2015/lib/core/validator/email.validator.js +5 -5
  170. package/esm2015/lib/core/validator/equal.validator.js +10 -10
  171. package/esm2015/lib/core/validator/max-string-length.validator.js +9 -9
  172. package/esm2015/lib/core/validator/password.validator.js +30 -30
  173. package/esm2015/lib/core/validator/precision-scale.validator.js +10 -10
  174. package/esm2015/lib/core/validator/required.validator.js +4 -4
  175. package/esm2015/lib/directives/clickoutside/click-outside-master.service.js +56 -56
  176. package/esm2015/lib/directives/clickoutside/click-outside.directive.js +70 -70
  177. package/esm2015/lib/directives/clickoutside/clickoutside.module.js +18 -18
  178. package/esm2015/lib/directives/observe-visibility/observe-visibility.directive.js +52 -52
  179. package/esm2015/lib/directives/observe-visibility/observe-visibility.module.js +14 -14
  180. package/esm2015/lib/directives/overlay/overlay-parent.directive.js +18 -18
  181. package/esm2015/lib/directives/overlay/overlay.directive.js +160 -160
  182. package/esm2015/lib/directives/overlay/overlay.module.js +17 -17
  183. package/esm2015/lib/directives/ripple/ripple-ref.js +25 -25
  184. package/esm2015/lib/directives/ripple/ripple-renderer.js +159 -159
  185. package/esm2015/lib/directives/ripple/ripple.directive.js +79 -79
  186. package/esm2015/lib/directives/ripple/ripple.module.js +23 -23
  187. package/esm2015/lib/directives/ripple/scroll-dispatcher.service.js +107 -107
  188. package/esm2015/lib/directives/ripple/scrollable.directive.js +39 -39
  189. package/esm2015/lib/directives/ripple/viewport-ruler.service.js +72 -72
  190. package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +157 -157
  191. package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +18 -18
  192. package/esm2015/lib/directives/stopclick/stop-click.directive.js +37 -37
  193. package/esm2015/lib/directives/stopclick/stop-click.module.js +14 -14
  194. package/esm2015/lib/directives/template-wrapper/template-wrapper.directive.js +67 -67
  195. package/esm2015/lib/directives/template-wrapper/template-wrapper.module.js +14 -14
  196. package/esm2015/lib/directives/tooltip/tooltip-directive.module.js +18 -18
  197. package/esm2015/lib/directives/tooltip/tooltip.directive.js +77 -77
  198. package/esm2015/lib/interfaces/dialog-response.interface.js +1 -1
  199. package/esm2015/lib/interfaces/scanner-input.interface.js +1 -1
  200. package/esm2015/lib/interfaces/screen-config-adapter-component-interface-name.js +3 -3
  201. package/esm2015/lib/interfaces/screen-config-adapter.component.interface.js +1 -1
  202. package/esm2015/lib/model/enum/app-button-type.enum.js +10 -10
  203. package/esm2015/lib/model/enum/app-popup-type.enum.js +7 -7
  204. package/esm2015/lib/pipes/append.pipe.js +16 -16
  205. package/esm2015/lib/pipes/append.pipe.module.js +14 -14
  206. package/esm2015/lib/pipes/filter.pipe.js +15 -15
  207. package/esm2015/lib/pipes/filter.pipe.module.js +14 -14
  208. package/esm2015/lib/pipes/prepend.pipe.js +16 -16
  209. package/esm2015/lib/pipes/prepend.pipe.module.js +14 -14
  210. package/esm2015/lib/pipes/price-display-pipe.module.js +14 -14
  211. package/esm2015/lib/pipes/price-display.pipe.js +19 -19
  212. package/esm2015/lib/service/base-module-screen-config.service.js +204 -204
  213. package/esm2015/lib/service/base-module.service.js +41 -41
  214. package/esm2015/lib/service/color-sequence.service.js +22 -22
  215. package/esm2015/lib/service/overlay.service.js +72 -72
  216. package/esm2015/lib/translation/core-components-translation.module.js +28 -28
  217. package/esm2015/lib/translation/core-components-translation.service.js +16 -16
  218. package/esm2015/lib/translation/core-dictionary.service.js +28 -28
  219. package/esm2015/lib/translation/core-localize.pipe.js +25 -25
  220. package/esm2015/public-api.js +129 -129
  221. package/fesm2015/colijnit-corecomponents_v12.js +12271 -12118
  222. package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
  223. package/lib/components/article-tile/article-tile.component.d.ts +22 -22
  224. package/lib/components/article-tile/article-tile.module.d.ts +2 -2
  225. package/lib/components/base/base-input.component.d.ts +182 -182
  226. package/lib/components/base/base.module.d.ts +2 -2
  227. package/lib/components/base/commit-buttons/commit-buttons.component.d.ts +21 -21
  228. package/lib/components/base/commit-buttons/commit-buttons.module.d.ts +2 -2
  229. package/lib/components/base/dialog-base.component.d.ts +4 -4
  230. package/lib/components/base-input-date-picker/base-input-date-picker.directive.d.ts +15 -15
  231. package/lib/components/button/button.component.d.ts +29 -29
  232. package/lib/components/button/button.module.d.ts +2 -2
  233. package/lib/components/calendar/calendar-template.component.d.ts +60 -60
  234. package/lib/components/calendar/calendar.component.d.ts +13 -13
  235. package/lib/components/calendar/calendar.module.d.ts +2 -2
  236. package/lib/components/card/card.component.d.ts +23 -23
  237. package/lib/components/card/card.module.d.ts +2 -2
  238. package/lib/components/carousel/carousel.component.d.ts +23 -23
  239. package/lib/components/carousel/carousel.module.d.ts +6 -6
  240. package/lib/components/carousel-3d/carousel-3d.component.d.ts +55 -55
  241. package/lib/components/carousel-3d/carousel-3d.module.d.ts +2 -2
  242. package/lib/components/carousel-3d/carouselItem.d.ts +13 -13
  243. package/lib/components/checkmark-overlay/checkmark-overlay.component.d.ts +17 -17
  244. package/lib/components/checkmark-overlay/checkmark-overlay.module.d.ts +2 -2
  245. package/lib/components/co-dialog/co-dialog.component.d.ts +23 -23
  246. package/lib/components/co-dialog/co-dialog.module.d.ts +2 -2
  247. package/lib/components/co-dialog-wizard/co-dialog-wizard.component.d.ts +9 -9
  248. package/lib/components/co-dialog-wizard/co-dialog-wizard.module.d.ts +2 -2
  249. package/lib/components/collapsible/collapsible.component.d.ts +22 -22
  250. package/lib/components/collapsible/collapsible.module.d.ts +2 -2
  251. package/lib/components/color-picker/color-picker.component.d.ts +6 -6
  252. package/lib/components/color-picker/color-picker.module.d.ts +2 -2
  253. package/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +20 -20
  254. package/lib/components/core-dialog/core-dialog.module.d.ts +4 -4
  255. package/lib/components/core-dialog/core-dialog.service.d.ts +15 -15
  256. package/lib/components/core-dialog/core-dynamic-component.service.d.ts +12 -12
  257. package/lib/components/double-calendar/double-calendar.component.d.ts +18 -18
  258. package/lib/components/double-calendar/double-calendar.module.d.ts +2 -2
  259. package/lib/components/filter-item/filter-item-viewmodel.d.ts +9 -9
  260. package/lib/components/filter-item/filter-item.component.d.ts +80 -80
  261. package/lib/components/filter-item/filter-item.module.d.ts +2 -2
  262. package/lib/components/filter-item/filter-viewmodel.d.ts +8 -8
  263. package/lib/components/form/form.component.d.ts +39 -39
  264. package/lib/components/form/form.module.d.ts +2 -2
  265. package/lib/components/grid-toolbar/grid-toolbar.component.d.ts +19 -19
  266. package/lib/components/grid-toolbar/grid-toolbar.module.d.ts +2 -2
  267. package/lib/components/grid-toolbar-button/grid-toolbar-button.component.d.ts +8 -8
  268. package/lib/components/grid-toolbar-button/grid-toolbar-button.module.d.ts +2 -2
  269. package/lib/components/icon/icon-cache.service.d.ts +20 -20
  270. package/lib/components/icon/icon.component.d.ts +17 -17
  271. package/lib/components/icon/icon.module.d.ts +2 -2
  272. package/lib/components/icon-collapse-handle/icon-collapse-handle.component.d.ts +21 -21
  273. package/lib/components/icon-collapse-handle/icon-collapse-handle.module.d.ts +2 -2
  274. package/lib/components/image/image.component.d.ts +20 -20
  275. package/lib/components/image/image.module.d.ts +2 -2
  276. package/lib/components/input-checkbox/input-checkbox.component.d.ts +24 -24
  277. package/lib/components/input-checkbox/input-checkbox.module.d.ts +2 -2
  278. package/lib/components/input-date-picker/input-date-picker.component.d.ts +12 -12
  279. package/lib/components/input-date-picker/input-date-picker.module.d.ts +2 -2
  280. package/lib/components/input-date-range-picker/input-date-range-picker.component.d.ts +20 -20
  281. package/lib/components/input-date-range-picker/input-date-range-picker.module.d.ts +2 -2
  282. package/lib/components/input-number-picker/input-number-picker.component.d.ts +73 -73
  283. package/lib/components/input-number-picker/input-number-picker.module.d.ts +2 -2
  284. package/lib/components/input-radio-button/input-radio-button.component.d.ts +19 -19
  285. package/lib/components/input-radio-button/input-radio-button.module.d.ts +2 -2
  286. package/lib/components/input-scanner/bar-code-scanner.d.ts +7 -7
  287. package/lib/components/input-scanner/input-scanner.component.d.ts +24 -24
  288. package/lib/components/input-scanner/input-scanner.module.d.ts +2 -2
  289. package/lib/components/input-scanner/scanner.service.d.ts +11 -11
  290. package/lib/components/input-search/input-search.component.d.ts +20 -19
  291. package/lib/components/input-search/input-search.module.d.ts +2 -2
  292. package/lib/components/input-text/input-text.component.d.ts +66 -65
  293. package/lib/components/input-text/input-text.module.d.ts +2 -2
  294. package/lib/components/input-textarea/input-textarea.component.d.ts +19 -19
  295. package/lib/components/input-textarea/input-textarea.module.d.ts +2 -2
  296. package/lib/components/level-indicator/level-indicator-level.enum.d.ts +5 -5
  297. package/lib/components/level-indicator/level-indicator.component.d.ts +10 -10
  298. package/lib/components/level-indicator/level-indicator.module.d.ts +2 -2
  299. package/lib/components/list-of-values/list-of-values-multiselect-popup.component.d.ts +25 -25
  300. package/lib/components/list-of-values/list-of-values-popup.component.d.ts +47 -47
  301. package/lib/components/list-of-values/list-of-values.component.d.ts +37 -37
  302. package/lib/components/list-of-values/list-of-values.module.d.ts +2 -2
  303. package/lib/components/loader/loader.component.d.ts +3 -3
  304. package/lib/components/loader/loader.module.d.ts +2 -2
  305. package/lib/components/pagination/paginate.pipe.d.ts +15 -15
  306. package/lib/components/pagination/pagination-instance.d.ts +14 -14
  307. package/lib/components/pagination/pagination.component.d.ts +38 -38
  308. package/lib/components/pagination/pagination.module.d.ts +2 -2
  309. package/lib/components/pagination/pagination.service.d.ts +24 -24
  310. package/lib/components/pagination-bar/pagination-bar.component.d.ts +33 -33
  311. package/lib/components/pagination-bar/pagination-bar.module.d.ts +2 -2
  312. package/lib/components/popup/const/popup-window-token.d.ts +3 -3
  313. package/lib/components/popup/interface/popup-button.d.ts +8 -8
  314. package/lib/components/popup/interface/popup-close-event.d.ts +5 -5
  315. package/lib/components/popup/interface/popup-settings.d.ts +21 -21
  316. package/lib/components/popup/interface/popup.d.ts +9 -9
  317. package/lib/components/popup/model/popup-button-globals.d.ts +9 -9
  318. package/lib/components/popup/model/popup-window.d.ts +21 -21
  319. package/lib/components/popup/popup-buttons.component.d.ts +13 -13
  320. package/lib/components/popup/popup-message-display.component.d.ts +12 -12
  321. package/lib/components/popup/popup-window-shell.component.d.ts +42 -42
  322. package/lib/components/popup/popup.module.d.ts +4 -4
  323. package/lib/components/popup/service/popup-shower.service.d.ts +17 -17
  324. package/lib/components/popup/service/prompt.service.d.ts +17 -17
  325. package/lib/components/popup/text-input-popup.component.d.ts +12 -12
  326. package/lib/components/responsive-text/responsive-text.component.d.ts +4 -4
  327. package/lib/components/responsive-text/responsive-text.module.d.ts +2 -2
  328. package/lib/components/simple-grid/base-simple-grid.component.d.ts +53 -52
  329. package/lib/components/simple-grid/simple-grid-cell.component.d.ts +30 -30
  330. package/lib/components/simple-grid/simple-grid-column.directive.d.ts +43 -42
  331. package/lib/components/simple-grid/simple-grid.component.d.ts +77 -64
  332. package/lib/components/simple-grid/simple-grid.module.d.ts +2 -2
  333. package/lib/components/simple-grid/style/_layout.scss +68 -0
  334. package/lib/components/tile/tile.component.d.ts +16 -16
  335. package/lib/components/tile/tile.module.d.ts +2 -2
  336. package/lib/components/tile-select/tile-select.component.d.ts +8 -8
  337. package/lib/components/tile-select/tile-select.module.d.ts +2 -2
  338. package/lib/components/tooltip/tooltip.component.d.ts +18 -18
  339. package/lib/components/tooltip/tooltip.module.d.ts +2 -2
  340. package/lib/components/validation-error/validation-error.component.d.ts +12 -12
  341. package/lib/components/validation-error/validation-error.module.d.ts +2 -2
  342. package/lib/components/view-mode-buttons/content-view-mode.enum.d.ts +8 -8
  343. package/lib/components/view-mode-buttons/view-mode-buttons.component.d.ts +17 -17
  344. package/lib/components/view-mode-buttons/view-mode-buttons.module.d.ts +2 -2
  345. package/lib/core/constant/default-upper-bound-for-range-components.d.ts +2 -2
  346. package/lib/core/constant/java-max-int.d.ts +1 -1
  347. package/lib/core/constant/number-inputs-key-down-white-list.d.ts +2 -2
  348. package/lib/core/decorator/input-boolean.decorator.d.ts +8 -8
  349. package/lib/core/enum/co-direction.d.ts +6 -6
  350. package/lib/core/enum/co-document-image-display-kind.enum.d.ts +5 -5
  351. package/lib/core/enum/co-document-type.enum.d.ts +5 -5
  352. package/lib/core/enum/co-orientation.d.ts +6 -6
  353. package/lib/core/enum/core-components-icon.enum.d.ts +298 -298
  354. package/lib/core/enum/file-type-internal.enum.d.ts +15 -15
  355. package/lib/core/enum/file-type.enum.d.ts +5 -5
  356. package/lib/core/enum/filterItem-mode.enum.d.ts +15 -15
  357. package/lib/core/enum/input-number-picker-show-mode.enum.d.ts +5 -5
  358. package/lib/core/enum/keyboard-code.enum.d.ts +71 -71
  359. package/lib/core/enum/keyboard-key.enum.d.ts +70 -70
  360. package/lib/core/enum/object-right-type.enum.d.ts +5 -5
  361. package/lib/core/enum/popup-button-type.enum.d.ts +9 -9
  362. package/lib/core/enum/popup-type.enum.d.ts +9 -9
  363. package/lib/core/enum/table-name.enum.d.ts +79 -79
  364. package/lib/core/function/any-nill.function.d.ts +1 -1
  365. package/lib/core/function/is-nill.function.d.ts +1 -1
  366. package/lib/core/function/none-nill.function.d.ts +1 -1
  367. package/lib/core/function/not-nill.function.d.ts +1 -1
  368. package/lib/core/model/bounds-constrained-number-value.d.ts +46 -46
  369. package/lib/core/model/check-precision-and-scale-result.d.ts +4 -4
  370. package/lib/core/model/check-within-stepped-bounds-result.d.ts +8 -8
  371. package/lib/core/model/co-document-right.bo.d.ts +6 -6
  372. package/lib/core/model/co-document.bo.d.ts +61 -61
  373. package/lib/core/model/core-components-icon-svg.d.ts +4 -4
  374. package/lib/core/model/element-position.d.ts +7 -7
  375. package/lib/core/model/event/string-prompt-result-event.d.ts +6 -6
  376. package/lib/core/service/form-input-user-change-listener.service.d.ts +10 -10
  377. package/lib/core/service/form-master.service.d.ts +26 -26
  378. package/lib/core/service/ng-zone-wrapper.service.d.ts +6 -6
  379. package/lib/core/utils/array-utils.d.ts +85 -85
  380. package/lib/core/utils/browser-utils.d.ts +15 -15
  381. package/lib/core/utils/direction-enum-utils.d.ts +5 -5
  382. package/lib/core/utils/event-utils.d.ts +12 -12
  383. package/lib/core/utils/file-utils.d.ts +29 -29
  384. package/lib/core/utils/number-utils.d.ts +89 -89
  385. package/lib/core/utils/object-utils.d.ts +31 -31
  386. package/lib/core/utils/string-utils.d.ts +25 -25
  387. package/lib/core/validator/email.validator.d.ts +2 -2
  388. package/lib/core/validator/equal.validator.d.ts +2 -2
  389. package/lib/core/validator/max-string-length.validator.d.ts +2 -2
  390. package/lib/core/validator/password.validator.d.ts +3 -3
  391. package/lib/core/validator/precision-scale.validator.d.ts +2 -2
  392. package/lib/core/validator/required.validator.d.ts +2 -2
  393. package/lib/directives/clickoutside/click-outside-master.service.d.ts +15 -15
  394. package/lib/directives/clickoutside/click-outside.directive.d.ts +18 -18
  395. package/lib/directives/clickoutside/clickoutside.module.d.ts +2 -2
  396. package/lib/directives/observe-visibility/observe-visibility.directive.d.ts +14 -14
  397. package/lib/directives/observe-visibility/observe-visibility.module.d.ts +2 -2
  398. package/lib/directives/overlay/overlay-parent.directive.d.ts +6 -6
  399. package/lib/directives/overlay/overlay.directive.d.ts +25 -25
  400. package/lib/directives/overlay/overlay.module.d.ts +2 -2
  401. package/lib/directives/ripple/ripple-ref.d.ts +21 -21
  402. package/lib/directives/ripple/ripple-renderer.d.ts +56 -56
  403. package/lib/directives/ripple/ripple.directive.d.ts +56 -56
  404. package/lib/directives/ripple/ripple.module.d.ts +2 -2
  405. package/lib/directives/ripple/scroll-dispatcher.service.d.ts +51 -51
  406. package/lib/directives/ripple/scrollable.directive.d.ts +20 -20
  407. package/lib/directives/ripple/viewport-ruler.service.d.ts +29 -29
  408. package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +32 -32
  409. package/lib/directives/screen-configuration/screen-configuration.module.d.ts +2 -2
  410. package/lib/directives/stopclick/stop-click.directive.d.ts +10 -10
  411. package/lib/directives/stopclick/stop-click.module.d.ts +2 -2
  412. package/lib/directives/template-wrapper/template-wrapper.directive.d.ts +13 -13
  413. package/lib/directives/template-wrapper/template-wrapper.module.d.ts +2 -2
  414. package/lib/directives/tooltip/tooltip-directive.module.d.ts +2 -2
  415. package/lib/directives/tooltip/tooltip.directive.d.ts +20 -20
  416. package/lib/interfaces/dialog-response.interface.d.ts +6 -6
  417. package/lib/interfaces/scanner-input.interface.d.ts +3 -3
  418. package/lib/interfaces/screen-config-adapter-component-interface-name.d.ts +3 -3
  419. package/lib/interfaces/screen-config-adapter.component.interface.d.ts +10 -10
  420. package/lib/model/enum/app-button-type.enum.d.ts +9 -9
  421. package/lib/model/enum/app-popup-type.enum.d.ts +6 -6
  422. package/lib/pipes/append.pipe.d.ts +4 -4
  423. package/lib/pipes/append.pipe.module.d.ts +2 -2
  424. package/lib/pipes/filter.pipe.d.ts +4 -4
  425. package/lib/pipes/filter.pipe.module.d.ts +2 -2
  426. package/lib/pipes/prepend.pipe.d.ts +4 -4
  427. package/lib/pipes/prepend.pipe.module.d.ts +2 -2
  428. package/lib/pipes/price-display-pipe.module.d.ts +2 -2
  429. package/lib/pipes/price-display.pipe.d.ts +4 -4
  430. package/lib/service/base-module-screen-config.service.d.ts +47 -47
  431. package/lib/service/base-module.service.d.ts +22 -22
  432. package/lib/service/color-sequence.service.d.ts +4 -4
  433. package/lib/service/overlay.service.d.ts +13 -13
  434. package/lib/translation/core-components-translation.module.d.ts +4 -4
  435. package/lib/translation/core-components-translation.service.d.ts +6 -6
  436. package/lib/translation/core-dictionary.service.d.ts +12 -12
  437. package/lib/translation/core-localize.pipe.d.ts +7 -7
  438. package/package.json +1 -1
  439. package/public-api.d.ts +126 -126
@@ -1,264 +1,264 @@
1
- import { isNill } from "../function/is-nill.function";
2
- import { notNill } from "../function/not-nill.function";
3
- import { StringUtils } from "./string-utils";
4
- import { NumberUtils } from "./number-utils";
5
- import { ObjectUtils } from "./object-utils";
6
- export class ArrayUtils {
7
- /**
8
- * Inserts given element into given array, on given index number.
9
- *
10
- * @param index The index position for the element to insert, use negatives to count from the arrays end
11
- * @param element The element to insert
12
- * @param array The array to insert the element into
13
- * @returns True if and only if given element is succesfully inserted into given array.
14
- */
15
- static InsertElement(index, element, array) {
16
- if (!Array.isArray(array) || Math.abs(index) > array.length || isNill(index)) {
17
- // cannot insert something into nothing, and cannot insert an element into a non-array (via this contract that is), and
18
- // we will not insert anything beyond the arrays limits (but we can append to the start or end)
19
- return false;
20
- }
21
- const lenBefore = array.length;
22
- array.splice(index, 0, element);
23
- return (array.length === lenBefore + 1);
24
- }
25
- /**
26
- * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' keyword, but truly removes the
27
- * element using splice(). Also works on associative arrays.
28
- *
29
- * @param element The element to remove.
30
- * @param array The array to remove the element from.
31
- * @returns True iff given element was truly successfully removed from given array.
32
- */
33
- static RemoveElement(element, array) {
34
- if (!Array.isArray(array)) {
35
- return false;
36
- }
37
- let index = array.indexOf(element);
38
- return ArrayUtils.RemoveElementAtIndex(index, array);
39
- }
40
- /**
41
- * Returns a true shallow clone of given array plus all its items. Its first-level members are object-shallow-cloned (optionally with a
42
- * strongly typed constructor),
43
- * or just as plain object (see param arrayItemsClass).
44
- * @param arrayGiven
45
- * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
46
- * it'll be a plain object.
47
- * @returns a true shallow clone of given array plus all its items
48
- */
49
- static ShallowCloneArrayAndItsItem(arrayGiven, arrayItemsClass) {
50
- let arrayClone = [];
51
- if (arrayGiven) {
52
- for (let i = 0, len = arrayGiven.length; i < len; i++) {
53
- arrayClone.push(ObjectUtils.GetShallowClone(arrayGiven[i], arrayItemsClass));
54
- }
55
- }
56
- else {
57
- return [];
58
- }
59
- return arrayClone;
60
- }
61
- /**
62
- * Moves given element to given toIndex in given array. Returns whether the element was really moved, thus changing the given array.
63
- */
64
- static MoveElement(element, toIndex, array) {
65
- if (!Array.isArray(array) || isNill(toIndex)) {
66
- return false;
67
- }
68
- let fromIndex = array.indexOf(element);
69
- let toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
70
- if (fromIndex === -1 || array[toIndexCorrected] === element) {
71
- // element did not exist in given array, or already existed on given toIndex
72
- return false;
73
- }
74
- array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
75
- return true;
76
- }
77
- /**
78
- * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
79
- * @param array
80
- * @param itemValueFunction The function aplied to each array item that gives it a numerical value. The max num val found is returned.
81
- */
82
- static GetMaxCalculatedValue(array, itemValueFunction) {
83
- if (!array || !itemValueFunction) {
84
- return NaN;
85
- }
86
- let max = undefined;
87
- let len = array.length;
88
- for (let i = 0; i < len; i++) {
89
- let valueCur = itemValueFunction.call(this);
90
- if (valueCur > max) {
91
- max = valueCur;
92
- }
93
- }
94
- return max;
95
- }
96
- // Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
97
- static IsArrayWithElements(arrayToCheck, clazz) {
98
- if (isNill(arrayToCheck)) {
99
- return false;
100
- }
101
- if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
102
- if (clazz) {
103
- return arrayToCheck[0] instanceof clazz;
104
- }
105
- return true;
106
- }
107
- return false;
108
- }
109
- // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
110
- static RemoveElementsByFilter(array, filterFunction) {
111
- if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
112
- return false;
113
- }
114
- let atLeastOneRemoved = false;
115
- let len = array.length;
116
- for (let i = len - 1; i >= 0; i--) {
117
- let item = array[i];
118
- if (filterFunction.call(this, item) === true) {
119
- array.splice(i, 1);
120
- atLeastOneRemoved = true;
121
- }
122
- }
123
- return atLeastOneRemoved;
124
- }
125
- // Replaces the elementOut with given elementIn.
126
- static ReplaceElement(elementIn, elementOut, array) {
127
- if (!array || !Array.isArray(array)) {
128
- return;
129
- }
130
- const indexOut = array.indexOf(elementOut);
131
- if (indexOut > -1) {
132
- ArrayUtils.InsertElement(indexOut, elementIn, array);
133
- ArrayUtils.RemoveElement(elementOut, array);
134
- }
135
- }
136
- // Swaps the elements in given array with each other. Returns whether a real swap was made. From and To elements have to exist in array.
137
- static SwapElements(elementOne, elementTwo, array) {
138
- if (!Array.isArray(array)) {
139
- return false;
140
- }
141
- const elOneIdx = array.indexOf(elementTwo);
142
- const elTwoIdx = array.indexOf(elementOne);
143
- if (elOneIdx === -1 || elTwoIdx === -1) {
144
- return false;
145
- }
146
- array[elOneIdx] = array.splice(elTwoIdx, 1, array[elOneIdx])[0];
147
- return true;
148
- }
149
- // Inserts or removes given toggle element into given elements array; inserts if not yet exists, and removes if already exists.
150
- static ToggleElement(toggle, elements) {
151
- elements.indexOf(toggle) > -1 ? ArrayUtils.RemoveElement(toggle, elements) : elements.push(toggle);
152
- }
153
- // Returns the number of elements from given array for which given whereFunction holds true.
154
- static CountWhere(array, whereFunction) {
155
- if (!ArrayUtils.IsArrayWithElements(array) || !whereFunction) {
156
- return 0;
157
- }
158
- let count = 0;
159
- const len = array.length;
160
- for (let i = 0; i < len; i++) {
161
- if (whereFunction.call(this, array[i])) {
162
- count++;
163
- }
164
- }
165
- return count;
166
- }
167
- /**
168
- * Returns whether at least one element in given array could be found by given finder function.
169
- *
170
- * @param array
171
- * @param finder A finder function that takes an element of the array and returns a boolean that represents
172
- * the 'found status' for that element; whether it should have been found or not.
173
- */
174
- static ContainsAnElementFoundBy(array, finder) {
175
- if (!array || !finder) {
176
- return false;
177
- }
178
- return notNill(ArrayUtils.Find(array, finder));
179
- }
180
- /**
181
- * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
182
- * undefined when none was found.
183
- *
184
- * Example usage:
185
- * let foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
186
- * (return modelItem.getId() === '1')
187
- * * });
188
- *
189
- * @param array The array with items to search in.
190
- * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
191
- */
192
- static Find(array, foundBy) {
193
- if (!array || !foundBy) {
194
- return undefined;
195
- }
196
- for (let i = 0, len = array.length; i < len; i++) {
197
- let itemCur = array[i];
198
- if (foundBy(itemCur)) {
199
- return itemCur;
200
- }
201
- }
202
- return undefined;
203
- }
204
- /**
205
- * Sorts all items in the given array alphabetically (A-to-Z) according to the values of their given property.
206
- * @param theArray
207
- * @param propertyName = undefined] When not defined, assumes an array of STRINGS is given, instead of array of OBJECTS.
208
- * @param [reverseOrder = false] Set to true to sort from Z-to-A instead
209
- */
210
- static SortAlphabetically(theArray, propertyName = undefined, reverseOrder = false) {
211
- if (!theArray || !Array.isArray(theArray)) {
212
- return;
213
- }
214
- let switcher = reverseOrder ? -1 : 1;
215
- let stringSort = StringUtils.IsStringWithLength(propertyName);
216
- theArray.sort((itemOne, itemTwo) => {
217
- let valOne = stringSort ? itemOne[propertyName] : itemOne;
218
- let valTwo = stringSort ? itemTwo[propertyName] : itemTwo;
219
- return (valOne > valTwo ? 1 : (valOne < valTwo ? -1 : 0)) * switcher;
220
- });
221
- }
222
- static PushIfNotExist(item, array) {
223
- if (!array) {
224
- return false;
225
- }
226
- if (array.indexOf(item) === -1) {
227
- array.push(item);
228
- return true;
229
- }
230
- return false;
231
- }
232
- /**
233
- * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
234
- * removes the element using splice().
235
- *
236
- * @param index
237
- * @param array
238
- * @returns True if and only if the element on given index is succesfully removed from given array.
239
- */
240
- static RemoveElementAtIndex(index, array) {
241
- if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
242
- return false;
243
- }
244
- if (index in array) {
245
- array.splice(index, 1);
246
- return true;
247
- }
248
- else {
249
- return false;
250
- }
251
- }
252
- // Returns true if and only if given array includes given item. Checked by ===.
253
- static Includes(array, item) {
254
- if (Array.isArray(array)) {
255
- for (let i = 0, len = array.length; i < len; i++) {
256
- if (array[i] === item) {
257
- return true;
258
- }
259
- }
260
- return false;
261
- }
262
- }
263
- }
1
+ import { isNill } from "../function/is-nill.function";
2
+ import { notNill } from "../function/not-nill.function";
3
+ import { StringUtils } from "./string-utils";
4
+ import { NumberUtils } from "./number-utils";
5
+ import { ObjectUtils } from "./object-utils";
6
+ export class ArrayUtils {
7
+ /**
8
+ * Inserts given element into given array, on given index number.
9
+ *
10
+ * @param index The index position for the element to insert, use negatives to count from the arrays end
11
+ * @param element The element to insert
12
+ * @param array The array to insert the element into
13
+ * @returns True if and only if given element is succesfully inserted into given array.
14
+ */
15
+ static InsertElement(index, element, array) {
16
+ if (!Array.isArray(array) || Math.abs(index) > array.length || isNill(index)) {
17
+ // cannot insert something into nothing, and cannot insert an element into a non-array (via this contract that is), and
18
+ // we will not insert anything beyond the arrays limits (but we can append to the start or end)
19
+ return false;
20
+ }
21
+ const lenBefore = array.length;
22
+ array.splice(index, 0, element);
23
+ return (array.length === lenBefore + 1);
24
+ }
25
+ /**
26
+ * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' keyword, but truly removes the
27
+ * element using splice(). Also works on associative arrays.
28
+ *
29
+ * @param element The element to remove.
30
+ * @param array The array to remove the element from.
31
+ * @returns True iff given element was truly successfully removed from given array.
32
+ */
33
+ static RemoveElement(element, array) {
34
+ if (!Array.isArray(array)) {
35
+ return false;
36
+ }
37
+ let index = array.indexOf(element);
38
+ return ArrayUtils.RemoveElementAtIndex(index, array);
39
+ }
40
+ /**
41
+ * Returns a true shallow clone of given array plus all its items. Its first-level members are object-shallow-cloned (optionally with a
42
+ * strongly typed constructor),
43
+ * or just as plain object (see param arrayItemsClass).
44
+ * @param arrayGiven
45
+ * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
46
+ * it'll be a plain object.
47
+ * @returns a true shallow clone of given array plus all its items
48
+ */
49
+ static ShallowCloneArrayAndItsItem(arrayGiven, arrayItemsClass) {
50
+ let arrayClone = [];
51
+ if (arrayGiven) {
52
+ for (let i = 0, len = arrayGiven.length; i < len; i++) {
53
+ arrayClone.push(ObjectUtils.GetShallowClone(arrayGiven[i], arrayItemsClass));
54
+ }
55
+ }
56
+ else {
57
+ return [];
58
+ }
59
+ return arrayClone;
60
+ }
61
+ /**
62
+ * Moves given element to given toIndex in given array. Returns whether the element was really moved, thus changing the given array.
63
+ */
64
+ static MoveElement(element, toIndex, array) {
65
+ if (!Array.isArray(array) || isNill(toIndex)) {
66
+ return false;
67
+ }
68
+ let fromIndex = array.indexOf(element);
69
+ let toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
70
+ if (fromIndex === -1 || array[toIndexCorrected] === element) {
71
+ // element did not exist in given array, or already existed on given toIndex
72
+ return false;
73
+ }
74
+ array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
75
+ return true;
76
+ }
77
+ /**
78
+ * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
79
+ * @param array
80
+ * @param itemValueFunction The function aplied to each array item that gives it a numerical value. The max num val found is returned.
81
+ */
82
+ static GetMaxCalculatedValue(array, itemValueFunction) {
83
+ if (!array || !itemValueFunction) {
84
+ return NaN;
85
+ }
86
+ let max = undefined;
87
+ let len = array.length;
88
+ for (let i = 0; i < len; i++) {
89
+ let valueCur = itemValueFunction.call(this);
90
+ if (valueCur > max) {
91
+ max = valueCur;
92
+ }
93
+ }
94
+ return max;
95
+ }
96
+ // Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
97
+ static IsArrayWithElements(arrayToCheck, clazz) {
98
+ if (isNill(arrayToCheck)) {
99
+ return false;
100
+ }
101
+ if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
102
+ if (clazz) {
103
+ return arrayToCheck[0] instanceof clazz;
104
+ }
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
110
+ static RemoveElementsByFilter(array, filterFunction) {
111
+ if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
112
+ return false;
113
+ }
114
+ let atLeastOneRemoved = false;
115
+ let len = array.length;
116
+ for (let i = len - 1; i >= 0; i--) {
117
+ let item = array[i];
118
+ if (filterFunction.call(this, item) === true) {
119
+ array.splice(i, 1);
120
+ atLeastOneRemoved = true;
121
+ }
122
+ }
123
+ return atLeastOneRemoved;
124
+ }
125
+ // Replaces the elementOut with given elementIn.
126
+ static ReplaceElement(elementIn, elementOut, array) {
127
+ if (!array || !Array.isArray(array)) {
128
+ return;
129
+ }
130
+ const indexOut = array.indexOf(elementOut);
131
+ if (indexOut > -1) {
132
+ ArrayUtils.InsertElement(indexOut, elementIn, array);
133
+ ArrayUtils.RemoveElement(elementOut, array);
134
+ }
135
+ }
136
+ // Swaps the elements in given array with each other. Returns whether a real swap was made. From and To elements have to exist in array.
137
+ static SwapElements(elementOne, elementTwo, array) {
138
+ if (!Array.isArray(array)) {
139
+ return false;
140
+ }
141
+ const elOneIdx = array.indexOf(elementTwo);
142
+ const elTwoIdx = array.indexOf(elementOne);
143
+ if (elOneIdx === -1 || elTwoIdx === -1) {
144
+ return false;
145
+ }
146
+ array[elOneIdx] = array.splice(elTwoIdx, 1, array[elOneIdx])[0];
147
+ return true;
148
+ }
149
+ // Inserts or removes given toggle element into given elements array; inserts if not yet exists, and removes if already exists.
150
+ static ToggleElement(toggle, elements) {
151
+ elements.indexOf(toggle) > -1 ? ArrayUtils.RemoveElement(toggle, elements) : elements.push(toggle);
152
+ }
153
+ // Returns the number of elements from given array for which given whereFunction holds true.
154
+ static CountWhere(array, whereFunction) {
155
+ if (!ArrayUtils.IsArrayWithElements(array) || !whereFunction) {
156
+ return 0;
157
+ }
158
+ let count = 0;
159
+ const len = array.length;
160
+ for (let i = 0; i < len; i++) {
161
+ if (whereFunction.call(this, array[i])) {
162
+ count++;
163
+ }
164
+ }
165
+ return count;
166
+ }
167
+ /**
168
+ * Returns whether at least one element in given array could be found by given finder function.
169
+ *
170
+ * @param array
171
+ * @param finder A finder function that takes an element of the array and returns a boolean that represents
172
+ * the 'found status' for that element; whether it should have been found or not.
173
+ */
174
+ static ContainsAnElementFoundBy(array, finder) {
175
+ if (!array || !finder) {
176
+ return false;
177
+ }
178
+ return notNill(ArrayUtils.Find(array, finder));
179
+ }
180
+ /**
181
+ * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
182
+ * undefined when none was found.
183
+ *
184
+ * Example usage:
185
+ * let foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
186
+ * (return modelItem.getId() === '1')
187
+ * * });
188
+ *
189
+ * @param array The array with items to search in.
190
+ * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
191
+ */
192
+ static Find(array, foundBy) {
193
+ if (!array || !foundBy) {
194
+ return undefined;
195
+ }
196
+ for (let i = 0, len = array.length; i < len; i++) {
197
+ let itemCur = array[i];
198
+ if (foundBy(itemCur)) {
199
+ return itemCur;
200
+ }
201
+ }
202
+ return undefined;
203
+ }
204
+ /**
205
+ * Sorts all items in the given array alphabetically (A-to-Z) according to the values of their given property.
206
+ * @param theArray
207
+ * @param propertyName = undefined] When not defined, assumes an array of STRINGS is given, instead of array of OBJECTS.
208
+ * @param [reverseOrder = false] Set to true to sort from Z-to-A instead
209
+ */
210
+ static SortAlphabetically(theArray, propertyName = undefined, reverseOrder = false) {
211
+ if (!theArray || !Array.isArray(theArray)) {
212
+ return;
213
+ }
214
+ let switcher = reverseOrder ? -1 : 1;
215
+ let stringSort = StringUtils.IsStringWithLength(propertyName);
216
+ theArray.sort((itemOne, itemTwo) => {
217
+ let valOne = stringSort ? itemOne[propertyName] : itemOne;
218
+ let valTwo = stringSort ? itemTwo[propertyName] : itemTwo;
219
+ return (valOne > valTwo ? 1 : (valOne < valTwo ? -1 : 0)) * switcher;
220
+ });
221
+ }
222
+ static PushIfNotExist(item, array) {
223
+ if (!array) {
224
+ return false;
225
+ }
226
+ if (array.indexOf(item) === -1) {
227
+ array.push(item);
228
+ return true;
229
+ }
230
+ return false;
231
+ }
232
+ /**
233
+ * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
234
+ * removes the element using splice().
235
+ *
236
+ * @param index
237
+ * @param array
238
+ * @returns True if and only if the element on given index is succesfully removed from given array.
239
+ */
240
+ static RemoveElementAtIndex(index, array) {
241
+ if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
242
+ return false;
243
+ }
244
+ if (index in array) {
245
+ array.splice(index, 1);
246
+ return true;
247
+ }
248
+ else {
249
+ return false;
250
+ }
251
+ }
252
+ // Returns true if and only if given array includes given item. Checked by ===.
253
+ static Includes(array, item) {
254
+ if (Array.isArray(array)) {
255
+ for (let i = 0, len = array.length; i < len; i++) {
256
+ if (array[i] === item) {
257
+ return true;
258
+ }
259
+ }
260
+ return false;
261
+ }
262
+ }
263
+ }
264
264
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL2NvcmUvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLE9BQU8sVUFBVTtJQUNuQjs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBSSxLQUFhLEVBQUUsT0FBVSxFQUFFLEtBQVU7UUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxRSx1SEFBdUg7WUFDdkgsK0ZBQStGO1lBQy9GLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxTQUFTLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN2QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBSSxPQUFVLEVBQUUsS0FBVTtRQUNqRCxJQUFJLENBQUMsS0FB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QztZQUNqQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBYSxFQUFFLEtBQVk7UUFDMUQsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVksRUFBRSxJQUFTO1FBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5RCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ25CLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNOaWxsfSBmcm9tIFwiLi4vZnVuY3Rpb24vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuLi9mdW5jdGlvbi9ub3QtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tIFwiLi9zdHJpbmctdXRpbHNcIjtcclxuaW1wb3J0IHtOdW1iZXJVdGlsc30gZnJvbSBcIi4vbnVtYmVyLXV0aWxzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL29iamVjdC11dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFycmF5VXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnRzIGdpdmVuIGVsZW1lbnQgaW50byBnaXZlbiBhcnJheSwgb24gZ2l2ZW4gaW5kZXggbnVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggcG9zaXRpb24gZm9yIHRoZSBlbGVtZW50IHRvIGluc2VydCwgdXNlIG5lZ2F0aXZlcyB0byBjb3VudCBmcm9tIHRoZSBhcnJheXMgZW5kXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGludG9cclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgYW5kIG9ubHkgaWYgZ2l2ZW4gZWxlbWVudCBpcyBzdWNjZXNmdWxseSBpbnNlcnRlZCBpbnRvIGdpdmVuIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEluc2VydEVsZW1lbnQ8VD4oaW5kZXg6IG51bWJlciwgZWxlbWVudDogVCwgYXJyYXk6IFRbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgTWF0aC5hYnMoaW5kZXgpID4gYXJyYXkubGVuZ3RoIHx8IGlzTmlsbChpbmRleCkpIHtcclxuICAgICAgICAgICAgLy8gY2Fubm90IGluc2VydCBzb21ldGhpbmcgaW50byBub3RoaW5nLCBhbmQgY2Fubm90IGluc2VydCBhbiBlbGVtZW50IGludG8gYSBub24tYXJyYXkgKHZpYSB0aGlzIGNvbnRyYWN0IHRoYXQgaXMpLCBhbmRcclxuICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgaW5zZXJ0IGFueXRoaW5nIGJleW9uZCB0aGUgYXJyYXlzIGxpbWl0cyAoYnV0IHdlIGNhbiBhcHBlbmQgdG8gdGhlIHN0YXJ0IG9yIGVuZClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbGVuQmVmb3JlOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gKGFycmF5Lmxlbmd0aCA9PT0gbGVuQmVmb3JlICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScga2V5d29yZCwgYnV0IHRydWx5IHJlbW92ZXMgdGhlXHJcbiAgICAgKiBlbGVtZW50IHVzaW5nIHNwbGljZSgpLiBBbHNvIHdvcmtzIG9uIGFzc29jaWF0aXZlIGFycmF5cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byByZW1vdmUuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tLlxyXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZmYgZ2l2ZW4gZWxlbWVudCB3YXMgdHJ1bHkgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50PFQ+KGVsZW1lbnQ6IFQsIGFycmF5OiBUW10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50QXRJbmRleChpbmRleCwgYXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHRydWUgc2hhbGxvdyBjbG9uZSBvZiBnaXZlbiBhcnJheSBwbHVzIGFsbCBpdHMgaXRlbXMuIEl0cyBmaXJzdC1sZXZlbCBtZW1iZXJzIGFyZSBvYmplY3Qtc2hhbGxvdy1jbG9uZWQgKG9wdGlvbmFsbHkgd2l0aCBhXHJcbiAgICAgKiBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXHJcbiAgICAgKiBvciBqdXN0IGFzIHBsYWluIG9iamVjdCAoc2VlIHBhcmFtIGFycmF5SXRlbXNDbGFzcykuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlHaXZlblxyXG4gICAgICogQHBhcmFtIGFycmF5SXRlbXNDbGFzcyBJZiBwcm92aWRlZCwgdGhlIGNsb25lZCBhcnJheSdzIGZpcnN0LWxldmVsIGl0ZW1zIHdpbGwgYmUgc3Ryb25nbHkgdHlwZWQgdG8gLyBjb25zdHJ1Y3RlZCBhcyB0aGlzIGNsYXNzLiBPdGhlcndpc2VcclxuICAgICAqIGl0J2xsIGJlIGEgcGxhaW4gb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMgYSB0cnVlIHNoYWxsb3cgY2xvbmUgb2YgZ2l2ZW4gYXJyYXkgcGx1cyBhbGwgaXRzIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hhbGxvd0Nsb25lQXJyYXlBbmRJdHNJdGVtPFQ+KGFycmF5R2l2ZW46IFRbXSwgYXJyYXlJdGVtc0NsYXNzPzogYW55KTogVFtdIHtcclxuICAgICAgICBsZXQgYXJyYXlDbG9uZTogVFtdID0gW107XHJcblxyXG4gICAgICAgIGlmIChhcnJheUdpdmVuKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXlHaXZlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlDbG9uZS5wdXNoKE9iamVjdFV0aWxzLkdldFNoYWxsb3dDbG9uZShhcnJheUdpdmVuW2ldLCBhcnJheUl0ZW1zQ2xhc3MpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJheUNsb25lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgZ2l2ZW4gZWxlbWVudCB0byBnaXZlbiB0b0luZGV4IGluIGdpdmVuIGFycmF5LiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgd2FzIHJlYWxseSBtb3ZlZCwgdGh1cyBjaGFuZ2luZyB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTW92ZUVsZW1lbnQ8VD4oZWxlbWVudDogVCwgdG9JbmRleDogbnVtYmVyLCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBsZXQgdG9JbmRleENvcnJlY3RlZDogbnVtYmVyID0gTnVtYmVyVXRpbHMuR2V0TmVhcmVzdE51bWJlcldpdGhpbkJvdW5kcyh0b0luZGV4LCAwLCBhcnJheS5sZW5ndGggLSAxKTtcclxuICAgICAgICBpZiAoZnJvbUluZGV4ID09PSAtMSB8fCBhcnJheVt0b0luZGV4Q29ycmVjdGVkXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBlbGVtZW50IGRpZCBub3QgZXhpc3QgaW4gZ2l2ZW4gYXJyYXksIG9yIGFscmVhZHkgZXhpc3RlZCBvbiBnaXZlbiB0b0luZGV4XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXkuc3BsaWNlKHRvSW5kZXhDb3JyZWN0ZWQsIDAsIGFycmF5LnNwbGljZShmcm9tSW5kZXgsIDEpWzBdKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbWF4IHZhbHVlIGZyb20gYWxsIHJlc3VsdGluZyB2YWx1ZXMgZnJvbSBhcHBseWluZyBnaXZlbiBpdGVtVmFsdWVGdW5jdGlvbiB0byBhbGwgaXRlbXMgb2YgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlcclxuICAgICAqIEBwYXJhbSBpdGVtVmFsdWVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gYXBsaWVkIHRvIGVhY2ggYXJyYXkgaXRlbSB0aGF0IGdpdmVzIGl0IGEgbnVtZXJpY2FsIHZhbHVlLiBUaGUgbWF4IG51bSB2YWwgZm91bmQgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0TWF4Q2FsY3VsYXRlZFZhbHVlPFQ+KGFycmF5OiBUW10sIGl0ZW1WYWx1ZUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoIWFycmF5IHx8ICFpdGVtVmFsdWVGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gTmFOO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQ3VyID4gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZUN1cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1heDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja3MgaWYgZ2l2ZW4gYXJyYXkgaXMgZGVmaW5lZCwgYW5kIGlzIGFuIGFycmF5LCBhbmQgaGFzIGxlbmd0aCA+IDAsIGFuZCwgb3B0aW9uYWxseSBjaGVja3MgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBpcyBvZiB0eXBlIGdpdmVuIGNsYXp6LlxyXG4gICAgcHVibGljIHN0YXRpYyBJc0FycmF5V2l0aEVsZW1lbnRzPFQ+KGFycmF5VG9DaGVjazogVFtdLCBjbGF6ej86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChpc05pbGwoYXJyYXlUb0NoZWNrKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheVRvQ2hlY2spICYmIGFycmF5VG9DaGVjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGF6eikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9DaGVja1swXSBpbnN0YW5jZW9mIGNsYXp6O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBnaXZlbiBhcnJheSBmb3Igd2hpY2ggZ2l2ZW4gZmlsdGVyIGZ1bmN0aW9uIGhvbGRzIHRydWUuIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgcmVtb3ZlZCwgZWxzZSBmYWxzZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudHNCeUZpbHRlcihhcnJheTogYW55W10sIGZpbHRlckZ1bmN0aW9uOiAoaXRlbTogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheVV0aWxzLklzQXJyYXlXaXRoRWxlbWVudHMoYXJyYXkpIHx8ICFmaWx0ZXJGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXRMZWFzdE9uZVJlbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtOiBhbnkgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmN0aW9uLmNhbGwodGhpcywgaXRlbSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF0TGVhc3RPbmVSZW1vdmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlcGxhY2VzIHRoZSBlbGVtZW50T3V0IHdpdGggZ2l2ZW4gZWxlbWVudEluLlxyXG4gICAgcHVibGljIHN0YXRpYyBSZXBsYWNlRWxlbWVudDxUPihlbGVtZW50SW46IFQsIGVsZW1lbnRPdXQ6IFQsIGFycmF5OiBUW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWFycmF5IHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleE91dDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50T3V0KTtcclxuICAgICAgICBpZiAoaW5kZXhPdXQgPiAtMSkge1xyXG4gICAgICAgICAgICBBcnJheVV0aWxzLkluc2VydEVsZW1lbnQoaW5kZXhPdXQsIGVsZW1lbnRJbiwgYXJyYXkpO1xyXG4gICAgICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoZWxlbWVudE91dCwgYXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTd2FwcyB0aGUgZWxlbWVudHMgaW4gZ2l2ZW4gYXJyYXkgd2l0aCBlYWNoIG90aGVyLiBSZXR1cm5zIHdoZXRoZXIgYSByZWFsIHN3YXAgd2FzIG1hZGUuIEZyb20gYW5kIFRvIGVsZW1lbnRzIGhhdmUgdG8gZXhpc3QgaW4gYXJyYXkuXHJcbiAgICBwdWJsaWMgc3RhdGljIFN3YXBFbGVtZW50czxUPihlbGVtZW50T25lOiBULCBlbGVtZW50VHdvOiBULCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbE9uZUlkeDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50VHdvKTtcclxuICAgICAgICBjb25zdCBlbFR3b0lkeDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50T25lKTtcclxuICAgICAgICBpZiAoZWxPbmVJZHggPT09IC0xIHx8IGVsVHdvSWR4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcnJheVtlbE9uZUlkeF0gPSBhcnJheS5zcGxpY2UoZWxUd29JZHgsIDEsIGFycmF5W2VsT25lSWR4XSlbMF07XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5zZXJ0cyBvciByZW1vdmVzIGdpdmVuIHRvZ2dsZSBlbGVtZW50IGludG8gZ2l2ZW4gZWxlbWVudHMgYXJyYXk7IGluc2VydHMgaWYgbm90IHlldCBleGlzdHMsIGFuZCByZW1vdmVzIGlmIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgcHVibGljIHN0YXRpYyBUb2dnbGVFbGVtZW50PFQ+KHRvZ2dsZTogVCwgZWxlbWVudHM6IFRbXSk6IHZvaWQge1xyXG4gICAgICAgIGVsZW1lbnRzLmluZGV4T2YodG9nZ2xlKSA+IC0xID8gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50KHRvZ2dsZSwgZWxlbWVudHMpIDogZWxlbWVudHMucHVzaCh0b2dnbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiB3aGVyZUZ1bmN0aW9uIGhvbGRzIHRydWUuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvdW50V2hlcmU8VD4oYXJyYXk6IFRbXSwgd2hlcmVGdW5jdGlvbjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgICAgIGlmICghQXJyYXlVdGlscy5Jc0FycmF5V2l0aEVsZW1lbnRzKGFycmF5KSB8fCAhd2hlcmVGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh3aGVyZUZ1bmN0aW9uLmNhbGwodGhpcywgYXJyYXlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gZ2l2ZW4gYXJyYXkgY291bGQgYmUgZm91bmQgYnkgZ2l2ZW4gZmluZGVyIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheVxyXG4gICAgICogQHBhcmFtIGZpbmRlciBBIGZpbmRlciBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5IGFuZCByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IHJlcHJlc2VudHNcclxuICAgICAqIHRoZSAnZm91bmQgc3RhdHVzJyBmb3IgdGhhdCBlbGVtZW50OyB3aGV0aGVyIGl0IHNob3VsZCBoYXZlIGJlZW4gZm91bmQgb3Igbm90LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnRhaW5zQW5FbGVtZW50Rm91bmRCeTxUPihhcnJheTogVFtdLCBmaW5kZXI6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZmluZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBub3ROaWxsKEFycmF5VXRpbHMuRmluZDxUPihhcnJheSwgZmluZGVyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcm9zcy1icm93c2VyIEFycmF5LmZpbmQoKSBmdW5jdGlvbi4gUmV0dXJucyB0aGUgZmlyc3QgaXRlbSBpbiBnaXZlbiBhcnJheSBmb3Igd2hpY2ggdGhlIGZvdW5kQnkgZnVuY3Rpb24gcmV0dXJucyB0cnVlLiBSZXR1cm5zXHJcbiAgICAgKiB1bmRlZmluZWQgd2hlbiBub25lIHdhcyBmb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxyXG4gICAgICogbGV0IGZvdW5kSXRlbTogQnVzaW5lc3NPYmplY3QgPSBBcnJheVV0aWxzLkZpbmQ8QnVzaW5lc3NPYmplY3Q+KG1vZGVsQXJyYXksIChtb2RlbEl0ZW06IEJ1c2luZXNzT2JqZWN0KSA9PiA8YnI+XHJcbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxyXG4gICAgICogICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXHJcbiAgICAgKiBAcGFyYW0gZm91bmRCeSBUaGUgZmluZGVyIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBpdGVtcyBvZiB0aGUgYXJyYXksIHdoZW4gdGhhdCByZXR1cm5zIHRydWUsIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW1DdXI6IFQgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kQnkoaXRlbUN1cikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQ3VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3J0cyBhbGwgaXRlbXMgaW4gdGhlIGdpdmVuIGFycmF5IGFscGhhYmV0aWNhbGx5IChBLXRvLVopIGFjY29yZGluZyB0byB0aGUgdmFsdWVzIG9mIHRoZWlyIGdpdmVuIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHRoZUFycmF5XHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lID0gdW5kZWZpbmVkXSBXaGVuIG5vdCBkZWZpbmVkLCBhc3N1bWVzIGFuIGFycmF5IG9mIFNUUklOR1MgaXMgZ2l2ZW4sIGluc3RlYWQgb2YgYXJyYXkgb2YgT0JKRUNUUy5cclxuICAgICAqIEBwYXJhbSBbcmV2ZXJzZU9yZGVyID0gZmFsc2VdIFNldCB0byB0cnVlIHRvIHNvcnQgZnJvbSBaLXRvLUEgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNvcnRBbHBoYWJldGljYWxseTxUPih0aGVBcnJheTogVFtdLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyA9IHVuZGVmaW5lZCwgcmV2ZXJzZU9yZGVyOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoZUFycmF5IHx8ICFBcnJheS5pc0FycmF5KHRoZUFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3dpdGNoZXI6IG51bWJlciA9IHJldmVyc2VPcmRlciA/IC0xIDogMTtcclxuICAgICAgICBsZXQgc3RyaW5nU29ydDogYm9vbGVhbiA9IFN0cmluZ1V0aWxzLklzU3RyaW5nV2l0aExlbmd0aChwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIHRoZUFycmF5LnNvcnQoKGl0ZW1PbmU6IFQsIGl0ZW1Ud286IFQpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbE9uZTogYW55ID0gc3RyaW5nU29ydCA/IGl0ZW1PbmVbcHJvcGVydHlOYW1lXSA6IGl0ZW1PbmU7XHJcbiAgICAgICAgICAgIGxldCB2YWxUd286IGFueSA9IHN0cmluZ1NvcnQgPyBpdGVtVHdvW3Byb3BlcnR5TmFtZV0gOiBpdGVtVHdvO1xyXG4gICAgICAgICAgICByZXR1cm4gKHZhbE9uZSA+IHZhbFR3byA/IDEgOiAodmFsT25lIDwgdmFsVHdvID8gLTEgOiAwKSkgKiBzd2l0Y2hlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hJZk5vdEV4aXN0KGl0ZW06IGFueSwgYXJyYXk6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFhcnJheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXJyYXkuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgZWxlbWVudCBhdCBnaXZlbiBpbmRleCBmcm9tIGdpdmVuIGFycmF5LiBEb2Vzbid0IGp1c3Qgc2V0IGl0IHRvIG51bGwgbGlrZSBKYXZhU2NyaXB0cyBzdGFuZGFyZCAnZGVsZXRlJyBkb2VzLCBidXQgcmVhbGx5XHJcbiAgICAgKiByZW1vdmVzIHRoZSBlbGVtZW50IHVzaW5nIHNwbGljZSgpLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleFxyXG4gICAgICogQHBhcmFtIGFycmF5XHJcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBlbGVtZW50IG9uIGdpdmVuIGluZGV4IGlzIHN1Y2Nlc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50QXRJbmRleChpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoTnVtYmVyVXRpbHMuSXNOYU4oaW5kZXgpIHx8IGluZGV4IDwgMCB8fCAhQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCBpbiBhcnJheSkge1xyXG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBnaXZlbiBhcnJheSBpbmNsdWRlcyBnaXZlbiBpdGVtLiBDaGVja2VkIGJ5ID09PS5cclxuICAgIHB1YmxpYyBzdGF0aWMgSW5jbHVkZXMoYXJyYXk6IGFueVtdLCBpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=