@openmrs/ngx-formentry 3.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 (351) hide show
  1. package/abstract-controls-extension/afe-control-type.d.ts +6 -0
  2. package/abstract-controls-extension/afe-form-array.d.ts +43 -0
  3. package/abstract-controls-extension/afe-form-control.d.ts +46 -0
  4. package/abstract-controls-extension/afe-form-group.d.ts +38 -0
  5. package/abstract-controls-extension/control-extensions.d.ts +4 -0
  6. package/abstract-controls-extension/index.d.ts +4 -0
  7. package/abstract-controls-extension/value-change.listener.d.ts +4 -0
  8. package/bundles/openmrs-ngx-formentry.umd.js +16104 -0
  9. package/bundles/openmrs-ngx-formentry.umd.js.map +1 -0
  10. package/change-tracking/control-relation.d.ts +12 -0
  11. package/change-tracking/control-relations.d.ts +12 -0
  12. package/components/afe-ng-select.component.d.ts +28 -0
  13. package/components/appointments-overview/appointments-overview.component.d.ts +17 -0
  14. package/components/check-box/checkbox.component.d.ts +19 -0
  15. package/components/check-box/checkbox.module.d.ts +9 -0
  16. package/components/custom-component-wrapper/custom-component-wrapper..module.d.ts +9 -0
  17. package/components/custom-component-wrapper/custom-component-wrapper.component.d.ts +12 -0
  18. package/components/custom-control-wrapper/custom-control-wrapper..module.d.ts +10 -0
  19. package/components/custom-control-wrapper/custom-control-wrapper.component.d.ts +28 -0
  20. package/components/date-time-picker/date-picker/date-picker.component.d.ts +45 -0
  21. package/components/date-time-picker/date-time-picker.component.d.ts +28 -0
  22. package/components/date-time-picker/date-time-picker.module.d.ts +13 -0
  23. package/components/date-time-picker/index.d.ts +8 -0
  24. package/components/date-time-picker/picker-modal/modal.component.d.ts +12 -0
  25. package/components/date-time-picker/pipes/moment.pipe.d.ts +11 -0
  26. package/components/date-time-picker/time-picker/time-picker.component.d.ts +32 -0
  27. package/components/file-upload/file-upload.component.d.ts +29 -0
  28. package/components/file-upload/file-upload.module.d.ts +12 -0
  29. package/components/file-upload/secure.pipe.d.ts +26 -0
  30. package/components/input/input.directive.d.ts +31 -0
  31. package/components/input/input.module.d.ts +11 -0
  32. package/components/input/label.component.d.ts +90 -0
  33. package/components/input/text-area.directive.d.ts +24 -0
  34. package/components/ngx-datetime-picker/ngx-datetime-picker.component.d.ts +21 -0
  35. package/components/ngx-datetime-picker/ngx-datetime-picker.module.d.ts +11 -0
  36. package/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.d.ts +189 -0
  37. package/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.d.ts +15 -0
  38. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.d.ts +73 -0
  39. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.d.ts +5 -0
  40. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.d.ts +12 -0
  41. package/components/ngx-pick-datetime/lib/date-time/calendar-body.component.d.ts +76 -0
  42. package/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.d.ts +139 -0
  43. package/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.d.ts +108 -0
  44. package/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.d.ts +120 -0
  45. package/components/ngx-pick-datetime/lib/date-time/calendar.component.d.ts +137 -0
  46. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +92 -0
  47. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.d.ts +121 -0
  48. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +149 -0
  49. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.d.ts +51 -0
  50. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.d.ts +20 -0
  51. package/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.d.ts +8 -0
  52. package/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.d.ts +156 -0
  53. package/components/ngx-pick-datetime/lib/date-time/date-time.class.d.ts +89 -0
  54. package/components/ngx-pick-datetime/lib/date-time/date-time.module.d.ts +23 -0
  55. package/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.d.ts +10 -0
  56. package/components/ngx-pick-datetime/lib/date-time/timer-box.component.d.ts +35 -0
  57. package/components/ngx-pick-datetime/lib/date-time/timer.component.d.ts +128 -0
  58. package/components/ngx-pick-datetime/lib/dialog/dialog-config.class.d.ts +93 -0
  59. package/components/ngx-pick-datetime/lib/dialog/dialog-container.component.d.ts +58 -0
  60. package/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.d.ts +49 -0
  61. package/components/ngx-pick-datetime/lib/dialog/dialog.module.d.ts +11 -0
  62. package/components/ngx-pick-datetime/lib/dialog/dialog.service.d.ts +73 -0
  63. package/components/ngx-pick-datetime/lib/utils/index.d.ts +4 -0
  64. package/components/ngx-pick-datetime/lib/utils/object.utils.d.ts +11 -0
  65. package/components/ngx-remote-select/ngx-remote-select.component.d.ts +40 -0
  66. package/components/ngx-remote-select/ngx-remote-select.module.d.ts +10 -0
  67. package/components/ngx-tabset/components/ngx-tab-set.component.d.ts +19 -0
  68. package/components/ngx-tabset/components/tab.component.d.ts +13 -0
  69. package/components/ngx-tabset/directives/hover-class.directive.d.ts +11 -0
  70. package/components/ngx-tabset/modules/ngx-tabset.module.d.ts +19 -0
  71. package/components/number-input/number-input.component.d.ts +151 -0
  72. package/components/number-input/number-input.module.d.ts +9 -0
  73. package/components/radio-button/radio.component.d.ts +22 -0
  74. package/components/radio-button/radio.module.d.ts +9 -0
  75. package/components/select/optgroup.directive.d.ts +6 -0
  76. package/components/select/option.directive.d.ts +6 -0
  77. package/components/select/select.component.d.ts +115 -0
  78. package/components/select/select.module.d.ts +11 -0
  79. package/esm2015/abstract-controls-extension/afe-control-type.js +8 -0
  80. package/esm2015/abstract-controls-extension/afe-form-array.js +85 -0
  81. package/esm2015/abstract-controls-extension/afe-form-control.js +88 -0
  82. package/esm2015/abstract-controls-extension/afe-form-group.js +61 -0
  83. package/esm2015/abstract-controls-extension/control-extensions.js +5 -0
  84. package/esm2015/abstract-controls-extension/index.js +5 -0
  85. package/esm2015/abstract-controls-extension/value-change.listener.js +2 -0
  86. package/esm2015/change-tracking/control-relation.js +44 -0
  87. package/esm2015/change-tracking/control-relations.js +32 -0
  88. package/esm2015/components/afe-ng-select.component.js +101 -0
  89. package/esm2015/components/appointments-overview/appointments-overview.component.js +121 -0
  90. package/esm2015/components/check-box/checkbox.component.js +90 -0
  91. package/esm2015/components/check-box/checkbox.module.js +19 -0
  92. package/esm2015/components/custom-component-wrapper/custom-component-wrapper..module.js +21 -0
  93. package/esm2015/components/custom-component-wrapper/custom-component-wrapper.component.js +23 -0
  94. package/esm2015/components/custom-control-wrapper/custom-control-wrapper..module.js +22 -0
  95. package/esm2015/components/custom-control-wrapper/custom-control-wrapper.component.js +73 -0
  96. package/esm2015/components/date-time-picker/date-picker/date-picker.component.js +192 -0
  97. package/esm2015/components/date-time-picker/date-time-picker.component.js +119 -0
  98. package/esm2015/components/date-time-picker/date-time-picker.module.js +47 -0
  99. package/esm2015/components/date-time-picker/index.js +9 -0
  100. package/esm2015/components/date-time-picker/picker-modal/modal.component.js +31 -0
  101. package/esm2015/components/date-time-picker/pipes/moment.pipe.js +17 -0
  102. package/esm2015/components/date-time-picker/time-picker/time-picker.component.js +125 -0
  103. package/esm2015/components/file-upload/file-upload.component.js +122 -0
  104. package/esm2015/components/file-upload/file-upload.module.js +39 -0
  105. package/esm2015/components/file-upload/secure.pipe.js +101 -0
  106. package/esm2015/components/input/input.directive.js +78 -0
  107. package/esm2015/components/input/input.module.js +23 -0
  108. package/esm2015/components/input/label.component.js +263 -0
  109. package/esm2015/components/input/text-area.directive.js +54 -0
  110. package/esm2015/components/ngx-datetime-picker/ngx-datetime-picker.component.js +80 -0
  111. package/esm2015/components/ngx-datetime-picker/ngx-datetime-picker.module.js +38 -0
  112. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.js +114 -0
  113. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.js +7 -0
  114. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.js +347 -0
  115. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.js +16 -0
  116. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.js +39 -0
  117. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-body.component.js +149 -0
  118. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.js +445 -0
  119. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.js +378 -0
  120. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.js +373 -0
  121. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar.component.js +348 -0
  122. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.js +265 -0
  123. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.js +399 -0
  124. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.js +614 -0
  125. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.js +62 -0
  126. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.js +70 -0
  127. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.js +21 -0
  128. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.js +528 -0
  129. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time.class.js +166 -0
  130. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time.module.js +83 -0
  131. package/esm2015/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.js +28 -0
  132. package/esm2015/components/ngx-pick-datetime/lib/date-time/timer-box.component.js +96 -0
  133. package/esm2015/components/ngx-pick-datetime/lib/date-time/timer.component.js +298 -0
  134. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-config.class.js +56 -0
  135. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-container.component.js +247 -0
  136. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.js +119 -0
  137. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog.module.js +27 -0
  138. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog.service.js +233 -0
  139. package/esm2015/components/ngx-pick-datetime/lib/utils/index.js +5 -0
  140. package/esm2015/components/ngx-pick-datetime/lib/utils/object.utils.js +26 -0
  141. package/esm2015/components/ngx-remote-select/ngx-remote-select.component.js +135 -0
  142. package/esm2015/components/ngx-remote-select/ngx-remote-select.module.js +21 -0
  143. package/esm2015/components/ngx-tabset/components/ngx-tab-set.component.js +76 -0
  144. package/esm2015/components/ngx-tabset/components/tab.component.js +37 -0
  145. package/esm2015/components/ngx-tabset/directives/hover-class.directive.js +30 -0
  146. package/esm2015/components/ngx-tabset/modules/ngx-tabset.module.js +38 -0
  147. package/esm2015/components/number-input/number-input.component.js +233 -0
  148. package/esm2015/components/number-input/number-input.module.js +20 -0
  149. package/esm2015/components/radio-button/radio.component.js +87 -0
  150. package/esm2015/components/radio-button/radio.module.js +19 -0
  151. package/esm2015/components/select/optgroup.directive.js +19 -0
  152. package/esm2015/components/select/option.directive.js +19 -0
  153. package/esm2015/components/select/select.component.js +187 -0
  154. package/esm2015/components/select/select.module.js +23 -0
  155. package/esm2015/form-entry/control-alerts/alert-helpers.js +40 -0
  156. package/esm2015/form-entry/control-alerts/can-generate-alert.js +2 -0
  157. package/esm2015/form-entry/control-calculators/can-calculate.js +2 -0
  158. package/esm2015/form-entry/control-hiders-disablers/can-disable.js +2 -0
  159. package/esm2015/form-entry/control-hiders-disablers/can-hide.js +2 -0
  160. package/esm2015/form-entry/control-hiders-disablers/disabler-helper.js +32 -0
  161. package/esm2015/form-entry/control-hiders-disablers/hider-helpers.js +40 -0
  162. package/esm2015/form-entry/data-sources/data-sources.js +30 -0
  163. package/esm2015/form-entry/data-sources/dummy-data-source.js +104 -0
  164. package/esm2015/form-entry/directives/collapse-animations.js +11 -0
  165. package/esm2015/form-entry/directives/collapse.directive.js +172 -0
  166. package/esm2015/form-entry/directives/historical-value.directive.js +67 -0
  167. package/esm2015/form-entry/error-renderer/error-renderer.component.js +56 -0
  168. package/esm2015/form-entry/expression-runner/expression-runner.js +170 -0
  169. package/esm2015/form-entry/form-entry.module.js +187 -0
  170. package/esm2015/form-entry/form-factory/control-relations.factory.js +238 -0
  171. package/esm2015/form-entry/form-factory/form-control.service.js +119 -0
  172. package/esm2015/form-entry/form-factory/form-node.js +96 -0
  173. package/esm2015/form-entry/form-factory/form.factory.js +141 -0
  174. package/esm2015/form-entry/form-factory/form.js +189 -0
  175. package/esm2015/form-entry/form-factory/hiders-disablers.factory.js +67 -0
  176. package/esm2015/form-entry/form-factory/question.factory.js +942 -0
  177. package/esm2015/form-entry/form-factory/show-messages.factory.js +31 -0
  178. package/esm2015/form-entry/form-factory/validation.factory.js +147 -0
  179. package/esm2015/form-entry/form-renderer/form-renderer.component.js +268 -0
  180. package/esm2015/form-entry/helpers/historical-expression-helper-service.js +42 -0
  181. package/esm2015/form-entry/helpers/historical-field-helper-service.js +39 -0
  182. package/esm2015/form-entry/helpers/js-expression-helper.js +275 -0
  183. package/esm2015/form-entry/helpers/risk-dataset-table.js +247 -0
  184. package/esm2015/form-entry/pipes/time-ago.pipe.js +107 -0
  185. package/esm2015/form-entry/question-models/checkbox.model.js +11 -0
  186. package/esm2015/form-entry/question-models/conditional-validation.model.js +9 -0
  187. package/esm2015/form-entry/question-models/custom-control-question.model.js +10 -0
  188. package/esm2015/form-entry/question-models/date-question.js +12 -0
  189. package/esm2015/form-entry/question-models/date-validation.model.js +10 -0
  190. package/esm2015/form-entry/question-models/file-upload-question.js +13 -0
  191. package/esm2015/form-entry/question-models/group-question.js +12 -0
  192. package/esm2015/form-entry/question-models/interfaces/base-options.js +2 -0
  193. package/esm2015/form-entry/question-models/interfaces/checkbox-options.js +2 -0
  194. package/esm2015/form-entry/question-models/interfaces/data-source.js +2 -0
  195. package/esm2015/form-entry/question-models/interfaces/date-question-options.js +2 -0
  196. package/esm2015/form-entry/question-models/interfaces/file-upload-question-options.js +2 -0
  197. package/esm2015/form-entry/question-models/interfaces/group-question-options.js +2 -0
  198. package/esm2015/form-entry/question-models/interfaces/multi-select-options.js +2 -0
  199. package/esm2015/form-entry/question-models/interfaces/nested-questions.js +7 -0
  200. package/esm2015/form-entry/question-models/interfaces/radio-button-options.js +2 -0
  201. package/esm2015/form-entry/question-models/interfaces/repeating-question-options.js +2 -0
  202. package/esm2015/form-entry/question-models/interfaces/select-option.js +2 -0
  203. package/esm2015/form-entry/question-models/interfaces/select-question-options.js +2 -0
  204. package/esm2015/form-entry/question-models/interfaces/test-order-question-options.js +2 -0
  205. package/esm2015/form-entry/question-models/interfaces/text-area-question-options.js +2 -0
  206. package/esm2015/form-entry/question-models/interfaces/text-question-options.js +2 -0
  207. package/esm2015/form-entry/question-models/interfaces/ui-select-question-options.js +2 -0
  208. package/esm2015/form-entry/question-models/js-expression-validation.model.js +8 -0
  209. package/esm2015/form-entry/question-models/max-validation.model.js +9 -0
  210. package/esm2015/form-entry/question-models/min-validation.model.js +9 -0
  211. package/esm2015/form-entry/question-models/models.js +13 -0
  212. package/esm2015/form-entry/question-models/multi-select-question.js +11 -0
  213. package/esm2015/form-entry/question-models/pair.model.js +7 -0
  214. package/esm2015/form-entry/question-models/question-base.js +26 -0
  215. package/esm2015/form-entry/question-models/radio-button.model.js +12 -0
  216. package/esm2015/form-entry/question-models/rendering-type.js +9 -0
  217. package/esm2015/form-entry/question-models/repeating-question.js +11 -0
  218. package/esm2015/form-entry/question-models/select-option.js +7 -0
  219. package/esm2015/form-entry/question-models/select-question.js +12 -0
  220. package/esm2015/form-entry/question-models/test-order-question.js +15 -0
  221. package/esm2015/form-entry/question-models/text-area-input-question.js +13 -0
  222. package/esm2015/form-entry/question-models/text-input-question.js +10 -0
  223. package/esm2015/form-entry/question-models/ui-select-question.js +11 -0
  224. package/esm2015/form-entry/question-models/validation.model.js +7 -0
  225. package/esm2015/form-entry/services/debug-mode.service.js +24 -0
  226. package/esm2015/form-entry/services/form-errors.service.js +21 -0
  227. package/esm2015/form-entry/services/form-schema-compiler.service.js +248 -0
  228. package/esm2015/form-entry/services/historical-encounter-data.service.js +172 -0
  229. package/esm2015/form-entry/utils/messages.js +12 -0
  230. package/esm2015/form-entry/validators/conditional-answered.validator.js +46 -0
  231. package/esm2015/form-entry/validators/conditional-required.validator.js +40 -0
  232. package/esm2015/form-entry/validators/date.validator.js +18 -0
  233. package/esm2015/form-entry/validators/future-date-restriction.validator.js +21 -0
  234. package/esm2015/form-entry/validators/js-expression.validator.js +26 -0
  235. package/esm2015/form-entry/validators/max-date.validator.js +23 -0
  236. package/esm2015/form-entry/validators/max.validator.js +17 -0
  237. package/esm2015/form-entry/validators/min-date.validator.js +23 -0
  238. package/esm2015/form-entry/validators/min.validator.js +17 -0
  239. package/esm2015/form-entry/validators/required.validator.js +11 -0
  240. package/esm2015/form-entry/validators/validations.js +5 -0
  241. package/esm2015/form-entry/value-adapters/encounter.adapter.js +171 -0
  242. package/esm2015/form-entry/value-adapters/obs-adapter-helper.js +512 -0
  243. package/esm2015/form-entry/value-adapters/obs.adapter.js +542 -0
  244. package/esm2015/form-entry/value-adapters/order.adapter.js +186 -0
  245. package/esm2015/form-entry/value-adapters/person-attribute.adapter.js +88 -0
  246. package/esm2015/form-entry/value-adapters/value.adapter.js +2 -0
  247. package/esm2015/lib/index.js +58 -0
  248. package/esm2015/openmrs-ngx-formentry.js +5 -0
  249. package/esm2015/public_api.js +2 -0
  250. package/esm2015/shared.module.js +21 -0
  251. package/fesm2015/openmrs-ngx-formentry.js +14323 -0
  252. package/fesm2015/openmrs-ngx-formentry.js.map +1 -0
  253. package/form-entry/control-alerts/alert-helpers.d.ts +9 -0
  254. package/form-entry/control-alerts/can-generate-alert.d.ts +18 -0
  255. package/form-entry/control-calculators/can-calculate.d.ts +5 -0
  256. package/form-entry/control-hiders-disablers/can-disable.d.ts +19 -0
  257. package/form-entry/control-hiders-disablers/can-hide.d.ts +20 -0
  258. package/form-entry/control-hiders-disablers/disabler-helper.d.ts +7 -0
  259. package/form-entry/control-hiders-disablers/hider-helpers.d.ts +9 -0
  260. package/form-entry/data-sources/data-sources.d.ts +10 -0
  261. package/form-entry/data-sources/dummy-data-source.d.ts +18 -0
  262. package/form-entry/directives/collapse-animations.d.ts +4 -0
  263. package/form-entry/directives/collapse.directive.d.ts +45 -0
  264. package/form-entry/directives/historical-value.directive.d.ts +16 -0
  265. package/form-entry/error-renderer/error-renderer.component.d.ts +18 -0
  266. package/form-entry/expression-runner/expression-runner.d.ts +18 -0
  267. package/form-entry/form-entry.module.d.ts +30 -0
  268. package/form-entry/form-factory/control-relations.factory.d.ts +18 -0
  269. package/form-entry/form-factory/form-control.service.d.ts +25 -0
  270. package/form-entry/form-factory/form-node.d.ts +52 -0
  271. package/form-entry/form-factory/form.d.ts +28 -0
  272. package/form-entry/form-factory/form.factory.d.ts +27 -0
  273. package/form-entry/form-factory/hiders-disablers.factory.d.ts +20 -0
  274. package/form-entry/form-factory/question.factory.d.ts +62 -0
  275. package/form-entry/form-factory/show-messages.factory.d.ts +15 -0
  276. package/form-entry/form-factory/validation.factory.d.ts +25 -0
  277. package/form-entry/form-renderer/form-renderer.component.d.ts +63 -0
  278. package/form-entry/helpers/historical-expression-helper-service.d.ts +8 -0
  279. package/form-entry/helpers/historical-field-helper-service.d.ts +7 -0
  280. package/form-entry/helpers/js-expression-helper.d.ts +37 -0
  281. package/form-entry/helpers/risk-dataset-table.d.ts +1 -0
  282. package/form-entry/pipes/time-ago.pipe.d.ts +14 -0
  283. package/form-entry/question-models/checkbox.model.d.ts +9 -0
  284. package/form-entry/question-models/conditional-validation.model.d.ts +6 -0
  285. package/form-entry/question-models/custom-control-question.model.d.ts +6 -0
  286. package/form-entry/question-models/date-question.d.ts +7 -0
  287. package/form-entry/question-models/date-validation.model.d.ts +5 -0
  288. package/form-entry/question-models/file-upload-question.d.ts +8 -0
  289. package/form-entry/question-models/group-question.d.ts +8 -0
  290. package/form-entry/question-models/interfaces/base-options.d.ts +30 -0
  291. package/form-entry/question-models/interfaces/checkbox-options.d.ts +7 -0
  292. package/form-entry/question-models/interfaces/data-source.d.ts +10 -0
  293. package/form-entry/question-models/interfaces/date-question-options.d.ts +3 -0
  294. package/form-entry/question-models/interfaces/file-upload-question-options.d.ts +5 -0
  295. package/form-entry/question-models/interfaces/group-question-options.d.ts +5 -0
  296. package/form-entry/question-models/interfaces/multi-select-options.d.ts +4 -0
  297. package/form-entry/question-models/interfaces/nested-questions.d.ts +6 -0
  298. package/form-entry/question-models/interfaces/radio-button-options.d.ts +8 -0
  299. package/form-entry/question-models/interfaces/repeating-question-options.d.ts +7 -0
  300. package/form-entry/question-models/interfaces/select-option.d.ts +4 -0
  301. package/form-entry/question-models/interfaces/select-question-options.d.ts +9 -0
  302. package/form-entry/question-models/interfaces/test-order-question-options.d.ts +14 -0
  303. package/form-entry/question-models/interfaces/text-area-question-options.d.ts +5 -0
  304. package/form-entry/question-models/interfaces/text-question-options.d.ts +4 -0
  305. package/form-entry/question-models/interfaces/ui-select-question-options.d.ts +9 -0
  306. package/form-entry/question-models/js-expression-validation.model.d.ts +5 -0
  307. package/form-entry/question-models/max-validation.model.d.ts +5 -0
  308. package/form-entry/question-models/min-validation.model.d.ts +5 -0
  309. package/form-entry/question-models/models.d.ts +16 -0
  310. package/form-entry/question-models/multi-select-question.d.ts +9 -0
  311. package/form-entry/question-models/pair.model.d.ts +5 -0
  312. package/form-entry/question-models/question-base.d.ts +45 -0
  313. package/form-entry/question-models/radio-button.model.d.ts +7 -0
  314. package/form-entry/question-models/rendering-type.d.ts +7 -0
  315. package/form-entry/question-models/repeating-question.d.ts +7 -0
  316. package/form-entry/question-models/select-option.d.ts +6 -0
  317. package/form-entry/question-models/select-question.d.ts +10 -0
  318. package/form-entry/question-models/test-order-question.d.ts +13 -0
  319. package/form-entry/question-models/text-area-input-question.d.ts +7 -0
  320. package/form-entry/question-models/text-input-question.d.ts +6 -0
  321. package/form-entry/question-models/ui-select-question.d.ts +11 -0
  322. package/form-entry/question-models/validation.model.d.ts +5 -0
  323. package/form-entry/services/debug-mode.service.d.ts +8 -0
  324. package/form-entry/services/form-errors.service.d.ts +13 -0
  325. package/form-entry/services/form-schema-compiler.service.d.ts +23 -0
  326. package/form-entry/services/historical-encounter-data.service.d.ts +15 -0
  327. package/form-entry/utils/messages.d.ts +11 -0
  328. package/form-entry/validators/conditional-answered.validator.d.ts +8 -0
  329. package/form-entry/validators/conditional-required.validator.d.ts +8 -0
  330. package/form-entry/validators/date.validator.d.ts +7 -0
  331. package/form-entry/validators/future-date-restriction.validator.d.ts +7 -0
  332. package/form-entry/validators/js-expression.validator.d.ts +8 -0
  333. package/form-entry/validators/max-date.validator.d.ts +6 -0
  334. package/form-entry/validators/max.validator.d.ts +6 -0
  335. package/form-entry/validators/min-date.validator.d.ts +6 -0
  336. package/form-entry/validators/min.validator.d.ts +6 -0
  337. package/form-entry/validators/required.validator.d.ts +6 -0
  338. package/form-entry/validators/validations.d.ts +4 -0
  339. package/form-entry/value-adapters/encounter.adapter.d.ts +26 -0
  340. package/form-entry/value-adapters/obs-adapter-helper.d.ts +34 -0
  341. package/form-entry/value-adapters/obs.adapter.d.ts +38 -0
  342. package/form-entry/value-adapters/order.adapter.d.ts +20 -0
  343. package/form-entry/value-adapters/person-attribute.adapter.d.ts +15 -0
  344. package/form-entry/value-adapters/value.adapter.d.ts +5 -0
  345. package/lib/index.d.ts +58 -0
  346. package/openmrs-ngx-formentry.d.ts +5 -0
  347. package/package.json +34 -0
  348. package/public_api.d.ts +1 -0
  349. package/shared.module.d.ts +9 -0
  350. package/styles/ngx-formentry.css +374 -0
  351. package/styles/picker.min.css +770 -0
@@ -0,0 +1,399 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Optional, ViewChild } from '@angular/core';
2
+ import { DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from '@angular/cdk/keycodes';
3
+ import { Subject } from 'rxjs';
4
+ import { DateTimeAdapter } from './adapter/date-time-adapter.class';
5
+ import { OwlCalendarComponent } from './calendar.component';
6
+ import { OwlDateTimeIntl } from './date-time-picker-intl.service';
7
+ import { owlDateTimePickerAnimations } from './date-time-picker.animations';
8
+ import { OwlTimerComponent } from './timer.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./date-time-picker-intl.service";
11
+ import * as i2 from "./adapter/date-time-adapter.class";
12
+ import * as i3 from "./calendar.component";
13
+ import * as i4 from "./timer.component";
14
+ import * as i5 from "@angular/cdk/a11y";
15
+ import * as i6 from "@angular/common";
16
+ export class OwlDateTimeContainerComponent {
17
+ constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
18
+ this.cdRef = cdRef;
19
+ this.elmRef = elmRef;
20
+ this.pickerIntl = pickerIntl;
21
+ this.dateTimeAdapter = dateTimeAdapter;
22
+ this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
23
+ /**
24
+ * Stream emits when try to hide picker
25
+ * */
26
+ this.hidePicker$ = new Subject();
27
+ /**
28
+ * Stream emits when try to confirm the selected value
29
+ * */
30
+ this.confirmSelected$ = new Subject();
31
+ this.pickerOpened$ = new Subject();
32
+ }
33
+ get owlDTContainerClass() {
34
+ return true;
35
+ }
36
+ get owlDTPopupContainerClass() {
37
+ return this.picker.pickerMode === 'popup';
38
+ }
39
+ get owlDTDialogContainerClass() {
40
+ return this.picker.pickerMode === 'dialog';
41
+ }
42
+ get owlDTInlineContainerClass() {
43
+ return this.picker.pickerMode === 'inline';
44
+ }
45
+ get owlDTContainerDisabledClass() {
46
+ return this.picker.disabled;
47
+ }
48
+ get owlDTContainerId() {
49
+ return this.picker.id;
50
+ }
51
+ get owlDTContainerAnimation() {
52
+ return this.picker.pickerMode === 'inline' ? '' : 'enter';
53
+ }
54
+ handleContainerAnimationDone(event) {
55
+ const toState = event.toState;
56
+ if (toState === 'enter') {
57
+ this.pickerOpened$.next();
58
+ }
59
+ }
60
+ get hidePickerStream() {
61
+ return this.hidePicker$.asObservable();
62
+ }
63
+ get confirmSelectedStream() {
64
+ return this.confirmSelected$.asObservable();
65
+ }
66
+ get pickerOpenedStream() {
67
+ return this.pickerOpened$.asObservable();
68
+ }
69
+ get pickerMoment() {
70
+ return this._clamPickerMoment;
71
+ }
72
+ set pickerMoment(value) {
73
+ if (value) {
74
+ this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker.minDateTime, this.picker.maxDateTime);
75
+ }
76
+ this.cdRef.markForCheck();
77
+ }
78
+ get pickerType() {
79
+ return this.picker.pickerType;
80
+ }
81
+ get cancelLabel() {
82
+ return this.pickerIntl.cancelBtnLabel;
83
+ }
84
+ get setLabel() {
85
+ return this.pickerIntl.setBtnLabel;
86
+ }
87
+ /**
88
+ * The range 'from' label
89
+ * */
90
+ get fromLabel() {
91
+ return this.pickerIntl.rangeFromLabel;
92
+ }
93
+ /**
94
+ * The range 'to' label
95
+ * */
96
+ get toLabel() {
97
+ return this.pickerIntl.rangeToLabel;
98
+ }
99
+ /**
100
+ * The range 'from' formatted value
101
+ * */
102
+ get fromFormattedValue() {
103
+ const value = this.picker.selecteds[0];
104
+ return value
105
+ ? this.dateTimeAdapter.format(value, this.picker.formatString)
106
+ : '';
107
+ }
108
+ /**
109
+ * The range 'to' formatted value
110
+ * */
111
+ get toFormattedValue() {
112
+ const value = this.picker.selecteds[1];
113
+ return value
114
+ ? this.dateTimeAdapter.format(value, this.picker.formatString)
115
+ : '';
116
+ }
117
+ /**
118
+ * Cases in which the control buttons show in the picker
119
+ * 1) picker mode is 'dialog'
120
+ * 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
121
+ * */
122
+ get showControlButtons() {
123
+ return (this.picker.pickerMode === 'dialog' ||
124
+ (this.picker.pickerType !== 'calendar' &&
125
+ this.picker.pickerMode !== 'inline'));
126
+ }
127
+ get containerElm() {
128
+ return this.elmRef.nativeElement;
129
+ }
130
+ ngAfterContentInit() {
131
+ this.initPicker();
132
+ }
133
+ ngAfterViewInit() {
134
+ this.focusPicker();
135
+ }
136
+ dateSelected(date) {
137
+ let result;
138
+ if (this.picker.isInSingleMode) {
139
+ result = this.dateSelectedInSingleMode(date);
140
+ if (result) {
141
+ this.pickerMoment = result;
142
+ this.picker.select(result);
143
+ }
144
+ else {
145
+ // we close the picker when result is null and pickerType is calendar.
146
+ if (this.pickerType === 'calendar') {
147
+ this.hidePicker$.next(null);
148
+ }
149
+ }
150
+ return;
151
+ }
152
+ if (this.picker.isInRangeMode) {
153
+ result = this.dateSelectedInRangeMode(date);
154
+ if (result) {
155
+ this.pickerMoment = result[this.activeSelectedIndex];
156
+ this.picker.select(result);
157
+ }
158
+ }
159
+ }
160
+ timeSelected(time) {
161
+ this.pickerMoment = this.dateTimeAdapter.clone(time);
162
+ if (!this.picker.dateTimeChecker(this.pickerMoment)) {
163
+ return;
164
+ }
165
+ if (this.picker.isInSingleMode) {
166
+ this.picker.select(this.pickerMoment);
167
+ return;
168
+ }
169
+ if (this.picker.isInRangeMode) {
170
+ const selecteds = [...this.picker.selecteds];
171
+ // check if the 'from' is after 'to' or 'to'is before 'from'
172
+ // In this case, we set both the 'from' and 'to' the same value
173
+ if ((this.activeSelectedIndex === 0 &&
174
+ selecteds[1] &&
175
+ this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) ===
176
+ 1) ||
177
+ (this.activeSelectedIndex === 1 &&
178
+ selecteds[0] &&
179
+ this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
180
+ selecteds[0] = this.pickerMoment;
181
+ selecteds[1] = this.pickerMoment;
182
+ }
183
+ else {
184
+ selecteds[this.activeSelectedIndex] = this.pickerMoment;
185
+ }
186
+ this.picker.select(selecteds);
187
+ }
188
+ }
189
+ /**
190
+ * Handle click on cancel button
191
+ */
192
+ onCancelClicked(event) {
193
+ this.hidePicker$.next(null);
194
+ event.preventDefault();
195
+ return;
196
+ }
197
+ /**
198
+ * Handle click on set button
199
+ */
200
+ onSetClicked(event) {
201
+ if (!this.picker.dateTimeChecker(this.pickerMoment)) {
202
+ this.hidePicker$.next(null);
203
+ event.preventDefault();
204
+ return;
205
+ }
206
+ this.confirmSelected$.next(event);
207
+ event.preventDefault();
208
+ return;
209
+ }
210
+ /**
211
+ * Handle click on inform radio group
212
+ */
213
+ handleClickOnInfoGroup(event, index) {
214
+ this.setActiveSelectedIndex(index);
215
+ event.preventDefault();
216
+ event.stopPropagation();
217
+ }
218
+ /**
219
+ * Handle click on inform radio group
220
+ */
221
+ handleKeydownOnInfoGroup(event, next, index) {
222
+ switch (event.keyCode) {
223
+ case DOWN_ARROW:
224
+ case RIGHT_ARROW:
225
+ case UP_ARROW:
226
+ case LEFT_ARROW:
227
+ next.focus();
228
+ this.setActiveSelectedIndex(index === 0 ? 1 : 0);
229
+ event.preventDefault();
230
+ event.stopPropagation();
231
+ break;
232
+ case SPACE:
233
+ this.setActiveSelectedIndex(index);
234
+ event.preventDefault();
235
+ event.stopPropagation();
236
+ break;
237
+ default:
238
+ return;
239
+ }
240
+ }
241
+ /**
242
+ * Set the value of activeSelectedIndex
243
+ */
244
+ setActiveSelectedIndex(index) {
245
+ if (this.picker.selectMode === 'range' &&
246
+ this.activeSelectedIndex !== index) {
247
+ this.activeSelectedIndex = index;
248
+ const selected = this.picker.selecteds[this.activeSelectedIndex];
249
+ if (this.picker.selecteds && selected) {
250
+ this.pickerMoment = this.dateTimeAdapter.clone(selected);
251
+ }
252
+ }
253
+ return;
254
+ }
255
+ initPicker() {
256
+ this.pickerMoment = this.picker.startAt || this.dateTimeAdapter.now();
257
+ this.activeSelectedIndex = this.picker.selectMode === 'rangeTo' ? 1 : 0;
258
+ }
259
+ /**
260
+ * Select calendar date in single mode,
261
+ * it returns null when date is not selected.
262
+ */
263
+ dateSelectedInSingleMode(date) {
264
+ if (this.dateTimeAdapter.isSameDay(date, this.picker.selected)) {
265
+ return null;
266
+ }
267
+ return this.updateAndCheckCalendarDate(date);
268
+ }
269
+ /**
270
+ * Select dates in range Mode
271
+ */
272
+ dateSelectedInRangeMode(date) {
273
+ let from = this.picker.selecteds[0];
274
+ let to = this.picker.selecteds[1];
275
+ const result = this.updateAndCheckCalendarDate(date);
276
+ if (!result) {
277
+ return null;
278
+ }
279
+ // if the given calendar day is after or equal to 'from',
280
+ // set ths given date as 'to'
281
+ // otherwise, set it as 'from' and set 'to' to null
282
+ if (this.picker.selectMode === 'range') {
283
+ if (this.picker.selecteds &&
284
+ this.picker.selecteds.length &&
285
+ !to &&
286
+ from &&
287
+ this.dateTimeAdapter.differenceInCalendarDays(result, from) >= 0) {
288
+ to = result;
289
+ this.activeSelectedIndex = 1;
290
+ }
291
+ else {
292
+ from = result;
293
+ to = null;
294
+ this.activeSelectedIndex = 0;
295
+ }
296
+ }
297
+ else if (this.picker.selectMode === 'rangeFrom') {
298
+ from = result;
299
+ // if the from value is after the to value, set the to value as null
300
+ if (to && this.dateTimeAdapter.compare(from, to) > 0) {
301
+ to = null;
302
+ }
303
+ }
304
+ else if (this.picker.selectMode === 'rangeTo') {
305
+ to = result;
306
+ // if the from value is after the to value, set the from value as null
307
+ if (from && this.dateTimeAdapter.compare(from, to) > 0) {
308
+ from = null;
309
+ }
310
+ }
311
+ return [from, to];
312
+ }
313
+ /**
314
+ * Update the given calendar date's time and check if it is valid
315
+ * Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
316
+ * we need to update the given calendar date's time before selecting it.
317
+ * if it is valid, return the updated dateTime
318
+ * if it is not valid, return null
319
+ */
320
+ updateAndCheckCalendarDate(date) {
321
+ let result;
322
+ // if the picker is 'both', update the calendar date's time value
323
+ if (this.picker.pickerType === 'both') {
324
+ result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
325
+ result = this.dateTimeAdapter.clampDate(result, this.picker.minDateTime, this.picker.maxDateTime);
326
+ }
327
+ else {
328
+ result = this.dateTimeAdapter.clone(date);
329
+ }
330
+ // check the updated dateTime
331
+ return this.picker.dateTimeChecker(result) ? result : null;
332
+ }
333
+ /**
334
+ * Focus to the picker
335
+ * */
336
+ focusPicker() {
337
+ if (this.picker.pickerMode === 'inline') {
338
+ return;
339
+ }
340
+ if (this.calendar) {
341
+ this.calendar.focusActiveCell();
342
+ }
343
+ else if (this.timer) {
344
+ this.timer.focus();
345
+ }
346
+ }
347
+ }
348
+ OwlDateTimeContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: OwlDateTimeContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.OwlDateTimeIntl }, { token: i2.DateTimeAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Component });
349
+ OwlDateTimeContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: OwlDateTimeContainerComponent, selector: "ofe-owl-date-time-container", host: { listeners: { "@transformPicker.done": "handleContainerAnimationDone($event)" }, properties: { "class.owl-dt-container": "this.owlDTContainerClass", "class.owl-dt-popup-container": "this.owlDTPopupContainerClass", "class.owl-dt-dialog-container": "this.owlDTDialogContainerClass", "class.owl-dt-inline-container": "this.owlDTInlineContainerClass", "class.owl-dt-container-disabled": "this.owlDTContainerDisabledClass", "attr.id": "this.owlDTContainerId", "@transformPicker": "this.owlDTContainerAnimation" } }, viewQueries: [{ propertyName: "calendar", first: true, predicate: OwlCalendarComponent, descendants: true }, { propertyName: "timer", first: true, predicate: OwlTimerComponent, descendants: true }], exportAs: ["owlDateTimeContainer"], ngImport: i0, template: "<div\n [cdkTrapFocus]=\"picker.pickerMode !== 'inline'\"\n [@fadeInPicker]=\"picker.pickerMode === 'inline' ? '' : 'enter'\"\n class=\"owl-dt-container-inner\"\n>\n <ofe-owl-date-time-calendar\n *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\n class=\"owl-dt-container-row\"\n [firstDayOfWeek]=\"picker.firstDayOfWeek\"\n [(pickerMoment)]=\"pickerMoment\"\n [selected]=\"picker.selected\"\n [selecteds]=\"picker.selecteds\"\n [selectMode]=\"picker.selectMode\"\n [minDate]=\"picker.minDateTime\"\n [maxDate]=\"picker.maxDateTime\"\n [dateFilter]=\"picker.dateTimeFilter\"\n [startView]=\"picker.startView\"\n [hideOtherMonths]=\"picker.hideOtherMonths\"\n (yearSelected)=\"picker.selectYear($event)\"\n (monthSelected)=\"picker.selectMonth($event)\"\n (selectedChange)=\"dateSelected($event)\"\n ></ofe-owl-date-time-calendar>\n <ofe-owl-date-time-timer\n *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\n class=\"owl-dt-container-row\"\n [pickerMoment]=\"pickerMoment\"\n [minDateTime]=\"picker.minDateTime\"\n [maxDateTime]=\"picker.maxDateTime\"\n [showSecondsTimer]=\"picker.showSecondsTimer\"\n [hour12Timer]=\"picker.hour12Timer\"\n [stepHour]=\"picker.stepHour\"\n [stepMinute]=\"picker.stepMinute\"\n [stepSecond]=\"picker.stepSecond\"\n (selectedChange)=\"timeSelected($event)\"\n ></ofe-owl-date-time-timer>\n <div\n *ngIf=\"picker.isInRangeMode\"\n role=\"radiogroup\"\n class=\"owl-dt-container-info owl-dt-container-row\"\n >\n <div\n role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-from\"\n [ngClass]=\"{ 'owl-dt-container-info-active': activeSelectedIndex === 0 }\"\n (click)=\"handleClickOnInfoGroup($event, 0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n #from\n >\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\"\n >\n <span class=\"owl-dt-container-info-label\">{{ fromLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{\n fromFormattedValue\n }}</span>\n </span>\n </div>\n <div\n role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-to\"\n [ngClass]=\"{ 'owl-dt-container-info-active': activeSelectedIndex === 1 }\"\n (click)=\"handleClickOnInfoGroup($event, 1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n #to\n >\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\"\n >\n <span class=\"owl-dt-container-info-label\">{{ toLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{ toFormattedValue }}</span>\n </span>\n </div>\n </div>\n\n <div\n *ngIf=\"showControlButtons\"\n class=\"owl-dt-container-buttons owl-dt-container-row\"\n >\n <button\n class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onCancelClicked($event)\"\n >\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\"\n >\n {{ cancelLabel }}\n </span>\n </button>\n <button\n class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onSetClicked($event)\"\n >\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\"\n >\n {{ setLabel }}\n </span>\n </button>\n </div>\n</div>\n", styles: [""], components: [{ type: i3.OwlCalendarComponent, selector: "ofe-owl-date-time-calendar", inputs: ["minDate", "maxDate", "pickerMoment", "selected", "selecteds", "dateFilter", "firstDayOfWeek", "selectMode", "startView", "hideOtherMonths"], outputs: ["pickerMomentChange", "selectedChange", "userSelection", "yearSelected", "monthSelected"], exportAs: ["owlDateTimeCalendar"] }, { type: i4.OwlTimerComponent, selector: "ofe-owl-date-time-timer", inputs: ["pickerMoment", "minDateTime", "maxDateTime", "showSecondsTimer", "hour12Timer", "stepHour", "stepMinute", "stepSecond"], outputs: ["selectedChange"], exportAs: ["owlDateTimeTimer"] }], directives: [{ type: i5.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
350
+ owlDateTimePickerAnimations.transformPicker,
351
+ owlDateTimePickerAnimations.fadeInPicker
352
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
353
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: OwlDateTimeContainerComponent, decorators: [{
354
+ type: Component,
355
+ args: [{
356
+ exportAs: 'owlDateTimeContainer',
357
+ selector: 'ofe-owl-date-time-container',
358
+ templateUrl: './date-time-picker-container.component.html',
359
+ styleUrls: ['./date-time-picker-container.component.scss'],
360
+ changeDetection: ChangeDetectionStrategy.OnPush,
361
+ animations: [
362
+ owlDateTimePickerAnimations.transformPicker,
363
+ owlDateTimePickerAnimations.fadeInPicker
364
+ ]
365
+ }]
366
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.OwlDateTimeIntl }, { type: i2.DateTimeAdapter, decorators: [{
367
+ type: Optional
368
+ }] }]; }, propDecorators: { calendar: [{
369
+ type: ViewChild,
370
+ args: [OwlCalendarComponent, { static: false }]
371
+ }], timer: [{
372
+ type: ViewChild,
373
+ args: [OwlTimerComponent, { static: false }]
374
+ }], owlDTContainerClass: [{
375
+ type: HostBinding,
376
+ args: ['class.owl-dt-container']
377
+ }], owlDTPopupContainerClass: [{
378
+ type: HostBinding,
379
+ args: ['class.owl-dt-popup-container']
380
+ }], owlDTDialogContainerClass: [{
381
+ type: HostBinding,
382
+ args: ['class.owl-dt-dialog-container']
383
+ }], owlDTInlineContainerClass: [{
384
+ type: HostBinding,
385
+ args: ['class.owl-dt-inline-container']
386
+ }], owlDTContainerDisabledClass: [{
387
+ type: HostBinding,
388
+ args: ['class.owl-dt-container-disabled']
389
+ }], owlDTContainerId: [{
390
+ type: HostBinding,
391
+ args: ['attr.id']
392
+ }], owlDTContainerAnimation: [{
393
+ type: HostBinding,
394
+ args: ['@transformPicker']
395
+ }], handleContainerAnimationDone: [{
396
+ type: HostListener,
397
+ args: ['@transformPicker.done', ['$event']]
398
+ }] } });
399
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm1lbnRyeS9zcmMvY29tcG9uZW50cy9uZ3gtcGljay1kYXRldGltZS9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtZW50cnkvc3JjL2NvbXBvbmVudHMvbmd4LXBpY2stZGF0ZXRpbWUvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osUUFBUSxFQUNSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7QUFhdEQsTUFBTSxPQUFPLDZCQUE2QjtJQThKeEMsWUFDVSxLQUF3QixFQUN4QixNQUFr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S0FBSyxFQUFFO2dCQUlsRCxLQUFLO3NCQURKLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdKLG1CQUFtQjtzQkFBN0QsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBSVksd0JBQXdCO3NCQUF4RSxXQUFXO3VCQUFDLDhCQUE4QjtnQkFLdkMseUJBQXlCO3NCQUQ1QixXQUFXO3VCQUFDLCtCQUErQjtnQkFNeEMseUJBQXlCO3NCQUQ1QixXQUFXO3VCQUFDLCtCQUErQjtnQkFNeEMsMkJBQTJCO3NCQUQ5QixXQUFXO3VCQUFDLGlDQUFpQztnQkFLbEIsZ0JBQWdCO3NCQUEzQyxXQUFXO3VCQUFDLFNBQVM7Z0JBSWUsdUJBQXVCO3NCQUEzRCxXQUFXO3VCQUFDLGtCQUFrQjtnQkFLeEIsNEJBQTRCO3NCQURsQyxZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtcbiAgRE9XTl9BUlJPVyxcbiAgTEVGVF9BUlJPVyxcbiAgUklHSFRfQVJST1csXG4gIFNQQUNFLFxuICBVUF9BUlJPV1xufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRlVGltZUFkYXB0ZXIgfSBmcm9tICcuL2FkYXB0ZXIvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnO1xuaW1wb3J0IHsgT3dsQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPd2xEYXRlVGltZSwgUGlja2VyVHlwZSB9IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcbmltcG9ydCB7IE93bERhdGVUaW1lSW50bCB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnO1xuaW1wb3J0IHsgb3dsRGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zIH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgT3dsVGltZXJDb21wb25lbnQgfSBmcm9tICcuL3RpbWVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBleHBvcnRBczogJ293bERhdGVUaW1lQ29udGFpbmVyJyxcbiAgc2VsZWN0b3I6ICdvZmUtb3dsLWRhdGUtdGltZS1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIG93bERhdGVUaW1lUGlja2VyQW5pbWF0aW9ucy50cmFuc2Zvcm1QaWNrZXIsXG4gICAgb3dsRGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zLmZhZGVJblBpY2tlclxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE93bERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoT3dsQ2FsZW5kYXJDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjYWxlbmRhcjogT3dsQ2FsZW5kYXJDb21wb25lbnQ8VD47XG5cbiAgQFZpZXdDaGlsZChPd2xUaW1lckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRpbWVyOiBPd2xUaW1lckNvbXBvbmVudDxUPjtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm93bC1kdC1jb250YWluZXInKSBnZXQgb3dsRFRDb250YWluZXJDbGFzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LXBvcHVwLWNvbnRhaW5lcicpIGdldCBvd2xEVFBvcHVwQ29udGFpbmVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnBpY2tlck1vZGUgPT09ICdwb3B1cCc7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm93bC1kdC1kaWFsb2ctY29udGFpbmVyJylcbiAgZ2V0IG93bERURGlhbG9nQ29udGFpbmVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnBpY2tlck1vZGUgPT09ICdkaWFsb2cnO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vd2wtZHQtaW5saW5lLWNvbnRhaW5lcicpXG4gIGdldCBvd2xEVElubGluZUNvbnRhaW5lckNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJztcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LWNvbnRhaW5lci1kaXNhYmxlZCcpXG4gIGdldCBvd2xEVENvbnRhaW5lckRpc2FibGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmRpc2FibGVkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJykgZ2V0IG93bERUQ29udGFpbmVySWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmlkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdAdHJhbnNmb3JtUGlja2VyJykgZ2V0IG93bERUQ29udGFpbmVyQW5pbWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJyA/ICcnIDogJ2VudGVyJztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ0B0cmFuc2Zvcm1QaWNrZXIuZG9uZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBoYW5kbGVDb250YWluZXJBbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRvU3RhdGUgPSBldmVudC50b1N0YXRlO1xuICAgIGlmICh0b1N0YXRlID09PSAnZW50ZXInKSB7XG4gICAgICB0aGlzLnBpY2tlck9wZW5lZCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwaWNrZXI6IE93bERhdGVUaW1lPFQ+O1xuICBwdWJsaWMgYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDA7IC8vIFRoZSBjdXJyZW50IGFjdGl2ZSBTZWxlY3RlZEluZGV4IGluIHJhbmdlIHNlbGVjdCBtb2RlICgwOiAnZnJvbScsIDE6ICd0bycpXG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBoaWRlIHBpY2tlclxuICAgKiAqL1xuICBwcml2YXRlIGhpZGVQaWNrZXIkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIGdldCBoaWRlUGlja2VyU3RyZWFtKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZVBpY2tlciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIGVtaXRzIHdoZW4gdHJ5IHRvIGNvbmZpcm0gdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAqICovXG4gIHByaXZhdGUgY29uZmlybVNlbGVjdGVkJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBnZXQgY29uZmlybVNlbGVjdGVkU3RyZWFtKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlybVNlbGVjdGVkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGlja2VyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBnZXQgcGlja2VyT3BlbmVkU3RyZWFtKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyT3BlbmVkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBwaWNrZXIgbW9tZW50LiBUaGlzIGRldGVybWluZXMgd2hpY2ggdGltZSBwZXJpb2QgaXMgc2hvd24gYW5kIHdoaWNoIGRhdGUgaXNcbiAgICogaGlnaGxpZ2h0ZWQgd2hlbiB1c2luZyBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xhbVBpY2tlck1vbWVudDogVDtcblxuICBnZXQgcGlja2VyTW9tZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9jbGFtUGlja2VyTW9tZW50O1xuICB9XG5cbiAgc2V0IHBpY2tlck1vbWVudCh2YWx1ZTogVCkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fY2xhbVBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsYW1wRGF0ZShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMucGlja2VyLm1pbkRhdGVUaW1lLFxuICAgICAgICB0aGlzLnBpY2tlci5tYXhEYXRlVGltZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBwaWNrZXJUeXBlKCk6IFBpY2tlclR5cGUge1xuICAgIHJldHVybiB0aGlzLnBpY2tlci5waWNrZXJUeXBlO1xuICB9XG5cbiAgZ2V0IGNhbmNlbExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5jYW5jZWxCdG5MYWJlbDtcbiAgfVxuXG4gIGdldCBzZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuc2V0QnRuTGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJhbmdlICdmcm9tJyBsYWJlbFxuICAgKiAqL1xuICBnZXQgZnJvbUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5yYW5nZUZyb21MYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2UgJ3RvJyBsYWJlbFxuICAgKiAqL1xuICBnZXQgdG9MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VUb0xhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByYW5nZSAnZnJvbScgZm9ybWF0dGVkIHZhbHVlXG4gICAqICovXG4gIGdldCBmcm9tRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGlja2VyLnNlbGVjdGVkc1swXTtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlci5mb3JtYXRTdHJpbmcpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByYW5nZSAndG8nIGZvcm1hdHRlZCB2YWx1ZVxuICAgKiAqL1xuICBnZXQgdG9Gb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waWNrZXIuc2VsZWN0ZWRzWzFdO1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMucGlja2VyLmZvcm1hdFN0cmluZylcbiAgICAgIDogJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2FzZXMgaW4gd2hpY2ggdGhlIGNvbnRyb2wgYnV0dG9ucyBzaG93IGluIHRoZSBwaWNrZXJcbiAgICogMSkgcGlja2VyIG1vZGUgaXMgJ2RpYWxvZydcbiAgICogMikgcGlja2VyIHR5cGUgaXMgTk9UICdjYWxlbmRhcicgYW5kIHRoZSBwaWNrZXIgbW9kZSBpcyBOT1QgJ2lubGluZSdcbiAgICogKi9cbiAgZ2V0IHNob3dDb250cm9sQnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycgfHxcbiAgICAgICh0aGlzLnBpY2tlci5waWNrZXJUeXBlICE9PSAnY2FsZW5kYXInICYmXG4gICAgICAgIHRoaXMucGlja2VyLnBpY2tlck1vZGUgIT09ICdpbmxpbmUnKVxuICAgICk7XG4gIH1cblxuICBnZXQgY29udGFpbmVyRWxtKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxtUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcGlja2VySW50bDogT3dsRGF0ZVRpbWVJbnRsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD5cbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0UGlja2VyKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNQaWNrZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlU2VsZWN0ZWQoZGF0ZTogVCk6IHZvaWQge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICBpZiAodGhpcy5waWNrZXIuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVNlbGVjdGVkSW5TaW5nbGVNb2RlKGRhdGUpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBjbG9zZSB0aGUgcGlja2VyIHdoZW4gcmVzdWx0IGlzIG51bGwgYW5kIHBpY2tlclR5cGUgaXMgY2FsZW5kYXIuXG4gICAgICAgIGlmICh0aGlzLnBpY2tlclR5cGUgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waWNrZXIuaXNJblJhbmdlTW9kZSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XTtcbiAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRpbWVTZWxlY3RlZCh0aW1lOiBUKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZSh0aW1lKTtcblxuICAgIGlmICghdGhpcy5waWNrZXIuZGF0ZVRpbWVDaGVja2VyKHRoaXMucGlja2VyTW9tZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpY2tlci5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHRoaXMucGlja2VyTW9tZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waWNrZXIuaXNJblJhbmdlTW9kZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRzID0gWy4uLnRoaXMucGlja2VyLnNlbGVjdGVkc107XG5cbiAgICAgIC8vIGNoZWNrIGlmIHRoZSAnZnJvbScgaXMgYWZ0ZXIgJ3RvJyBvciAndG8naXMgYmVmb3JlICdmcm9tJ1xuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBzZXQgYm90aCB0aGUgJ2Zyb20nIGFuZCAndG8nIHRoZSBzYW1lIHZhbHVlXG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDAgJiZcbiAgICAgICAgICBzZWxlY3RlZHNbMV0gJiZcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMucGlja2VyTW9tZW50LCBzZWxlY3RlZHNbMV0pID09PVxuICAgICAgICAgICAgMSkgfHxcbiAgICAgICAgKHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMSAmJlxuICAgICAgICAgIHNlbGVjdGVkc1swXSAmJlxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUodGhpcy5waWNrZXJNb21lbnQsIHNlbGVjdGVkc1swXSkgPT09IC0xKVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGVkc1swXSA9IHRoaXMucGlja2VyTW9tZW50O1xuICAgICAgICBzZWxlY3RlZHNbMV0gPSB0aGlzLnBpY2tlck1vbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkc1t0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXhdID0gdGhpcy5waWNrZXJNb21lbnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGlja2VyLnNlbGVjdChzZWxlY3RlZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gY2FuY2VsIGJ1dHRvblxuICAgKi9cbiAgcHVibGljIG9uQ2FuY2VsQ2xpY2tlZChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KG51bGwpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiBzZXQgYnV0dG9uXG4gICAqL1xuICBwdWJsaWMgb25TZXRDbGlja2VkKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlja2VyLmRhdGVUaW1lQ2hlY2tlcih0aGlzLnBpY2tlck1vbWVudCkpIHtcbiAgICAgIHRoaXMuaGlkZVBpY2tlciQubmV4dChudWxsKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb25maXJtU2VsZWN0ZWQkLm5leHQoZXZlbnQpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiBpbmZvcm0gcmFkaW8gZ3JvdXBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVDbGlja09uSW5mb0dyb3VwKGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNsaWNrIG9uIGluZm9ybSByYWRpbyBncm91cFxuICAgKi9cbiAgcHVibGljIGhhbmRsZUtleWRvd25PbkluZm9Hcm91cChldmVudDogYW55LCBuZXh0OiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICBjYXNlIFVQX0FSUk9XOlxuICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICBuZXh0LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRJbmRleChpbmRleCA9PT0gMCA/IDEgOiAwKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNQQUNFOlxuICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhY3RpdmVTZWxlY3RlZEluZGV4XG4gICAqL1xuICBwcml2YXRlIHNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMucGlja2VyLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgJiZcbiAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCAhPT0gaW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucGlja2VyLnNlbGVjdGVkc1t0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXhdO1xuICAgICAgaWYgKHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJiBzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0UGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5waWNrZXIuc3RhcnRBdCB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKTtcbiAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSB0aGlzLnBpY2tlci5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycgPyAxIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgY2FsZW5kYXIgZGF0ZSBpbiBzaW5nbGUgbW9kZSxcbiAgICogaXQgcmV0dXJucyBudWxsIHdoZW4gZGF0ZSBpcyBub3Qgc2VsZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIGRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlOiBUKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgdGhpcy5waWNrZXIuc2VsZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgZGF0ZXMgaW4gcmFuZ2UgTW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBkYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlOiBUKTogVFtdIHwgbnVsbCB7XG4gICAgbGV0IGZyb20gPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbMF07XG4gICAgbGV0IHRvID0gdGhpcy5waWNrZXIuc2VsZWN0ZWRzWzFdO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF5IGlzIGFmdGVyIG9yIGVxdWFsIHRvICdmcm9tJyxcbiAgICAvLyBzZXQgdGhzIGdpdmVuIGRhdGUgYXMgJ3RvJ1xuICAgIC8vIG90aGVyd2lzZSwgc2V0IGl0IGFzICdmcm9tJyBhbmQgc2V0ICd0bycgdG8gbnVsbFxuICAgIGlmICh0aGlzLnBpY2tlci5zZWxlY3RNb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJlxuICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3RlZHMubGVuZ3RoICYmXG4gICAgICAgICF0byAmJlxuICAgICAgICBmcm9tICYmXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhyZXN1bHQsIGZyb20pID49IDBcbiAgICAgICkge1xuICAgICAgICB0byA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb20gPSByZXN1bHQ7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICBmcm9tID0gcmVzdWx0O1xuXG4gICAgICAvLyBpZiB0aGUgZnJvbSB2YWx1ZSBpcyBhZnRlciB0aGUgdG8gdmFsdWUsIHNldCB0aGUgdG8gdmFsdWUgYXMgbnVsbFxuICAgICAgaWYgKHRvICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZnJvbSwgdG8pID4gMCkge1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlci5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycpIHtcbiAgICAgIHRvID0gcmVzdWx0O1xuXG4gICAgICAvLyBpZiB0aGUgZnJvbSB2YWx1ZSBpcyBhZnRlciB0aGUgdG8gdmFsdWUsIHNldCB0aGUgZnJvbSB2YWx1ZSBhcyBudWxsXG4gICAgICBpZiAoZnJvbSAmJiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGZyb20sIHRvKSA+IDApIHtcbiAgICAgICAgZnJvbSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtmcm9tLCB0b107XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBnaXZlbiBjYWxlbmRhciBkYXRlJ3MgdGltZSBhbmQgY2hlY2sgaWYgaXQgaXMgdmFsaWRcbiAgICogQmVjYXVzZSB0aGUgY2FsZW5kYXIgZGF0ZSBoYXMgMDA6MDA6MDAgYXMgZGVmYXVsdCB0aW1lLCBpZiB0aGUgcGlja2VyIHR5cGUgaXMgJ2JvdGgnLFxuICAgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF0ZSdzIHRpbWUgYmVmb3JlIHNlbGVjdGluZyBpdC5cbiAgICogaWYgaXQgaXMgdmFsaWQsIHJldHVybiB0aGUgdXBkYXRlZCBkYXRlVGltZVxuICAgKiBpZiBpdCBpcyBub3QgdmFsaWQsIHJldHVybiBudWxsXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUFuZENoZWNrQ2FsZW5kYXJEYXRlKGRhdGU6IFQpOiBUIHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgLy8gaWYgdGhlIHBpY2tlciBpcyAnYm90aCcsIHVwZGF0ZSB0aGUgY2FsZW5kYXIgZGF0ZSdzIHRpbWUgdmFsdWVcbiAgICBpZiAodGhpcy5waWNrZXIucGlja2VyVHlwZSA9PT0gJ2JvdGgnKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUpLFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aChkYXRlKSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0SG91cnModGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNaW51dGVzKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudClcbiAgICAgICk7XG4gICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5waWNrZXIubWluRGF0ZVRpbWUsXG4gICAgICAgIHRoaXMucGlja2VyLm1heERhdGVUaW1lXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB0aGUgdXBkYXRlZCBkYXRlVGltZVxuICAgIHJldHVybiB0aGlzLnBpY2tlci5kYXRlVGltZUNoZWNrZXIocmVzdWx0KSA/IHJlc3VsdCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdG8gdGhlIHBpY2tlclxuICAgKiAqL1xuICBwcml2YXRlIGZvY3VzUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLmZvY3VzQWN0aXZlQ2VsbCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50aW1lcikge1xuICAgICAgdGhpcy50aW1lci5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBbY2RrVHJhcEZvY3VzXT1cInBpY2tlci5waWNrZXJNb2RlICE9PSAnaW5saW5lJ1wiXG4gIFtAZmFkZUluUGlja2VyXT1cInBpY2tlci5waWNrZXJNb2RlID09PSAnaW5saW5lJyA/ICcnIDogJ2VudGVyJ1wiXG4gIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1pbm5lclwiXG4+XG4gIDxvZmUtb3dsLWRhdGUtdGltZS1jYWxlbmRhclxuICAgICpuZ0lmPVwicGlja2VyVHlwZSA9PT0gJ2JvdGgnIHx8IHBpY2tlclR5cGUgPT09ICdjYWxlbmRhcidcIlxuICAgIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1yb3dcIlxuICAgIFtmaXJzdERheU9mV2Vla109XCJwaWNrZXIuZmlyc3REYXlPZldlZWtcIlxuICAgIFsocGlja2VyTW9tZW50KV09XCJwaWNrZXJNb21lbnRcIlxuICAgIFtzZWxlY3RlZF09XCJwaWNrZXIuc2VsZWN0ZWRcIlxuICAgIFtzZWxlY3RlZHNdPVwicGlja2VyLnNlbGVjdGVkc1wiXG4gICAgW3NlbGVjdE1vZGVdPVwicGlja2VyLnNlbGVjdE1vZGVcIlxuICAgIFttaW5EYXRlXT1cInBpY2tlci5taW5EYXRlVGltZVwiXG4gICAgW21heERhdGVdPVwicGlja2VyLm1heERhdGVUaW1lXCJcbiAgICBbZGF0ZUZpbHRlcl09XCJwaWNrZXIuZGF0ZVRpbWVGaWx0ZXJcIlxuICAgIFtzdGFydFZpZXddPVwicGlja2VyLnN0YXJ0Vmlld1wiXG4gICAgW2hpZGVPdGhlck1vbnRoc109XCJwaWNrZXIuaGlkZU90aGVyTW9udGhzXCJcbiAgICAoeWVhclNlbGVjdGVkKT1cInBpY2tlci5zZWxlY3RZZWFyKCRldmVudClcIlxuICAgIChtb250aFNlbGVjdGVkKT1cInBpY2tlci5zZWxlY3RNb250aCgkZXZlbnQpXCJcbiAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGF0ZVNlbGVjdGVkKCRldmVudClcIlxuICA+PC9vZmUtb3dsLWRhdGUtdGltZS1jYWxlbmRhcj5cbiAgPG9mZS1vd2wtZGF0ZS10aW1lLXRpbWVyXG4gICAgKm5nSWY9XCJwaWNrZXJUeXBlID09PSAnYm90aCcgfHwgcGlja2VyVHlwZSA9PT0gJ3RpbWVyJ1wiXG4gICAgY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLXJvd1wiXG4gICAgW3BpY2tlck1vbWVudF09XCJwaWNrZXJNb21lbnRcIlxuICAgIFttaW5EYXRlVGltZV09XCJwaWNrZXIubWluRGF0ZVRpbWVcIlxuICAgIFttYXhEYXRlVGltZV09XCJwaWNrZXIubWF4RGF0ZVRpbWVcIlxuICAgIFtzaG93U2Vjb25kc1RpbWVyXT1cInBpY2tlci5zaG93U2Vjb25kc1RpbWVyXCJcbiAgICBbaG91cjEyVGltZXJdPVwicGlja2VyLmhvdXIxMlRpbWVyXCJcbiAgICBbc3RlcEhvdXJdPVwicGlja2VyLnN0ZXBIb3VyXCJcbiAgICBbc3RlcE1pbnV0ZV09XCJwaWNrZXIuc3RlcE1pbnV0ZVwiXG4gICAgW3N0ZXBTZWNvbmRdPVwicGlja2VyLnN0ZXBTZWNvbmRcIlxuICAgIChzZWxlY3RlZENoYW5nZSk9XCJ0aW1lU2VsZWN0ZWQoJGV2ZW50KVwiXG4gID48L29mZS1vd2wtZGF0ZS10aW1lLXRpbWVyPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJwaWNrZXIuaXNJblJhbmdlTW9kZVwiXG4gICAgcm9sZT1cInJhZGlvZ3JvdXBcIlxuICAgIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1pbmZvIG93bC1kdC1jb250YWluZXItcm93XCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICBbdGFiaW5kZXhdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMCA/IDAgOiAtMVwiXG4gICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMFwiXG4gICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sIG93bC1kdC1jb250YWluZXItcmFuZ2Ugb3dsLWR0LWNvbnRhaW5lci1mcm9tXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ293bC1kdC1jb250YWluZXItaW5mby1hY3RpdmUnOiBhY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwIH1cIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrT25JbmZvR3JvdXAoJGV2ZW50LCAwKVwiXG4gICAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoJGV2ZW50LCB0bywgMClcIlxuICAgICAgI2Zyb21cbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWNvbnRlbnQgb3dsLWR0LWNvbnRhaW5lci1yYW5nZS1jb250ZW50XCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1pbmZvLWxhYmVsXCI+e3sgZnJvbUxhYmVsIH19Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLWluZm8tdmFsdWVcIj57e1xuICAgICAgICAgIGZyb21Gb3JtYXR0ZWRWYWx1ZVxuICAgICAgICB9fTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgW3RhYmluZGV4XT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogLTFcIlxuICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDFcIlxuICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbCBvd2wtZHQtY29udGFpbmVyLXJhbmdlIG93bC1kdC1jb250YWluZXItdG9cIlxuICAgICAgW25nQ2xhc3NdPVwieyAnb3dsLWR0LWNvbnRhaW5lci1pbmZvLWFjdGl2ZSc6IGFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgfVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPbkluZm9Hcm91cCgkZXZlbnQsIDEpXCJcbiAgICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd25PbkluZm9Hcm91cCgkZXZlbnQsIGZyb20sIDEpXCJcbiAgICAgICN0b1xuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwib3dsLWR0LWNvbnRyb2wtY29udGVudCBvd2wtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57eyB0b0xhYmVsIH19Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLWluZm8tdmFsdWVcIj57eyB0b0Zvcm1hdHRlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93Q29udHJvbEJ1dHRvbnNcIlxuICAgIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1idXR0b25zIG93bC1kdC1jb250YWluZXItcm93XCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwib3dsLWR0LWNvbnRyb2wgb3dsLWR0LWNvbnRyb2wtYnV0dG9uIG93bC1kdC1jb250YWluZXItY29udHJvbC1idXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWNvbnRlbnQgb3dsLWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAge3sgY2FuY2VsTGFiZWwgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sIG93bC1kdC1jb250cm9sLWJ1dHRvbiBvd2wtZHQtY29udGFpbmVyLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIChjbGljayk9XCJvblNldENsaWNrZWQoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbC1jb250ZW50IG93bC1kdC1jb250cm9sLWJ1dHRvbi1jb250ZW50XCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICA+XG4gICAgICAgIHt7IHNldExhYmVsIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=