@dereekb/dbx-form 12.7.0 → 13.0.0

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 (378) hide show
  1. package/LICENSE +1 -1
  2. package/fesm2022/dereekb-dbx-form-calendar.mjs +86 -86
  3. package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -1
  4. package/fesm2022/dereekb-dbx-form-mapbox.mjs +28 -28
  5. package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -1
  6. package/fesm2022/dereekb-dbx-form.mjs +381 -542
  7. package/fesm2022/dereekb-dbx-form.mjs.map +1 -1
  8. package/lib/formly/field/value/phone/_phone.scss +1 -0
  9. package/lib/style/_theming.scss +196 -1
  10. package/package.json +26 -32
  11. package/types/dereekb-dbx-form-calendar.d.ts +679 -0
  12. package/types/dereekb-dbx-form-mapbox.d.ts +216 -0
  13. package/types/dereekb-dbx-form.d.ts +3050 -0
  14. package/calendar/index.d.ts +0 -1
  15. package/calendar/lib/calendar.module.d.ts +0 -19
  16. package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +0 -16
  17. package/calendar/lib/calendar.schedule.selection.component.d.ts +0 -74
  18. package/calendar/lib/calendar.schedule.selection.d.ts +0 -29
  19. package/calendar/lib/calendar.schedule.selection.days.component.d.ts +0 -15
  20. package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +0 -10
  21. package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +0 -15
  22. package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +0 -24
  23. package/calendar/lib/calendar.schedule.selection.form.d.ts +0 -4
  24. package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +0 -17
  25. package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +0 -14
  26. package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +0 -5
  27. package/calendar/lib/calendar.schedule.selection.range.component.d.ts +0 -52
  28. package/calendar/lib/calendar.schedule.selection.store.d.ts +0 -282
  29. package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +0 -23
  30. package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +0 -18
  31. package/calendar/lib/field/index.d.ts +0 -1
  32. package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +0 -102
  33. package/calendar/lib/field/schedule/calendar.schedule.field.d.ts +0 -6
  34. package/calendar/lib/field/schedule/calendar.schedule.module.d.ts +0 -8
  35. package/calendar/lib/field/schedule/index.d.ts +0 -3
  36. package/calendar/lib/index.d.ts +0 -17
  37. package/esm2022/calendar/dereekb-dbx-form-calendar.mjs +0 -5
  38. package/esm2022/calendar/index.mjs +0 -2
  39. package/esm2022/calendar/lib/calendar.module.mjs +0 -84
  40. package/esm2022/calendar/lib/calendar.schedule.selection.cell.component.mjs +0 -42
  41. package/esm2022/calendar/lib/calendar.schedule.selection.component.mjs +0 -156
  42. package/esm2022/calendar/lib/calendar.schedule.selection.days.component.mjs +0 -47
  43. package/esm2022/calendar/lib/calendar.schedule.selection.days.form.component.mjs +0 -22
  44. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +0 -32
  45. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +0 -59
  46. package/esm2022/calendar/lib/calendar.schedule.selection.form.mjs +0 -15
  47. package/esm2022/calendar/lib/calendar.schedule.selection.mjs +0 -31
  48. package/esm2022/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +0 -50
  49. package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +0 -41
  50. package/esm2022/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +0 -34
  51. package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +0 -165
  52. package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +0 -785
  53. package/esm2022/calendar/lib/calendar.schedule.selection.store.provide.mjs +0 -48
  54. package/esm2022/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +0 -67
  55. package/esm2022/calendar/lib/field/index.mjs +0 -3
  56. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +0 -154
  57. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.mjs +0 -28
  58. package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +0 -26
  59. package/esm2022/calendar/lib/field/schedule/index.mjs +0 -4
  60. package/esm2022/calendar/lib/index.mjs +0 -18
  61. package/esm2022/dereekb-dbx-form.mjs +0 -5
  62. package/esm2022/index.mjs +0 -2
  63. package/esm2022/lib/form/action/form.action.dialog.component.mjs +0 -75
  64. package/esm2022/lib/form/action/form.action.directive.mjs +0 -168
  65. package/esm2022/lib/form/action/form.action.module.mjs +0 -19
  66. package/esm2022/lib/form/action/index.mjs +0 -5
  67. package/esm2022/lib/form/action/transition/form.action.transition.module.mjs +0 -19
  68. package/esm2022/lib/form/action/transition/form.action.transition.safety.directive.mjs +0 -28
  69. package/esm2022/lib/form/action/transition/index.mjs +0 -3
  70. package/esm2022/lib/form/form.angular.util.mjs +0 -13
  71. package/esm2022/lib/form/form.mjs +0 -42
  72. package/esm2022/lib/form/form.module.mjs +0 -17
  73. package/esm2022/lib/form/index.mjs +0 -6
  74. package/esm2022/lib/form/io/form.change.directive.mjs +0 -38
  75. package/esm2022/lib/form/io/form.input.directive.mjs +0 -94
  76. package/esm2022/lib/form/io/form.io.module.mjs +0 -26
  77. package/esm2022/lib/form/io/form.loading.directive.mjs +0 -35
  78. package/esm2022/lib/form/io/index.mjs +0 -5
  79. package/esm2022/lib/form.module.mjs +0 -18
  80. package/esm2022/lib/form.providers.mjs +0 -32
  81. package/esm2022/lib/formly/config/index.mjs +0 -2
  82. package/esm2022/lib/formly/config/validation.mjs +0 -23
  83. package/esm2022/lib/formly/field/checklist/checklist.field.mjs +0 -102
  84. package/esm2022/lib/formly/field/checklist/checklist.item.field.component.mjs +0 -87
  85. package/esm2022/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +0 -50
  86. package/esm2022/lib/formly/field/checklist/checklist.item.field.mjs +0 -14
  87. package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +0 -30
  88. package/esm2022/lib/formly/field/checklist/checklist.item.mjs +0 -2
  89. package/esm2022/lib/formly/field/checklist/index.mjs +0 -7
  90. package/esm2022/lib/formly/field/component/component.field.component.mjs +0 -25
  91. package/esm2022/lib/formly/field/component/component.field.mjs +0 -7
  92. package/esm2022/lib/formly/field/component/component.field.module.mjs +0 -26
  93. package/esm2022/lib/formly/field/component/index.mjs +0 -4
  94. package/esm2022/lib/formly/field/field.mjs +0 -97
  95. package/esm2022/lib/formly/field/form.field.module.mjs +0 -22
  96. package/esm2022/lib/formly/field/index.mjs +0 -9
  97. package/esm2022/lib/formly/field/selection/index.mjs +0 -8
  98. package/esm2022/lib/formly/field/selection/list/index.mjs +0 -4
  99. package/esm2022/lib/formly/field/selection/list/list.field.component.mjs +0 -90
  100. package/esm2022/lib/formly/field/selection/list/list.field.mjs +0 -15
  101. package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +0 -26
  102. package/esm2022/lib/formly/field/selection/pickable/index.mjs +0 -8
  103. package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +0 -37
  104. package/esm2022/lib/formly/field/selection/pickable/pickable.field.directive.mjs +0 -272
  105. package/esm2022/lib/formly/field/selection/pickable/pickable.field.mjs +0 -26
  106. package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +0 -33
  107. package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +0 -130
  108. package/esm2022/lib/formly/field/selection/pickable/pickable.mjs +0 -2
  109. package/esm2022/lib/formly/field/selection/pickable/pickable.util.mjs +0 -35
  110. package/esm2022/lib/formly/field/selection/searchable/index.mjs +0 -9
  111. package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +0 -70
  112. package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +0 -90
  113. package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +0 -288
  114. package/esm2022/lib/formly/field/selection/searchable/searchable.field.mjs +0 -69
  115. package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +0 -34
  116. package/esm2022/lib/formly/field/selection/searchable/searchable.mjs +0 -2
  117. package/esm2022/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +0 -72
  118. package/esm2022/lib/formly/field/selection/searchable/text.chip.field.mjs +0 -15
  119. package/esm2022/lib/formly/field/selection/selection.field.mjs +0 -39
  120. package/esm2022/lib/formly/field/selection/selection.mjs +0 -2
  121. package/esm2022/lib/formly/field/selection/selection.module.mjs +0 -28
  122. package/esm2022/lib/formly/field/selection/sourceselect/index.mjs +0 -5
  123. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +0 -325
  124. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.mjs +0 -14
  125. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +0 -26
  126. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.mjs +0 -2
  127. package/esm2022/lib/formly/field/texteditor/index.mjs +0 -4
  128. package/esm2022/lib/formly/field/texteditor/texteditor.field.component.mjs +0 -97
  129. package/esm2022/lib/formly/field/texteditor/texteditor.field.mjs +0 -21
  130. package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +0 -26
  131. package/esm2022/lib/formly/field/value/array/array.field.component.mjs +0 -231
  132. package/esm2022/lib/formly/field/value/array/array.field.mjs +0 -28
  133. package/esm2022/lib/formly/field/value/array/array.field.module.mjs +0 -26
  134. package/esm2022/lib/formly/field/value/array/index.mjs +0 -4
  135. package/esm2022/lib/formly/field/value/boolean/boolean.field.mjs +0 -51
  136. package/esm2022/lib/formly/field/value/boolean/boolean.field.module.mjs +0 -19
  137. package/esm2022/lib/formly/field/value/boolean/index.mjs +0 -3
  138. package/esm2022/lib/formly/field/value/date/date.field.module.mjs +0 -36
  139. package/esm2022/lib/formly/field/value/date/date.value.mjs +0 -133
  140. package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +0 -737
  141. package/esm2022/lib/formly/field/value/date/datetime.field.mjs +0 -151
  142. package/esm2022/lib/formly/field/value/date/datetime.field.service.mjs +0 -23
  143. package/esm2022/lib/formly/field/value/date/datetime.mjs +0 -26
  144. package/esm2022/lib/formly/field/value/date/datetime.preset.mjs +0 -31
  145. package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +0 -521
  146. package/esm2022/lib/formly/field/value/date/index.mjs +0 -10
  147. package/esm2022/lib/formly/field/value/hidden.field.mjs +0 -8
  148. package/esm2022/lib/formly/field/value/index.mjs +0 -9
  149. package/esm2022/lib/formly/field/value/number/index.mjs +0 -3
  150. package/esm2022/lib/formly/field/value/number/number.field.mjs +0 -75
  151. package/esm2022/lib/formly/field/value/number/number.field.module.mjs +0 -18
  152. package/esm2022/lib/formly/field/value/phone/index.mjs +0 -4
  153. package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +0 -104
  154. package/esm2022/lib/formly/field/value/phone/phone.field.mjs +0 -66
  155. package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +0 -26
  156. package/esm2022/lib/formly/field/value/text/index.mjs +0 -5
  157. package/esm2022/lib/formly/field/value/text/text.additional.field.mjs +0 -114
  158. package/esm2022/lib/formly/field/value/text/text.address.field.mjs +0 -73
  159. package/esm2022/lib/formly/field/value/text/text.field.mjs +0 -47
  160. package/esm2022/lib/formly/field/value/text/text.field.module.mjs +0 -20
  161. package/esm2022/lib/formly/field/value/value.module.mjs +0 -31
  162. package/esm2022/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +0 -32
  163. package/esm2022/lib/formly/field/wrapper/expand.wrapper.component.mjs +0 -34
  164. package/esm2022/lib/formly/field/wrapper/expand.wrapper.delegate.mjs +0 -58
  165. package/esm2022/lib/formly/field/wrapper/flex.wrapper.component.mjs +0 -38
  166. package/esm2022/lib/formly/field/wrapper/index.mjs +0 -13
  167. package/esm2022/lib/formly/field/wrapper/info.wrapper.component.mjs +0 -48
  168. package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +0 -31
  169. package/esm2022/lib/formly/field/wrapper/style.wrapper.component.mjs +0 -53
  170. package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +0 -30
  171. package/esm2022/lib/formly/field/wrapper/toggle.wrapper.component.mjs +0 -55
  172. package/esm2022/lib/formly/field/wrapper/working.wrapper.component.mjs +0 -45
  173. package/esm2022/lib/formly/field/wrapper/wrapper.key.mjs +0 -10
  174. package/esm2022/lib/formly/field/wrapper/wrapper.mjs +0 -77
  175. package/esm2022/lib/formly/field/wrapper/wrapper.module.mjs +0 -101
  176. package/esm2022/lib/formly/form/form.form.mjs +0 -17
  177. package/esm2022/lib/formly/form/form.form.module.mjs +0 -20
  178. package/esm2022/lib/formly/form/index.mjs +0 -4
  179. package/esm2022/lib/formly/form/search.form.component.mjs +0 -35
  180. package/esm2022/lib/formly/formly.component.template.mjs +0 -29
  181. package/esm2022/lib/formly/formly.context.directive.mjs +0 -23
  182. package/esm2022/lib/formly/formly.context.mjs +0 -102
  183. package/esm2022/lib/formly/formly.directive.mjs +0 -79
  184. package/esm2022/lib/formly/formly.form.component.mjs +0 -193
  185. package/esm2022/lib/formly/formly.module.mjs +0 -40
  186. package/esm2022/lib/formly/formly.providers.mjs +0 -8
  187. package/esm2022/lib/formly/index.mjs +0 -12
  188. package/esm2022/lib/formly/template/available.mjs +0 -18
  189. package/esm2022/lib/formly/template/available.module.mjs +0 -18
  190. package/esm2022/lib/formly/template/index.mjs +0 -8
  191. package/esm2022/lib/formly/template/login.mjs +0 -92
  192. package/esm2022/lib/formly/template/login.module.mjs +0 -17
  193. package/esm2022/lib/formly/template/timezone.mjs +0 -46
  194. package/esm2022/lib/formly/template/timezone.module.mjs +0 -17
  195. package/esm2022/lib/formly/template/website.mjs +0 -25
  196. package/esm2022/lib/index.mjs +0 -7
  197. package/esm2022/lib/layout/form.layout.module.mjs +0 -20
  198. package/esm2022/lib/layout/form.spacer.directive.mjs +0 -20
  199. package/esm2022/lib/layout/index.mjs +0 -3
  200. package/esm2022/lib/validator/available.mjs +0 -31
  201. package/esm2022/lib/validator/boolean.mjs +0 -12
  202. package/esm2022/lib/validator/email.mjs +0 -6
  203. package/esm2022/lib/validator/field.mjs +0 -31
  204. package/esm2022/lib/validator/index.mjs +0 -8
  205. package/esm2022/lib/validator/number.mjs +0 -53
  206. package/esm2022/lib/validator/phone.mjs +0 -61
  207. package/esm2022/lib/validator/website.mjs +0 -68
  208. package/esm2022/mapbox/dereekb-dbx-form-mapbox.mjs +0 -5
  209. package/esm2022/mapbox/index.mjs +0 -3
  210. package/esm2022/mapbox/lib/field/index.mjs +0 -3
  211. package/esm2022/mapbox/lib/field/latlng/index.mjs +0 -5
  212. package/esm2022/mapbox/lib/field/latlng/latlng.field.component.mjs +0 -262
  213. package/esm2022/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +0 -34
  214. package/esm2022/mapbox/lib/field/latlng/latlng.field.mjs +0 -35
  215. package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +0 -26
  216. package/esm2022/mapbox/lib/field/zoom/index.mjs +0 -4
  217. package/esm2022/mapbox/lib/field/zoom/zoom.field.component.mjs +0 -146
  218. package/esm2022/mapbox/lib/field/zoom/zoom.field.mjs +0 -23
  219. package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +0 -26
  220. package/esm2022/mapbox/lib/mapbox.module.mjs +0 -16
  221. package/index.d.ts +0 -1
  222. package/lib/form/action/form.action.dialog.component.d.ts +0 -62
  223. package/lib/form/action/form.action.directive.d.ts +0 -65
  224. package/lib/form/action/form.action.module.d.ts +0 -10
  225. package/lib/form/action/index.d.ts +0 -4
  226. package/lib/form/action/transition/form.action.transition.module.d.ts +0 -10
  227. package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +0 -17
  228. package/lib/form/action/transition/index.d.ts +0 -2
  229. package/lib/form/form.angular.util.d.ts +0 -15
  230. package/lib/form/form.d.ts +0 -92
  231. package/lib/form/form.module.d.ts +0 -9
  232. package/lib/form/index.d.ts +0 -5
  233. package/lib/form/io/form.change.directive.d.ts +0 -17
  234. package/lib/form/io/form.input.directive.d.ts +0 -27
  235. package/lib/form/io/form.io.module.d.ts +0 -16
  236. package/lib/form/io/form.loading.directive.d.ts +0 -21
  237. package/lib/form/io/index.d.ts +0 -4
  238. package/lib/form.module.d.ts +0 -10
  239. package/lib/form.providers.d.ts +0 -8
  240. package/lib/formly/config/index.d.ts +0 -1
  241. package/lib/formly/config/validation.d.ts +0 -23
  242. package/lib/formly/field/checklist/checklist.field.d.ts +0 -44
  243. package/lib/formly/field/checklist/checklist.item.d.ts +0 -36
  244. package/lib/formly/field/checklist/checklist.item.field.component.d.ts +0 -43
  245. package/lib/formly/field/checklist/checklist.item.field.content.default.component.d.ts +0 -10
  246. package/lib/formly/field/checklist/checklist.item.field.d.ts +0 -7
  247. package/lib/formly/field/checklist/checklist.item.field.module.d.ts +0 -10
  248. package/lib/formly/field/checklist/index.d.ts +0 -6
  249. package/lib/formly/field/component/component.field.component.d.ts +0 -12
  250. package/lib/formly/field/component/component.field.d.ts +0 -3
  251. package/lib/formly/field/component/component.field.module.d.ts +0 -8
  252. package/lib/formly/field/component/index.d.ts +0 -3
  253. package/lib/formly/field/field.d.ts +0 -99
  254. package/lib/formly/field/form.field.module.d.ts +0 -12
  255. package/lib/formly/field/index.d.ts +0 -8
  256. package/lib/formly/field/selection/index.d.ts +0 -7
  257. package/lib/formly/field/selection/list/index.d.ts +0 -3
  258. package/lib/formly/field/selection/list/list.field.component.d.ts +0 -55
  259. package/lib/formly/field/selection/list/list.field.d.ts +0 -8
  260. package/lib/formly/field/selection/list/list.field.module.d.ts +0 -8
  261. package/lib/formly/field/selection/pickable/index.d.ts +0 -7
  262. package/lib/formly/field/selection/pickable/pickable.chip.field.component.d.ts +0 -10
  263. package/lib/formly/field/selection/pickable/pickable.d.ts +0 -26
  264. package/lib/formly/field/selection/pickable/pickable.field.d.ts +0 -8
  265. package/lib/formly/field/selection/pickable/pickable.field.directive.d.ts +0 -169
  266. package/lib/formly/field/selection/pickable/pickable.field.module.d.ts +0 -9
  267. package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +0 -39
  268. package/lib/formly/field/selection/pickable/pickable.util.d.ts +0 -14
  269. package/lib/formly/field/selection/searchable/index.d.ts +0 -8
  270. package/lib/formly/field/selection/searchable/searchable.chip.field.component.d.ts +0 -28
  271. package/lib/formly/field/selection/searchable/searchable.d.ts +0 -39
  272. package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +0 -22
  273. package/lib/formly/field/selection/searchable/searchable.field.d.ts +0 -25
  274. package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +0 -163
  275. package/lib/formly/field/selection/searchable/searchable.field.module.d.ts +0 -10
  276. package/lib/formly/field/selection/searchable/searchable.text.field.component.d.ts +0 -24
  277. package/lib/formly/field/selection/searchable/text.chip.field.d.ts +0 -8
  278. package/lib/formly/field/selection/selection.d.ts +0 -26
  279. package/lib/formly/field/selection/selection.field.d.ts +0 -38
  280. package/lib/formly/field/selection/selection.module.d.ts +0 -18
  281. package/lib/formly/field/selection/sourceselect/index.d.ts +0 -4
  282. package/lib/formly/field/selection/sourceselect/sourceselect.d.ts +0 -116
  283. package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +0 -95
  284. package/lib/formly/field/selection/sourceselect/sourceselect.field.d.ts +0 -7
  285. package/lib/formly/field/selection/sourceselect/sourceselect.field.module.d.ts +0 -8
  286. package/lib/formly/field/texteditor/index.d.ts +0 -3
  287. package/lib/formly/field/texteditor/texteditor.field.component.d.ts +0 -24
  288. package/lib/formly/field/texteditor/texteditor.field.d.ts +0 -6
  289. package/lib/formly/field/texteditor/texteditor.field.module.d.ts +0 -8
  290. package/lib/formly/field/value/array/array.field.component.d.ts +0 -89
  291. package/lib/formly/field/value/array/array.field.d.ts +0 -40
  292. package/lib/formly/field/value/array/array.field.module.d.ts +0 -8
  293. package/lib/formly/field/value/array/index.d.ts +0 -3
  294. package/lib/formly/field/value/boolean/boolean.field.d.ts +0 -8
  295. package/lib/formly/field/value/boolean/boolean.field.module.d.ts +0 -9
  296. package/lib/formly/field/value/boolean/index.d.ts +0 -2
  297. package/lib/formly/field/value/date/date.field.module.d.ts +0 -10
  298. package/lib/formly/field/value/date/date.value.d.ts +0 -32
  299. package/lib/formly/field/value/date/datetime.d.ts +0 -56
  300. package/lib/formly/field/value/date/datetime.field.component.d.ts +0 -307
  301. package/lib/formly/field/value/date/datetime.field.d.ts +0 -31
  302. package/lib/formly/field/value/date/datetime.field.service.d.ts +0 -12
  303. package/lib/formly/field/value/date/datetime.preset.d.ts +0 -2
  304. package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +0 -163
  305. package/lib/formly/field/value/date/index.d.ts +0 -9
  306. package/lib/formly/field/value/hidden.field.d.ts +0 -4
  307. package/lib/formly/field/value/index.d.ts +0 -8
  308. package/lib/formly/field/value/number/index.d.ts +0 -2
  309. package/lib/formly/field/value/number/number.field.d.ts +0 -46
  310. package/lib/formly/field/value/number/number.field.module.d.ts +0 -8
  311. package/lib/formly/field/value/phone/index.d.ts +0 -3
  312. package/lib/formly/field/value/phone/phone.field.component.d.ts +0 -35
  313. package/lib/formly/field/value/phone/phone.field.d.ts +0 -28
  314. package/lib/formly/field/value/phone/phone.field.module.d.ts +0 -8
  315. package/lib/formly/field/value/text/index.d.ts +0 -4
  316. package/lib/formly/field/value/text/text.additional.field.d.ts +0 -24
  317. package/lib/formly/field/value/text/text.address.field.d.ts +0 -43
  318. package/lib/formly/field/value/text/text.field.d.ts +0 -21
  319. package/lib/formly/field/value/text/text.field.module.d.ts +0 -10
  320. package/lib/formly/field/value/value.module.d.ts +0 -21
  321. package/lib/formly/field/wrapper/autotouch.wrapper.component.d.ts +0 -11
  322. package/lib/formly/field/wrapper/expand.wrapper.component.d.ts +0 -14
  323. package/lib/formly/field/wrapper/expand.wrapper.delegate.d.ts +0 -31
  324. package/lib/formly/field/wrapper/flex.wrapper.component.d.ts +0 -25
  325. package/lib/formly/field/wrapper/index.d.ts +0 -12
  326. package/lib/formly/field/wrapper/info.wrapper.component.d.ts +0 -11
  327. package/lib/formly/field/wrapper/section.wrapper.component.d.ts +0 -10
  328. package/lib/formly/field/wrapper/style.wrapper.component.d.ts +0 -27
  329. package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +0 -10
  330. package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +0 -17
  331. package/lib/formly/field/wrapper/working.wrapper.component.d.ts +0 -21
  332. package/lib/formly/field/wrapper/wrapper.d.ts +0 -35
  333. package/lib/formly/field/wrapper/wrapper.key.d.ts +0 -9
  334. package/lib/formly/field/wrapper/wrapper.module.d.ts +0 -17
  335. package/lib/formly/form/form.form.d.ts +0 -11
  336. package/lib/formly/form/form.form.module.d.ts +0 -10
  337. package/lib/formly/form/index.d.ts +0 -3
  338. package/lib/formly/form/search.form.component.d.ts +0 -12
  339. package/lib/formly/formly.component.template.d.ts +0 -19
  340. package/lib/formly/formly.context.d.ts +0 -57
  341. package/lib/formly/formly.context.directive.d.ts +0 -17
  342. package/lib/formly/formly.directive.d.ts +0 -54
  343. package/lib/formly/formly.form.component.d.ts +0 -51
  344. package/lib/formly/formly.module.d.ts +0 -15
  345. package/lib/formly/formly.providers.d.ts +0 -1
  346. package/lib/formly/index.d.ts +0 -11
  347. package/lib/formly/template/available.d.ts +0 -7
  348. package/lib/formly/template/available.module.d.ts +0 -8
  349. package/lib/formly/template/index.d.ts +0 -7
  350. package/lib/formly/template/login.d.ts +0 -66
  351. package/lib/formly/template/login.module.d.ts +0 -7
  352. package/lib/formly/template/timezone.d.ts +0 -20
  353. package/lib/formly/template/timezone.module.d.ts +0 -7
  354. package/lib/formly/template/website.d.ts +0 -15
  355. package/lib/index.d.ts +0 -6
  356. package/lib/layout/form.layout.module.d.ts +0 -10
  357. package/lib/layout/form.spacer.directive.d.ts +0 -8
  358. package/lib/layout/index.d.ts +0 -2
  359. package/lib/validator/available.d.ts +0 -30
  360. package/lib/validator/boolean.d.ts +0 -2
  361. package/lib/validator/email.d.ts +0 -2
  362. package/lib/validator/field.d.ts +0 -32
  363. package/lib/validator/index.d.ts +0 -7
  364. package/lib/validator/number.d.ts +0 -23
  365. package/lib/validator/phone.d.ts +0 -16
  366. package/lib/validator/website.d.ts +0 -31
  367. package/mapbox/index.d.ts +0 -2
  368. package/mapbox/lib/field/index.d.ts +0 -2
  369. package/mapbox/lib/field/latlng/index.d.ts +0 -4
  370. package/mapbox/lib/field/latlng/latlng.field.component.d.ts +0 -116
  371. package/mapbox/lib/field/latlng/latlng.field.d.ts +0 -6
  372. package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +0 -12
  373. package/mapbox/lib/field/latlng/latlng.module.d.ts +0 -8
  374. package/mapbox/lib/field/zoom/index.d.ts +0 -3
  375. package/mapbox/lib/field/zoom/zoom.field.component.d.ts +0 -68
  376. package/mapbox/lib/field/zoom/zoom.field.d.ts +0 -6
  377. package/mapbox/lib/field/zoom/zoom.module.d.ts +0 -8
  378. package/mapbox/lib/mapbox.module.d.ts +0 -8
@@ -1,785 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { dateCellDayOfWeekFactory, dateCellTimingDateFactory, dateCellScheduleDateFilter, copyDateCellScheduleDateFilterConfig, DateCellScheduleDayCode, dateCellScheduleEncodedWeek, dateCellTimingRelativeIndexFactory, expandDateCellScheduleDayCodes, expandDateCellScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateCellRangeFunction, isSameDate, isSameDateDay, isSameDateRange, dateCellTimingRelativeIndexArrayFactory, isInfiniteDateRange, dateTimezoneUtcNormal, expandDateCellScheduleRange, formatToISO8601DayStringForSystem, dateCellScheduleDayCodesAreSetsEquivalent, simplifyDateCellScheduleDayCodes, fullWeekDateCellScheduleDayCodes, dateCellTimingStartDateFactory, dateCellTimingStartsAtForStartOfDay, isSameDateCellScheduleDateRange, fullDateCellScheduleRange, dateCellTimingTimezoneNormalInstance, changeDateCellScheduleDateRangeToTimezone, SYSTEM_DATE_TIMEZONE_UTC_NORMAL_INSTANCE } from '@dereekb/date';
3
- import { distinctUntilHasDifferentValues, filterMaybe } from '@dereekb/rxjs';
4
- import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, range, unique, mergeArrays, mapValuesToSet, isInAllowedDaysOfWeekSet, firstValueFromIterable, isIterable, removeFromSet } from '@dereekb/util';
5
- import { ComponentStore } from '@ngrx/component-store';
6
- import { startOfDay, endOfDay, isBefore } from 'date-fns';
7
- import { distinctUntilChanged, map, shareReplay, switchMap, tap, first, combineLatestWith, of } from 'rxjs';
8
- import { defaultCalendarScheduleSelectionCellContentFactory } from './calendar.schedule.selection';
9
- import * as i0 from "@angular/core";
10
- export function initialCalendarScheduleSelectionState() {
11
- const defaultScheduleDays = new Set([DateCellScheduleDayCode.WEEKDAY, DateCellScheduleDayCode.WEEKEND]);
12
- const allowedDaysOfWeek = expandDateCellScheduleDayCodesToDayOfWeekSet(defaultScheduleDays);
13
- const defaultStartsAt = dateCellTimingStartsAtForStartOfDay(); // get midnight of the current timezone
14
- const { startsAt, timezone: systemTimezone } = defaultStartsAt;
15
- const indexFactory = dateCellTimingRelativeIndexFactory(defaultStartsAt);
16
- const indexDayOfWeek = dateCellDayOfWeekFactory(startsAt);
17
- return {
18
- selectionMode: 'multiple',
19
- start: startsAt,
20
- systemTimezone,
21
- indexFactory,
22
- toggledIndexes: new Set(),
23
- defaultScheduleDays,
24
- effectiveScheduleDays: defaultScheduleDays,
25
- allowedDaysOfWeek,
26
- indexDayOfWeek,
27
- isEnabledFilterDay: () => true,
28
- isEnabledDay: () => false,
29
- computeSelectionResultRelativeToFilter: true,
30
- cellContentFactory: defaultCalendarScheduleSelectionCellContentFactory
31
- };
32
- }
33
- /**
34
- * This is used in cases where the dates in the min/max date range need to be shifted to the filter's timezone.
35
- *
36
- * This is because the index factory is always in system timezone, but when selecting all/none with a filter we need to use the filter's timezone.
37
- *
38
- * @param x
39
- * @returns
40
- */
41
- function calendarScheduleMinAndMaxDateRangeRelativeToFilter(x) {
42
- let input = x;
43
- if (x.filter?.timezone && x.minMaxDateRange != null) {
44
- const filterNormal = dateTimezoneUtcNormal(x.filter.timezone);
45
- const transformFn = filterNormal.transformFunction('systemDateToTargetDate');
46
- input = {
47
- filter: x.filter,
48
- minMaxDateRange: {
49
- start: x.minMaxDateRange.start ? transformFn(x.minMaxDateRange.start) : undefined,
50
- end: x.minMaxDateRange.end ? transformFn(x.minMaxDateRange.end) : undefined
51
- }
52
- };
53
- }
54
- return calendarScheduleMinAndMaxDateRange(input);
55
- }
56
- export function calendarScheduleMinAndMaxDateRange(x) {
57
- return {
58
- start: calendarScheduleMinDate(x) || undefined,
59
- end: calendarScheduleMaxDate(x) || undefined
60
- };
61
- }
62
- export function calendarScheduleMinDate(x) {
63
- return findMaxDate([x.filter?.start, x.minMaxDateRange?.start]);
64
- }
65
- export function calendarScheduleMaxDate(x) {
66
- return findMinDate([x.filter?.end, x.minMaxDateRange?.end]);
67
- }
68
- export function calendarScheduleStartBeingUsedFromFilter(x) {
69
- return x.computeSelectionResultRelativeToFilter && x.filter?.start != null; // may be using either
70
- }
71
- export class DbxCalendarScheduleSelectionStore extends ComponentStore {
72
- constructor() {
73
- super(initialCalendarScheduleSelectionState());
74
- }
75
- // MARK:
76
- toggleSelection = this.effect((input) => {
77
- return input.pipe(switchMap(() => this.nextToggleSelection$.pipe(first(), filterMaybe(), tap((x) => {
78
- this.selectAllDates(x);
79
- }))));
80
- });
81
- // MARK: Accessors
82
- selectionMode$ = this.state$.pipe(map((x) => x.selectionMode), distinctUntilChanged(), shareReplay(1));
83
- filter$ = this.state$.pipe(map((x) => x.filter), distinctUntilChanged(), shareReplay(1));
84
- minMaxDateRange$ = this.state$.pipe(map(calendarScheduleMinAndMaxDateRange), distinctUntilChanged(isSameDateRange), shareReplay(1));
85
- minDate$ = this.minMaxDateRange$.pipe(map((x) => x?.start), distinctUntilChanged(isSameDateDay), shareReplay(1));
86
- maxDate$ = this.minMaxDateRange$.pipe(map((x) => x?.end), distinctUntilChanged(isSameDateDay), shareReplay(1));
87
- hasConfiguredMinMaxRange$ = this.minMaxDateRange$.pipe(map((x) => x != null && x.start != null && x.end != null), distinctUntilChanged(), shareReplay(1));
88
- inputStart$ = this.state$.pipe(map((x) => x.inputStart), distinctUntilChanged(isSameDate), shareReplay(1));
89
- inputEnd$ = this.state$.pipe(map((x) => x.inputEnd), distinctUntilChanged(isSameDate), shareReplay(1));
90
- currentInputRange$ = this.state$.pipe(map(({ inputStart, inputEnd }) => ({ start: inputStart, end: inputEnd })), distinctUntilChanged((a, b) => isSameDateRange(a, b)), map((x) => ({ inputStart: x.start, inputEnd: x.end })), map((x) => {
91
- if (x.inputStart && x.inputEnd) {
92
- return x;
93
- }
94
- else {
95
- return undefined;
96
- }
97
- }), shareReplay(1));
98
- inputRange$ = this.currentInputRange$.pipe(filterMaybe(), shareReplay(1));
99
- isEnabledFilterDayFunction$ = this.state$.pipe(map((x) => x.isEnabledFilterDay), distinctUntilChanged(), shareReplay(1));
100
- isEnabledDayFunction$ = this.state$.pipe(map((x) => x.isEnabledDay), distinctUntilChanged(), shareReplay(1));
101
- currentDateRange$ = this.state$.pipe(map(computeCalendarScheduleSelectionRange), distinctUntilChanged((a, b) => isSameDateRange(a, b)), shareReplay(1));
102
- computeSelectionResultRelativeToFilter$ = this.state$.pipe(map((x) => x.computeSelectionResultRelativeToFilter), shareReplay(1));
103
- startBeingUsedFromFilter$ = this.state$.pipe(
104
- //
105
- map(calendarScheduleStartBeingUsedFromFilter), distinctUntilChanged(), shareReplay(1));
106
- dateRange$ = this.currentDateRange$.pipe(filterMaybe(), shareReplay(1));
107
- allowedDaysOfWeek$ = this.state$.pipe(map((x) => x.allowedDaysOfWeek), distinctUntilHasDifferentValues(), shareReplay(1));
108
- isInAllowedDaysOfWeekFunction$ = this.allowedDaysOfWeek$.pipe(map((x) => isInAllowedDaysOfWeekSet(x)), shareReplay(1));
109
- scheduleDays$ = this.state$.pipe(map((x) => x.effectiveScheduleDays), distinctUntilHasDifferentValues(), shareReplay(1));
110
- outputTimezone$ = this.state$.pipe(map((x) => x.outputTimezone), distinctUntilChanged(), shareReplay(1));
111
- /**
112
- * The timezone of the output values.
113
- *
114
- * If an outputTimezone is not specified, this defaults to the system timezone.
115
- */
116
- effectiveOutputTimezone$ = this.state$.pipe(map((x) => x.outputTimezone || x.systemTimezone), distinctUntilChanged(), shareReplay(1));
117
- /**
118
- * An outputTimezoneNormal to use.
119
- *
120
- * If an outputTimezone is not specified, this is undefined.
121
- */
122
- effectiveOutputTimezoneNormal$ = this.state$.pipe(map((x) => (x.outputTimezoneNormal ? x.outputTimezoneNormal : undefined)), distinctUntilChanged(), shareReplay(1));
123
- currentSelectionValue$ = this.state$.pipe(map((x) => x.currentSelectionValue), distinctUntilChanged(), shareReplay(1));
124
- currentSelectionValueStart$ = this.currentSelectionValue$.pipe(map((x) => x?.dateScheduleRange.start), distinctUntilChanged(isSameDate), shareReplay(1));
125
- currentSelectionValueDateCellTimingDateFactory$ = this.currentSelectionValue$.pipe(map((x) => (x ? dateCellTimingDateFactory({ startsAt: x.dateScheduleRange.start, timezone: x.dateScheduleRange.timezone }) : undefined)), shareReplay(1));
126
- currentSelectionValueDateCellDurationSpanExpansion$ = this.currentSelectionValue$.pipe(map((x) => (x ? expandDateCellScheduleRange({ dateCellScheduleRange: x.dateScheduleRange }) : [])), shareReplay(1));
127
- selectionValueSelectedIndexes$ = this.currentSelectionValueDateCellDurationSpanExpansion$.pipe(map((x) => new Set(x.map((y) => y.i))), distinctUntilHasDifferentValues(), shareReplay(1));
128
- selectionValueSelectedDates$ = this.currentSelectionValueDateCellTimingDateFactory$.pipe(switchMap((dateFactory) => {
129
- return dateFactory ? this.selectionValueSelectedIndexes$.pipe(map((x) => mapValuesToSet(x, (y) => formatToISO8601DayStringForSystem(dateFactory(y))))) : of(new Set());
130
- }), shareReplay(1));
131
- selectionValue$ = this.currentSelectionValue$.pipe(filterMaybe(), shareReplay(1));
132
- currentSelectionValueWithTimezone$ = this.currentSelectionValue$.pipe(combineLatestWith(this.effectiveOutputTimezoneNormal$), map(([x, timezoneNormal]) => {
133
- let currentValueWithTimezone = x;
134
- if (x && timezoneNormal) {
135
- currentValueWithTimezone = {
136
- dateScheduleRange: changeDateCellScheduleDateRangeToTimezone(x.dateScheduleRange, timezoneNormal),
137
- minMaxRange: x.minMaxRange
138
- };
139
- }
140
- return currentValueWithTimezone;
141
- }), distinctUntilChanged(), shareReplay(1));
142
- selectionValueWithTimezone$ = this.currentSelectionValueWithTimezone$.pipe(filterMaybe(), shareReplay(1));
143
- selectionValueWithTimezoneDateCellDurationSpanExpansion$ = this.selectionValueWithTimezone$.pipe(map((x) => expandDateCellScheduleRange({ dateCellScheduleRange: x.dateScheduleRange })), shareReplay(1));
144
- nextToggleSelection$ = this.hasConfiguredMinMaxRange$.pipe(switchMap((hasConfiguredMinMaxRange) => {
145
- let obs;
146
- if (hasConfiguredMinMaxRange) {
147
- obs = this.currentSelectionValue$.pipe(map((x) => (x ? 'none' : 'all')));
148
- }
149
- else {
150
- obs = this.currentSelectionValue$.pipe(map((x) => (x ? 'none' : undefined)));
151
- }
152
- return obs;
153
- }), shareReplay(1));
154
- currentDateCellScheduleRangeValue$ = this.currentSelectionValueWithTimezone$.pipe(map((x) => x?.dateScheduleRange), distinctUntilChanged(isSameDateCellScheduleDateRange), shareReplay(1));
155
- dateCellScheduleRangeValue$ = this.currentDateCellScheduleRangeValue$.pipe(filterMaybe(), shareReplay(1));
156
- cellContentFactory$ = this.state$.pipe(map((x) => x.cellContentFactory), distinctUntilChanged(), shareReplay(1));
157
- isCustomized$ = this.state$.pipe(map((x) => x.toggledIndexes.size > 0), distinctUntilChanged(), shareReplay(1));
158
- isViewReadonly$ = this.state$.pipe(map((x) => x.isViewReadonly), distinctUntilChanged(), shareReplay(1));
159
- // MARK: State Changes
160
- setMinMaxDateRange = this.updater(updateStateWithMinMaxDateRange);
161
- setDefaultWeek = this.updater(updateStateWithMinMaxDateRange);
162
- setFilter = this.updater(updateStateWithFilter);
163
- setExclusions = this.updater(updateStateWithExclusions);
164
- setComputeSelectionResultRelativeToFilter = this.updater(updateStateWithComputeSelectionResultRelativeToFilter);
165
- clearFilter = this.updater((state) => updateStateWithFilter(state, undefined));
166
- setOutputTimezone = this.updater(updateStateWithTimezoneValue);
167
- /**
168
- * Sets the "input" date range. This is the range that gets displayed on the date range picker.
169
- */
170
- setInputRange = this.updater(updateStateWithChangedRange);
171
- // NOTE: Selected dates are NOT selected indexes. They are the internal selected dates that are excluded from the selection.
172
- toggleSelectedDates = this.updater((state, toggle) => updateStateWithChangedDates(state, { toggle }));
173
- addSelectedDates = this.updater((state, add) => updateStateWithChangedDates(state, { add }));
174
- removeSelectedDates = this.updater((state, remove) => updateStateWithChangedDates(state, { remove }));
175
- setSelectedDates = this.updater((state, set) => updateStateWithChangedDates(state, { set }));
176
- selectAllDates = this.updater((state, selectAll = 'all') => updateStateWithChangedDates(state, { selectAll }));
177
- // NOTE: Selected indexes are the typical/expected indexes that are selected or not.
178
- setSelectedIndexes = this.updater((state, set) => updateStateWithChangedDates(state, { set, invertSetBehavior: true }));
179
- setInitialSelectionState = this.updater(updateStateWithInitialSelectionState);
180
- setDefaultScheduleDays = this.updater(updateStateWithChangedDefaultScheduleDays);
181
- setScheduleDays = this.updater(updateStateWithChangedScheduleDays);
182
- setAllowAllScheduleDays = this.updater((state) => updateStateWithChangedScheduleDays(state, [DateCellScheduleDayCode.WEEKDAY, DateCellScheduleDayCode.WEEKEND]));
183
- setDateScheduleRangeValue = this.updater((state, value) => updateStateWithDateCellScheduleRangeValue(state, value));
184
- setCellContentFactory = this.updater((state, cellContentFactory) => ({ ...state, cellContentFactory }));
185
- /**
186
- * Sets the selection mode.
187
- */
188
- setSelectionMode = this.updater(updateStateWithSelectionMode);
189
- /**
190
- * Used by the parent view to propogate a readonly state.
191
- *
192
- * Should typically not be used by the user directly with the intention of the parent synchronizing to this state.
193
- */
194
- setViewReadonlyState = this.updater((state, isViewReadonly) => ({ ...state, isViewReadonly }));
195
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxCalendarScheduleSelectionStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
196
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxCalendarScheduleSelectionStore });
197
- }
198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxCalendarScheduleSelectionStore, decorators: [{
199
- type: Injectable
200
- }], ctorParameters: () => [] });
201
- export function updateStateWithInitialSelectionState(state, initialSelectionState) {
202
- const { toggledIndexes } = state;
203
- if (toggledIndexes.size === 0 && initialSelectionState === 'all') {
204
- state = updateStateWithChangedDates(state, { selectAll: initialSelectionState });
205
- }
206
- return { ...state, initialSelectionState };
207
- }
208
- export function updateStateWithComputeSelectionResultRelativeToFilter(currentState, computeSelectionResultRelativeToFilter) {
209
- let state = { ...currentState, computeSelectionResultRelativeToFilter };
210
- if (Boolean(currentState.computeSelectionResultRelativeToFilter) !== Boolean(computeSelectionResultRelativeToFilter)) {
211
- state = updateStateWithChangedDates(state, {}); // recalculate if change occurs as it will affect the output value
212
- }
213
- return state;
214
- }
215
- export function updateStateWithExclusions(state, inputExclusions) {
216
- let computedExclusions;
217
- if (inputExclusions) {
218
- const { indexFactory } = state;
219
- const indexArrayFactory = dateCellTimingRelativeIndexArrayFactory(indexFactory);
220
- computedExclusions = indexArrayFactory(inputExclusions);
221
- }
222
- state = { ...state, inputExclusions, computedExclusions };
223
- return updateStateWithFilter(state, state.filter);
224
- }
225
- export function updateStateWithMinMaxDateRange(state, minMaxDateRange) {
226
- if (minMaxDateRange != null && !isInfiniteDateRange(minMaxDateRange)) {
227
- state = {
228
- ...state,
229
- minMaxDateRange: {
230
- start: minMaxDateRange.start != null ? startOfDay(minMaxDateRange.start) : undefined,
231
- end: minMaxDateRange.end != null ? endOfDay(minMaxDateRange.end) : undefined
232
- }
233
- };
234
- }
235
- else {
236
- state = { ...state, minMaxDateRange: undefined };
237
- }
238
- return updateStateWithFilter(state, state.filter);
239
- }
240
- export function updateStateWithFilter(currentState, inputFilter) {
241
- const { computedExclusions: exclusions, minMaxDateRange, systemTimezone } = currentState;
242
- let isEnabledFilterDay = () => true;
243
- let filter = null;
244
- // create the filter using inputFilter, exclusions, and minMaxDateRange
245
- if (inputFilter || exclusions?.length || minMaxDateRange) {
246
- let enabledFilter;
247
- let filterStart = null; // the start date that will be used/set on the filter.
248
- if (inputFilter) {
249
- filter = copyDateCellScheduleDateFilterConfig(inputFilter); // copy filter
250
- let nextFilterTimezone; // only set if inputFilter.start or inputFilter.startsAt
251
- // configure filter start
252
- if (inputFilter.start) {
253
- filterStart = inputFilter.start;
254
- // if no timezone is specified, then use the system timezone and align filterStart to the start of the day.
255
- if (!inputFilter.timezone) {
256
- filterStart = SYSTEM_DATE_TIMEZONE_UTC_NORMAL_INSTANCE.startOfDayInTargetTimezone(inputFilter.startsAt);
257
- nextFilterTimezone = systemTimezone;
258
- }
259
- else {
260
- nextFilterTimezone = inputFilter.timezone;
261
- }
262
- }
263
- else if (inputFilter.startsAt) {
264
- if (inputFilter.timezone) {
265
- // if no timezone is provided, use startsAt as-is
266
- const timezoneNormal = dateTimezoneUtcNormal(inputFilter.timezone);
267
- filterStart = timezoneNormal.startOfDayInTargetTimezone(inputFilter.startsAt);
268
- nextFilterTimezone = inputFilter.timezone;
269
- }
270
- else {
271
- // set to the start of today in the system timezone.
272
- filterStart = SYSTEM_DATE_TIMEZONE_UTC_NORMAL_INSTANCE.startOfDayInTargetTimezone(inputFilter.startsAt);
273
- nextFilterTimezone = systemTimezone;
274
- }
275
- }
276
- filter.start = filterStart ?? undefined;
277
- filter.timezone = nextFilterTimezone;
278
- // configure exclusions
279
- if (exclusions?.length) {
280
- enabledFilter = {
281
- ...filter,
282
- ex: unique(mergeArrays([filter.ex, exclusions]))
283
- };
284
- }
285
- else {
286
- enabledFilter = filter;
287
- }
288
- }
289
- else {
290
- enabledFilter = {
291
- w: '89',
292
- ex: exclusions
293
- };
294
- }
295
- if (minMaxDateRange) {
296
- enabledFilter.minMaxDateRange = minMaxDateRange;
297
- enabledFilter.setStartAsMinDate = filterStart ? true : false; // If a start date is set, then it becomes the floor.
298
- }
299
- /**
300
- * If the input filter has a start date, use that as the relative start to ensure indexes are compared the same,
301
- * otherwise use the state's start. This is important for the index calculations.
302
- */
303
- let finalEnabledStart;
304
- let finalEnabledTimezone;
305
- // filter?.start ?? state.start;
306
- if (!enabledFilter.start) {
307
- // use the current state's start, but make sure it is in the proper timezone.
308
- if (enabledFilter.timezone) {
309
- const timezoneNormal = dateTimezoneUtcNormal(enabledFilter.timezone);
310
- finalEnabledStart = timezoneNormal.startOfDayInTargetTimezone(currentState.start); // get the start of the day for the current start
311
- finalEnabledTimezone = enabledFilter.timezone;
312
- }
313
- else {
314
- finalEnabledStart = currentState.start;
315
- finalEnabledTimezone = systemTimezone;
316
- }
317
- }
318
- else if (!enabledFilter.timezone) {
319
- finalEnabledTimezone = systemTimezone;
320
- const timezoneNormal = dateTimezoneUtcNormal(finalEnabledTimezone);
321
- finalEnabledStart = timezoneNormal.startOfDayInTargetTimezone(enabledFilter.start); // get the start of the day for the target timezone
322
- }
323
- else {
324
- finalEnabledStart = enabledFilter.start;
325
- finalEnabledTimezone = enabledFilter.timezone;
326
- }
327
- enabledFilter.start = finalEnabledStart;
328
- enabledFilter.timezone = finalEnabledTimezone;
329
- // create the filter
330
- isEnabledFilterDay = dateCellScheduleDateFilter(enabledFilter);
331
- }
332
- let nextState = { ...currentState, filter, isEnabledFilterDay };
333
- // For the same reason as above, use the filter's start date as the relative start if applicable.
334
- if (filter && filter.start) {
335
- let startForSystemTimezone = filter.start;
336
- if (filter.timezone) {
337
- const timezoneNormal = dateTimezoneUtcNormal(filter.timezone);
338
- startForSystemTimezone = timezoneNormal.systemDateToTargetDate(filter.start); // get the start of the day for the system timezone
339
- }
340
- nextState.start = startForSystemTimezone;
341
- nextState.indexFactory = dateCellTimingRelativeIndexFactory({ startsAt: startForSystemTimezone, timezone: systemTimezone });
342
- nextState.indexDayOfWeek = dateCellDayOfWeekFactory(startForSystemTimezone);
343
- }
344
- // attempt to re-apply the initial selection state once filter is applied
345
- if (nextState.initialSelectionState) {
346
- nextState = updateStateWithInitialSelectionState(nextState, nextState.initialSelectionState);
347
- }
348
- // re-calculate the selection given the filter
349
- const { inputStart, inputEnd } = nextState;
350
- if (inputStart && inputEnd) {
351
- nextState = updateStateWithChangedRange(nextState, { inputStart, inputEnd });
352
- }
353
- return nextState;
354
- }
355
- export function updateStateWithTimezoneValue(state, timezone) {
356
- const { currentSelectionValue } = state;
357
- const timezoneNormal = timezone ? dateTimezoneUtcNormal({ timezone }) : undefined;
358
- if (timezoneNormal && currentSelectionValue) {
359
- // update the selection value to reflect the timezone changes.
360
- const { dateScheduleRange: currentDateCellScheduleRange } = currentSelectionValue;
361
- const start = timezoneNormal.targetDateToSystemDate(currentDateCellScheduleRange.start);
362
- const end = timezoneNormal.targetDateToSystemDate(currentDateCellScheduleRange.end);
363
- const newRange = {
364
- ...currentSelectionValue.dateScheduleRange,
365
- start,
366
- end
367
- };
368
- return updateStateWithDateCellScheduleRangeValue({ ...state, outputTimezone: timezone, outputTimezoneNormal: timezoneNormal }, newRange);
369
- }
370
- else {
371
- return { ...state, outputTimezone: timezone, outputTimezoneNormal: timezoneNormal }; // no change in value
372
- }
373
- }
374
- export function updateStateWithDateCellScheduleRangeValue(state, inputChange) {
375
- const { currentSelectionValue, systemTimezone } = state;
376
- const currentDateCellScheduleRange = currentSelectionValue?.dateScheduleRange; // current range is always in system time
377
- let change;
378
- // When using timezones, always return from the start of the day. Inputs are converted to the system time and used as the start of the day.
379
- // Outputs remain accurate.
380
- if (inputChange) {
381
- // make sure a timezone is set. Input may not have a timezone attached. Default to system time.
382
- const inputChangeWithTimezoneSet = {
383
- ...inputChange,
384
- timezone: inputChange.timezone ?? systemTimezone
385
- };
386
- // calculate the schedule range
387
- const fullChange = fullDateCellScheduleRange({ dateCellScheduleRange: inputChangeWithTimezoneSet });
388
- const inputNormal = dateCellTimingTimezoneNormalInstance(fullChange);
389
- const startInSystemTz = inputNormal.systemDateToTargetDate(fullChange.start);
390
- const endInSystemTz = startOfDay(inputNormal.systemDateToTargetDate(fullChange.end));
391
- // convert the start/end to system time
392
- change = {
393
- start: startInSystemTz,
394
- end: endInSystemTz,
395
- w: fullChange.w,
396
- ex: fullChange.ex,
397
- timezone: fullChange.timezone
398
- };
399
- }
400
- const isSameValue = isSameDateCellScheduleDateRange(currentDateCellScheduleRange, change);
401
- if (isSameValue) {
402
- return state;
403
- }
404
- else {
405
- if (change != null) {
406
- const nextState = { ...state, inputStart: change.start, inputEnd: change.end, toggledIndexes: new Set(change.ex) };
407
- return updateStateWithChangedScheduleDays(finalizeNewCalendarScheduleSelectionState(nextState), expandDateCellScheduleDayCodes(change.w || '89'));
408
- }
409
- else {
410
- return noSelectionCalendarScheduleSelectionState(state); // clear selection, retain disabled days
411
- }
412
- }
413
- }
414
- export function updateStateWithChangedDefaultScheduleDays(state, change) {
415
- const { defaultScheduleDays: currentDefaultScheduleDays } = state;
416
- const defaultScheduleDays = new Set(change ?? fullWeekDateCellScheduleDayCodes());
417
- if (dateCellScheduleDayCodesAreSetsEquivalent(defaultScheduleDays, currentDefaultScheduleDays)) {
418
- return state; // no change
419
- }
420
- else {
421
- return finalizeUpdateStateWithChangedScheduleDays(state, { ...state, defaultScheduleDays });
422
- }
423
- }
424
- export function updateStateWithChangedScheduleDays(state, change) {
425
- const { scheduleDays: currentScheduleDays } = state;
426
- const scheduleDays = new Set(change ?? []);
427
- let newScheduleDays;
428
- if (currentScheduleDays != null && change != null) {
429
- if (dateCellScheduleDayCodesAreSetsEquivalent(scheduleDays, currentScheduleDays)) {
430
- newScheduleDays = undefined; //no change
431
- }
432
- else {
433
- newScheduleDays = scheduleDays;
434
- }
435
- }
436
- else if (currentScheduleDays !== change) {
437
- newScheduleDays = change ? scheduleDays : null; // set the new one, or clear it
438
- }
439
- if (newScheduleDays === undefined) {
440
- return state;
441
- }
442
- else {
443
- return finalizeUpdateStateWithChangedScheduleDays(state, { ...state, scheduleDays: newScheduleDays ?? undefined });
444
- }
445
- }
446
- export function updateStateWithSelectionMode(state, selectionMode) {
447
- const { selectionMode: currentSelectionMode } = state;
448
- if (currentSelectionMode !== selectionMode) {
449
- const nextState = { ...state, selectionMode };
450
- if (selectionMode === 'multiple') {
451
- return nextState;
452
- }
453
- else {
454
- const currentSelectionRange = computeCalendarScheduleSelectionDateCellRange(nextState);
455
- return currentSelectionRange ? updateStateWithChangedDates(nextState, { set: [currentSelectionRange.i], invertSetBehavior: true }) : nextState;
456
- }
457
- }
458
- else {
459
- return state;
460
- }
461
- }
462
- export function finalizeUpdateStateWithChangedScheduleDays(previousState, nextState) {
463
- const previousScheduleDays = previousState.effectiveScheduleDays;
464
- const nextScheduleDays = nextState.scheduleDays ?? nextState.defaultScheduleDays;
465
- if (dateCellScheduleDayCodesAreSetsEquivalent(nextScheduleDays, previousScheduleDays)) {
466
- return nextState; // the default or input schedule changed but the schedule is still the same, so no need for an update.
467
- }
468
- else {
469
- const effectiveScheduleDays = new Set(simplifyDateCellScheduleDayCodes(nextScheduleDays));
470
- const allowedDaysOfWeek = expandDateCellScheduleDayCodesToDayOfWeekSet(nextScheduleDays);
471
- return finalizeNewCalendarScheduleSelectionState({
472
- ...nextState,
473
- // update the effective schedule days and allowed days of week
474
- effectiveScheduleDays,
475
- allowedDaysOfWeek
476
- });
477
- }
478
- }
479
- export function updateStateWithChangedDates(state, change) {
480
- const { selectionMode, allowedDaysOfWeek, indexFactory, indexDayOfWeek, inputStart: currentInputStart, inputEnd: currentInputEnd, minMaxDateRange, filter } = state;
481
- const { start: minDateFromFilter, end: maxDateFromFilter } = calendarScheduleMinAndMaxDateRangeRelativeToFilter(state);
482
- let inputStart = currentInputStart;
483
- let inputEnd = currentInputEnd;
484
- /**
485
- * This is a set of indexes that are internally "selected" so that they are excluded from the inputStart/inputEnd date range.
486
- *
487
- * Do not confuse this with the actual indexes that are selected.
488
- */
489
- let toggledIndexes;
490
- function asIndexes(indexes) {
491
- return iterableToArray(indexes).map(indexFactory);
492
- }
493
- // When using selection mode "single" we update the change to reflect the single selection.
494
- if (selectionMode === 'single') {
495
- function setFromFirstValue(input) {
496
- const firstValue = isIterable(input) ? firstValueFromIterable(input) : input;
497
- const set = new Set();
498
- if (firstValue != null) {
499
- set.add(firstValue);
500
- }
501
- return set;
502
- }
503
- if (change.set) {
504
- change = { set: setFromFirstValue(change.set), invertSetBehavior: true };
505
- }
506
- else if (change.toggle) {
507
- const nextSet = setFromFirstValue(change.toggle);
508
- if (nextSet.size) {
509
- const firstSetValueIndex = indexFactory(firstValueFromIterable(nextSet));
510
- if (state.toggledIndexes.has(firstSetValueIndex) || (inputStart && indexFactory(inputStart) === firstSetValueIndex)) {
511
- nextSet.clear(); // clear with the next set
512
- }
513
- change = { set: nextSet, invertSetBehavior: true };
514
- }
515
- }
516
- // set, selectAll, add, and remove are treated as they normally are.
517
- }
518
- if (change.reset || change.selectAll != null || change.set != null) {
519
- let set = change.set ?? [];
520
- const selectAll = change.reset === true ? state.initialSelectionState : change.selectAll;
521
- switch (selectAll) {
522
- case 'all':
523
- if (minDateFromFilter != null && maxDateFromFilter != null) {
524
- inputStart = minDateFromFilter;
525
- inputEnd = maxDateFromFilter;
526
- set = [];
527
- }
528
- break;
529
- case 'none':
530
- inputStart = null;
531
- inputEnd = null;
532
- set = [];
533
- break;
534
- }
535
- const inputSetIndexes = asIndexes(set);
536
- toggledIndexes = new Set(inputSetIndexes);
537
- if (change.invertSetBehavior && !selectAll) {
538
- let minIndex;
539
- let maxIndex;
540
- if (minDateFromFilter != null && maxDateFromFilter != null) {
541
- // only applicable when the filter is set.
542
- minIndex = indexFactory(minDateFromFilter);
543
- maxIndex = indexFactory(maxDateFromFilter);
544
- inputStart = minDateFromFilter;
545
- inputEnd = maxDateFromFilter;
546
- }
547
- else {
548
- // when the filter is not set, use the least and greatest indexes from the input set.
549
- const minAndMax = minAndMaxNumber(inputSetIndexes);
550
- if (minAndMax != null) {
551
- minIndex = minAndMax.min;
552
- maxIndex = minAndMax.max;
553
- const dateFactory = dateCellTimingStartDateFactory(indexFactory._timing);
554
- inputStart = dateFactory(minAndMax.min);
555
- inputEnd = minAndMax.min === minAndMax.max ? inputStart : dateFactory(minAndMax.max);
556
- }
557
- else {
558
- // equivalent to an empty set / using "none" with selectAll.
559
- inputStart = null;
560
- inputEnd = null;
561
- toggledIndexes = new Set();
562
- }
563
- }
564
- // toggledIndexes should not include any indexes we want to include
565
- if (minIndex != null && maxIndex != null) {
566
- toggledIndexes = new Set(range(minIndex, maxIndex + 1).filter((x) => !toggledIndexes.has(x)));
567
- }
568
- }
569
- }
570
- else {
571
- toggledIndexes = new Set(state.toggledIndexes); // copy the set
572
- if (change.toggle) {
573
- const allowedToToggle = asIndexes(change.toggle).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
574
- toggleInSet(toggledIndexes, allowedToToggle);
575
- }
576
- let addToExclusion;
577
- let removeFromExclusion;
578
- if (change.add) {
579
- if (change.invertSetBehavior) {
580
- addToExclusion = change.add;
581
- }
582
- else {
583
- removeFromExclusion = change.add;
584
- }
585
- }
586
- if (change.remove) {
587
- if (change.invertSetBehavior) {
588
- removeFromExclusion = change.remove;
589
- }
590
- else {
591
- addToExclusion = change.remove;
592
- }
593
- }
594
- if (addToExclusion) {
595
- removeFromSet(toggledIndexes, asIndexes(addToExclusion));
596
- }
597
- if (removeFromExclusion) {
598
- addToSet(toggledIndexes, asIndexes(removeFromExclusion));
599
- }
600
- }
601
- const nextState = { ...state, inputStart, inputEnd, toggledIndexes };
602
- nextState.isEnabledDay = isEnabledDayInCalendarScheduleSelectionState(nextState);
603
- // Recalculate the range and simplified to exclusions
604
- const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(nextState);
605
- if (rangeAndExclusion) {
606
- return finalizeNewCalendarScheduleSelectionState({ ...nextState, toggledIndexes: new Set(rangeAndExclusion.excluded), inputStart: rangeAndExclusion.start, inputEnd: rangeAndExclusion.end });
607
- }
608
- else {
609
- // no selected days
610
- return noSelectionCalendarScheduleSelectionState(nextState);
611
- }
612
- }
613
- export function noSelectionCalendarScheduleSelectionState(state) {
614
- return finalizeNewCalendarScheduleSelectionState({ ...state, toggledIndexes: new Set(), inputStart: null, inputEnd: null });
615
- }
616
- export function updateStateWithChangedRange(state, change) {
617
- const { inputStart: currentInputStart, inputEnd: currentInputEnd, indexFactory } = state;
618
- const { start: minDate, end: maxDate } = calendarScheduleMinAndMaxDateRange(state);
619
- const inputStart = startOfDay(change.inputStart);
620
- const inputEnd = startOfDay(change.inputEnd); // midnight of the last day
621
- const isValidRange = minDate != null || maxDate != null ? isDateInDateRangeFunction({ start: minDate ?? undefined, end: maxDate ?? undefined }) : () => true;
622
- if (!isValidRange(inputStart) || !isValidRange(inputEnd) || (isSameDateDay(inputStart, currentInputStart) && isSameDateDay(inputEnd, currentInputEnd))) {
623
- return state; // if no change, return the current state.
624
- }
625
- // retain all indexes that are within the new range
626
- const minIndex = indexFactory(inputStart);
627
- const maxIndex = indexFactory(inputEnd) + 1;
628
- const currentIndexes = Array.from(state.toggledIndexes);
629
- const isInCurrentRange = isIndexNumberInIndexRangeFunction({ minIndex, maxIndex });
630
- const excludedIndexesInNewRange = currentIndexes.filter(isInCurrentRange);
631
- const toggledIndexes = new Set(excludedIndexesInNewRange);
632
- const nextState = { ...state, toggledIndexes, inputStart, inputEnd };
633
- return finalizeNewCalendarScheduleSelectionState(nextState);
634
- }
635
- export function finalizeNewCalendarScheduleSelectionState(nextState) {
636
- nextState.isEnabledDay = isEnabledDayInCalendarScheduleSelectionState(nextState);
637
- nextState.currentSelectionValue = computeScheduleSelectionValue(nextState);
638
- return nextState;
639
- }
640
- export function isEnabledDayInCalendarScheduleSelectionState(state) {
641
- const { allowedDaysOfWeek, indexFactory, inputStart, inputEnd, indexDayOfWeek, systemTimezone } = state;
642
- let isInStartAndEndRange;
643
- if (inputStart && inputEnd) {
644
- isInStartAndEndRange = isDateWithinDateCellRangeFunction({ startsAt: { startsAt: state.start, timezone: systemTimezone }, range: { start: inputStart, end: inputEnd } });
645
- }
646
- else {
647
- isInStartAndEndRange = () => false;
648
- }
649
- return (input) => {
650
- const index = indexFactory(input);
651
- const dayOfWeek = indexDayOfWeek(index);
652
- const isInSelectedRange = isInStartAndEndRange(index);
653
- const isSelected = state.toggledIndexes.has(index);
654
- const isAllowedDayOfWeek = allowedDaysOfWeek.has(dayOfWeek);
655
- const result = isAllowedDayOfWeek && ((isInSelectedRange && !isSelected) || (isSelected && !isInSelectedRange));
656
- return result;
657
- };
658
- }
659
- export function computeScheduleSelectionValue(state) {
660
- const { indexFactory: systemIndexFactory, allowedDaysOfWeek, effectiveScheduleDays, indexDayOfWeek, computeSelectionResultRelativeToFilter, filter, systemTimezone } = state;
661
- let timezone = systemTimezone;
662
- const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(state);
663
- if (rangeAndExclusion == null) {
664
- return null;
665
- }
666
- const { start: rangeStart, end: rangeEnd, excluded: allExcluded, dateCellRange } = rangeAndExclusion;
667
- let filterOffsetExcludedRange = [];
668
- let indexOffset = dateCellRange.i;
669
- let start = rangeStart;
670
- let end = rangeEnd;
671
- // If computeSelectionResultRelativeToFilter is true, then we need to offset the values to be relative to that start.
672
- if (computeSelectionResultRelativeToFilter && filter?.start) {
673
- start = filter.start; // always start at the filter's start date
674
- let startInSystemTimezone = start;
675
- if (filter.timezone) {
676
- timezone = filter.timezone;
677
- const filterNormal = dateTimezoneUtcNormal(timezone);
678
- end = filterNormal.startOfDayInTargetTimezone(end);
679
- startInSystemTimezone = filterNormal.systemDateToTargetDate(start); // convert the start to the system timezone normal for deriving the index
680
- }
681
- const rangeStartIndex = systemIndexFactory(rangeStart);
682
- const startIndex = systemIndexFactory(startInSystemTimezone);
683
- const filterStartIndexOffset = rangeStartIndex - startIndex;
684
- filterOffsetExcludedRange = range(0, filterStartIndexOffset);
685
- indexOffset = indexOffset - filterStartIndexOffset;
686
- }
687
- const excluded = computeSelectionResultRelativeToFilter
688
- ? allExcluded.filter((x) => {
689
- const isExcludedIndex = allowedDaysOfWeek.has(indexDayOfWeek(x)); // ???
690
- return isExcludedIndex;
691
- })
692
- : allExcluded;
693
- const offsetExcluded = excluded.map((x) => x - indexOffset); // set to the proper offset
694
- const ex = [...filterOffsetExcludedRange, ...offsetExcluded];
695
- const w = dateCellScheduleEncodedWeek(effectiveScheduleDays);
696
- const d = []; // "included" blocks are never used/calculated.
697
- // Always ensure the end is after or equal to the start.
698
- if (isBefore(end, start)) {
699
- end = start; // end is start
700
- }
701
- const dateScheduleRange = {
702
- timezone,
703
- start,
704
- end,
705
- w,
706
- d,
707
- ex
708
- };
709
- return {
710
- dateScheduleRange,
711
- minMaxRange: { start, end }
712
- };
713
- }
714
- export function computeScheduleSelectionRangeAndExclusion(state) {
715
- const { start: currentStart, isEnabledDay, isEnabledFilterDay, systemTimezone } = state;
716
- const dateFactory = dateCellTimingStartDateFactory({ startsAt: currentStart, timezone: systemTimezone });
717
- const dateCellRange = computeCalendarScheduleSelectionDateCellRange(state);
718
- if (dateCellRange == null) {
719
- return null; // returns null if no items are selected.
720
- }
721
- const start = dateFactory(dateCellRange.i);
722
- const end = dateFactory(dateCellRange.to);
723
- const excluded = range(dateCellRange.i, dateCellRange.to + 1).filter((x) => {
724
- const isExcludedIndex = !isEnabledDay(x) || !isEnabledFilterDay(x);
725
- return isExcludedIndex;
726
- });
727
- const result = {
728
- dateCellRange,
729
- start,
730
- end,
731
- excluded
732
- };
733
- return result;
734
- }
735
- export function computeCalendarScheduleSelectionRange(state) {
736
- const dateFactory = dateCellTimingDateFactory({ startsAt: state.start, timezone: state.systemTimezone });
737
- const dateCellRange = computeCalendarScheduleSelectionDateCellRange(state);
738
- const dateRange = dateCellRange != null ? { start: dateFactory(dateCellRange.i), end: dateFactory(dateCellRange.to) } : undefined;
739
- return dateRange;
740
- }
741
- export function computeCalendarScheduleSelectionDateCellRange(state) {
742
- const { allowedDaysOfWeek, indexFactory, inputStart, inputEnd, indexDayOfWeek, isEnabledDay, isEnabledFilterDay } = state;
743
- const enabledExclusionIndexes = Array.from(state.toggledIndexes).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
744
- const minAndMaxSelectedValues = minAndMaxNumber(enabledExclusionIndexes);
745
- let startRange;
746
- let endRange;
747
- if (minAndMaxSelectedValues) {
748
- startRange = minAndMaxSelectedValues.min;
749
- endRange = minAndMaxSelectedValues.max;
750
- }
751
- if (inputStart != null && inputEnd != null) {
752
- const inputStartIndex = indexFactory(inputStart);
753
- const inputEndIndex = indexFactory(inputEnd);
754
- startRange = startRange != null ? Math.min(inputStartIndex, startRange) : inputStartIndex;
755
- endRange = endRange != null ? Math.max(inputEndIndex, endRange) : inputEndIndex;
756
- }
757
- if (startRange != null && endRange != null) {
758
- const scanStartIndex = startRange;
759
- const scanEndIndex = endRange;
760
- // clear start and end
761
- startRange = undefined;
762
- endRange = undefined;
763
- // if the min is equal to the start index, then we are in the range and need to iterate dates until we find one that is not selected/excluded.
764
- for (let i = scanStartIndex; i <= scanEndIndex; i += 1) {
765
- if (isEnabledFilterDay(i) && isEnabledDay(i)) {
766
- startRange = i;
767
- break;
768
- }
769
- }
770
- // same with the max
771
- for (let i = scanEndIndex; i >= scanStartIndex; i -= 1) {
772
- if (isEnabledFilterDay(i) && isEnabledDay(i)) {
773
- endRange = i;
774
- break;
775
- }
776
- }
777
- }
778
- if (startRange != null && endRange != null) {
779
- return { i: startRange, to: endRange };
780
- }
781
- else {
782
- return undefined;
783
- }
784
- }
785
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwsd0JBQXdCLEVBR3hCLHlCQUF5QixFQUV6QiwwQkFBMEIsRUFDMUIsb0NBQW9DLEVBRXBDLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFHM0Isa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5Qiw0Q0FBNEMsRUFDNUMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsaUNBQWlDLEVBQ2pDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUVmLHVDQUF1QyxFQUN2QyxtQkFBbUIsRUFDbkIscUJBQXFCLEVBRXJCLDJCQUEyQixFQUczQixpQ0FBaUMsRUFFakMseUNBQXlDLEVBQ3pDLGdDQUFnQyxFQUNoQyxnQ0FBZ0MsRUFDaEMsOEJBQThCLEVBRTlCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFFL0IseUJBQXlCLEVBQ3pCLG9DQUFvQyxFQUNwQyx5Q0FBeUMsRUFDekMsd0NBQXdDLEVBQ3pDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFrQyxjQUFjLEVBQUUsd0JBQXdCLEVBQVksc0JBQXNCLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDL1ksT0FBTyxFQUFF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LENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRlQ2VsbERheU9mV2Vla0ZhY3RvcnksXG4gIGRhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeSxcbiAgRGF0ZUNlbGxJbmRleCxcbiAgRGF0ZUNlbGxSYW5nZVdpdGhSYW5nZSxcbiAgZGF0ZUNlbGxUaW1pbmdEYXRlRmFjdG9yeSxcbiAgRGF0ZVJhbmdlLFxuICBkYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlcixcbiAgY29weURhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnLFxuICBEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZUNlbGxTY2hlZHVsZURheUNvZGUsXG4gIGRhdGVDZWxsU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZUNlbGxTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBleHBhbmREYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMsXG4gIGV4cGFuZERhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0LFxuICBmaW5kTWF4RGF0ZSxcbiAgZmluZE1pbkRhdGUsXG4gIGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24sXG4gIElzRGF0ZVdpdGhpbkRhdGVDZWxsUmFuZ2VGdW5jdGlvbixcbiAgaXNEYXRlV2l0aGluRGF0ZUNlbGxSYW5nZUZ1bmN0aW9uLFxuICBpc1NhbWVEYXRlLFxuICBpc1NhbWVEYXRlRGF5LFxuICBpc1NhbWVEYXRlUmFuZ2UsXG4gIERhdGVPckRhdGVSYW5nZU9yRGF0ZUNlbGxJbmRleE9yRGF0ZUNlbGxSYW5nZSxcbiAgZGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5LFxuICBpc0luZmluaXRlRGF0ZVJhbmdlLFxuICBkYXRlVGltZXpvbmVVdGNOb3JtYWwsXG4gIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLFxuICBleHBhbmREYXRlQ2VsbFNjaGVkdWxlUmFuZ2UsXG4gIERhdGVDZWxsLFxuICBEYXRlQ2VsbER1cmF0aW9uU3BhbixcbiAgZm9ybWF0VG9JU084NjAxRGF5U3RyaW5nRm9yU3lzdGVtLFxuICBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQsXG4gIGRhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc0FyZVNldHNFcXVpdmFsZW50LFxuICBzaW1wbGlmeURhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcyxcbiAgZnVsbFdlZWtEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMsXG4gIGRhdGVDZWxsVGltaW5nU3RhcnREYXRlRmFjdG9yeSxcbiAgRGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZSxcbiAgZGF0ZUNlbGxUaW1pbmdTdGFydHNBdEZvclN0YXJ0T2ZEYXksXG4gIGlzU2FtZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UsXG4gIEZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2VJbnB1dERhdGVSYW5nZSxcbiAgZnVsbERhdGVDZWxsU2NoZWR1bGVSYW5nZSxcbiAgZGF0ZUNlbGxUaW1pbmdUaW1lem9uZU5vcm1hbEluc3RhbmNlLFxuICBjaGFuZ2VEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlVG9UaW1lem9uZSxcbiAgU1lTVEVNX0RBVEVfVElNRVpPTkVfVVRDX05PUk1BTF9JTlNUQU5DRVxufSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMsIGZpbHRlck1heWJlIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBNYXliZSwgVGltZXpvbmVTdHJpbmcsIERlY2lzaW9uRnVuY3Rpb24sIEl0ZXJhYmxlT3JWYWx1ZSwgaXRlcmFibGVUb0FycmF5LCBhZGRUb1NldCwgdG9nZ2xlSW5TZXQsIGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbiwgTWF5YmVNYXAsIG1pbkFuZE1heE51bWJlciwgRGF5T2ZXZWVrLCByYW5nZSwgQWxsT3JOb25lU2VsZWN0aW9uLCB1bmlxdWUsIG1lcmdlQXJyYXlzLCBBcnJheU9yVmFsdWUsIElTTzg2MDFEYXlTdHJpbmcsIG1hcFZhbHVlc1RvU2V0LCBpc0luQWxsb3dlZERheXNPZldlZWtTZXQsIEJ1aWxkaW5nLCBmaXJzdFZhbHVlRnJvbUl0ZXJhYmxlLCBpc0l0ZXJhYmxlLCByZW1vdmVGcm9tU2V0LCBDb25maWd1cmFibGUgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQG5ncngvY29tcG9uZW50LXN0b3JlJztcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIGVuZE9mRGF5LCBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgZmlyc3QsIGNvbWJpbmVMYXRlc3RXaXRoLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICByZWFkb25seSBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbi8qKlxuICogRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIFdoZW4gaW4gc2luZ2xlIG1vZGUgdGhlIHRvZ2dsZSBmdW5jdGlvbiBpcyB0cmVhdGVkIGFzIGEgc2V0IHRoYXQgY2xlYXJzIGFsbCB2YWx1ZXMgYW5kIG9ubHkgc2VsZWN0cyB0aGUgdG9nZ2xlJ2QgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZVNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnIHwgJ3NpbmdsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbW9kZSBmb3IgdGhpcyBjYWxlbmRhci4gRGVmYXVsdHMgdG8gXCJtdWx0aXBsZVwiXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rpb25Nb2RlOiBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmVTZWxlY3Rpb25Nb2RlO1xuICAvKipcbiAgICogUmVhZG9ubHkgc3RhdGUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIERvZXMgbm90IGFmZmVjdCBzdGF0ZSBjaGFuZ2VzIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBhY3RzIGFzIGEgZmxhZyBmb3IgdGhlIHBhcmVudCB2aWV3IHRvIHNldCBhbmQgdGhlIGNvbnN1bWluZyB2aWV3cyB0byB1cGRhdGUgb24uXG4gICAqL1xuICByZWFkb25seSBpc1ZpZXdSZWFkb25seT86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFNjaGVkdWxlRGF5czogU2V0PERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlPjtcbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhlIGRheXMgb2YgdGhlIHNjaGVkdWxlIHRvIG9ubHkgYWxsb3cgc2VsZWN0aW5nIGRheXMgaW4gdGhlIHNjaGVkdWxlLlxuICAgKlxuICAgKiBUaGUgb3V0cHV0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBmaWx0ZXIsIGFuZCBpbiBpdCdzIHRpbWV6b25lIHVubGVzcyBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciBpcyBmYWxzZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIGNvcHkgb2YgYW55IHNldC9jb25maWd1cmVkIGlucHV0IGZpbHRlciBhbmQgd2lsbCBoYXZlIGEgc3RhcnQgZGF0ZSBzZXQgZnJvbSBzdGFydCBvciBzdGFydHNBdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IE1heWJlPERhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZXhjbHVzaW9ucyB0aGF0IG1heSBub3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0RXhjbHVzaW9ucz86IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVDZWxsSW5kZXhPckRhdGVDZWxsUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFRoZSBjb21wdXRlZCBleGNsdXNpb25zIGdpdmVuIHRoZSBpbnB1dCBleGNsdXNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHV0ZWRFeGNsdXNpb25zPzogTWF5YmU8RGF0ZUNlbGxJbmRleFtdPjtcbiAgLyoqXG4gICAqIFRoZSBtaW4vbWF4IGRhdGUgcmFuZ2UuIFVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBtaW4vbWF4IHZhbHVlLiBXb3JrcyB3aXRoIHRoZSBmaWx0ZXIuIFRoZSBncmVhdGVyL2xlc3NlciBvZiB0aGUgc3RhcnQvZW5kIGRhdGVzIGFyZSB1c2VkIGlmIGJvdGggYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWF4RGF0ZVJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUuIElzIHVwZGF0ZWQgYXMgdGhlIGlucHV0U3RhcnQgaXMgbW9kaWZpZWQgb3IgZmlsdGVyIGlzIHByb3ZpZGVkIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXJ0IGRhdGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRvZGF5IGFuZCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlWydzdGFydCddO1xuICAvKipcbiAgICogU3lzdGVtIFRpbWV6b25lLiBEb2VzIG5vdCBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1UaW1lem9uZTogVGltZXpvbmVTdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lem9uZSB0byB1c2Ugd2hlbiBvdXRwdXR0aW5nIHRoZSB2YWx1ZS4gT25seSBpbmZsdWVuY2VzIHRoZSBvdXRwdXQgc3RhcnQgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRpbWV6b25lPzogTWF5YmU8VGltZXpvbmVTdHJpbmc+O1xuICAvKipcbiAgICogQ3VycmVudCB0aW1lem9uZSBub3JtYWwgd2l0aCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRpbWV6b25lTm9ybWFsPzogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+O1xuICAvKipcbiAgICogRGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhGYWN0b3J5OiBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5O1xuICAvKipcbiAgICogQXJyYXkgb2YgbWFudWFsbHkgc2VsZWN0ZWQgZGF0ZXMgd2l0aGluIHRoZSBwaWNrZWQgcmFuZ2UuIFRoaXMgaXMgTk9UIHRoZSBzZXQgb2YgYWxsIHNlbGVjdGVkIGluZGV4ZXMgaW4gdGVybXMgb2Ygb3V0cHV0LlxuICAgKlxuICAgKiBWYWx1ZXMgdGhhdCBleGlzdCBvdXRzaWRlIG9mIHRoZSBcImlucHV0XCIgcmFuZ2UgYXJlIGNvbnNpZGVyZWQgdG9nZ2xlZCBvbiwgd2hpbGUgdGhvc2VcbiAgICogdGhhdCBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9mZi5cbiAgICpcbiAgICogSWYgZGF0ZXMgYXJlIHNlbGVjdGVkLCBhbmQgdGhlbiBhIHJhbmdlIGlzIHNlbGVjdGVkLCB0aGVuIHRob3NlIGRhdGVzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBmYWxsXG4gICAqIHdpdGhpbiB0aGUgcmFuZ2UgYXJlIGNsZWFyZWQgZnJvbSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFRoZXNlIGluZGV4ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9nZ2xlZEluZGV4ZXM6IFNldDxEYXRlQ2VsbEluZGV4PjtcbiAgLyoqXG4gICAqIERheXMgb2YgdGhlIHNjaGVkdWxlIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGlja2VkLiBJZiBub3QgZGVmaW5lZCwgZGVmYXVsdHMgdG8gZGVmYXVsdFNjaGVkdWxlRGF5cy5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cz86IE1heWJlPFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT4+O1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgRGF0ZUNlbGxTY2hlZHVsZURheUNvZGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3RpdmVTY2hlZHVsZURheXM6IFNldDxEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZT47XG4gIC8qKlxuICAgKiBTZXQgb2YgdGhlIGRheXMgb2Ygd2VlayB0aGF0IGFyZSBhbGxvd2VkLiBEZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgc2NoZWR1bGUgZGF5cyB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICByZWFkb25seSBpbmRleERheU9mV2VlazogRGF0ZUNlbGxEYXlPZldlZWtGYWN0b3J5O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkIGdpdmVuIHRoZSBjdXJyZW50IGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZEZpbHRlckRheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICAvKipcbiAgICogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSBmb3IgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjZWxsQ29udGVudEZhY3Rvcnk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBDdXJyZW50IHNlbGVjdGlvbiB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZT86IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGZpbHRlciBhcyB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZSBpbnN0ZWFkIG9mIG9wdGltaXppbmcgZm9yIHRoZSBjdXJyZW50IGluZGV4LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI/OiBNYXliZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBjYWxlbmRhciBpcyByZXNldC5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTZWxlY3Rpb25TdGF0ZT86IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IGRlZmF1bHRTY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSk7XG4gIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoZGVmYXVsdFNjaGVkdWxlRGF5cyk7XG4gIGNvbnN0IGRlZmF1bHRTdGFydHNBdCA9IGRhdGVDZWxsVGltaW5nU3RhcnRzQXRGb3JTdGFydE9mRGF5KCk7IC8vIGdldCBtaWRuaWdodCBvZiB0aGUgY3VycmVudCB0aW1lem9uZVxuICBjb25zdCB7IHN0YXJ0c0F0LCB0aW1lem9uZTogc3lzdGVtVGltZXpvbmUgfSA9IGRlZmF1bHRTdGFydHNBdDtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeShkZWZhdWx0U3RhcnRzQXQpO1xuICBjb25zdCBpbmRleERheU9mV2VlayA9IGRhdGVDZWxsRGF5T2ZXZWVrRmFjdG9yeShzdGFydHNBdCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZWxlY3Rpb25Nb2RlOiAnbXVsdGlwbGUnLFxuICAgIHN0YXJ0OiBzdGFydHNBdCxcbiAgICBzeXN0ZW1UaW1lem9uZSxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoKSxcbiAgICBkZWZhdWx0U2NoZWR1bGVEYXlzLFxuICAgIGVmZmVjdGl2ZVNjaGVkdWxlRGF5czogZGVmYXVsdFNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogdHJ1ZSxcbiAgICBjZWxsQ29udGVudEZhY3Rvcnk6IGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBkYXRlcyBpbiB0aGUgbWluL21heCBkYXRlIHJhbmdlIG5lZWQgdG8gYmUgc2hpZnRlZCB0byB0aGUgZmlsdGVyJ3MgdGltZXpvbmUuXG4gKlxuICogVGhpcyBpcyBiZWNhdXNlIHRoZSBpbmRleCBmYWN0b3J5IGlzIGFsd2F5cyBpbiBzeXN0ZW0gdGltZXpvbmUsIGJ1dCB3aGVuIHNlbGVjdGluZyBhbGwvbm9uZSB3aXRoIGEgZmlsdGVyIHdlIG5lZWQgdG8gdXNlIHRoZSBmaWx0ZXIncyB0aW1lem9uZS5cbiAqXG4gKiBAcGFyYW0geFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZVJlbGF0aXZlVG9GaWx0ZXIoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogUGFydGlhbDxEYXRlUmFuZ2U+IHtcbiAgbGV0IGlucHV0OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4gPSB4O1xuXG4gIGlmICh4LmZpbHRlcj8udGltZXpvbmUgJiYgeC5taW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlck5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh4LmZpbHRlci50aW1lem9uZSk7XG4gICAgY29uc3QgdHJhbnNmb3JtRm4gPSBmaWx0ZXJOb3JtYWwudHJhbnNmb3JtRnVuY3Rpb24oJ3N5c3RlbURhdGVUb1RhcmdldERhdGUnKTtcblxuICAgIGlucHV0ID0ge1xuICAgICAgZmlsdGVyOiB4LmZpbHRlcixcbiAgICAgIG1pbk1heERhdGVSYW5nZToge1xuICAgICAgICBzdGFydDogeC5taW5NYXhEYXRlUmFuZ2Uuc3RhcnQgPyB0cmFuc2Zvcm1Gbih4Lm1pbk1heERhdGVSYW5nZS5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZDogeC5taW5NYXhEYXRlUmFuZ2UuZW5kID8gdHJhbnNmb3JtRm4oeC5taW5NYXhEYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZShpbnB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IFBhcnRpYWw8RGF0ZVJhbmdlPiB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHgpIHx8IHVuZGVmaW5lZCxcbiAgICBlbmQ6IGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHgpIHx8IHVuZGVmaW5lZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1heERhdGUoW3guZmlsdGVyPy5zdGFydCwgeC5taW5NYXhEYXRlUmFuZ2U/LnN0YXJ0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWluRGF0ZShbeC5maWx0ZXI/LmVuZCwgeC5taW5NYXhEYXRlUmFuZ2U/LmVuZF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXInPikge1xuICByZXR1cm4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbDsgLy8gbWF5IGJlIHVzaW5nIGVpdGhlclxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKSk7XG4gIH1cblxuICAvLyBNQVJLOlxuICByZWFkb25seSB0b2dnbGVTZWxlY3Rpb24gPSB0aGlzLmVmZmVjdCgoaW5wdXQ6IE9ic2VydmFibGU8dm9pZD4pID0+IHtcbiAgICByZXR1cm4gaW5wdXQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICB0aGlzLm5leHRUb2dnbGVTZWxlY3Rpb24kLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgIHRhcCgoeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxEYXRlcyh4KTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0aW9uTW9kZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBtaW5NYXhEYXRlUmFuZ2UkID0gdGhpcy5zdGF0ZSQucGlwZShtYXAoY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBtaW5EYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5lbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzQ29uZmlndXJlZE1pbk1heFJhbmdlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geCAhPSBudWxsICYmIHguc3RhcnQgIT0gbnVsbCAmJiB4LmVuZCAhPSBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRTdGFydCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dFN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0RW5kJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0RW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pID0+ICh7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gaXNTYW1lRGF0ZVJhbmdlKGEgYXMgRGF0ZVJhbmdlLCBiIGFzIERhdGVSYW5nZSkpLFxuICAgIG1hcCgoeCkgPT4gKHsgaW5wdXRTdGFydDogeC5zdGFydCwgaW5wdXRFbmQ6IHguZW5kIH0pKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGlzRW5hYmxlZEZpbHRlckRheUZ1bmN0aW9uJDogT2JzZXJ2YWJsZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRmlsdGVyRGF5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc0VuYWJsZWREYXkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlUmFuZ2UoYSwgYikpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIkOiBPYnNlcnZhYmxlPE1heWJlPGJvb2xlYW4+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICAvL1xuICAgIG1hcChjYWxlbmRhclNjaGVkdWxlU3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxEYXRlUmFuZ2U+ID0gdGhpcy5jdXJyZW50RGF0ZVJhbmdlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBhbGxvd2VkRGF5c09mV2VlayQ6IE9ic2VydmFibGU8U2V0PERheU9mV2Vlaz4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguYWxsb3dlZERheXNPZldlZWspLFxuICAgIGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzSW5BbGxvd2VkRGF5c09mV2Vla0Z1bmN0aW9uJCA9IHRoaXMuYWxsb3dlZERheXNPZldlZWskLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBpc0luQWxsb3dlZERheXNPZldlZWtTZXQoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2NoZWR1bGVEYXlzJDogT2JzZXJ2YWJsZTxTZXQ8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmVmZmVjdGl2ZVNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgb3V0cHV0VGltZXpvbmUkOiBPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5vdXRwdXRUaW1lem9uZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXpvbmUgb2YgdGhlIG91dHB1dCB2YWx1ZXMuXG4gICAqXG4gICAqIElmIGFuIG91dHB1dFRpbWV6b25lIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgZGVmYXVsdHMgdG8gdGhlIHN5c3RlbSB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZU91dHB1dFRpbWV6b25lJDogT2JzZXJ2YWJsZTxUaW1lem9uZVN0cmluZz4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5vdXRwdXRUaW1lem9uZSB8fCB4LnN5c3RlbVRpbWV6b25lKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAqIEFuIG91dHB1dFRpbWV6b25lTm9ybWFsIHRvIHVzZS5cbiAgICpcbiAgICogSWYgYW4gb3V0cHV0VGltZXpvbmUgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBpcyB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3RpdmVPdXRwdXRUaW1lem9uZU5vcm1hbCQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeC5vdXRwdXRUaW1lem9uZU5vcm1hbCA/IHgub3V0cHV0VGltZXpvbmVOb3JtYWwgOiB1bmRlZmluZWQpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZVN0YXJ0JCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUNlbGxUaW1pbmdEYXRlRmFjdG9yeSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4ID8gZGF0ZUNlbGxUaW1pbmdEYXRlRmFjdG9yeSh7IHN0YXJ0c0F0OiB4LmRhdGVTY2hlZHVsZVJhbmdlLnN0YXJ0LCB0aW1lem9uZTogeC5kYXRlU2NoZWR1bGVSYW5nZS50aW1lem9uZSB9KSA6IHVuZGVmaW5lZCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUNlbGxEdXJhdGlvblNwYW5FeHBhbnNpb24kOiBPYnNlcnZhYmxlPERhdGVDZWxsRHVyYXRpb25TcGFuPERhdGVDZWxsPltdPiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyBleHBhbmREYXRlQ2VsbFNjaGVkdWxlUmFuZ2UoeyBkYXRlQ2VsbFNjaGVkdWxlUmFuZ2U6IHguZGF0ZVNjaGVkdWxlUmFuZ2UgfSkgOiBbXSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVTZWxlY3RlZEluZGV4ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQ2VsbEluZGV4Pj4gPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVDZWxsRHVyYXRpb25TcGFuRXhwYW5zaW9uJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gbmV3IFNldCh4Lm1hcCgoeSkgPT4geS5pKSkpLFxuICAgIGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlU2VsZWN0ZWREYXRlcyQ6IE9ic2VydmFibGU8U2V0PElTTzg2MDFEYXlTdHJpbmc+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUNlbGxUaW1pbmdEYXRlRmFjdG9yeSQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGRhdGVGYWN0b3J5KSA9PiB7XG4gICAgICByZXR1cm4gZGF0ZUZhY3RvcnkgPyB0aGlzLnNlbGVjdGlvblZhbHVlU2VsZWN0ZWRJbmRleGVzJC5waXBlKG1hcCgoeCkgPT4gbWFwVmFsdWVzVG9TZXQoeCwgKHkpID0+IGZvcm1hdFRvSVNPODYwMURheVN0cmluZ0ZvclN5c3RlbShkYXRlRmFjdG9yeSh5KSkpKSkgOiBvZihuZXcgU2V0PElTTzg2MDFEYXlTdHJpbmc+KCkpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmVmZmVjdGl2ZU91dHB1dFRpbWV6b25lTm9ybWFsJCksXG4gICAgbWFwKChbeCwgdGltZXpvbmVOb3JtYWxdKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFZhbHVlV2l0aFRpbWV6b25lID0geDtcblxuICAgICAgaWYgKHggJiYgdGltZXpvbmVOb3JtYWwpIHtcbiAgICAgICAgY3VycmVudFZhbHVlV2l0aFRpbWV6b25lID0ge1xuICAgICAgICAgIGRhdGVTY2hlZHVsZVJhbmdlOiBjaGFuZ2VEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlVG9UaW1lem9uZSh4LmRhdGVTY2hlZHVsZVJhbmdlLCB0aW1lem9uZU5vcm1hbCksXG4gICAgICAgICAgbWluTWF4UmFuZ2U6IHgubWluTWF4UmFuZ2VcbiAgICAgICAgfSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWVXaXRoVGltZXpvbmU7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZURhdGVDZWxsRHVyYXRpb25TcGFuRXhwYW5zaW9uJDogT2JzZXJ2YWJsZTxEYXRlQ2VsbER1cmF0aW9uU3BhbjxEYXRlQ2VsbD5bXT4gPSB0aGlzLnNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZVJhbmdlKHsgZGF0ZUNlbGxTY2hlZHVsZVJhbmdlOiB4LmRhdGVTY2hlZHVsZVJhbmdlIH0pKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG5leHRUb2dnbGVTZWxlY3Rpb24kOiBPYnNlcnZhYmxlPE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4+ID0gdGhpcy5oYXNDb25maWd1cmVkTWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj47XG5cbiAgICAgIGlmIChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6ICdhbGwnKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6IHVuZGVmaW5lZCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlQ2VsbFNjaGVkdWxlUmFuZ2VWYWx1ZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHg/LmRhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjZWxsQ29udGVudEZhY3RvcnkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY2VsbENvbnRlbnRGYWN0b3J5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNDdXN0b21pemVkJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzLnNpemUgPiAwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNWaWV3UmVhZG9ubHkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNWaWV3UmVhZG9ubHkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyBNQVJLOiBTdGF0ZSBDaGFuZ2VzXG4gIHJlYWRvbmx5IHNldE1pbk1heERhdGVSYW5nZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhNaW5NYXhEYXRlUmFuZ2UpO1xuICByZWFkb25seSBzZXREZWZhdWx0V2VlayA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhNaW5NYXhEYXRlUmFuZ2UpO1xuICByZWFkb25seSBzZXRGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoRmlsdGVyKTtcbiAgcmVhZG9ubHkgc2V0RXhjbHVzaW9ucyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKTtcbiAgcmVhZG9ubHkgc2V0Q29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpO1xuICByZWFkb25seSBjbGVhckZpbHRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgdW5kZWZpbmVkKSk7XG5cbiAgcmVhZG9ubHkgc2V0T3V0cHV0VGltZXpvbmUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZSk7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBcImlucHV0XCIgZGF0ZSByYW5nZS4gVGhpcyBpcyB0aGUgcmFuZ2UgdGhhdCBnZXRzIGRpc3BsYXllZCBvbiB0aGUgZGF0ZSByYW5nZSBwaWNrZXIuXG4gICAqL1xuICByZWFkb25seSBzZXRJbnB1dFJhbmdlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZSk7XG5cbiAgLy8gTk9URTogU2VsZWN0ZWQgZGF0ZXMgYXJlIE5PVCBzZWxlY3RlZCBpbmRleGVzLiBUaGV5IGFyZSB0aGUgaW50ZXJuYWwgc2VsZWN0ZWQgZGF0ZXMgdGhhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICByZWFkb25seSB0b2dnbGVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdG9nZ2xlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHRvZ2dsZSB9KSk7XG4gIHJlYWRvbmx5IGFkZFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBhZGQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgYWRkIH0pKTtcbiAgcmVhZG9ubHkgcmVtb3ZlU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJlbW92ZTogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyByZW1vdmUgfSkpO1xuICByZWFkb25seSBzZXRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCB9KSk7XG4gIHJlYWRvbmx5IHNlbGVjdEFsbERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2VsZWN0QWxsOiBBbGxPck5vbmVTZWxlY3Rpb24gPSAnYWxsJykgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbCB9KSk7XG5cbiAgLy8gTk9URTogU2VsZWN0ZWQgaW5kZXhlcyBhcmUgdGhlIHR5cGljYWwvZXhwZWN0ZWQgaW5kZXhlcyB0aGF0IGFyZSBzZWxlY3RlZCBvciBub3QuXG4gIHJlYWRvbmx5IHNldFNlbGVjdGVkSW5kZXhlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHNldDogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZXQsIGludmVydFNldEJlaGF2aW9yOiB0cnVlIH0pKTtcbiAgcmVhZG9ubHkgc2V0SW5pdGlhbFNlbGVjdGlvblN0YXRlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG5cbiAgcmVhZG9ubHkgc2V0RGVmYXVsdFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGVmYXVsdFNjaGVkdWxlRGF5cyk7XG4gIHJlYWRvbmx5IHNldFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKTtcbiAgcmVhZG9ubHkgc2V0QWxsb3dBbGxTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBbRGF0ZUNlbGxTY2hlZHVsZURheUNvZGUuV0VFS0RBWSwgRGF0ZUNlbGxTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pKTtcblxuICByZWFkb25seSBzZXREYXRlU2NoZWR1bGVSYW5nZVZhbHVlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdmFsdWU6IE1heWJlPEZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2VJbnB1dERhdGVSYW5nZT4pID0+IHVwZGF0ZVN0YXRlV2l0aERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlKHN0YXRlLCB2YWx1ZSkpO1xuICByZWFkb25seSBzZXRDZWxsQ29udGVudEZhY3RvcnkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBjZWxsQ29udGVudEZhY3Rvcnk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkpID0+ICh7IC4uLnN0YXRlLCBjZWxsQ29udGVudEZhY3RvcnkgfSkpO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IHNldFNlbGVjdGlvbk1vZGUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoU2VsZWN0aW9uTW9kZSk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgdGhlIHBhcmVudCB2aWV3IHRvIHByb3BvZ2F0ZSBhIHJlYWRvbmx5IHN0YXRlLlxuICAgKlxuICAgKiBTaG91bGQgdHlwaWNhbGx5IG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyIGRpcmVjdGx5IHdpdGggdGhlIGludGVudGlvbiBvZiB0aGUgcGFyZW50IHN5bmNocm9uaXppbmcgdG8gdGhpcyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHNldFZpZXdSZWFkb25seVN0YXRlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgaXNWaWV3UmVhZG9ubHk6IGJvb2xlYW4pID0+ICh7IC4uLnN0YXRlLCBpc1ZpZXdSZWFkb25seSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5pdGlhbFNlbGVjdGlvblN0YXRlOiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyB0b2dnbGVkSW5kZXhlcyB9ID0gc3RhdGU7XG5cbiAgaWYgKHRvZ2dsZWRJbmRleGVzLnNpemUgPT09IDAgJiYgaW5pdGlhbFNlbGVjdGlvblN0YXRlID09PSAnYWxsJykge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbDogaW5pdGlhbFNlbGVjdGlvblN0YXRlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4uc3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIoY3VycmVudFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyOiBNYXliZTxib29sZWFuPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGxldCBzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5jdXJyZW50U3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIH07XG5cbiAgaWYgKEJvb2xlYW4oY3VycmVudFN0YXRlLmNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSAhPT0gQm9vbGVhbihjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwge30pOyAvLyByZWNhbGN1bGF0ZSBpZiBjaGFuZ2Ugb2NjdXJzIGFzIGl0IHdpbGwgYWZmZWN0IHRoZSBvdXRwdXQgdmFsdWVcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEV4Y2x1c2lvbnMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRFeGNsdXNpb25zOiBNYXliZTxBcnJheU9yVmFsdWU8RGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQ2VsbEluZGV4T3JEYXRlQ2VsbFJhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgY29tcHV0ZWRFeGNsdXNpb25zOiBNYXliZTxEYXRlQ2VsbEluZGV4W10+O1xuXG4gIGlmIChpbnB1dEV4Y2x1c2lvbnMpIHtcbiAgICBjb25zdCB7IGluZGV4RmFjdG9yeSB9ID0gc3RhdGU7XG4gICAgY29uc3QgaW5kZXhBcnJheUZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnkoaW5kZXhGYWN0b3J5KTtcbiAgICBjb21wdXRlZEV4Y2x1c2lvbnMgPSBpbmRleEFycmF5RmFjdG9yeShpbnB1dEV4Y2x1c2lvbnMpO1xuICB9XG5cbiAgc3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dEV4Y2x1c2lvbnMsIGNvbXB1dGVkRXhjbHVzaW9ucyB9O1xuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTWluTWF4RGF0ZVJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG1pbk1heERhdGVSYW5nZTogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGlmIChtaW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCAmJiAhaXNJbmZpbml0ZURhdGVSYW5nZShtaW5NYXhEYXRlUmFuZ2UpKSB7XG4gICAgc3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1pbk1heERhdGVSYW5nZToge1xuICAgICAgICBzdGFydDogbWluTWF4RGF0ZVJhbmdlLnN0YXJ0ICE9IG51bGwgPyBzdGFydE9mRGF5KG1pbk1heERhdGVSYW5nZS5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGVuZDogbWluTWF4RGF0ZVJhbmdlLmVuZCAhPSBudWxsID8gZW5kT2ZEYXkobWluTWF4RGF0ZVJhbmdlLmVuZCkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHN0YXRlID0geyAuLi5zdGF0ZSwgbWluTWF4RGF0ZVJhbmdlOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHN0YXRlLmZpbHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoY3VycmVudFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RmlsdGVyOiBNYXliZTxEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGNvbXB1dGVkRXhjbHVzaW9uczogZXhjbHVzaW9ucywgbWluTWF4RGF0ZVJhbmdlLCBzeXN0ZW1UaW1lem9uZSB9ID0gY3VycmVudFN0YXRlO1xuXG4gIGxldCBpc0VuYWJsZWRGaWx0ZXJEYXk6IE1heWJlPERlY2lzaW9uRnVuY3Rpb248RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj4gPSAoKSA9PiB0cnVlO1xuICBsZXQgZmlsdGVyOiBNYXliZTxEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4gPSBudWxsO1xuXG4gIC8vIGNyZWF0ZSB0aGUgZmlsdGVyIHVzaW5nIGlucHV0RmlsdGVyLCBleGNsdXNpb25zLCBhbmQgbWluTWF4RGF0ZVJhbmdlXG4gIGlmIChpbnB1dEZpbHRlciB8fCBleGNsdXNpb25zPy5sZW5ndGggfHwgbWluTWF4RGF0ZVJhbmdlKSB7XG4gICAgbGV0IGVuYWJsZWRGaWx0ZXI6IENvbmZpZ3VyYWJsZTxEYXRlQ2VsbFNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz47XG4gICAgbGV0IGZpbHRlclN0YXJ0OiBNYXliZTxEYXRlPiA9IG51bGw7IC8vIHRoZSBzdGFydCBkYXRlIHRoYXQgd2lsbCBiZSB1c2VkL3NldCBvbiB0aGUgZmlsdGVyLlxuXG4gICAgaWYgKGlucHV0RmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBjb3B5RGF0ZUNlbGxTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcoaW5wdXRGaWx0ZXIpOyAvLyBjb3B5IGZpbHRlclxuXG4gICAgICBsZXQgbmV4dEZpbHRlclRpbWV6b25lOiBUaW1lem9uZVN0cmluZyB8IHVuZGVmaW5lZDsgLy8gb25seSBzZXQgaWYgaW5wdXRGaWx0ZXIuc3RhcnQgb3IgaW5wdXRGaWx0ZXIuc3RhcnRzQXRcblxuICAgICAgLy8gY29uZmlndXJlIGZpbHRlciBzdGFydFxuICAgICAgaWYgKGlucHV0RmlsdGVyLnN0YXJ0KSB7XG4gICAgICAgIGZpbHRlclN0YXJ0ID0gaW5wdXRGaWx0ZXIuc3RhcnQ7XG5cbiAgICAgICAgLy8gaWYgbm8gdGltZXpvbmUgaXMgc3BlY2lmaWVkLCB0aGVuIHVzZSB0aGUgc3lzdGVtIHRpbWV6b25lIGFuZCBhbGlnbiBmaWx0ZXJTdGFydCB0byB0aGUgc3RhcnQgb2YgdGhlIGRheS5cbiAgICAgICAgaWYgKCFpbnB1dEZpbHRlci50aW1lem9uZSkge1xuICAgICAgICAgIGZpbHRlclN0YXJ0ID0gU1lTVEVNX0RBVEVfVElNRVpPTkVfVVRDX05PUk1BTF9JTlNUQU5DRS5zdGFydE9mRGF5SW5UYXJnZXRUaW1lem9uZShpbnB1dEZpbHRlci5zdGFydHNBdCk7XG4gICAgICAgICAgbmV4dEZpbHRlclRpbWV6b25lID0gc3lzdGVtVGltZXpvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dEZpbHRlclRpbWV6b25lID0gaW5wdXRGaWx0ZXIudGltZXpvbmU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5wdXRGaWx0ZXIuc3RhcnRzQXQpIHtcbiAgICAgICAgaWYgKGlucHV0RmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICAgICAgLy8gaWYgbm8gdGltZXpvbmUgaXMgcHJvdmlkZWQsIHVzZSBzdGFydHNBdCBhcy1pc1xuICAgICAgICAgIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKGlucHV0RmlsdGVyLnRpbWV6b25lKTtcbiAgICAgICAgICBmaWx0ZXJTdGFydCA9IHRpbWV6b25lTm9ybWFsLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGlucHV0RmlsdGVyLnN0YXJ0c0F0KTtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBpbnB1dEZpbHRlci50aW1lem9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRvZGF5IGluIHRoZSBzeXN0ZW0gdGltZXpvbmUuXG4gICAgICAgICAgZmlsdGVyU3RhcnQgPSBTWVNURU1fREFURV9USU1FWk9ORV9VVENfTk9STUFMX0lOU1RBTkNFLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGlucHV0RmlsdGVyLnN0YXJ0c0F0KTtcbiAgICAgICAgICBuZXh0RmlsdGVyVGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWx0ZXIuc3RhcnQgPSBmaWx0ZXJTdGFydCA/PyB1bmRlZmluZWQ7XG4gICAgICBmaWx0ZXIudGltZXpvbmUgPSBuZXh0RmlsdGVyVGltZXpvbmU7XG5cbiAgICAgIC8vIGNvbmZpZ3VyZSBleGNsdXNpb25zXG4gICAgICBpZiAoZXhjbHVzaW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgIGV4OiB1bmlxdWUobWVyZ2VBcnJheXMoW2ZpbHRlci5leCwgZXhjbHVzaW9uc10pKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgdzogJzg5JyxcbiAgICAgICAgZXg6IGV4Y2x1c2lvbnMgYXMgbnVtYmVyW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1pbk1heERhdGVSYW5nZSkge1xuICAgICAgZW5hYmxlZEZpbHRlci5taW5NYXhEYXRlUmFuZ2UgPSBtaW5NYXhEYXRlUmFuZ2U7XG4gICAgICBlbmFibGVkRmlsdGVyLnNldFN0YXJ0QXNNaW5EYXRlID0gZmlsdGVyU3RhcnQgPyB0cnVlIDogZmFsc2U7IC8vIElmIGEgc3RhcnQgZGF0ZSBpcyBzZXQsIHRoZW4gaXQgYmVjb21lcyB0aGUgZmxvb3IuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGlucHV0IGZpbHRlciBoYXMgYSBzdGFydCBkYXRlLCB1c2UgdGhhdCBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgdG8gZW5zdXJlIGluZGV4ZXMgYXJlIGNvbXBhcmVkIHRoZSBzYW1lLFxuICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIHN0YXRlJ3Mgc3RhcnQuIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgaW5kZXggY2FsY3VsYXRpb25zLlxuICAgICAqL1xuICAgIGxldCBmaW5hbEVuYWJsZWRTdGFydDogRGF0ZTtcbiAgICBsZXQgZmluYWxFbmFibGVkVGltZXpvbmU6IFRpbWV6b25lU3RyaW5nO1xuICAgIC8vICBmaWx0ZXI/LnN0YXJ0ID8/IHN0YXRlLnN0YXJ0O1xuXG4gICAgaWYgKCFlbmFibGVkRmlsdGVyLnN0YXJ0KSB7XG4gICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc3RhdGUncyBzdGFydCwgYnV0IG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgcHJvcGVyIHRpbWV6b25lLlxuICAgICAgaWYgKGVuYWJsZWRGaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgICAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSBkYXRlVGltZXpvbmVVdGNOb3JtYWwoZW5hYmxlZEZpbHRlci50aW1lem9uZSk7XG4gICAgICAgIGZpbmFsRW5hYmxlZFN0YXJ0ID0gdGltZXpvbmVOb3JtYWwuc3RhcnRPZkRheUluVGFyZ2V0VGltZXpvbmUoY3VycmVudFN0YXRlLnN0YXJ0KTsgLy8gZ2V0IHRoZSBzdGFydCBvZiB0aGUgZGF5IGZvciB0aGUgY3VycmVudCBzdGFydFxuICAgICAgICBmaW5hbEVuYWJsZWRUaW1lem9uZSA9IGVuYWJsZWRGaWx0ZXIudGltZXpvbmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbEVuYWJsZWRTdGFydCA9IGN1cnJlbnRTdGF0ZS5zdGFydDtcbiAgICAgICAgZmluYWxFbmFibGVkVGltZXpvbmUgPSBzeXN0ZW1UaW1lem9uZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkRmlsdGVyLnRpbWV6b25lKSB7XG4gICAgICBmaW5hbEVuYWJsZWRUaW1lem9uZSA9IHN5c3RlbVRpbWV6b25lO1xuXG4gICAgICBjb25zdCB0aW1lem9uZU5vcm1hbCA9IGRhdGVUaW1lem9uZVV0Y05vcm1hbChmaW5hbEVuYWJsZWRUaW1lem9uZSk7XG4gICAgICBmaW5hbEVuYWJsZWRTdGFydCA9IHRpbWV6b25lTm9ybWFsLnN0YXJ0T2ZEYXlJblRhcmdldFRpbWV6b25lKGVuYWJsZWRGaWx0ZXIuc3RhcnQpOyAvLyBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXkgZm9yIHRoZSB0YXJnZXQgdGltZXpvbmVcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxFbmFibGVkU3RhcnQgPSBlbmFibGVkRmlsdGVyLnN0YXJ0O1xuICAgICAgZmluYWxFbmFibGVkVGltZXpvbmUgPSBlbmFibGVkRmlsdGVyLnRpbWV6b25lO1xuICAgIH1cblxuICAgIGVuYWJsZWRGaWx0ZXIuc3RhcnQgPSBmaW5hbEVuYWJsZWRTdGFydDtcbiAgICBlbmFibGVkRmlsdGVyLnRpbWV6b25lID0gZmluYWxFbmFibGVkVGltZXpvbmU7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZpbHRlclxuICAgIGlzRW5hYmxlZEZpbHRlckRheSA9IGRhdGVDZWxsU2NoZWR1bGVEYXRlRmlsdGVyKGVuYWJsZWRGaWx0ZXIpO1xuICB9XG5cbiAgbGV0IG5leHRTdGF0ZTogQnVpbGRpbmc8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPiA9IHsgLi4uY3VycmVudFN0YXRlLCBmaWx0ZXIsIGlzRW5hYmxlZEZpbHRlckRheSB9O1xuXG4gIC8vIEZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUsIHVzZSB0aGUgZmlsdGVyJ3Mgc3RhcnQgZGF0ZSBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgaWYgYXBwbGljYWJsZS5cbiAgaWYgKGZpbHRlciAmJiBmaWx0ZXIuc3RhcnQpIHtcbiAgICBsZXQgc3RhcnRGb3JTeXN0ZW1UaW1lem9uZTogRGF0ZSA9IGZpbHRlci5zdGFydDtcblxuICAgIGlmIChmaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKGZpbHRlci50aW1lem9uZSk7XG4gICAgICBzdGFydEZvclN5c3RlbVRpbWV6b25lID0gdGltZXpvbmVOb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShmaWx0ZXIuc3RhcnQpOyAvLyBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXkgZm9yIHRoZSBzeXN0ZW0gdGltZXpvbmVcbiAgICB9XG5cbiAgICBuZXh0U3RhdGUuc3RhcnQgPSBzdGFydEZvclN5c3RlbVRpbWV6b25lO1xuICAgIG5leHRTdGF0ZS5pbmRleEZhY3RvcnkgPSBkYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnRzQXQ6IHN0YXJ0Rm9yU3lzdGVtVGltZXpvbmUsIHRpbWV6b25lOiBzeXN0ZW1UaW1lem9uZSB9KTtcbiAgICBuZXh0U3RhdGUuaW5kZXhEYXlPZldlZWsgPSBkYXRlQ2VsbERheU9mV2Vla0ZhY3Rvcnkoc3RhcnRGb3JTeXN0ZW1UaW1lem9uZSk7XG4gIH1cblxuICAvLyBhdHRlbXB0IHRvIHJlLWFwcGx5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSBvbmNlIGZpbHRlciBpcyBhcHBsaWVkXG4gIGlmIChuZXh0U3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlKSB7XG4gICAgbmV4dFN0YXRlID0gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG5leHRTdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpO1xuICB9XG5cbiAgLy8gcmUtY2FsY3VsYXRlIHRoZSBzZWxlY3Rpb24gZ2l2ZW4gdGhlIGZpbHRlclxuICBjb25zdCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0gPSBuZXh0U3RhdGU7XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBuZXh0U3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2UobmV4dFN0YXRlIGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0U3RhdGUgYXMgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCB0aW1lem9uZTogTWF5YmU8VGltZXpvbmVTdHJpbmc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjdXJyZW50U2VsZWN0aW9uVmFsdWUgfSA9IHN0YXRlO1xuICBjb25zdCB0aW1lem9uZU5vcm1hbCA9IHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHRpbWV6b25lTm9ybWFsICYmIGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSkge1xuICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIHZhbHVlIHRvIHJlZmxlY3QgdGhlIHRpbWV6b25lIGNoYW5nZXMuXG4gICAgY29uc3QgeyBkYXRlU2NoZWR1bGVSYW5nZTogY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZSB9ID0gY3VycmVudFNlbGVjdGlvblZhbHVlO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXpvbmVOb3JtYWwudGFyZ2V0RGF0ZVRvU3lzdGVtRGF0ZShjdXJyZW50RGF0ZUNlbGxTY2hlZHVsZVJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmQgPSB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKGN1cnJlbnREYXRlQ2VsbFNjaGVkdWxlUmFuZ2UuZW5kKTtcblxuICAgIGNvbnN0IG5ld1JhbmdlOiBEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlID0ge1xuICAgICAgLi4uY3VycmVudFNlbGVjdGlvblZhbHVlLmRhdGVTY2hlZHVsZVJhbmdlLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlKHsgLi4uc3RhdGUsIG91dHB1dFRpbWV6b25lOiB0aW1lem9uZSwgb3V0cHV0VGltZXpvbmVOb3JtYWw6IHRpbWV6b25lTm9ybWFsIH0sIG5ld1JhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3V0cHV0VGltZXpvbmU6IHRpbWV6b25lLCBvdXRwdXRUaW1lem9uZU5vcm1hbDogdGltZXpvbmVOb3JtYWwgfTsgLy8gbm8gY2hhbmdlIGluIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aERhdGVDZWxsU2NoZWR1bGVSYW5nZVZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0Q2hhbmdlOiBNYXliZTxGdWxsRGF0ZUNlbGxTY2hlZHVsZVJhbmdlSW5wdXREYXRlUmFuZ2U+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjdXJyZW50U2VsZWN0aW9uVmFsdWUsIHN5c3RlbVRpbWV6b25lIH0gPSBzdGF0ZTtcbiAgY29uc3QgY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZSA9IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZT8uZGF0ZVNjaGVkdWxlUmFuZ2U7IC8vIGN1cnJlbnQgcmFuZ2UgaXMgYWx3YXlzIGluIHN5c3RlbSB0aW1lXG4gIGxldCBjaGFuZ2U6IE1heWJlPFBpY2s8RGF0ZUNlbGxTY2hlZHVsZURhdGVSYW5nZSwgJ3N0YXJ0JyB8ICdlbmQnIHwgJ2V4JyB8ICd3JyB8ICd0aW1lem9uZSc+PjtcblxuICAvLyBXaGVuIHVzaW5nIHRpbWV6b25lcywgYWx3YXlzIHJldHVybiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF5LiBJbnB1dHMgYXJlIGNvbnZlcnRlZCB0byB0aGUgc3lzdGVtIHRpbWUgYW5kIHVzZWQgYXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXkuXG4gIC8vIE91dHB1dHMgcmVtYWluIGFjY3VyYXRlLlxuXG4gIGlmIChpbnB1dENoYW5nZSkge1xuICAgIC8vIG1ha2Ugc3VyZSBhIHRpbWV6b25lIGlzIHNldC4gSW5wdXQgbWF5IG5vdCBoYXZlIGEgdGltZXpvbmUgYXR0YWNoZWQuIERlZmF1bHQgdG8gc3lzdGVtIHRpbWUuXG4gICAgY29uc3QgaW5wdXRDaGFuZ2VXaXRoVGltZXpvbmVTZXQgPSB7XG4gICAgICAuLi5pbnB1dENoYW5nZSxcbiAgICAgIHRpbWV6b25lOiBpbnB1dENoYW5nZS50aW1lem9uZSA/PyBzeXN0ZW1UaW1lem9uZVxuICAgIH07XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIHNjaGVkdWxlIHJhbmdlXG4gICAgY29uc3QgZnVsbENoYW5nZSA9IGZ1bGxEYXRlQ2VsbFNjaGVkdWxlUmFuZ2UoeyBkYXRlQ2VsbFNjaGVkdWxlUmFuZ2U6IGlucHV0Q2hhbmdlV2l0aFRpbWV6b25lU2V0IH0pO1xuICAgIGNvbnN0IGlucHV0Tm9ybWFsID0gZGF0ZUNlbGxUaW1pbmdUaW1lem9uZU5vcm1hbEluc3RhbmNlKGZ1bGxDaGFuZ2UpO1xuXG4gICAgY29uc3Qgc3RhcnRJblN5c3RlbVR6ID0gaW5wdXROb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShmdWxsQ2hhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmRJblN5c3RlbVR6ID0gc3RhcnRPZkRheShpbnB1dE5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGZ1bGxDaGFuZ2UuZW5kKSk7XG5cbiAgICAvLyBjb252ZXJ0IHRoZSBzdGFydC9lbmQgdG8gc3lzdGVtIHRpbWVcbiAgICBjaGFuZ2UgPSB7XG4gICAgICBzdGFydDogc3RhcnRJblN5c3RlbVR6LFxuICAgICAgZW5kOiBlbmRJblN5c3RlbVR6LFxuICAgICAgdzogZnVsbENoYW5nZS53LFxuICAgICAgZXg6IGZ1bGxDaGFuZ2UuZXgsXG4gICAgICB0aW1lem9uZTogZnVsbENoYW5nZS50aW1lem9uZVxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc1NhbWVWYWx1ZSA9IGlzU2FtZURhdGVDZWxsU2NoZWR1bGVEYXRlUmFuZ2UoY3VycmVudERhdGVDZWxsU2NoZWR1bGVSYW5nZSwgY2hhbmdlKTtcblxuICBpZiAoaXNTYW1lVmFsdWUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQ6IGNoYW5nZS5zdGFydCwgaW5wdXRFbmQ6IGNoYW5nZS5lbmQsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KGNoYW5nZS5leCkgfTtcbiAgICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSksIGV4cGFuZERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlcyhjaGFuZ2UudyB8fCAnODknKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZSk7IC8vIGNsZWFyIHNlbGVjdGlvbiwgcmV0YWluIGRpc2FibGVkIGRheXNcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREZWZhdWx0U2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgZGVmYXVsdFNjaGVkdWxlRGF5czogY3VycmVudERlZmF1bHRTY2hlZHVsZURheXMgfSA9IHN0YXRlO1xuICBjb25zdCBkZWZhdWx0U2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgPz8gZnVsbFdlZWtEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMoKSk7XG5cbiAgaWYgKGRhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc0FyZVNldHNFcXVpdmFsZW50KGRlZmF1bHRTY2hlZHVsZURheXMsIGN1cnJlbnREZWZhdWx0U2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gbm8gY2hhbmdlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmFsaXplVXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZSwgeyAuLi5zdGF0ZSwgZGVmYXVsdFNjaGVkdWxlRGF5cyB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPEl0ZXJhYmxlPERhdGVDZWxsU2NoZWR1bGVEYXlDb2RlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHNjaGVkdWxlRGF5czogY3VycmVudFNjaGVkdWxlRGF5cyB9ID0gc3RhdGU7XG4gIGNvbnN0IHNjaGVkdWxlRGF5cyA9IG5ldyBTZXQoY2hhbmdlID8/IFtdKTtcblxuICBsZXQgbmV3U2NoZWR1bGVEYXlzOiBTZXQ8RGF0ZUNlbGxTY2hlZHVsZURheUNvZGU+IHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudFNjaGVkdWxlRGF5cyAhPSBudWxsICYmIGNoYW5nZSAhPSBudWxsKSB7XG4gICAgaWYgKGRhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc0FyZVNldHNFcXVpdmFsZW50KHNjaGVkdWxlRGF5cywgY3VycmVudFNjaGVkdWxlRGF5cykpIHtcbiAgICAgIG5ld1NjaGVkdWxlRGF5cyA9IHVuZGVmaW5lZDsgLy9ubyBjaGFuZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3U2NoZWR1bGVEYXlzID0gc2NoZWR1bGVEYXlzO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjdXJyZW50U2NoZWR1bGVEYXlzICE9PSBjaGFuZ2UpIHtcbiAgICBuZXdTY2hlZHVsZURheXMgPSBjaGFuZ2UgPyBzY2hlZHVsZURheXMgOiBudWxsOyAvLyBzZXQgdGhlIG5ldyBvbmUsIG9yIGNsZWFyIGl0XG4gIH1cblxuICBpZiAobmV3U2NoZWR1bGVEYXlzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmFsaXplVXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZSwgeyAuLi5zdGF0ZSwgc2NoZWR1bGVEYXlzOiBuZXdTY2hlZHVsZURheXMgPz8gdW5kZWZpbmVkIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhTZWxlY3Rpb25Nb2RlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIHNlbGVjdGlvbk1vZGU6IERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZVNlbGVjdGlvbk1vZGUpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHNlbGVjdGlvbk1vZGU6IGN1cnJlbnRTZWxlY3Rpb25Nb2RlIH0gPSBzdGF0ZTtcblxuICBpZiAoY3VycmVudFNlbGVjdGlvbk1vZGUgIT09IHNlbGVjdGlvbk1vZGUpIHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBzZWxlY3Rpb25Nb2RlIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGlvblJhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQ2VsbFJhbmdlKG5leHRTdGF0ZSk7XG4gICAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvblJhbmdlID8gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKG5leHRTdGF0ZSwgeyBzZXQ6IFtjdXJyZW50U2VsZWN0aW9uUmFuZ2UuaV0sIGludmVydFNldEJlaGF2aW9yOiB0cnVlIH0pIDogbmV4dFN0YXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplVXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhwcmV2aW91c1N0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgcHJldmlvdXNTY2hlZHVsZURheXMgPSBwcmV2aW91c1N0YXRlLmVmZmVjdGl2ZVNjaGVkdWxlRGF5cztcbiAgY29uc3QgbmV4dFNjaGVkdWxlRGF5cyA9IG5leHRTdGF0ZS5zY2hlZHVsZURheXMgPz8gbmV4dFN0YXRlLmRlZmF1bHRTY2hlZHVsZURheXM7XG5cbiAgaWYgKGRhdGVDZWxsU2NoZWR1bGVEYXlDb2Rlc0FyZVNldHNFcXVpdmFsZW50KG5leHRTY2hlZHVsZURheXMsIHByZXZpb3VzU2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBuZXh0U3RhdGU7IC8vIHRoZSBkZWZhdWx0IG9yIGlucHV0IHNjaGVkdWxlIGNoYW5nZWQgYnV0IHRoZSBzY2hlZHVsZSBpcyBzdGlsbCB0aGUgc2FtZSwgc28gbm8gbmVlZCBmb3IgYW4gdXBkYXRlLlxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVkdWxlRGF5cyA9IG5ldyBTZXQoc2ltcGxpZnlEYXRlQ2VsbFNjaGVkdWxlRGF5Q29kZXMobmV4dFNjaGVkdWxlRGF5cykpO1xuICAgIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZUNlbGxTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQobmV4dFNjaGVkdWxlRGF5cyk7XG5cbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoe1xuICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgLy8gdXBkYXRlIHRoZSBlZmZlY3RpdmUgc2NoZWR1bGUgZGF5cyBhbmQgYWxsb3dlZCBkYXlzIG9mIHdlZWtcbiAgICAgIGVmZmVjdGl2ZVNjaGVkdWxlRGF5cyxcbiAgICAgIGFsbG93ZWREYXlzT2ZXZWVrXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSB7XG4gIHJlc2V0PzogdHJ1ZTtcbiAgdG9nZ2xlPzogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIGFkZD86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PjtcbiAgc2V0PzogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIHNlbGVjdEFsbD86IEFsbE9yTm9uZVNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEludmVydHMgdGhlIHNldCBkYXRlIGNoYW5naW5nIGJlaGF2aW9yIHNvIHRoYXQgdGhlIHNldCBpbnB1dCBpcyB0cmVhdGVkIGFzIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIHJldGFpbmVkIGluc3RlYWQgb2YgZXhjbHVkZWQuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiBzZXQgaXMgbm90IHVzZWQuIElnbm9yZWQgZm9yIHNlbGVjdEFsbC5cbiAgICovXG4gIGludmVydFNldEJlaGF2aW9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBzZWxlY3Rpb25Nb2RlLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhGYWN0b3J5LCBpbmRleERheU9mV2VlaywgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIG1pbk1heERhdGVSYW5nZSwgZmlsdGVyIH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZUZyb21GaWx0ZXIsIGVuZDogbWF4RGF0ZUZyb21GaWx0ZXIgfSA9IGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2VSZWxhdGl2ZVRvRmlsdGVyKHN0YXRlKTtcbiAgbGV0IGlucHV0U3RhcnQgPSBjdXJyZW50SW5wdXRTdGFydDtcbiAgbGV0IGlucHV0RW5kID0gY3VycmVudElucHV0RW5kO1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc2V0IG9mIGluZGV4ZXMgdGhhdCBhcmUgaW50ZXJuYWxseSBcInNlbGVjdGVkXCIgc28gdGhhdCB0aGV5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBpbnB1dFN0YXJ0L2lucHV0RW5kIGRhdGUgcmFuZ2UuXG4gICAqXG4gICAqIERvIG5vdCBjb25mdXNlIHRoaXMgd2l0aCB0aGUgYWN0dWFsIGluZGV4ZXMgdGhhdCBhcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBsZXQgdG9nZ2xlZEluZGV4ZXM6IFNldDxEYXRlQ2VsbEluZGV4PjtcblxuICBmdW5jdGlvbiBhc0luZGV4ZXMoaW5kZXhlczogSXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pOiBEYXRlQ2VsbEluZGV4W10ge1xuICAgIHJldHVybiBpdGVyYWJsZVRvQXJyYXkoaW5kZXhlcykubWFwKGluZGV4RmFjdG9yeSk7XG4gIH1cblxuICAvLyBXaGVuIHVzaW5nIHNlbGVjdGlvbiBtb2RlIFwic2luZ2xlXCIgd2UgdXBkYXRlIHRoZSBjaGFuZ2UgdG8gcmVmbGVjdCB0aGUgc2luZ2xlIHNlbGVjdGlvbi5cbiAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgZnVuY3Rpb24gc2V0RnJvbUZpcnN0VmFsdWUoaW5wdXQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KTogU2V0PERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4ge1xuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGlzSXRlcmFibGUoaW5wdXQpID8gZmlyc3RWYWx1ZUZyb21JdGVyYWJsZShpbnB1dCkgOiBpbnB1dDtcbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PigpO1xuXG4gICAgICBpZiAoZmlyc3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHNldC5hZGQoZmlyc3RWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5zZXQpIHtcbiAgICAgIGNoYW5nZSA9IHsgc2V0OiBzZXRGcm9tRmlyc3RWYWx1ZShjaGFuZ2Uuc2V0KSwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS50b2dnbGUpIHtcbiAgICAgIGNvbnN0IG5leHRTZXQgPSBzZXRGcm9tRmlyc3RWYWx1ZShjaGFuZ2UudG9nZ2xlKTtcblxuICAgICAgaWYgKG5leHRTZXQuc2l6ZSkge1xuICAgICAgICBjb25zdCBmaXJzdFNldFZhbHVlSW5kZXggPSBpbmRleEZhY3RvcnkoZmlyc3RWYWx1ZUZyb21JdGVyYWJsZShuZXh0U2V0KSBhcyBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQpO1xuXG4gICAgICAgIGlmIChzdGF0ZS50b2dnbGVkSW5kZXhlcy5oYXMoZmlyc3RTZXRWYWx1ZUluZGV4KSB8fCAoaW5wdXRTdGFydCAmJiBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCkgPT09IGZpcnN0U2V0VmFsdWVJbmRleCkpIHtcbiAgICAgICAgICBuZXh0U2V0LmNsZWFyKCk7IC8vIGNsZWFyIHdpdGggdGhlIG5leHQgc2V0XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2UgPSB7IHNldDogbmV4dFNldCwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQsIHNlbGVjdEFsbCwgYWRkLCBhbmQgcmVtb3ZlIGFyZSB0cmVhdGVkIGFzIHRoZXkgbm9ybWFsbHkgYXJlLlxuICB9XG5cbiAgaWYgKGNoYW5nZS5yZXNldCB8fCBjaGFuZ2Uuc2VsZWN0QWxsICE9IG51bGwgfHwgY2hhbmdlLnNldCAhPSBudWxsKSB7XG4gICAgbGV0IHNldDogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVDZWxsVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gY2hhbmdlLnNldCA/PyBbXTtcbiAgICBjb25zdCBzZWxlY3RBbGw6IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4gPSBjaGFuZ2UucmVzZXQgPT09IHRydWUgPyBzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUgOiBjaGFuZ2Uuc2VsZWN0QWxsO1xuXG4gICAgc3dpdGNoIChzZWxlY3RBbGwpIHtcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGlmIChtaW5EYXRlRnJvbUZpbHRlciAhPSBudWxsICYmIG1heERhdGVGcm9tRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgICBpbnB1dFN0YXJ0ID0gbWluRGF0ZUZyb21GaWx0ZXI7XG4gICAgICAgICAgaW5wdXRFbmQgPSBtYXhEYXRlRnJvbUZpbHRlcjtcbiAgICAgICAgICBzZXQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBpbnB1dFN0YXJ0ID0gbnVsbDtcbiAgICAgICAgaW5wdXRFbmQgPSBudWxsO1xuICAgICAgICBzZXQgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRTZXRJbmRleGVzID0gYXNJbmRleGVzKHNldCk7XG4gICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KGlucHV0U2V0SW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yICYmICFzZWxlY3RBbGwpIHtcbiAgICAgIGxldCBtaW5JbmRleDogTWF5YmU8bnVtYmVyPjtcbiAgICAgIGxldCBtYXhJbmRleDogTWF5YmU8bnVtYmVyPjtcblxuICAgICAgaWYgKG1pbkRhdGVGcm9tRmlsdGVyICE9IG51bGwgJiYgbWF4RGF0ZUZyb21GaWx0ZXIgIT0gbnVsbCkge1xuICAgICAgICAvLyBvbmx5IGFwcGxpY2FibGUgd2hlbiB0aGUgZmlsdGVyIGlzIHNldC5cbiAgICAgICAgbWluSW5kZXggPSBpbmRleEZhY3RvcnkobWluRGF0ZUZyb21GaWx0ZXIpO1xuICAgICAgICBtYXhJbmRleCA9IGluZGV4RmFjdG9yeShtYXhEYXRlRnJvbUZpbHRlcik7XG5cbiAgICAgICAgaW5wdXRTdGFydCA9IG1pbkRhdGVGcm9tRmlsdGVyO1xuICAgICAgICBpbnB1dEVuZCA9IG1heERhdGVGcm9tRmlsdGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2hlbiB0aGUgZmlsdGVyIGlzIG5vdCBzZXQsIHVzZSB0aGUgbGVhc3QgYW5kIGdyZWF0ZXN0IGluZGV4ZXMgZnJvbSB0aGUgaW5wdXQgc2V0LlxuICAgICAgICBjb25zdCBtaW5BbmRNYXggPSBtaW5BbmRNYXhOdW1iZXIoaW5wdXRTZXRJbmRleGVzKTtcblxuICAgICAgICBpZiAobWluQW5kTWF4ICE9IG51bGwpIHtcbiAgICAgICAgICBtaW5JbmRleCA9IG1pbkFuZE1heC5taW47XG4gICAgICAgICAgbWF4SW5kZXggPSBtaW5BbmRNYXgubWF4O1xuICAgICAgICAgIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdTdGFydERhdGVGYWN0b3J5KGluZGV4RmFjdG9yeS5fdGltaW5nKTtcblxuICAgICAgICAgIGlucHV0U3RhcnQgPSBkYXRlRmFjdG9yeShtaW5BbmRNYXgubWluKTtcbiAgICAgICAgICBpbnB1dEVuZCA9IG1pbkFuZE1heC5taW4gPT09IG1pbkFuZE1heC5tYXggPyBpbnB1dFN0YXJ0IDogZGF0ZUZhY3RvcnkobWluQW5kTWF4Lm1heCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBhbiBlbXB0eSBzZXQgLyB1c2luZyBcIm5vbmVcIiB3aXRoIHNlbGVjdEFsbC5cbiAgICAgICAgICBpbnB1dFN0YXJ0ID0gbnVsbDtcbiAgICAgICAgICBpbnB1dEVuZCA9IG51bGw7XG4gICAgICAgICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdG9nZ2xlZEluZGV4ZXMgc2hvdWxkIG5vdCBpbmNsdWRlIGFueSBpbmRleGVzIHdlIHdhbnQgdG8gaW5jbHVkZVxuICAgICAgaWYgKG1pbkluZGV4ICE9IG51bGwgJiYgbWF4SW5kZXggIT0gbnVsbCkge1xuICAgICAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQocmFuZ2UobWluSW5kZXgsIG1heEluZGV4ICsgMSkuZmlsdGVyKCh4KSA9PiAhdG9nZ2xlZEluZGV4ZXMuaGFzKHgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChzdGF0ZS50b2dnbGVkSW5kZXhlcyk7IC8vIGNvcHkgdGhlIHNldFxuXG4gICAgaWYgKGNoYW5nZS50b2dnbGUpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWRUb1RvZ2dsZSA9IGFzSW5kZXhlcyhjaGFuZ2UudG9nZ2xlKS5maWx0ZXIoKGkpID0+IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2VlayhpKSkpO1xuICAgICAgdG9nZ2xlSW5TZXQodG9nZ2xlZEluZGV4ZXMsIGFsbG93ZWRUb1RvZ2dsZSk7XG4gICAgfVxuXG4gICAgbGV0IGFkZFRvRXhjbHVzaW9uOiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0Pj47XG4gICAgbGV0IHJlbW92ZUZyb21FeGNsdXNpb246IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PjtcblxuICAgIGlmIChjaGFuZ2UuYWRkKSB7XG4gICAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yKSB7XG4gICAgICAgIGFkZFRvRXhjbHVzaW9uID0gY2hhbmdlLmFkZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUZyb21FeGNsdXNpb24gPSBjaGFuZ2UuYWRkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2UucmVtb3ZlKSB7XG4gICAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yKSB7XG4gICAgICAgIHJlbW92ZUZyb21FeGNsdXNpb24gPSBjaGFuZ2UucmVtb3ZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkVG9FeGNsdXNpb24gPSBjaGFuZ2UucmVtb3ZlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZGRUb0V4Y2x1c2lvbikge1xuICAgICAgcmVtb3ZlRnJvbVNldCh0b2dnbGVkSW5kZXhlcywgYXNJbmRleGVzKGFkZFRvRXhjbHVzaW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZUZyb21FeGNsdXNpb24pIHtcbiAgICAgIGFkZFRvU2V0KHRvZ2dsZWRJbmRleGVzLCBhc0luZGV4ZXMocmVtb3ZlRnJvbUV4Y2x1c2lvbikpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQsIGlucHV0RW5kLCB0b2dnbGVkSW5kZXhlcyB9O1xuICBuZXh0U3RhdGUuaXNFbmFibGVkRGF5ID0gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcblxuICAvLyBSZWNhbGN1bGF0ZSB0aGUgcmFuZ2UgYW5kIHNpbXBsaWZpZWQgdG8gZXhjbHVzaW9uc1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKG5leHRTdGF0ZSk7XG5cbiAgaWYgKHJhbmdlQW5kRXhjbHVzaW9uKSB7XG4gICAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4ubmV4dFN0YXRlLCB0b2dnbGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7IC4uLnN0YXRlLCB0b2dnbGVkSW5kZXhlczogbmV3IFNldCgpLCBpbnB1dFN0YXJ0OiBudWxsLCBpbnB1dEVuZDogbnVsbCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIGluZGV4RmFjdG9yeSB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgc3RhcnQ6IG1pbkRhdGUsIGVuZDogbWF4RGF0ZSB9ID0gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZShzdGF0ZSk7XG5cbiAgY29uc3QgaW5wdXRTdGFydDogRGF0ZSA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0U3RhcnQpO1xuICBjb25zdCBpbnB1dEVuZDogRGF0ZSA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0RW5kKTsgLy8gbWlkbmlnaHQgb2YgdGhlIGxhc3QgZGF5XG5cbiAgY29uc3QgaXNWYWxpZFJhbmdlID0gbWluRGF0ZSAhPSBudWxsIHx8IG1heERhdGUgIT0gbnVsbCA/IGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24oeyBzdGFydDogbWluRGF0ZSA/PyB1bmRlZmluZWQsIGVuZDogbWF4RGF0ZSA/PyB1bmRlZmluZWQgfSkgOiAoKSA9PiB0cnVlO1xuXG4gIGlmICghaXNWYWxpZFJhbmdlKGlucHV0U3RhcnQpIHx8ICFpc1ZhbGlkUmFuZ2UoaW5wdXRFbmQpIHx8IChpc1NhbWVEYXRlRGF5KGlucHV0U3RhcnQsIGN1cnJlbnRJbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlRGF5KGlucHV0RW5kLCBjdXJyZW50SW5wdXRFbmQpKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gaWYgbm8gY2hhbmdlLCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gIH1cblxuICAvLyByZXRhaW4gYWxsIGluZGV4ZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBuZXcgcmFuZ2VcbiAgY29uc3QgbWluSW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gIGNvbnN0IG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKSArIDE7XG5cbiAgY29uc3QgY3VycmVudEluZGV4ZXM6IERhdGVDZWxsSW5kZXhbXSA9IEFycmF5LmZyb20oc3RhdGUudG9nZ2xlZEluZGV4ZXMpO1xuICBjb25zdCBpc0luQ3VycmVudFJhbmdlID0gaXNJbmRleE51bWJlckluSW5kZXhSYW5nZUZ1bmN0aW9uKHsgbWluSW5kZXgsIG1heEluZGV4IH0pO1xuICBjb25zdCBleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlID0gY3VycmVudEluZGV4ZXMuZmlsdGVyKGlzSW5DdXJyZW50UmFuZ2UpO1xuICBjb25zdCB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgdG9nZ2xlZEluZGV4ZXMsIGlucHV0U3RhcnQsIGlucHV0RW5kIH07XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlOiBCdWlsZGluZzxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGU+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpO1xuICBuZXh0U3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUobmV4dFN0YXRlIGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk7XG4gIHJldHVybiBuZXh0U3RhdGUgYXMgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZUNlbGxUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PiB7XG4gIGNvbnN0IHsgYWxsb3dlZERheXNPZldlZWssIGluZGV4RmFjdG9yeSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIGluZGV4RGF5T2ZXZWVrLCBzeXN0ZW1UaW1lem9uZSB9ID0gc3RhdGU7XG4gIGxldCBpc0luU3RhcnRBbmRFbmRSYW5nZTogSXNEYXRlV2l0aGluRGF0ZUNlbGxSYW5nZUZ1bmN0aW9uO1xuXG4gIGlmIChpbnB1dFN0YXJ0ICYmIGlucHV0RW5kKSB7XG4gICAgaXNJblN0YXJ0QW5kRW5kUmFuZ2UgPSBpc0RhdGVXaXRoaW5EYXRlQ2VsbFJhbmdlRnVuY3Rpb24oeyBzdGFydHNBdDogeyBzdGFydHNBdDogc3RhdGUuc3RhcnQsIHRpbWV6b25lOiBzeXN0ZW1UaW1lem9uZSB9LCByYW5nZTogeyBzdGFydDogaW5wdXRTdGFydCwgZW5kOiBpbnB1dEVuZCB9IH0pO1xuICB9IGVsc2Uge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gKCkgPT4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKGlucHV0OiBEYXRlQ2VsbFRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gaW5kZXhEYXlPZldlZWsoaW5kZXgpO1xuXG4gICAgY29uc3QgaXNJblNlbGVjdGVkUmFuZ2UgPSBpc0luU3RhcnRBbmRFbmRSYW5nZShpbmRleCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHN0YXRlLnRvZ2dsZWRJbmRleGVzLmhhcyhpbmRleCk7XG4gICAgY29uc3QgaXNBbGxvd2VkRGF5T2ZXZWVrID0gYWxsb3dlZERheXNPZldlZWsuaGFzKGRheU9mV2Vlayk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBpc0FsbG93ZWREYXlPZldlZWsgJiYgKChpc0luU2VsZWN0ZWRSYW5nZSAmJiAhaXNTZWxlY3RlZCkgfHwgKGlzU2VsZWN0ZWQgJiYgIWlzSW5TZWxlY3RlZFJhbmdlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU+IHtcbiAgY29uc3QgeyBpbmRleEZhY3Rvcnk6IHN5c3RlbUluZGV4RmFjdG9yeSwgYWxsb3dlZERheXNPZldlZWssIGVmZmVjdGl2ZVNjaGVkdWxlRGF5cywgaW5kZXhEYXlPZldlZWssIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyLCBmaWx0ZXIsIHN5c3RlbVRpbWV6b25lIH0gPSBzdGF0ZTtcbiAgbGV0IHRpbWV6b25lID0gc3lzdGVtVGltZXpvbmU7XG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24oc3RhdGUpO1xuXG4gIGlmIChyYW5nZUFuZEV4Y2x1c2lvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0YXJ0OiByYW5nZVN0YXJ0LCBlbmQ6IHJhbmdlRW5kLCBleGNsdWRlZDogYWxsRXhjbHVkZWQsIGRhdGVDZWxsUmFuZ2UgfSA9IHJhbmdlQW5kRXhjbHVzaW9uO1xuICBsZXQgZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZTogRGF0ZUNlbGxJbmRleFtdID0gW107XG4gIGxldCBpbmRleE9mZnNldCA9IGRhdGVDZWxsUmFuZ2UuaTtcblxuICBsZXQgc3RhcnQgPSByYW5nZVN0YXJ0O1xuICBsZXQgZW5kID0gcmFuZ2VFbmQ7XG5cbiAgLy8gSWYgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgaXMgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIG9mZnNldCB0aGUgdmFsdWVzIHRvIGJlIHJlbGF0aXZlIHRvIHRoYXQgc3RhcnQuXG4gIGlmIChjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiBmaWx0ZXI/LnN0YXJ0KSB7XG4gICAgc3RhcnQgPSBmaWx0ZXIuc3RhcnQ7IC8vIGFsd2F5cyBzdGFydCBhdCB0aGUgZmlsdGVyJ3Mgc3RhcnQgZGF0ZVxuICAgIGxldCBzdGFydEluU3lzdGVtVGltZXpvbmUgPSBzdGFydDtcblxuICAgIGlmIChmaWx0ZXIudGltZXpvbmUpIHtcbiAgICAgIHRpbWV6b25lID0gZmlsdGVyLnRpbWV6b25lO1xuICAgICAgY29uc3QgZmlsdGVyTm9ybWFsID0gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHRpbWV6b25lKTtcbiAgICAgIGVuZCA9IGZpbHRlck5vcm1hbC5zdGFydE9mRGF5SW5UYXJnZXRUaW1lem9uZShlbmQpO1xuICAgICAgc3RhcnRJblN5c3RlbVRpbWV6b25lID0gZmlsdGVyTm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoc3RhcnQpOyAvLyBjb252ZXJ0IHRoZSBzdGFydCB0byB0aGUgc3lzdGVtIHRpbWV6b25lIG5vcm1hbCBmb3IgZGVyaXZpbmcgdGhlIGluZGV4XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2VTdGFydEluZGV4ID0gc3lzdGVtSW5kZXhGYWN0b3J5KHJhbmdlU3RhcnQpO1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBzeXN0ZW1JbmRleEZhY3Rvcnkoc3RhcnRJblN5c3RlbVRpbWV6b25lKTtcbiAgICBjb25zdCBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0ID0gcmFuZ2VTdGFydEluZGV4IC0gc3RhcnRJbmRleDtcbiAgICBmaWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlID0gcmFuZ2UoMCwgZmlsdGVyU3RhcnRJbmRleE9mZnNldCk7XG4gICAgaW5kZXhPZmZzZXQgPSBpbmRleE9mZnNldCAtIGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQ7XG4gIH1cblxuICBjb25zdCBleGNsdWRlZCA9IGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyXG4gICAgPyBhbGxFeGNsdWRlZC5maWx0ZXIoKHgpID0+IHtcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZEluZGV4ID0gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKHgpKTsgLy8gPz8/XG4gICAgICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gICAgICB9KVxuICAgIDogYWxsRXhjbHVkZWQ7XG5cbiAgY29uc3Qgb2Zmc2V0RXhjbHVkZWQ6IERhdGVDZWxsSW5kZXhbXSA9IGV4Y2x1ZGVkLm1hcCgoeCkgPT4geCAtIGluZGV4T2Zmc2V0KTsgLy8gc2V0IHRvIHRoZSBwcm9wZXIgb2Zmc2V0XG5cbiAgY29uc3QgZXggPSBbLi4uZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSwgLi4ub2Zmc2V0RXhjbHVkZWRdO1xuXG4gIGNvbnN0IHc6IERhdGVDZWxsU2NoZWR1bGVFbmNvZGVkV2VlayA9IGRhdGVDZWxsU2NoZWR1bGVFbmNvZGVkV2VlayhlZmZlY3RpdmVTY2hlZHVsZURheXMpO1xuICBjb25zdCBkOiBEYXRlQ2VsbEluZGV4W10gPSBbXTsgLy8gXCJpbmNsdWRlZFwiIGJsb2NrcyBhcmUgbmV2ZXIgdXNlZC9jYWxjdWxhdGVkLlxuXG4gIC8vIEFsd2F5cyBlbnN1cmUgdGhlIGVuZCBpcyBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQuXG4gIGlmIChpc0JlZm9yZShlbmQsIHN0YXJ0KSkge1xuICAgIGVuZCA9IHN0YXJ0OyAvLyBlbmQgaXMgc3RhcnRcbiAgfVxuXG4gIGNvbnN0IGRhdGVTY2hlZHVsZVJhbmdlOiBEYXRlQ2VsbFNjaGVkdWxlRGF0ZVJhbmdlID0ge1xuICAgIHRpbWV6b25lLFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICB3LFxuICAgIGQsXG4gICAgZXhcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGRhdGVTY2hlZHVsZVJhbmdlLFxuICAgIG1pbk1heFJhbmdlOiB7IHN0YXJ0LCBlbmQgfVxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzZWxlY3RlZCBkYXRlIHJhbmdlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjZWxsIHJhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiBleHRlbmRzIERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBDb3JyZXNwb25kcyB0byB0aGUgc3RhcnQgYW5kIGVuZCBpbmRleGVzIGluIHRoZSBkYXRlIHJhbmdlLlxuICAgKi9cbiAgZGF0ZUNlbGxSYW5nZTogRGF0ZUNlbGxSYW5nZVdpdGhSYW5nZTtcbiAgLyoqXG4gICAqIEFsbCBleGNsdWRlZCBpbmRleGVzLlxuICAgKi9cbiAgZXhjbHVkZWQ6IERhdGVDZWxsSW5kZXhbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24+IHtcbiAgY29uc3QgeyBzdGFydDogY3VycmVudFN0YXJ0LCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSwgc3lzdGVtVGltZXpvbmUgfSA9IHN0YXRlO1xuXG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdTdGFydERhdGVGYWN0b3J5KHsgc3RhcnRzQXQ6IGN1cnJlbnRTdGFydCwgdGltZXpvbmU6IHN5c3RlbVRpbWV6b25lIH0pO1xuICBjb25zdCBkYXRlQ2VsbFJhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQ2VsbFJhbmdlKHN0YXRlKTtcblxuICBpZiAoZGF0ZUNlbGxSYW5nZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIHJldHVybnMgbnVsbCBpZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gIH1cblxuICBjb25zdCBzdGFydCA9IGRhdGVGYWN0b3J5KGRhdGVDZWxsUmFuZ2UuaSk7XG4gIGNvbnN0IGVuZCA9IGRhdGVGYWN0b3J5KGRhdGVDZWxsUmFuZ2UudG8pO1xuXG4gIGNvbnN0IGV4Y2x1ZGVkOiBEYXRlQ2VsbEluZGV4W10gPSByYW5nZShkYXRlQ2VsbFJhbmdlLmksIGRhdGVDZWxsUmFuZ2UudG8gKyAxKS5maWx0ZXIoKHgpID0+IHtcbiAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSAhaXNFbmFibGVkRGF5KHgpIHx8ICFpc0VuYWJsZWRGaWx0ZXJEYXkoeCk7XG4gICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24gPSB7XG4gICAgZGF0ZUNlbGxSYW5nZSxcbiAgICBzdGFydCxcbiAgICBlbmQsXG4gICAgZXhjbHVkZWRcbiAgfTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUNlbGxUaW1pbmdEYXRlRmFjdG9yeSh7IHN0YXJ0c0F0OiBzdGF0ZS5zdGFydCwgdGltZXpvbmU6IHN0YXRlLnN5c3RlbVRpbWV6b25lIH0pO1xuICBjb25zdCBkYXRlQ2VsbFJhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQ2VsbFJhbmdlKHN0YXRlKTtcbiAgY29uc3QgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+ID0gZGF0ZUNlbGxSYW5nZSAhPSBudWxsID8geyBzdGFydDogZGF0ZUZhY3RvcnkoZGF0ZUNlbGxSYW5nZS5pKSwgZW5kOiBkYXRlRmFjdG9yeShkYXRlQ2VsbFJhbmdlLnRvIGFzIG51bWJlcikgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRhdGVSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUNlbGxSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZUNlbGxSYW5nZVdpdGhSYW5nZT4ge1xuICBjb25zdCB7IGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2VlaywgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXkgfSA9IHN0YXRlO1xuICBjb25zdCBlbmFibGVkRXhjbHVzaW9uSW5kZXhlcyA9IEFycmF5LmZyb20oc3RhdGUudG9nZ2xlZEluZGV4ZXMpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gIGNvbnN0IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzID0gbWluQW5kTWF4TnVtYmVyKGVuYWJsZWRFeGNsdXNpb25JbmRleGVzKTtcblxuICBsZXQgc3RhcnRSYW5nZTogTWF5YmU8RGF0ZUNlbGxJbmRleD47XG4gIGxldCBlbmRSYW5nZTogTWF5YmU8RGF0ZUNlbGxJbmRleD47XG5cbiAgaWYgKG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzKSB7XG4gICAgc3RhcnRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1pbjtcbiAgICBlbmRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1heDtcbiAgfVxuXG4gIGlmIChpbnB1dFN0YXJ0ICE9IG51bGwgJiYgaW5wdXRFbmQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0U3RhcnRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgICBjb25zdCBpbnB1dEVuZEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKTtcblxuICAgIHN0YXJ0UmFuZ2UgPSBzdGFydFJhbmdlICE9IG51bGwgPyBNYXRoLm1pbihpbnB1dFN0YXJ0SW5kZXgsIHN0YXJ0UmFuZ2UpIDogaW5wdXRTdGFydEluZGV4O1xuICAgIGVuZFJhbmdlID0gZW5kUmFuZ2UgIT0gbnVsbCA/IE1hdGgubWF4KGlucHV0RW5kSW5kZXgsIGVuZFJhbmdlKSA6IGlucHV0RW5kSW5kZXg7XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICBjb25zdCBzY2FuU3RhcnRJbmRleCA9IHN0YXJ0UmFuZ2U7XG4gICAgY29uc3Qgc2NhbkVuZEluZGV4ID0gZW5kUmFuZ2U7XG5cbiAgICAvLyBjbGVhciBzdGFydCBhbmQgZW5kXG4gICAgc3RhcnRSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICBlbmRSYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoZSBtaW4gaXMgZXF1YWwgdG8gdGhlIHN0YXJ0IGluZGV4LCB0aGVuIHdlIGFyZSBpbiB0aGUgcmFuZ2UgYW5kIG5lZWQgdG8gaXRlcmF0ZSBkYXRlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIG5vdCBzZWxlY3RlZC9leGNsdWRlZC5cbiAgICBmb3IgKGxldCBpID0gc2NhblN0YXJ0SW5kZXg7IGkgPD0gc2NhbkVuZEluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIHN0YXJ0UmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYW1lIHdpdGggdGhlIG1heFxuICAgIGZvciAobGV0IGkgPSBzY2FuRW5kSW5kZXg7IGkgPj0gc2NhblN0YXJ0SW5kZXg7IGkgLT0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgZW5kUmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBpOiBzdGFydFJhbmdlLCB0bzogZW5kUmFuZ2UgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=