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,79 +1,79 @@
1
- // NG2
2
- import { Component, ElementRef, ChangeDetectorRef, HostBinding } from '@angular/core';
3
- // App
4
- import { BasePickerResults } from '../base-picker-results/BasePickerResults';
5
- import { NovoLabelService } from '../../../../services/novo-label-service';
6
- export class SkillsSpecialtyPickerResults extends BasePickerResults {
7
- constructor(element, labels, ref) {
8
- super(element, ref);
9
- this.element = element;
10
- this.labels = labels;
11
- this.active = true;
12
- this.limitedTo = false;
13
- this.limit = 200;
14
- }
15
- getListElement() {
16
- return this.element.nativeElement.querySelector('novo-list');
17
- }
18
- /**
19
- * @name structureArray
20
- * @param collection - the data once getData resolves it
21
- *
22
- * @description This function structures an array of nodes into an array of objects with a
23
- * 'name' field by default.
24
- */
25
- structureArray(collection) {
26
- let data = collection;
27
- if (collection.hasOwnProperty('data')) {
28
- this.limitedTo = collection.limitedTo200;
29
- this.total = collection.total;
30
- data = collection.data;
31
- }
32
- else if (data.length > this.limit) {
33
- this.limitedTo = true;
34
- this.total = data.length;
35
- data = data.slice(0, this.limit);
36
- }
37
- return super.structureArray(data);
38
- }
39
- }
40
- SkillsSpecialtyPickerResults.decorators = [
41
- { type: Component, args: [{
42
- selector: 'skill-specialty-picker-results',
43
- template: `
44
- <section class="picker-loading" *ngIf="isLoading && !matches?.length"><novo-loading theme="line"></novo-loading></section>
45
- <novo-list *ngIf="matches.length > 0" direction="vertical">
46
- <novo-list-item
47
- *ngFor="let match of matches"
48
- (click)="selectMatch($event)"
49
- [class.active]="match === activeMatch"
50
- (mouseenter)="selectActive(match)"
51
- [class.disabled]="preselected(match)"
52
- >
53
- <item-content>
54
- <h6><span [innerHtml]="highlight(match.label, term)"></span></h6>
55
- <div class="category">
56
- <i class="bhi-category-tags"></i
57
- ><span [innerHtml]="highlight(match.data.categories || match.data.parentCategory.name, term)"></span>
58
- </div>
59
- </item-content>
60
- </novo-list-item>
61
- <novo-list-item *ngIf="limitedTo"
62
- ><div>{{ labels.showingXofXResults(limit, total) }}</div></novo-list-item
63
- >
64
- <novo-loading theme="line" *ngIf="isLoading && matches.length > 0"></novo-loading>
65
- </novo-list>
66
- <p class="picker-error" *ngIf="hasError">{{ labels.pickerError }}</p>
67
- <p class="picker-null" *ngIf="!isLoading && !matches.length && !hasError">{{ labels.pickerEmpty }}</p>
68
- `
69
- },] }
70
- ];
71
- SkillsSpecialtyPickerResults.ctorParameters = () => [
72
- { type: ElementRef },
73
- { type: NovoLabelService },
74
- { type: ChangeDetectorRef }
75
- ];
76
- SkillsSpecialtyPickerResults.propDecorators = {
77
- active: [{ type: HostBinding, args: ['class.active',] }]
78
- };
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGxzU3BlY2lhbHR5UGlja2VyUmVzdWx0cy5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJlbGVtZW50cy9waWNrZXIvZXh0cmFzL3NraWxscy1waWNrZXItcmVzdWx0cy9Ta2lsbHNTcGVjaWFsdHlQaWNrZXJSZXN1bHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsTUFBTTtBQUNOLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBK0IzRSxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsaUJBQWlCO0lBT2pFLFlBQW1CLE9BQW1CLEVBQVMsTUFBd0IsRUFBRSxHQUFzQjtRQUM3RixLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBREgsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBTHZFLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFDdkIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixVQUFLLEdBQVcsR0FBRyxDQUFDO0lBS3BCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsQ0FBQyxVQUFlO1FBQzVCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN0QixJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUM5QixJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztTQUN4QjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OztZQS9ERixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGdDQUFnQztnQkFDMUMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJUO2FBQ0Y7OztZQWpDbUIsVUFBVTtZQUdyQixnQkFBZ0I7WUFITyxpQkFBaUI7OztxQkFtQzlDLFdBQVcsU0FBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTkcyXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIEFwcFxyXG5pbXBvcnQgeyBCYXNlUGlja2VyUmVzdWx0cyB9IGZyb20gJy4uL2Jhc2UtcGlja2VyLXJlc3VsdHMvQmFzZVBpY2tlclJlc3VsdHMnO1xyXG5pbXBvcnQgeyBOb3ZvTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvbm92by1sYWJlbC1zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2tpbGwtc3BlY2lhbHR5LXBpY2tlci1yZXN1bHRzJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJwaWNrZXItbG9hZGluZ1wiICpuZ0lmPVwiaXNMb2FkaW5nICYmICFtYXRjaGVzPy5sZW5ndGhcIj48bm92by1sb2FkaW5nIHRoZW1lPVwibGluZVwiPjwvbm92by1sb2FkaW5nPjwvc2VjdGlvbj5cclxuICAgIDxub3ZvLWxpc3QgKm5nSWY9XCJtYXRjaGVzLmxlbmd0aCA+IDBcIiBkaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiPlxyXG4gICAgICA8bm92by1saXN0LWl0ZW1cclxuICAgICAgICAqbmdGb3I9XCJsZXQgbWF0Y2ggb2YgbWF0Y2hlc1wiXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1hdGNoKCRldmVudClcIlxyXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibWF0Y2ggPT09IGFjdGl2ZU1hdGNoXCJcclxuICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RBY3RpdmUobWF0Y2gpXCJcclxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwicHJlc2VsZWN0ZWQobWF0Y2gpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpdGVtLWNvbnRlbnQ+XHJcbiAgICAgICAgICA8aDY+PHNwYW4gW2lubmVySHRtbF09XCJoaWdobGlnaHQobWF0Y2gubGFiZWwsIHRlcm0pXCI+PC9zcGFuPjwvaDY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJiaGktY2F0ZWdvcnktdGFnc1wiPjwvaVxyXG4gICAgICAgICAgICA+PHNwYW4gW2lubmVySHRtbF09XCJoaWdobGlnaHQobWF0Y2guZGF0YS5jYXRlZ29yaWVzIHx8IG1hdGNoLmRhdGEucGFyZW50Q2F0ZWdvcnkubmFtZSwgdGVybSlcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2l0ZW0tY29udGVudD5cclxuICAgICAgPC9ub3ZvLWxpc3QtaXRlbT5cclxuICAgICAgPG5vdm8tbGlzdC1pdGVtICpuZ0lmPVwibGltaXRlZFRvXCJcclxuICAgICAgICA+PGRpdj57eyBsYWJlbHMuc2hvd2luZ1hvZlhSZXN1bHRzKGxpbWl0LCB0b3RhbCkgfX08L2Rpdj48L25vdm8tbGlzdC1pdGVtXHJcbiAgICAgID5cclxuICAgICAgPG5vdm8tbG9hZGluZyB0aGVtZT1cImxpbmVcIiAqbmdJZj1cImlzTG9hZGluZyAmJiBtYXRjaGVzLmxlbmd0aCA+IDBcIj48L25vdm8tbG9hZGluZz5cclxuICAgIDwvbm92by1saXN0PlxyXG4gICAgPHAgY2xhc3M9XCJwaWNrZXItZXJyb3JcIiAqbmdJZj1cImhhc0Vycm9yXCI+e3sgbGFiZWxzLnBpY2tlckVycm9yIH19PC9wPlxyXG4gICAgPHAgY2xhc3M9XCJwaWNrZXItbnVsbFwiICpuZ0lmPVwiIWlzTG9hZGluZyAmJiAhbWF0Y2hlcy5sZW5ndGggJiYgIWhhc0Vycm9yXCI+e3sgbGFiZWxzLnBpY2tlckVtcHR5IH19PC9wPlxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTa2lsbHNTcGVjaWFsdHlQaWNrZXJSZXN1bHRzIGV4dGVuZHMgQmFzZVBpY2tlclJlc3VsdHMge1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWN0aXZlJylcclxuICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGxpbWl0ZWRUbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxpbWl0OiBudW1iZXIgPSAyMDA7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHB1YmxpYyBsYWJlbHM6IE5vdm9MYWJlbFNlcnZpY2UsIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHN1cGVyKGVsZW1lbnQsIHJlZik7XHJcbiAgfVxyXG5cclxuICBnZXRMaXN0RWxlbWVudCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ25vdm8tbGlzdCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQG5hbWUgc3RydWN0dXJlQXJyYXlcclxuICAgKiBAcGFyYW0gY29sbGVjdGlvbiAtIHRoZSBkYXRhIG9uY2UgZ2V0RGF0YSByZXNvbHZlcyBpdFxyXG4gICAqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc3RydWN0dXJlcyBhbiBhcnJheSBvZiBub2RlcyBpbnRvIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhXHJcbiAgICogJ25hbWUnIGZpZWxkIGJ5IGRlZmF1bHQuXHJcbiAgICovXHJcbiAgc3RydWN0dXJlQXJyYXkoY29sbGVjdGlvbjogYW55KTogYW55IHtcclxuICAgIGxldCBkYXRhID0gY29sbGVjdGlvbjtcclxuICAgIGlmIChjb2xsZWN0aW9uLmhhc093blByb3BlcnR5KCdkYXRhJykpIHtcclxuICAgICAgdGhpcy5saW1pdGVkVG8gPSBjb2xsZWN0aW9uLmxpbWl0ZWRUbzIwMDtcclxuICAgICAgdGhpcy50b3RhbCA9IGNvbGxlY3Rpb24udG90YWw7XHJcbiAgICAgIGRhdGEgPSBjb2xsZWN0aW9uLmRhdGE7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5saW1pdCkge1xyXG4gICAgICB0aGlzLmxpbWl0ZWRUbyA9IHRydWU7XHJcbiAgICAgIHRoaXMudG90YWwgPSBkYXRhLmxlbmd0aDtcclxuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMCwgdGhpcy5saW1pdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuc3RydWN0dXJlQXJyYXkoZGF0YSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ // NG2
2
+ import { Component, ElementRef, ChangeDetectorRef, HostBinding } from '@angular/core';
3
+ // App
4
+ import { BasePickerResults } from '../base-picker-results/BasePickerResults';
5
+ import { NovoLabelService } from '../../../../services/novo-label-service';
6
+ export class SkillsSpecialtyPickerResults extends BasePickerResults {
7
+ constructor(element, labels, ref) {
8
+ super(element, ref);
9
+ this.element = element;
10
+ this.labels = labels;
11
+ this.active = true;
12
+ this.limitedTo = false;
13
+ this.limit = 200;
14
+ }
15
+ getListElement() {
16
+ return this.element.nativeElement.querySelector('novo-list');
17
+ }
18
+ /**
19
+ * @name structureArray
20
+ * @param collection - the data once getData resolves it
21
+ *
22
+ * @description This function structures an array of nodes into an array of objects with a
23
+ * 'name' field by default.
24
+ */
25
+ structureArray(collection) {
26
+ let data = collection;
27
+ if (collection.hasOwnProperty('data')) {
28
+ this.limitedTo = collection.limitedTo200;
29
+ this.total = collection.total;
30
+ data = collection.data;
31
+ }
32
+ else if (data.length > this.limit) {
33
+ this.limitedTo = true;
34
+ this.total = data.length;
35
+ data = data.slice(0, this.limit);
36
+ }
37
+ return super.structureArray(data);
38
+ }
39
+ }
40
+ SkillsSpecialtyPickerResults.decorators = [
41
+ { type: Component, args: [{
42
+ selector: 'skill-specialty-picker-results',
43
+ template: `
44
+ <section class="picker-loading" *ngIf="isLoading && !matches?.length"><novo-loading theme="line"></novo-loading></section>
45
+ <novo-list *ngIf="matches.length > 0" direction="vertical">
46
+ <novo-list-item
47
+ *ngFor="let match of matches"
48
+ (click)="selectMatch($event)"
49
+ [class.active]="match === activeMatch"
50
+ (mouseenter)="selectActive(match)"
51
+ [class.disabled]="preselected(match)"
52
+ >
53
+ <item-content>
54
+ <h6><span [innerHtml]="highlight(match.label, term)"></span></h6>
55
+ <div class="category">
56
+ <i class="bhi-category-tags"></i
57
+ ><span [innerHtml]="highlight(match.data.categories || match.data.parentCategory.name, term)"></span>
58
+ </div>
59
+ </item-content>
60
+ </novo-list-item>
61
+ <novo-list-item *ngIf="limitedTo"
62
+ ><div>{{ labels.showingXofXResults(limit, total) }}</div></novo-list-item
63
+ >
64
+ <novo-loading theme="line" *ngIf="isLoading && matches.length > 0"></novo-loading>
65
+ </novo-list>
66
+ <p class="picker-error" *ngIf="hasError">{{ labels.pickerError }}</p>
67
+ <p class="picker-null" *ngIf="!isLoading && !matches.length && !hasError">{{ labels.pickerEmpty }}</p>
68
+ `
69
+ },] }
70
+ ];
71
+ SkillsSpecialtyPickerResults.ctorParameters = () => [
72
+ { type: ElementRef },
73
+ { type: NovoLabelService },
74
+ { type: ChangeDetectorRef }
75
+ ];
76
+ SkillsSpecialtyPickerResults.propDecorators = {
77
+ active: [{ type: HostBinding, args: ['class.active',] }]
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGxzU3BlY2lhbHR5UGlja2VyUmVzdWx0cy5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJlbGVtZW50cy9waWNrZXIvZXh0cmFzL3NraWxscy1waWNrZXItcmVzdWx0cy9Ta2lsbHNTcGVjaWFsdHlQaWNrZXJSZXN1bHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsTUFBTTtBQUNOLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBK0IzRSxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsaUJBQWlCO0lBT2pFLFlBQW1CLE9BQW1CLEVBQVMsTUFBd0IsRUFBRSxHQUFzQjtRQUM3RixLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBREgsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBTHZFLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFDdkIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixVQUFLLEdBQVcsR0FBRyxDQUFDO0lBS3BCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsQ0FBQyxVQUFlO1FBQzVCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN0QixJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUM5QixJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztTQUN4QjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OztZQS9ERixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGdDQUFnQztnQkFDMUMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJUO2FBQ0Y7OztZQWpDbUIsVUFBVTtZQUdyQixnQkFBZ0I7WUFITyxpQkFBaUI7OztxQkFtQzlDLFdBQVcsU0FBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTkcyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmLCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gQXBwXG5pbXBvcnQgeyBCYXNlUGlja2VyUmVzdWx0cyB9IGZyb20gJy4uL2Jhc2UtcGlja2VyLXJlc3VsdHMvQmFzZVBpY2tlclJlc3VsdHMnO1xuaW1wb3J0IHsgTm92b0xhYmVsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL25vdm8tbGFiZWwtc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NraWxsLXNwZWNpYWx0eS1waWNrZXItcmVzdWx0cycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJwaWNrZXItbG9hZGluZ1wiICpuZ0lmPVwiaXNMb2FkaW5nICYmICFtYXRjaGVzPy5sZW5ndGhcIj48bm92by1sb2FkaW5nIHRoZW1lPVwibGluZVwiPjwvbm92by1sb2FkaW5nPjwvc2VjdGlvbj5cbiAgICA8bm92by1saXN0ICpuZ0lmPVwibWF0Y2hlcy5sZW5ndGggPiAwXCIgZGlyZWN0aW9uPVwidmVydGljYWxcIj5cbiAgICAgIDxub3ZvLWxpc3QtaXRlbVxuICAgICAgICAqbmdGb3I9XCJsZXQgbWF0Y2ggb2YgbWF0Y2hlc1wiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RNYXRjaCgkZXZlbnQpXCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJtYXRjaCA9PT0gYWN0aXZlTWF0Y2hcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RBY3RpdmUobWF0Y2gpXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInByZXNlbGVjdGVkKG1hdGNoKVwiXG4gICAgICA+XG4gICAgICAgIDxpdGVtLWNvbnRlbnQ+XG4gICAgICAgICAgPGg2PjxzcGFuIFtpbm5lckh0bWxdPVwiaGlnaGxpZ2h0KG1hdGNoLmxhYmVsLCB0ZXJtKVwiPjwvc3Bhbj48L2g2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJiaGktY2F0ZWdvcnktdGFnc1wiPjwvaVxuICAgICAgICAgICAgPjxzcGFuIFtpbm5lckh0bWxdPVwiaGlnaGxpZ2h0KG1hdGNoLmRhdGEuY2F0ZWdvcmllcyB8fCBtYXRjaC5kYXRhLnBhcmVudENhdGVnb3J5Lm5hbWUsIHRlcm0pXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2l0ZW0tY29udGVudD5cbiAgICAgIDwvbm92by1saXN0LWl0ZW0+XG4gICAgICA8bm92by1saXN0LWl0ZW0gKm5nSWY9XCJsaW1pdGVkVG9cIlxuICAgICAgICA+PGRpdj57eyBsYWJlbHMuc2hvd2luZ1hvZlhSZXN1bHRzKGxpbWl0LCB0b3RhbCkgfX08L2Rpdj48L25vdm8tbGlzdC1pdGVtXG4gICAgICA+XG4gICAgICA8bm92by1sb2FkaW5nIHRoZW1lPVwibGluZVwiICpuZ0lmPVwiaXNMb2FkaW5nICYmIG1hdGNoZXMubGVuZ3RoID4gMFwiPjwvbm92by1sb2FkaW5nPlxuICAgIDwvbm92by1saXN0PlxuICAgIDxwIGNsYXNzPVwicGlja2VyLWVycm9yXCIgKm5nSWY9XCJoYXNFcnJvclwiPnt7IGxhYmVscy5waWNrZXJFcnJvciB9fTwvcD5cbiAgICA8cCBjbGFzcz1cInBpY2tlci1udWxsXCIgKm5nSWY9XCIhaXNMb2FkaW5nICYmICFtYXRjaGVzLmxlbmd0aCAmJiAhaGFzRXJyb3JcIj57eyBsYWJlbHMucGlja2VyRW1wdHkgfX08L3A+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFNraWxsc1NwZWNpYWx0eVBpY2tlclJlc3VsdHMgZXh0ZW5kcyBCYXNlUGlja2VyUmVzdWx0cyB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWN0aXZlJylcbiAgYWN0aXZlOiBib29sZWFuID0gdHJ1ZTtcbiAgbGltaXRlZFRvOiBib29sZWFuID0gZmFsc2U7XG4gIGxpbWl0OiBudW1iZXIgPSAyMDA7XG4gIHRvdGFsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHB1YmxpYyBsYWJlbHM6IE5vdm9MYWJlbFNlcnZpY2UsIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcihlbGVtZW50LCByZWYpO1xuICB9XG5cbiAgZ2V0TGlzdEVsZW1lbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignbm92by1saXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgc3RydWN0dXJlQXJyYXlcbiAgICogQHBhcmFtIGNvbGxlY3Rpb24gLSB0aGUgZGF0YSBvbmNlIGdldERhdGEgcmVzb2x2ZXMgaXRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc3RydWN0dXJlcyBhbiBhcnJheSBvZiBub2RlcyBpbnRvIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhXG4gICAqICduYW1lJyBmaWVsZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgc3RydWN0dXJlQXJyYXkoY29sbGVjdGlvbjogYW55KTogYW55IHtcbiAgICBsZXQgZGF0YSA9IGNvbGxlY3Rpb247XG4gICAgaWYgKGNvbGxlY3Rpb24uaGFzT3duUHJvcGVydHkoJ2RhdGEnKSkge1xuICAgICAgdGhpcy5saW1pdGVkVG8gPSBjb2xsZWN0aW9uLmxpbWl0ZWRUbzIwMDtcbiAgICAgIHRoaXMudG90YWwgPSBjb2xsZWN0aW9uLnRvdGFsO1xuICAgICAgZGF0YSA9IGNvbGxlY3Rpb24uZGF0YTtcbiAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5saW1pdCkge1xuICAgICAgdGhpcy5saW1pdGVkVG8gPSB0cnVlO1xuICAgICAgdGhpcy50b3RhbCA9IGRhdGEubGVuZ3RoO1xuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMCwgdGhpcy5saW1pdCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zdHJ1Y3R1cmVBcnJheShkYXRhKTtcbiAgfVxufVxuIl19
@@ -1,79 +1,79 @@
1
- // NG2
2
- import { Component, ElementRef, ChangeDetectorRef, HostBinding } from '@angular/core';
3
- import { DomSanitizer } from '@angular/platform-browser';
4
- // Vendor
5
- import { BasePickerResults } from '../base-picker-results/BasePickerResults';
6
- import { NovoLabelService } from '../../../../services/novo-label-service';
7
- export class WorkersCompCodesPickerResults extends BasePickerResults {
8
- constructor(element, sanitizer, labels, ref) {
9
- super(element, ref);
10
- this.sanitizer = sanitizer;
11
- this.labels = labels;
12
- this.active = true;
13
- this.sanitizer = sanitizer;
14
- }
15
- get isHidden() {
16
- return this.matches.length === 0;
17
- }
18
- getListElement() {
19
- return this.element.nativeElement.querySelector('novo-list');
20
- }
21
- sanitizeHTML(compCode, name) {
22
- return this.sanitizer.bypassSecurityTrustHtml(`${compCode} | ${name}`);
23
- }
24
- }
25
- WorkersCompCodesPickerResults.decorators = [
26
- { type: Component, args: [{
27
- selector: 'workers-comp-codes-picker-results',
28
- template: `
29
- <section class="picker-loading" *ngIf="isLoading && !matches?.length">
30
- <novo-loading theme="line"></novo-loading>
31
- </section>
32
- <novo-list direction="vertical" *ngIf="matches?.length > 0 && !hasError">
33
- <novo-list-item
34
- *ngFor="let match of matches"
35
- (click)="selectMatch($event)"
36
- [class.active]="match === activeMatch"
37
- (mouseenter)="selectActive(match)"
38
- [class.disabled]="preselected(match)"
39
- >
40
- <item-header>
41
- <item-title>
42
- <span [innerHtml]="sanitizeHTML(match?.data?.compensation?.code, match?.data?.compensation?.name)"></span>
43
- </item-title>
44
- </item-header>
45
- <item-content direction="horizontal">
46
- <p>
47
- <span class="label">{{ labels.state }}: </span><span>{{ match?.data?.compensation?.state }}</span>
48
- </p>
49
- <p>
50
- <span class="label">{{ labels.rate }}: </span><span>{{ labels.formatCurrency(match?.data?.rate) }}</span>
51
- </p>
52
- </item-content>
53
- <item-content direction="horizontal">
54
- <p>
55
- <span class="label">{{ labels.startDate }}: </span
56
- ><span>{{ labels.formatDateWithFormat(match?.data?.startDate, { year: 'numeric', month: 'numeric', day: 'numeric' }) }}</span>
57
- </p>
58
- <p>
59
- <span class="label">{{ labels.endDate }}: </span
60
- ><span>{{ labels.formatDateWithFormat(match?.data?.endDate, { year: 'numeric', month: 'numeric', day: 'numeric' }) }}</span>
61
- </p>
62
- </item-content>
63
- </novo-list-item>
64
- <novo-loading theme="line" *ngIf="isLoading && matches?.length > 0"></novo-loading>
65
- </novo-list>
66
- `
67
- },] }
68
- ];
69
- WorkersCompCodesPickerResults.ctorParameters = () => [
70
- { type: ElementRef },
71
- { type: DomSanitizer },
72
- { type: NovoLabelService },
73
- { type: ChangeDetectorRef }
74
- ];
75
- WorkersCompCodesPickerResults.propDecorators = {
76
- active: [{ type: HostBinding, args: ['class.active',] }],
77
- isHidden: [{ type: HostBinding, args: ['hidden',] }]
78
- };
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Vyc0NvbXBDb2Rlc1BpY2tlclJlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvY2hhcmxlcy5iYXJuZXMvRG9jdW1lbnRzL2Rldi9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsiZWxlbWVudHMvcGlja2VyL2V4dHJhcy93b3JrZXJzLWNvbXAtY29kZXMtcGlja2VyLXJlc3VsdHMvV29ya2Vyc0NvbXBDb2Rlc1BpY2tlclJlc3VsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsU0FBUztBQUNULE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBNEMzRSxNQUFNLE9BQU8sNkJBQThCLFNBQVEsaUJBQWlCO0lBUWxFLFlBQVksT0FBbUIsRUFBVSxTQUF1QixFQUFTLE1BQXdCLEVBQUUsR0FBc0I7UUFDdkgsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQURtQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFOakcsV0FBTSxHQUFZLElBQUksQ0FBQztRQVFyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBUkQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQU9ELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsR0FBRyxRQUFRLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7WUE3REYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ1Q7YUFDRjs7O1lBL0NtQixVQUFVO1lBQ3JCLFlBQVk7WUFHWixnQkFBZ0I7WUFKTyxpQkFBaUI7OztxQkFpRDlDLFdBQVcsU0FBQyxjQUFjO3VCQUUxQixXQUFXLFNBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmLCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuLy8gVmVuZG9yXHJcbmltcG9ydCB7IEJhc2VQaWNrZXJSZXN1bHRzIH0gZnJvbSAnLi4vYmFzZS1waWNrZXItcmVzdWx0cy9CYXNlUGlja2VyUmVzdWx0cyc7XHJcbmltcG9ydCB7IE5vdm9MYWJlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9ub3ZvLWxhYmVsLXNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd3b3JrZXJzLWNvbXAtY29kZXMtcGlja2VyLXJlc3VsdHMnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cInBpY2tlci1sb2FkaW5nXCIgKm5nSWY9XCJpc0xvYWRpbmcgJiYgIW1hdGNoZXM/Lmxlbmd0aFwiPlxyXG4gICAgICA8bm92by1sb2FkaW5nIHRoZW1lPVwibGluZVwiPjwvbm92by1sb2FkaW5nPlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gICAgPG5vdm8tbGlzdCBkaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiICpuZ0lmPVwibWF0Y2hlcz8ubGVuZ3RoID4gMCAmJiAhaGFzRXJyb3JcIj5cclxuICAgICAgPG5vdm8tbGlzdC1pdGVtXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG1hdGNoIG9mIG1hdGNoZXNcIlxyXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RNYXRjaCgkZXZlbnQpXCJcclxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIm1hdGNoID09PSBhY3RpdmVNYXRjaFwiXHJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0QWN0aXZlKG1hdGNoKVwiXHJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInByZXNlbGVjdGVkKG1hdGNoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aXRlbS1oZWFkZXI+XHJcbiAgICAgICAgICA8aXRlbS10aXRsZT5cclxuICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJzYW5pdGl6ZUhUTUwobWF0Y2g/LmRhdGE/LmNvbXBlbnNhdGlvbj8uY29kZSwgbWF0Y2g/LmRhdGE/LmNvbXBlbnNhdGlvbj8ubmFtZSlcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2l0ZW0tdGl0bGU+XHJcbiAgICAgICAgPC9pdGVtLWhlYWRlcj5cclxuICAgICAgICA8aXRlbS1jb250ZW50IGRpcmVjdGlvbj1cImhvcml6b250YWxcIj5cclxuICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgbGFiZWxzLnN0YXRlIH19OiA8L3NwYW4+PHNwYW4+e3sgbWF0Y2g/LmRhdGE/LmNvbXBlbnNhdGlvbj8uc3RhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IGxhYmVscy5yYXRlIH19OiA8L3NwYW4+PHNwYW4+e3sgbGFiZWxzLmZvcm1hdEN1cnJlbmN5KG1hdGNoPy5kYXRhPy5yYXRlKSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2l0ZW0tY29udGVudD5cclxuICAgICAgICA8aXRlbS1jb250ZW50IGRpcmVjdGlvbj1cImhvcml6b250YWxcIj5cclxuICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgbGFiZWxzLnN0YXJ0RGF0ZSB9fTogPC9zcGFuXHJcbiAgICAgICAgICAgID48c3Bhbj57eyBsYWJlbHMuZm9ybWF0RGF0ZVdpdGhGb3JtYXQobWF0Y2g/LmRhdGE/LnN0YXJ0RGF0ZSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnIH0pIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBsYWJlbHMuZW5kRGF0ZSB9fTogPC9zcGFuXHJcbiAgICAgICAgICAgID48c3Bhbj57eyBsYWJlbHMuZm9ybWF0RGF0ZVdpdGhGb3JtYXQobWF0Y2g/LmRhdGE/LmVuZERhdGUsIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ251bWVyaWMnLCBkYXk6ICdudW1lcmljJyB9KSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2l0ZW0tY29udGVudD5cclxuICAgICAgPC9ub3ZvLWxpc3QtaXRlbT5cclxuICAgICAgPG5vdm8tbG9hZGluZyB0aGVtZT1cImxpbmVcIiAqbmdJZj1cImlzTG9hZGluZyAmJiBtYXRjaGVzPy5sZW5ndGggPiAwXCI+PC9ub3ZvLWxvYWRpbmc+XHJcbiAgICA8L25vdm8tbGlzdD5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgV29ya2Vyc0NvbXBDb2Rlc1BpY2tlclJlc3VsdHMgZXh0ZW5kcyBCYXNlUGlja2VyUmVzdWx0cyB7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hY3RpdmUnKVxyXG4gIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQEhvc3RCaW5kaW5nKCdoaWRkZW4nKVxyXG4gIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1hdGNoZXMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgcHVibGljIGxhYmVsczogTm92b0xhYmVsU2VydmljZSwgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgc3VwZXIoZWxlbWVudCwgcmVmKTtcclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdEVsZW1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignbm92by1saXN0Jyk7XHJcbiAgfVxyXG5cclxuICBzYW5pdGl6ZUhUTUwoY29tcENvZGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoYCR7Y29tcENvZGV9IHwgJHtuYW1lfWApO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ // NG2
2
+ import { Component, ElementRef, ChangeDetectorRef, HostBinding } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ // Vendor
5
+ import { BasePickerResults } from '../base-picker-results/BasePickerResults';
6
+ import { NovoLabelService } from '../../../../services/novo-label-service';
7
+ export class WorkersCompCodesPickerResults extends BasePickerResults {
8
+ constructor(element, sanitizer, labels, ref) {
9
+ super(element, ref);
10
+ this.sanitizer = sanitizer;
11
+ this.labels = labels;
12
+ this.active = true;
13
+ this.sanitizer = sanitizer;
14
+ }
15
+ get isHidden() {
16
+ return this.matches.length === 0;
17
+ }
18
+ getListElement() {
19
+ return this.element.nativeElement.querySelector('novo-list');
20
+ }
21
+ sanitizeHTML(compCode, name) {
22
+ return this.sanitizer.bypassSecurityTrustHtml(`${compCode} | ${name}`);
23
+ }
24
+ }
25
+ WorkersCompCodesPickerResults.decorators = [
26
+ { type: Component, args: [{
27
+ selector: 'workers-comp-codes-picker-results',
28
+ template: `
29
+ <section class="picker-loading" *ngIf="isLoading && !matches?.length">
30
+ <novo-loading theme="line"></novo-loading>
31
+ </section>
32
+ <novo-list direction="vertical" *ngIf="matches?.length > 0 && !hasError">
33
+ <novo-list-item
34
+ *ngFor="let match of matches"
35
+ (click)="selectMatch($event)"
36
+ [class.active]="match === activeMatch"
37
+ (mouseenter)="selectActive(match)"
38
+ [class.disabled]="preselected(match)"
39
+ >
40
+ <item-header>
41
+ <item-title>
42
+ <span [innerHtml]="sanitizeHTML(match?.data?.compensation?.code, match?.data?.compensation?.name)"></span>
43
+ </item-title>
44
+ </item-header>
45
+ <item-content direction="horizontal">
46
+ <p>
47
+ <span class="label">{{ labels.state }}: </span><span>{{ match?.data?.compensation?.state }}</span>
48
+ </p>
49
+ <p>
50
+ <span class="label">{{ labels.rate }}: </span><span>{{ labels.formatCurrency(match?.data?.rate) }}</span>
51
+ </p>
52
+ </item-content>
53
+ <item-content direction="horizontal">
54
+ <p>
55
+ <span class="label">{{ labels.startDate }}: </span
56
+ ><span>{{ labels.formatDateWithFormat(match?.data?.startDate, { year: 'numeric', month: 'numeric', day: 'numeric' }) }}</span>
57
+ </p>
58
+ <p>
59
+ <span class="label">{{ labels.endDate }}: </span
60
+ ><span>{{ labels.formatDateWithFormat(match?.data?.endDate, { year: 'numeric', month: 'numeric', day: 'numeric' }) }}</span>
61
+ </p>
62
+ </item-content>
63
+ </novo-list-item>
64
+ <novo-loading theme="line" *ngIf="isLoading && matches?.length > 0"></novo-loading>
65
+ </novo-list>
66
+ `
67
+ },] }
68
+ ];
69
+ WorkersCompCodesPickerResults.ctorParameters = () => [
70
+ { type: ElementRef },
71
+ { type: DomSanitizer },
72
+ { type: NovoLabelService },
73
+ { type: ChangeDetectorRef }
74
+ ];
75
+ WorkersCompCodesPickerResults.propDecorators = {
76
+ active: [{ type: HostBinding, args: ['class.active',] }],
77
+ isHidden: [{ type: HostBinding, args: ['hidden',] }]
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Vyc0NvbXBDb2Rlc1BpY2tlclJlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbm92by1lbGVtZW50cy9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsiZWxlbWVudHMvcGlja2VyL2V4dHJhcy93b3JrZXJzLWNvbXAtY29kZXMtcGlja2VyLXJlc3VsdHMvV29ya2Vyc0NvbXBDb2Rlc1BpY2tlclJlc3VsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTTtBQUNOLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsU0FBUztBQUNULE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBNEMzRSxNQUFNLE9BQU8sNkJBQThCLFNBQVEsaUJBQWlCO0lBUWxFLFlBQVksT0FBbUIsRUFBVSxTQUF1QixFQUFTLE1BQXdCLEVBQUUsR0FBc0I7UUFDdkgsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQURtQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFOakcsV0FBTSxHQUFZLElBQUksQ0FBQztRQVFyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBUkQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQU9ELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsR0FBRyxRQUFRLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7WUE3REYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ1Q7YUFDRjs7O1lBL0NtQixVQUFVO1lBQ3JCLFlBQVk7WUFHWixnQkFBZ0I7WUFKTyxpQkFBaUI7OztxQkFpRDlDLFdBQVcsU0FBQyxjQUFjO3VCQUUxQixXQUFXLFNBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuLy8gVmVuZG9yXG5pbXBvcnQgeyBCYXNlUGlja2VyUmVzdWx0cyB9IGZyb20gJy4uL2Jhc2UtcGlja2VyLXJlc3VsdHMvQmFzZVBpY2tlclJlc3VsdHMnO1xuaW1wb3J0IHsgTm92b0xhYmVsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL25vdm8tbGFiZWwtc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dvcmtlcnMtY29tcC1jb2Rlcy1waWNrZXItcmVzdWx0cycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJwaWNrZXItbG9hZGluZ1wiICpuZ0lmPVwiaXNMb2FkaW5nICYmICFtYXRjaGVzPy5sZW5ndGhcIj5cbiAgICAgIDxub3ZvLWxvYWRpbmcgdGhlbWU9XCJsaW5lXCI+PC9ub3ZvLWxvYWRpbmc+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxub3ZvLWxpc3QgZGlyZWN0aW9uPVwidmVydGljYWxcIiAqbmdJZj1cIm1hdGNoZXM/Lmxlbmd0aCA+IDAgJiYgIWhhc0Vycm9yXCI+XG4gICAgICA8bm92by1saXN0LWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IG1hdGNoIG9mIG1hdGNoZXNcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0TWF0Y2goJGV2ZW50KVwiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibWF0Y2ggPT09IGFjdGl2ZU1hdGNoXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0QWN0aXZlKG1hdGNoKVwiXG4gICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJwcmVzZWxlY3RlZChtYXRjaClcIlxuICAgICAgPlxuICAgICAgICA8aXRlbS1oZWFkZXI+XG4gICAgICAgICAgPGl0ZW0tdGl0bGU+XG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cInNhbml0aXplSFRNTChtYXRjaD8uZGF0YT8uY29tcGVuc2F0aW9uPy5jb2RlLCBtYXRjaD8uZGF0YT8uY29tcGVuc2F0aW9uPy5uYW1lKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2l0ZW0tdGl0bGU+XG4gICAgICAgIDwvaXRlbS1oZWFkZXI+XG4gICAgICAgIDxpdGVtLWNvbnRlbnQgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IGxhYmVscy5zdGF0ZSB9fTogPC9zcGFuPjxzcGFuPnt7IG1hdGNoPy5kYXRhPy5jb21wZW5zYXRpb24/LnN0YXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyBsYWJlbHMucmF0ZSB9fTogPC9zcGFuPjxzcGFuPnt7IGxhYmVscy5mb3JtYXRDdXJyZW5jeShtYXRjaD8uZGF0YT8ucmF0ZSkgfX08L3NwYW4+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2l0ZW0tY29udGVudD5cbiAgICAgICAgPGl0ZW0tY29udGVudCBkaXJlY3Rpb249XCJob3Jpem9udGFsXCI+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgbGFiZWxzLnN0YXJ0RGF0ZSB9fTogPC9zcGFuXG4gICAgICAgICAgICA+PHNwYW4+e3sgbGFiZWxzLmZvcm1hdERhdGVXaXRoRm9ybWF0KG1hdGNoPy5kYXRhPy5zdGFydERhdGUsIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ251bWVyaWMnLCBkYXk6ICdudW1lcmljJyB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgbGFiZWxzLmVuZERhdGUgfX06IDwvc3BhblxuICAgICAgICAgICAgPjxzcGFuPnt7IGxhYmVscy5mb3JtYXREYXRlV2l0aEZvcm1hdChtYXRjaD8uZGF0YT8uZW5kRGF0ZSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnIH0pIH19PC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9pdGVtLWNvbnRlbnQ+XG4gICAgICA8L25vdm8tbGlzdC1pdGVtPlxuICAgICAgPG5vdm8tbG9hZGluZyB0aGVtZT1cImxpbmVcIiAqbmdJZj1cImlzTG9hZGluZyAmJiBtYXRjaGVzPy5sZW5ndGggPiAwXCI+PC9ub3ZvLWxvYWRpbmc+XG4gICAgPC9ub3ZvLWxpc3Q+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtlcnNDb21wQ29kZXNQaWNrZXJSZXN1bHRzIGV4dGVuZHMgQmFzZVBpY2tlclJlc3VsdHMge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFjdGl2ZScpXG4gIGFjdGl2ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnaGlkZGVuJylcbiAgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgcHVibGljIGxhYmVsczogTm92b0xhYmVsU2VydmljZSwgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKGVsZW1lbnQsIHJlZik7XG4gICAgdGhpcy5zYW5pdGl6ZXIgPSBzYW5pdGl6ZXI7XG4gIH1cblxuICBnZXRMaXN0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignbm92by1saXN0Jyk7XG4gIH1cblxuICBzYW5pdGl6ZUhUTUwoY29tcENvZGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGAke2NvbXBDb2RlfSB8ICR7bmFtZX1gKTtcbiAgfVxufVxuIl19
@@ -1,369 +1,369 @@
1
- // NG2
2
- import { isPlatformBrowser } from '@angular/common';
3
- import { Component, ElementRef, EventEmitter, Inject, Input, Output, PLATFORM_ID } from '@angular/core';
4
- import { GlobalRef } from '../../services/global/global.service';
5
- import { GooglePlacesService } from './places.service';
6
- export class PlacesListComponent {
7
- constructor(platformId, _elmRef, _global, _googlePlacesService) {
8
- this.platformId = platformId;
9
- this._elmRef = _elmRef;
10
- this._global = _global;
11
- this._googlePlacesService = _googlePlacesService;
12
- this.term = '';
13
- this.termChange = new EventEmitter();
14
- this.select = new EventEmitter();
15
- this.locationInput = '';
16
- this.gettingCurrentLocationFlag = false;
17
- this.dropdownOpen = false;
18
- this.recentDropdownOpen = false;
19
- this.queryItems = [];
20
- this.isSettingsError = false;
21
- this.settingsErrorMsg = '';
22
- this.settings = {};
23
- this.moduleinit = false;
24
- this.selectedDataIndex = -1;
25
- this.recentSearchData = [];
26
- this.userSelectedOption = '';
27
- this.defaultSettings = {
28
- geoPredictionServerUrl: '',
29
- geoLatLangServiceUrl: '',
30
- geoLocDetailServerUrl: '',
31
- geoCountryRestriction: [],
32
- geoTypes: [],
33
- geoLocation: [],
34
- geoRadius: 0,
35
- serverResponseListHierarchy: [],
36
- serverResponseatLangHierarchy: [],
37
- serverResponseDetailHierarchy: [],
38
- resOnSearchButtonClickOnly: false,
39
- useGoogleGeoApi: true,
40
- inputPlaceholderText: 'Enter Area Name',
41
- inputString: '',
42
- showSearchButton: true,
43
- showRecentSearch: true,
44
- showCurrentLocation: true,
45
- recentStorageName: 'recentSearches',
46
- noOfRecentSearchSave: 5,
47
- currentLocIconUrl: '',
48
- searchIconUrl: '',
49
- locationIconUrl: '',
50
- };
51
- }
52
- ngOnInit() {
53
- if (!this.moduleinit) {
54
- this.moduleInit();
55
- }
56
- }
57
- ngOnChanges() {
58
- this.moduleinit = true;
59
- this.moduleInit();
60
- this.searchinputCallback(null);
61
- }
62
- // function called when click event happens in input box. (Binded with view)
63
- searchinputClickCallback(event) {
64
- event.target.select();
65
- this.searchinputCallback(event);
66
- }
67
- // function called when there is a change in input. (Binded with view)
68
- searchinputCallback(event) {
69
- const inputVal = this.locationInput;
70
- if (inputVal) {
71
- this.getListQuery(inputVal);
72
- }
73
- else {
74
- this.queryItems = [];
75
- if (this.userSelectedOption) {
76
- this.userQuerySubmit('false');
77
- }
78
- this.userSelectedOption = '';
79
- if (this.settings.showRecentSearch) {
80
- this.showRecentSearch();
81
- }
82
- else {
83
- this.dropdownOpen = false;
84
- }
85
- }
86
- }
87
- // function to execute when user hover over autocomplete list.(binded with view)
88
- activeListNode(index) {
89
- for (let i = 0; i < this.queryItems.length; i++) {
90
- if (index === i) {
91
- this.queryItems[i].active = true;
92
- this.selectedDataIndex = index;
93
- }
94
- else {
95
- this.queryItems[i].active = false;
96
- }
97
- }
98
- }
99
- // function to execute when user select the autocomplete list.(binded with view)
100
- selectedListNode(event, index) {
101
- this.dropdownOpen = false;
102
- if (this.recentDropdownOpen) {
103
- this.setRecentLocation(this.queryItems[index]);
104
- }
105
- else {
106
- this.getPlaceLocationInfo(this.queryItems[index]);
107
- }
108
- }
109
- // function to close the autocomplete list when clicked outside. (binded with view)
110
- closeAutocomplete(event) {
111
- if (!this._elmRef.nativeElement.contains(event.target)) {
112
- this.selectedDataIndex = -1;
113
- this.dropdownOpen = false;
114
- }
115
- }
116
- // function to manually trigger the callback to parent component when clicked search button.
117
- userQuerySubmit(selectedOption) {
118
- const _userOption = selectedOption === 'false' ? '' : this.userSelectedOption;
119
- if (_userOption) {
120
- this.select.emit(this.userSelectedOption);
121
- }
122
- else {
123
- // this.select.emit(false);
124
- }
125
- }
126
- // function to get user current location from the device.
127
- currentLocationSelected() {
128
- if (isPlatformBrowser(this.platformId)) {
129
- this.gettingCurrentLocationFlag = true;
130
- this.dropdownOpen = false;
131
- this._googlePlacesService.getGeoCurrentLocation().then((result) => {
132
- if (!result) {
133
- this.gettingCurrentLocationFlag = false;
134
- }
135
- else {
136
- this.getCurrentLocationInfo(result);
137
- }
138
- });
139
- }
140
- }
141
- // module initialization happens. function called by ngOninit and ngOnChange
142
- moduleInit() {
143
- this.settings = this.setUserSettings();
144
- // condition to check if Radius is set without location detail.
145
- if (this.settings.geoRadius) {
146
- if (this.settings.geoLocation.length !== 2) {
147
- this.isSettingsError = true;
148
- this.settingsErrorMsg =
149
- this.settingsErrorMsg + 'Radius should be used with GeoLocation. Please use "geoLocation" key to set lat and lng. ';
150
- }
151
- }
152
- // condition to check if lat and lng is set and radious is not set then it will set to 20,000KM by default
153
- if (this.settings.geoLocation.length === 2 && !this.settings.geoRadius) {
154
- this.settings.geoRadius = 20000000;
155
- }
156
- if (this.settings.showRecentSearch) {
157
- this.getRecentLocations();
158
- }
159
- if (!this.settings.useGoogleGeoApi) {
160
- if (!this.settings.geoPredictionServerUrl) {
161
- this.isSettingsError = true;
162
- this.settingsErrorMsg =
163
- this.settingsErrorMsg + 'Prediction custom server url is not defined. Please use "geoPredictionServerUrl" key to set. ';
164
- }
165
- if (!this.settings.geoLatLangServiceUrl) {
166
- this.isSettingsError = true;
167
- this.settingsErrorMsg =
168
- this.settingsErrorMsg + 'Latitude and longitude custom server url is not defined. Please use "geoLatLangServiceUrl" key to set. ';
169
- }
170
- if (!this.settings.geoLocDetailServerUrl) {
171
- this.isSettingsError = true;
172
- this.settingsErrorMsg =
173
- this.settingsErrorMsg + 'Location detail custom server url is not defined. Please use "geoLocDetailServerUrl" key to set. ';
174
- }
175
- }
176
- this.locationInput = this.term;
177
- }
178
- // function to process the search query when pressed enter.
179
- processSearchQuery() {
180
- if (this.queryItems.length) {
181
- if (this.selectedDataIndex > -1) {
182
- this.selectedListNode(null, this.selectedDataIndex);
183
- }
184
- else {
185
- this.selectedListNode(null, 0);
186
- }
187
- }
188
- }
189
- // function to set user settings if it is available.
190
- setUserSettings() {
191
- const _tempObj = {};
192
- if (this.userSettings && typeof this.userSettings === 'object') {
193
- const keys = Object.keys(this.defaultSettings);
194
- for (const value of keys) {
195
- _tempObj[value] = this.userSettings[value] !== undefined ? this.userSettings[value] : this.defaultSettings[value];
196
- }
197
- return _tempObj;
198
- }
199
- else {
200
- return this.defaultSettings;
201
- }
202
- }
203
- // function to get the autocomplete list based on user input.
204
- getListQuery(value) {
205
- this.recentDropdownOpen = false;
206
- if (this.settings.useGoogleGeoApi) {
207
- const _tempParams = {
208
- query: value,
209
- countryRestriction: this.settings.geoCountryRestriction,
210
- geoTypes: this.settings.geoTypes,
211
- };
212
- if (this.settings.geoLocation.length === 2) {
213
- _tempParams.geoLocation = this.settings.geoLocation;
214
- _tempParams.radius = this.settings.geoRadius;
215
- }
216
- this._googlePlacesService.getGeoPrediction(_tempParams).then((result) => {
217
- this.updateListItem(result);
218
- });
219
- }
220
- else {
221
- this._googlePlacesService.getPredictions(this.settings.geoPredictionServerUrl, value).then((result) => {
222
- result = this.extractServerList(this.settings.serverResponseListHierarchy, result);
223
- this.updateListItem(result);
224
- });
225
- }
226
- }
227
- // function to extratc custom data which is send by the server.
228
- extractServerList(arrayList, data) {
229
- if (arrayList.length) {
230
- let _tempData = data;
231
- for (const key of arrayList) {
232
- _tempData = _tempData[key];
233
- }
234
- return _tempData;
235
- }
236
- else {
237
- return data;
238
- }
239
- }
240
- // function to update the predicted list.
241
- updateListItem(listData) {
242
- this.queryItems = listData ? listData : [];
243
- this.dropdownOpen = true;
244
- }
245
- // function to show the recent search result.
246
- showRecentSearch() {
247
- this.recentDropdownOpen = true;
248
- this.dropdownOpen = true;
249
- this._googlePlacesService.getRecentList(this.settings.recentStorageName).then((result) => {
250
- if (result) {
251
- this.queryItems = result;
252
- }
253
- else {
254
- this.queryItems = [];
255
- }
256
- });
257
- }
258
- // //function to navigate through list when up and down keyboard key is pressed;
259
- // private navigateInList(keyCode: number): any {
260
- // let arrayIndex: number = 0;
261
- // //arrow down
262
- // if (keyCode === 40) {
263
- // if (this.selectedDataIndex >= 0) {
264
- // arrayIndex = ((this.selectedDataIndex + 1) <= (this.queryItems.length - 1)) ? (this.selectedDataIndex + 1) : 0;
265
- // }
266
- // this.activeListNode(arrayIndex);
267
- // } else if (keyCode === 38) {//arrow up
268
- // if (this.selectedDataIndex >= 0) {
269
- // arrayIndex = ((this.selectedDataIndex - 1) >= 0) ? (this.selectedDataIndex - 1) : (this.queryItems.length - 1);
270
- // } else {
271
- // arrayIndex = this.queryItems.length - 1;
272
- // }
273
- // this.activeListNode(arrayIndex);
274
- // } else {
275
- // this.processSearchQuery();
276
- // }
277
- // }
278
- // function to execute to get location detail based on latitude and longitude.
279
- getCurrentLocationInfo(latlng) {
280
- if (this.settings.useGoogleGeoApi) {
281
- this._googlePlacesService.getGeoLatLngDetail(latlng).then((result) => {
282
- if (result) {
283
- this.setRecentLocation(result);
284
- }
285
- this.gettingCurrentLocationFlag = false;
286
- });
287
- }
288
- else {
289
- this._googlePlacesService.getLatLngDetail(this.settings.geoLatLangServiceUrl, latlng.lat, latlng.lng).then((result) => {
290
- if (result) {
291
- result = this.extractServerList(this.settings.serverResponseatLangHierarchy, result);
292
- this.setRecentLocation(result);
293
- }
294
- this.gettingCurrentLocationFlag = false;
295
- });
296
- }
297
- }
298
- // function to retrive the location info based on goovle place id.
299
- getPlaceLocationInfo(selectedData) {
300
- if (this.settings.useGoogleGeoApi) {
301
- this._googlePlacesService.getGeoPlaceDetail(selectedData.place_id).then((data) => {
302
- if (data) {
303
- this.setRecentLocation(data);
304
- }
305
- });
306
- }
307
- else {
308
- this._googlePlacesService.getPlaceDetails(this.settings.geoLocDetailServerUrl, selectedData.place_id).then((result) => {
309
- if (result) {
310
- result = this.extractServerList(this.settings.serverResponseDetailHierarchy, result);
311
- this.setRecentLocation(result);
312
- }
313
- });
314
- }
315
- }
316
- // function to store the selected user search in the localstorage.
317
- setRecentLocation(data) {
318
- data = JSON.parse(JSON.stringify(data));
319
- data.description = data.description ? data.description : data.formatted_address;
320
- data.active = false;
321
- this.selectedDataIndex = -1;
322
- this.locationInput = data.description;
323
- if (this.settings.showRecentSearch) {
324
- this._googlePlacesService.addRecentList(this.settings.recentStorageName, data, this.settings.noOfRecentSearchSave);
325
- this.getRecentLocations();
326
- }
327
- this.userSelectedOption = data;
328
- // below code will execute only when user press enter or select any option selection and it emit a callback to the parent component.
329
- if (!this.settings.resOnSearchButtonClickOnly) {
330
- this.select.emit(data);
331
- this.termChange.emit(data);
332
- }
333
- }
334
- // function to retrive the stored recent user search from the localstorage.
335
- getRecentLocations() {
336
- this._googlePlacesService.getRecentList(this.settings.recentStorageName).then((data) => {
337
- this.recentSearchData = data && data.length ? data : [];
338
- });
339
- }
340
- }
341
- PlacesListComponent.decorators = [
342
- { type: Component, args: [{
343
- selector: 'google-places-list',
344
- template: `
345
- <novo-list direction="vertical">
346
- <novo-list-item *ngFor="let data of queryItems;let $index = index" (click)="selectedListNode($event, $index)">
347
- <item-header>
348
- <item-avatar icon="location"></item-avatar>
349
- <item-title>{{data.structured_formatting?.main_text ? data.structured_formatting.main_text : data.description}}</item-title>
350
- </item-header>
351
- <item-content>{{data.structured_formatting?.secondary_text}}</item-content>
352
- </novo-list-item>
353
- </novo-list>
354
- `
355
- },] }
356
- ];
357
- PlacesListComponent.ctorParameters = () => [
358
- { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
359
- { type: ElementRef },
360
- { type: GlobalRef },
361
- { type: GooglePlacesService }
362
- ];
363
- PlacesListComponent.propDecorators = {
364
- userSettings: [{ type: Input }],
365
- term: [{ type: Input }],
366
- termChange: [{ type: Output }],
367
- select: [{ type: Output }]
368
- };
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJlbGVtZW50cy9wbGFjZXMvcGxhY2VzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUN2RCxNQUFNLE9BQU8sbUJBQW1CO0lBK0M5QixZQUMrQixVQUFrQixFQUN2QyxPQUFtQixFQUNuQixPQUFrQixFQUNsQixvQkFBeUM7UUFIcEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQS9DbkQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFeEQsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTdDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUNyQixvQkFBZSxHQUFZLEtB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LFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7O0tBVVA7YUFDSjs7O1lBaUQ0QyxNQUFNLHVCQUE5QyxNQUFNLFNBQUMsV0FBVztZQTNGSCxVQUFVO1lBQ3JCLFNBQVM7WUFDVCxtQkFBbUI7OzsyQkEwQ3pCLEtBQUs7bUJBRUwsS0FBSzt5QkFFTCxNQUFNO3FCQUVOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR2xvYmFsUmVmIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2xvYmFsL2dsb2JhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR29vZ2xlUGxhY2VzU2VydmljZSB9IGZyb20gJy4vcGxhY2VzLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XHJcbiAgZ2VvUHJlZGljdGlvblNlcnZlclVybD86IHN0cmluZztcclxuICBnZW9MYXRMYW5nU2VydmljZVVybD86IHN0cmluZztcclxuICBnZW9Mb2NEZXRhaWxTZXJ2ZXJVcmw/OiBzdHJpbmc7XHJcbiAgZ2VvQ291bnRyeVJlc3RyaWN0aW9uPzogYW55O1xyXG4gIGdlb1R5cGVzPzogYW55O1xyXG4gIGdlb0xvY2F0aW9uPzogYW55O1xyXG4gIGdlb1JhZGl1cz86IG51bWJlcjtcclxuICBzZXJ2ZXJSZXNwb25zZUxpc3RIaWVyYXJjaHk/OiBhbnk7XHJcbiAgc2VydmVyUmVzcG9uc2VhdExhbmdIaWVyYXJjaHk/OiBhbnk7XHJcbiAgc2VydmVyUmVzcG9uc2VEZXRhaWxIaWVyYXJjaHk/OiBhbnk7XHJcbiAgcmVzT25TZWFyY2hCdXR0b25DbGlja09ubHk/OiBib29sZWFuO1xyXG4gIHVzZUdvb2dsZUdlb0FwaT86IGJvb2xlYW47XHJcbiAgaW5wdXRQbGFjZWhvbGRlclRleHQ/OiBzdHJpbmc7XHJcbiAgaW5wdXRTdHJpbmc/OiBzdHJpbmc7XHJcbiAgc2hvd1NlYXJjaEJ1dHRvbj86IGJvb2xlYW47XHJcbiAgc2hvd1JlY2VudFNlYXJjaD86IGJvb2xlYW47XHJcbiAgc2hvd0N1cnJlbnRMb2NhdGlvbj86IGJvb2xlYW47XHJcbiAgcmVjZW50U3RvcmFnZU5hbWU/OiBzdHJpbmc7XHJcbiAgbm9PZlJlY2VudFNlYXJjaFNhdmU/OiBudW1iZXI7XHJcbiAgY3VycmVudExvY0ljb25Vcmw/OiBzdHJpbmc7XHJcbiAgc2VhcmNoSWNvblVybD86IHN0cmluZztcclxuICBsb2NhdGlvbkljb25Vcmw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ29vZ2xlLXBsYWNlcy1saXN0JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxub3ZvLWxpc3QgZGlyZWN0aW9uPVwidmVydGljYWxcIj5cclxuICAgICAgICAgICAgPG5vdm8tbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBkYXRhIG9mIHF1ZXJ5SXRlbXM7bGV0ICRpbmRleCA9IGluZGV4XCIgKGNsaWNrKT1cInNlbGVjdGVkTGlzdE5vZGUoJGV2ZW50LCAkaW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICA8aXRlbS1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGl0ZW0tYXZhdGFyIGljb249XCJsb2NhdGlvblwiPjwvaXRlbS1hdmF0YXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGl0ZW0tdGl0bGU+e3tkYXRhLnN0cnVjdHVyZWRfZm9ybWF0dGluZz8ubWFpbl90ZXh0ID8gZGF0YS5zdHJ1Y3R1cmVkX2Zvcm1hdHRpbmcubWFpbl90ZXh0IDogZGF0YS5kZXNjcmlwdGlvbn19PC9pdGVtLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgPC9pdGVtLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxpdGVtLWNvbnRlbnQ+e3tkYXRhLnN0cnVjdHVyZWRfZm9ybWF0dGluZz8uc2Vjb25kYXJ5X3RleHR9fTwvaXRlbS1jb250ZW50PlxyXG4gICAgICAgICAgICA8L25vdm8tbGlzdC1pdGVtPlxyXG4gICAgICAgIDwvbm92by1saXN0PlxyXG4gICAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYWNlc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KClcclxuICB1c2VyU2V0dGluZ3M6IFNldHRpbmdzO1xyXG4gIEBJbnB1dCgpXHJcbiAgdGVybTogc3RyaW5nID0gJyc7XHJcbiAgQE91dHB1dCgpXHJcbiAgdGVybUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KClcclxuICBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHB1YmxpYyBsb2NhdGlvbklucHV0OiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgZ2V0dGluZ0N1cnJlbnRMb2NhdGlvbkZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlY2VudERyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBxdWVyeUl0ZW1zOiBhbnkgPSBbXTtcclxuICBwdWJsaWMgaXNTZXR0aW5nc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNldHRpbmdzRXJyb3JNc2c6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3MgPSB7fTtcclxuICBwcml2YXRlIG1vZHVsZWluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGVkRGF0YUluZGV4OiBudW1iZXIgPSAtMTtcclxuICBwcml2YXRlIHJlY2VudFNlYXJjaERhdGE6IGFueSA9IFtdO1xyXG4gIHByaXZhdGUgdXNlclNlbGVjdGVkT3B0aW9uOiBhbnkgPSAnJztcclxuICBwcml2YXRlIGRlZmF1bHRTZXR0aW5nczogU2V0dGluZ3MgPSB7XHJcbiAgICBnZW9QcmVkaWN0aW9uU2VydmVyVXJsOiAnJyxcclxuICAgIGdlb0xhdExhbmdTZXJ2aWNlVXJsOiAnJyxcclxuICAgIGdlb0xvY0RldGFpbFNlcnZlclVybDogJycsXHJcbiAgICBnZW9Db3VudHJ5UmVzdHJpY3Rpb246IFtdLFxyXG4gICAgZ2VvVHlwZXM6IFtdLFxyXG4gICAgZ2VvTG9jYXRpb246IFtdLFxyXG4gICAgZ2VvUmFkaXVzOiAwLFxyXG4gICAgc2VydmVyUmVzcG9uc2VMaXN0SGllcmFyY2h5OiBbXSxcclxuICAgIHNlcnZlclJlc3BvbnNlYXRMYW5nSGllcmFyY2h5OiBbXSxcclxuICAgIHNlcnZlclJlc3BvbnNlRGV0YWlsSGllcmFyY2h5OiBbXSxcclxuICAgIHJlc09uU2VhcmNoQnV0dG9uQ2xpY2tPbmx5OiBmYWxzZSxcclxuICAgIHVzZUdvb2dsZUdlb0FwaTogdHJ1ZSxcclxuICAgIGlucHV0UGxhY2Vob2xkZXJUZXh0OiAnRW50ZXIgQXJlYSBOYW1lJyxcclxuICAgIGlucHV0U3RyaW5nOiAnJyxcclxuICAgIHNob3dTZWFyY2hCdXR0b246IHRydWUsXHJcbiAgICBzaG93UmVjZW50U2VhcmNoOiB0cnVlLFxyXG4gICAgc2hvd0N1cnJlbnRMb2NhdGlvbjogdHJ1ZSxcclxuICAgIHJlY2VudFN0b3JhZ2VOYW1lOiAncmVjZW50U2VhcmNoZXMnLFxyXG4gICAgbm9PZlJlY2VudFNlYXJjaFNhdmU6IDUsXHJcbiAgICBjdXJyZW50TG9jSWNvblVybDogJycsXHJcbiAgICBzZWFyY2hJY29uVXJsOiAnJyxcclxuICAgIGxvY2F0aW9uSWNvblVybDogJycsXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgX2VsbVJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX2dsb2JhbDogR2xvYmFsUmVmLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlUGxhY2VzU2VydmljZTogR29vZ2xlUGxhY2VzU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLm1vZHVsZWluaXQpIHtcclxuICAgICAgdGhpcy5tb2R1bGVJbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpOiBhbnkge1xyXG4gICAgdGhpcy5tb2R1bGVpbml0ID0gdHJ1ZTtcclxuICAgIHRoaXMubW9kdWxlSW5pdCgpO1xyXG4gICAgdGhpcy5zZWFyY2hpbnB1dENhbGxiYWNrKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gY2FsbGVkIHdoZW4gY2xpY2sgZXZlbnQgaGFwcGVucyBpbiBpbnB1dCBib3guIChCaW5kZWQgd2l0aCB2aWV3KVxyXG4gIHNlYXJjaGlucHV0Q2xpY2tDYWxsYmFjayhldmVudDogYW55KTogYW55IHtcclxuICAgIGV2ZW50LnRhcmdldC5zZWxlY3QoKTtcclxuICAgIHRoaXMuc2VhcmNoaW5wdXRDYWxsYmFjayhldmVudCk7XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBpbnB1dC4gKEJpbmRlZCB3aXRoIHZpZXcpXHJcbiAgc2VhcmNoaW5wdXRDYWxsYmFjayhldmVudDogYW55KTogYW55IHtcclxuICAgIGNvbnN0IGlucHV0VmFsOiBhbnkgPSB0aGlzLmxvY2F0aW9uSW5wdXQ7XHJcbiAgICBpZiAoaW5wdXRWYWwpIHtcclxuICAgICAgdGhpcy5nZXRMaXN0UXVlcnkoaW5wdXRWYWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5xdWVyeUl0ZW1zID0gW107XHJcbiAgICAgIGlmICh0aGlzLnVzZXJTZWxlY3RlZE9wdGlvbikge1xyXG4gICAgICAgIHRoaXMudXNlclF1ZXJ5U3VibWl0KCdmYWxzZScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXNlclNlbGVjdGVkT3B0aW9uID0gJyc7XHJcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNob3dSZWNlbnRTZWFyY2gpIHtcclxuICAgICAgICB0aGlzLnNob3dSZWNlbnRTZWFyY2goKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdXNlciBob3ZlciBvdmVyIGF1dG9jb21wbGV0ZSBsaXN0LihiaW5kZWQgd2l0aCB2aWV3KVxyXG4gIGFjdGl2ZUxpc3ROb2RlKGluZGV4OiBudW1iZXIpOiBhbnkge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlcnlJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICB0aGlzLnF1ZXJ5SXRlbXNbaV0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YUluZGV4ID0gaW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5xdWVyeUl0ZW1zW2ldLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdXNlciBzZWxlY3QgdGhlIGF1dG9jb21wbGV0ZSBsaXN0LihiaW5kZWQgd2l0aCB2aWV3KVxyXG4gIHNlbGVjdGVkTGlzdE5vZGUoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiBhbnkge1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnJlY2VudERyb3Bkb3duT3Blbikge1xyXG4gICAgICB0aGlzLnNldFJlY2VudExvY2F0aW9uKHRoaXMucXVlcnlJdGVtc1tpbmRleF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRQbGFjZUxvY2F0aW9uSW5mbyh0aGlzLnF1ZXJ5SXRlbXNbaW5kZXhdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBhdXRvY29tcGxldGUgbGlzdCB3aGVuIGNsaWNrZWQgb3V0c2lkZS4gKGJpbmRlZCB3aXRoIHZpZXcpXHJcbiAgY2xvc2VBdXRvY29tcGxldGUoZXZlbnQ6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMuX2VsbVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGFJbmRleCA9IC0xO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gbWFudWFsbHkgdHJpZ2dlciB0aGUgY2FsbGJhY2sgdG8gcGFyZW50IGNvbXBvbmVudCB3aGVuIGNsaWNrZWQgc2VhcmNoIGJ1dHRvbi5cclxuICB1c2VyUXVlcnlTdWJtaXQoc2VsZWN0ZWRPcHRpb24/OiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3QgX3VzZXJPcHRpb246IGFueSA9IHNlbGVjdGVkT3B0aW9uID09PSAnZmFsc2UnID8gJycgOiB0aGlzLnVzZXJTZWxlY3RlZE9wdGlvbjtcclxuICAgIGlmIChfdXNlck9wdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdC5lbWl0KHRoaXMudXNlclNlbGVjdGVkT3B0aW9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuc2VsZWN0LmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gZ2V0IHVzZXIgY3VycmVudCBsb2NhdGlvbiBmcm9tIHRoZSBkZXZpY2UuXHJcbiAgY3VycmVudExvY2F0aW9uU2VsZWN0ZWQoKTogYW55IHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIHRoaXMuZ2V0dGluZ0N1cnJlbnRMb2NhdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldEdlb0N1cnJlbnRMb2NhdGlvbigpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0dGluZ0N1cnJlbnRMb2NhdGlvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5nZXRDdXJyZW50TG9jYXRpb25JbmZvKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG1vZHVsZSBpbml0aWFsaXphdGlvbiBoYXBwZW5zLiBmdW5jdGlvbiBjYWxsZWQgYnkgbmdPbmluaXQgYW5kIG5nT25DaGFuZ2VcclxuICBwcml2YXRlIG1vZHVsZUluaXQoKTogYW55IHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLnNldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgLy8gY29uZGl0aW9uIHRvIGNoZWNrIGlmIFJhZGl1cyBpcyBzZXQgd2l0aG91dCBsb2NhdGlvbiBkZXRhaWwuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nZW9SYWRpdXMpIHtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZ2VvTG9jYXRpb24ubGVuZ3RoICE9PSAyKSB7XHJcbiAgICAgICAgdGhpcy5pc1NldHRpbmdzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NFcnJvck1zZyA9XHJcbiAgICAgICAgICB0aGlzLnNldHRpbmdzRXJyb3JNc2cgKyAnUmFkaXVzIHNob3VsZCBiZSB1c2VkIHdpdGggR2VvTG9jYXRpb24uIFBsZWFzZSB1c2UgXCJnZW9Mb2NhdGlvblwiIGtleSB0byBzZXQgbGF0IGFuZCBsbmcuICc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25kaXRpb24gdG8gY2hlY2sgaWYgbGF0IGFuZCBsbmcgaXMgc2V0IGFuZCByYWRpb3VzIGlzIG5vdCBzZXQgdGhlbiBpdCB3aWxsIHNldCB0byAyMCwwMDBLTSBieSBkZWZhdWx0XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nZW9Mb2NhdGlvbi5sZW5ndGggPT09IDIgJiYgIXRoaXMuc2V0dGluZ3MuZ2VvUmFkaXVzKSB7XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuZ2VvUmFkaXVzID0gMjAwMDAwMDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaG93UmVjZW50U2VhcmNoKSB7XHJcbiAgICAgIHRoaXMuZ2V0UmVjZW50TG9jYXRpb25zKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MudXNlR29vZ2xlR2VvQXBpKSB7XHJcbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5nZW9QcmVkaWN0aW9uU2VydmVyVXJsKSB7XHJcbiAgICAgICAgdGhpcy5pc1NldHRpbmdzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NFcnJvck1zZyA9XHJcbiAgICAgICAgICB0aGlzLnNldHRpbmdzRXJyb3JNc2cgKyAnUHJlZGljdGlvbiBjdXN0b20gc2VydmVyIHVybCBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIHVzZSBcImdlb1ByZWRpY3Rpb25TZXJ2ZXJVcmxcIiBrZXkgdG8gc2V0LiAnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5nZW9MYXRMYW5nU2VydmljZVVybCkge1xyXG4gICAgICAgIHRoaXMuaXNTZXR0aW5nc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmdzRXJyb3JNc2cgPVxyXG4gICAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnICsgJ0xhdGl0dWRlIGFuZCBsb25naXR1ZGUgY3VzdG9tIHNlcnZlciB1cmwgaXMgbm90IGRlZmluZWQuIFBsZWFzZSB1c2UgXCJnZW9MYXRMYW5nU2VydmljZVVybFwiIGtleSB0byBzZXQuICc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmdlb0xvY0RldGFpbFNlcnZlclVybCkge1xyXG4gICAgICAgIHRoaXMuaXNTZXR0aW5nc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmdzRXJyb3JNc2cgPVxyXG4gICAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnICsgJ0xvY2F0aW9uIGRldGFpbCBjdXN0b20gc2VydmVyIHVybCBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIHVzZSBcImdlb0xvY0RldGFpbFNlcnZlclVybFwiIGtleSB0byBzZXQuICc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMubG9jYXRpb25JbnB1dCA9IHRoaXMudGVybTtcclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIHNlYXJjaCBxdWVyeSB3aGVuIHByZXNzZWQgZW50ZXIuXHJcbiAgcHJpdmF0ZSBwcm9jZXNzU2VhcmNoUXVlcnkoKTogYW55IHtcclxuICAgIGlmICh0aGlzLnF1ZXJ5SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0YUluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGlzdE5vZGUobnVsbCwgdGhpcy5zZWxlY3RlZERhdGFJbmRleCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExpc3ROb2RlKG51bGwsIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB0byBzZXQgdXNlciBzZXR0aW5ncyBpZiBpdCBpcyBhdmFpbGFibGUuXHJcbiAgcHJpdmF0ZSBzZXRVc2VyU2V0dGluZ3MoKTogU2V0dGluZ3Mge1xyXG4gICAgY29uc3QgX3RlbXBPYmo6IGFueSA9IHt9O1xyXG4gICAgaWYgKHRoaXMudXNlclNldHRpbmdzICYmIHR5cGVvZiB0aGlzLnVzZXJTZXR0aW5ncyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmRlZmF1bHRTZXR0aW5ncyk7XHJcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Yga2V5cykge1xyXG4gICAgICAgIF90ZW1wT2JqW3ZhbHVlXSA9IHRoaXMudXNlclNldHRpbmdzW3ZhbHVlXSAhPT0gdW5kZWZpbmVkID8gdGhpcy51c2VyU2V0dGluZ3NbdmFsdWVdIDogdGhpcy5kZWZhdWx0U2V0dGluZ3NbdmFsdWVdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGVtcE9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRTZXR0aW5ncztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHRvIGdldCB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgYmFzZWQgb24gdXNlciBpbnB1dC5cclxuICBwcml2YXRlIGdldExpc3RRdWVyeSh2YWx1ZTogc3RyaW5nKTogYW55IHtcclxuICAgIHRoaXMucmVjZW50RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy51c2VHb29nbGVHZW9BcGkpIHtcclxuICAgICAgY29uc3QgX3RlbXBQYXJhbXM6IGFueSA9IHtcclxuICAgICAgICBxdWVyeTogdmFsdWUsXHJcbiAgICAgICAgY291bnRyeVJlc3RyaWN0aW9uOiB0aGlzLnNldHRpbmdzLmdlb0NvdW50cnlSZXN0cmljdGlvbixcclxuICAgICAgICBnZW9UeXBlczogdGhpcy5zZXR0aW5ncy5nZW9UeXBlcyxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZ2VvTG9jYXRpb24ubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgX3RlbXBQYXJhbXMuZ2VvTG9jYXRpb24gPSB0aGlzLnNldHRpbmdzLmdlb0xvY2F0aW9uO1xyXG4gICAgICAgIF90ZW1wUGFyYW1zLnJhZGl1cyA9IHRoaXMuc2V0dGluZ3MuZ2VvUmFkaXVzO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuZ2V0R2VvUHJlZGljdGlvbihfdGVtcFBhcmFtcykudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0SXRlbShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuZ2V0UHJlZGljdGlvbnModGhpcy5zZXR0aW5ncy5nZW9QcmVkaWN0aW9uU2VydmVyVXJsLCB2YWx1ZSkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5leHRyYWN0U2VydmVyTGlzdCh0aGlzLnNldHRpbmdzLnNlcnZlclJlc3BvbnNlTGlzdEhpZXJhcmNoeSwgcmVzdWx0KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3RJdGVtKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gZXh0cmF0YyBjdXN0b20gZGF0YSB3aGljaCBpcyBzZW5kIGJ5IHRoZSBzZXJ2ZXIuXHJcbiAgcHJpdmF0ZSBleHRyYWN0U2VydmVyTGlzdChhcnJheUxpc3Q6IGFueSwgZGF0YTogYW55KTogYW55IHtcclxuICAgIGlmIChhcnJheUxpc3QubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBfdGVtcERhdGE6IGFueSA9IGRhdGE7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFycmF5TGlzdCkge1xyXG4gICAgICAgIF90ZW1wRGF0YSA9IF90ZW1wRGF0YVtrZXldO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfdGVtcERhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgcHJlZGljdGVkIGxpc3QuXHJcbiAgcHJpdmF0ZSB1cGRhdGVMaXN0SXRlbShsaXN0RGF0YTogYW55KTogYW55IHtcclxuICAgIHRoaXMucXVlcnlJdGVtcyA9IGxpc3REYXRhID8gbGlzdERhdGEgOiBbXTtcclxuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHRvIHNob3cgdGhlIHJlY2VudCBzZWFyY2ggcmVzdWx0LlxyXG4gIHByaXZhdGUgc2hvd1JlY2VudFNlYXJjaCgpOiBhbnkge1xyXG4gICAgdGhpcy5yZWNlbnREcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRSZWNlbnRMaXN0KHRoaXMuc2V0dGluZ3MucmVjZW50U3RvcmFnZU5hbWUpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLnF1ZXJ5SXRlbXMgPSByZXN1bHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5xdWVyeUl0ZW1zID0gW107XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLy9mdW5jdGlvbiB0byBuYXZpZ2F0ZSB0aHJvdWdoIGxpc3Qgd2hlbiB1cCBhbmQgZG93biBrZXlib2FyZCBrZXkgaXMgcHJlc3NlZDtcclxuICAvLyBwcml2YXRlIG5hdmlnYXRlSW5MaXN0KGtleUNvZGU6IG51bWJlcik6IGFueSB7XHJcbiAgLy8gICAgIGxldCBhcnJheUluZGV4OiBudW1iZXIgPSAwO1xyXG4gIC8vICAgICAvL2Fycm93IGRvd25cclxuICAvLyAgICAgaWYgKGtleUNvZGUgPT09IDQwKSB7XHJcbiAgLy8gICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGFJbmRleCA+PSAwKSB7XHJcbiAgLy8gICAgICAgICAgICAgYXJyYXlJbmRleCA9ICgodGhpcy5zZWxlY3RlZERhdGFJbmRleCArIDEpIDw9ICh0aGlzLnF1ZXJ5SXRlbXMubGVuZ3RoIC0gMSkpID8gKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggKyAxKSA6IDA7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICB0aGlzLmFjdGl2ZUxpc3ROb2RlKGFycmF5SW5kZXgpO1xyXG4gIC8vICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IDM4KSB7Ly9hcnJvdyB1cFxyXG4gIC8vICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPj0gMCkge1xyXG4gIC8vICAgICAgICAgICAgIGFycmF5SW5kZXggPSAoKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggLSAxKSA+PSAwKSA/ICh0aGlzLnNlbGVjdGVkRGF0YUluZGV4IC0gMSkgOiAodGhpcy5xdWVyeUl0ZW1zLmxlbmd0aCAtIDEpO1xyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICBhcnJheUluZGV4ID0gdGhpcy5xdWVyeUl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICB0aGlzLmFjdGl2ZUxpc3ROb2RlKGFycmF5SW5kZXgpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdGhpcy5wcm9jZXNzU2VhcmNoUXVlcnkoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gZXhlY3V0ZSB0byBnZXQgbG9jYXRpb24gZGV0YWlsIGJhc2VkIG9uIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuXHJcbiAgcHJpdmF0ZSBnZXRDdXJyZW50TG9jYXRpb25JbmZvKGxhdGxuZzogYW55KTogYW55IHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVzZUdvb2dsZUdlb0FwaSkge1xyXG4gICAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldEdlb0xhdExuZ0RldGFpbChsYXRsbmcpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5zZXRSZWNlbnRMb2NhdGlvbihyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldHRpbmdDdXJyZW50TG9jYXRpb25GbGFnID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRMYXRMbmdEZXRhaWwodGhpcy5zZXR0aW5ncy5nZW9MYXRMYW5nU2VydmljZVVybCwgbGF0bG5nLmxhdCwgbGF0bG5nLmxuZykudGhlbigocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLmV4dHJhY3RTZXJ2ZXJMaXN0KHRoaXMuc2V0dGluZ3Muc2VydmVyUmVzcG9uc2VhdExhbmdIaWVyYXJjaHksIHJlc3VsdCk7XHJcbiAgICAgICAgICB0aGlzLnNldFJlY2VudExvY2F0aW9uKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZ2V0dGluZ0N1cnJlbnRMb2NhdGlvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB0byByZXRyaXZlIHRoZSBsb2NhdGlvbiBpbmZvIGJhc2VkIG9uIGdvb3ZsZSBwbGFjZSBpZC5cclxuICBwcml2YXRlIGdldFBsYWNlTG9jYXRpb25JbmZvKHNlbGVjdGVkRGF0YTogYW55KTogYW55IHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVzZUdvb2dsZUdlb0FwaSkge1xyXG4gICAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldEdlb1BsYWNlRGV0YWlsKHNlbGVjdGVkRGF0YS5wbGFjZV9pZCkudGhlbigoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuc2V0UmVjZW50TG9jYXRpb24oZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuZ2V0UGxhY2VEZXRhaWxzKHRoaXMuc2V0dGluZ3MuZ2VvTG9jRGV0YWlsU2VydmVyVXJsLCBzZWxlY3RlZERhdGEucGxhY2VfaWQpLnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5leHRyYWN0U2VydmVyTGlzdCh0aGlzLnNldHRpbmdzLnNlcnZlclJlc3BvbnNlRGV0YWlsSGllcmFyY2h5LCByZXN1bHQpO1xyXG4gICAgICAgICAgdGhpcy5zZXRSZWNlbnRMb2NhdGlvbihyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB0byBzdG9yZSB0aGUgc2VsZWN0ZWQgdXNlciBzZWFyY2ggaW4gdGhlIGxvY2Fsc3RvcmFnZS5cclxuICBwcml2YXRlIHNldFJlY2VudExvY2F0aW9uKGRhdGE6IGFueSk6IGFueSB7XHJcbiAgICBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICBkYXRhLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbiA/IGRhdGEuZGVzY3JpcHRpb24gOiBkYXRhLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgZGF0YS5hY3RpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPSAtMTtcclxuICAgIHRoaXMubG9jYXRpb25JbnB1dCA9IGRhdGEuZGVzY3JpcHRpb247XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaG93UmVjZW50U2VhcmNoKSB7XHJcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuYWRkUmVjZW50TGlzdCh0aGlzLnNldHRpbmdzLnJlY2VudFN0b3JhZ2VOYW1lLCBkYXRhLCB0aGlzLnNldHRpbmdzLm5vT2ZSZWNlbnRTZWFyY2hTYXZlKTtcclxuICAgICAgdGhpcy5nZXRSZWNlbnRMb2NhdGlvbnMoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXNlclNlbGVjdGVkT3B0aW9uID0gZGF0YTtcclxuICAgIC8vIGJlbG93IGNvZGUgd2lsbCBleGVjdXRlIG9ubHkgd2hlbiB1c2VyIHByZXNzIGVudGVyIG9yIHNlbGVjdCBhbnkgb3B0aW9uIHNlbGVjdGlvbiBhbmQgaXQgZW1pdCBhIGNhbGxiYWNrIHRvIHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnJlc09uU2VhcmNoQnV0dG9uQ2xpY2tPbmx5KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoZGF0YSk7XHJcbiAgICAgIHRoaXMudGVybUNoYW5nZS5lbWl0KGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gcmV0cml2ZSB0aGUgc3RvcmVkIHJlY2VudCB1c2VyIHNlYXJjaCBmcm9tIHRoZSBsb2NhbHN0b3JhZ2UuXHJcbiAgcHJpdmF0ZSBnZXRSZWNlbnRMb2NhdGlvbnMoKTogYW55IHtcclxuICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuZ2V0UmVjZW50TGlzdCh0aGlzLnNldHRpbmdzLnJlY2VudFN0b3JhZ2VOYW1lKS50aGVuKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWNlbnRTZWFyY2hEYXRhID0gZGF0YSAmJiBkYXRhLmxlbmd0aCA/IGRhdGEgOiBbXTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ // NG2
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import { Component, ElementRef, EventEmitter, Inject, Input, Output, PLATFORM_ID } from '@angular/core';
4
+ import { GlobalRef } from '../../services/global/global.service';
5
+ import { GooglePlacesService } from './places.service';
6
+ export class PlacesListComponent {
7
+ constructor(platformId, _elmRef, _global, _googlePlacesService) {
8
+ this.platformId = platformId;
9
+ this._elmRef = _elmRef;
10
+ this._global = _global;
11
+ this._googlePlacesService = _googlePlacesService;
12
+ this.term = '';
13
+ this.termChange = new EventEmitter();
14
+ this.select = new EventEmitter();
15
+ this.locationInput = '';
16
+ this.gettingCurrentLocationFlag = false;
17
+ this.dropdownOpen = false;
18
+ this.recentDropdownOpen = false;
19
+ this.queryItems = [];
20
+ this.isSettingsError = false;
21
+ this.settingsErrorMsg = '';
22
+ this.settings = {};
23
+ this.moduleinit = false;
24
+ this.selectedDataIndex = -1;
25
+ this.recentSearchData = [];
26
+ this.userSelectedOption = '';
27
+ this.defaultSettings = {
28
+ geoPredictionServerUrl: '',
29
+ geoLatLangServiceUrl: '',
30
+ geoLocDetailServerUrl: '',
31
+ geoCountryRestriction: [],
32
+ geoTypes: [],
33
+ geoLocation: [],
34
+ geoRadius: 0,
35
+ serverResponseListHierarchy: [],
36
+ serverResponseatLangHierarchy: [],
37
+ serverResponseDetailHierarchy: [],
38
+ resOnSearchButtonClickOnly: false,
39
+ useGoogleGeoApi: true,
40
+ inputPlaceholderText: 'Enter Area Name',
41
+ inputString: '',
42
+ showSearchButton: true,
43
+ showRecentSearch: true,
44
+ showCurrentLocation: true,
45
+ recentStorageName: 'recentSearches',
46
+ noOfRecentSearchSave: 5,
47
+ currentLocIconUrl: '',
48
+ searchIconUrl: '',
49
+ locationIconUrl: '',
50
+ };
51
+ }
52
+ ngOnInit() {
53
+ if (!this.moduleinit) {
54
+ this.moduleInit();
55
+ }
56
+ }
57
+ ngOnChanges() {
58
+ this.moduleinit = true;
59
+ this.moduleInit();
60
+ this.searchinputCallback(null);
61
+ }
62
+ // function called when click event happens in input box. (Binded with view)
63
+ searchinputClickCallback(event) {
64
+ event.target.select();
65
+ this.searchinputCallback(event);
66
+ }
67
+ // function called when there is a change in input. (Binded with view)
68
+ searchinputCallback(event) {
69
+ const inputVal = this.locationInput;
70
+ if (inputVal) {
71
+ this.getListQuery(inputVal);
72
+ }
73
+ else {
74
+ this.queryItems = [];
75
+ if (this.userSelectedOption) {
76
+ this.userQuerySubmit('false');
77
+ }
78
+ this.userSelectedOption = '';
79
+ if (this.settings.showRecentSearch) {
80
+ this.showRecentSearch();
81
+ }
82
+ else {
83
+ this.dropdownOpen = false;
84
+ }
85
+ }
86
+ }
87
+ // function to execute when user hover over autocomplete list.(binded with view)
88
+ activeListNode(index) {
89
+ for (let i = 0; i < this.queryItems.length; i++) {
90
+ if (index === i) {
91
+ this.queryItems[i].active = true;
92
+ this.selectedDataIndex = index;
93
+ }
94
+ else {
95
+ this.queryItems[i].active = false;
96
+ }
97
+ }
98
+ }
99
+ // function to execute when user select the autocomplete list.(binded with view)
100
+ selectedListNode(event, index) {
101
+ this.dropdownOpen = false;
102
+ if (this.recentDropdownOpen) {
103
+ this.setRecentLocation(this.queryItems[index]);
104
+ }
105
+ else {
106
+ this.getPlaceLocationInfo(this.queryItems[index]);
107
+ }
108
+ }
109
+ // function to close the autocomplete list when clicked outside. (binded with view)
110
+ closeAutocomplete(event) {
111
+ if (!this._elmRef.nativeElement.contains(event.target)) {
112
+ this.selectedDataIndex = -1;
113
+ this.dropdownOpen = false;
114
+ }
115
+ }
116
+ // function to manually trigger the callback to parent component when clicked search button.
117
+ userQuerySubmit(selectedOption) {
118
+ const _userOption = selectedOption === 'false' ? '' : this.userSelectedOption;
119
+ if (_userOption) {
120
+ this.select.emit(this.userSelectedOption);
121
+ }
122
+ else {
123
+ // this.select.emit(false);
124
+ }
125
+ }
126
+ // function to get user current location from the device.
127
+ currentLocationSelected() {
128
+ if (isPlatformBrowser(this.platformId)) {
129
+ this.gettingCurrentLocationFlag = true;
130
+ this.dropdownOpen = false;
131
+ this._googlePlacesService.getGeoCurrentLocation().then((result) => {
132
+ if (!result) {
133
+ this.gettingCurrentLocationFlag = false;
134
+ }
135
+ else {
136
+ this.getCurrentLocationInfo(result);
137
+ }
138
+ });
139
+ }
140
+ }
141
+ // module initialization happens. function called by ngOninit and ngOnChange
142
+ moduleInit() {
143
+ this.settings = this.setUserSettings();
144
+ // condition to check if Radius is set without location detail.
145
+ if (this.settings.geoRadius) {
146
+ if (this.settings.geoLocation.length !== 2) {
147
+ this.isSettingsError = true;
148
+ this.settingsErrorMsg =
149
+ this.settingsErrorMsg + 'Radius should be used with GeoLocation. Please use "geoLocation" key to set lat and lng. ';
150
+ }
151
+ }
152
+ // condition to check if lat and lng is set and radious is not set then it will set to 20,000KM by default
153
+ if (this.settings.geoLocation.length === 2 && !this.settings.geoRadius) {
154
+ this.settings.geoRadius = 20000000;
155
+ }
156
+ if (this.settings.showRecentSearch) {
157
+ this.getRecentLocations();
158
+ }
159
+ if (!this.settings.useGoogleGeoApi) {
160
+ if (!this.settings.geoPredictionServerUrl) {
161
+ this.isSettingsError = true;
162
+ this.settingsErrorMsg =
163
+ this.settingsErrorMsg + 'Prediction custom server url is not defined. Please use "geoPredictionServerUrl" key to set. ';
164
+ }
165
+ if (!this.settings.geoLatLangServiceUrl) {
166
+ this.isSettingsError = true;
167
+ this.settingsErrorMsg =
168
+ this.settingsErrorMsg + 'Latitude and longitude custom server url is not defined. Please use "geoLatLangServiceUrl" key to set. ';
169
+ }
170
+ if (!this.settings.geoLocDetailServerUrl) {
171
+ this.isSettingsError = true;
172
+ this.settingsErrorMsg =
173
+ this.settingsErrorMsg + 'Location detail custom server url is not defined. Please use "geoLocDetailServerUrl" key to set. ';
174
+ }
175
+ }
176
+ this.locationInput = this.term;
177
+ }
178
+ // function to process the search query when pressed enter.
179
+ processSearchQuery() {
180
+ if (this.queryItems.length) {
181
+ if (this.selectedDataIndex > -1) {
182
+ this.selectedListNode(null, this.selectedDataIndex);
183
+ }
184
+ else {
185
+ this.selectedListNode(null, 0);
186
+ }
187
+ }
188
+ }
189
+ // function to set user settings if it is available.
190
+ setUserSettings() {
191
+ const _tempObj = {};
192
+ if (this.userSettings && typeof this.userSettings === 'object') {
193
+ const keys = Object.keys(this.defaultSettings);
194
+ for (const value of keys) {
195
+ _tempObj[value] = this.userSettings[value] !== undefined ? this.userSettings[value] : this.defaultSettings[value];
196
+ }
197
+ return _tempObj;
198
+ }
199
+ else {
200
+ return this.defaultSettings;
201
+ }
202
+ }
203
+ // function to get the autocomplete list based on user input.
204
+ getListQuery(value) {
205
+ this.recentDropdownOpen = false;
206
+ if (this.settings.useGoogleGeoApi) {
207
+ const _tempParams = {
208
+ query: value,
209
+ countryRestriction: this.settings.geoCountryRestriction,
210
+ geoTypes: this.settings.geoTypes,
211
+ };
212
+ if (this.settings.geoLocation.length === 2) {
213
+ _tempParams.geoLocation = this.settings.geoLocation;
214
+ _tempParams.radius = this.settings.geoRadius;
215
+ }
216
+ this._googlePlacesService.getGeoPrediction(_tempParams).then((result) => {
217
+ this.updateListItem(result);
218
+ });
219
+ }
220
+ else {
221
+ this._googlePlacesService.getPredictions(this.settings.geoPredictionServerUrl, value).then((result) => {
222
+ result = this.extractServerList(this.settings.serverResponseListHierarchy, result);
223
+ this.updateListItem(result);
224
+ });
225
+ }
226
+ }
227
+ // function to extratc custom data which is send by the server.
228
+ extractServerList(arrayList, data) {
229
+ if (arrayList.length) {
230
+ let _tempData = data;
231
+ for (const key of arrayList) {
232
+ _tempData = _tempData[key];
233
+ }
234
+ return _tempData;
235
+ }
236
+ else {
237
+ return data;
238
+ }
239
+ }
240
+ // function to update the predicted list.
241
+ updateListItem(listData) {
242
+ this.queryItems = listData ? listData : [];
243
+ this.dropdownOpen = true;
244
+ }
245
+ // function to show the recent search result.
246
+ showRecentSearch() {
247
+ this.recentDropdownOpen = true;
248
+ this.dropdownOpen = true;
249
+ this._googlePlacesService.getRecentList(this.settings.recentStorageName).then((result) => {
250
+ if (result) {
251
+ this.queryItems = result;
252
+ }
253
+ else {
254
+ this.queryItems = [];
255
+ }
256
+ });
257
+ }
258
+ // //function to navigate through list when up and down keyboard key is pressed;
259
+ // private navigateInList(keyCode: number): any {
260
+ // let arrayIndex: number = 0;
261
+ // //arrow down
262
+ // if (keyCode === 40) {
263
+ // if (this.selectedDataIndex >= 0) {
264
+ // arrayIndex = ((this.selectedDataIndex + 1) <= (this.queryItems.length - 1)) ? (this.selectedDataIndex + 1) : 0;
265
+ // }
266
+ // this.activeListNode(arrayIndex);
267
+ // } else if (keyCode === 38) {//arrow up
268
+ // if (this.selectedDataIndex >= 0) {
269
+ // arrayIndex = ((this.selectedDataIndex - 1) >= 0) ? (this.selectedDataIndex - 1) : (this.queryItems.length - 1);
270
+ // } else {
271
+ // arrayIndex = this.queryItems.length - 1;
272
+ // }
273
+ // this.activeListNode(arrayIndex);
274
+ // } else {
275
+ // this.processSearchQuery();
276
+ // }
277
+ // }
278
+ // function to execute to get location detail based on latitude and longitude.
279
+ getCurrentLocationInfo(latlng) {
280
+ if (this.settings.useGoogleGeoApi) {
281
+ this._googlePlacesService.getGeoLatLngDetail(latlng).then((result) => {
282
+ if (result) {
283
+ this.setRecentLocation(result);
284
+ }
285
+ this.gettingCurrentLocationFlag = false;
286
+ });
287
+ }
288
+ else {
289
+ this._googlePlacesService.getLatLngDetail(this.settings.geoLatLangServiceUrl, latlng.lat, latlng.lng).then((result) => {
290
+ if (result) {
291
+ result = this.extractServerList(this.settings.serverResponseatLangHierarchy, result);
292
+ this.setRecentLocation(result);
293
+ }
294
+ this.gettingCurrentLocationFlag = false;
295
+ });
296
+ }
297
+ }
298
+ // function to retrive the location info based on goovle place id.
299
+ getPlaceLocationInfo(selectedData) {
300
+ if (this.settings.useGoogleGeoApi) {
301
+ this._googlePlacesService.getGeoPlaceDetail(selectedData.place_id).then((data) => {
302
+ if (data) {
303
+ this.setRecentLocation(data);
304
+ }
305
+ });
306
+ }
307
+ else {
308
+ this._googlePlacesService.getPlaceDetails(this.settings.geoLocDetailServerUrl, selectedData.place_id).then((result) => {
309
+ if (result) {
310
+ result = this.extractServerList(this.settings.serverResponseDetailHierarchy, result);
311
+ this.setRecentLocation(result);
312
+ }
313
+ });
314
+ }
315
+ }
316
+ // function to store the selected user search in the localstorage.
317
+ setRecentLocation(data) {
318
+ data = JSON.parse(JSON.stringify(data));
319
+ data.description = data.description ? data.description : data.formatted_address;
320
+ data.active = false;
321
+ this.selectedDataIndex = -1;
322
+ this.locationInput = data.description;
323
+ if (this.settings.showRecentSearch) {
324
+ this._googlePlacesService.addRecentList(this.settings.recentStorageName, data, this.settings.noOfRecentSearchSave);
325
+ this.getRecentLocations();
326
+ }
327
+ this.userSelectedOption = data;
328
+ // below code will execute only when user press enter or select any option selection and it emit a callback to the parent component.
329
+ if (!this.settings.resOnSearchButtonClickOnly) {
330
+ this.select.emit(data);
331
+ this.termChange.emit(data);
332
+ }
333
+ }
334
+ // function to retrive the stored recent user search from the localstorage.
335
+ getRecentLocations() {
336
+ this._googlePlacesService.getRecentList(this.settings.recentStorageName).then((data) => {
337
+ this.recentSearchData = data && data.length ? data : [];
338
+ });
339
+ }
340
+ }
341
+ PlacesListComponent.decorators = [
342
+ { type: Component, args: [{
343
+ selector: 'google-places-list',
344
+ template: `
345
+ <novo-list direction="vertical">
346
+ <novo-list-item *ngFor="let data of queryItems;let $index = index" (click)="selectedListNode($event, $index)">
347
+ <item-header>
348
+ <item-avatar icon="location"></item-avatar>
349
+ <item-title>{{data.structured_formatting?.main_text ? data.structured_formatting.main_text : data.description}}</item-title>
350
+ </item-header>
351
+ <item-content>{{data.structured_formatting?.secondary_text}}</item-content>
352
+ </novo-list-item>
353
+ </novo-list>
354
+ `
355
+ },] }
356
+ ];
357
+ PlacesListComponent.ctorParameters = () => [
358
+ { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
359
+ { type: ElementRef },
360
+ { type: GlobalRef },
361
+ { type: GooglePlacesService }
362
+ ];
363
+ PlacesListComponent.propDecorators = {
364
+ userSettings: [{ type: Input }],
365
+ term: [{ type: Input }],
366
+ termChange: [{ type: Output }],
367
+ select: [{ type: Output }]
368
+ };
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJlbGVtZW50cy9wbGFjZXMvcGxhY2VzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUN2RCxNQUFNLE9BQU8sbUJBQW1CO0lBK0M5QixZQUMrQixVQUFrQixFQUN2QyxPQUFtQixFQUNuQixPQUFrQixFQUNsQixvQkFBeUM7UUFIcEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQS9DbkQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFeEQsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTdDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUM1QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUNyQixvQkFBZSxHQUFZLEtBQUssQ0FB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Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7O0tBVVA7YUFDSjs7O1lBaUQ0QyxNQUFNLHVCQUE5QyxNQUFNLFNBQUMsV0FBVztZQTNGSCxVQUFVO1lBQ3JCLFNBQVM7WUFDVCxtQkFBbUI7OzsyQkEwQ3pCLEtBQUs7bUJBRUwsS0FBSzt5QkFFTCxNQUFNO3FCQUVOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBORzJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2xvYmFsUmVmIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2xvYmFsL2dsb2JhbC5zZXJ2aWNlJztcbmltcG9ydCB7IEdvb2dsZVBsYWNlc1NlcnZpY2UgfSBmcm9tICcuL3BsYWNlcy5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XG4gIGdlb1ByZWRpY3Rpb25TZXJ2ZXJVcmw/OiBzdHJpbmc7XG4gIGdlb0xhdExhbmdTZXJ2aWNlVXJsPzogc3RyaW5nO1xuICBnZW9Mb2NEZXRhaWxTZXJ2ZXJVcmw/OiBzdHJpbmc7XG4gIGdlb0NvdW50cnlSZXN0cmljdGlvbj86IGFueTtcbiAgZ2VvVHlwZXM/OiBhbnk7XG4gIGdlb0xvY2F0aW9uPzogYW55O1xuICBnZW9SYWRpdXM/OiBudW1iZXI7XG4gIHNlcnZlclJlc3BvbnNlTGlzdEhpZXJhcmNoeT86IGFueTtcbiAgc2VydmVyUmVzcG9uc2VhdExhbmdIaWVyYXJjaHk/OiBhbnk7XG4gIHNlcnZlclJlc3BvbnNlRGV0YWlsSGllcmFyY2h5PzogYW55O1xuICByZXNPblNlYXJjaEJ1dHRvbkNsaWNrT25seT86IGJvb2xlYW47XG4gIHVzZUdvb2dsZUdlb0FwaT86IGJvb2xlYW47XG4gIGlucHV0UGxhY2Vob2xkZXJUZXh0Pzogc3RyaW5nO1xuICBpbnB1dFN0cmluZz86IHN0cmluZztcbiAgc2hvd1NlYXJjaEJ1dHRvbj86IGJvb2xlYW47XG4gIHNob3dSZWNlbnRTZWFyY2g/OiBib29sZWFuO1xuICBzaG93Q3VycmVudExvY2F0aW9uPzogYm9vbGVhbjtcbiAgcmVjZW50U3RvcmFnZU5hbWU/OiBzdHJpbmc7XG4gIG5vT2ZSZWNlbnRTZWFyY2hTYXZlPzogbnVtYmVyO1xuICBjdXJyZW50TG9jSWNvblVybD86IHN0cmluZztcbiAgc2VhcmNoSWNvblVybD86IHN0cmluZztcbiAgbG9jYXRpb25JY29uVXJsPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnb29nbGUtcGxhY2VzLWxpc3QnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bm92by1saXN0IGRpcmVjdGlvbj1cInZlcnRpY2FsXCI+XG4gICAgICAgICAgICA8bm92by1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGRhdGEgb2YgcXVlcnlJdGVtcztsZXQgJGluZGV4ID0gaW5kZXhcIiAoY2xpY2spPVwic2VsZWN0ZWRMaXN0Tm9kZSgkZXZlbnQsICRpbmRleClcIj5cbiAgICAgICAgICAgICAgICA8aXRlbS1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxpdGVtLWF2YXRhciBpY29uPVwibG9jYXRpb25cIj48L2l0ZW0tYXZhdGFyPlxuICAgICAgICAgICAgICAgICAgICA8aXRlbS10aXRsZT57e2RhdGEuc3RydWN0dXJlZF9mb3JtYXR0aW5nPy5tYWluX3RleHQgPyBkYXRhLnN0cnVjdHVyZWRfZm9ybWF0dGluZy5tYWluX3RleHQgOiBkYXRhLmRlc2NyaXB0aW9ufX08L2l0ZW0tdGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pdGVtLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8aXRlbS1jb250ZW50Pnt7ZGF0YS5zdHJ1Y3R1cmVkX2Zvcm1hdHRpbmc/LnNlY29uZGFyeV90ZXh0fX08L2l0ZW0tY29udGVudD5cbiAgICAgICAgICAgIDwvbm92by1saXN0LWl0ZW0+XG4gICAgICAgIDwvbm92by1saXN0PlxuICAgIGAsXG59KVxuZXhwb3J0IGNsYXNzIFBsYWNlc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHVzZXJTZXR0aW5nczogU2V0dGluZ3M7XG4gIEBJbnB1dCgpXG4gIHRlcm06IHN0cmluZyA9ICcnO1xuICBAT3V0cHV0KClcbiAgdGVybUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIHNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgbG9jYXRpb25JbnB1dDogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBnZXR0aW5nQ3VycmVudExvY2F0aW9uRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZWNlbnREcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHF1ZXJ5SXRlbXM6IGFueSA9IFtdO1xuICBwdWJsaWMgaXNTZXR0aW5nc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzZXR0aW5nc0Vycm9yTXNnOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIHNldHRpbmdzOiBTZXR0aW5ncyA9IHt9O1xuICBwcml2YXRlIG1vZHVsZWluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFJbmRleDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgcmVjZW50U2VhcmNoRGF0YTogYW55ID0gW107XG4gIHByaXZhdGUgdXNlclNlbGVjdGVkT3B0aW9uOiBhbnkgPSAnJztcbiAgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IFNldHRpbmdzID0ge1xuICAgIGdlb1ByZWRpY3Rpb25TZXJ2ZXJVcmw6ICcnLFxuICAgIGdlb0xhdExhbmdTZXJ2aWNlVXJsOiAnJyxcbiAgICBnZW9Mb2NEZXRhaWxTZXJ2ZXJVcmw6ICcnLFxuICAgIGdlb0NvdW50cnlSZXN0cmljdGlvbjogW10sXG4gICAgZ2VvVHlwZXM6IFtdLFxuICAgIGdlb0xvY2F0aW9uOiBbXSxcbiAgICBnZW9SYWRpdXM6IDAsXG4gICAgc2VydmVyUmVzcG9uc2VMaXN0SGllcmFyY2h5OiBbXSxcbiAgICBzZXJ2ZXJSZXNwb25zZWF0TGFuZ0hpZXJhcmNoeTogW10sXG4gICAgc2VydmVyUmVzcG9uc2VEZXRhaWxIaWVyYXJjaHk6IFtdLFxuICAgIHJlc09uU2VhcmNoQnV0dG9uQ2xpY2tPbmx5OiBmYWxzZSxcbiAgICB1c2VHb29nbGVHZW9BcGk6IHRydWUsXG4gICAgaW5wdXRQbGFjZWhvbGRlclRleHQ6ICdFbnRlciBBcmVhIE5hbWUnLFxuICAgIGlucHV0U3RyaW5nOiAnJyxcbiAgICBzaG93U2VhcmNoQnV0dG9uOiB0cnVlLFxuICAgIHNob3dSZWNlbnRTZWFyY2g6IHRydWUsXG4gICAgc2hvd0N1cnJlbnRMb2NhdGlvbjogdHJ1ZSxcbiAgICByZWNlbnRTdG9yYWdlTmFtZTogJ3JlY2VudFNlYXJjaGVzJyxcbiAgICBub09mUmVjZW50U2VhcmNoU2F2ZTogNSxcbiAgICBjdXJyZW50TG9jSWNvblVybDogJycsXG4gICAgc2VhcmNoSWNvblVybDogJycsXG4gICAgbG9jYXRpb25JY29uVXJsOiAnJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBwcml2YXRlIF9lbG1SZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZ2xvYmFsOiBHbG9iYWxSZWYsXG4gICAgcHJpdmF0ZSBfZ29vZ2xlUGxhY2VzU2VydmljZTogR29vZ2xlUGxhY2VzU2VydmljZSxcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiBhbnkge1xuICAgIGlmICghdGhpcy5tb2R1bGVpbml0KSB7XG4gICAgICB0aGlzLm1vZHVsZUluaXQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiBhbnkge1xuICAgIHRoaXMubW9kdWxlaW5pdCA9IHRydWU7XG4gICAgdGhpcy5tb2R1bGVJbml0KCk7XG4gICAgdGhpcy5zZWFyY2hpbnB1dENhbGxiYWNrKG51bGwpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gY2FsbGVkIHdoZW4gY2xpY2sgZXZlbnQgaGFwcGVucyBpbiBpbnB1dCBib3guIChCaW5kZWQgd2l0aCB2aWV3KVxuICBzZWFyY2hpbnB1dENsaWNrQ2FsbGJhY2soZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgZXZlbnQudGFyZ2V0LnNlbGVjdCgpO1xuICAgIHRoaXMuc2VhcmNoaW5wdXRDYWxsYmFjayhldmVudCk7XG4gIH1cblxuICAvLyBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBpbnB1dC4gKEJpbmRlZCB3aXRoIHZpZXcpXG4gIHNlYXJjaGlucHV0Q2FsbGJhY2soZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgaW5wdXRWYWw6IGFueSA9IHRoaXMubG9jYXRpb25JbnB1dDtcbiAgICBpZiAoaW5wdXRWYWwpIHtcbiAgICAgIHRoaXMuZ2V0TGlzdFF1ZXJ5KGlucHV0VmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeUl0ZW1zID0gW107XG4gICAgICBpZiAodGhpcy51c2VyU2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdGhpcy51c2VyUXVlcnlTdWJtaXQoJ2ZhbHNlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXJTZWxlY3RlZE9wdGlvbiA9ICcnO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd1JlY2VudFNlYXJjaCkge1xuICAgICAgICB0aGlzLnNob3dSZWNlbnRTZWFyY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHVzZXIgaG92ZXIgb3ZlciBhdXRvY29tcGxldGUgbGlzdC4oYmluZGVkIHdpdGggdmlldylcbiAgYWN0aXZlTGlzdE5vZGUoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlcnlJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgICAgIHRoaXMucXVlcnlJdGVtc1tpXS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YUluZGV4ID0gaW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnF1ZXJ5SXRlbXNbaV0uYWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHVzZXIgc2VsZWN0IHRoZSBhdXRvY29tcGxldGUgbGlzdC4oYmluZGVkIHdpdGggdmlldylcbiAgc2VsZWN0ZWRMaXN0Tm9kZShldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgdGhpcy5kcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5yZWNlbnREcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuc2V0UmVjZW50TG9jYXRpb24odGhpcy5xdWVyeUl0ZW1zW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0UGxhY2VMb2NhdGlvbkluZm8odGhpcy5xdWVyeUl0ZW1zW2luZGV4XSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gY2xvc2UgdGhlIGF1dG9jb21wbGV0ZSBsaXN0IHdoZW4gY2xpY2tlZCBvdXRzaWRlLiAoYmluZGVkIHdpdGggdmlldylcbiAgY2xvc2VBdXRvY29tcGxldGUoZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9lbG1SZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YUluZGV4ID0gLTE7XG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZ1bmN0aW9uIHRvIG1hbnVhbGx5IHRyaWdnZXIgdGhlIGNhbGxiYWNrIHRvIHBhcmVudCBjb21wb25lbnQgd2hlbiBjbGlja2VkIHNlYXJjaCBidXR0b24uXG4gIHVzZXJRdWVyeVN1Ym1pdChzZWxlY3RlZE9wdGlvbj86IGFueSk6IGFueSB7XG4gICAgY29uc3QgX3VzZXJPcHRpb246IGFueSA9IHNlbGVjdGVkT3B0aW9uID09PSAnZmFsc2UnID8gJycgOiB0aGlzLnVzZXJTZWxlY3RlZE9wdGlvbjtcbiAgICBpZiAoX3VzZXJPcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQodGhpcy51c2VyU2VsZWN0ZWRPcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLnNlbGVjdC5lbWl0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBmdW5jdGlvbiB0byBnZXQgdXNlciBjdXJyZW50IGxvY2F0aW9uIGZyb20gdGhlIGRldmljZS5cbiAgY3VycmVudExvY2F0aW9uU2VsZWN0ZWQoKTogYW55IHtcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgdGhpcy5nZXR0aW5nQ3VycmVudExvY2F0aW9uRmxhZyA9IHRydWU7XG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRHZW9DdXJyZW50TG9jYXRpb24oKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHRoaXMuZ2V0dGluZ0N1cnJlbnRMb2NhdGlvbkZsYWcgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdldEN1cnJlbnRMb2NhdGlvbkluZm8ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gbW9kdWxlIGluaXRpYWxpemF0aW9uIGhhcHBlbnMuIGZ1bmN0aW9uIGNhbGxlZCBieSBuZ09uaW5pdCBhbmQgbmdPbkNoYW5nZVxuICBwcml2YXRlIG1vZHVsZUluaXQoKTogYW55IHtcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5zZXRVc2VyU2V0dGluZ3MoKTtcbiAgICAvLyBjb25kaXRpb24gdG8gY2hlY2sgaWYgUmFkaXVzIGlzIHNldCB3aXRob3V0IGxvY2F0aW9uIGRldGFpbC5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nZW9SYWRpdXMpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmdlb0xvY2F0aW9uLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aGlzLmlzU2V0dGluZ3NFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NFcnJvck1zZyA9XG4gICAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnICsgJ1JhZGl1cyBzaG91bGQgYmUgdXNlZCB3aXRoIEdlb0xvY2F0aW9uLiBQbGVhc2UgdXNlIFwiZ2VvTG9jYXRpb25cIiBrZXkgdG8gc2V0IGxhdCBhbmQgbG5nLiAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbmRpdGlvbiB0byBjaGVjayBpZiBsYXQgYW5kIGxuZyBpcyBzZXQgYW5kIHJhZGlvdXMgaXMgbm90IHNldCB0aGVuIGl0IHdpbGwgc2V0IHRvIDIwLDAwMEtNIGJ5IGRlZmF1bHRcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nZW9Mb2NhdGlvbi5sZW5ndGggPT09IDIgJiYgIXRoaXMuc2V0dGluZ3MuZ2VvUmFkaXVzKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLmdlb1JhZGl1cyA9IDIwMDAwMDAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaG93UmVjZW50U2VhcmNoKSB7XG4gICAgICB0aGlzLmdldFJlY2VudExvY2F0aW9ucygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MudXNlR29vZ2xlR2VvQXBpKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZ2VvUHJlZGljdGlvblNlcnZlclVybCkge1xuICAgICAgICB0aGlzLmlzU2V0dGluZ3NFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NFcnJvck1zZyA9XG4gICAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnICsgJ1ByZWRpY3Rpb24gY3VzdG9tIHNlcnZlciB1cmwgaXMgbm90IGRlZmluZWQuIFBsZWFzZSB1c2UgXCJnZW9QcmVkaWN0aW9uU2VydmVyVXJsXCIga2V5IHRvIHNldC4gJztcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5nZW9MYXRMYW5nU2VydmljZVVybCkge1xuICAgICAgICB0aGlzLmlzU2V0dGluZ3NFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NFcnJvck1zZyA9XG4gICAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnICsgJ0xhdGl0dWRlIGFuZCBsb25naXR1ZGUgY3VzdG9tIHNlcnZlciB1cmwgaXMgbm90IGRlZmluZWQuIFBsZWFzZSB1c2UgXCJnZW9MYXRMYW5nU2VydmljZVVybFwiIGtleSB0byBzZXQuICc7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZ2VvTG9jRGV0YWlsU2VydmVyVXJsKSB7XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc0Vycm9yTXNnID1cbiAgICAgICAgICB0aGlzLnNldHRpbmdzRXJyb3JNc2cgKyAnTG9jYXRpb24gZGV0YWlsIGN1c3RvbSBzZXJ2ZXIgdXJsIGlzIG5vdCBkZWZpbmVkLiBQbGVhc2UgdXNlIFwiZ2VvTG9jRGV0YWlsU2VydmVyVXJsXCIga2V5IHRvIHNldC4gJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2NhdGlvbklucHV0ID0gdGhpcy50ZXJtO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgc2VhcmNoIHF1ZXJ5IHdoZW4gcHJlc3NlZCBlbnRlci5cbiAgcHJpdmF0ZSBwcm9jZXNzU2VhcmNoUXVlcnkoKTogYW55IHtcbiAgICBpZiAodGhpcy5xdWVyeUl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGlzdE5vZGUobnVsbCwgdGhpcy5zZWxlY3RlZERhdGFJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGlzdE5vZGUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gc2V0IHVzZXIgc2V0dGluZ3MgaWYgaXQgaXMgYXZhaWxhYmxlLlxuICBwcml2YXRlIHNldFVzZXJTZXR0aW5ncygpOiBTZXR0aW5ncyB7XG4gICAgY29uc3QgX3RlbXBPYmo6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnVzZXJTZXR0aW5ncyAmJiB0eXBlb2YgdGhpcy51c2VyU2V0dGluZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Yga2V5cykge1xuICAgICAgICBfdGVtcE9ialt2YWx1ZV0gPSB0aGlzLnVzZXJTZXR0aW5nc1t2YWx1ZV0gIT09IHVuZGVmaW5lZCA/IHRoaXMudXNlclNldHRpbmdzW3ZhbHVlXSA6IHRoaXMuZGVmYXVsdFNldHRpbmdzW3ZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGVtcE9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFNldHRpbmdzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZ1bmN0aW9uIHRvIGdldCB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgYmFzZWQgb24gdXNlciBpbnB1dC5cbiAgcHJpdmF0ZSBnZXRMaXN0UXVlcnkodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgdGhpcy5yZWNlbnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy51c2VHb29nbGVHZW9BcGkpIHtcbiAgICAgIGNvbnN0IF90ZW1wUGFyYW1zOiBhbnkgPSB7XG4gICAgICAgIHF1ZXJ5OiB2YWx1ZSxcbiAgICAgICAgY291bnRyeVJlc3RyaWN0aW9uOiB0aGlzLnNldHRpbmdzLmdlb0NvdW50cnlSZXN0cmljdGlvbixcbiAgICAgICAgZ2VvVHlwZXM6IHRoaXMuc2V0dGluZ3MuZ2VvVHlwZXMsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZ2VvTG9jYXRpb24ubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIF90ZW1wUGFyYW1zLmdlb0xvY2F0aW9uID0gdGhpcy5zZXR0aW5ncy5nZW9Mb2NhdGlvbjtcbiAgICAgICAgX3RlbXBQYXJhbXMucmFkaXVzID0gdGhpcy5zZXR0aW5ncy5nZW9SYWRpdXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldEdlb1ByZWRpY3Rpb24oX3RlbXBQYXJhbXMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUxpc3RJdGVtKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRQcmVkaWN0aW9ucyh0aGlzLnNldHRpbmdzLmdlb1ByZWRpY3Rpb25TZXJ2ZXJVcmwsIHZhbHVlKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5leHRyYWN0U2VydmVyTGlzdCh0aGlzLnNldHRpbmdzLnNlcnZlclJlc3BvbnNlTGlzdEhpZXJhcmNoeSwgcmVzdWx0KTtcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0SXRlbShyZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gZXh0cmF0YyBjdXN0b20gZGF0YSB3aGljaCBpcyBzZW5kIGJ5IHRoZSBzZXJ2ZXIuXG4gIHByaXZhdGUgZXh0cmFjdFNlcnZlckxpc3QoYXJyYXlMaXN0OiBhbnksIGRhdGE6IGFueSk6IGFueSB7XG4gICAgaWYgKGFycmF5TGlzdC5sZW5ndGgpIHtcbiAgICAgIGxldCBfdGVtcERhdGE6IGFueSA9IGRhdGE7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBhcnJheUxpc3QpIHtcbiAgICAgICAgX3RlbXBEYXRhID0gX3RlbXBEYXRhW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RlbXBEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cblxuICAvLyBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIHByZWRpY3RlZCBsaXN0LlxuICBwcml2YXRlIHVwZGF0ZUxpc3RJdGVtKGxpc3REYXRhOiBhbnkpOiBhbnkge1xuICAgIHRoaXMucXVlcnlJdGVtcyA9IGxpc3REYXRhID8gbGlzdERhdGEgOiBbXTtcbiAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IHRydWU7XG4gIH1cblxuICAvLyBmdW5jdGlvbiB0byBzaG93IHRoZSByZWNlbnQgc2VhcmNoIHJlc3VsdC5cbiAgcHJpdmF0ZSBzaG93UmVjZW50U2VhcmNoKCk6IGFueSB7XG4gICAgdGhpcy5yZWNlbnREcm9wZG93bk9wZW4gPSB0cnVlO1xuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHJ1ZTtcbiAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldFJlY2VudExpc3QodGhpcy5zZXR0aW5ncy5yZWNlbnRTdG9yYWdlTmFtZSkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5xdWVyeUl0ZW1zID0gcmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWVyeUl0ZW1zID0gW107XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyAvL2Z1bmN0aW9uIHRvIG5hdmlnYXRlIHRocm91Z2ggbGlzdCB3aGVuIHVwIGFuZCBkb3duIGtleWJvYXJkIGtleSBpcyBwcmVzc2VkO1xuICAvLyBwcml2YXRlIG5hdmlnYXRlSW5MaXN0KGtleUNvZGU6IG51bWJlcik6IGFueSB7XG4gIC8vICAgICBsZXQgYXJyYXlJbmRleDogbnVtYmVyID0gMDtcbiAgLy8gICAgIC8vYXJyb3cgZG93blxuICAvLyAgICAgaWYgKGtleUNvZGUgPT09IDQwKSB7XG4gIC8vICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPj0gMCkge1xuICAvLyAgICAgICAgICAgICBhcnJheUluZGV4ID0gKCh0aGlzLnNlbGVjdGVkRGF0YUluZGV4ICsgMSkgPD0gKHRoaXMucXVlcnlJdGVtcy5sZW5ndGggLSAxKSkgPyAodGhpcy5zZWxlY3RlZERhdGFJbmRleCArIDEpIDogMDtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgICAgdGhpcy5hY3RpdmVMaXN0Tm9kZShhcnJheUluZGV4KTtcbiAgLy8gICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gMzgpIHsvL2Fycm93IHVwXG4gIC8vICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPj0gMCkge1xuICAvLyAgICAgICAgICAgICBhcnJheUluZGV4ID0gKCh0aGlzLnNlbGVjdGVkRGF0YUluZGV4IC0gMSkgPj0gMCkgPyAodGhpcy5zZWxlY3RlZERhdGFJbmRleCAtIDEpIDogKHRoaXMucXVlcnlJdGVtcy5sZW5ndGggLSAxKTtcbiAgLy8gICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgICBhcnJheUluZGV4ID0gdGhpcy5xdWVyeUl0ZW1zLmxlbmd0aCAtIDE7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICAgIHRoaXMuYWN0aXZlTGlzdE5vZGUoYXJyYXlJbmRleCk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIHRoaXMucHJvY2Vzc1NlYXJjaFF1ZXJ5KCk7XG4gIC8vICAgICB9XG4gIC8vIH1cblxuICAvLyBmdW5jdGlvbiB0byBleGVjdXRlIHRvIGdldCBsb2NhdGlvbiBkZXRhaWwgYmFzZWQgb24gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50TG9jYXRpb25JbmZvKGxhdGxuZzogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy51c2VHb29nbGVHZW9BcGkpIHtcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuZ2V0R2VvTGF0TG5nRGV0YWlsKGxhdGxuZykudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRoaXMuc2V0UmVjZW50TG9jYXRpb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdldHRpbmdDdXJyZW50TG9jYXRpb25GbGFnID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRMYXRMbmdEZXRhaWwodGhpcy5zZXR0aW5ncy5nZW9MYXRMYW5nU2VydmljZVVybCwgbGF0bG5nLmxhdCwgbGF0bG5nLmxuZykudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZXh0cmFjdFNlcnZlckxpc3QodGhpcy5zZXR0aW5ncy5zZXJ2ZXJSZXNwb25zZWF0TGFuZ0hpZXJhcmNoeSwgcmVzdWx0KTtcbiAgICAgICAgICB0aGlzLnNldFJlY2VudExvY2F0aW9uKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXR0aW5nQ3VycmVudExvY2F0aW9uRmxhZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gcmV0cml2ZSB0aGUgbG9jYXRpb24gaW5mbyBiYXNlZCBvbiBnb292bGUgcGxhY2UgaWQuXG4gIHByaXZhdGUgZ2V0UGxhY2VMb2NhdGlvbkluZm8oc2VsZWN0ZWREYXRhOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLnVzZUdvb2dsZUdlb0FwaSkge1xuICAgICAgdGhpcy5fZ29vZ2xlUGxhY2VzU2VydmljZS5nZXRHZW9QbGFjZURldGFpbChzZWxlY3RlZERhdGEucGxhY2VfaWQpLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuc2V0UmVjZW50TG9jYXRpb24oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldFBsYWNlRGV0YWlscyh0aGlzLnNldHRpbmdzLmdlb0xvY0RldGFpbFNlcnZlclVybCwgc2VsZWN0ZWREYXRhLnBsYWNlX2lkKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5leHRyYWN0U2VydmVyTGlzdCh0aGlzLnNldHRpbmdzLnNlcnZlclJlc3BvbnNlRGV0YWlsSGllcmFyY2h5LCByZXN1bHQpO1xuICAgICAgICAgIHRoaXMuc2V0UmVjZW50TG9jYXRpb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gc3RvcmUgdGhlIHNlbGVjdGVkIHVzZXIgc2VhcmNoIGluIHRoZSBsb2NhbHN0b3JhZ2UuXG4gIHByaXZhdGUgc2V0UmVjZW50TG9jYXRpb24oZGF0YTogYW55KTogYW55IHtcbiAgICBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgZGF0YS5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb24gPyBkYXRhLmRlc2NyaXB0aW9uIDogZGF0YS5mb3JtYXR0ZWRfYWRkcmVzcztcbiAgICBkYXRhLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhSW5kZXggPSAtMTtcbiAgICB0aGlzLmxvY2F0aW9uSW5wdXQgPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIGlmICh0aGlzLnNldHRpbmdzLnNob3dSZWNlbnRTZWFyY2gpIHtcbiAgICAgIHRoaXMuX2dvb2dsZVBsYWNlc1NlcnZpY2UuYWRkUmVjZW50TGlzdCh0aGlzLnNldHRpbmdzLnJlY2VudFN0b3JhZ2VOYW1lLCBkYXRhLCB0aGlzLnNldHRpbmdzLm5vT2ZSZWNlbnRTZWFyY2hTYXZlKTtcbiAgICAgIHRoaXMuZ2V0UmVjZW50TG9jYXRpb25zKCk7XG4gICAgfVxuICAgIHRoaXMudXNlclNlbGVjdGVkT3B0aW9uID0gZGF0YTtcbiAgICAvLyBiZWxvdyBjb2RlIHdpbGwgZXhlY3V0ZSBvbmx5IHdoZW4gdXNlciBwcmVzcyBlbnRlciBvciBzZWxlY3QgYW55IG9wdGlvbiBzZWxlY3Rpb24gYW5kIGl0IGVtaXQgYSBjYWxsYmFjayB0byB0aGUgcGFyZW50IGNvbXBvbmVudC5cbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MucmVzT25TZWFyY2hCdXR0b25DbGlja09ubHkpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVtaXQoZGF0YSk7XG4gICAgICB0aGlzLnRlcm1DaGFuZ2UuZW1pdChkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvLyBmdW5jdGlvbiB0byByZXRyaXZlIHRoZSBzdG9yZWQgcmVjZW50IHVzZXIgc2VhcmNoIGZyb20gdGhlIGxvY2Fsc3RvcmFnZS5cbiAgcHJpdmF0ZSBnZXRSZWNlbnRMb2NhdGlvbnMoKTogYW55IHtcbiAgICB0aGlzLl9nb29nbGVQbGFjZXNTZXJ2aWNlLmdldFJlY2VudExpc3QodGhpcy5zZXR0aW5ncy5yZWNlbnRTdG9yYWdlTmFtZSkudGhlbigoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlY2VudFNlYXJjaERhdGEgPSBkYXRhICYmIGRhdGEubGVuZ3RoID8gZGF0YSA6IFtdO1xuICAgIH0pO1xuICB9XG59XG4iXX0=