@colijnit/sharedcomponents 1.0.61 → 1.0.62

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 (479) hide show
  1. package/README.md +24 -24
  2. package/bundles/colijnit-sharedcomponents.umd.js +9848 -9843
  3. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  4. package/colijnit-sharedcomponents.d.ts +91 -91
  5. package/colijnit-sharedcomponents.metadata.json +1 -1
  6. package/esm2015/colijnit-sharedcomponents.js +91 -91
  7. package/esm2015/lib/assets/dictionary/text.properties.js +11 -11
  8. package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -2
  9. package/esm2015/lib/businessobject/co-document-right.bo.js +3 -3
  10. package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -2
  11. package/esm2015/lib/businessobject/drag-drop-container.js +7 -7
  12. package/esm2015/lib/components/activity-list/activity-list.component.js +130 -130
  13. package/esm2015/lib/components/activity-list/activity-list.module.js +24 -24
  14. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -47
  15. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -20
  16. package/esm2015/lib/components/date-planning/component/agenda/agenda-base-view.component.js +61 -61
  17. package/esm2015/lib/components/date-planning/component/agenda/agenda-day-view.component.js +36 -36
  18. package/esm2015/lib/components/date-planning/component/agenda/agenda-event.component.js +56 -56
  19. package/esm2015/lib/components/date-planning/component/agenda/agenda-events.component.js +47 -47
  20. package/esm2015/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.js +68 -68
  21. package/esm2015/lib/components/date-planning/component/agenda/agenda-header.component.js +243 -243
  22. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-cell.component.js +36 -36
  23. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.js +50 -50
  24. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view.component.js +46 -46
  25. package/esm2015/lib/components/date-planning/component/agenda/agenda-month-view.component.js +61 -61
  26. package/esm2015/lib/components/date-planning/component/agenda/agenda-select-event.component.js +39 -39
  27. package/esm2015/lib/components/date-planning/component/agenda/agenda-view.component.js +35 -35
  28. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-select-view.component.js +64 -64
  29. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-view.component.js +48 -48
  30. package/esm2015/lib/components/date-planning/component/agenda/view-select.component.js +42 -42
  31. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-months.component.js +34 -34
  32. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-years.component.js +48 -48
  33. package/esm2015/lib/components/date-planning/component/calendar/calendar-header.component.js +107 -107
  34. package/esm2015/lib/components/date-planning/component/calendar/calendar-view.component.js +178 -178
  35. package/esm2015/lib/components/date-planning/component/calendar/calendar.component.js +34 -34
  36. package/esm2015/lib/components/date-planning/date-planning.component.js +113 -113
  37. package/esm2015/lib/components/date-planning/date-planning.module.js +63 -63
  38. package/esm2015/lib/components/docsign/component/signature/signature.component.js +75 -75
  39. package/esm2015/lib/components/docsign/component/signatures/signatures.component.js +44 -44
  40. package/esm2015/lib/components/docsign/docsign.component.js +242 -242
  41. package/esm2015/lib/components/docsign/docsign.module.js +23 -23
  42. package/esm2015/lib/components/file-upload/file-upload.component.js +189 -189
  43. package/esm2015/lib/components/file-upload/file-upload.module.js +25 -25
  44. package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -397
  45. package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -30
  46. package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -469
  47. package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -115
  48. package/esm2015/lib/components/files-upload/files-upload.component.js +131 -131
  49. package/esm2015/lib/components/files-upload/files-upload.module.js +47 -47
  50. package/esm2015/lib/components/image-display/image-display.component.js +36 -36
  51. package/esm2015/lib/components/image-display/image-display.module.js +23 -23
  52. package/esm2015/lib/components/key-pad/key-pad.component.js +200 -200
  53. package/esm2015/lib/components/key-pad/key-pad.module.js +22 -22
  54. package/esm2015/lib/components/layout-switcher/layout-switcher.component.js +74 -74
  55. package/esm2015/lib/components/layout-switcher/layout-switcher.module.js +21 -21
  56. package/esm2015/lib/components/linear-gauge/co-linear-gauge.component.js +59 -59
  57. package/esm2015/lib/components/linear-gauge/co-linear-gauge.module.js +19 -19
  58. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -89
  59. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -21
  60. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.js +79 -79
  61. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.js +21 -21
  62. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.js +85 -85
  63. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.js +21 -21
  64. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.js +64 -64
  65. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.js +26 -26
  66. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.js +40 -40
  67. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.js +23 -23
  68. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.js +61 -61
  69. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.js +28 -28
  70. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.component.js +38 -38
  71. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.module.js +21 -21
  72. package/esm2015/lib/components/send-method-dialog/model/email-address-viewmodel.js +7 -7
  73. package/esm2015/lib/components/send-method-dialog/send-method-dialog.component.js +258 -258
  74. package/esm2015/lib/components/send-method-dialog/send-method-dialog.module.js +35 -35
  75. package/esm2015/lib/components/send-method-dialog/send-method-params.interface.js +2 -2
  76. package/esm2015/lib/components/send-method-dialog/service/send-method.service.js +59 -59
  77. package/esm2015/lib/components/simple-tags/simple-tags.component.js +229 -229
  78. package/esm2015/lib/components/simple-tags/simple-tags.module.js +26 -26
  79. package/esm2015/lib/components/statusbar/statusbar-popup.component.js +97 -97
  80. package/esm2015/lib/components/statusbar/statusbar.component.js +81 -81
  81. package/esm2015/lib/components/statusbar/statusbar.module.js +27 -27
  82. package/esm2015/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.js +47 -47
  83. package/esm2015/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.js +47 -47
  84. package/esm2015/lib/components/stock/components/order-stock-history/order-stock-history.component.js +47 -47
  85. package/esm2015/lib/components/stock/components/order-stock-tab/order-stock-tab.component.js +47 -47
  86. package/esm2015/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.js +47 -47
  87. package/esm2015/lib/components/stock/components/order-tab/order-tab.component.js +67 -67
  88. package/esm2015/lib/components/stock/components/stock-history/stock-history.component.js +53 -53
  89. package/esm2015/lib/components/stock/components/stock-location/stock-location.component.js +240 -240
  90. package/esm2015/lib/components/stock/components/stock-prognose/stock-prognose.component.js +52 -52
  91. package/esm2015/lib/components/stock/components/stock-tab/stock-tab.component.js +39 -41
  92. package/esm2015/lib/components/stock/localization/translation.js +63 -63
  93. package/esm2015/lib/components/stock/stock-history-tabs/stock-history-tabs.component.js +33 -33
  94. package/esm2015/lib/components/stock/stock-information/stock-information.component.js +49 -48
  95. package/esm2015/lib/components/stock/stock-information-grid/stock-information-grid.component.js +457 -457
  96. package/esm2015/lib/components/stock/stock-tabs/stock-tabs.component.js +243 -241
  97. package/esm2015/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.js +2 -2
  98. package/esm2015/lib/components/stock/stock-transfer/stock-change-amount.component.js +72 -72
  99. package/esm2015/lib/components/stock/stock-transfer/stock-transfer.component.js +149 -149
  100. package/esm2015/lib/components/stock/stock.component.js +197 -193
  101. package/esm2015/lib/components/stock/stock.module.js +80 -80
  102. package/esm2015/lib/components/stock-statusbar/stock-statusbar.component.js +23 -23
  103. package/esm2015/lib/components/stock-statusbar/stock-statusbar.module.js +19 -19
  104. package/esm2015/lib/components/tab-bar/tab-bar.component.js +90 -88
  105. package/esm2015/lib/components/tab-bar/tab-bar.module.js +21 -21
  106. package/esm2015/lib/components/tab-bar/tab.interface.js +2 -2
  107. package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -80
  108. package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -26
  109. package/esm2015/lib/decorator/input-boolean.decorator.js +34 -34
  110. package/esm2015/lib/enum/calendar-view.enum.js +9 -9
  111. package/esm2015/lib/enum/document-email-report.enum.js +18 -18
  112. package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -13
  113. package/esm2015/lib/enum/file-type.js +14 -14
  114. package/esm2015/lib/enum/files-upload-config-objects.js +3 -3
  115. package/esm2015/lib/enum/gauge-color.enum.js +10 -10
  116. package/esm2015/lib/enum/icon.enum.js +44 -44
  117. package/esm2015/lib/enum/internal-param.enum.js +38 -38
  118. package/esm2015/lib/enum/keyboard-code.enum.js +32 -32
  119. package/esm2015/lib/enum/language-code.enum.js +8 -8
  120. package/esm2015/lib/enum/month.enum.js +17 -17
  121. package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -2
  122. package/esm2015/lib/enum/table-name.enum.js +86 -86
  123. package/esm2015/lib/enum/tag-category.enum.js +22 -22
  124. package/esm2015/lib/enum/tags-component-config-names.js +2 -2
  125. package/esm2015/lib/enum/thumb-three-way-state.js +19 -19
  126. package/esm2015/lib/enum/tile-size-type.js +7 -7
  127. package/esm2015/lib/enum/time-period.enum.js +11 -11
  128. package/esm2015/lib/event/co-drag-event.js +2 -2
  129. package/esm2015/lib/event/co-drop-event.js +2 -2
  130. package/esm2015/lib/interface/key-value-pair.js +2 -2
  131. package/esm2015/lib/interface/operation-callback-simple-function.js +4 -4
  132. package/esm2015/lib/localization/localization.module.js +19 -19
  133. package/esm2015/lib/localization/localize.pipe.js +26 -26
  134. package/esm2015/lib/localization/localize.service.js +30 -30
  135. package/esm2015/lib/localization/translation.js +3 -3
  136. package/esm2015/lib/model/agenda-event-per-day.model.js +6 -6
  137. package/esm2015/lib/model/agenda-event.model.js +8 -8
  138. package/esm2015/lib/model/agenda-null-objects.js +11 -11
  139. package/esm2015/lib/model/constant/all-months.js +17 -17
  140. package/esm2015/lib/model/date-range.js +5 -5
  141. package/esm2015/lib/model/day.model.js +7 -7
  142. package/esm2015/lib/model/icon-svg.js +43 -43
  143. package/esm2015/lib/model/month.model.js +11 -11
  144. package/esm2015/lib/model/send-method.js +8 -8
  145. package/esm2015/lib/model/settings.js +4 -4
  146. package/esm2015/lib/model/tag-tree-item.bo.js +16 -16
  147. package/esm2015/lib/model/time-window.bo.js +26 -26
  148. package/esm2015/lib/model/tree-object.js +15 -15
  149. package/esm2015/lib/model/week.model.js +6 -6
  150. package/esm2015/lib/model/weekday.model.js +10 -10
  151. package/esm2015/lib/pipe/array-number.pipe.js +15 -15
  152. package/esm2015/lib/pipe/file-type-image.pipe.js +51 -51
  153. package/esm2015/lib/pipe/master-pipes.js +9 -9
  154. package/esm2015/lib/pipe/ucfirst.pipe.js +16 -16
  155. package/esm2015/lib/service/dictionary.service.js +76 -76
  156. package/esm2015/lib/service/drag-drop.service.js +365 -365
  157. package/esm2015/lib/service/icon-cache.service.js +51 -51
  158. package/esm2015/lib/service/options.service.js +48 -48
  159. package/esm2015/lib/service/shared-connector.service.js +433 -433
  160. package/esm2015/lib/service/shared.service.js +60 -60
  161. package/esm2015/lib/service/stock.service.js +110 -110
  162. package/esm2015/lib/utils/array-utils.js +202 -202
  163. package/esm2015/lib/utils/calendar.utils.js +68 -68
  164. package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -2
  165. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -2
  166. package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -50
  167. package/esm2015/lib/utils/date-utils.js +264 -264
  168. package/esm2015/lib/utils/enum-utils.js +128 -128
  169. package/esm2015/lib/utils/function/not-nill.function.js +5 -5
  170. package/esm2015/lib/utils/is-nill.function.js +5 -5
  171. package/esm2015/lib/utils/map-utils.js +41 -41
  172. package/esm2015/lib/utils/number-utils.js +390 -390
  173. package/esm2015/lib/utils/object-utils.js +278 -278
  174. package/esm2015/lib/utils/ref-code-utils.js +49 -49
  175. package/esm2015/lib/utils/string-utils.js +93 -93
  176. package/esm2015/public-api.js +31 -31
  177. package/fesm2015/colijnit-sharedcomponents.js +10332 -10326
  178. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  179. package/lib/assets/dictionary/text.properties.d.ts +3 -3
  180. package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -5
  181. package/lib/businessobject/co-document-right.bo.d.ts +6 -6
  182. package/lib/businessobject/drag-drop-container-element.d.ts +6 -6
  183. package/lib/businessobject/drag-drop-container.d.ts +6 -6
  184. package/lib/components/access/read-write-access.scss +25 -25
  185. package/lib/components/access/style/_layout.scss +23 -23
  186. package/lib/components/access/style/_material-definition.scss +12 -12
  187. package/lib/components/access/style/_theme.scss +4 -4
  188. package/lib/components/access/style/material.scss +4 -4
  189. package/lib/components/activity-list/activity-list.component.d.ts +33 -33
  190. package/lib/components/activity-list/activity-list.module.d.ts +2 -2
  191. package/lib/components/activity-list/style/_layout.scss +68 -68
  192. package/lib/components/activity-list/style/_theme.scss +4 -4
  193. package/lib/components/activity-list/style/material.scss +4 -4
  194. package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -14
  195. package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -2
  196. package/lib/components/app-file-dropzone/style/_layout.scss +61 -61
  197. package/lib/components/app-file-dropzone/style/_theme.scss +4 -4
  198. package/lib/components/app-file-dropzone/style/material.scss +4 -4
  199. package/lib/components/date-planning/component/agenda/agenda-base-view.component.d.ts +21 -21
  200. package/lib/components/date-planning/component/agenda/agenda-day-view.component.d.ts +7 -7
  201. package/lib/components/date-planning/component/agenda/agenda-event.component.d.ts +18 -18
  202. package/lib/components/date-planning/component/agenda/agenda-events.component.d.ts +13 -13
  203. package/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.d.ts +18 -18
  204. package/lib/components/date-planning/component/agenda/agenda-header.component.d.ts +48 -48
  205. package/lib/components/date-planning/component/agenda/agenda-hour-cell.component.d.ts +9 -9
  206. package/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.d.ts +8 -8
  207. package/lib/components/date-planning/component/agenda/agenda-hour-view.component.d.ts +7 -7
  208. package/lib/components/date-planning/component/agenda/agenda-month-view.component.d.ts +10 -10
  209. package/lib/components/date-planning/component/agenda/agenda-select-event.component.d.ts +12 -12
  210. package/lib/components/date-planning/component/agenda/agenda-view.component.d.ts +12 -12
  211. package/lib/components/date-planning/component/agenda/agenda-week-select-view.component.d.ts +10 -10
  212. package/lib/components/date-planning/component/agenda/agenda-week-view.component.d.ts +9 -9
  213. package/lib/components/date-planning/component/agenda/style/_layout.scss +443 -443
  214. package/lib/components/date-planning/component/agenda/style/_material-definition.scss +12 -12
  215. package/lib/components/date-planning/component/agenda/style/_theme.scss +7 -7
  216. package/lib/components/date-planning/component/agenda/style/material.scss +5 -5
  217. package/lib/components/date-planning/component/agenda/view-select.component.d.ts +11 -11
  218. package/lib/components/date-planning/component/calendar/calendar-all-months.component.d.ts +9 -9
  219. package/lib/components/date-planning/component/calendar/calendar-all-years.component.d.ts +9 -9
  220. package/lib/components/date-planning/component/calendar/calendar-header.component.d.ts +23 -23
  221. package/lib/components/date-planning/component/calendar/calendar-view.component.d.ts +31 -31
  222. package/lib/components/date-planning/component/calendar/calendar.component.d.ts +10 -10
  223. package/lib/components/date-planning/component/calendar/style/_layout.scss +167 -167
  224. package/lib/components/date-planning/component/calendar/style/_material-definition.scss +7 -7
  225. package/lib/components/date-planning/component/calendar/style/_theme.scss +7 -7
  226. package/lib/components/date-planning/component/calendar/style/material.scss +5 -5
  227. package/lib/components/date-planning/date-planning.component.d.ts +28 -28
  228. package/lib/components/date-planning/date-planning.module.d.ts +2 -2
  229. package/lib/components/date-planning/style/_layout.scss +45 -45
  230. package/lib/components/date-planning/style/_theme.scss +5 -5
  231. package/lib/components/date-planning/style/material.scss +7 -7
  232. package/lib/components/docsign/component/signature/signature.component.d.ts +16 -16
  233. package/lib/components/docsign/component/signature/style/_layout.scss +40 -40
  234. package/lib/components/docsign/component/signature/style/_material-definition.scss +11 -11
  235. package/lib/components/docsign/component/signature/style/_theme.scss +13 -13
  236. package/lib/components/docsign/component/signature/style/material.scss +4 -4
  237. package/lib/components/docsign/component/signatures/signatures.component.d.ts +12 -12
  238. package/lib/components/docsign/component/signatures/style/_layout.scss +13 -13
  239. package/lib/components/docsign/component/signatures/style/_material-definition.scss +1 -1
  240. package/lib/components/docsign/component/signatures/style/_theme.scss +4 -4
  241. package/lib/components/docsign/component/signatures/style/material.scss +5 -5
  242. package/lib/components/docsign/docsign.component.d.ts +94 -94
  243. package/lib/components/docsign/docsign.module.d.ts +2 -2
  244. package/lib/components/docsign/style/_layout.scss +40 -40
  245. package/lib/components/docsign/style/_material-definition.scss +12 -12
  246. package/lib/components/docsign/style/_theme.scss +12 -12
  247. package/lib/components/docsign/style/material.scss +15 -15
  248. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  249. package/lib/components/file-upload/file-upload.module.d.ts +2 -2
  250. package/lib/components/file-upload/style/_layout.scss +59 -59
  251. package/lib/components/file-upload/style/_material-definition.scss +2 -2
  252. package/lib/components/file-upload/style/_theme.scss +4 -4
  253. package/lib/components/file-upload/style/material.scss +4 -4
  254. package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -75
  255. package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -2
  256. package/lib/components/file-upload-popup/style/_layout.scss +48 -48
  257. package/lib/components/file-upload-popup/style/_material-definition.scss +2 -2
  258. package/lib/components/file-upload-popup/style/_theme.scss +5 -5
  259. package/lib/components/file-upload-popup/style/material.scss +4 -4
  260. package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -98
  261. package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -34
  262. package/lib/components/files-upload/files-upload.component.d.ts +32 -32
  263. package/lib/components/files-upload/files-upload.module.d.ts +2 -2
  264. package/lib/components/files-upload/style/_layout.scss +49 -49
  265. package/lib/components/files-upload/style/_theme.scss +5 -5
  266. package/lib/components/files-upload/style/material.scss +4 -4
  267. package/lib/components/image-display/image-display.component.d.ts +14 -14
  268. package/lib/components/image-display/image-display.module.d.ts +2 -2
  269. package/lib/components/image-display/style/_layout.scss +56 -56
  270. package/lib/components/image-display/style/_material-definition.scss +4 -4
  271. package/lib/components/image-display/style/_theme.scss +6 -6
  272. package/lib/components/image-display/style/material.scss +3 -3
  273. package/lib/components/key-pad/key-pad.component.d.ts +38 -38
  274. package/lib/components/key-pad/key-pad.module.d.ts +2 -2
  275. package/lib/components/key-pad/style/_layout.scss +160 -160
  276. package/lib/components/key-pad/style/_material-definition.scss +19 -19
  277. package/lib/components/key-pad/style/_theme.scss +35 -35
  278. package/lib/components/key-pad/style/material.scss +4 -4
  279. package/lib/components/layout-switcher/layout-switcher.component.d.ts +16 -16
  280. package/lib/components/layout-switcher/layout-switcher.module.d.ts +2 -2
  281. package/lib/components/layout-switcher/style/_layout.scss +94 -94
  282. package/lib/components/layout-switcher/style/_material-definition.scss +16 -16
  283. package/lib/components/layout-switcher/style/_theme.scss +4 -4
  284. package/lib/components/layout-switcher/style/material.scss +6 -6
  285. package/lib/components/linear-gauge/co-linear-gauge.component.d.ts +11 -11
  286. package/lib/components/linear-gauge/co-linear-gauge.module.d.ts +2 -2
  287. package/lib/components/linear-gauge/style/_layout.scss +20 -20
  288. package/lib/components/linear-gauge/style/_material-definition.scss +8 -8
  289. package/lib/components/linear-gauge/style/_theme.scss +4 -4
  290. package/lib/components/linear-gauge/style/material.scss +6 -6
  291. package/lib/components/login/style/_layout.scss +57 -57
  292. package/lib/components/login/style/_material-definition.scss +23 -23
  293. package/lib/components/login/style/_theme.scss +7 -7
  294. package/lib/components/login/style/material.scss +4 -4
  295. package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -27
  296. package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -2
  297. package/lib/components/multi-property-toggler/style/_layout.scss +24 -24
  298. package/lib/components/multi-property-toggler/style/_theme.scss +4 -4
  299. package/lib/components/multi-property-toggler/style/material.scss +4 -4
  300. package/lib/components/screen-config-generator/style/_layout.scss +95 -95
  301. package/lib/components/screen-config-generator/style/_theme.scss +4 -4
  302. package/lib/components/screen-config-generator/style/material.scss +4 -4
  303. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.d.ts +19 -19
  304. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.d.ts +2 -2
  305. package/lib/components/send-method-dialog/components/layout-selection/style/_layout.scss +44 -44
  306. package/lib/components/send-method-dialog/components/layout-selection/style/_material-definition.scss +19 -19
  307. package/lib/components/send-method-dialog/components/layout-selection/style/_theme.scss +17 -17
  308. package/lib/components/send-method-dialog/components/layout-selection/style/material.scss +4 -4
  309. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.d.ts +19 -19
  310. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.d.ts +2 -2
  311. package/lib/components/send-method-dialog/components/printer-selection/style/_layout.scss +69 -69
  312. package/lib/components/send-method-dialog/components/printer-selection/style/_material-definition.scss +37 -37
  313. package/lib/components/send-method-dialog/components/printer-selection/style/_theme.scss +23 -23
  314. package/lib/components/send-method-dialog/components/printer-selection/style/material.scss +4 -4
  315. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.d.ts +14 -14
  316. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.d.ts +2 -2
  317. package/lib/components/send-method-dialog/components/send-method-email/style/_layout.scss +29 -29
  318. package/lib/components/send-method-dialog/components/send-method-email/style/_material-definition.scss +8 -8
  319. package/lib/components/send-method-dialog/components/send-method-email/style/_theme.scss +5 -5
  320. package/lib/components/send-method-dialog/components/send-method-email/style/material.scss +4 -4
  321. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.d.ts +8 -8
  322. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.d.ts +2 -2
  323. package/lib/components/send-method-dialog/components/send-method-pdf/style/_layout.scss +25 -25
  324. package/lib/components/send-method-dialog/components/send-method-pdf/style/_material-definition.scss +5 -5
  325. package/lib/components/send-method-dialog/components/send-method-pdf/style/_theme.scss +5 -5
  326. package/lib/components/send-method-dialog/components/send-method-pdf/style/material.scss +4 -4
  327. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.d.ts +13 -13
  328. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.d.ts +2 -2
  329. package/lib/components/send-method-dialog/components/send-method-printer/style/_layout.scss +30 -30
  330. package/lib/components/send-method-dialog/components/send-method-printer/style/_material-definition.scss +5 -5
  331. package/lib/components/send-method-dialog/components/send-method-printer/style/_theme.scss +5 -5
  332. package/lib/components/send-method-dialog/components/send-method-printer/style/material.scss +4 -4
  333. package/lib/components/send-method-dialog/components/signature-button/signature-button.component.d.ts +12 -12
  334. package/lib/components/send-method-dialog/components/signature-button/signature-button.module.d.ts +2 -2
  335. package/lib/components/send-method-dialog/components/signature-button/style/_layout.scss +28 -28
  336. package/lib/components/send-method-dialog/components/signature-button/style/_material-definition.scss +8 -8
  337. package/lib/components/send-method-dialog/components/signature-button/style/_theme.scss +4 -4
  338. package/lib/components/send-method-dialog/components/signature-button/style/material.scss +4 -4
  339. package/lib/components/send-method-dialog/model/email-address-viewmodel.d.ts +5 -5
  340. package/lib/components/send-method-dialog/send-method-dialog.component.d.ts +71 -71
  341. package/lib/components/send-method-dialog/send-method-dialog.module.d.ts +2 -2
  342. package/lib/components/send-method-dialog/send-method-params.interface.d.ts +13 -13
  343. package/lib/components/send-method-dialog/service/send-method.service.d.ts +23 -23
  344. package/lib/components/send-method-dialog/style/_layout.scss +165 -165
  345. package/lib/components/send-method-dialog/style/_material-definition.scss +48 -48
  346. package/lib/components/send-method-dialog/style/_theme.scss +33 -33
  347. package/lib/components/send-method-dialog/style/material.scss +10 -10
  348. package/lib/components/simple-tags/simple-tags.component.d.ts +31 -31
  349. package/lib/components/simple-tags/simple-tags.module.d.ts +2 -2
  350. package/lib/components/simple-tags/style/_layout.scss +272 -272
  351. package/lib/components/simple-tags/style/_material-definition.scss +39 -39
  352. package/lib/components/simple-tags/style/_theme.scss +4 -4
  353. package/lib/components/simple-tags/style/material.scss +4 -4
  354. package/lib/components/statusbar/statusbar-popup.component.d.ts +21 -21
  355. package/lib/components/statusbar/statusbar.component.d.ts +26 -26
  356. package/lib/components/statusbar/statusbar.module.d.ts +2 -2
  357. package/lib/components/statusbar/style/_layout.scss +70 -70
  358. package/lib/components/statusbar/style/_material-definition.scss +23 -23
  359. package/lib/components/statusbar/style/_theme.scss +13 -13
  360. package/lib/components/statusbar/style/material.scss +5 -5
  361. package/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.d.ts +9 -9
  362. package/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.d.ts +9 -9
  363. package/lib/components/stock/components/order-stock-history/order-stock-history.component.d.ts +9 -9
  364. package/lib/components/stock/components/order-stock-tab/order-stock-tab.component.d.ts +11 -11
  365. package/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.d.ts +9 -9
  366. package/lib/components/stock/components/order-tab/order-tab.component.d.ts +20 -20
  367. package/lib/components/stock/components/stock-history/stock-history.component.d.ts +13 -13
  368. package/lib/components/stock/components/stock-location/stock-location.component.d.ts +50 -50
  369. package/lib/components/stock/components/stock-prognose/stock-prognose.component.d.ts +11 -11
  370. package/lib/components/stock/components/stock-tab/stock-tab.component.d.ts +7 -9
  371. package/lib/components/stock/localization/translation.d.ts +60 -60
  372. package/lib/components/stock/stock-history-tabs/stock-history-tabs.component.d.ts +7 -7
  373. package/lib/components/stock/stock-information/stock-information.component.d.ts +9 -8
  374. package/lib/components/stock/stock-information-grid/stock-information-grid.component.d.ts +75 -75
  375. package/lib/components/stock/stock-tabs/stock-tabs.component.d.ts +56 -56
  376. package/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.d.ts +4 -4
  377. package/lib/components/stock/stock-transfer/stock-change-amount.component.d.ts +18 -18
  378. package/lib/components/stock/stock-transfer/stock-transfer.component.d.ts +42 -42
  379. package/lib/components/stock/stock.component.d.ts +58 -57
  380. package/lib/components/stock/stock.module.d.ts +2 -2
  381. package/lib/components/stock/style/_layout.scss +286 -286
  382. package/lib/components/stock/style/_material-definition.scss +25 -25
  383. package/lib/components/stock/style/_theme.scss +5 -5
  384. package/lib/components/stock/style/material.scss +4 -4
  385. package/lib/components/stock-statusbar/stock-statusbar.component.d.ts +4 -4
  386. package/lib/components/stock-statusbar/stock-statusbar.module.d.ts +2 -2
  387. package/lib/components/stock-statusbar/style/_layout.scss +24 -24
  388. package/lib/components/stock-statusbar/style/material.scss +4 -4
  389. package/lib/components/tab-bar/style/_layout.scss +78 -78
  390. package/lib/components/tab-bar/style/_material-definition.scss +6 -6
  391. package/lib/components/tab-bar/style/material.scss +4 -4
  392. package/lib/components/tab-bar/tab-bar.component.d.ts +21 -21
  393. package/lib/components/tab-bar/tab-bar.module.d.ts +2 -2
  394. package/lib/components/tab-bar/tab.interface.d.ts +5 -5
  395. package/lib/components/tags/component/style/_layout.scss +67 -67
  396. package/lib/components/tags/component/style/_material-definition.scss +1 -1
  397. package/lib/components/tags/component/style/_theme.scss +8 -8
  398. package/lib/components/tags/component/style/material.scss +3 -3
  399. package/lib/components/tags/component/tag-join-label/style/_layout.scss +97 -97
  400. package/lib/components/tags/component/tag-join-label/style/_material-definition.scss +4 -4
  401. package/lib/components/tags/component/tag-join-label/style/_theme.scss +8 -8
  402. package/lib/components/tags/component/tag-join-label/style/material.scss +3 -3
  403. package/lib/components/tile-renderer/style/_layout.scss +90 -90
  404. package/lib/components/tile-renderer/style/_theme.scss +4 -4
  405. package/lib/components/tile-renderer/style/material.scss +4 -4
  406. package/lib/components/tile-renderer/tile-render.component.d.ts +31 -31
  407. package/lib/components/tile-renderer/tile-render.module.d.ts +2 -2
  408. package/lib/decorator/input-boolean.decorator.d.ts +8 -8
  409. package/lib/enum/calendar-view.enum.d.ts +7 -7
  410. package/lib/enum/document-email-report.enum.d.ts +15 -15
  411. package/lib/enum/domain-multiple-name.enum.d.ts +10 -10
  412. package/lib/enum/file-type.d.ts +7 -7
  413. package/lib/enum/files-upload-config-objects.d.ts +22 -22
  414. package/lib/enum/gauge-color.enum.d.ts +8 -8
  415. package/lib/enum/icon.enum.d.ts +42 -42
  416. package/lib/enum/internal-param.enum.d.ts +34 -34
  417. package/lib/enum/keyboard-code.enum.d.ts +30 -30
  418. package/lib/enum/language-code.enum.d.ts +6 -6
  419. package/lib/enum/month.enum.d.ts +14 -14
  420. package/lib/enum/read-write-access-config-names.enum.d.ts +4 -4
  421. package/lib/enum/table-name.enum.d.ts +84 -84
  422. package/lib/enum/tag-category.enum.d.ts +19 -19
  423. package/lib/enum/tags-component-config-names.d.ts +4 -4
  424. package/lib/enum/thumb-three-way-state.d.ts +6 -6
  425. package/lib/enum/tile-size-type.d.ts +4 -4
  426. package/lib/enum/time-period.enum.d.ts +8 -8
  427. package/lib/event/co-drag-event.d.ts +5 -5
  428. package/lib/event/co-drop-event.d.ts +8 -8
  429. package/lib/interface/key-value-pair.d.ts +4 -4
  430. package/lib/interface/operation-callback-simple-function.d.ts +4 -4
  431. package/lib/localization/localization.module.d.ts +2 -2
  432. package/lib/localization/localize.pipe.d.ts +7 -7
  433. package/lib/localization/localize.service.d.ts +7 -7
  434. package/lib/localization/translation.d.ts +2 -2
  435. package/lib/model/agenda-event-per-day.model.d.ts +5 -5
  436. package/lib/model/agenda-event.model.d.ts +17 -17
  437. package/lib/model/agenda-null-objects.d.ts +10 -10
  438. package/lib/model/constant/all-months.d.ts +2 -2
  439. package/lib/model/date-range.d.ts +7 -7
  440. package/lib/model/day.model.d.ts +8 -8
  441. package/lib/model/icon-svg.d.ts +4 -4
  442. package/lib/model/month.model.d.ts +5 -5
  443. package/lib/model/send-method.d.ts +7 -7
  444. package/lib/model/settings.d.ts +3 -3
  445. package/lib/model/tag-tree-item.bo.d.ts +18 -18
  446. package/lib/model/time-window.bo.d.ts +13 -13
  447. package/lib/model/tree-object.d.ts +8 -8
  448. package/lib/model/week.model.d.ts +4 -4
  449. package/lib/model/weekday.model.d.ts +16 -16
  450. package/lib/pipe/array-number.pipe.d.ts +4 -4
  451. package/lib/pipe/file-type-image.pipe.d.ts +12 -12
  452. package/lib/pipe/master-pipes.d.ts +1 -1
  453. package/lib/pipe/ucfirst.pipe.d.ts +4 -4
  454. package/lib/service/dictionary.service.d.ts +21 -21
  455. package/lib/service/drag-drop.service.d.ts +86 -86
  456. package/lib/service/icon-cache.service.d.ts +18 -18
  457. package/lib/service/options.service.d.ts +13 -13
  458. package/lib/service/shared-connector.service.d.ts +55 -55
  459. package/lib/service/shared.service.d.ts +18 -18
  460. package/lib/service/stock.service.d.ts +41 -41
  461. package/lib/style/_mixin.scss +14 -14
  462. package/lib/style/_variables.scss +21 -21
  463. package/lib/style/sharedcomponents-globals.scss +10 -10
  464. package/lib/utils/array-utils.d.ts +63 -63
  465. package/lib/utils/calendar.utils.d.ts +10 -10
  466. package/lib/utils/check-precision-and-scale-result.d.ts +4 -4
  467. package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -8
  468. package/lib/utils/co-document-shared-field-logic.d.ts +7 -7
  469. package/lib/utils/date-utils.d.ts +44 -44
  470. package/lib/utils/enum-utils.d.ts +31 -31
  471. package/lib/utils/function/not-nill.function.d.ts +1 -1
  472. package/lib/utils/is-nill.function.d.ts +1 -1
  473. package/lib/utils/map-utils.d.ts +16 -16
  474. package/lib/utils/number-utils.d.ts +125 -125
  475. package/lib/utils/object-utils.d.ts +40 -40
  476. package/lib/utils/ref-code-utils.d.ts +10 -10
  477. package/lib/utils/string-utils.d.ts +38 -38
  478. package/package.json +1 -1
  479. package/public-api.d.ts +27 -27
@@ -1,202 +1,202 @@
1
- import { ObjectUtils } from "./object-utils";
2
- import { NumberUtils } from "./number-utils";
3
- import { isNill } from "./is-nill.function";
4
- import { notNill } from "./function/not-nill.function";
5
- export class ArrayUtils {
6
- /**
7
- * Returns whether at least one element in given array could be found by given finder function.
8
- *
9
- * @param {T[]} array
10
- * @param {(element: T) => boolean} finder A finder function that takes an element of the array and returns a boolean that represents
11
- * the 'found status' for that element; whether it should have been found or not.
12
- */
13
- static ContainsAnElementFoundBy(array, finder) {
14
- if (!array || !finder) {
15
- return false;
16
- }
17
- return notNill(this.Find(array, finder));
18
- }
19
- /**
20
- * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
21
- * undefined when none was found.
22
- *
23
- * Example usage:
24
- * const foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
25
- * (return modelItem.getId() === '1')
26
- * * });
27
- *
28
- * @param array The array with items to search in.
29
- * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
30
- */
31
- static Find(array, foundBy) {
32
- if (!array || !foundBy) {
33
- return undefined;
34
- }
35
- for (let i = 0, len = array.length; i < len; i++) {
36
- const itemCur = array[i];
37
- if (foundBy(itemCur)) {
38
- return itemCur;
39
- }
40
- }
41
- return undefined;
42
- }
43
- // @returns empty array when nothing found, otherwise array with found items
44
- static FindAll(array, foundBy) {
45
- const answer = [];
46
- if (!array || !foundBy) {
47
- return answer;
48
- }
49
- for (let i = 0, len = array.length; i < len; i++) {
50
- const itemCur = array[i];
51
- if (foundBy(itemCur)) {
52
- answer.push(itemCur);
53
- }
54
- }
55
- return answer;
56
- }
57
- // returns a simple clone of given array, using array.slice(0)
58
- static CloneArray(array) {
59
- let answer = [];
60
- if (array) {
61
- answer = array.slice(0);
62
- }
63
- return answer;
64
- }
65
- /**
66
- * Returns a 'semi deep clone' of given array. Its first-level members are object-shallow-cloned (optionally with a strongly typed constructor),
67
- * or just as plain object (see param arrayItemsClass).
68
- * @param array
69
- * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
70
- * it'll be a plain object.
71
- * @param deepClone Set to true if array items contain FUNCTIONS that need to be cloned..
72
- * @returns {Array} semi-deep clone of given array
73
- */
74
- static CloneArrayAndItsItems(array, arrayItemsClass, deepClone = false) {
75
- const cloneArray = [];
76
- if (array) {
77
- for (let i = 0, len = array.length; i < len; i++) {
78
- if (deepClone) {
79
- cloneArray.push(ObjectUtils.GetDeepClone(array[i]));
80
- }
81
- else {
82
- cloneArray.push(ObjectUtils.GetShallowClone(array[i], arrayItemsClass));
83
- }
84
- }
85
- }
86
- else {
87
- return [];
88
- }
89
- return cloneArray;
90
- }
91
- /**
92
- * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
93
- * removes the element using splice().
94
- *
95
- * @param {number} index
96
- * @param {any[]} array in-out
97
- * @returns {boolean} True if and only if the element on given index is succesfully removed from given array.
98
- */
99
- static RemoveElementAtIndex(index, array) {
100
- if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
101
- return false;
102
- }
103
- if (index in array) {
104
- array.splice(index, 1);
105
- return true;
106
- }
107
- else {
108
- return false;
109
- }
110
- }
111
- /**
112
- * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really removes the
113
- * element using splice(). Also works on associative arrays.
114
- *
115
- * @param {T} element The element to remove.
116
- * @param {T[]} array The array to remove the element from.
117
- * @returns {boolean} True iff given element was truly successfully removed from given array.
118
- */
119
- static RemoveElement(element, array) {
120
- if (!Array.isArray(array)) {
121
- return false;
122
- }
123
- const index = array.indexOf(element);
124
- return ArrayUtils.RemoveElementAtIndex(index, array);
125
- }
126
- // 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.
127
- static IsArrayWithElements(arrayToCheck, classItemsMustBeInstanceOf) {
128
- if (isNill(arrayToCheck)) {
129
- return false;
130
- }
131
- if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
132
- if (classItemsMustBeInstanceOf) {
133
- return arrayToCheck[0] instanceof classItemsMustBeInstanceOf;
134
- }
135
- else {
136
- return true;
137
- }
138
- }
139
- else {
140
- return false;
141
- }
142
- }
143
- // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
144
- static RemoveElementsByFilter(array, filterFunction) {
145
- if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
146
- return false;
147
- }
148
- let atLeastOneRemoved = false;
149
- const len = array.length;
150
- for (let i = len - 1; i >= 0; i--) {
151
- const item = array[i];
152
- if (filterFunction.call(this, item) === true) {
153
- array.splice(i, 1);
154
- atLeastOneRemoved = true;
155
- }
156
- }
157
- return atLeastOneRemoved;
158
- }
159
- static MoveElement(element, toIndex, array) {
160
- if (!Array.isArray(array) || isNill(toIndex)) {
161
- return false;
162
- }
163
- const fromIndex = array.indexOf(element);
164
- const toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
165
- if (fromIndex === -1 || array[toIndexCorrected] === element) {
166
- // element did not exist in given array, or already existed on given toIndex
167
- return false;
168
- }
169
- array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
170
- return true;
171
- }
172
- // PRE: elements exists in given array. POST: given elementToPlace has a lower index than given afterThisElement. Array is in-out manipulated.
173
- static PlaceElementAfterOther(array, elementToPlace, afterThisElement) {
174
- if (array) {
175
- const afterThisElIdx = array.indexOf(afterThisElement);
176
- const elToPlaceIdx = array.indexOf(elementToPlace);
177
- if (afterThisElIdx >= elToPlaceIdx) {
178
- ArrayUtils.MoveElement(elementToPlace, afterThisElIdx + 1, array);
179
- }
180
- }
181
- }
182
- /**
183
- * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
184
- * @param array
185
- * @param itemValueFunction The function applied to each array item that gives it a numerical value. The max num val found is returned.
186
- */
187
- static GetMaxCalculatedValue(array, itemValueFunction) {
188
- if (!array || !itemValueFunction) {
189
- return NaN;
190
- }
191
- let max = undefined;
192
- const len = array.length;
193
- for (let i = 0; i < len; i++) {
194
- const valueCur = itemValueFunction.call(this);
195
- if (valueCur > max) {
196
- max = valueCur;
197
- }
198
- }
199
- return max;
200
- }
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE1BQU0sT0FBTyxVQUFVO0lBQ25COzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBSSxLQUFVLEVBQUUsTUFBK0I7UUFDakYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBSSxLQUFVLEVBQUUsT0FBNkI7UUFDM0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFHO2dCQUNuQixPQUFPLE9BQU8sQ0FBQzthQUNsQjtTQUNKO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELDRFQUE0RTtJQUNyRSxNQUFNLENBQUMsT0FBTyxDQUFJLEtBQVUsRUFBRSxPQUE2QjtRQUM5RCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hCO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsOERBQThEO0lBQ3ZELE1BQU0sQ0FBQyxVQUFVLENBQUksS0FBVTtRQUNsQyxJQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFFckIsSUFBSSxLQUFLLEVBQUU7WUFDUCxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBSSxLQUFVLEVBQUUsZUFBcUIsRUFBRSxZQUFxQixLQUFLO1FBQ2hHLE1BQU0sVUFBVSxHQUFRLEVBQUUsQ0FBQztRQUUzQixJQUFJLEtBQUssRUFBRTtZQUNQLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlELElBQUksU0FBUyxFQUFFO29CQUNYLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RDtxQkFBTTtvQkFDSCxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7aUJBQzNFO2FBQ0o7U0FDSjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxLQUFZO1FBQzFELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0RixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBSSxPQUFVLEVBQUUsS0FBVTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE1BQU0sS0FBSyxHQUFXLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTyxVQUFVLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCwrSUFBK0k7SUFDeEksTUFBTSxDQUFDLG1CQUFtQixDQUFJLFlBQWlCLEVBQUUsMEJBQWdDO1FBQ3BGLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hELElBQUksMEJBQTBCLEVBQUU7Z0JBQzVCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLDBCQUEwQixDQUFDO2FBQ2hFO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQsc0lBQXNJO0lBQy9ILE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFZLEVBQUUsY0FBc0M7UUFDckYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUMzRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksaUJBQWlCLEdBQVksS0FBSyxDQUFDO1FBRXZDLE1BQU0sR0FBRyxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBVyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1NBQ0o7UUFFRCxPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFFTSxNQUFNLENBQUMsV0FBVyxDQUFJLE9BQVUsRUFBRSxPQUFlLEVBQUUsS0FBVTtRQUNoRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxNQUFNLFNBQVMsR0FBVyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQVcsV0FBVyxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxPQUFPLEVBQUU7WUFDekQsNEVBQTRFO1lBQzVFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsOElBQThJO0lBQ3ZJLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFZLEVBQUUsY0FBbUIsRUFBRSxnQkFBcUI7UUFDekYsSUFBSSxLQUFLLEVBQUU7WUFDUCxNQUFNLGNBQWMsR0FBVyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzRCxJQUFJLGNBQWMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hDLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLGNBQWMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDckU7U0FDSjtJQUNMLENBQUM7SUFFSDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLHFCQUFxQixDQUFJLEtBQVUsRUFBRSxpQkFBc0M7UUFDdkYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hDLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sUUFBUSxHQUFXLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUM7YUFDaEI7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQge051bWJlclV0aWxzfSBmcm9tIFwiLi9udW1iZXItdXRpbHNcIjtcbmltcG9ydCB7aXNOaWxsfSBmcm9tIFwiLi9pcy1uaWxsLmZ1bmN0aW9uXCI7XG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBBcnJheVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gZ2l2ZW4gYXJyYXkgY291bGQgYmUgZm91bmQgYnkgZ2l2ZW4gZmluZGVyIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUW119IGFycmF5XG4gICAgICogQHBhcmFtIHsoZWxlbWVudDogVCkgPT4gYm9vbGVhbn0gZmluZGVyIEEgZmluZGVyIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgYW5kIHJldHVybnMgYSBib29sZWFuIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoZSAnZm91bmQgc3RhdHVzJyBmb3IgdGhhdCBlbGVtZW50OyB3aGV0aGVyIGl0IHNob3VsZCBoYXZlIGJlZW4gZm91bmQgb3Igbm90LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgQ29udGFpbnNBbkVsZW1lbnRGb3VuZEJ5PFQ+KGFycmF5OiBUW10sIGZpbmRlcjogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZmluZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm90TmlsbCh0aGlzLkZpbmQ8VD4oYXJyYXksIGZpbmRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyb3NzLWJyb3dzZXIgQXJyYXkuZmluZCgpIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIGdpdmVuIGFycmF5IGZvciB3aGljaCB0aGUgZm91bmRCeSBmdW5jdGlvbiByZXR1cm5zIHRydWUuIFJldHVybnNcbiAgICAgKiB1bmRlZmluZWQgd2hlbiBub25lIHdhcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICogY29uc3QgZm91bmRJdGVtOiBCdXNpbmVzc09iamVjdCA9IEFycmF5VXRpbHMuRmluZDxCdXNpbmVzc09iamVjdD4obW9kZWxBcnJheSwgKG1vZGVsSXRlbTogQnVzaW5lc3NPYmplY3QpID0+IDxicj5cbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxuICAgICAqICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXG4gICAgICogQHBhcmFtIGZvdW5kQnkgVGhlIGZpbmRlciBmdW5jdGlvbiBhcHBsaWVkIG9uIGVhY2ggaXRlbXMgb2YgdGhlIGFycmF5LCB3aGVuIHRoYXQgcmV0dXJucyB0cnVlLCB0aGUgaXRlbSBpcyBjb25zaWRlcmVkIGZvdW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xuICAgICAgICBpZiAoIWFycmF5IHx8ICFmb3VuZEJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKGZvdW5kQnkoaXRlbUN1cikgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1DdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBAcmV0dXJucyBlbXB0eSBhcnJheSB3aGVuIG5vdGhpbmcgZm91bmQsIG90aGVyd2lzZSBhcnJheSB3aXRoIGZvdW5kIGl0ZW1zXG4gICAgcHVibGljIHN0YXRpYyBGaW5kQWxsPFQ+KGFycmF5OiBUW10sIGZvdW5kQnk6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVFtdIHtcbiAgICAgICAgY29uc3QgYW5zd2VyOiBUW10gPSBbXTtcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZm91bmRCeSkge1xuICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1DdXI6IFQgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChmb3VuZEJ5KGl0ZW1DdXIpKSB7XG4gICAgICAgICAgICAgICAgYW5zd2VyLnB1c2goaXRlbUN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGEgc2ltcGxlIGNsb25lIG9mIGdpdmVuIGFycmF5LCB1c2luZyBhcnJheS5zbGljZSgwKVxuICAgIHB1YmxpYyBzdGF0aWMgQ2xvbmVBcnJheTxUPihhcnJheTogVFtdKTogVFtdIHtcbiAgICAgICAgbGV0IGFuc3dlcjogVFtdID0gW107XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgICBhbnN3ZXIgPSBhcnJheS5zbGljZSgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbnN3ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhICdzZW1pIGRlZXAgY2xvbmUnIG9mIGdpdmVuIGFycmF5LiBJdHMgZmlyc3QtbGV2ZWwgbWVtYmVycyBhcmUgb2JqZWN0LXNoYWxsb3ctY2xvbmVkIChvcHRpb25hbGx5IHdpdGggYSBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXG4gICAgICogb3IganVzdCBhcyBwbGFpbiBvYmplY3QgKHNlZSBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MpLlxuICAgICAqIEBwYXJhbSBhcnJheVxuICAgICAqIEBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MgSWYgcHJvdmlkZWQsIHRoZSBjbG9uZWQgYXJyYXkncyBmaXJzdC1sZXZlbCBpdGVtcyB3aWxsIGJlIHN0cm9uZ2x5IHR5cGVkIHRvIC8gY29uc3RydWN0ZWQgYXMgdGhpcyBjbGFzcy4gT3RoZXJ3aXNlXG4gICAgICogaXQnbGwgYmUgYSBwbGFpbiBvYmplY3QuXG4gICAgICogQHBhcmFtIGRlZXBDbG9uZSBTZXQgdG8gdHJ1ZSBpZiBhcnJheSBpdGVtcyBjb250YWluIEZVTkNUSU9OUyB0aGF0IG5lZWQgdG8gYmUgY2xvbmVkLi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHNlbWktZGVlcCBjbG9uZSBvZiBnaXZlbiBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgQ2xvbmVBcnJheUFuZEl0c0l0ZW1zPFQ+KGFycmF5OiBUW10sIGFycmF5SXRlbXNDbGFzcz86IGFueSwgZGVlcENsb25lOiBib29sZWFuID0gZmFsc2UpOiBUW10ge1xuICAgICAgICBjb25zdCBjbG9uZUFycmF5OiBUW10gPSBbXTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcENsb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lQXJyYXkucHVzaChPYmplY3RVdGlscy5HZXREZWVwQ2xvbmUoYXJyYXlbaV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZUFycmF5LnB1c2goT2JqZWN0VXRpbHMuR2V0U2hhbGxvd0Nsb25lKGFycmF5W2ldLCBhcnJheUl0ZW1zQ2xhc3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvbmVBcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnQgYXQgZ2l2ZW4gaW5kZXggZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseVxuICAgICAqIHJlbW92ZXMgdGhlIGVsZW1lbnQgdXNpbmcgc3BsaWNlKCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnJheSBpbi1vdXRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZWxlbWVudCBvbiBnaXZlbiBpbmRleCBpcyBzdWNjZXNmdWxseSByZW1vdmVkIGZyb20gZ2l2ZW4gYXJyYXkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50QXRJbmRleChpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKE51bWJlclV0aWxzLklzTmFOKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4IGluIGFycmF5KSB7XG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseSByZW1vdmVzIHRoZVxuICAgICAqIGVsZW1lbnQgdXNpbmcgc3BsaWNlKCkuIEFsc28gd29ya3Mgb24gYXNzb2NpYXRpdmUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUfSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge1RbXX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmZiBnaXZlbiBlbGVtZW50IHdhcyB0cnVseSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIGdpdmVuIGFycmF5LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudDxUPihlbGVtZW50OiBULCBhcnJheTogVFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50QXRJbmRleChpbmRleCwgYXJyYXkpO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBpZiBnaXZlbiBhcnJheSBpcyBkZWZpbmVkLCBhbmQgaXMgYW4gYXJyYXksIGFuZCBoYXMgbGVuZ3RoID4gMCwgYW5kLCBvcHRpb25hbGx5IGNoZWNrcyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGlzIG9mIHR5cGUgZ2l2ZW4gY2xhenouXG4gICAgcHVibGljIHN0YXRpYyBJc0FycmF5V2l0aEVsZW1lbnRzPFQ+KGFycmF5VG9DaGVjazogVFtdLCBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZj86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOaWxsKGFycmF5VG9DaGVjaykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5VG9DaGVjaykgJiYgYXJyYXlUb0NoZWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvQ2hlY2tbMF0gaW5zdGFuY2VvZiBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiBmaWx0ZXIgZnVuY3Rpb24gaG9sZHMgdHJ1ZS4gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSByZW1vdmVkLCBlbHNlIGZhbHNlLlxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudHNCeUZpbHRlcihhcnJheTogYW55W10sIGZpbHRlckZ1bmN0aW9uOiAoaXRlbTogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghQXJyYXlVdGlscy5Jc0FycmF5V2l0aEVsZW1lbnRzKGFycmF5KSB8fCAhZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdExlYXN0T25lUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbTogYW55ID0gYXJyYXlbaV07XG4gICAgICAgICAgICBpZiAoZmlsdGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBpdGVtKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBhdExlYXN0T25lUmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXRMZWFzdE9uZVJlbW92ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBNb3ZlRWxlbWVudDxUPihlbGVtZW50OiBULCB0b0luZGV4OiBudW1iZXIsIGFycmF5OiBUW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcbiAgICAgICAgY29uc3QgdG9JbmRleENvcnJlY3RlZDogbnVtYmVyID0gTnVtYmVyVXRpbHMuR2V0TmVhcmVzdE51bWJlcldpdGhpbkJvdW5kcyh0b0luZGV4LCAwLCBhcnJheS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gLTEgfHwgYXJyYXlbdG9JbmRleENvcnJlY3RlZF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgZGlkIG5vdCBleGlzdCBpbiBnaXZlbiBhcnJheSwgb3IgYWxyZWFkeSBleGlzdGVkIG9uIGdpdmVuIHRvSW5kZXhcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBhcnJheS5zcGxpY2UodG9JbmRleENvcnJlY3RlZCwgMCwgYXJyYXkuc3BsaWNlKGZyb21JbmRleCwgMSlbMF0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQUkU6IGVsZW1lbnRzIGV4aXN0cyBpbiBnaXZlbiBhcnJheS4gUE9TVDogZ2l2ZW4gZWxlbWVudFRvUGxhY2UgaGFzIGEgbG93ZXIgaW5kZXggdGhhbiBnaXZlbiBhZnRlclRoaXNFbGVtZW50LiBBcnJheSBpcyBpbi1vdXQgbWFuaXB1bGF0ZWQuXG4gICAgcHVibGljIHN0YXRpYyBQbGFjZUVsZW1lbnRBZnRlck90aGVyKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvUGxhY2U6IGFueSwgYWZ0ZXJUaGlzRWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaGlzRWxJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoYWZ0ZXJUaGlzRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBlbFRvUGxhY2VJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvUGxhY2UpO1xuICAgICAgICAgICAgaWYgKGFmdGVyVGhpc0VsSWR4ID49IGVsVG9QbGFjZUlkeCkge1xuICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuTW92ZUVsZW1lbnQoZWxlbWVudFRvUGxhY2UsIGFmdGVyVGhpc0VsSWR4ICsgMSwgYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1heCB2YWx1ZSBmcm9tIGFsbCByZXN1bHRpbmcgdmFsdWVzIGZyb20gYXBwbHlpbmcgZ2l2ZW4gaXRlbVZhbHVlRnVuY3Rpb24gdG8gYWxsIGl0ZW1zIG9mIGdpdmVuIGFycmF5LlxuICAgKiBAcGFyYW0gYXJyYXlcbiAgICogQHBhcmFtIGl0ZW1WYWx1ZUZ1bmN0aW9uIFRoZSBmdW5jdGlvbiBhcHBsaWVkIHRvIGVhY2ggYXJyYXkgaXRlbSB0aGF0IGdpdmVzIGl0IGEgbnVtZXJpY2FsIHZhbHVlLiBUaGUgbWF4IG51bSB2YWwgZm91bmQgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEdldE1heENhbGN1bGF0ZWRWYWx1ZTxUPihhcnJheTogVFtdLCBpdGVtVmFsdWVGdW5jdGlvbjogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFhcnJheSB8fCAhaXRlbVZhbHVlRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuXG4gICAgbGV0IG1heDogbnVtYmVyID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgIGlmICh2YWx1ZUN1ciA+IG1heCkge1xuICAgICAgICBtYXggPSB2YWx1ZUN1cjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF4O1xuICB9XG59XG4iXX0=
1
+ import { ObjectUtils } from "./object-utils";
2
+ import { NumberUtils } from "./number-utils";
3
+ import { isNill } from "./is-nill.function";
4
+ import { notNill } from "./function/not-nill.function";
5
+ export class ArrayUtils {
6
+ /**
7
+ * Returns whether at least one element in given array could be found by given finder function.
8
+ *
9
+ * @param {T[]} array
10
+ * @param {(element: T) => boolean} finder A finder function that takes an element of the array and returns a boolean that represents
11
+ * the 'found status' for that element; whether it should have been found or not.
12
+ */
13
+ static ContainsAnElementFoundBy(array, finder) {
14
+ if (!array || !finder) {
15
+ return false;
16
+ }
17
+ return notNill(this.Find(array, finder));
18
+ }
19
+ /**
20
+ * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
21
+ * undefined when none was found.
22
+ *
23
+ * Example usage:
24
+ * const foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
25
+ * (return modelItem.getId() === '1')
26
+ * * });
27
+ *
28
+ * @param array The array with items to search in.
29
+ * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
30
+ */
31
+ static Find(array, foundBy) {
32
+ if (!array || !foundBy) {
33
+ return undefined;
34
+ }
35
+ for (let i = 0, len = array.length; i < len; i++) {
36
+ const itemCur = array[i];
37
+ if (foundBy(itemCur)) {
38
+ return itemCur;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ // @returns empty array when nothing found, otherwise array with found items
44
+ static FindAll(array, foundBy) {
45
+ const answer = [];
46
+ if (!array || !foundBy) {
47
+ return answer;
48
+ }
49
+ for (let i = 0, len = array.length; i < len; i++) {
50
+ const itemCur = array[i];
51
+ if (foundBy(itemCur)) {
52
+ answer.push(itemCur);
53
+ }
54
+ }
55
+ return answer;
56
+ }
57
+ // returns a simple clone of given array, using array.slice(0)
58
+ static CloneArray(array) {
59
+ let answer = [];
60
+ if (array) {
61
+ answer = array.slice(0);
62
+ }
63
+ return answer;
64
+ }
65
+ /**
66
+ * Returns a 'semi deep clone' of given array. Its first-level members are object-shallow-cloned (optionally with a strongly typed constructor),
67
+ * or just as plain object (see param arrayItemsClass).
68
+ * @param array
69
+ * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
70
+ * it'll be a plain object.
71
+ * @param deepClone Set to true if array items contain FUNCTIONS that need to be cloned..
72
+ * @returns {Array} semi-deep clone of given array
73
+ */
74
+ static CloneArrayAndItsItems(array, arrayItemsClass, deepClone = false) {
75
+ const cloneArray = [];
76
+ if (array) {
77
+ for (let i = 0, len = array.length; i < len; i++) {
78
+ if (deepClone) {
79
+ cloneArray.push(ObjectUtils.GetDeepClone(array[i]));
80
+ }
81
+ else {
82
+ cloneArray.push(ObjectUtils.GetShallowClone(array[i], arrayItemsClass));
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ return [];
88
+ }
89
+ return cloneArray;
90
+ }
91
+ /**
92
+ * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
93
+ * removes the element using splice().
94
+ *
95
+ * @param {number} index
96
+ * @param {any[]} array in-out
97
+ * @returns {boolean} True if and only if the element on given index is succesfully removed from given array.
98
+ */
99
+ static RemoveElementAtIndex(index, array) {
100
+ if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
101
+ return false;
102
+ }
103
+ if (index in array) {
104
+ array.splice(index, 1);
105
+ return true;
106
+ }
107
+ else {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really removes the
113
+ * element using splice(). Also works on associative arrays.
114
+ *
115
+ * @param {T} element The element to remove.
116
+ * @param {T[]} array The array to remove the element from.
117
+ * @returns {boolean} True iff given element was truly successfully removed from given array.
118
+ */
119
+ static RemoveElement(element, array) {
120
+ if (!Array.isArray(array)) {
121
+ return false;
122
+ }
123
+ const index = array.indexOf(element);
124
+ return ArrayUtils.RemoveElementAtIndex(index, array);
125
+ }
126
+ // 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.
127
+ static IsArrayWithElements(arrayToCheck, classItemsMustBeInstanceOf) {
128
+ if (isNill(arrayToCheck)) {
129
+ return false;
130
+ }
131
+ if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
132
+ if (classItemsMustBeInstanceOf) {
133
+ return arrayToCheck[0] instanceof classItemsMustBeInstanceOf;
134
+ }
135
+ else {
136
+ return true;
137
+ }
138
+ }
139
+ else {
140
+ return false;
141
+ }
142
+ }
143
+ // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
144
+ static RemoveElementsByFilter(array, filterFunction) {
145
+ if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
146
+ return false;
147
+ }
148
+ let atLeastOneRemoved = false;
149
+ const len = array.length;
150
+ for (let i = len - 1; i >= 0; i--) {
151
+ const item = array[i];
152
+ if (filterFunction.call(this, item) === true) {
153
+ array.splice(i, 1);
154
+ atLeastOneRemoved = true;
155
+ }
156
+ }
157
+ return atLeastOneRemoved;
158
+ }
159
+ static MoveElement(element, toIndex, array) {
160
+ if (!Array.isArray(array) || isNill(toIndex)) {
161
+ return false;
162
+ }
163
+ const fromIndex = array.indexOf(element);
164
+ const toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
165
+ if (fromIndex === -1 || array[toIndexCorrected] === element) {
166
+ // element did not exist in given array, or already existed on given toIndex
167
+ return false;
168
+ }
169
+ array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
170
+ return true;
171
+ }
172
+ // PRE: elements exists in given array. POST: given elementToPlace has a lower index than given afterThisElement. Array is in-out manipulated.
173
+ static PlaceElementAfterOther(array, elementToPlace, afterThisElement) {
174
+ if (array) {
175
+ const afterThisElIdx = array.indexOf(afterThisElement);
176
+ const elToPlaceIdx = array.indexOf(elementToPlace);
177
+ if (afterThisElIdx >= elToPlaceIdx) {
178
+ ArrayUtils.MoveElement(elementToPlace, afterThisElIdx + 1, array);
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
184
+ * @param array
185
+ * @param itemValueFunction The function applied to each array item that gives it a numerical value. The max num val found is returned.
186
+ */
187
+ static GetMaxCalculatedValue(array, itemValueFunction) {
188
+ if (!array || !itemValueFunction) {
189
+ return NaN;
190
+ }
191
+ let max = undefined;
192
+ const len = array.length;
193
+ for (let i = 0; i < len; i++) {
194
+ const valueCur = itemValueFunction.call(this);
195
+ if (valueCur > max) {
196
+ max = valueCur;
197
+ }
198
+ }
199
+ return max;
200
+ }
201
+ }
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE1BQU0sT0FBTyxVQUFVO0lBQ25COzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBSSxLQUFVLEVBQUUsTUFBK0I7UUFDakYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBSSxLQUFVLEVBQUUsT0FBNkI7UUFDM0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFHO2dCQUNuQixPQUFPLE9BQU8sQ0FBQzthQUNsQjtT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LEtBQVUsRUFBRSxpQkFBc0M7UUFDdkYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hDLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sUUFBUSxHQUFXLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUM7YUFDaEI7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LXV0aWxzXCI7XHJcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCIuL251bWJlci11dGlsc1wiO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSBcIi4vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXJyYXlVdGlscyB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBnaXZlbiBhcnJheSBjb3VsZCBiZSBmb3VuZCBieSBnaXZlbiBmaW5kZXIgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUW119IGFycmF5XHJcbiAgICAgKiBAcGFyYW0geyhlbGVtZW50OiBUKSA9PiBib29sZWFufSBmaW5kZXIgQSBmaW5kZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlbGVtZW50IG9mIHRoZSBhcnJheSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdGhhdCByZXByZXNlbnRzXHJcbiAgICAgKiB0aGUgJ2ZvdW5kIHN0YXR1cycgZm9yIHRoYXQgZWxlbWVudDsgd2hldGhlciBpdCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb250YWluc0FuRWxlbWVudEZvdW5kQnk8VD4oYXJyYXk6IFRbXSwgZmluZGVyOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZpbmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm90TmlsbCh0aGlzLkZpbmQ8VD4oYXJyYXksIGZpbmRlcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3Jvc3MtYnJvd3NlciBBcnJheS5maW5kKCkgZnVuY3Rpb24uIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gZ2l2ZW4gYXJyYXkgZm9yIHdoaWNoIHRoZSBmb3VuZEJ5IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4gUmV0dXJuc1xyXG4gICAgICogdW5kZWZpbmVkIHdoZW4gbm9uZSB3YXMgZm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogRXhhbXBsZSB1c2FnZTpcclxuICAgICAqIGNvbnN0IGZvdW5kSXRlbTogQnVzaW5lc3NPYmplY3QgPSBBcnJheVV0aWxzLkZpbmQ8QnVzaW5lc3NPYmplY3Q+KG1vZGVsQXJyYXksIChtb2RlbEl0ZW06IEJ1c2luZXNzT2JqZWN0KSA9PiA8YnI+XHJcbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxyXG4gICAgICogICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXHJcbiAgICAgKiBAcGFyYW0gZm91bmRCeSBUaGUgZmluZGVyIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBpdGVtcyBvZiB0aGUgYXJyYXksIHdoZW4gdGhhdCByZXR1cm5zIHRydWUsIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRCeShpdGVtQ3VyKSApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQ3VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQHJldHVybnMgZW1wdHkgYXJyYXkgd2hlbiBub3RoaW5nIGZvdW5kLCBvdGhlcndpc2UgYXJyYXkgd2l0aCBmb3VuZCBpdGVtc1xyXG4gICAgcHVibGljIHN0YXRpYyBGaW5kQWxsPFQ+KGFycmF5OiBUW10sIGZvdW5kQnk6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVFtdIHtcclxuICAgICAgICBjb25zdCBhbnN3ZXI6IFRbXSA9IFtdO1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRCeShpdGVtQ3VyKSkge1xyXG4gICAgICAgICAgICAgICAgYW5zd2VyLnB1c2goaXRlbUN1cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm5zIGEgc2ltcGxlIGNsb25lIG9mIGdpdmVuIGFycmF5LCB1c2luZyBhcnJheS5zbGljZSgwKVxyXG4gICAgcHVibGljIHN0YXRpYyBDbG9uZUFycmF5PFQ+KGFycmF5OiBUW10pOiBUW10ge1xyXG4gICAgICAgIGxldCBhbnN3ZXI6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoYXJyYXkpIHtcclxuICAgICAgICAgICAgYW5zd2VyID0gYXJyYXkuc2xpY2UoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhICdzZW1pIGRlZXAgY2xvbmUnIG9mIGdpdmVuIGFycmF5LiBJdHMgZmlyc3QtbGV2ZWwgbWVtYmVycyBhcmUgb2JqZWN0LXNoYWxsb3ctY2xvbmVkIChvcHRpb25hbGx5IHdpdGggYSBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXHJcbiAgICAgKiBvciBqdXN0IGFzIHBsYWluIG9iamVjdCAoc2VlIHBhcmFtIGFycmF5SXRlbXNDbGFzcykuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlcclxuICAgICAqIEBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MgSWYgcHJvdmlkZWQsIHRoZSBjbG9uZWQgYXJyYXkncyBmaXJzdC1sZXZlbCBpdGVtcyB3aWxsIGJlIHN0cm9uZ2x5IHR5cGVkIHRvIC8gY29uc3RydWN0ZWQgYXMgdGhpcyBjbGFzcy4gT3RoZXJ3aXNlXHJcbiAgICAgKiBpdCdsbCBiZSBhIHBsYWluIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBkZWVwQ2xvbmUgU2V0IHRvIHRydWUgaWYgYXJyYXkgaXRlbXMgY29udGFpbiBGVU5DVElPTlMgdGhhdCBuZWVkIHRvIGJlIGNsb25lZC4uXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHNlbWktZGVlcCBjbG9uZSBvZiBnaXZlbiBhcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENsb25lQXJyYXlBbmRJdHNJdGVtczxUPihhcnJheTogVFtdLCBhcnJheUl0ZW1zQ2xhc3M/OiBhbnksIGRlZXBDbG9uZTogYm9vbGVhbiA9IGZhbHNlKTogVFtdIHtcclxuICAgICAgICBjb25zdCBjbG9uZUFycmF5OiBUW10gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChkZWVwQ2xvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbG9uZUFycmF5LnB1c2goT2JqZWN0VXRpbHMuR2V0RGVlcENsb25lKGFycmF5W2ldKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lQXJyYXkucHVzaChPYmplY3RVdGlscy5HZXRTaGFsbG93Q2xvbmUoYXJyYXlbaV0sIGFycmF5SXRlbXNDbGFzcykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb25lQXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnQgYXQgZ2l2ZW4gaW5kZXggZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseVxyXG4gICAgICogcmVtb3ZlcyB0aGUgZWxlbWVudCB1c2luZyBzcGxpY2UoKS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICAgICAqIEBwYXJhbSB7YW55W119IGFycmF5IGluLW91dFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGVsZW1lbnQgb24gZ2l2ZW4gaW5kZXggaXMgc3VjY2VzZnVsbHkgcmVtb3ZlZCBmcm9tIGdpdmVuIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlbW92ZUVsZW1lbnRBdEluZGV4KGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChOdW1iZXJVdGlscy5Jc05hTihpbmRleCkgfHwgaW5kZXggPCAwIHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4IGluIGFycmF5KSB7XHJcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseSByZW1vdmVzIHRoZVxyXG4gICAgICogZWxlbWVudCB1c2luZyBzcGxpY2UoKS4gQWxzbyB3b3JrcyBvbiBhc3NvY2lhdGl2ZSBhcnJheXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUfSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbW92ZS5cclxuICAgICAqIEBwYXJhbSB7VFtdfSBhcnJheSBUaGUgYXJyYXkgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZmYgZ2l2ZW4gZWxlbWVudCB3YXMgdHJ1bHkgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50PFQ+KGVsZW1lbnQ6IFQsIGFycmF5OiBUW10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnRBdEluZGV4KGluZGV4LCBhcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2tzIGlmIGdpdmVuIGFycmF5IGlzIGRlZmluZWQsIGFuZCBpcyBhbiBhcnJheSwgYW5kIGhhcyBsZW5ndGggPiAwLCBhbmQsIG9wdGlvbmFsbHkgY2hlY2tzIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb2YgdHlwZSBnaXZlbiBjbGF6ei5cclxuICAgIHB1YmxpYyBzdGF0aWMgSXNBcnJheVdpdGhFbGVtZW50czxUPihhcnJheVRvQ2hlY2s6IFRbXSwgY2xhc3NJdGVtc011c3RCZUluc3RhbmNlT2Y/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoaXNOaWxsKGFycmF5VG9DaGVjaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXlUb0NoZWNrKSAmJiBhcnJheVRvQ2hlY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoY2xhc3NJdGVtc011c3RCZUluc3RhbmNlT2YpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvQ2hlY2tbMF0gaW5zdGFuY2VvZiBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiBmaWx0ZXIgZnVuY3Rpb24gaG9sZHMgdHJ1ZS4gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSByZW1vdmVkLCBlbHNlIGZhbHNlLlxyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50c0J5RmlsdGVyKGFycmF5OiBhbnlbXSwgZmlsdGVyRnVuY3Rpb246IChpdGVtOiBhbnkpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5VXRpbHMuSXNBcnJheVdpdGhFbGVtZW50cyhhcnJheSkgfHwgIWZpbHRlckZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBhdExlYXN0T25lUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IGFycmF5Lmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtOiBhbnkgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmN0aW9uLmNhbGwodGhpcywgaXRlbSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF0TGVhc3RPbmVSZW1vdmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTW92ZUVsZW1lbnQ8VD4oZWxlbWVudDogVCwgdG9JbmRleDogbnVtYmVyLCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IHRvSW5kZXhDb3JyZWN0ZWQ6IG51bWJlciA9IE51bWJlclV0aWxzLkdldE5lYXJlc3ROdW1iZXJXaXRoaW5Cb3VuZHModG9JbmRleCwgMCwgYXJyYXkubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gLTEgfHwgYXJyYXlbdG9JbmRleENvcnJlY3RlZF0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gZWxlbWVudCBkaWQgbm90IGV4aXN0IGluIGdpdmVuIGFycmF5LCBvciBhbHJlYWR5IGV4aXN0ZWQgb24gZ2l2ZW4gdG9JbmRleFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFycmF5LnNwbGljZSh0b0luZGV4Q29ycmVjdGVkLCAwLCBhcnJheS5zcGxpY2UoZnJvbUluZGV4LCAxKVswXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUFJFOiBlbGVtZW50cyBleGlzdHMgaW4gZ2l2ZW4gYXJyYXkuIFBPU1Q6IGdpdmVuIGVsZW1lbnRUb1BsYWNlIGhhcyBhIGxvd2VyIGluZGV4IHRoYW4gZ2l2ZW4gYWZ0ZXJUaGlzRWxlbWVudC4gQXJyYXkgaXMgaW4tb3V0IG1hbmlwdWxhdGVkLlxyXG4gICAgcHVibGljIHN0YXRpYyBQbGFjZUVsZW1lbnRBZnRlck90aGVyKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvUGxhY2U6IGFueSwgYWZ0ZXJUaGlzRWxlbWVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFycmF5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGhpc0VsSWR4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGFmdGVyVGhpc0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBlbFRvUGxhY2VJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvUGxhY2UpO1xyXG4gICAgICAgICAgICBpZiAoYWZ0ZXJUaGlzRWxJZHggPj0gZWxUb1BsYWNlSWR4KSB7XHJcbiAgICAgICAgICAgICAgICBBcnJheVV0aWxzLk1vdmVFbGVtZW50KGVsZW1lbnRUb1BsYWNlLCBhZnRlclRoaXNFbElkeCArIDEsIGFycmF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBtYXggdmFsdWUgZnJvbSBhbGwgcmVzdWx0aW5nIHZhbHVlcyBmcm9tIGFwcGx5aW5nIGdpdmVuIGl0ZW1WYWx1ZUZ1bmN0aW9uIHRvIGFsbCBpdGVtcyBvZiBnaXZlbiBhcnJheS5cclxuICAgKiBAcGFyYW0gYXJyYXlcclxuICAgKiBAcGFyYW0gaXRlbVZhbHVlRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIGFwcGxpZWQgdG8gZWFjaCBhcnJheSBpdGVtIHRoYXQgZ2l2ZXMgaXQgYSBudW1lcmljYWwgdmFsdWUuIFRoZSBtYXggbnVtIHZhbCBmb3VuZCBpcyByZXR1cm5lZC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdldE1heENhbGN1bGF0ZWRWYWx1ZTxUPihhcnJheTogVFtdLCBpdGVtVmFsdWVGdW5jdGlvbjogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoIWFycmF5IHx8ICFpdGVtVmFsdWVGdW5jdGlvbikge1xyXG4gICAgICByZXR1cm4gTmFOO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXg6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IGFycmF5Lmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcclxuICAgICAgaWYgKHZhbHVlQ3VyID4gbWF4KSB7XHJcbiAgICAgICAgbWF4ID0gdmFsdWVDdXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxufVxyXG4iXX0=