novo-elements 5.1.1 → 5.2.3

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 (576) hide show
  1. package/README.md +7 -7
  2. package/bundles/novo-elements.umd.js +42693 -42665
  3. package/bundles/novo-elements.umd.js.map +1 -1
  4. package/bundles/novo-elements.umd.min.js +2 -2
  5. package/bundles/novo-elements.umd.min.js.map +1 -1
  6. package/elements/ace-editor/AceEditor.d.ts +37 -37
  7. package/elements/ace-editor/AceEditor.module.d.ts +2 -2
  8. package/elements/ace-editor/AceEditor.scss +5 -0
  9. package/elements/button/Button.d.ts +9 -9
  10. package/elements/button/Button.module.d.ts +2 -2
  11. package/elements/button/Button.scss +397 -0
  12. package/elements/calendar/Calendar.module.d.ts +2 -2
  13. package/elements/calendar/common/CalendarDateChange.d.ts +25 -25
  14. package/elements/calendar/common/CalendarDateChange.scss +23 -0
  15. package/elements/calendar/common/EventTypeLegend.d.ts +7 -7
  16. package/elements/calendar/day/CalendarAllDayEvent.d.ts +7 -7
  17. package/elements/calendar/day/CalendarDayEvent.d.ts +8 -8
  18. package/elements/calendar/day/CalendarDayView.d.ts +148 -148
  19. package/elements/calendar/day/CalendarDayView.scss +97 -0
  20. package/elements/calendar/day/CalendarHourSegment.d.ts +7 -7
  21. package/elements/calendar/month/CalendarMonthDay.d.ts +14 -14
  22. package/elements/calendar/month/CalendarMonthHeader.d.ts +14 -14
  23. package/elements/calendar/month/CalendarMonthView.d.ts +110 -110
  24. package/elements/calendar/month/CalendarMonthView.scss +169 -0
  25. package/elements/calendar/pipe/DayOfMonth.pipe.d.ts +6 -6
  26. package/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.d.ts +6 -6
  27. package/elements/calendar/pipe/Hours.pipe.d.ts +6 -6
  28. package/elements/calendar/pipe/Month.pipe.d.ts +6 -6
  29. package/elements/calendar/pipe/MonthDay.pipe.d.ts +6 -6
  30. package/elements/calendar/pipe/Weekday.pipe.d.ts +6 -6
  31. package/elements/calendar/pipe/Year.pipe.d.ts +6 -6
  32. package/elements/calendar/week/CalendarWeekEvent.d.ts +8 -8
  33. package/elements/calendar/week/CalendarWeekHeader.d.ts +14 -14
  34. package/elements/calendar/week/CalendarWeekView.d.ts +156 -156
  35. package/elements/calendar/week/CalendarWeekView.scss +86 -0
  36. package/elements/card/Card.d.ts +28 -28
  37. package/elements/card/Card.module.d.ts +2 -2
  38. package/elements/card/Card.scss +104 -0
  39. package/elements/category-dropdown/CategoryDropdown.d.ts +29 -29
  40. package/elements/category-dropdown/CategoryDropdown.module.d.ts +2 -2
  41. package/elements/category-dropdown/CategoryDropdown.scss +157 -0
  42. package/elements/chips/Chips.d.ts +78 -78
  43. package/elements/chips/Chips.module.d.ts +2 -2
  44. package/elements/chips/Chips.scss +373 -0
  45. package/elements/chips/RowChips.d.ts +12 -12
  46. package/elements/ckeditor/CKEditor.d.ts +44 -44
  47. package/elements/ckeditor/CKEditor.module.d.ts +2 -2
  48. package/elements/ckeditor/CKEditor.scss +37 -0
  49. package/elements/common/common.module.d.ts +2 -2
  50. package/elements/common/novo-template/novo-template.directive.d.ts +8 -8
  51. package/elements/data-table/ListInteractionTypes.d.ts +10 -10
  52. package/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +15 -15
  53. package/elements/data-table/cell-headers/data-table-expand-header-cell.component.d.ts +13 -13
  54. package/elements/data-table/cell-headers/data-table-header-cell.component.d.ts +81 -81
  55. package/elements/data-table/cell-headers/data-table-header-cell.directive.d.ts +11 -11
  56. package/elements/data-table/cells/data-table-cell.component.d.ts +17 -17
  57. package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +17 -17
  58. package/elements/data-table/cells/data-table-expand-cell.component.d.ts +16 -16
  59. package/elements/data-table/data-table-clear-button.component.d.ts +15 -15
  60. package/elements/data-table/data-table-expand.directive.d.ts +18 -18
  61. package/elements/data-table/data-table.component.d.ts +99 -99
  62. package/elements/data-table/data-table.component.scss +753 -0
  63. package/elements/data-table/data-table.module.d.ts +2 -2
  64. package/elements/data-table/data-table.pipes.d.ts +37 -37
  65. package/elements/data-table/data-table.source.d.ts +22 -22
  66. package/elements/data-table/interfaces.d.ts +128 -128
  67. package/elements/data-table/pagination/data-table-pagination.component.d.ts +52 -52
  68. package/elements/data-table/rows/data-table-header-row.component.d.ts +6 -6
  69. package/elements/data-table/rows/data-table-row.component.d.ts +7 -7
  70. package/elements/data-table/services/data-table-filter-utils.d.ts +3 -3
  71. package/elements/data-table/services/remote-data-table.service.d.ts +8 -8
  72. package/elements/data-table/services/static-data-table.service.d.ts +12 -12
  73. package/elements/data-table/sort-filter/sort-filter.directive.d.ts +8 -8
  74. package/elements/data-table/state/data-table-state.service.d.ts +32 -32
  75. package/elements/date-picker/DatePicker.d.ts +79 -79
  76. package/elements/date-picker/DatePicker.module.d.ts +2 -2
  77. package/elements/date-picker/DatePicker.scss +414 -0
  78. package/elements/date-picker/DatePickerInput.d.ts +66 -66
  79. package/elements/date-time-picker/DateTimePicker.d.ts +45 -45
  80. package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -2
  81. package/elements/date-time-picker/DateTimePickerInput.d.ts +46 -46
  82. package/elements/date-time-picker/_DateTimePicker.scss +93 -0
  83. package/elements/dragula/Dragula.d.ts +13 -13
  84. package/elements/dragula/Dragula.module.d.ts +2 -2
  85. package/elements/dragula/Dragula.scss +18 -0
  86. package/elements/dragula/DragulaService.d.ts +23 -23
  87. package/elements/dropdown/Dropdown.d.ts +55 -55
  88. package/elements/dropdown/Dropdown.module.d.ts +2 -2
  89. package/elements/dropdown/Dropdown.scss +94 -0
  90. package/elements/expansion/_expansion-theme.scss +50 -0
  91. package/elements/expansion/accordion.d.ts +21 -21
  92. package/elements/expansion/expansion-animations.d.ts +9 -9
  93. package/elements/expansion/expansion-panel-content.d.ts +9 -9
  94. package/elements/expansion/expansion-panel-header.d.ts +45 -45
  95. package/elements/expansion/expansion-panel-header.scss +58 -0
  96. package/elements/expansion/expansion-panel.d.ts +54 -54
  97. package/elements/expansion/expansion-panel.scss +68 -0
  98. package/elements/expansion/expansion.module.d.ts +2 -2
  99. package/elements/form/Control.d.ts +107 -107
  100. package/elements/form/ControlGroup.d.ts +89 -83
  101. package/elements/form/ControlGroup.scss +147 -0
  102. package/elements/form/ControlTemplates.d.ts +9 -9
  103. package/elements/form/DynamicForm.d.ts +46 -46
  104. package/elements/form/FieldInteractionApi.d.ts +160 -160
  105. package/elements/form/FieldInteractionApiTypes.d.ts +29 -29
  106. package/elements/form/FieldInteractionModals.d.ts +16 -16
  107. package/elements/form/Form.d.ts +21 -21
  108. package/elements/form/Form.module.d.ts +2 -2
  109. package/elements/form/Form.scss +857 -0
  110. package/elements/form/FormControls.d.ts +22 -22
  111. package/elements/form/FormInterfaces.d.ts +36 -36
  112. package/elements/form/FormValidators.d.ts +22 -22
  113. package/elements/form/NovoFormControl.d.ts +100 -100
  114. package/elements/form/NovoFormGroup.d.ts +17 -17
  115. package/elements/form/controls/BaseControl.d.ts +106 -106
  116. package/elements/form/controls/ControlFactory.d.ts +4 -4
  117. package/elements/form/controls/ace-editor/AceEditorControl.d.ts +5 -5
  118. package/elements/form/controls/address/AddressControl.d.ts +5 -5
  119. package/elements/form/controls/check-list/CheckListControl.d.ts +5 -5
  120. package/elements/form/controls/checkbox/CheckboxControl.d.ts +5 -5
  121. package/elements/form/controls/custom/CustomControl.d.ts +5 -5
  122. package/elements/form/controls/date/DateControl.d.ts +5 -5
  123. package/elements/form/controls/date-time/DateTimeControl.d.ts +5 -5
  124. package/elements/form/controls/editor/EditorControl.d.ts +6 -6
  125. package/elements/form/controls/file/FileControl.d.ts +5 -5
  126. package/elements/form/controls/grouped/GroupedControl.d.ts +6 -6
  127. package/elements/form/controls/index.d.ts +19 -19
  128. package/elements/form/controls/native-select/NativeSelectControl.d.ts +6 -6
  129. package/elements/form/controls/picker/PickerControl.d.ts +9 -9
  130. package/elements/form/controls/quick-note/QuickNoteControl.d.ts +6 -6
  131. package/elements/form/controls/radio/RadioControl.d.ts +6 -6
  132. package/elements/form/controls/read-only/ReadOnlyControl.d.ts +5 -5
  133. package/elements/form/controls/select/SelectControl.d.ts +6 -6
  134. package/elements/form/controls/text-area/TextAreaControl.d.ts +5 -5
  135. package/elements/form/controls/textbox/TextBoxControl.d.ts +9 -9
  136. package/elements/form/controls/tiles/TilesControl.d.ts +6 -6
  137. package/elements/form/controls/time/TimeControl.d.ts +5 -5
  138. package/elements/form/extras/FormExtras.module.d.ts +2 -2
  139. package/elements/form/extras/address/Address.d.ts +65 -65
  140. package/elements/form/extras/address/Address.scss +152 -0
  141. package/elements/form/extras/checkbox/CheckList.d.ts +20 -20
  142. package/elements/form/extras/checkbox/Checkbox.d.ts +24 -24
  143. package/elements/form/extras/checkbox/Checkbox.scss +87 -0
  144. package/elements/form/extras/file/FileInput.d.ts +72 -72
  145. package/elements/form/extras/file/FileInput.scss +118 -0
  146. package/elements/form/extras/file/extras/file/File.d.ts +22 -22
  147. package/elements/header/Header.d.ts +22 -22
  148. package/elements/header/Header.module.d.ts +2 -2
  149. package/elements/header/Header.scss +96 -0
  150. package/elements/icon/Icon.d.ts +18 -18
  151. package/elements/icon/Icon.module.d.ts +2 -2
  152. package/elements/icon/Icon.scss +82 -0
  153. package/elements/list/List.d.ts +31 -31
  154. package/elements/list/List.module.d.ts +2 -2
  155. package/elements/list/List.scss +134 -0
  156. package/elements/loading/Loading.d.ts +26 -26
  157. package/elements/loading/Loading.module.d.ts +2 -2
  158. package/elements/loading/Loading.scss +56 -0
  159. package/elements/loading/NovoSpinner.scss +172 -0
  160. package/elements/modal/Modal.d.ts +45 -45
  161. package/elements/modal/Modal.module.d.ts +2 -2
  162. package/elements/modal/Modal.scss +207 -0
  163. package/elements/modal/ModalService.d.ts +10 -10
  164. package/elements/multi-picker/MultiPicker.d.ts +107 -107
  165. package/elements/multi-picker/MultiPicker.module.d.ts +2 -2
  166. package/elements/multi-picker/_MultiPicker.scss +74 -0
  167. package/elements/overlay/Overlay.d.ts +57 -57
  168. package/elements/overlay/Overlay.module.d.ts +2 -2
  169. package/elements/picker/Picker.d.ts +69 -69
  170. package/elements/picker/Picker.module.d.ts +2 -2
  171. package/elements/picker/Picker.scss +438 -0
  172. package/elements/picker/extras/base-picker-results/BasePickerResults.d.ts +91 -91
  173. package/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.d.ts +21 -21
  174. package/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.d.ts +13 -13
  175. package/elements/picker/extras/entity-picker-results/EntityPickerResults.d.ts +29 -29
  176. package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.d.ts +42 -42
  177. package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.scss +136 -0
  178. package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.d.ts +43 -43
  179. package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.scss +156 -0
  180. package/elements/picker/extras/picker-results/PickerResults.d.ts +11 -11
  181. package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.d.ts +21 -21
  182. package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.scss +65 -0
  183. package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.d.ts +13 -13
  184. package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.scss +0 -0
  185. package/elements/places/places.component.d.ts +71 -71
  186. package/elements/places/places.component.scss +26 -0
  187. package/elements/places/places.module.d.ts +2 -2
  188. package/elements/places/places.service.d.ts +22 -22
  189. package/elements/popover/PopOver.d.ts +30 -30
  190. package/elements/popover/PopOver.module.d.ts +2 -2
  191. package/elements/popover/PopOver.scss +179 -0
  192. package/elements/popover/PopOverContent.d.ts +45 -45
  193. package/elements/quick-note/QuickNote.d.ts +139 -139
  194. package/elements/quick-note/QuickNote.module.d.ts +2 -2
  195. package/elements/quick-note/QuickNote.scss +52 -0
  196. package/elements/quick-note/extras/quick-note-results/QuickNoteResults.d.ts +30 -30
  197. package/elements/radio/Radio.d.ts +26 -26
  198. package/elements/radio/Radio.module.d.ts +2 -2
  199. package/elements/radio/Radio.scss +94 -0
  200. package/elements/search/SearchBox.d.ts +59 -59
  201. package/elements/search/SearchBox.module.d.ts +2 -2
  202. package/elements/search/SearchBox.scss +67 -0
  203. package/elements/select/Select.d.ts +62 -62
  204. package/elements/select/Select.module.d.ts +2 -2
  205. package/elements/select/Select.scss +226 -0
  206. package/elements/simple-table/activity-table-renderers.d.ts +4 -4
  207. package/elements/simple-table/cell-header.d.ts +62 -62
  208. package/elements/simple-table/cell.d.ts +73 -73
  209. package/elements/simple-table/interfaces.d.ts +81 -81
  210. package/elements/simple-table/pagination.d.ts +37 -37
  211. package/elements/simple-table/row.d.ts +20 -20
  212. package/elements/simple-table/simple-table.module.d.ts +2 -2
  213. package/elements/simple-table/sort.d.ts +20 -20
  214. package/elements/simple-table/state.d.ts +22 -22
  215. package/elements/simple-table/table-source.d.ts +62 -62
  216. package/elements/simple-table/table.d.ts +59 -59
  217. package/elements/simple-table/table.scss +344 -0
  218. package/elements/slider/Slider.d.ts +18 -18
  219. package/elements/slider/Slider.module.d.ts +2 -2
  220. package/elements/slider/Slider.scss +89 -0
  221. package/elements/stepper/step-header.component.d.ts +45 -45
  222. package/elements/stepper/step-header.component.scss +78 -0
  223. package/elements/stepper/step-label.component.d.ts +5 -5
  224. package/elements/stepper/step-status.component.d.ts +6 -6
  225. package/elements/stepper/stepper.animations.d.ts +6 -6
  226. package/elements/stepper/stepper.component.d.ts +39 -39
  227. package/elements/stepper/stepper.component.scss +200 -0
  228. package/elements/stepper/stepper.module.d.ts +2 -2
  229. package/elements/switch/Switch.d.ts +19 -19
  230. package/elements/switch/Switch.module.d.ts +2 -2
  231. package/elements/switch/Switch.scss +143 -0
  232. package/elements/tabbed-group-picker/TabbedGroupPicker.d.ts +122 -122
  233. package/elements/tabbed-group-picker/TabbedGroupPicker.module.d.ts +2 -2
  234. package/elements/tabbed-group-picker/TabbedGroupPicker.scss +186 -0
  235. package/elements/table/Table.d.ts +184 -184
  236. package/elements/table/Table.module.d.ts +2 -2
  237. package/elements/table/Table.scss +585 -0
  238. package/elements/table/extras/TableExtras.module.d.ts +2 -2
  239. package/elements/table/extras/base-renderer/BaseRenderer.d.ts +5 -5
  240. package/elements/table/extras/date-cell/DateCell.d.ts +8 -8
  241. package/elements/table/extras/dropdown-cell/DropdownCell.d.ts +17 -17
  242. package/elements/table/extras/dropdown-cell/DropdownCell.scss +58 -0
  243. package/elements/table/extras/keep-filter-focus/KeepFilterFocus.d.ts +6 -6
  244. package/elements/table/extras/pagination/Pagination.d.ts +39 -39
  245. package/elements/table/extras/pagination/Pagination.scss +62 -0
  246. package/elements/table/extras/percentage-cell/PercentageCell.d.ts +3 -3
  247. package/elements/table/extras/row-details/RowDetails.d.ts +12 -12
  248. package/elements/table/extras/table-actions/TableActions.d.ts +2 -2
  249. package/elements/table/extras/table-cell/TableCell.d.ts +18 -18
  250. package/elements/table/extras/table-filter/TableFilter.d.ts +13 -13
  251. package/elements/table/extras/table-footer/TableFooter.d.ts +2 -2
  252. package/elements/table/extras/table-header/TableHeader.d.ts +2 -2
  253. package/elements/table/extras/th-orderable/ThOrderable.d.ts +30 -30
  254. package/elements/table/extras/th-sortable/ThSortable.d.ts +7 -7
  255. package/elements/tabs/Tabs.d.ts +49 -49
  256. package/elements/tabs/Tabs.module.d.ts +2 -2
  257. package/elements/tabs/Tabs.scss +287 -0
  258. package/elements/tiles/Tiles.d.ts +30 -30
  259. package/elements/tiles/Tiles.module.d.ts +2 -2
  260. package/elements/tiles/Tiles.scss +68 -0
  261. package/elements/time-picker/TimePicker.d.ts +38 -38
  262. package/elements/time-picker/TimePicker.module.d.ts +2 -2
  263. package/elements/time-picker/TimePicker.scss +388 -0
  264. package/elements/time-picker/TimePickerInput.d.ts +52 -52
  265. package/elements/tip-well/TipWell.d.ts +23 -23
  266. package/elements/tip-well/TipWell.module.d.ts +2 -2
  267. package/elements/tip-well/TipWell.scss +31 -0
  268. package/elements/toast/Toast.d.ts +28 -28
  269. package/elements/toast/Toast.module.d.ts +2 -2
  270. package/elements/toast/Toast.scss +413 -0
  271. package/elements/toast/ToastService.d.ts +40 -40
  272. package/elements/tooltip/Tooltip.component.d.ts +12 -11
  273. package/elements/tooltip/Tooltip.directive.d.ts +35 -34
  274. package/elements/tooltip/Tooltip.module.d.ts +2 -2
  275. package/elements/tooltip/Tooltip.scss +216 -0
  276. package/elements/unless/Unless.d.ts +12 -12
  277. package/elements/unless/Unless.module.d.ts +2 -2
  278. package/elements/value/EntityList.d.ts +13 -13
  279. package/elements/value/Render.d.ts +66 -66
  280. package/elements/value/Value.d.ts +40 -40
  281. package/elements/value/Value.module.d.ts +2 -2
  282. package/elements/value/Value.scss +57 -0
  283. package/elements/value/Values.scss +57 -0
  284. package/esm2015/elements/ace-editor/AceEditor.js +126 -126
  285. package/esm2015/elements/ace-editor/AceEditor.module.js +15 -15
  286. package/esm2015/elements/button/Button.js +74 -74
  287. package/esm2015/elements/button/Button.module.js +15 -15
  288. package/esm2015/elements/calendar/Calendar.module.js +81 -81
  289. package/esm2015/elements/calendar/common/CalendarDateChange.js +60 -60
  290. package/esm2015/elements/calendar/common/EventTypeLegend.js +32 -32
  291. package/esm2015/elements/calendar/day/CalendarAllDayEvent.js +40 -40
  292. package/esm2015/elements/calendar/day/CalendarDayEvent.js +41 -41
  293. package/esm2015/elements/calendar/day/CalendarDayView.js +302 -302
  294. package/esm2015/elements/calendar/day/CalendarHourSegment.js +34 -34
  295. package/esm2015/elements/calendar/month/CalendarMonthDay.js +87 -87
  296. package/esm2015/elements/calendar/month/CalendarMonthHeader.js +55 -55
  297. package/esm2015/elements/calendar/month/CalendarMonthView.js +171 -171
  298. package/esm2015/elements/calendar/pipe/DayOfMonth.pipe.js +16 -16
  299. package/esm2015/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.js +19 -19
  300. package/esm2015/elements/calendar/pipe/Hours.pipe.js +16 -16
  301. package/esm2015/elements/calendar/pipe/Month.pipe.js +16 -16
  302. package/esm2015/elements/calendar/pipe/MonthDay.pipe.js +16 -16
  303. package/esm2015/elements/calendar/pipe/Weekday.pipe.js +16 -16
  304. package/esm2015/elements/calendar/pipe/Year.pipe.js +16 -16
  305. package/esm2015/elements/calendar/week/CalendarWeekEvent.js +38 -38
  306. package/esm2015/elements/calendar/week/CalendarWeekHeader.js +46 -46
  307. package/esm2015/elements/calendar/week/CalendarWeekView.js +311 -311
  308. package/esm2015/elements/card/Card.js +104 -104
  309. package/esm2015/elements/card/Card.module.js +18 -18
  310. package/esm2015/elements/category-dropdown/CategoryDropdown.js +159 -159
  311. package/esm2015/elements/category-dropdown/CategoryDropdown.module.js +17 -17
  312. package/esm2015/elements/chips/Chips.js +356 -356
  313. package/esm2015/elements/chips/Chips.module.js +18 -18
  314. package/esm2015/elements/chips/RowChips.js +86 -86
  315. package/esm2015/elements/ckeditor/CKEditor.js +237 -237
  316. package/esm2015/elements/ckeditor/CKEditor.module.js +16 -16
  317. package/esm2015/elements/common/common.module.js +13 -13
  318. package/esm2015/elements/common/novo-template/novo-template.directive.js +22 -22
  319. package/esm2015/elements/data-table/ListInteractionTypes.js +1 -1
  320. package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +73 -73
  321. package/esm2015/elements/data-table/cell-headers/data-table-expand-header-cell.component.js +47 -47
  322. package/esm2015/elements/data-table/cell-headers/data-table-header-cell.component.js +501 -501
  323. package/esm2015/elements/data-table/cell-headers/data-table-header-cell.directive.js +35 -35
  324. package/esm2015/elements/data-table/cells/data-table-cell.component.js +62 -62
  325. package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +65 -65
  326. package/esm2015/elements/data-table/cells/data-table-expand-cell.component.js +52 -52
  327. package/esm2015/elements/data-table/data-table-clear-button.component.js +54 -54
  328. package/esm2015/elements/data-table/data-table-expand.directive.js +57 -57
  329. package/esm2015/elements/data-table/data-table.component.js +665 -665
  330. package/esm2015/elements/data-table/data-table.module.js +87 -87
  331. package/esm2015/elements/data-table/data-table.pipes.js +150 -150
  332. package/esm2015/elements/data-table/data-table.source.js +62 -62
  333. package/esm2015/elements/data-table/interfaces.js +1 -1
  334. package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +249 -249
  335. package/esm2015/elements/data-table/rows/data-table-header-row.component.js +23 -23
  336. package/esm2015/elements/data-table/rows/data-table-row.component.js +23 -23
  337. package/esm2015/elements/data-table/services/data-table-filter-utils.js +35 -35
  338. package/esm2015/elements/data-table/services/remote-data-table.service.js +3 -3
  339. package/esm2015/elements/data-table/services/static-data-table.service.js +48 -48
  340. package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +57 -57
  341. package/esm2015/elements/data-table/state/data-table-state.service.js +116 -116
  342. package/esm2015/elements/date-picker/DatePicker.js +493 -493
  343. package/esm2015/elements/date-picker/DatePicker.module.js +20 -20
  344. package/esm2015/elements/date-picker/DatePickerInput.js +255 -255
  345. package/esm2015/elements/date-time-picker/DateTimePicker.js +195 -195
  346. package/esm2015/elements/date-time-picker/DateTimePicker.module.js +22 -22
  347. package/esm2015/elements/date-time-picker/DateTimePickerInput.js +151 -151
  348. package/esm2015/elements/dragula/Dragula.js +66 -66
  349. package/esm2015/elements/dragula/Dragula.module.js +13 -13
  350. package/esm2015/elements/dragula/DragulaService.js +117 -117
  351. package/esm2015/elements/dropdown/Dropdown.js +284 -284
  352. package/esm2015/elements/dropdown/Dropdown.module.js +15 -15
  353. package/esm2015/elements/expansion/accordion.js +42 -42
  354. package/esm2015/elements/expansion/expansion-animations.js +33 -33
  355. package/esm2015/elements/expansion/expansion-panel-content.js +19 -19
  356. package/esm2015/elements/expansion/expansion-panel-header.js +131 -131
  357. package/esm2015/elements/expansion/expansion-panel.js +141 -141
  358. package/esm2015/elements/expansion/expansion.module.js +34 -34
  359. package/esm2015/elements/form/Control.js +645 -645
  360. package/esm2015/elements/form/ControlGroup.js +264 -247
  361. package/esm2015/elements/form/ControlTemplates.js +162 -161
  362. package/esm2015/elements/form/DynamicForm.js +221 -221
  363. package/esm2015/elements/form/FieldInteractionApi.js +680 -680
  364. package/esm2015/elements/form/FieldInteractionApiTypes.js +1 -1
  365. package/esm2015/elements/form/FieldInteractionModals.js +63 -63
  366. package/esm2015/elements/form/Form.js +93 -93
  367. package/esm2015/elements/form/Form.module.js +86 -86
  368. package/esm2015/elements/form/FormControls.js +23 -23
  369. package/esm2015/elements/form/FormInterfaces.js +1 -1
  370. package/esm2015/elements/form/FormValidators.js +115 -115
  371. package/esm2015/elements/form/NovoFormControl.js +154 -154
  372. package/esm2015/elements/form/NovoFormGroup.js +32 -32
  373. package/esm2015/elements/form/controls/BaseControl.js +101 -101
  374. package/esm2015/elements/form/controls/ControlFactory.js +47 -47
  375. package/esm2015/elements/form/controls/ace-editor/AceEditorControl.js +9 -9
  376. package/esm2015/elements/form/controls/address/AddressControl.js +11 -11
  377. package/esm2015/elements/form/controls/check-list/CheckListControl.js +10 -10
  378. package/esm2015/elements/form/controls/checkbox/CheckboxControl.js +9 -9
  379. package/esm2015/elements/form/controls/custom/CustomControl.js +10 -10
  380. package/esm2015/elements/form/controls/date/DateControl.js +9 -9
  381. package/esm2015/elements/form/controls/date-time/DateTimeControl.js +9 -9
  382. package/esm2015/elements/form/controls/editor/EditorControl.js +10 -10
  383. package/esm2015/elements/form/controls/file/FileControl.js +12 -12
  384. package/esm2015/elements/form/controls/grouped/GroupedControl.js +7 -7
  385. package/esm2015/elements/form/controls/index.js +20 -20
  386. package/esm2015/elements/form/controls/native-select/NativeSelectControl.js +11 -11
  387. package/esm2015/elements/form/controls/picker/PickerControl.js +17 -17
  388. package/esm2015/elements/form/controls/quick-note/QuickNoteControl.js +11 -11
  389. package/esm2015/elements/form/controls/radio/RadioControl.js +11 -11
  390. package/esm2015/elements/form/controls/read-only/ReadOnlyControl.js +10 -10
  391. package/esm2015/elements/form/controls/select/SelectControl.js +12 -12
  392. package/esm2015/elements/form/controls/text-area/TextAreaControl.js +9 -9
  393. package/esm2015/elements/form/controls/textbox/TextBoxControl.js +44 -44
  394. package/esm2015/elements/form/controls/tiles/TilesControl.js +11 -11
  395. package/esm2015/elements/form/controls/time/TimeControl.js +9 -9
  396. package/esm2015/elements/form/extras/FormExtras.module.js +36 -36
  397. package/esm2015/elements/form/extras/address/Address.js +512 -512
  398. package/esm2015/elements/form/extras/checkbox/CheckList.js +107 -107
  399. package/esm2015/elements/form/extras/checkbox/Checkbox.js +80 -80
  400. package/esm2015/elements/form/extras/file/FileInput.js +320 -320
  401. package/esm2015/elements/form/extras/file/extras/file/File.js +40 -40
  402. package/esm2015/elements/header/Header.js +96 -96
  403. package/esm2015/elements/header/Header.module.js +14 -14
  404. package/esm2015/elements/icon/Icon.js +53 -53
  405. package/esm2015/elements/icon/Icon.module.js +11 -11
  406. package/esm2015/elements/list/List.js +132 -132
  407. package/esm2015/elements/list/List.module.js +33 -33
  408. package/esm2015/elements/loading/Loading.js +174 -174
  409. package/esm2015/elements/loading/Loading.module.js +15 -15
  410. package/esm2015/elements/modal/Modal.js +138 -138
  411. package/esm2015/elements/modal/Modal.module.js +16 -16
  412. package/esm2015/elements/modal/ModalService.js +31 -31
  413. package/esm2015/elements/multi-picker/MultiPicker.js +600 -600
  414. package/esm2015/elements/multi-picker/MultiPicker.module.js +18 -18
  415. package/esm2015/elements/overlay/Overlay.js +238 -238
  416. package/esm2015/elements/overlay/Overlay.module.js +18 -18
  417. package/esm2015/elements/picker/Picker.js +343 -343
  418. package/esm2015/elements/picker/Picker.module.js +50 -50
  419. package/esm2015/elements/picker/extras/base-picker-results/BasePickerResults.js +353 -353
  420. package/esm2015/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.js +127 -127
  421. package/esm2015/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.js +63 -63
  422. package/esm2015/elements/picker/extras/entity-picker-results/EntityPickerResults.js +221 -221
  423. package/esm2015/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.js +264 -264
  424. package/esm2015/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.js +193 -193
  425. package/esm2015/elements/picker/extras/picker-results/PickerResults.js +60 -60
  426. package/esm2015/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.js +79 -79
  427. package/esm2015/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.js +79 -79
  428. package/esm2015/elements/places/places.component.js +369 -369
  429. package/esm2015/elements/places/places.module.js +18 -18
  430. package/esm2015/elements/places/places.service.js +248 -248
  431. package/esm2015/elements/popover/PopOver.js +144 -144
  432. package/esm2015/elements/popover/PopOver.module.js +14 -14
  433. package/esm2015/elements/popover/PopOverContent.js +198 -198
  434. package/esm2015/elements/quick-note/QuickNote.js +572 -572
  435. package/esm2015/elements/quick-note/QuickNote.module.js +19 -19
  436. package/esm2015/elements/quick-note/extras/quick-note-results/QuickNoteResults.js +138 -138
  437. package/esm2015/elements/radio/Radio.js +89 -89
  438. package/esm2015/elements/radio/Radio.module.js +16 -16
  439. package/esm2015/elements/search/SearchBox.js +193 -193
  440. package/esm2015/elements/search/SearchBox.module.js +19 -19
  441. package/esm2015/elements/select/Select.js +363 -358
  442. package/esm2015/elements/select/Select.module.js +19 -18
  443. package/esm2015/elements/simple-table/activity-table-renderers.js +16 -16
  444. package/esm2015/elements/simple-table/cell-header.js +278 -278
  445. package/esm2015/elements/simple-table/cell.js +291 -291
  446. package/esm2015/elements/simple-table/interfaces.js +1 -1
  447. package/esm2015/elements/simple-table/pagination.js +175 -175
  448. package/esm2015/elements/simple-table/row.js +66 -66
  449. package/esm2015/elements/simple-table/simple-table.module.js +92 -92
  450. package/esm2015/elements/simple-table/sort.js +87 -87
  451. package/esm2015/elements/simple-table/state.js +38 -38
  452. package/esm2015/elements/simple-table/table-source.js +70 -70
  453. package/esm2015/elements/simple-table/table.js +238 -238
  454. package/esm2015/elements/slider/Slider.js +81 -81
  455. package/esm2015/elements/slider/Slider.module.js +16 -16
  456. package/esm2015/elements/stepper/step-header.component.js +90 -90
  457. package/esm2015/elements/stepper/step-label.component.js +16 -16
  458. package/esm2015/elements/stepper/step-status.component.js +26 -26
  459. package/esm2015/elements/stepper/stepper.animations.js +19 -19
  460. package/esm2015/elements/stepper/stepper.component.js +139 -139
  461. package/esm2015/elements/stepper/stepper.module.js +21 -21
  462. package/esm2015/elements/switch/Switch.js +88 -88
  463. package/esm2015/elements/switch/Switch.module.js +16 -16
  464. package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.js +261 -261
  465. package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.module.js +33 -33
  466. package/esm2015/elements/table/Table.js +940 -940
  467. package/esm2015/elements/table/Table.module.js +40 -40
  468. package/esm2015/elements/table/extras/TableExtras.module.js +59 -59
  469. package/esm2015/elements/table/extras/base-renderer/BaseRenderer.js +8 -8
  470. package/esm2015/elements/table/extras/date-cell/DateCell.js +31 -31
  471. package/esm2015/elements/table/extras/dropdown-cell/DropdownCell.js +44 -44
  472. package/esm2015/elements/table/extras/keep-filter-focus/KeepFilterFocus.js +19 -19
  473. package/esm2015/elements/table/extras/pagination/Pagination.js +125 -125
  474. package/esm2015/elements/table/extras/percentage-cell/PercentageCell.js +15 -15
  475. package/esm2015/elements/table/extras/row-details/RowDetails.js +44 -44
  476. package/esm2015/elements/table/extras/table-actions/TableActions.js +11 -11
  477. package/esm2015/elements/table/extras/table-cell/TableCell.js +82 -82
  478. package/esm2015/elements/table/extras/table-filter/TableFilter.js +59 -59
  479. package/esm2015/elements/table/extras/table-footer/TableFooter.js +11 -11
  480. package/esm2015/elements/table/extras/table-header/TableHeader.js +11 -11
  481. package/esm2015/elements/table/extras/th-orderable/ThOrderable.js +125 -125
  482. package/esm2015/elements/table/extras/th-sortable/ThSortable.js +37 -37
  483. package/esm2015/elements/tabs/Tabs.js +253 -253
  484. package/esm2015/elements/tabs/Tabs.module.js +31 -31
  485. package/esm2015/elements/tiles/Tiles.js +154 -154
  486. package/esm2015/elements/tiles/Tiles.module.js +16 -16
  487. package/esm2015/elements/time-picker/TimePicker.js +201 -201
  488. package/esm2015/elements/time-picker/TimePicker.module.js +21 -21
  489. package/esm2015/elements/time-picker/TimePickerInput.js +202 -202
  490. package/esm2015/elements/tip-well/TipWell.js +94 -94
  491. package/esm2015/elements/tip-well/TipWell.module.js +16 -16
  492. package/esm2015/elements/toast/Toast.js +111 -111
  493. package/esm2015/elements/toast/Toast.module.js +15 -15
  494. package/esm2015/elements/toast/ToastService.js +92 -92
  495. package/esm2015/elements/tooltip/Tooltip.component.js +37 -34
  496. package/esm2015/elements/tooltip/Tooltip.directive.js +189 -187
  497. package/esm2015/elements/tooltip/Tooltip.module.js +16 -16
  498. package/esm2015/elements/unless/Unless.js +56 -56
  499. package/esm2015/elements/unless/Unless.module.js +15 -15
  500. package/esm2015/elements/value/EntityList.js +84 -84
  501. package/esm2015/elements/value/Render.js +415 -415
  502. package/esm2015/elements/value/Value.js +160 -160
  503. package/esm2015/elements/value/Value.module.js +17 -17
  504. package/esm2015/index.js +221 -221
  505. package/esm2015/novo-elements.js +25 -25
  506. package/esm2015/novo-elements.module.js +128 -128
  507. package/esm2015/novo-elements.providers.js +50 -50
  508. package/esm2015/pipes/Pipes.module.js +15 -15
  509. package/esm2015/pipes/decode-uri/DecodeURI.js +18 -18
  510. package/esm2015/pipes/group-by/GroupBy.js +24 -24
  511. package/esm2015/pipes/plural/Plural.js +349 -349
  512. package/esm2015/services/data-provider/ArrayCollection.js +301 -301
  513. package/esm2015/services/data-provider/Collection.js +1 -1
  514. package/esm2015/services/data-provider/CollectionEvent.js +21 -21
  515. package/esm2015/services/data-provider/PagedArrayCollection.js +78 -78
  516. package/esm2015/services/data-provider/PagedCollection.js +1 -1
  517. package/esm2015/services/date-format/DateFormat.js +189 -189
  518. package/esm2015/services/global/global.service.js +18 -18
  519. package/esm2015/services/novo-label-service.js +279 -279
  520. package/esm2015/services/options/OptionsService.js +26 -26
  521. package/esm2015/services/security/Security.js +67 -67
  522. package/esm2015/services/storage/storage.service.js +16 -16
  523. package/esm2015/services/template/NovoTemplateService.js +33 -33
  524. package/esm2015/utils/Helpers.js +395 -395
  525. package/esm2015/utils/app-bridge/AppBridge.js +710 -710
  526. package/esm2015/utils/calendar-utils/CalendarUtils.js +321 -321
  527. package/esm2015/utils/component-utils/ComponentUtils.js +20 -20
  528. package/esm2015/utils/countries/Countries.js +17538 -17538
  529. package/esm2015/utils/deferred/Deferred.js +14 -14
  530. package/esm2015/utils/form-utils/FormUtils.js +793 -788
  531. package/esm2015/utils/key-codes/KeyCodes.js +95 -95
  532. package/esm2015/utils/notifier/notifier.util.js +10 -10
  533. package/esm2015/utils/outside-click/OutsideClick.js +60 -60
  534. package/fesm2015/novo-elements.js +43328 -43295
  535. package/fesm2015/novo-elements.js.map +1 -1
  536. package/index.d.ts +225 -225
  537. package/novo-elements.d.ts +24 -24
  538. package/novo-elements.metadata.json +1 -1
  539. package/novo-elements.module.d.ts +2 -2
  540. package/novo-elements.providers.d.ts +5 -5
  541. package/novo-elements.scss +110 -0
  542. package/package.json +1 -1
  543. package/pipes/Pipes.module.d.ts +2 -2
  544. package/pipes/decode-uri/DecodeURI.d.ts +4 -4
  545. package/pipes/group-by/GroupBy.d.ts +4 -4
  546. package/pipes/plural/Plural.d.ts +4 -4
  547. package/services/data-provider/ArrayCollection.d.ts +178 -178
  548. package/services/data-provider/Collection.d.ts +93 -93
  549. package/services/data-provider/CollectionEvent.d.ts +17 -17
  550. package/services/data-provider/PagedArrayCollection.d.ts +18 -18
  551. package/services/data-provider/PagedCollection.d.ts +15 -15
  552. package/services/date-format/DateFormat.d.ts +13 -13
  553. package/services/global/global.service.d.ts +11 -11
  554. package/services/novo-label-service.d.ts +142 -142
  555. package/services/options/OptionsService.d.ts +9 -9
  556. package/services/security/Security.d.ts +19 -19
  557. package/services/storage/storage.service.d.ts +5 -5
  558. package/services/template/NovoTemplateService.d.ts +7 -7
  559. package/styles/content/typography.scss +200 -0
  560. package/styles/global/cdk.scss +106 -0
  561. package/styles/global/flex-grid.scss +156 -0
  562. package/styles/global/functions.scss +174 -0
  563. package/styles/global/include-media.scss +578 -0
  564. package/styles/global/layout.scss +3 -0
  565. package/styles/global/reset.scss +451 -0
  566. package/styles/global/variables.scss +324 -0
  567. package/utils/Helpers.d.ts +68 -68
  568. package/utils/app-bridge/AppBridge.d.ts +178 -178
  569. package/utils/calendar-utils/CalendarUtils.d.ts +150 -150
  570. package/utils/component-utils/ComponentUtils.d.ts +6 -6
  571. package/utils/countries/Countries.d.ts +51 -51
  572. package/utils/deferred/Deferred.d.ts +4 -4
  573. package/utils/form-utils/FormUtils.d.ts +77 -77
  574. package/utils/key-codes/KeyCodes.d.ts +93 -93
  575. package/utils/notifier/notifier.util.d.ts +1 -1
  576. package/utils/outside-click/OutsideClick.d.ts +24 -24
@@ -1,26 +1,26 @@
1
- import { Injectable } from '@angular/core';
2
- // App
3
- export class OptionsService {
4
- constructor() { }
5
- getOptionsConfig(http, field, config) {
6
- return {
7
- field: 'value',
8
- format: '$label',
9
- options: (query) => {
10
- return new Promise((resolve, reject) => {
11
- if (query && query.length) {
12
- http.get(`${field.optionsUrl}?filter=${query || ''}`).subscribe(resolve, reject);
13
- }
14
- else {
15
- resolve([]);
16
- }
17
- });
18
- },
19
- };
20
- }
21
- }
22
- OptionsService.decorators = [
23
- { type: Injectable }
24
- ];
25
- OptionsService.ctorParameters = () => [];
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uc1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvY2hhcmxlcy5iYXJuZXMvRG9jdW1lbnRzL2Rldi9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsic2VydmljZXMvb3B0aW9ucy9PcHRpb25zU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE1BQU07QUFHTixNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBZ0IsQ0FBQztJQUVqQixnQkFBZ0IsQ0FBQyxJQUFnQixFQUFFLEtBQVUsRUFBRSxNQUFnRTtRQUM3RyxPQUFPO1lBQ0wsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsUUFBUTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDckMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLFdBQVcsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDbEY7eUJBQU07d0JBQ0wsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNiO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDOzs7WUFsQkYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIEFwcFxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgT3B0aW9uc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIGdldE9wdGlvbnNDb25maWcoaHR0cDogSHR0cENsaWVudCwgZmllbGQ6IGFueSwgY29uZmlnOiB7IHRva2VuPzogc3RyaW5nOyByZXN0VXJsPzogc3RyaW5nOyBtaWxpdGFyeT86IGJvb2xlYW4gfSk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgZm9ybWF0OiAnJGxhYmVsJyxcclxuICAgICAgb3B0aW9uczogKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgIGlmIChxdWVyeSAmJiBxdWVyeS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaHR0cC5nZXQoYCR7ZmllbGQub3B0aW9uc1VybH0/ZmlsdGVyPSR7cXVlcnkgfHwgJyd9YCkuc3Vic2NyaWJlKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import { Injectable } from '@angular/core';
2
+ // App
3
+ export class OptionsService {
4
+ constructor() { }
5
+ getOptionsConfig(http, field, config) {
6
+ return {
7
+ field: 'value',
8
+ format: '$label',
9
+ options: (query) => {
10
+ return new Promise((resolve, reject) => {
11
+ if (query && query.length) {
12
+ http.get(`${field.optionsUrl}?filter=${query || ''}`).subscribe(resolve, reject);
13
+ }
14
+ else {
15
+ resolve([]);
16
+ }
17
+ });
18
+ },
19
+ };
20
+ }
21
+ }
22
+ OptionsService.decorators = [
23
+ { type: Injectable }
24
+ ];
25
+ OptionsService.ctorParameters = () => [];
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uc1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbm92by1lbGVtZW50cy9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsic2VydmljZXMvb3B0aW9ucy9PcHRpb25zU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE1BQU07QUFHTixNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBZ0IsQ0FBQztJQUVqQixnQkFBZ0IsQ0FBQyxJQUFnQixFQUFFLEtBQVUsRUFBRSxNQUFnRTtRQUM3RyxPQUFPO1lBQ0wsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsUUFBUTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDckMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLFdBQVcsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDbEY7eUJBQU07d0JBQ0wsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNiO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDOzs7WUFsQkYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIEFwcFxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT3B0aW9uc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGdldE9wdGlvbnNDb25maWcoaHR0cDogSHR0cENsaWVudCwgZmllbGQ6IGFueSwgY29uZmlnOiB7IHRva2VuPzogc3RyaW5nOyByZXN0VXJsPzogc3RyaW5nOyBtaWxpdGFyeT86IGJvb2xlYW4gfSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgZm9ybWF0OiAnJGxhYmVsJyxcbiAgICAgIG9wdGlvbnM6IChxdWVyeSkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmIChxdWVyeSAmJiBxdWVyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGh0dHAuZ2V0KGAke2ZpZWxkLm9wdGlvbnNVcmx9P2ZpbHRlcj0ke3F1ZXJ5IHx8ICcnfWApLnN1YnNjcmliZShyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,67 +1,67 @@
1
- // NG2
2
- import { Injectable, EventEmitter } from '@angular/core';
3
- export class Security {
4
- constructor() {
5
- this.credentials = [];
6
- this.change = new EventEmitter();
7
- }
8
- grant(data) {
9
- const parsed = [];
10
- if (data instanceof Array) {
11
- for (const permission of data) {
12
- parsed.push(permission.replace(/\s/gi, ''));
13
- }
14
- }
15
- else if (typeof data === 'object') {
16
- for (const key in data) {
17
- if (data[key] instanceof Array) {
18
- for (const permission of data[key]) {
19
- parsed.push(`${key}.${permission}`);
20
- }
21
- }
22
- }
23
- }
24
- this.credentials = [].concat(this.credentials, parsed);
25
- this.change.emit(this.credentials);
26
- }
27
- has(value) {
28
- return this.credentials.indexOf(value) > -1;
29
- }
30
- revoke(value) {
31
- const i = this.credentials.indexOf(value);
32
- this.credentials.splice(i, 1);
33
- this.change.emit(this.credentials);
34
- }
35
- clear() {
36
- this.credentials = [];
37
- this.change.emit(this.credentials);
38
- }
39
- subscribe(fn) {
40
- this.change.subscribe(fn);
41
- }
42
- checkRoutes(routes, options) {
43
- const filtered = [];
44
- for (const route of routes) {
45
- if (route.entities && ~route.entities.indexOf(options.entityType)) {
46
- if (route.permissions instanceof Function) {
47
- if (route.permissions(options, this)) {
48
- filtered.push(route);
49
- }
50
- }
51
- else if (route.permissions && route.permissions.length) {
52
- if (route.permissions.every((perm) => this.has(perm))) {
53
- filtered.push(route);
54
- }
55
- }
56
- else {
57
- filtered.push(route);
58
- }
59
- }
60
- }
61
- return filtered;
62
- }
63
- }
64
- Security.decorators = [
65
- { type: Injectable }
66
- ];
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvY2hhcmxlcy5iYXJuZXMvRG9jdW1lbnRzL2Rldi9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsic2VydmljZXMvc2VjdXJpdHkvU2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pELE1BQU0sT0FBTyxRQUFRO0lBRHJCO1FBRUUsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBK0RqRCxDQUFDO0lBN0RDLEtBQUssQ0FBQyxJQUFvQjtRQUN4QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFO1lBQ3pCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxFQUFFO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDN0M7U0FDRjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLEVBQUU7b0JBQzlCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7cUJBQ3JDO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsR0FBRyxDQUFDLEtBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFPO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVcsQ0FDVCxNQUFtSCxFQUNuSCxPQUFnQztRQUVoQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLFlBQVksUUFBUSxFQUFFO29CQUN6QyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN0QjtpQkFDRjtxQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3hELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDdEI7aUJBQ0Y7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7YUFDRjtTQUNGO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7O1lBakVGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZWN1cml0eSB7XHJcbiAgY3JlZGVudGlhbHM6IHN0cmluZ1tdID0gW107XHJcbiAgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgZ3JhbnQoZGF0YTogYW55W10gfCBPYmplY3QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xyXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgZGF0YSkge1xyXG4gICAgICAgIHBhcnNlZC5wdXNoKHBlcm1pc3Npb24ucmVwbGFjZSgvXFxzL2dpLCAnJykpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgaWYgKGRhdGFba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgZGF0YVtrZXldKSB7XHJcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGAke2tleX0uJHtwZXJtaXNzaW9ufWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IFtdLmNvbmNhdCh0aGlzLmNyZWRlbnRpYWxzLCBwYXJzZWQpO1xyXG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLmNyZWRlbnRpYWxzKTtcclxuICB9XHJcblxyXG4gIGhhcyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFscy5pbmRleE9mKHZhbHVlKSA+IC0xO1xyXG4gIH1cclxuXHJcbiAgcmV2b2tlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGk6IG51bWJlciA9IHRoaXMuY3JlZGVudGlhbHMuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICB0aGlzLmNyZWRlbnRpYWxzLnNwbGljZShpLCAxKTtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5jcmVkZW50aWFscyk7XHJcbiAgfVxyXG5cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBbXTtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5jcmVkZW50aWFscyk7XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmUoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2Uuc3Vic2NyaWJlKGZuKTtcclxuICB9XHJcblxyXG4gIGNoZWNrUm91dGVzKFxyXG4gICAgcm91dGVzOiB7IGVudGl0aWVzPzogYW55W107IHBlcm1pc3Npb25zPzogYW55W10gfCBGdW5jdGlvbjsgcGF0aD86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGNhbkRpc2FibGU/OiBCb29sZWFuIH1bXSxcclxuICAgIG9wdGlvbnM6IHsgZW50aXR5VHlwZT86IHN0cmluZyB9LFxyXG4gICk6IGFueSB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcclxuICAgICAgaWYgKHJvdXRlLmVudGl0aWVzICYmIH5yb3V0ZS5lbnRpdGllcy5pbmRleE9mKG9wdGlvbnMuZW50aXR5VHlwZSkpIHtcclxuICAgICAgICBpZiAocm91dGUucGVybWlzc2lvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgICAgaWYgKHJvdXRlLnBlcm1pc3Npb25zKG9wdGlvbnMsIHRoaXMpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkLnB1c2gocm91dGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAocm91dGUucGVybWlzc2lvbnMgJiYgcm91dGUucGVybWlzc2lvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAocm91dGUucGVybWlzc2lvbnMuZXZlcnkoKHBlcm0pID0+IHRoaXMuaGFzKHBlcm0pKSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHJvdXRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmlsdGVyZWQucHVzaChyb3V0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ // NG2
2
+ import { Injectable, EventEmitter } from '@angular/core';
3
+ export class Security {
4
+ constructor() {
5
+ this.credentials = [];
6
+ this.change = new EventEmitter();
7
+ }
8
+ grant(data) {
9
+ const parsed = [];
10
+ if (data instanceof Array) {
11
+ for (const permission of data) {
12
+ parsed.push(permission.replace(/\s/gi, ''));
13
+ }
14
+ }
15
+ else if (typeof data === 'object') {
16
+ for (const key in data) {
17
+ if (data[key] instanceof Array) {
18
+ for (const permission of data[key]) {
19
+ parsed.push(`${key}.${permission}`);
20
+ }
21
+ }
22
+ }
23
+ }
24
+ this.credentials = [].concat(this.credentials, parsed);
25
+ this.change.emit(this.credentials);
26
+ }
27
+ has(value) {
28
+ return this.credentials.indexOf(value) > -1;
29
+ }
30
+ revoke(value) {
31
+ const i = this.credentials.indexOf(value);
32
+ this.credentials.splice(i, 1);
33
+ this.change.emit(this.credentials);
34
+ }
35
+ clear() {
36
+ this.credentials = [];
37
+ this.change.emit(this.credentials);
38
+ }
39
+ subscribe(fn) {
40
+ this.change.subscribe(fn);
41
+ }
42
+ checkRoutes(routes, options) {
43
+ const filtered = [];
44
+ for (const route of routes) {
45
+ if (route.entities && ~route.entities.indexOf(options.entityType)) {
46
+ if (route.permissions instanceof Function) {
47
+ if (route.permissions(options, this)) {
48
+ filtered.push(route);
49
+ }
50
+ }
51
+ else if (route.permissions && route.permissions.length) {
52
+ if (route.permissions.every((perm) => this.has(perm))) {
53
+ filtered.push(route);
54
+ }
55
+ }
56
+ else {
57
+ filtered.push(route);
58
+ }
59
+ }
60
+ }
61
+ return filtered;
62
+ }
63
+ }
64
+ Security.decorators = [
65
+ { type: Injectable }
66
+ ];
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbm92by1lbGVtZW50cy9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsic2VydmljZXMvc2VjdXJpdHkvU2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pELE1BQU0sT0FBTyxRQUFRO0lBRHJCO1FBRUUsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBK0RqRCxDQUFDO0lBN0RDLEtBQUssQ0FBQyxJQUFvQjtRQUN4QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFO1lBQ3pCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxFQUFFO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDN0M7U0FDRjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLEVBQUU7b0JBQzlCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7cUJBQ3JDO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsR0FBRyxDQUFDLEtBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFPO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVcsQ0FDVCxNQUFtSCxFQUNuSCxPQUFnQztRQUVoQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLFlBQVksUUFBUSxFQUFFO29CQUN6QyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN0QjtpQkFDRjtxQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3hELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDdEI7aUJBQ0Y7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7YUFDRjtTQUNGO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7O1lBakVGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcbmltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2VjdXJpdHkge1xuICBjcmVkZW50aWFsczogc3RyaW5nW10gPSBbXTtcbiAgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBncmFudChkYXRhOiBhbnlbXSB8IE9iamVjdCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBkYXRhKSB7XG4gICAgICAgIHBhcnNlZC5wdXNoKHBlcm1pc3Npb24ucmVwbGFjZSgvXFxzL2dpLCAnJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhW2tleV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBkYXRhW2tleV0pIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGAke2tleX0uJHtwZXJtaXNzaW9ufWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gW10uY29uY2F0KHRoaXMuY3JlZGVudGlhbHMsIHBhcnNlZCk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLmNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIGhhcyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMuaW5kZXhPZih2YWx1ZSkgPiAtMTtcbiAgfVxuXG4gIHJldm9rZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaTogbnVtYmVyID0gdGhpcy5jcmVkZW50aWFscy5pbmRleE9mKHZhbHVlKTtcbiAgICB0aGlzLmNyZWRlbnRpYWxzLnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuY3JlZGVudGlhbHMpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IFtdO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5jcmVkZW50aWFscyk7XG4gIH1cblxuICBzdWJzY3JpYmUoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlLnN1YnNjcmliZShmbik7XG4gIH1cblxuICBjaGVja1JvdXRlcyhcbiAgICByb3V0ZXM6IHsgZW50aXRpZXM/OiBhbnlbXTsgcGVybWlzc2lvbnM/OiBhbnlbXSB8IEZ1bmN0aW9uOyBwYXRoPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgY2FuRGlzYWJsZT86IEJvb2xlYW4gfVtdLFxuICAgIG9wdGlvbnM6IHsgZW50aXR5VHlwZT86IHN0cmluZyB9LFxuICApOiBhbnkge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gW107XG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgIGlmIChyb3V0ZS5lbnRpdGllcyAmJiB+cm91dGUuZW50aXRpZXMuaW5kZXhPZihvcHRpb25zLmVudGl0eVR5cGUpKSB7XG4gICAgICAgIGlmIChyb3V0ZS5wZXJtaXNzaW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgaWYgKHJvdXRlLnBlcm1pc3Npb25zKG9wdGlvbnMsIHRoaXMpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHJvdXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocm91dGUucGVybWlzc2lvbnMgJiYgcm91dGUucGVybWlzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHJvdXRlLnBlcm1pc3Npb25zLmV2ZXJ5KChwZXJtKSA9PiB0aGlzLmhhcyhwZXJtKSkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkLnB1c2gocm91dGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHJvdXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxufVxuIl19
@@ -1,16 +1,16 @@
1
- import { Injectable } from '@angular/core';
2
- export class LocalStorageService {
3
- setItem(key, value) {
4
- localStorage.setItem(key, value);
5
- }
6
- getItem(key) {
7
- return localStorage.getItem(key);
8
- }
9
- removeItem(key) {
10
- localStorage.removeItem(key);
11
- }
12
- }
13
- LocalStorageService.decorators = [
14
- { type: Injectable }
15
- ];
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL2NoYXJsZXMuYmFybmVzL0RvY3VtZW50cy9kZXYvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixPQUFPLENBQUMsR0FBUSxFQUFFLEtBQVU7UUFDMUIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFRO1FBQ2QsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBUTtRQUNqQixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OztZQVpGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIHtcclxuICBzZXRJdGVtKGtleTogYW55LCB2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbShrZXk6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBhbnkpOiBhbnkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICB9XHJcbn1cclxuIl19
1
+ import { Injectable } from '@angular/core';
2
+ export class LocalStorageService {
3
+ setItem(key, value) {
4
+ localStorage.setItem(key, value);
5
+ }
6
+ getItem(key) {
7
+ return localStorage.getItem(key);
8
+ }
9
+ removeItem(key) {
10
+ localStorage.removeItem(key);
11
+ }
12
+ }
13
+ LocalStorageService.decorators = [
14
+ { type: Injectable }
15
+ ];
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL25vdm8tZWxlbWVudHMvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixPQUFPLENBQUMsR0FBUSxFQUFFLEtBQVU7UUFDMUIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFRO1FBQ2QsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBUTtRQUNqQixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OztZQVpGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIHtcbiAgc2V0SXRlbShrZXk6IGFueSwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBnZXRJdGVtKGtleTogYW55KTogYW55IHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oa2V5OiBhbnkpOiBhbnkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,33 +1,33 @@
1
- // NG2
2
- import { Injectable } from '@angular/core';
3
- export class NovoTemplateService {
4
- constructor() {
5
- this.templates = {
6
- default: {},
7
- custom: {},
8
- };
9
- }
10
- getAll() {
11
- const templates = {};
12
- const customTemplateTypes = Object.keys(this.templates.custom);
13
- const defaultTemplateTypes = Object.keys(this.templates.default);
14
- defaultTemplateTypes.forEach((type) => {
15
- templates[type] = this.templates.default[type];
16
- });
17
- customTemplateTypes.forEach((type) => {
18
- templates[type] = this.templates.custom[type];
19
- });
20
- return templates;
21
- }
22
- addDefault(key, template) {
23
- this.templates.default[key] = template;
24
- }
25
- addCustom(key, template) {
26
- this.templates.custom[key] = template;
27
- }
28
- }
29
- NovoTemplateService.decorators = [
30
- { type: Injectable }
31
- ];
32
- NovoTemplateService.ctorParameters = () => [];
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm92b1RlbXBsYXRlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJzZXJ2aWNlcy90ZW1wbGF0ZS9Ob3ZvVGVtcGxhdGVTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxtQkFBbUI7SUFLOUI7UUFKQSxjQUFTLEdBQVE7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztJQUNhLENBQUM7SUFFaEIsTUFBTTtRQUNKLE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLG1CQUFtQixHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxNQUFNLG9CQUFvQixHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUM1QyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDSCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUMzQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVcsRUFBRSxRQUFhO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxRQUFhO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN4QyxDQUFDOzs7WUEzQkYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOb3ZvVGVtcGxhdGVTZXJ2aWNlIHtcclxuICB0ZW1wbGF0ZXM6IGFueSA9IHtcclxuICAgIGRlZmF1bHQ6IHt9LFxyXG4gICAgY3VzdG9tOiB7fSxcclxuICB9O1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgZ2V0QWxsKCk6IGFueSB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZXM6IGFueSA9IHt9O1xyXG4gICAgY29uc3QgY3VzdG9tVGVtcGxhdGVUeXBlczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlcy5jdXN0b20pO1xyXG4gICAgY29uc3QgZGVmYXVsdFRlbXBsYXRlVHlwZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZW1wbGF0ZXMuZGVmYXVsdCk7XHJcbiAgICBkZWZhdWx0VGVtcGxhdGVUeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGVtcGxhdGVzW3R5cGVdID0gdGhpcy50ZW1wbGF0ZXMuZGVmYXVsdFt0eXBlXTtcclxuICAgIH0pO1xyXG4gICAgY3VzdG9tVGVtcGxhdGVUeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGVtcGxhdGVzW3R5cGVdID0gdGhpcy50ZW1wbGF0ZXMuY3VzdG9tW3R5cGVdO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVzO1xyXG4gIH1cclxuXHJcbiAgYWRkRGVmYXVsdChrZXk6IHN0cmluZywgdGVtcGxhdGU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW1wbGF0ZXMuZGVmYXVsdFtrZXldID0gdGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b20oa2V5OiBzdHJpbmcsIHRlbXBsYXRlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcGxhdGVzLmN1c3RvbVtrZXldID0gdGVtcGxhdGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ // NG2
2
+ import { Injectable } from '@angular/core';
3
+ export class NovoTemplateService {
4
+ constructor() {
5
+ this.templates = {
6
+ default: {},
7
+ custom: {},
8
+ };
9
+ }
10
+ getAll() {
11
+ const templates = {};
12
+ const customTemplateTypes = Object.keys(this.templates.custom);
13
+ const defaultTemplateTypes = Object.keys(this.templates.default);
14
+ defaultTemplateTypes.forEach((type) => {
15
+ templates[type] = this.templates.default[type];
16
+ });
17
+ customTemplateTypes.forEach((type) => {
18
+ templates[type] = this.templates.custom[type];
19
+ });
20
+ return templates;
21
+ }
22
+ addDefault(key, template) {
23
+ this.templates.default[key] = template;
24
+ }
25
+ addCustom(key, template) {
26
+ this.templates.custom[key] = template;
27
+ }
28
+ }
29
+ NovoTemplateService.decorators = [
30
+ { type: Injectable }
31
+ ];
32
+ NovoTemplateService.ctorParameters = () => [];
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm92b1RlbXBsYXRlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJzZXJ2aWNlcy90ZW1wbGF0ZS9Ob3ZvVGVtcGxhdGVTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxtQkFBbUI7SUFLOUI7UUFKQSxjQUFTLEdBQVE7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztJQUNhLENBQUM7SUFFaEIsTUFBTTtRQUNKLE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLG1CQUFtQixHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxNQUFNLG9CQUFvQixHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUM1QyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDSCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUMzQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVcsRUFBRSxRQUFhO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxRQUFhO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN4QyxDQUFDOzs7WUEzQkYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTm92b1RlbXBsYXRlU2VydmljZSB7XG4gIHRlbXBsYXRlczogYW55ID0ge1xuICAgIGRlZmF1bHQ6IHt9LFxuICAgIGN1c3RvbToge30sXG4gIH07XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBnZXRBbGwoKTogYW55IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXM6IGFueSA9IHt9O1xuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlVHlwZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy50ZW1wbGF0ZXMuY3VzdG9tKTtcbiAgICBjb25zdCBkZWZhdWx0VGVtcGxhdGVUeXBlczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlcy5kZWZhdWx0KTtcbiAgICBkZWZhdWx0VGVtcGxhdGVUeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRlbXBsYXRlc1t0eXBlXSA9IHRoaXMudGVtcGxhdGVzLmRlZmF1bHRbdHlwZV07XG4gICAgfSk7XG4gICAgY3VzdG9tVGVtcGxhdGVUeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRlbXBsYXRlc1t0eXBlXSA9IHRoaXMudGVtcGxhdGVzLmN1c3RvbVt0eXBlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcGxhdGVzO1xuICB9XG5cbiAgYWRkRGVmYXVsdChrZXk6IHN0cmluZywgdGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGVzLmRlZmF1bHRba2V5XSA9IHRlbXBsYXRlO1xuICB9XG5cbiAgYWRkQ3VzdG9tKGtleTogc3RyaW5nLCB0ZW1wbGF0ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZXMuY3VzdG9tW2tleV0gPSB0ZW1wbGF0ZTtcbiAgfVxufVxuIl19
@@ -1,395 +1,395 @@
1
- // @dynamic
2
- export class Helpers {
3
- /**
4
- * Swallows an event to stop further execution
5
- */
6
- static swallowEvent(event) {
7
- if (event) {
8
- event.stopPropagation();
9
- event.preventDefault();
10
- }
11
- }
12
- static interpolate(str, props) {
13
- if (this.isDate(props)) {
14
- props = this.dateToObject(props);
15
- }
16
- return str.replace(/\$([\w\.]+)/g, (original, key) => {
17
- const keys = key.split('.');
18
- let value = props[keys.shift()];
19
- while (keys.length && value !== undefined) {
20
- const k = keys.shift();
21
- value = k ? value[k] : `${value}.`;
22
- }
23
- return value !== undefined ? value : '';
24
- });
25
- }
26
- static interpolateWithFallback(formatString, data) {
27
- // Format string can be an array, it will attempt to interpolate each item
28
- // in the array, if there is a failure to replace it will mark it as such
29
- // It will either return the first successful replacement of ALL variables,
30
- // or an empty string
31
- if (Array.isArray(formatString)) {
32
- const successes = [];
33
- const failures = [];
34
- formatString.forEach((format) => {
35
- let isSuccess = true;
36
- const attempt = format.replace(/\$([\w\.]+)/g, (original, key) => {
37
- const keys = key.split('.');
38
- let value = data[keys.shift()];
39
- while (keys.length && value !== undefined) {
40
- const k = keys.shift();
41
- value = k ? value[k] : `${value}.`;
42
- }
43
- if (isSuccess && Helpers.isEmpty(value)) {
44
- isSuccess = false;
45
- }
46
- return Helpers.isEmpty(value) ? '' : value;
47
- });
48
- if (isSuccess) {
49
- successes.push(attempt);
50
- }
51
- else {
52
- failures.push(attempt);
53
- }
54
- });
55
- if (successes.length !== 0) {
56
- return successes[0];
57
- }
58
- return '';
59
- }
60
- else {
61
- return Helpers.interpolate(formatString, data);
62
- }
63
- }
64
- /**
65
- * Verifies that an object has every property expected by a string to interpolate
66
- * @param str The string to interpolate
67
- * @param props The params to replace in string.
68
- */
69
- static validateInterpolationProps(str, props) {
70
- const keys = str.match(/\$([\w\.]+)/g);
71
- return keys.every((key) => {
72
- return props.hasOwnProperty(key.substr(1));
73
- });
74
- }
75
- static isObject(item) {
76
- return item && typeof item === 'object' && !Array.isArray(item) && item !== null;
77
- }
78
- /**
79
- * Checks to see if the object is a string
80
- */
81
- static isString(obj) {
82
- return typeof obj === 'string';
83
- }
84
- static escapeString(obj) {
85
- if (Helpers.isString(obj)) {
86
- return obj.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
87
- }
88
- return obj;
89
- }
90
- static isNumber(val, includeNegatives = false) {
91
- const numberRegex = includeNegatives ? /^-{0,1}\d*\.?\d*$/ : /^\d*\.?\d*$/;
92
- if (typeof val === 'string') {
93
- return val.length > 0 && val !== '.' && numberRegex.test(val);
94
- }
95
- else {
96
- return !isNaN(parseFloat(val));
97
- }
98
- }
99
- /**
100
- * Checks to see if the object is a undefined or null
101
- */
102
- static isBlank(obj) {
103
- return obj === undefined || obj === null;
104
- }
105
- /**
106
- * Checks to see if the object is a undefined or null
107
- */
108
- static isEmpty(obj) {
109
- return Helpers.isBlank(obj) || obj === '' || (Array.isArray(obj) && obj.length === 0);
110
- }
111
- /**
112
- * Checks to see if the object is a function
113
- */
114
- static isFunction(obj) {
115
- return !!(obj && obj.constructor && obj.call && obj.apply);
116
- }
117
- /**
118
- * Checks to see if the object is a Date
119
- */
120
- static isDate(obj) {
121
- return obj instanceof Date;
122
- }
123
- static convertToArray(obj) {
124
- if (obj === undefined) {
125
- return [];
126
- }
127
- else if (!Array.isArray(obj)) {
128
- return [obj];
129
- }
130
- return obj;
131
- }
132
- static sortByField(fields, reverse = false) {
133
- return (previous, current) => {
134
- if (Helpers.isFunction(fields)) {
135
- return fields(reverse ? 'desc' : 'asc', previous, current);
136
- }
137
- if (!Array.isArray(fields)) {
138
- fields = [fields];
139
- }
140
- for (let i = 0; i < fields.length; i++) {
141
- const field = fields[i];
142
- let first = previous[field] || '';
143
- let second = current[field] || '';
144
- if (Helpers.isDate(first) && Helpers.isDate(second)) {
145
- // Dates
146
- first = first.getTime();
147
- second = second.getTime();
148
- }
149
- else if (Helpers.isString(first) && Helpers.isString(second)) {
150
- // Basic strings
151
- first = first.toLowerCase();
152
- second = second.toLowerCase();
153
- }
154
- else {
155
- // Numbers
156
- first = isNaN(Number(first)) ? first : Number(first);
157
- second = isNaN(Number(second)) ? second : Number(second);
158
- }
159
- if (first > second) {
160
- return reverse ? -1 : 1;
161
- }
162
- else if (first < second) {
163
- return reverse ? 1 : -1;
164
- }
165
- }
166
- return 0;
167
- };
168
- }
169
- static filterByField(key, value) {
170
- return (item) => {
171
- const results = [];
172
- let field = can(item).have(key);
173
- if (value instanceof Function) {
174
- results.push(value(field, item));
175
- }
176
- else if (Array.isArray(value)) {
177
- results.push(value.includes(field));
178
- }
179
- else if (value instanceof Object) {
180
- if (field instanceof Date) {
181
- field = field.getTime();
182
- }
183
- if (value.min) {
184
- results.push(field >= value.min);
185
- }
186
- if (value.max) {
187
- results.push(field <= value.max);
188
- }
189
- if (value.any && Array.isArray(value.any)) {
190
- if (Array.isArray(field)) {
191
- results.push(value.any.some((v) => field.includes(v)));
192
- }
193
- else {
194
- results.push(value.any.includes(field));
195
- }
196
- }
197
- if (value.all && Array.isArray(value.all)) {
198
- results.push(value.all.every((v) => field.includes(v)));
199
- }
200
- if (value.not) {
201
- results.push(!Helpers.filterByField(key, value.not)(item));
202
- }
203
- for (const subkey in value) {
204
- if (['min', 'max', 'any', 'all', 'not'].indexOf(subkey) < 0) {
205
- const subvalue = value[subkey];
206
- results.push(Helpers.filterByField(`${key}.${subkey}`, subvalue)(item));
207
- }
208
- }
209
- }
210
- else {
211
- results.push(JSON.stringify(field).match(new RegExp(value, 'gi')));
212
- }
213
- return results.every((x) => x);
214
- };
215
- }
216
- static findAncestor(element, selector) {
217
- while ((element = element.parentElement) && !element.matches.call(element, selector))
218
- ; // tslint:disable-line
219
- return element;
220
- }
221
- static deepClone(item) {
222
- if (Array.isArray(item)) {
223
- const newArr = [];
224
- for (let i = item.length; i-- > 0;) {
225
- // tslint:disable-line
226
- newArr[i] = Helpers.deepClone(item[i]);
227
- }
228
- return newArr;
229
- }
230
- if (typeof item === 'function' && !/\(\) \{ \[native/.test(item.toString()) && !item.toString().startsWith('class')) {
231
- let obj;
232
- for (const k in item) {
233
- if (k in item) {
234
- obj[k] = Helpers.deepClone(item[k]);
235
- }
236
- }
237
- return obj;
238
- }
239
- if (item && typeof item === 'object') {
240
- const obj = {};
241
- for (const k in item) {
242
- if (k in item) {
243
- obj[k] = Helpers.deepClone(item[k]);
244
- }
245
- }
246
- return obj;
247
- }
248
- return item;
249
- }
250
- static deepAssign(...objs) {
251
- if (objs.length < 2) {
252
- throw new Error('Need two or more objects to merge');
253
- }
254
- const target = Object.assign({}, objs[0]);
255
- for (let i = 1; i < objs.length; i++) {
256
- const source = Object.assign({}, objs[i]);
257
- Object.keys(source).forEach((prop) => {
258
- const value = source[prop];
259
- if (Helpers.isObject(value)) {
260
- if (target.hasOwnProperty(prop) && Helpers.isObject(target[prop])) {
261
- target[prop] = Helpers.deepAssign(target[prop], value);
262
- }
263
- else {
264
- target[prop] = value;
265
- }
266
- }
267
- else if (Array.isArray(value)) {
268
- if (target.hasOwnProperty(prop) && Array.isArray(target[prop])) {
269
- const targetArray = target[prop];
270
- value.forEach((sourceItem, itemIndex) => {
271
- if (itemIndex < targetArray.length) {
272
- const targetItem = targetArray[itemIndex];
273
- if (Object.is(targetItem, sourceItem)) {
274
- return;
275
- }
276
- if (Helpers.isObject(targetItem) && Helpers.isObject(sourceItem)) {
277
- targetArray[itemIndex] = Helpers.deepAssign(targetItem, sourceItem);
278
- }
279
- else if (Array.isArray(targetItem) && Array.isArray(sourceItem)) {
280
- targetArray[itemIndex] = Helpers.deepAssign(targetItem, sourceItem);
281
- }
282
- else {
283
- targetArray[itemIndex] = sourceItem;
284
- }
285
- }
286
- else {
287
- targetArray.push(sourceItem);
288
- }
289
- });
290
- }
291
- else {
292
- target[prop] = value;
293
- }
294
- }
295
- else {
296
- target[prop] = value;
297
- }
298
- });
299
- }
300
- return target;
301
- }
302
- /**
303
- * Workaround for Edge browser since Element:nextElementSibling is undefined inside of template directives
304
- * @param element any document element
305
- * @returns the next sibling node that is of type: Element
306
- */
307
- static getNextElementSibling(element) {
308
- if (element.nextElementSibling) {
309
- return element.nextElementSibling;
310
- }
311
- else {
312
- let e = element.nextSibling;
313
- while (e && 1 !== e.nodeType) {
314
- e = e.nextSibling;
315
- }
316
- return e;
317
- }
318
- }
319
- static dateToObject(date) {
320
- const dateObj = {
321
- day: '',
322
- dayPeriod: '',
323
- era: '',
324
- hour: '',
325
- minute: '',
326
- month: '',
327
- second: '',
328
- weekday: '',
329
- year: '',
330
- };
331
- Intl.DateTimeFormat('en-US', {
332
- day: 'numeric',
333
- era: 'short',
334
- hour: 'numeric',
335
- minute: 'numeric',
336
- month: 'numeric',
337
- second: 'numeric',
338
- weekday: 'long',
339
- year: 'numeric',
340
- })
341
- .formatToParts(date)
342
- .forEach((dateTimeFormatPart) => {
343
- if (dateTimeFormatPart.type !== 'literal') {
344
- dateObj[dateTimeFormatPart.type] = dateTimeFormatPart.value;
345
- }
346
- });
347
- return dateObj;
348
- }
349
- }
350
- export class Can {
351
- constructor(obj) {
352
- this.obj = obj;
353
- }
354
- have(key) {
355
- const props = key.split('.');
356
- let item = this.obj;
357
- for (let i = 0; i < props.length; i++) {
358
- item = item[props[i]];
359
- if (this.check(item) === false) {
360
- return item;
361
- }
362
- }
363
- return item;
364
- }
365
- check(thing) {
366
- return thing !== void 0;
367
- }
368
- }
369
- export function can(obj) {
370
- return new Can(obj);
371
- }
372
- // Assumes data is already sorted
373
- export function binarySearch(item, array, compare) {
374
- return search(0, array.length - 1);
375
- function search(min, max) {
376
- if (min > max) {
377
- return undefined;
378
- }
379
- const guess = min + Math.floor((max - min) / 2);
380
- const comparison = compare(item, array[guess]);
381
- if (comparison === 0) {
382
- return array[guess];
383
- }
384
- else if (comparison === -1) {
385
- return search(min, guess - 1);
386
- }
387
- else if (comparison === 1) {
388
- return search(guess + 1, max);
389
- }
390
- else {
391
- throw new Error(`Input mismatch: ${JSON.stringify(item)} not comparable to ${JSON.stringify(array[guess])}`);
392
- }
393
- }
394
- }
395
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9IZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVc7QUFDWCxNQUFNLE9BQU8sT0FBTztJQUNsQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSztRQUN2QixJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUNuRSxNQUFNLElBQUksR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDekMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QixLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7YUFDcEM7WUFDRCxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxZQUErQixFQUFFLElBQVM7UUFDdkUsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UscUJBQXFCO1FBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7WUFDL0IsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1lBQzlCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO2dCQUM5QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDL0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTt3QkFDekMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUN2QixLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7cUJBQ3BDO29CQUNELElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3ZDLFNBQVMsR0FBRyxLQUFLLENBQUM7cUJBQ25CO29CQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksU0FBUyxFQUFFO29CQUNiLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3pCO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3hCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyQjtZQUNELE9BQU8sRUFBRSxDQUFDO1NBQ1g7YUFBTTtZQUNMLE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUN2RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1FBQ2xCLE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVE7UUFDdEIsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBUTtRQUMxQixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRLEVBQUUsbUJBQTRCLEtBQUs7UUFDekQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0UsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQVE7UUFDckIsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFRO1FBQ3JCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBUTtRQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBUTtRQUNwQixPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBWTtRQUNoQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsT0FBTyxFQUFFLENBQUM7U0FDWDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFXLEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDN0MsT0FBTyxDQUFDLFFBQWEsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUNyQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25CO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sS0FBSyxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ25ELFFBQVE7b0JBQ1IsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDM0I7cUJBQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzlELGdCQUFnQjtvQkFDaEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDL0I7cUJBQU07b0JBQ0wsVUFBVTtvQkFDVixLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckQsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQzFEO2dCQUVELElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRTtvQkFDbEIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pCO3FCQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRTtvQkFDekIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pCO2FBQ0Y7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNkLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxZQUFZLFFBQVEsRUFBRTtnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTSxJQUFJLEtBQUssWUFBWSxNQUFNLEVBQUU7Z0JBQ2xDLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtvQkFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN6QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN4RDt5QkFBTTt3QkFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQ3pDO2lCQUNGO2dCQUNELElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pEO2dCQUNELElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQzVEO2dCQUNELEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxFQUFFO29CQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzNELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0sRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7cUJBQ3pFO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BFO1lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFnQixFQUFFLFFBQWdCO1FBQ3BELE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztZQUFDLENBQUMsQ0FBQyxzQkFBc0I7UUFDN0csT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBUztRQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUk7Z0JBQ25DLHNCQUFzQjtnQkFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ25ILElBQUksR0FBRyxDQUFDO1lBQ1IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckM7YUFDRjtZQUNELE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckM7YUFDRjtZQUNELE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSTtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN4RDt5QkFBTTt3QkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO3FCQUN0QjtpQkFDRjtxQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9CLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUU7NEJBQ3RDLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0NBQ2xDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDMUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRTtvQ0FDckMsT0FBTztpQ0FDUjtnQ0FDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDaEUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lDQUNyRTtxQ0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDakUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lDQUNyRTtxQ0FBTTtvQ0FDTCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDO2lDQUNyQzs2QkFDRjtpQ0FBTTtnQ0FDTCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzZCQUM5Qjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO3FCQUN0QjtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxPQUFnQjtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUM5QixPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztTQUNuQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7YUFDbkI7WUFDRCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2pCLElBQVU7UUFZVixNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsRUFBRSxFQUFFO1lBQ1AsU0FBUyxFQUFFLEVBQUU7WUFDYixHQUFHLEVBQUUsRUFBRTtZQUNQLElBQUksRUFBRSxFQUFFO1lBQ1IsTUFBTSxFQUFFLEVBQUU7WUFDVixLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxFQUFFO1lBQ1YsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUMzQixHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxPQUFPO1lBQ1osSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixLQUFLLEVBQUUsU0FBUztZQUNoQixNQUFNLEVBQUUsU0FBUztZQUNqQixPQUFPLEVBQUUsTUFBTTtZQUNmLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUM7YUFDQyxhQUFhLENBQUMsSUFBSSxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxDQUFDLGtCQUEyQyxFQUFFLEVBQUU7WUFDdkQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2FBQzdEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sR0FBRztJQUdkLFlBQVksR0FBVztRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQVc7UUFDZCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxHQUFRLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUM5QixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBVTtRQUNkLE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBUTtJQUMxQixPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRCxpQ0FBaUM7QUFDakMsTUFBTSxVQUFVLFlBQVksQ0FBSSxJQUFPLEVBQUUsS0FBVSxFQUFFLE9BQStDO0lBQ2xHLE9BQU8sTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRW5DLFNBQVMsTUFBTSxDQUFDLEdBQVcsRUFBRSxHQUFXO1FBQ3RDLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRTtZQUNiLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUvQyxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7YUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM1QixPQUFPLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE9BQU8sTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xyXG4gIC8qKlxyXG4gICAqIFN3YWxsb3dzIGFuIGV2ZW50IHRvIHN0b3AgZnVydGhlciBleGVjdXRpb25cclxuICAgKi9cclxuICBzdGF0aWMgc3dhbGxvd0V2ZW50KGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaW50ZXJwb2xhdGUoc3RyOiBzdHJpbmcsIHByb3BzOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaXNEYXRlKHByb3BzKSkge1xyXG4gICAgICBwcm9wcyA9IHRoaXMuZGF0ZVRvT2JqZWN0KHByb3BzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFwkKFtcXHdcXC5dKykvZywgKG9yaWdpbmFsOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0ga2V5LnNwbGl0KCcuJyk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHByb3BzW2tleXMuc2hpZnQoKV07XHJcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgayA9IGtleXMuc2hpZnQoKTtcclxuICAgICAgICB2YWx1ZSA9IGsgPyB2YWx1ZVtrXSA6IGAke3ZhbHVlfS5gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGludGVycG9sYXRlV2l0aEZhbGxiYWNrKGZvcm1hdFN0cmluZzogc3RyaW5nIHwgc3RyaW5nW10sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICAvLyBGb3JtYXQgc3RyaW5nIGNhbiBiZSBhbiBhcnJheSwgaXQgd2lsbCBhdHRlbXB0IHRvIGludGVycG9sYXRlIGVhY2ggaXRlbVxyXG4gICAgLy8gaW4gdGhlIGFycmF5LCBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gcmVwbGFjZSBpdCB3aWxsIG1hcmsgaXQgYXMgc3VjaFxyXG4gICAgLy8gSXQgd2lsbCBlaXRoZXIgcmV0dXJuIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlcGxhY2VtZW50IG9mIEFMTCB2YXJpYWJsZXMsXHJcbiAgICAvLyBvciBhbiBlbXB0eSBzdHJpbmdcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1hdFN0cmluZykpIHtcclxuICAgICAgY29uc3Qgc3VjY2Vzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgZm9ybWF0U3RyaW5nLmZvckVhY2goKGZvcm1hdDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgYXR0ZW1wdCA9IGZvcm1hdC5yZXBsYWNlKC9cXCQoW1xcd1xcLl0rKS9nLCAob3JpZ2luYWwsIGtleSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXlzLnNoaWZ0KCldO1xyXG4gICAgICAgICAgd2hpbGUgKGtleXMubGVuZ3RoICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgayA9IGtleXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgdmFsdWUgPSBrID8gdmFsdWVba10gOiBgJHt2YWx1ZX0uYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MgJiYgSGVscGVycy5pc0VtcHR5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBIZWxwZXJzLmlzRW1wdHkodmFsdWUpID8gJycgOiB2YWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XHJcbiAgICAgICAgICBzdWNjZXNzZXMucHVzaChhdHRlbXB0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmFpbHVyZXMucHVzaChhdHRlbXB0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoc3VjY2Vzc2VzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzZXNbMF07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIEhlbHBlcnMuaW50ZXJwb2xhdGUoZm9ybWF0U3RyaW5nLCBkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZlcmlmaWVzIHRoYXQgYW4gb2JqZWN0IGhhcyBldmVyeSBwcm9wZXJ0eSBleHBlY3RlZCBieSBhIHN0cmluZyB0byBpbnRlcnBvbGF0ZVxyXG4gICAqIEBwYXJhbSBzdHIgICBUaGUgc3RyaW5nIHRvIGludGVycG9sYXRlXHJcbiAgICogQHBhcmFtIHByb3BzIFRoZSBwYXJhbXMgdG8gcmVwbGFjZSBpbiBzdHJpbmcuXHJcbiAgICovXHJcbiAgc3RhdGljIHZhbGlkYXRlSW50ZXJwb2xhdGlvblByb3BzKHN0cjogc3RyaW5nLCBwcm9wczogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXlzID0gc3RyLm1hdGNoKC9cXCQoW1xcd1xcLl0rKS9nKTtcclxuICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHtcclxuICAgICAgcmV0dXJuIHByb3BzLmhhc093blByb3BlcnR5KGtleS5zdWJzdHIoMSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNPYmplY3QoaXRlbSkge1xyXG4gICAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pICYmIGl0ZW0gIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmdcclxuICAgKi9cclxuICBzdGF0aWMgaXNTdHJpbmcob2JqOiBhbnkpIHtcclxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBlc2NhcGVTdHJpbmcob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKEhlbHBlcnMuaXNTdHJpbmcob2JqKSkge1xyXG4gICAgICByZXR1cm4gb2JqLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzTnVtYmVyKHZhbDogYW55LCBpbmNsdWRlTmVnYXRpdmVzOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG51bWJlclJlZ2V4ID0gaW5jbHVkZU5lZ2F0aXZlcyA/IC9eLXswLDF9XFxkKlxcLj9cXGQqJC8gOiAvXlxcZCpcXC4/XFxkKiQvO1xyXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB2YWwubGVuZ3RoID4gMCAmJiB2YWwgIT09ICcuJyAmJiBudW1iZXJSZWdleC50ZXN0KHZhbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgYSB1bmRlZmluZWQgb3IgbnVsbFxyXG4gICAqL1xyXG4gIHN0YXRpYyBpc0JsYW5rKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgb2JqZWN0IGlzIGEgdW5kZWZpbmVkIG9yIG51bGxcclxuICAgKi9cclxuICBzdGF0aWMgaXNFbXB0eShvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEhlbHBlcnMuaXNCbGFuayhvYmopIHx8IG9iaiA9PT0gJycgfHwgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG9iamVjdCBpcyBhIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgc3RhdGljIGlzRnVuY3Rpb24ob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jYWxsICYmIG9iai5hcHBseSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgYSBEYXRlXHJcbiAgICovXHJcbiAgc3RhdGljIGlzRGF0ZShvYmo6IGFueSkge1xyXG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29udmVydFRvQXJyYXkob2JqOiB1bmtub3duKSB7XHJcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgIHJldHVybiBbb2JqXTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc29ydEJ5RmllbGQoZmllbGRzOiBhbnksIHJldmVyc2UgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIChwcmV2aW91czogYW55LCBjdXJyZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKEhlbHBlcnMuaXNGdW5jdGlvbihmaWVsZHMpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkcyhyZXZlcnNlID8gJ2Rlc2MnIDogJ2FzYycsIHByZXZpb3VzLCBjdXJyZW50KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xyXG4gICAgICAgIGZpZWxkcyA9IFtmaWVsZHNdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IGZpZWxkc1tpXTtcclxuICAgICAgICBsZXQgZmlyc3QgPSBwcmV2aW91c1tmaWVsZF0gfHwgJyc7XHJcbiAgICAgICAgbGV0IHNlY29uZCA9IGN1cnJlbnRbZmllbGRdIHx8ICcnO1xyXG5cclxuICAgICAgICBpZiAoSGVscGVycy5pc0RhdGUoZmlyc3QpICYmIEhlbHBlcnMuaXNEYXRlKHNlY29uZCkpIHtcclxuICAgICAgICAgIC8vIERhdGVzXHJcbiAgICAgICAgICBmaXJzdCA9IGZpcnN0LmdldFRpbWUoKTtcclxuICAgICAgICAgIHNlY29uZCA9IHNlY29uZC5nZXRUaW1lKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChIZWxwZXJzLmlzU3RyaW5nKGZpcnN0KSAmJiBIZWxwZXJzLmlzU3RyaW5nKHNlY29uZCkpIHtcclxuICAgICAgICAgIC8vIEJhc2ljIHN0cmluZ3NcclxuICAgICAgICAgIGZpcnN0ID0gZmlyc3QudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIHNlY29uZCA9IHNlY29uZC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBOdW1iZXJzXHJcbiAgICAgICAgICBmaXJzdCA9IGlzTmFOKE51bWJlcihmaXJzdCkpID8gZmlyc3QgOiBOdW1iZXIoZmlyc3QpO1xyXG4gICAgICAgICAgc2Vjb25kID0gaXNOYU4oTnVtYmVyKHNlY29uZCkpID8gc2Vjb25kIDogTnVtYmVyKHNlY29uZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHtcclxuICAgICAgICAgIHJldHVybiByZXZlcnNlID8gLTEgOiAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3QgPCBzZWNvbmQpIHtcclxuICAgICAgICAgIHJldHVybiByZXZlcnNlID8gMSA6IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZmlsdGVyQnlGaWVsZChrZXksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gKGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gICAgICBsZXQgZmllbGQgPSBjYW4oaXRlbSkuaGF2ZShrZXkpO1xyXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZShmaWVsZCwgaXRlbSkpO1xyXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlLmluY2x1ZGVzKGZpZWxkKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICBmaWVsZCA9IGZpZWxkLmdldFRpbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLm1pbikge1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGZpZWxkID49IHZhbHVlLm1pbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS5tYXgpIHtcclxuICAgICAgICAgIHJlc3VsdHMucHVzaChmaWVsZCA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUuYW55ICYmIEFycmF5LmlzQXJyYXkodmFsdWUuYW55KSkge1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZS5hbnkuc29tZSgodikgPT4gZmllbGQuaW5jbHVkZXModikpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZS5hbnkuaW5jbHVkZXMoZmllbGQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLmFsbCAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmFsbCkpIHtcclxuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZS5hbGwuZXZlcnkoKHYpID0+IGZpZWxkLmluY2x1ZGVzKHYpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS5ub3QpIHtcclxuICAgICAgICAgIHJlc3VsdHMucHVzaCghSGVscGVycy5maWx0ZXJCeUZpZWxkKGtleSwgdmFsdWUubm90KShpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3Qgc3Via2V5IGluIHZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAoWydtaW4nLCAnbWF4JywgJ2FueScsICdhbGwnLCAnbm90J10uaW5kZXhPZihzdWJrZXkpIDwgMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJ2YWx1ZSA9IHZhbHVlW3N1YmtleV07XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChIZWxwZXJzLmZpbHRlckJ5RmllbGQoYCR7a2V5fS4ke3N1YmtleX1gLCBzdWJ2YWx1ZSkoaXRlbSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHRzLnB1c2goSlNPTi5zdHJpbmdpZnkoZmllbGQpLm1hdGNoKG5ldyBSZWdFeHAodmFsdWUsICdnaScpKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHgpID0+IHgpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaW5kQW5jZXN0b3IoZWxlbWVudDogRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQge1xyXG4gICAgd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KSAmJiAhZWxlbWVudC5tYXRjaGVzLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxyXG4gICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVlcENsb25lKGl0ZW06IGFueSk6IGFueSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xyXG4gICAgICBjb25zdCBuZXdBcnIgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaSA9IGl0ZW0ubGVuZ3RoOyBpLS0gPiAwOyApIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXHJcbiAgICAgICAgbmV3QXJyW2ldID0gSGVscGVycy5kZWVwQ2xvbmUoaXRlbVtpXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld0FycjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJyAmJiAhL1xcKFxcKSBcXHsgXFxbbmF0aXZlLy50ZXN0KGl0ZW0udG9TdHJpbmcoKSkgJiYgIWl0ZW0udG9TdHJpbmcoKS5zdGFydHNXaXRoKCdjbGFzcycpKSB7XHJcbiAgICAgIGxldCBvYmo7XHJcbiAgICAgIGZvciAoY29uc3QgayBpbiBpdGVtKSB7XHJcbiAgICAgICAgaWYgKGsgaW4gaXRlbSkge1xyXG4gICAgICAgICAgb2JqW2tdID0gSGVscGVycy5kZWVwQ2xvbmUoaXRlbVtrXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgayBpbiBpdGVtKSB7XHJcbiAgICAgICAgaWYgKGsgaW4gaXRlbSkge1xyXG4gICAgICAgICAgb2JqW2tdID0gSGVscGVycy5kZWVwQ2xvbmUoaXRlbVtrXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWVwQXNzaWduKC4uLm9ianMpIHtcclxuICAgIGlmIChvYmpzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHR3byBvciBtb3JlIG9iamVjdHMgdG8gbWVyZ2UnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIG9ianNbMF0pO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IE9iamVjdC5hc3NpZ24oe30sIG9ianNbaV0pO1xyXG4gICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcclxuICAgICAgICBpZiAoSGVscGVycy5pc09iamVjdCh2YWx1ZSkpIHtcclxuICAgICAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgSGVscGVycy5pc09iamVjdCh0YXJnZXRbcHJvcF0pKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IEhlbHBlcnMuZGVlcEFzc2lnbih0YXJnZXRbcHJvcF0sIHZhbHVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgQXJyYXkuaXNBcnJheSh0YXJnZXRbcHJvcF0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGFyZ2V0W3Byb3BdO1xyXG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChzb3VyY2VJdGVtLCBpdGVtSW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgdGFyZ2V0QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGFyZ2V0QXJyYXlbaXRlbUluZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaXModGFyZ2V0SXRlbSwgc291cmNlSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKEhlbHBlcnMuaXNPYmplY3QodGFyZ2V0SXRlbSkgJiYgSGVscGVycy5pc09iamVjdChzb3VyY2VJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheVtpdGVtSW5kZXhdID0gSGVscGVycy5kZWVwQXNzaWduKHRhcmdldEl0ZW0sIHNvdXJjZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldEl0ZW0pICYmIEFycmF5LmlzQXJyYXkoc291cmNlSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbaXRlbUluZGV4XSA9IEhlbHBlcnMuZGVlcEFzc2lnbih0YXJnZXRJdGVtLCBzb3VyY2VJdGVtKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W2l0ZW1JbmRleF0gPSBzb3VyY2VJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5wdXNoKHNvdXJjZUl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV29ya2Fyb3VuZCBmb3IgRWRnZSBicm93c2VyIHNpbmNlIEVsZW1lbnQ6bmV4dEVsZW1lbnRTaWJsaW5nIGlzIHVuZGVmaW5lZCBpbnNpZGUgb2YgdGVtcGxhdGUgZGlyZWN0aXZlc1xyXG4gICAqIEBwYXJhbSBlbGVtZW50IGFueSBkb2N1bWVudCBlbGVtZW50XHJcbiAgICogQHJldHVybnMgdGhlIG5leHQgc2libGluZyBub2RlIHRoYXQgaXMgb2YgdHlwZTogRWxlbWVudFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXROZXh0RWxlbWVudFNpYmxpbmcoZWxlbWVudDogRWxlbWVudCk6IE5vZGUge1xyXG4gICAgaWYgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB7XHJcbiAgICAgIHJldHVybiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBlID0gZWxlbWVudC5uZXh0U2libGluZztcclxuICAgICAgd2hpbGUgKGUgJiYgMSAhPT0gZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGUgPSBlLm5leHRTaWJsaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGVUb09iamVjdChcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgKToge1xyXG4gICAgZGF5OiBzdHJpbmc7XHJcbiAgICBkYXlQZXJpb2Q6IHN0cmluZztcclxuICAgIGVyYTogc3RyaW5nO1xyXG4gICAgaG91cjogc3RyaW5nO1xyXG4gICAgbWludXRlOiBzdHJpbmc7XHJcbiAgICBtb250aDogc3RyaW5nO1xyXG4gICAgc2Vjb25kOiBzdHJpbmc7XHJcbiAgICB3ZWVrZGF5OiBzdHJpbmc7XHJcbiAgICB5ZWFyOiBzdHJpbmc7XHJcbiAgfSB7XHJcbiAgICBjb25zdCBkYXRlT2JqID0ge1xyXG4gICAgICBkYXk6ICcnLFxyXG4gICAgICBkYXlQZXJpb2Q6ICcnLFxyXG4gICAgICBlcmE6ICcnLFxyXG4gICAgICBob3VyOiAnJyxcclxuICAgICAgbWludXRlOiAnJyxcclxuICAgICAgbW9udGg6ICcnLFxyXG4gICAgICBzZWNvbmQ6ICcnLFxyXG4gICAgICB3ZWVrZGF5OiAnJyxcclxuICAgICAgeWVhcjogJycsXHJcbiAgICB9O1xyXG4gICAgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7XHJcbiAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICBlcmE6ICdzaG9ydCcsXHJcbiAgICAgIGhvdXI6ICdudW1lcmljJyxcclxuICAgICAgbWludXRlOiAnbnVtZXJpYycsXHJcbiAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgIHNlY29uZDogJ251bWVyaWMnLFxyXG4gICAgICB3ZWVrZGF5OiAnbG9uZycsXHJcbiAgICAgIHllYXI6ICdudW1lcmljJyxcclxuICAgIH0pXHJcbiAgICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXHJcbiAgICAgIC5mb3JFYWNoKChkYXRlVGltZUZvcm1hdFBhcnQ6IEludGwuRGF0ZVRpbWVGb3JtYXRQYXJ0KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGVUaW1lRm9ybWF0UGFydC50eXBlICE9PSAnbGl0ZXJhbCcpIHtcclxuICAgICAgICAgIGRhdGVPYmpbZGF0ZVRpbWVGb3JtYXRQYXJ0LnR5cGVdID0gZGF0ZVRpbWVGb3JtYXRQYXJ0LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gZGF0ZU9iajtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDYW4ge1xyXG4gIG9iajogT2JqZWN0O1xyXG5cclxuICBjb25zdHJ1Y3RvcihvYmo6IE9iamVjdCkge1xyXG4gICAgdGhpcy5vYmogPSBvYmo7XHJcbiAgfVxyXG5cclxuICBoYXZlKGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KCcuJyk7XHJcbiAgICBsZXQgaXRlbTogYW55ID0gdGhpcy5vYmo7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGl0ZW0gPSBpdGVtW3Byb3BzW2ldXTtcclxuICAgICAgaWYgKHRoaXMuY2hlY2soaXRlbSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgY2hlY2sodGhpbmc6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaW5nICE9PSB2b2lkIDA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FuKG9iajogYW55KSB7XHJcbiAgcmV0dXJuIG5ldyBDYW4ob2JqKTtcclxufVxyXG5cclxuLy8gQXNzdW1lcyBkYXRhIGlzIGFscmVhZHkgc29ydGVkXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlTZWFyY2g8VD4oaXRlbTogVCwgYXJyYXk6IFRbXSwgY29tcGFyZTogKGE6IFQsIGI6IFQpID0+IDEgfCAtMSB8IDAgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcclxuICByZXR1cm4gc2VhcmNoKDAsIGFycmF5Lmxlbmd0aCAtIDEpO1xyXG5cclxuICBmdW5jdGlvbiBzZWFyY2gobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAobWluID4gbWF4KSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBndWVzcyA9IG1pbiArIE1hdGguZmxvb3IoKG1heCAtIG1pbikgLyAyKTtcclxuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBjb21wYXJlKGl0ZW0sIGFycmF5W2d1ZXNzXSk7XHJcblxyXG4gICAgaWYgKGNvbXBhcmlzb24gPT09IDApIHtcclxuICAgICAgcmV0dXJuIGFycmF5W2d1ZXNzXTtcclxuICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHNlYXJjaChtaW4sIGd1ZXNzIC0gMSk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHNlYXJjaChndWVzcyArIDEsIG1heCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IG1pc21hdGNoOiAke0pTT04uc3RyaW5naWZ5KGl0ZW0pfSBub3QgY29tcGFyYWJsZSB0byAke0pTT04uc3RyaW5naWZ5KGFycmF5W2d1ZXNzXSl9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ // @dynamic
2
+ export class Helpers {
3
+ /**
4
+ * Swallows an event to stop further execution
5
+ */
6
+ static swallowEvent(event) {
7
+ if (event) {
8
+ event.stopPropagation();
9
+ event.preventDefault();
10
+ }
11
+ }
12
+ static interpolate(str, props) {
13
+ if (this.isDate(props)) {
14
+ props = this.dateToObject(props);
15
+ }
16
+ return str.replace(/\$([\w\.]+)/g, (original, key) => {
17
+ const keys = key.split('.');
18
+ let value = props[keys.shift()];
19
+ while (keys.length && value !== undefined) {
20
+ const k = keys.shift();
21
+ value = k ? value[k] : `${value}.`;
22
+ }
23
+ return value !== undefined ? value : '';
24
+ });
25
+ }
26
+ static interpolateWithFallback(formatString, data) {
27
+ // Format string can be an array, it will attempt to interpolate each item
28
+ // in the array, if there is a failure to replace it will mark it as such
29
+ // It will either return the first successful replacement of ALL variables,
30
+ // or an empty string
31
+ if (Array.isArray(formatString)) {
32
+ const successes = [];
33
+ const failures = [];
34
+ formatString.forEach((format) => {
35
+ let isSuccess = true;
36
+ const attempt = format.replace(/\$([\w\.]+)/g, (original, key) => {
37
+ const keys = key.split('.');
38
+ let value = data[keys.shift()];
39
+ while (keys.length && value !== undefined) {
40
+ const k = keys.shift();
41
+ value = k ? value[k] : `${value}.`;
42
+ }
43
+ if (isSuccess && Helpers.isEmpty(value)) {
44
+ isSuccess = false;
45
+ }
46
+ return Helpers.isEmpty(value) ? '' : value;
47
+ });
48
+ if (isSuccess) {
49
+ successes.push(attempt);
50
+ }
51
+ else {
52
+ failures.push(attempt);
53
+ }
54
+ });
55
+ if (successes.length !== 0) {
56
+ return successes[0];
57
+ }
58
+ return '';
59
+ }
60
+ else {
61
+ return Helpers.interpolate(formatString, data);
62
+ }
63
+ }
64
+ /**
65
+ * Verifies that an object has every property expected by a string to interpolate
66
+ * @param str The string to interpolate
67
+ * @param props The params to replace in string.
68
+ */
69
+ static validateInterpolationProps(str, props) {
70
+ const keys = str.match(/\$([\w\.]+)/g);
71
+ return keys.every((key) => {
72
+ return props.hasOwnProperty(key.substr(1));
73
+ });
74
+ }
75
+ static isObject(item) {
76
+ return item && typeof item === 'object' && !Array.isArray(item) && item !== null;
77
+ }
78
+ /**
79
+ * Checks to see if the object is a string
80
+ */
81
+ static isString(obj) {
82
+ return typeof obj === 'string';
83
+ }
84
+ static escapeString(obj) {
85
+ if (Helpers.isString(obj)) {
86
+ return obj.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
87
+ }
88
+ return obj;
89
+ }
90
+ static isNumber(val, includeNegatives = false) {
91
+ const numberRegex = includeNegatives ? /^-{0,1}\d*\.?\d*$/ : /^\d*\.?\d*$/;
92
+ if (typeof val === 'string') {
93
+ return val.length > 0 && val !== '.' && numberRegex.test(val);
94
+ }
95
+ else {
96
+ return !isNaN(parseFloat(val));
97
+ }
98
+ }
99
+ /**
100
+ * Checks to see if the object is a undefined or null
101
+ */
102
+ static isBlank(obj) {
103
+ return obj === undefined || obj === null;
104
+ }
105
+ /**
106
+ * Checks to see if the object is a undefined or null
107
+ */
108
+ static isEmpty(obj) {
109
+ return Helpers.isBlank(obj) || obj === '' || (Array.isArray(obj) && obj.length === 0);
110
+ }
111
+ /**
112
+ * Checks to see if the object is a function
113
+ */
114
+ static isFunction(obj) {
115
+ return !!(obj && obj.constructor && obj.call && obj.apply);
116
+ }
117
+ /**
118
+ * Checks to see if the object is a Date
119
+ */
120
+ static isDate(obj) {
121
+ return obj instanceof Date;
122
+ }
123
+ static convertToArray(obj) {
124
+ if (obj === undefined) {
125
+ return [];
126
+ }
127
+ else if (!Array.isArray(obj)) {
128
+ return [obj];
129
+ }
130
+ return obj;
131
+ }
132
+ static sortByField(fields, reverse = false) {
133
+ return (previous, current) => {
134
+ if (Helpers.isFunction(fields)) {
135
+ return fields(reverse ? 'desc' : 'asc', previous, current);
136
+ }
137
+ if (!Array.isArray(fields)) {
138
+ fields = [fields];
139
+ }
140
+ for (let i = 0; i < fields.length; i++) {
141
+ const field = fields[i];
142
+ let first = previous[field] || '';
143
+ let second = current[field] || '';
144
+ if (Helpers.isDate(first) && Helpers.isDate(second)) {
145
+ // Dates
146
+ first = first.getTime();
147
+ second = second.getTime();
148
+ }
149
+ else if (Helpers.isString(first) && Helpers.isString(second)) {
150
+ // Basic strings
151
+ first = first.toLowerCase();
152
+ second = second.toLowerCase();
153
+ }
154
+ else {
155
+ // Numbers
156
+ first = isNaN(Number(first)) ? first : Number(first);
157
+ second = isNaN(Number(second)) ? second : Number(second);
158
+ }
159
+ if (first > second) {
160
+ return reverse ? -1 : 1;
161
+ }
162
+ else if (first < second) {
163
+ return reverse ? 1 : -1;
164
+ }
165
+ }
166
+ return 0;
167
+ };
168
+ }
169
+ static filterByField(key, value) {
170
+ return (item) => {
171
+ const results = [];
172
+ let field = can(item).have(key);
173
+ if (value instanceof Function) {
174
+ results.push(value(field, item));
175
+ }
176
+ else if (Array.isArray(value)) {
177
+ results.push(value.includes(field));
178
+ }
179
+ else if (value instanceof Object) {
180
+ if (field instanceof Date) {
181
+ field = field.getTime();
182
+ }
183
+ if (value.min) {
184
+ results.push(field >= value.min);
185
+ }
186
+ if (value.max) {
187
+ results.push(field <= value.max);
188
+ }
189
+ if (value.any && Array.isArray(value.any)) {
190
+ if (Array.isArray(field)) {
191
+ results.push(value.any.some((v) => field.includes(v)));
192
+ }
193
+ else {
194
+ results.push(value.any.includes(field));
195
+ }
196
+ }
197
+ if (value.all && Array.isArray(value.all)) {
198
+ results.push(value.all.every((v) => field.includes(v)));
199
+ }
200
+ if (value.not) {
201
+ results.push(!Helpers.filterByField(key, value.not)(item));
202
+ }
203
+ for (const subkey in value) {
204
+ if (['min', 'max', 'any', 'all', 'not'].indexOf(subkey) < 0) {
205
+ const subvalue = value[subkey];
206
+ results.push(Helpers.filterByField(`${key}.${subkey}`, subvalue)(item));
207
+ }
208
+ }
209
+ }
210
+ else {
211
+ results.push(JSON.stringify(field).match(new RegExp(value, 'gi')));
212
+ }
213
+ return results.every((x) => x);
214
+ };
215
+ }
216
+ static findAncestor(element, selector) {
217
+ while ((element = element.parentElement) && !element.matches.call(element, selector))
218
+ ; // tslint:disable-line
219
+ return element;
220
+ }
221
+ static deepClone(item) {
222
+ if (Array.isArray(item)) {
223
+ const newArr = [];
224
+ for (let i = item.length; i-- > 0;) {
225
+ // tslint:disable-line
226
+ newArr[i] = Helpers.deepClone(item[i]);
227
+ }
228
+ return newArr;
229
+ }
230
+ if (typeof item === 'function' && !/\(\) \{ \[native/.test(item.toString()) && !item.toString().startsWith('class')) {
231
+ let obj;
232
+ for (const k in item) {
233
+ if (k in item) {
234
+ obj[k] = Helpers.deepClone(item[k]);
235
+ }
236
+ }
237
+ return obj;
238
+ }
239
+ if (item && typeof item === 'object') {
240
+ const obj = {};
241
+ for (const k in item) {
242
+ if (k in item) {
243
+ obj[k] = Helpers.deepClone(item[k]);
244
+ }
245
+ }
246
+ return obj;
247
+ }
248
+ return item;
249
+ }
250
+ static deepAssign(...objs) {
251
+ if (objs.length < 2) {
252
+ throw new Error('Need two or more objects to merge');
253
+ }
254
+ const target = Object.assign({}, objs[0]);
255
+ for (let i = 1; i < objs.length; i++) {
256
+ const source = Object.assign({}, objs[i]);
257
+ Object.keys(source).forEach((prop) => {
258
+ const value = source[prop];
259
+ if (Helpers.isObject(value)) {
260
+ if (target.hasOwnProperty(prop) && Helpers.isObject(target[prop])) {
261
+ target[prop] = Helpers.deepAssign(target[prop], value);
262
+ }
263
+ else {
264
+ target[prop] = value;
265
+ }
266
+ }
267
+ else if (Array.isArray(value)) {
268
+ if (target.hasOwnProperty(prop) && Array.isArray(target[prop])) {
269
+ const targetArray = target[prop];
270
+ value.forEach((sourceItem, itemIndex) => {
271
+ if (itemIndex < targetArray.length) {
272
+ const targetItem = targetArray[itemIndex];
273
+ if (Object.is(targetItem, sourceItem)) {
274
+ return;
275
+ }
276
+ if (Helpers.isObject(targetItem) && Helpers.isObject(sourceItem)) {
277
+ targetArray[itemIndex] = Helpers.deepAssign(targetItem, sourceItem);
278
+ }
279
+ else if (Array.isArray(targetItem) && Array.isArray(sourceItem)) {
280
+ targetArray[itemIndex] = Helpers.deepAssign(targetItem, sourceItem);
281
+ }
282
+ else {
283
+ targetArray[itemIndex] = sourceItem;
284
+ }
285
+ }
286
+ else {
287
+ targetArray.push(sourceItem);
288
+ }
289
+ });
290
+ }
291
+ else {
292
+ target[prop] = value;
293
+ }
294
+ }
295
+ else {
296
+ target[prop] = value;
297
+ }
298
+ });
299
+ }
300
+ return target;
301
+ }
302
+ /**
303
+ * Workaround for Edge browser since Element:nextElementSibling is undefined inside of template directives
304
+ * @param element any document element
305
+ * @returns the next sibling node that is of type: Element
306
+ */
307
+ static getNextElementSibling(element) {
308
+ if (element.nextElementSibling) {
309
+ return element.nextElementSibling;
310
+ }
311
+ else {
312
+ let e = element.nextSibling;
313
+ while (e && 1 !== e.nodeType) {
314
+ e = e.nextSibling;
315
+ }
316
+ return e;
317
+ }
318
+ }
319
+ static dateToObject(date) {
320
+ const dateObj = {
321
+ day: '',
322
+ dayPeriod: '',
323
+ era: '',
324
+ hour: '',
325
+ minute: '',
326
+ month: '',
327
+ second: '',
328
+ weekday: '',
329
+ year: '',
330
+ };
331
+ Intl.DateTimeFormat('en-US', {
332
+ day: 'numeric',
333
+ era: 'short',
334
+ hour: 'numeric',
335
+ minute: 'numeric',
336
+ month: 'numeric',
337
+ second: 'numeric',
338
+ weekday: 'long',
339
+ year: 'numeric',
340
+ })
341
+ .formatToParts(date)
342
+ .forEach((dateTimeFormatPart) => {
343
+ if (dateTimeFormatPart.type !== 'literal') {
344
+ dateObj[dateTimeFormatPart.type] = dateTimeFormatPart.value;
345
+ }
346
+ });
347
+ return dateObj;
348
+ }
349
+ }
350
+ export class Can {
351
+ constructor(obj) {
352
+ this.obj = obj;
353
+ }
354
+ have(key) {
355
+ const props = key.split('.');
356
+ let item = this.obj;
357
+ for (let i = 0; i < props.length; i++) {
358
+ item = item[props[i]];
359
+ if (this.check(item) === false) {
360
+ return item;
361
+ }
362
+ }
363
+ return item;
364
+ }
365
+ check(thing) {
366
+ return thing !== void 0;
367
+ }
368
+ }
369
+ export function can(obj) {
370
+ return new Can(obj);
371
+ }
372
+ // Assumes data is already sorted
373
+ export function binarySearch(item, array, compare) {
374
+ return search(0, array.length - 1);
375
+ function search(min, max) {
376
+ if (min > max) {
377
+ return undefined;
378
+ }
379
+ const guess = min + Math.floor((max - min) / 2);
380
+ const comparison = compare(item, array[guess]);
381
+ if (comparison === 0) {
382
+ return array[guess];
383
+ }
384
+ else if (comparison === -1) {
385
+ return search(min, guess - 1);
386
+ }
387
+ else if (comparison === 1) {
388
+ return search(guess + 1, max);
389
+ }
390
+ else {
391
+ throw new Error(`Input mismatch: ${JSON.stringify(item)} not comparable to ${JSON.stringify(array[guess])}`);
392
+ }
393
+ }
394
+ }
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9IZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVc7QUFDWCxNQUFNLE9BQU8sT0FBTztJQUNsQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSztRQUN2QixJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUNuRSxNQUFNLElBQUksR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDekMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2QixLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7YUFDcEM7WUFDRCxPQUFPLEtBQUssS0FBSyxTQUFTLENB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QyxTQUFTLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBIZWxwZXJzIHtcbiAgLyoqXG4gICAqIFN3YWxsb3dzIGFuIGV2ZW50IHRvIHN0b3AgZnVydGhlciBleGVjdXRpb25cbiAgICovXG4gIHN0YXRpYyBzd2FsbG93RXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaW50ZXJwb2xhdGUoc3RyOiBzdHJpbmcsIHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGF0ZShwcm9wcykpIHtcbiAgICAgIHByb3BzID0gdGhpcy5kYXRlVG9PYmplY3QocHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcJChbXFx3XFwuXSspL2csIChvcmlnaW5hbDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgIGxldCB2YWx1ZSA9IHByb3BzW2tleXMuc2hpZnQoKV07XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGggJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBrID0ga2V5cy5zaGlmdCgpO1xuICAgICAgICB2YWx1ZSA9IGsgPyB2YWx1ZVtrXSA6IGAke3ZhbHVlfS5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGludGVycG9sYXRlV2l0aEZhbGxiYWNrKGZvcm1hdFN0cmluZzogc3RyaW5nIHwgc3RyaW5nW10sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgLy8gRm9ybWF0IHN0cmluZyBjYW4gYmUgYW4gYXJyYXksIGl0IHdpbGwgYXR0ZW1wdCB0byBpbnRlcnBvbGF0ZSBlYWNoIGl0ZW1cbiAgICAvLyBpbiB0aGUgYXJyYXksIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byByZXBsYWNlIGl0IHdpbGwgbWFyayBpdCBhcyBzdWNoXG4gICAgLy8gSXQgd2lsbCBlaXRoZXIgcmV0dXJuIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlcGxhY2VtZW50IG9mIEFMTCB2YXJpYWJsZXMsXG4gICAgLy8gb3IgYW4gZW1wdHkgc3RyaW5nXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybWF0U3RyaW5nKSkge1xuICAgICAgY29uc3Qgc3VjY2Vzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3JtYXRTdHJpbmcuZm9yRWFjaCgoZm9ybWF0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IGF0dGVtcHQgPSBmb3JtYXQucmVwbGFjZSgvXFwkKFtcXHdcXC5dKykvZywgKG9yaWdpbmFsLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXlzLnNoaWZ0KCldO1xuICAgICAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5cy5zaGlmdCgpO1xuICAgICAgICAgICAgdmFsdWUgPSBrID8gdmFsdWVba10gOiBgJHt2YWx1ZX0uYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzU3VjY2VzcyAmJiBIZWxwZXJzLmlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIEhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkgPyAnJyA6IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKGF0dGVtcHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goYXR0ZW1wdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHN1Y2Nlc3Nlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3Nlc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEhlbHBlcnMuaW50ZXJwb2xhdGUoZm9ybWF0U3RyaW5nLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhbiBvYmplY3QgaGFzIGV2ZXJ5IHByb3BlcnR5IGV4cGVjdGVkIGJ5IGEgc3RyaW5nIHRvIGludGVycG9sYXRlXG4gICAqIEBwYXJhbSBzdHIgICBUaGUgc3RyaW5nIHRvIGludGVycG9sYXRlXG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcGFyYW1zIHRvIHJlcGxhY2UgaW4gc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlSW50ZXJwb2xhdGlvblByb3BzKHN0cjogc3RyaW5nLCBwcm9wczogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5cyA9IHN0ci5tYXRjaCgvXFwkKFtcXHdcXC5dKykvZyk7XG4gICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLmhhc093blByb3BlcnR5KGtleS5zdWJzdHIoMSkpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGlzT2JqZWN0KGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkgJiYgaXRlbSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBpc1N0cmluZyhvYmo6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN0YXRpYyBlc2NhcGVTdHJpbmcob2JqOiBhbnkpOiBhbnkge1xuICAgIGlmIChIZWxwZXJzLmlzU3RyaW5nKG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHN0YXRpYyBpc051bWJlcih2YWw6IGFueSwgaW5jbHVkZU5lZ2F0aXZlczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgbnVtYmVyUmVnZXggPSBpbmNsdWRlTmVnYXRpdmVzID8gL14tezAsMX1cXGQqXFwuP1xcZCokLyA6IC9eXFxkKlxcLj9cXGQqJC87XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsLmxlbmd0aCA+IDAgJiYgdmFsICE9PSAnLicgJiYgbnVtYmVyUmVnZXgudGVzdCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG9iamVjdCBpcyBhIHVuZGVmaW5lZCBvciBudWxsXG4gICAqL1xuICBzdGF0aWMgaXNCbGFuayhvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgb2JqZWN0IGlzIGEgdW5kZWZpbmVkIG9yIG51bGxcbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNCbGFuayhvYmopIHx8IG9iaiA9PT0gJycgfHwgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBvYmplY3QgaXMgYSBmdW5jdGlvblxuICAgKi9cbiAgc3RhdGljIGlzRnVuY3Rpb24ob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY2FsbCAmJiBvYmouYXBwbHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG9iamVjdCBpcyBhIERhdGVcbiAgICovXG4gIHN0YXRpYyBpc0RhdGUob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0VG9BcnJheShvYmo6IHVua25vd24pIHtcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBbb2JqXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHN0YXRpYyBzb3J0QnlGaWVsZChmaWVsZHM6IGFueSwgcmV2ZXJzZSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIChwcmV2aW91czogYW55LCBjdXJyZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChIZWxwZXJzLmlzRnVuY3Rpb24oZmllbGRzKSkge1xuICAgICAgICByZXR1cm4gZmllbGRzKHJldmVyc2UgPyAnZGVzYycgOiAnYXNjJywgcHJldmlvdXMsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcykpIHtcbiAgICAgICAgZmllbGRzID0gW2ZpZWxkc107XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWVsZDogc3RyaW5nID0gZmllbGRzW2ldO1xuICAgICAgICBsZXQgZmlyc3QgPSBwcmV2aW91c1tmaWVsZF0gfHwgJyc7XG4gICAgICAgIGxldCBzZWNvbmQgPSBjdXJyZW50W2ZpZWxkXSB8fCAnJztcblxuICAgICAgICBpZiAoSGVscGVycy5pc0RhdGUoZmlyc3QpICYmIEhlbHBlcnMuaXNEYXRlKHNlY29uZCkpIHtcbiAgICAgICAgICAvLyBEYXRlc1xuICAgICAgICAgIGZpcnN0ID0gZmlyc3QuZ2V0VGltZSgpO1xuICAgICAgICAgIHNlY29uZCA9IHNlY29uZC5nZXRUaW1lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoSGVscGVycy5pc1N0cmluZyhmaXJzdCkgJiYgSGVscGVycy5pc1N0cmluZyhzZWNvbmQpKSB7XG4gICAgICAgICAgLy8gQmFzaWMgc3RyaW5nc1xuICAgICAgICAgIGZpcnN0ID0gZmlyc3QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBzZWNvbmQgPSBzZWNvbmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOdW1iZXJzXG4gICAgICAgICAgZmlyc3QgPSBpc05hTihOdW1iZXIoZmlyc3QpKSA/IGZpcnN0IDogTnVtYmVyKGZpcnN0KTtcbiAgICAgICAgICBzZWNvbmQgPSBpc05hTihOdW1iZXIoc2Vjb25kKSkgPyBzZWNvbmQgOiBOdW1iZXIoc2Vjb25kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdCA+IHNlY29uZCkge1xuICAgICAgICAgIHJldHVybiByZXZlcnNlID8gLTEgOiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0IDwgc2Vjb25kKSB7XG4gICAgICAgICAgcmV0dXJuIHJldmVyc2UgPyAxIDogLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZmlsdGVyQnlGaWVsZChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICBsZXQgZmllbGQgPSBjYW4oaXRlbSkuaGF2ZShrZXkpO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKGZpZWxkLCBpdGVtKSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZS5pbmNsdWRlcyhmaWVsZCkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgZmllbGQgPSBmaWVsZC5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLm1pbikge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChmaWVsZCA+PSB2YWx1ZS5taW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5tYXgpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goZmllbGQgPD0gdmFsdWUubWF4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuYW55ICYmIEFycmF5LmlzQXJyYXkodmFsdWUuYW55KSkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlLmFueS5zb21lKCh2KSA9PiBmaWVsZC5pbmNsdWRlcyh2KSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godmFsdWUuYW55LmluY2x1ZGVzKGZpZWxkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5hbGwgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5hbGwpKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlLmFsbC5ldmVyeSgodikgPT4gZmllbGQuaW5jbHVkZXModikpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUubm90KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKCFIZWxwZXJzLmZpbHRlckJ5RmllbGQoa2V5LCB2YWx1ZS5ub3QpKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHN1YmtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgIGlmIChbJ21pbicsICdtYXgnLCAnYW55JywgJ2FsbCcsICdub3QnXS5pbmRleE9mKHN1YmtleSkgPCAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJ2YWx1ZSA9IHZhbHVlW3N1YmtleV07XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goSGVscGVycy5maWx0ZXJCeUZpZWxkKGAke2tleX0uJHtzdWJrZXl9YCwgc3VidmFsdWUpKGl0ZW0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChKU09OLnN0cmluZ2lmeShmaWVsZCkubWF0Y2gobmV3IFJlZ0V4cCh2YWx1ZSwgJ2dpJykpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KCh4KSA9PiB4KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmRBbmNlc3RvcihlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB7XG4gICAgd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KSAmJiAhZWxlbWVudC5tYXRjaGVzLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShpdGVtOiBhbnkpOiBhbnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBuZXdBcnIgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSBpdGVtLmxlbmd0aDsgaS0tID4gMDsgKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgbmV3QXJyW2ldID0gSGVscGVycy5kZWVwQ2xvbmUoaXRlbVtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3QXJyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicgJiYgIS9cXChcXCkgXFx7IFxcW25hdGl2ZS8udGVzdChpdGVtLnRvU3RyaW5nKCkpICYmICFpdGVtLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnY2xhc3MnKSkge1xuICAgICAgbGV0IG9iajtcbiAgICAgIGZvciAoY29uc3QgayBpbiBpdGVtKSB7XG4gICAgICAgIGlmIChrIGluIGl0ZW0pIHtcbiAgICAgICAgICBvYmpba10gPSBIZWxwZXJzLmRlZXBDbG9uZShpdGVtW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIGZvciAoY29uc3QgayBpbiBpdGVtKSB7XG4gICAgICAgIGlmIChrIGluIGl0ZW0pIHtcbiAgICAgICAgICBvYmpba10gPSBIZWxwZXJzLmRlZXBDbG9uZShpdGVtW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBzdGF0aWMgZGVlcEFzc2lnbiguLi5vYmpzKSB7XG4gICAgaWYgKG9ianMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHR3byBvciBtb3JlIG9iamVjdHMgdG8gbWVyZ2UnKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2Jqc1swXSk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpzW2ldKTtcbiAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBIZWxwZXJzLmlzT2JqZWN0KHRhcmdldFtwcm9wXSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IEhlbHBlcnMuZGVlcEFzc2lnbih0YXJnZXRbcHJvcF0sIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBBcnJheS5pc0FycmF5KHRhcmdldFtwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgoc291cmNlSXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPCB0YXJnZXRBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGFyZ2V0QXJyYXlbaXRlbUluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmlzKHRhcmdldEl0ZW0sIHNvdXJjZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChIZWxwZXJzLmlzT2JqZWN0KHRhcmdldEl0ZW0pICYmIEhlbHBlcnMuaXNPYmplY3Qoc291cmNlSXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W2l0ZW1JbmRleF0gPSBIZWxwZXJzLmRlZXBBc3NpZ24odGFyZ2V0SXRlbSwgc291cmNlSXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldEl0ZW0pICYmIEFycmF5LmlzQXJyYXkoc291cmNlSXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W2l0ZW1JbmRleF0gPSBIZWxwZXJzLmRlZXBBc3NpZ24odGFyZ2V0SXRlbSwgc291cmNlSXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W2l0ZW1JbmRleF0gPSBzb3VyY2VJdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5wdXNoKHNvdXJjZUl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdvcmthcm91bmQgZm9yIEVkZ2UgYnJvd3NlciBzaW5jZSBFbGVtZW50Om5leHRFbGVtZW50U2libGluZyBpcyB1bmRlZmluZWQgaW5zaWRlIG9mIHRlbXBsYXRlIGRpcmVjdGl2ZXNcbiAgICogQHBhcmFtIGVsZW1lbnQgYW55IGRvY3VtZW50IGVsZW1lbnRcbiAgICogQHJldHVybnMgdGhlIG5leHQgc2libGluZyBub2RlIHRoYXQgaXMgb2YgdHlwZTogRWxlbWVudFxuICAgKi9cbiAgc3RhdGljIGdldE5leHRFbGVtZW50U2libGluZyhlbGVtZW50OiBFbGVtZW50KTogTm9kZSB7XG4gICAgaWYgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlID0gZWxlbWVudC5uZXh0U2libGluZztcbiAgICAgIHdoaWxlIChlICYmIDEgIT09IGUubm9kZVR5cGUpIHtcbiAgICAgICAgZSA9IGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0ZVRvT2JqZWN0KFxuICAgIGRhdGU6IERhdGUsXG4gICk6IHtcbiAgICBkYXk6IHN0cmluZztcbiAgICBkYXlQZXJpb2Q6IHN0cmluZztcbiAgICBlcmE6IHN0cmluZztcbiAgICBob3VyOiBzdHJpbmc7XG4gICAgbWludXRlOiBzdHJpbmc7XG4gICAgbW9udGg6IHN0cmluZztcbiAgICBzZWNvbmQ6IHN0cmluZztcbiAgICB3ZWVrZGF5OiBzdHJpbmc7XG4gICAgeWVhcjogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBkYXRlT2JqID0ge1xuICAgICAgZGF5OiAnJyxcbiAgICAgIGRheVBlcmlvZDogJycsXG4gICAgICBlcmE6ICcnLFxuICAgICAgaG91cjogJycsXG4gICAgICBtaW51dGU6ICcnLFxuICAgICAgbW9udGg6ICcnLFxuICAgICAgc2Vjb25kOiAnJyxcbiAgICAgIHdlZWtkYXk6ICcnLFxuICAgICAgeWVhcjogJycsXG4gICAgfTtcbiAgICBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgZXJhOiAnc2hvcnQnLFxuICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJ251bWVyaWMnLFxuICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgfSlcbiAgICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgICAuZm9yRWFjaCgoZGF0ZVRpbWVGb3JtYXRQYXJ0OiBJbnRsLkRhdGVUaW1lRm9ybWF0UGFydCkgPT4ge1xuICAgICAgICBpZiAoZGF0ZVRpbWVGb3JtYXRQYXJ0LnR5cGUgIT09ICdsaXRlcmFsJykge1xuICAgICAgICAgIGRhdGVPYmpbZGF0ZVRpbWVGb3JtYXRQYXJ0LnR5cGVdID0gZGF0ZVRpbWVGb3JtYXRQYXJ0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gZGF0ZU9iajtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FuIHtcbiAgb2JqOiBPYmplY3Q7XG5cbiAgY29uc3RydWN0b3Iob2JqOiBPYmplY3QpIHtcbiAgICB0aGlzLm9iaiA9IG9iajtcbiAgfVxuXG4gIGhhdmUoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgbGV0IGl0ZW06IGFueSA9IHRoaXMub2JqO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBpdGVtW3Byb3BzW2ldXTtcbiAgICAgIGlmICh0aGlzLmNoZWNrKGl0ZW0pID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBjaGVjayh0aGluZzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaW5nICE9PSB2b2lkIDA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbihvYmo6IGFueSkge1xuICByZXR1cm4gbmV3IENhbihvYmopO1xufVxuXG4vLyBBc3N1bWVzIGRhdGEgaXMgYWxyZWFkeSBzb3J0ZWRcbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlTZWFyY2g8VD4oaXRlbTogVCwgYXJyYXk6IFRbXSwgY29tcGFyZTogKGE6IFQsIGI6IFQpID0+IDEgfCAtMSB8IDAgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlYXJjaCgwLCBhcnJheS5sZW5ndGggLSAxKTtcblxuICBmdW5jdGlvbiBzZWFyY2gobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG1pbiA+IG1heCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZ3Vlc3MgPSBtaW4gKyBNYXRoLmZsb29yKChtYXggLSBtaW4pIC8gMik7XG4gICAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmUoaXRlbSwgYXJyYXlbZ3Vlc3NdKTtcblxuICAgIGlmIChjb21wYXJpc29uID09PSAwKSB7XG4gICAgICByZXR1cm4gYXJyYXlbZ3Vlc3NdO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBzZWFyY2gobWluLCBndWVzcyAtIDEpO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA9PT0gMSkge1xuICAgICAgcmV0dXJuIHNlYXJjaChndWVzcyArIDEsIG1heCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgbWlzbWF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9IG5vdCBjb21wYXJhYmxlIHRvICR7SlNPTi5zdHJpbmdpZnkoYXJyYXlbZ3Vlc3NdKX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==