tango-app-ui-analyse-trax 3.9.2 → 3.9.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 (470) hide show
  1. package/.eslintrc.json +37 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +12 -25
  4. package/src/lib/components/action-centre/action-centre.component.html +607 -0
  5. package/src/lib/components/action-centre/action-centre.component.scss +185 -0
  6. package/src/lib/components/action-centre/action-centre.component.spec.ts +23 -0
  7. package/src/lib/components/action-centre/action-centre.component.ts +279 -0
  8. package/src/lib/components/activity-log/activity-log.component.html +84 -0
  9. package/src/lib/components/activity-log/activity-log.component.scss +33 -0
  10. package/src/lib/components/activity-log/activity-log.component.spec.ts +23 -0
  11. package/src/lib/components/activity-log/activity-log.component.ts +137 -0
  12. package/src/lib/components/activity-log-v2/activity-log-v2.component.html +189 -0
  13. package/src/lib/components/activity-log-v2/activity-log-v2.component.scss +162 -0
  14. package/src/lib/components/activity-log-v2/activity-log-v2.component.spec.ts +23 -0
  15. package/src/lib/components/activity-log-v2/activity-log-v2.component.ts +517 -0
  16. package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.html +19 -0
  17. package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.scss +148 -0
  18. package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.spec.ts +23 -0
  19. package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.ts +141 -0
  20. package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.html +42 -0
  21. package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.scss +49 -0
  22. package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.spec.ts +23 -0
  23. package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.ts +22 -0
  24. package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.html +724 -0
  25. package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.scss +217 -0
  26. package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.spec.ts +23 -0
  27. package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.ts +122 -0
  28. package/src/lib/components/add-checklist/add-checklist.component.html +1459 -0
  29. package/src/lib/components/add-checklist/add-checklist.component.scss +1205 -0
  30. package/src/lib/components/add-checklist/add-checklist.component.spec.ts +23 -0
  31. package/src/lib/components/add-checklist/add-checklist.component.ts +2460 -0
  32. package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.html +207 -0
  33. package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.scss +213 -0
  34. package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.spec.ts +23 -0
  35. package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.ts +621 -0
  36. package/src/lib/components/add-checklist/counter/counter.component.html +43 -0
  37. package/src/lib/components/add-checklist/counter/counter.component.scss +49 -0
  38. package/src/lib/components/add-checklist/counter/counter.component.spec.ts +23 -0
  39. package/src/lib/components/add-checklist/counter/counter.component.ts +123 -0
  40. package/src/lib/components/add-multitask/add-multitask.component.html +705 -0
  41. package/src/lib/components/add-multitask/add-multitask.component.scss +296 -0
  42. package/src/lib/components/add-multitask/add-multitask.component.spec.ts +23 -0
  43. package/src/lib/components/add-multitask/add-multitask.component.ts +611 -0
  44. package/src/lib/components/add-multitask/ascending-validator.ts +13 -0
  45. package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.html +197 -0
  46. package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.scss +31 -0
  47. package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.spec.ts +23 -0
  48. package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.ts +285 -0
  49. package/src/lib/components/add-multitask/create-task.data.ts +374 -0
  50. package/src/lib/components/add-multitask/create-task.interface.ts +177 -0
  51. package/src/lib/components/add-multitask/unique-string-validator.ts +13 -0
  52. package/src/lib/components/add-multitask/whitespace-validator.ts +11 -0
  53. package/src/lib/components/add-task/add-task.component.html +654 -0
  54. package/src/lib/components/add-task/add-task.component.scss +536 -0
  55. package/src/lib/components/add-task/add-task.component.spec.ts +23 -0
  56. package/src/lib/components/add-task/add-task.component.ts +569 -0
  57. package/src/lib/components/add-task/ascending-validator.ts +13 -0
  58. package/src/lib/components/add-task/create-task.data.ts +374 -0
  59. package/src/lib/components/add-task/create-task.interface.ts +192 -0
  60. package/src/lib/components/add-task/unique-string-validator.ts +13 -0
  61. package/src/lib/components/add-task/whitespace-validator.ts +11 -0
  62. package/src/lib/components/approval-popup/approval-popup.component.html +25 -0
  63. package/src/lib/components/approval-popup/approval-popup.component.scss +3 -0
  64. package/src/lib/components/approval-popup/approval-popup.component.spec.ts +23 -0
  65. package/src/lib/components/approval-popup/approval-popup.component.ts +26 -0
  66. package/src/lib/components/checklist/checklist.component.html +330 -0
  67. package/src/lib/components/checklist/checklist.component.scss +112 -0
  68. package/src/lib/components/checklist/checklist.component.spec.ts +23 -0
  69. package/src/lib/components/checklist/checklist.component.ts +344 -0
  70. package/src/lib/components/checklist-configure/assign/assign.component.html +665 -0
  71. package/src/lib/components/checklist-configure/assign/assign.component.scss +219 -0
  72. package/src/lib/components/checklist-configure/assign/assign.component.spec.ts +23 -0
  73. package/src/lib/components/checklist-configure/assign/assign.component.ts +932 -0
  74. package/src/lib/components/checklist-configure/checklist-configure.component.html +4340 -0
  75. package/src/lib/components/checklist-configure/checklist-configure.component.scss +2338 -0
  76. package/src/lib/components/checklist-configure/checklist-configure.component.spec.ts +23 -0
  77. package/src/lib/components/checklist-configure/checklist-configure.component.ts +4659 -0
  78. package/src/lib/components/checklistlayout/checklistlayout.component.html +30 -0
  79. package/src/lib/components/checklistlayout/checklistlayout.component.scss +15 -0
  80. package/src/lib/components/checklistlayout/checklistlayout.component.spec.ts +23 -0
  81. package/src/lib/components/checklistlayout/checklistlayout.component.ts +47 -0
  82. package/src/lib/components/chip-dropdown/chip-dropdown.component.html +36 -0
  83. package/src/lib/components/chip-dropdown/chip-dropdown.component.scss +97 -0
  84. package/src/lib/components/chip-dropdown/chip-dropdown.component.spec.ts +23 -0
  85. package/src/lib/components/chip-dropdown/chip-dropdown.component.ts +125 -0
  86. package/src/lib/components/create-task/create-task.component.html +2003 -0
  87. package/src/lib/components/create-task/create-task.component.scss +272 -0
  88. package/src/lib/components/create-task/create-task.component.spec.ts +23 -0
  89. package/src/lib/components/create-task/create-task.component.ts +614 -0
  90. package/src/lib/components/create-task/create-task.data.ts +372 -0
  91. package/src/lib/components/create-task/create-task.interface.ts +182 -0
  92. package/src/lib/components/create-task/validators/ascending-validator.ts +13 -0
  93. package/src/lib/components/create-task/validators/unique-string-validator.ts +13 -0
  94. package/src/lib/components/create-task/validators/whitespace-validator.ts +11 -0
  95. package/src/lib/components/custom-select/custom-select.component.html +44 -0
  96. package/src/lib/components/custom-select/custom-select.component.scss +144 -0
  97. package/src/lib/components/custom-select/custom-select.component.spec.ts +23 -0
  98. package/src/lib/components/custom-select/custom-select.component.ts +265 -0
  99. package/src/lib/components/dashboard/dashboard.component.html +1076 -0
  100. package/src/lib/components/dashboard/dashboard.component.scss +237 -0
  101. package/src/lib/components/dashboard/dashboard.component.spec.ts +23 -0
  102. package/src/lib/components/dashboard/dashboard.component.ts +539 -0
  103. package/src/lib/components/dashboard-info/dashboard-info.component.html +1420 -0
  104. package/src/lib/components/dashboard-info/dashboard-info.component.scss +409 -0
  105. package/src/lib/components/dashboard-info/dashboard-info.component.spec.ts +23 -0
  106. package/src/lib/components/dashboard-info/dashboard-info.component.ts +772 -0
  107. package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.html +110 -0
  108. package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.scss +260 -0
  109. package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.spec.ts +23 -0
  110. package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.ts +143 -0
  111. package/src/lib/components/dashboard-layout/dashboard-layout.component.html +1 -0
  112. package/src/lib/components/dashboard-layout/dashboard-layout.component.scss +0 -0
  113. package/src/lib/components/dashboard-layout/dashboard-layout.component.spec.ts +23 -0
  114. package/src/lib/components/dashboard-layout/dashboard-layout.component.ts +10 -0
  115. package/src/lib/components/disabled-select/disabled-select.component.html +44 -0
  116. package/src/lib/components/disabled-select/disabled-select.component.scss +149 -0
  117. package/src/lib/components/disabled-select/disabled-select.component.spec.ts +23 -0
  118. package/src/lib/components/disabled-select/disabled-select.component.ts +146 -0
  119. package/src/lib/components/export-gallery/export-gallery.component.html +175 -0
  120. package/src/lib/components/export-gallery/export-gallery.component.scss +200 -0
  121. package/src/lib/components/export-gallery/export-gallery.component.spec.ts +23 -0
  122. package/src/lib/components/export-gallery/export-gallery.component.ts +263 -0
  123. package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.html +36 -0
  124. package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.scss +97 -0
  125. package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.spec.ts +23 -0
  126. package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.ts +104 -0
  127. package/src/lib/components/eye-test-audit/custom-select/custom-select.component.html +44 -0
  128. package/src/lib/components/eye-test-audit/custom-select/custom-select.component.scss +144 -0
  129. package/src/lib/components/eye-test-audit/custom-select/custom-select.component.spec.ts +23 -0
  130. package/src/lib/components/eye-test-audit/custom-select/custom-select.component.ts +265 -0
  131. package/src/lib/components/eye-test-audit/eye-test/eye-test.component.html +1804 -0
  132. package/src/lib/components/eye-test-audit/eye-test/eye-test.component.scss +806 -0
  133. package/src/lib/components/eye-test-audit/eye-test/eye-test.component.spec.ts +23 -0
  134. package/src/lib/components/eye-test-audit/eye-test/eye-test.component.ts +1890 -0
  135. package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.html +25 -0
  136. package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.scss +0 -0
  137. package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.spec.ts +23 -0
  138. package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.ts +20 -0
  139. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.ts +26 -0
  140. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.html +1 -0
  141. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.scss +0 -0
  142. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.spec.ts +23 -0
  143. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.ts +24 -0
  144. package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.ts +44 -0
  145. package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.html +490 -0
  146. package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.scss +721 -0
  147. package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.spec.ts +23 -0
  148. package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.ts +1017 -0
  149. package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.html +708 -0
  150. package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.scss +247 -0
  151. package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.spec.ts +23 -0
  152. package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.ts +446 -0
  153. package/src/lib/components/eye-test-audit/group-select/group-select.component.html +44 -0
  154. package/src/lib/components/eye-test-audit/group-select/group-select.component.scss +144 -0
  155. package/src/lib/components/eye-test-audit/group-select/group-select.component.spec.ts +23 -0
  156. package/src/lib/components/eye-test-audit/group-select/group-select.component.ts +147 -0
  157. package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.html +18 -0
  158. package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.scss +49 -0
  159. package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.spec.ts +23 -0
  160. package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.ts +104 -0
  161. package/src/lib/components/eye-test-audit/select-drop/select-drop.component.html +44 -0
  162. package/src/lib/components/eye-test-audit/select-drop/select-drop.component.scss +144 -0
  163. package/src/lib/components/eye-test-audit/select-drop/select-drop.component.spec.ts +23 -0
  164. package/src/lib/components/eye-test-audit/select-drop/select-drop.component.ts +152 -0
  165. package/src/lib/components/eye-test-audit/services/eye-test-audit.service.spec.ts +16 -0
  166. package/src/lib/components/eye-test-audit/services/eye-test-audit.service.ts +190 -0
  167. package/src/lib/components/flag-layout/flag-layout.component.html +1 -0
  168. package/src/lib/components/flag-layout/flag-layout.component.scss +0 -0
  169. package/src/lib/components/flag-layout/flag-layout.component.spec.ts +23 -0
  170. package/src/lib/components/flag-layout/flag-layout.component.ts +10 -0
  171. package/src/lib/components/flags/flags.component.html +473 -0
  172. package/src/lib/components/flags/flags.component.scss +86 -0
  173. package/src/lib/components/flags/flags.component.spec.ts +23 -0
  174. package/src/lib/components/flags/flags.component.ts +280 -0
  175. package/{lib/components/flags/flags.interface.d.ts → src/lib/components/flags/flags.interface.ts} +73 -65
  176. package/src/lib/components/flags-info/flags-info.component.html +6012 -0
  177. package/src/lib/components/flags-info/flags-info.component.scss +278 -0
  178. package/src/lib/components/flags-info/flags-info.component.spec.ts +23 -0
  179. package/src/lib/components/flags-info/flags-info.component.ts +490 -0
  180. package/src/lib/components/flags-info/flags-info.interface.ts +441 -0
  181. package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.html +1 -0
  182. package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.scss +4 -0
  183. package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.ts +78 -0
  184. package/src/lib/components/flags-new/flags-new.component.html +904 -0
  185. package/src/lib/components/flags-new/flags-new.component.scss +121 -0
  186. package/src/lib/components/flags-new/flags-new.component.spec.ts +23 -0
  187. package/src/lib/components/flags-new/flags-new.component.ts +357 -0
  188. package/{lib/components/flags-new/flags-new.interface.d.ts → src/lib/components/flags-new/flags-new.interface.ts} +90 -81
  189. package/src/lib/components/gallery/gallery.component.html +3660 -0
  190. package/src/lib/components/gallery/gallery.component.scss +930 -0
  191. package/src/lib/components/gallery/gallery.component.ts +3527 -0
  192. package/src/lib/components/group-select/group-select.component.html +44 -0
  193. package/src/lib/components/group-select/group-select.component.scss +144 -0
  194. package/src/lib/components/group-select/group-select.component.spec.ts +23 -0
  195. package/src/lib/components/group-select/group-select.component.ts +145 -0
  196. package/src/lib/components/image-popup/image-popup.component.html +11 -0
  197. package/src/lib/components/image-popup/image-popup.component.scss +5 -0
  198. package/src/lib/components/image-popup/image-popup.component.ts +18 -0
  199. package/src/lib/components/lib/custom-select/custom-select.component.html +42 -0
  200. package/src/lib/components/lib/custom-select/custom-select.component.scss +131 -0
  201. package/src/lib/components/lib/custom-select/custom-select.component.spec.ts +23 -0
  202. package/src/lib/components/lib/custom-select/custom-select.component.ts +151 -0
  203. package/src/lib/components/manage-task/manage-task.component.html +265 -0
  204. package/src/lib/components/manage-task/manage-task.component.scss +69 -0
  205. package/src/lib/components/manage-task/manage-task.component.spec.ts +23 -0
  206. package/src/lib/components/manage-task/manage-task.component.ts +267 -0
  207. package/src/lib/components/managechecklist/managechecklist.component.html +176 -0
  208. package/src/lib/components/managechecklist/managechecklist.component.scss +43 -0
  209. package/src/lib/components/managechecklist/managechecklist.component.spec.ts +23 -0
  210. package/src/lib/components/managechecklist/managechecklist.component.ts +176 -0
  211. package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.html +46 -0
  212. package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.scss +181 -0
  213. package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.spec.ts +23 -0
  214. package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.ts +221 -0
  215. package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.html +36 -0
  216. package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.scss +89 -0
  217. package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.spec.ts +23 -0
  218. package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.ts +118 -0
  219. package/src/lib/components/orders/orders.component.html +203 -0
  220. package/src/lib/components/orders/orders.component.scss +180 -0
  221. package/src/lib/components/orders/orders.component.spec.ts +25 -0
  222. package/src/lib/components/orders/orders.component.ts +197 -0
  223. package/src/lib/components/pagination/pagination.component.html +28 -0
  224. package/src/lib/components/pagination/pagination.component.scss +6 -0
  225. package/src/lib/components/pagination/pagination.component.spec.ts +23 -0
  226. package/src/lib/components/pagination/pagination.component.ts +54 -0
  227. package/src/lib/components/reactive-select/reactive-select.component.html +18 -0
  228. package/src/lib/components/reactive-select/reactive-select.component.scss +48 -0
  229. package/src/lib/components/reactive-select/reactive-select.component.spec.ts +23 -0
  230. package/src/lib/components/reactive-select/reactive-select.component.ts +104 -0
  231. package/src/lib/components/reports/date-picker/date-picker.component.html +54 -0
  232. package/src/lib/components/reports/date-picker/date-picker.component.scss +156 -0
  233. package/src/lib/components/reports/date-picker/date-picker.component.spec.ts +23 -0
  234. package/src/lib/components/reports/date-picker/date-picker.component.ts +60 -0
  235. package/src/lib/components/reports/reports.component.html +225 -0
  236. package/src/lib/components/reports/reports.component.scss +69 -0
  237. package/src/lib/components/reports/reports.component.spec.ts +23 -0
  238. package/src/lib/components/reports/reports.component.ts +334 -0
  239. package/{lib/components/reports/reports.interface.d.ts → src/lib/components/reports/reports.interface.ts} +50 -46
  240. package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.html +1 -0
  241. package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.scss +15 -0
  242. package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.spec.ts +23 -0
  243. package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.ts +31 -0
  244. package/src/lib/components/task/task.component.html +322 -0
  245. package/src/lib/components/task/task.component.scss +169 -0
  246. package/src/lib/components/task/task.component.spec.ts +23 -0
  247. package/src/lib/components/task/task.component.ts +340 -0
  248. package/src/lib/components/task-configure/task-configure.component.html +737 -0
  249. package/src/lib/components/task-configure/task-configure.component.scss +569 -0
  250. package/src/lib/components/task-configure/task-configure.component.spec.ts +23 -0
  251. package/src/lib/components/task-configure/task-configure.component.ts +1603 -0
  252. package/src/lib/components/task-configure/task-configure.interface.ts +138 -0
  253. package/src/lib/components/task-info/task-info.component.html +390 -0
  254. package/src/lib/components/task-info/task-info.component.scss +56 -0
  255. package/src/lib/components/task-info/task-info.component.spec.ts +23 -0
  256. package/src/lib/components/task-info/task-info.component.ts +400 -0
  257. package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.html +141 -0
  258. package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.scss +460 -0
  259. package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.spec.ts +23 -0
  260. package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.ts +202 -0
  261. package/src/lib/components/task-layout/task-layout.component.html +1 -0
  262. package/src/lib/components/task-layout/task-layout.component.scss +0 -0
  263. package/src/lib/components/task-layout/task-layout.component.spec.ts +23 -0
  264. package/src/lib/components/task-layout/task-layout.component.ts +10 -0
  265. package/src/lib/components/task-logs/task-logs.component.html +97 -0
  266. package/src/lib/components/task-logs/task-logs.component.scss +301 -0
  267. package/src/lib/components/task-logs/task-logs.component.spec.ts +23 -0
  268. package/src/lib/components/task-logs/task-logs.component.ts +80 -0
  269. package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.html +84 -0
  270. package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.scss +229 -0
  271. package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.spec.ts +23 -0
  272. package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.ts +111 -0
  273. package/src/lib/components/trax-store/trax-store.component.html +78 -0
  274. package/src/lib/components/trax-store/trax-store.component.scss +134 -0
  275. package/src/lib/components/trax-store/trax-store.component.spec.ts +23 -0
  276. package/src/lib/components/trax-store/trax-store.component.ts +172 -0
  277. package/src/lib/components/traxpopup/traxpopup.component.html +130 -0
  278. package/src/lib/components/traxpopup/traxpopup.component.scss +225 -0
  279. package/src/lib/components/traxpopup/traxpopup.component.spec.ts +23 -0
  280. package/src/lib/components/traxpopup/traxpopup.component.ts +71 -0
  281. package/src/lib/services/trax.service.spec.ts +16 -0
  282. package/src/lib/services/trax.service.ts +789 -0
  283. package/src/lib/tango-analyse-trax-routing.module.ts +151 -0
  284. package/src/lib/tango-analyse-trax.module.ts +140 -0
  285. package/{public-api.d.ts → src/public-api.ts} +6 -2
  286. package/tsconfig.lib.json +14 -0
  287. package/tsconfig.lib.prod.json +10 -0
  288. package/tsconfig.spec.json +14 -0
  289. package/esm2022/lib/components/action-centre/action-centre.component.mjs +0 -288
  290. package/esm2022/lib/components/activity-log/activity-log.component.mjs +0 -150
  291. package/esm2022/lib/components/activity-log-v2/activity-log-v2.component.mjs +0 -502
  292. package/esm2022/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.mjs +0 -114
  293. package/esm2022/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.mjs +0 -24
  294. package/esm2022/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.mjs +0 -126
  295. package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +0 -2352
  296. package/esm2022/lib/components/add-checklist/checklist-popup/checklist-popup.component.mjs +0 -612
  297. package/esm2022/lib/components/add-checklist/counter/counter.component.mjs +0 -138
  298. package/esm2022/lib/components/add-multitask/add-multitask.component.mjs +0 -604
  299. package/esm2022/lib/components/add-multitask/ascending-validator.mjs +0 -11
  300. package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs +0 -297
  301. package/esm2022/lib/components/add-multitask/create-task.data.mjs +0 -372
  302. package/esm2022/lib/components/add-multitask/create-task.interface.mjs +0 -2
  303. package/esm2022/lib/components/add-multitask/unique-string-validator.mjs +0 -10
  304. package/esm2022/lib/components/add-multitask/whitespace-validator.mjs +0 -10
  305. package/esm2022/lib/components/add-task/add-task.component.mjs +0 -561
  306. package/esm2022/lib/components/add-task/ascending-validator.mjs +0 -11
  307. package/esm2022/lib/components/add-task/create-task.data.mjs +0 -372
  308. package/esm2022/lib/components/add-task/create-task.interface.mjs +0 -2
  309. package/esm2022/lib/components/add-task/unique-string-validator.mjs +0 -10
  310. package/esm2022/lib/components/add-task/whitespace-validator.mjs +0 -10
  311. package/esm2022/lib/components/approval-popup/approval-popup.component.mjs +0 -30
  312. package/esm2022/lib/components/checklist/checklist.component.mjs +0 -327
  313. package/esm2022/lib/components/checklist-configure/assign/assign.component.mjs +0 -912
  314. package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +0 -4161
  315. package/esm2022/lib/components/checklistlayout/checklistlayout.component.mjs +0 -44
  316. package/esm2022/lib/components/chip-dropdown/chip-dropdown.component.mjs +0 -120
  317. package/esm2022/lib/components/create-task/create-task.component.mjs +0 -585
  318. package/esm2022/lib/components/create-task/create-task.data.mjs +0 -372
  319. package/esm2022/lib/components/create-task/create-task.interface.mjs +0 -2
  320. package/esm2022/lib/components/create-task/validators/ascending-validator.mjs +0 -11
  321. package/esm2022/lib/components/create-task/validators/unique-string-validator.mjs +0 -10
  322. package/esm2022/lib/components/create-task/validators/whitespace-validator.mjs +0 -10
  323. package/esm2022/lib/components/custom-select/custom-select.component.mjs +0 -240
  324. package/esm2022/lib/components/dashboard/dashboard.component.mjs +0 -532
  325. package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +0 -741
  326. package/esm2022/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.mjs +0 -155
  327. package/esm2022/lib/components/dashboard-layout/dashboard-layout.component.mjs +0 -12
  328. package/esm2022/lib/components/disabled-select/disabled-select.component.mjs +0 -158
  329. package/esm2022/lib/components/export-gallery/export-gallery.component.mjs +0 -266
  330. package/esm2022/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.mjs +0 -105
  331. package/esm2022/lib/components/eye-test-audit/custom-select/custom-select.component.mjs +0 -240
  332. package/esm2022/lib/components/eye-test-audit/eye-test/eye-test.component.mjs +0 -1733
  333. package/esm2022/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.mjs +0 -24
  334. package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.mjs +0 -34
  335. package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.mjs +0 -27
  336. package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.mjs +0 -71
  337. package/esm2022/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.mjs +0 -823
  338. package/esm2022/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.mjs +0 -412
  339. package/esm2022/lib/components/eye-test-audit/group-select/group-select.component.mjs +0 -157
  340. package/esm2022/lib/components/eye-test-audit/reactive-select/reactive-select.component.mjs +0 -105
  341. package/esm2022/lib/components/eye-test-audit/select-drop/select-drop.component.mjs +0 -162
  342. package/esm2022/lib/components/eye-test-audit/services/eye-test-audit.service.mjs +0 -166
  343. package/esm2022/lib/components/flag-layout/flag-layout.component.mjs +0 -12
  344. package/esm2022/lib/components/flags/flags.component.mjs +0 -263
  345. package/esm2022/lib/components/flags/flags.interface.mjs +0 -2
  346. package/esm2022/lib/components/flags-info/flags-info.component.mjs +0 -452
  347. package/esm2022/lib/components/flags-info/flags-info.interface.mjs +0 -2
  348. package/esm2022/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.mjs +0 -71
  349. package/esm2022/lib/components/flags-new/flags-new.component.mjs +0 -335
  350. package/esm2022/lib/components/flags-new/flags-new.interface.mjs +0 -2
  351. package/esm2022/lib/components/gallery/gallery.component.mjs +0 -3402
  352. package/esm2022/lib/components/group-select/group-select.component.mjs +0 -155
  353. package/esm2022/lib/components/image-popup/image-popup.component.mjs +0 -25
  354. package/esm2022/lib/components/lib/custom-select/custom-select.component.mjs +0 -158
  355. package/esm2022/lib/components/manage-task/manage-task.component.mjs +0 -264
  356. package/esm2022/lib/components/managechecklist/managechecklist.component.mjs +0 -186
  357. package/esm2022/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.mjs +0 -229
  358. package/esm2022/lib/components/multi-date-datepicker/multi-date-datepicker.component.mjs +0 -124
  359. package/esm2022/lib/components/orders/orders.component.mjs +0 -171
  360. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -62
  361. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +0 -108
  362. package/esm2022/lib/components/reports/date-picker/date-picker.component.mjs +0 -60
  363. package/esm2022/lib/components/reports/reports.component.mjs +0 -300
  364. package/esm2022/lib/components/reports/reports.interface.mjs +0 -2
  365. package/esm2022/lib/components/tango-analyse-trax/tango-analyse-trax.component.mjs +0 -32
  366. package/esm2022/lib/components/task/task.component.mjs +0 -341
  367. package/esm2022/lib/components/task-configure/task-configure.component.mjs +0 -1532
  368. package/esm2022/lib/components/task-configure/task-configure.interface.mjs +0 -2
  369. package/esm2022/lib/components/task-info/task-info.component.mjs +0 -375
  370. package/esm2022/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.mjs +0 -208
  371. package/esm2022/lib/components/task-layout/task-layout.component.mjs +0 -12
  372. package/esm2022/lib/components/task-logs/task-logs.component.mjs +0 -104
  373. package/esm2022/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.mjs +0 -107
  374. package/esm2022/lib/components/trax-store/trax-store.component.mjs +0 -179
  375. package/esm2022/lib/components/traxpopup/traxpopup.component.mjs +0 -70
  376. package/esm2022/lib/services/trax.service.mjs +0 -559
  377. package/esm2022/lib/tango-analyse-trax-routing.module.mjs +0 -153
  378. package/esm2022/lib/tango-analyse-trax.module.mjs +0 -221
  379. package/esm2022/public-api.mjs +0 -6
  380. package/esm2022/tango-app-ui-analyse-trax.mjs +0 -5
  381. package/fesm2022/tango-app-ui-analyse-trax.mjs +0 -28896
  382. package/fesm2022/tango-app-ui-analyse-trax.mjs.map +0 -1
  383. package/index.d.ts +0 -5
  384. package/lib/components/action-centre/action-centre.component.d.ts +0 -68
  385. package/lib/components/activity-log/activity-log.component.d.ts +0 -39
  386. package/lib/components/activity-log-v2/activity-log-v2.component.d.ts +0 -78
  387. package/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.d.ts +0 -24
  388. package/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.d.ts +0 -9
  389. package/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.d.ts +0 -34
  390. package/lib/components/add-checklist/add-checklist.component.d.ts +0 -121
  391. package/lib/components/add-checklist/checklist-popup/checklist-popup.component.d.ts +0 -45
  392. package/lib/components/add-checklist/counter/counter.component.d.ts +0 -29
  393. package/lib/components/add-multitask/add-multitask.component.d.ts +0 -102
  394. package/lib/components/add-multitask/ascending-validator.d.ts +0 -2
  395. package/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.d.ts +0 -45
  396. package/lib/components/add-multitask/create-task.data.d.ts +0 -293
  397. package/lib/components/add-multitask/create-task.interface.d.ts +0 -159
  398. package/lib/components/add-multitask/unique-string-validator.d.ts +0 -2
  399. package/lib/components/add-multitask/whitespace-validator.d.ts +0 -2
  400. package/lib/components/add-task/add-task.component.d.ts +0 -89
  401. package/lib/components/add-task/ascending-validator.d.ts +0 -2
  402. package/lib/components/add-task/create-task.data.d.ts +0 -293
  403. package/lib/components/add-task/create-task.interface.d.ts +0 -161
  404. package/lib/components/add-task/unique-string-validator.d.ts +0 -2
  405. package/lib/components/add-task/whitespace-validator.d.ts +0 -2
  406. package/lib/components/approval-popup/approval-popup.component.d.ts +0 -14
  407. package/lib/components/checklist/checklist.component.d.ts +0 -40
  408. package/lib/components/checklist-configure/assign/assign.component.d.ts +0 -105
  409. package/lib/components/checklist-configure/checklist-configure.component.d.ts +0 -325
  410. package/lib/components/checklistlayout/checklistlayout.component.d.ts +0 -15
  411. package/lib/components/chip-dropdown/chip-dropdown.component.d.ts +0 -28
  412. package/lib/components/create-task/create-task.component.d.ts +0 -76
  413. package/lib/components/create-task/create-task.data.d.ts +0 -293
  414. package/lib/components/create-task/create-task.interface.d.ts +0 -163
  415. package/lib/components/create-task/validators/ascending-validator.d.ts +0 -2
  416. package/lib/components/create-task/validators/unique-string-validator.d.ts +0 -2
  417. package/lib/components/create-task/validators/whitespace-validator.d.ts +0 -2
  418. package/lib/components/custom-select/custom-select.component.d.ts +0 -35
  419. package/lib/components/dashboard/dashboard.component.d.ts +0 -80
  420. package/lib/components/dashboard-info/dashboard-info.component.d.ts +0 -117
  421. package/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.d.ts +0 -41
  422. package/lib/components/dashboard-layout/dashboard-layout.component.d.ts +0 -5
  423. package/lib/components/disabled-select/disabled-select.component.d.ts +0 -34
  424. package/lib/components/export-gallery/export-gallery.component.d.ts +0 -44
  425. package/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.d.ts +0 -26
  426. package/lib/components/eye-test-audit/custom-select/custom-select.component.d.ts +0 -35
  427. package/lib/components/eye-test-audit/eye-test/eye-test.component.d.ts +0 -218
  428. package/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.d.ts +0 -12
  429. package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.d.ts +0 -7
  430. package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.d.ts +0 -11
  431. package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.d.ts +0 -21
  432. package/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.d.ts +0 -129
  433. package/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.d.ts +0 -86
  434. package/lib/components/eye-test-audit/group-select/group-select.component.d.ts +0 -33
  435. package/lib/components/eye-test-audit/reactive-select/reactive-select.component.d.ts +0 -32
  436. package/lib/components/eye-test-audit/select-drop/select-drop.component.d.ts +0 -33
  437. package/lib/components/eye-test-audit/services/eye-test-audit.service.d.ts +0 -47
  438. package/lib/components/flag-layout/flag-layout.component.d.ts +0 -5
  439. package/lib/components/flags/flags.component.d.ts +0 -52
  440. package/lib/components/flags-info/flags-info.component.d.ts +0 -73
  441. package/lib/components/flags-info/flags-info.interface.d.ts +0 -430
  442. package/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.d.ts +0 -13
  443. package/lib/components/flags-new/flags-new.component.d.ts +0 -60
  444. package/lib/components/gallery/gallery.component.d.ts +0 -261
  445. package/lib/components/group-select/group-select.component.d.ts +0 -33
  446. package/lib/components/image-popup/image-popup.component.d.ts +0 -11
  447. package/lib/components/lib/custom-select/custom-select.component.d.ts +0 -33
  448. package/lib/components/manage-task/manage-task.component.d.ts +0 -47
  449. package/lib/components/managechecklist/managechecklist.component.d.ts +0 -33
  450. package/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.d.ts +0 -40
  451. package/lib/components/multi-date-datepicker/multi-date-datepicker.component.d.ts +0 -27
  452. package/lib/components/orders/orders.component.d.ts +0 -38
  453. package/lib/components/pagination/pagination.component.d.ts +0 -16
  454. package/lib/components/reactive-select/reactive-select.component.d.ts +0 -32
  455. package/lib/components/reports/date-picker/date-picker.component.d.ts +0 -23
  456. package/lib/components/reports/reports.component.d.ts +0 -55
  457. package/lib/components/tango-analyse-trax/tango-analyse-trax.component.d.ts +0 -14
  458. package/lib/components/task/task.component.d.ts +0 -70
  459. package/lib/components/task-configure/task-configure.component.d.ts +0 -142
  460. package/lib/components/task-configure/task-configure.interface.d.ts +0 -128
  461. package/lib/components/task-info/task-info.component.d.ts +0 -76
  462. package/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.d.ts +0 -61
  463. package/lib/components/task-layout/task-layout.component.d.ts +0 -5
  464. package/lib/components/task-logs/task-logs.component.d.ts +0 -27
  465. package/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.d.ts +0 -26
  466. package/lib/components/trax-store/trax-store.component.d.ts +0 -45
  467. package/lib/components/traxpopup/traxpopup.component.d.ts +0 -24
  468. package/lib/services/trax.service.d.ts +0 -175
  469. package/lib/tango-analyse-trax-routing.module.d.ts +0 -7
  470. package/lib/tango-analyse-trax.module.d.ts +0 -68
@@ -1,1532 +0,0 @@
1
- import { Component, ViewChild } from '@angular/core';
2
- import customParseFormat from 'dayjs/plugin/customParseFormat';
3
- import { BehaviorSubject, Subject, debounceTime, distinctUntilChanged, takeUntil } from "rxjs";
4
- import dayjs from 'dayjs';
5
- import utc from 'dayjs/plugin/utc';
6
- import { FormControl } from '@angular/forms';
7
- import { TraxStoreComponent } from '../trax-store/trax-store.component';
8
- import * as XLSX from 'xlsx';
9
- import { TraxpopupComponent } from '../traxpopup/traxpopup.component';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/router";
12
- import * as i2 from "tango-app-ui-global";
13
- import * as i3 from "../../services/trax.service";
14
- import * as i4 from "@ng-bootstrap/ng-bootstrap";
15
- import * as i5 from "tango-app-ui-shared";
16
- import * as i6 from "@angular/forms";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "ngx-daterangepicker-material";
19
- import * as i9 from "../chip-dropdown/chip-dropdown.component";
20
- import * as i10 from "../multi-chip-dropdown/multi-chip-dropdown.component";
21
- dayjs.extend(utc);
22
- dayjs.extend(customParseFormat);
23
- export class TaskConfigureComponent {
24
- route;
25
- pageInfo;
26
- traxService;
27
- dialog;
28
- toastService;
29
- router;
30
- cd;
31
- fb;
32
- destroy$ = new Subject();
33
- dayjs = dayjs;
34
- scheduleDate;
35
- minDate = this.dayjs().format();
36
- scheduleEndTime = new FormControl(this.getCurrentTime());
37
- currentTaskId;
38
- headerData;
39
- taskDetails;
40
- approver = new FormControl();
41
- priorityType = new FormControl('high');
42
- allowedStoreLocation = new FormControl(false);
43
- restrictAttendance = new FormControl(false);
44
- approversList;
45
- assignTableApiState = new BehaviorSubject('loading');
46
- assignTableData;
47
- itemsPerPage = 5;
48
- currentPage = 1;
49
- totalItems = 0;
50
- configData;
51
- storeCoverage = true;
52
- userCoverage = false;
53
- reupload = false;
54
- userData = [];
55
- listofId;
56
- excelUserData = [];
57
- assignType;
58
- initialLoading = true;
59
- assignSingle;
60
- assignGroup;
61
- singleAssign;
62
- groupAssign;
63
- paginationSizes = [5, 10, 20, 30];
64
- pageSize = 5;
65
- searchInput = new FormControl('');
66
- selectAllInput = new FormControl(false);
67
- removedUsers = new Set();
68
- added = [];
69
- removed = [];
70
- fileInput;
71
- fileInput1;
72
- bulkupload;
73
- afterValidation;
74
- confirmUser;
75
- reminderRepeatSchedules;
76
- reminderRepeatScheduleOptions = [30, 45, 60, 75, 90];
77
- constructor(route, pageInfo, traxService, dialog, toastService, router, cd, fb) {
78
- this.route = route;
79
- this.pageInfo = pageInfo;
80
- this.traxService = traxService;
81
- this.dialog = dialog;
82
- this.toastService = toastService;
83
- this.router = router;
84
- this.cd = cd;
85
- this.fb = fb;
86
- this.headerData = JSON.parse(localStorage.getItem('header-filters'));
87
- this.searchInput.valueChanges.pipe(takeUntil(this.destroy$)).pipe(debounceTime(1000), distinctUntilChanged()).subscribe((val) => {
88
- if (val === null || val === undefined) {
89
- return;
90
- }
91
- });
92
- this.selectAllInput.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((val) => {
93
- if (val === null || val === undefined) {
94
- return;
95
- }
96
- if (val) {
97
- this.assignTableData?.forEach(val => val.checkFlag = true);
98
- this.removedUsers.clear();
99
- }
100
- else {
101
- this.assignTableData?.forEach(val => { val.checkFlag = false, this.onUserAssignChange(val.checkFlag, val.id); });
102
- }
103
- });
104
- this.reminderRepeatSchedules = this.fb.array([]);
105
- }
106
- ngOnDestroy() {
107
- this.destroy$.next(true);
108
- this.destroy$.complete();
109
- }
110
- ngOnInit() {
111
- this.scheduleDate = { startDate: this.dayjs().format('DD-MM-YYYY'), endDate: this.dayjs().format('DD-MM-YYYY') };
112
- this.setPageData();
113
- this.route.queryParams
114
- .pipe(takeUntil(this.destroy$))
115
- .subscribe((params) => {
116
- if (params?.taskId) {
117
- this.currentTaskId = params.taskId;
118
- this.getTask(this.currentTaskId);
119
- this.getClientUser();
120
- this.selectInitialTab();
121
- }
122
- });
123
- }
124
- setPageData() {
125
- this.pageInfo.setTitle("Tasks");
126
- this.pageInfo.setDescription("");
127
- this.pageInfo.setBreadcrumbs([
128
- { title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: false },
129
- { title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: true }
130
- ]);
131
- }
132
- getTask(id) {
133
- this.traxService.getTaskconfig(id, this.headerData?.client).pipe(takeUntil(this.destroy$)).subscribe({
134
- next: (res) => {
135
- if (res?.code === 200) {
136
- this.configData = res?.data;
137
- this.taskDetails = res.data.checkListDetails;
138
- this.taskDetails.assign = [];
139
- // this.idList = this.configData.checkListDetails.assignedusers;
140
- // this.listofId = this.configData.checkListDetails.assignedusers;
141
- this.coverage = this.configData.checkListDetails.coverage;
142
- this.selectRadio(this.coverage);
143
- if (this.taskDetails?.scheduleDate) {
144
- if (dayjs(this.taskDetails.scheduleDate).isBefore(dayjs())) {
145
- this.minDate = this.dayjs(this.taskDetails.scheduleDate).format();
146
- }
147
- this.scheduleDate = { startDate: this.dayjs(this.taskDetails.scheduleDate).utc().format('DD-MM-YYYY'), endDate: this.dayjs(this.taskDetails.scheduleDate).utc().format('DD-MM-YYYY') };
148
- }
149
- if (!this.taskDetails?.removedUsers?.length) {
150
- this.selectAllInput.setValue(true, { emitEvent: false });
151
- }
152
- if (this.taskDetails?.scheduleEndTime) {
153
- this.scheduleEndTime.setValue(dayjs(this.taskDetails?.scheduleEndTime, 'hh:mm A').format('HH:mm'));
154
- }
155
- if (this.taskDetails?.approver?.length) {
156
- this.approver.setValue(this.taskDetails?.approver);
157
- }
158
- if (this.taskDetails?.priorityType) {
159
- this.priorityType.setValue(this.taskDetails?.priorityType);
160
- }
161
- if (this.taskDetails?.allowedStoreLocation === true || this.taskDetails?.allowedStoreLocation === false) {
162
- this.allowedStoreLocation.setValue(this.taskDetails?.allowedStoreLocation);
163
- }
164
- if (this.taskDetails?.restrictAttendance === true || this.taskDetails?.restrictAttendance === false) {
165
- this.restrictAttendance.setValue(this.taskDetails?.restrictAttendance);
166
- }
167
- if (this.taskDetails?.remainder?.length) {
168
- this.reminderRepeatSchedules.clear();
169
- this.taskDetails?.remainder.forEach((item) => {
170
- this.reminderRepeatSchedules.push(this.fb.control(item));
171
- });
172
- }
173
- }
174
- }
175
- });
176
- }
177
- selectedTab(value) {
178
- this.tableArray = [];
179
- this.assignTableData = [];
180
- this.assignType = value;
181
- this.currentPage = 1;
182
- this.pageSize = 5;
183
- this.searchInput.setValue('');
184
- this.configData.checkListDetails.assign = [];
185
- this.getassignDropdown();
186
- }
187
- selectInitialTab() {
188
- this.storeCoverage ? this.assignType = 'store' : this.assignType = 'user';
189
- }
190
- getCurrentTime() {
191
- // const now = new Date();
192
- // const hours = now.getHours().toString().padStart(2, '0');
193
- // const minutes = now.getMinutes().toString().padStart(2, '0');
194
- // return `${hours}:${minutes}`;
195
- return '23:59';
196
- }
197
- get dueDateFormatted() {
198
- return this.dayjs(this.scheduleDate.startDate, 'DD-MM-YYYY')?.format('DD MMM YYYY');
199
- }
200
- get dueTimeFormatted() {
201
- return dayjs(this.scheduleEndTime.value, 'HH:mm').format('h:mm A');
202
- }
203
- getClientUser() {
204
- this.traxService.getClientUser(this.headerData.client).pipe(takeUntil(this.destroy$)).subscribe((res) => {
205
- if (res && res.code == 200 && res.data.length) {
206
- this.approversList = res.data.map((item) => { return { name: item.userName, value: item.email, role: item.role }; });
207
- if (!this.taskDetails?.approver?.length) {
208
- let userInfo = JSON.parse(localStorage.getItem('user-info') || '{}');
209
- if (userInfo?.userType == 'tango' || (userInfo?.userType == 'client' && userInfo?.role == 'user')) {
210
- let userList = this.approversList.find((ele) => ele.role == 'superadmin');
211
- if (userList) {
212
- this.approver.setValue([{ name: userList.name, value: userList.value }]);
213
- }
214
- }
215
- else {
216
- this.approver.setValue([this.approversList.find((ele) => ele.value == userInfo.email)]);
217
- }
218
- }
219
- }
220
- else {
221
- this.approversList = [];
222
- }
223
- });
224
- }
225
- onSubmit(action) {
226
- const payload = {
227
- scheduleDate: this.dayjs(this.scheduleDate.startDate, 'DD-MM-YYYY').format('YYYY-MM-DD'),
228
- scheduleEndTime: this.dayjs(this.scheduleEndTime.value, 'HH:mm').format('hh:mm A'),
229
- approver: this.approver.value ?? [],
230
- priorityType: this.priorityType.value,
231
- allowedStoreLocation: this.allowedStoreLocation.value,
232
- restrictAttendance: this.restrictAttendance.value,
233
- clientId: this.headerData?.client,
234
- submitType: action,
235
- _id: this.taskDetails?._id,
236
- removedUsers: [...this.removedUsers],
237
- remainder: this.reminderRepeatSchedules?.value || [],
238
- ...(action === 'publish') ? { publish: true } : { publish: false },
239
- assignedUsers: [...this.singleAssign, ...this.groupAssign],
240
- storeCount: this.assignSingle?.length + this.groupAssign?.length,
241
- coverage: this.coverage,
242
- added: this.added,
243
- removed: this.removed
244
- };
245
- if (action === 'publish') {
246
- let popupcontent = {
247
- displayprop: false,
248
- imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#D1FADF"/><path d="M38 27.0818V28.0018C37.9988 30.1582 37.3005 32.2565 36.0093 33.9836C34.7182 35.7108 32.9033 36.9743 30.8354 37.5857C28.7674 38.1971 26.5573 38.1237 24.5345 37.3764C22.5117 36.6291 20.7847 35.2479 19.611 33.4389C18.4373 31.6299 17.8798 29.4899 18.0217 27.3381C18.1636 25.1864 18.9972 23.1381 20.3983 21.4989C21.7994 19.8596 23.6928 18.7172 25.7962 18.242C27.8996 17.7667 30.1003 17.9842 32.07 18.8618M38 20.0018L28 30.0118L25 27.0118" stroke="#039855" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#ECFDF3" stroke-width="8"/></svg>`,
249
- title: `Are you sure you want to publish ${this.taskDetails?.checkListName} task?`,
250
- content: `Publishing will make this task live, and changes will take effect immediately.`,
251
- buttontype: 'confirm'
252
- };
253
- const dialogRef = this.dialog.open(TraxpopupComponent, { centered: true, size: 'md' });
254
- dialogRef.componentInstance.data = popupcontent;
255
- dialogRef.result.then((res) => {
256
- if (res == 'confirm') {
257
- this.traxService.configTask(payload).pipe(takeUntil(this.destroy$)).subscribe({
258
- next: (res) => {
259
- if (res.code === 200) {
260
- if (action) {
261
- this.toastService.getSuccessToast(res?.data?.message || 'Configuration updated successfully');
262
- this.router.navigate(['manage/trax/checklist/managetask']);
263
- }
264
- }
265
- },
266
- error: (err) => {
267
- this.toastService.getErrorToast(err?.error?.error?.message || 'Something went wrong');
268
- }
269
- });
270
- }
271
- });
272
- }
273
- else if (action === 'save') {
274
- const dialogRef = this.dialog.open(TraxpopupComponent, { centered: true, size: 'md' });
275
- dialogRef.componentInstance.data = {
276
- imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
277
- title: `Unsaved changes`,
278
- content: `Do you want to save as draft?`,
279
- buttontype: 'draft'
280
- };
281
- dialogRef.result.then((res) => {
282
- if (res === 'confirm') {
283
- this.traxService.configTask(payload).pipe(takeUntil(this.destroy$)).subscribe({
284
- next: (res) => {
285
- if (res.code === 200) {
286
- if (action) {
287
- this.toastService.getSuccessToast(res?.data?.message || 'Configuration updated successfully');
288
- this.router.navigate(['manage/trax/checklist/managetask']);
289
- }
290
- }
291
- },
292
- error: (err) => {
293
- this.toastService.getErrorToast(err?.error?.error?.message || 'Something went wrong');
294
- }
295
- });
296
- }
297
- });
298
- }
299
- }
300
- detassignUpdate(action) {
301
- const payload = {
302
- "taskId": this.currentTaskId,
303
- "assignedList": this.assignSingle || [],
304
- "assignedGroup": this.assignGroup || [],
305
- "clientId": this.headerData?.client,
306
- "coverage": this.coverage
307
- };
308
- this.traxService.assigntaskUpdate(payload).pipe(takeUntil(this.destroy$)).subscribe({
309
- next: (res) => {
310
- if (res && res?.code == 200) {
311
- this.added = res?.data?.added;
312
- this.removed = res?.data?.removed;
313
- this.onSubmit(action);
314
- }
315
- },
316
- error: (err) => {
317
- this.toastService.getErrorToast(err);
318
- },
319
- });
320
- }
321
- onApproveAdded(event) {
322
- this.approver.setValue(event);
323
- }
324
- idList = [];
325
- getInitialData(data, change) {
326
- let tempId = data.map((el) => el?.id);
327
- let res = this.storeList.filter((el) => tempId.includes(el?._id));
328
- res.forEach((element) => element.isSelected = true);
329
- this.taskDetails.assign = res;
330
- if (this.assignType === 'store' || this.assignType === 'user') {
331
- this.assignTableApiState.next('loaded');
332
- // this.userDetails(),
333
- // (this.assignType === 'store' && this.initialLoading) ? (this.initialLoading = false) : this.getTableData(change ? change : '');
334
- this.idList = this.singleAssign;
335
- }
336
- else {
337
- this.idList = this.groupAssign;
338
- this.userDetailsV2();
339
- }
340
- }
341
- getTableData(change) {
342
- let count = 0;
343
- if (this.assignSingle?.length) {
344
- if (this.taskDetails.assign.length != this.assignSingle.length) {
345
- count++;
346
- }
347
- this.taskDetails.assign.forEach((assign) => {
348
- let findList = this.assignSingle.filter((item) => item.storeId == assign.storeId);
349
- if (findList.length) {
350
- if (findList.length > 1) {
351
- count++;
352
- }
353
- else {
354
- if (assign.userEmail.toLowerCase() != findList[0].userEmail.toLowerCase() && this.coverage === 'store') {
355
- assign.userEmail = findList[0].userEmail;
356
- assign.userName = findList[0].userName;
357
- count++;
358
- }
359
- }
360
- }
361
- });
362
- if (count) {
363
- this.upload = change ? 'upload' : 'store';
364
- }
365
- }
366
- // this.tableArray = this.assignSingle ? this.assignSingle : this.taskDetails.assign;
367
- change ? this.tableArray = this.assignSingle : [];
368
- if (this.upload === 'store') {
369
- let table = [...this.tableArray, ...this.taskDetails.assign];
370
- let uniqueTable = new Map();
371
- // Convert objects to JSON strings for full comparison
372
- table.forEach((item) => {
373
- item = {
374
- storeName: item?.storeName,
375
- storeId: item.storeId,
376
- userEmail: item.userEmail.toLowerCase(),
377
- userName: item.userName,
378
- _id: item._id
379
- };
380
- let data = {
381
- _id: item._id,
382
- ...(this.storeCoverage) ? { userEmail: item.userEmail.toLowerCase(), storeName: item?.storeName } : {},
383
- };
384
- let key = JSON.stringify(data); // Convert entire object to string as a key
385
- if (!uniqueTable.has(data)) {
386
- uniqueTable.set(key, item); // Store the object only if it's completely unique
387
- }
388
- });
389
- this.assignSingle = Array.from(uniqueTable.values());
390
- this.tableArray = this.assignSingle;
391
- }
392
- else if (this.upload === 'upload') {
393
- this.tableArray = this.assignSingle;
394
- }
395
- else {
396
- this.tableArray = this.taskDetails.assign;
397
- this.assignSingle = this.tableArray;
398
- }
399
- // this.tableArray?.length ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
400
- this.totalItems = this.tableArray.length;
401
- if (this.totalItems < 5) {
402
- this.paginationSizes = [this.totalItems];
403
- this.pageSize = this.totalItems;
404
- }
405
- else {
406
- this.paginationSizes = [5, 10, 15, 20];
407
- this.pageSize = 5;
408
- }
409
- this.assignTableApiState.next('loaded');
410
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
411
- }
412
- coverage = 'store';
413
- selectRadio(data) {
414
- this.coverage = data;
415
- this.currentPage = 1;
416
- this.pageSize = 5;
417
- this.searchInput.setValue('');
418
- this.taskDetails.assign = [];
419
- this.tableArray = [];
420
- this.assignTableData = [];
421
- if (data === 'store') {
422
- this.storeCoverage = true;
423
- this.userCoverage = false;
424
- }
425
- else if (data === 'user') {
426
- this.userCoverage = true;
427
- this.storeCoverage = false;
428
- }
429
- this.selectInitialTab();
430
- if (this.coverage === this.configData.checkListDetails.coverage) {
431
- this.singleAssign = this.configData.checkListDetails.singleAssign;
432
- this.groupAssign = this.configData.checkListDetails.groupAssign;
433
- setTimeout(() => {
434
- this.assignType ? this.userDetails() : '';
435
- }, 3000);
436
- }
437
- else {
438
- this.singleAssign = [];
439
- this.groupAssign = [];
440
- this.assignSingle = [], this.assignGroup = [];
441
- this.assignTableApiState.next('loading');
442
- }
443
- this.getassignDropdown();
444
- }
445
- confirmUserpopup() {
446
- const dialogRef = this.dialog.open(this.confirmUser, { centered: true, backdrop: 'static' });
447
- dialogRef.closed.subscribe((res) => {
448
- if (res === 'confirm') {
449
- this.validateDetails('addUser');
450
- }
451
- });
452
- }
453
- storeList = [];
454
- searchKey = [];
455
- getassignDropdown(change) {
456
- let data = {
457
- "clientId": this.headerData?.client,
458
- "coverage": this.coverage,
459
- "assignType": this.assignType
460
- };
461
- this.storeList = [];
462
- this.traxService.getassignDropdown(data).subscribe((res) => {
463
- if (res && res.code == 200 && res.data.data.length) {
464
- this.storeList = res?.data?.data;
465
- if (data?.coverage === 'store') {
466
- this.searchKey = ['storeName', 'clusterName'];
467
- }
468
- else if (data?.coverage === 'user') {
469
- this.searchKey = ['userName', 'teamName'];
470
- }
471
- !change ? this.getInitialData((this.assignType === 'store' || this.assignType === 'user') ? this.singleAssign : this.groupAssign, change ? change : '') : '';
472
- this.cd.detectChanges();
473
- }
474
- else {
475
- this.storeList = [];
476
- }
477
- });
478
- }
479
- userDetailsV2(data) {
480
- const payload = {
481
- "taskId": this.currentTaskId,
482
- "idList": this.idList,
483
- "coverage": this.coverage,
484
- "clientId": this.headerData?.client,
485
- "search": this.searchInput.value
486
- };
487
- this.assignTableApiState.next('loading');
488
- this.tableArray = [];
489
- this.assignTableData = [];
490
- this.traxService.selecttaskChips(payload).pipe(takeUntil(this.destroy$)).subscribe({
491
- next: (res) => {
492
- if (res && res?.code === 200) {
493
- this.assignTableApiState.next('loaded');
494
- this.tableArray = res?.data?.uniqueArr;
495
- this.assignGroup = this.tableArray;
496
- this.totalItems = res?.data?.count;
497
- if (this.totalItems < 5) {
498
- this.paginationSizes = [this.totalItems];
499
- this.pageSize = this.totalItems;
500
- }
501
- else {
502
- this.paginationSizes = [5, 10, 15, 20];
503
- this.pageSize = 5;
504
- }
505
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
506
- // console.log('assignTableData?.length', this.assignTableData?.length)
507
- }
508
- else {
509
- this.tableArray = [];
510
- this.assignTableData = [];
511
- this.assignTableApiState.next('loaded');
512
- // this.showImage = true;
513
- // this.tableLoading = true;
514
- }
515
- // this.storeCoverage ? this.getInitialData(res?.data?.storeList) : this.getInitialData(res?.data?.userList);
516
- },
517
- error: (err) => {
518
- this.tableArray = [];
519
- this.assignTableData = [];
520
- this.assignTableApiState.next('loaded');
521
- this.toastService.getErrorToast(err?.message);
522
- },
523
- });
524
- }
525
- userDetails() {
526
- this.pageSize = 5;
527
- this.assignTableApiState.next('loading');
528
- let params = {
529
- id: this.currentTaskId,
530
- clientId: this.headerData?.client
531
- };
532
- this.traxService.gettaskUserDetailsV1(params).pipe(takeUntil(this.destroy$)).subscribe((res) => {
533
- this.assignTableApiState.next('loaded');
534
- let count = 0;
535
- if (res == null) {
536
- // this.showImage = true;
537
- if (this.searchInput.value)
538
- this.tableArray = [];
539
- this.assignTableData = [];
540
- }
541
- if (res && res.code == 200) {
542
- this.assignTableApiState.next('loaded');
543
- if (this.storeCoverage) {
544
- this.tableArray = res.data.userDetails.filter((el) => el?.clusterName == '' && el?.storeId != '');
545
- this.assignGroup = res.data.userDetails.filter((el) => el?.clusterName !== '');
546
- }
547
- else if (this.userCoverage) {
548
- this.tableArray = res.data.userDetails.filter((el) => el?.teamName == '' && el?.userName != '');
549
- this.assignGroup = res.data.userDetails.filter((el) => el?.teamName !== '');
550
- }
551
- this.assignSingle = this.tableArray;
552
- this.totalItems = this.tableArray.length;
553
- // this.totalItems = res.data.count;
554
- if (this.totalItems < 5) {
555
- this.paginationSizes = [this.totalItems];
556
- this.pageSize = this.totalItems;
557
- }
558
- else {
559
- this.paginationSizes = [5, 10, 15, 20];
560
- this.pageSize = 5;
561
- }
562
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
563
- this.assignTableData ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
564
- // this.getInitialData();
565
- }
566
- });
567
- }
568
- sortColumn;
569
- sortBy = -1;
570
- sortData(value) {
571
- this.sortColumn = value;
572
- this.sortBy *= -1;
573
- const sortBy = parseInt(this.sortBy, 10) === -1 ? -1 : 1;
574
- this.tableArray.sort((a, b) => {
575
- // if (a[this.sortColumn] == null || b[this.sortColumn] == null) return 0;
576
- // if (typeof a[this.sortColumn] === 'string' && typeof b[this.sortColumn] === 'string') {
577
- return sortBy * (a[this.sortColumn] || '').localeCompare(b[this.sortColumn] || '');
578
- // }
579
- });
580
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
581
- }
582
- getAssignTable() {
583
- this.assignTableApiState.next('loading');
584
- const query = {
585
- "clientId": this.headerData?.client,
586
- "limit": this.pageSize,
587
- "offset": this.currentPage > 0 ? this.currentPage - 1 : 0,
588
- "search": this.searchInput.value,
589
- "taskId": this.currentTaskId
590
- };
591
- this.traxService.getTaskUserDetails(query).pipe(takeUntil(this.destroy$)).subscribe({
592
- next: (res) => {
593
- this.assignTableApiState.next('loaded');
594
- if (res?.data?.count) {
595
- this.totalItems = res.data.count;
596
- }
597
- else {
598
- this.totalItems = 0;
599
- }
600
- if (res?.data?.users) {
601
- this.assignTableData = res.data.users;
602
- }
603
- else {
604
- this.assignTableData = [];
605
- }
606
- },
607
- error: (e) => {
608
- this.assignTableApiState.next('loaded');
609
- }
610
- });
611
- }
612
- onPageSizeChange(pageSize) {
613
- this.currentPage = 1;
614
- this.itemsPerPage = pageSize;
615
- this.pageSize = pageSize;
616
- this.assignTableData = [];
617
- if (this.searchInput.value) {
618
- this.totalItems = this.searchTable.length;
619
- if (this.totalItems < 5) {
620
- this.paginationSizes = [this.totalItems];
621
- this.pageSize = this.totalItems;
622
- }
623
- else {
624
- this.paginationSizes = [5, 10, 15, 20];
625
- // this.size = 5;
626
- }
627
- this.assignTableData = this.searchTable.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
628
- // this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
629
- }
630
- else {
631
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
632
- // this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
633
- }
634
- }
635
- onPageChange(pageOffset) {
636
- this.currentPage = pageOffset;
637
- this.assignTableData = [];
638
- if (this.searchInput.value) {
639
- // this.searchTableData();
640
- this.totalItems = this.searchTable.length;
641
- if (this.totalItems < 5) {
642
- this.paginationSizes = [this.totalItems];
643
- this.pageSize = this.totalItems;
644
- }
645
- else {
646
- this.paginationSizes = [5, 10, 15, 20];
647
- this.pageSize = 5;
648
- }
649
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
650
- // this.tableData ? this.tableLoading = false : this.tableLoading = true;
651
- }
652
- else {
653
- this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
654
- // this.tableData ? this.tableLoading = false : this.tableLoading = true;
655
- }
656
- // this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
657
- // this.getAssignTable()
658
- }
659
- searchTable;
660
- searchTableData() {
661
- this.assignTableData = [];
662
- this.pageSize = 5;
663
- this.currentPage = 1;
664
- // this.tableLoading = true;
665
- let searchField = ['storeName', 'userName', 'userEmail', 'clusterName', 'teamName'];
666
- if (!this.searchInput.value) {
667
- (this.assignType === 'store' || this.assignType === 'user') ? (this.singleAssign = this.idList, this.getTableData()) : (this.groupAssign = this.idList, this.userDetailsV2());
668
- }
669
- else {
670
- const searchData = this.searchInput.value.toLowerCase();
671
- const searchTerm = searchData.split(',').map((el) => el.trim());
672
- this.searchTable = this.tableArray?.filter((item) => searchField.some((field) => searchTerm.some((term) => item[field]?.toLowerCase().includes(term))));
673
- this.totalItems = this.searchTable.length;
674
- if (this.totalItems < 5) {
675
- this.paginationSizes = [this.totalItems];
676
- this.pageSize = this.totalItems;
677
- }
678
- else {
679
- this.paginationSizes = [5, 10, 15, 20];
680
- this.pageSize = 5;
681
- }
682
- this.assignTableData = this.searchTable.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
683
- }
684
- this.assignTableData ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
685
- // let params = {
686
- // offset: 0,
687
- // limit: this.size,
688
- // search: this.tableFilter,
689
- // id: this.checklistId,
690
- // clientId:this.clientId
691
- // }
692
- // if (this.tableFilter.length) {
693
- // this.SopService.getUserDetails(params).pipe(takeUntil(this.detach)).subscribe((res: any) => {
694
- // this.tableLoading = false;
695
- // if (res == null) {
696
- // this.showImage = true;
697
- // if (this.tableFilter.length)
698
- // this.showImage = false;
699
- // this.tableData = [];
700
- // }
701
- // if (res && res.code == 200) {
702
- // this.showImage = false;
703
- // this.tableData = res.data.users;
704
- // this.recordsCount = this.tableData.length;
705
- // this.recordsTotal = res.data.count;
706
- // let count = 0 ;
707
- // if(this.recordsTotal < 5) {
708
- // this.paginationSize = [this.recordsTotal]
709
- // this.size = this.recordsTotal;
710
- // }
711
- // else {
712
- // this.paginationSize = [5,10,15,20]
713
- // this.size = 5;
714
- // }
715
- // this.tableData.forEach((item:any) =>{
716
- // if(item.checkFlag && !this.configData.checkListDetails.assignedUsers.includes(item.id) && !this.removeUsers.includes(item.id))
717
- // this.configData.checkListDetails.assignedUsers.push(item.id);
718
- // if (this.configData.checkListDetails.assignedUsers.includes(item.id)) {
719
- // count +=1;
720
- // }
721
- // })
722
- // if (count == this.recordsCount) {
723
- // this.selectAll = true;
724
- // }
725
- // else {
726
- // this.selectAll = false
727
- // }
728
- // }
729
- // })
730
- // }
731
- // else {
732
- // this.userDetails();
733
- // }
734
- }
735
- dropDown = false;
736
- openDropdown(event) {
737
- this.dropDown = !this.dropDown;
738
- }
739
- bulkuploadModel() {
740
- this.dropDown = false;
741
- this.dialog.open(this.bulkupload, {
742
- centered: true, backdrop: 'static'
743
- });
744
- }
745
- excelError;
746
- afterUplload(data) {
747
- this.excelError = data;
748
- this.dialog.open(this.afterValidation, { centered: true, backdrop: 'static' });
749
- }
750
- onUserAssignChange(event, id) {
751
- if (!event) {
752
- this.removedUsers.add(id);
753
- }
754
- else {
755
- this.removedUsers.delete(id);
756
- }
757
- }
758
- downloadTemplateV2() {
759
- let excelData = [];
760
- if (this.storeCoverage) {
761
- if (this.tableArray == null || !this.tableArray?.length) {
762
- if (this.assignType === 'store') {
763
- excelData.push({
764
- storeName: '',
765
- userName: '',
766
- userEmail: '',
767
- userPhone: '',
768
- city: ''
769
- });
770
- }
771
- else {
772
- excelData.push({
773
- storeName: '',
774
- userName: '',
775
- userEmail: '',
776
- clusterName: '',
777
- userPhone: '',
778
- city: ''
779
- });
780
- }
781
- }
782
- if (this.tableArray && this.tableArray?.length) {
783
- this.tableArray.forEach((item) => {
784
- if (this.assignType === 'store') {
785
- excelData.push({
786
- storeName: item.storeName,
787
- userName: item.userName,
788
- userEmail: item.userEmail,
789
- userPhone: item.userPhone,
790
- city: item.city
791
- });
792
- }
793
- else {
794
- excelData.push({
795
- storeName: item.storeName,
796
- userName: item.userName,
797
- userEmail: item.userEmail,
798
- clusterName: item.clusterName,
799
- userPhone: item.userPhone,
800
- city: item.city
801
- });
802
- }
803
- });
804
- }
805
- }
806
- else if (this.userCoverage) {
807
- if (this.tableArray == null || !this.tableArray?.length) {
808
- if (this.assignType === 'user') {
809
- excelData.push({
810
- userName: '',
811
- userEmail: '',
812
- userPhone: '',
813
- });
814
- }
815
- else {
816
- excelData.push({
817
- userName: '',
818
- userEmail: '',
819
- teamName: '',
820
- userPhone: '',
821
- });
822
- }
823
- }
824
- if (this.tableArray && this.tableArray?.length) {
825
- this.tableArray.forEach((item) => {
826
- if (this.assignType === 'user') {
827
- excelData.push({
828
- userName: item.userName,
829
- userEmail: item.userEmail,
830
- userPhone: item.userPhone,
831
- });
832
- }
833
- else {
834
- excelData.push({
835
- userName: item.userName,
836
- userEmail: item.userEmail,
837
- teamName: item.teamName,
838
- userPhone: item.userPhone,
839
- });
840
- }
841
- });
842
- }
843
- }
844
- this.traxService.exportAsExcelFile(excelData, `CheckList_${this.assignType}_`);
845
- }
846
- downloadTemplate() {
847
- let params = {
848
- limit: 10000,
849
- offset: 0,
850
- taskId: this.currentTaskId,
851
- search: this.searchInput.value,
852
- clientId: this.headerData.client,
853
- };
854
- this.traxService.getTaskUserDetails(params).pipe(takeUntil(this.destroy$)).subscribe((res) => {
855
- let excelData = [];
856
- if (this.storeCoverage) {
857
- if (res == null) {
858
- excelData.push({
859
- storeName: '',
860
- clusterName: '',
861
- userEmail: '',
862
- userName: '',
863
- userPhone: '',
864
- city: ''
865
- });
866
- }
867
- if (res && res.code == 200) {
868
- res.data.users.forEach((item) => {
869
- excelData.push({
870
- storeName: item.storeName,
871
- clusterName: item.clusterName,
872
- userEmail: item.userEmail,
873
- userName: item.userName,
874
- userPhone: item.userPhone,
875
- city: item.city
876
- });
877
- });
878
- }
879
- }
880
- else if (this.userCoverage) {
881
- if (res == null) {
882
- excelData.push({
883
- // storeName: '',
884
- teamName: '',
885
- userEmail: '',
886
- userName: '',
887
- userPhone: '',
888
- city: ''
889
- });
890
- }
891
- if (res && res?.code == 200) {
892
- res?.data?.users.forEach((item) => {
893
- excelData.push({
894
- // storeName: item.storeName,
895
- teamName: item.teamName,
896
- userEmail: item.userEmail,
897
- userName: item.userName,
898
- userPhone: item.userPhone,
899
- city: item.city
900
- });
901
- });
902
- }
903
- }
904
- this.traxService.exportAsExcelFile(excelData, 'Task_Userlist_');
905
- });
906
- }
907
- updateAssign(event) {
908
- this.upload = '';
909
- this.currentPage = 1;
910
- // if (this.taskDetails) {
911
- this.taskDetails.assign = event;
912
- const assigneduser = event.map((el) => {
913
- return { id: el?._id, type: el?.type };
914
- });
915
- // this.idList = event.map((el: any) => {
916
- // return el?._id
917
- // })
918
- this.idList = assigneduser;
919
- this.searchInput.setValue('');
920
- (this.assignType === 'store' || this.assignType === 'user') ? (this.singleAssign = this.idList, this.getTableData()) : (this.groupAssign = this.idList, this.userDetailsV2(event));
921
- }
922
- removedChip(event) {
923
- this.tableArray = this.tableArray.filter((item) => !event.includes(item._id));
924
- this.taskDetails.assign = this.taskDetails.assign.filter((item) => !event.includes(item._id));
925
- }
926
- tableArray = [];
927
- excelData;
928
- showUser = false;
929
- showTeam = false;
930
- showStore = false;
931
- showCluster = false;
932
- onFileUpload(event, reupload) {
933
- this.validatedStore = [];
934
- this.validatedUser = [];
935
- this.validatedCluster = [];
936
- this.validatedTeam = [];
937
- this.newUser = [];
938
- this.inactiveStores = [];
939
- this.showUser = false;
940
- this.showTeam = false;
941
- this.showStore = false;
942
- this.showCluster = false;
943
- this.showInactive = false;
944
- this.currentPage = 1;
945
- this.reupload = false;
946
- this.upload = 'upload';
947
- this.userData = this.excelUserData = [];
948
- let data;
949
- const target = (event.target);
950
- let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
951
- let error = [];
952
- let ValidationError = false;
953
- if (isExcelFile) {
954
- const reader = new FileReader();
955
- reader.readAsBinaryString(target.files[0]);
956
- reader.onload = (e) => {
957
- const bstr = e.target.result;
958
- const wb = XLSX.read(bstr, { type: 'binary' });
959
- const wsname = wb.SheetNames[0];
960
- const ws = wb.Sheets[wsname];
961
- data = XLSX.utils.sheet_to_json(ws);
962
- this.excelData = data;
963
- if (!data.length || (data.some((item) => 'clusterName' in item || 'teamName' in item))) {
964
- this.toastService.getErrorToast('Please Upload a Valid file.');
965
- return;
966
- }
967
- const requiredKeys = this.storeCoverage ? ['storeName', 'userName', 'userEmail'] : ['userName', 'userEmail']; // Must always be present
968
- const optionalKeys = this.storeCoverage ? ['userPhone', 'city'] : ['userPhone', 'city'];
969
- const isValid = data.some((item) => {
970
- const keys = Object.keys(item);
971
- const hasRequiredKeys = requiredKeys.every(key => keys.includes(key));
972
- const allKeysAreAllowed = keys.every(key => requiredKeys.includes(key) || optionalKeys.includes(key));
973
- return hasRequiredKeys && allKeysAreAllowed;
974
- });
975
- if (!isValid) {
976
- this.toastService.getErrorToast('Please Upload a Valid file.');
977
- return;
978
- }
979
- data = data.filter((item) => {
980
- return ((item?.storeName && item?.storeName.trim() != '' && item?.storeName.trim() != null) || (item?.userName && item?.userName.trim() != '' && item?.userName.trim() != null) || (item?.userEmail && item?.userEmail.trim() != '' && item?.userEmail.trim() != null));
981
- });
982
- data.forEach((element, index) => {
983
- if (element?.userEmail) {
984
- element.userEmail = element?.userEmail.replace(/\s/g, '');
985
- }
986
- if (this.storeCoverage) {
987
- if ((element.storeName && element.storeName.trim() == '') || element.storeName == null) {
988
- error.push(`Invalid StoreName - A${index + 2}`);
989
- }
990
- if ((element.userName && element.userName.trim() == '') || element.userName == null) {
991
- error.push(`Invalid UserName - B${index + 2}`);
992
- }
993
- if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
994
- error.push(`Invalid userEmail - C${index + 2}`);
995
- }
996
- if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
997
- error.push(`Invalid userEmail - C${index + 2}`);
998
- }
999
- if (element.clusterName) {
1000
- if (element.clusterName.trim() == '' || element.clusterName == null) {
1001
- error.push(`Invalid clusterName - D${index + 2}`);
1002
- }
1003
- }
1004
- }
1005
- else if (this.userCoverage && !element?.storeName) {
1006
- if ((element.userName && element.userName.trim() == '') || element.userName == null) {
1007
- error.push(`Invalid UserName - A${index + 2}`);
1008
- }
1009
- if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
1010
- error.push(`Invalid userEmail - B${index + 2}`);
1011
- }
1012
- if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
1013
- error.push(`Invalid userEmail - B${index + 2}`);
1014
- }
1015
- if (element.teamName) {
1016
- if (element.teamName.trim() == '' || element.teamName == null) {
1017
- error.push(`Invalid teamName - C${index + 2}`);
1018
- }
1019
- }
1020
- }
1021
- else {
1022
- this.toastService.getErrorToast('Please upload a valid file.');
1023
- ValidationError = true;
1024
- }
1025
- if (this.storeCoverage) {
1026
- if (this.assignType === 'store') {
1027
- this.userData.push({
1028
- storeName: element?.storeName?.trim(),
1029
- userName: element?.userName?.trim(),
1030
- userEmail: element?.userEmail?.toLowerCase()?.trim(),
1031
- userPhone: element?.userPhone,
1032
- // checkFlag: element?.check ? element.check : false,
1033
- city: element?.city,
1034
- type: 'store'
1035
- });
1036
- }
1037
- else {
1038
- this.userData.push({
1039
- storeName: element?.storeName?.trim(),
1040
- userName: element?.userName?.trim(),
1041
- userEmail: element?.userEmail?.toLowerCase()?.trim(),
1042
- clusterName: element?.clusterName,
1043
- userPhone: element?.userPhone,
1044
- // checkFlag: element?.check ? element.check : false,
1045
- city: element?.city,
1046
- type: 'cluster'
1047
- });
1048
- }
1049
- }
1050
- else if (this.userCoverage) {
1051
- if (this.assignType === 'user') {
1052
- this.userData.push({
1053
- userName: element?.userName?.trim(),
1054
- userEmail: element?.userEmail?.toLowerCase()?.trim(),
1055
- userPhone: element?.userPhone,
1056
- // checkFlag: element?.check ? element.check : false,
1057
- type: 'user'
1058
- });
1059
- }
1060
- else {
1061
- this.userData.push({
1062
- userName: element?.userName?.trim(),
1063
- userEmail: element?.userEmail?.toLowerCase()?.trim(),
1064
- teamName: element?.teamName,
1065
- userPhone: element?.userPhone,
1066
- // checkFlag: element?.check ? element.check : false,
1067
- type: 'teams'
1068
- });
1069
- }
1070
- }
1071
- });
1072
- if (error.length) {
1073
- this.dialog.dismissAll();
1074
- const popupcontent = {
1075
- displayprop: false,
1076
- imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
1077
- title: `Invalid details!`,
1078
- content: `Please provide correct and complete store information.`,
1079
- buttontype: 'error',
1080
- error: error
1081
- };
1082
- this.afterUplload(popupcontent);
1083
- return;
1084
- }
1085
- else {
1086
- !ValidationError ? this.afterUplload() : '';
1087
- }
1088
- if (this.fileInput) {
1089
- this.fileInput.nativeElement.value = '';
1090
- }
1091
- if (this.fileInput1) {
1092
- this.fileInput1.nativeElement.value = '';
1093
- }
1094
- };
1095
- }
1096
- else {
1097
- if (this.fileInput) {
1098
- this.fileInput.nativeElement.value = '';
1099
- }
1100
- if (this.fileInput1) {
1101
- this.fileInput1.nativeElement.value = '';
1102
- }
1103
- this.toastService.getErrorToast('Please Upload a Excel file.');
1104
- }
1105
- }
1106
- upload = 'upload';
1107
- validatedStore = [];
1108
- validatedUser = [];
1109
- validatedCluster = [];
1110
- validatedTeam = [];
1111
- newUser = [];
1112
- inactiveStores = [];
1113
- showInactive = false;
1114
- validateDetails(addUser) {
1115
- let params = {
1116
- taskId: this.currentTaskId,
1117
- // assignUsers: this.userData,
1118
- assignedUsers: this.userData,
1119
- clientId: this.headerData?.client,
1120
- coverage: this.coverage
1121
- };
1122
- addUser ? params.addUser = true : '';
1123
- this.traxService.taskvalidateUserv1(params).pipe(takeUntil(this.destroy$)).subscribe({
1124
- next: (res) => {
1125
- if (res && res?.code == 200) {
1126
- if (this.upload === 'store') {
1127
- this.tableArray.unshift(...res?.data?.data);
1128
- this.configData.checkListDetails.assign = this.tableArray;
1129
- let data = this.tableArray.map((el) => {
1130
- return { id: el?._id, type: el?.type };
1131
- });
1132
- this.idList = data;
1133
- this.singleAssign = this.idList;
1134
- this.getTableData();
1135
- this.assignType === 'user' ? this.getassignDropdown('change') : '';
1136
- }
1137
- else {
1138
- this.tableArray = [];
1139
- this.assignTableApiState.next('loading');
1140
- this.tableArray = res?.data?.data;
1141
- this.assignSingle = res?.data?.data;
1142
- this.configData.checkListDetails.assign = this.tableArray;
1143
- let data = res?.data?.data.map((el) => {
1144
- return { id: el?._id, type: el?.type };
1145
- });
1146
- this.idList = data;
1147
- this.singleAssign = this.idList;
1148
- this.assignTableApiState.next('loaded');
1149
- this.getTableData();
1150
- this.assignType === 'user' ? this.getassignDropdown('change') : '';
1151
- }
1152
- this.dialog.dismissAll();
1153
- }
1154
- },
1155
- error: (err) => {
1156
- if (err?.error?.error && err?.error?.code == 400) {
1157
- let errorData = err?.error?.error;
1158
- this.excelData = errorData?.data;
1159
- this.userData = errorData?.data;
1160
- if (errorData.existEmail?.length) {
1161
- this.toastService.getErrorToast(`Already ${errorData.existEmail.toString()} assigned to another client`);
1162
- }
1163
- else if (errorData.store?.length && !errorData.existEmail?.length) {
1164
- this.validatedStore = errorData?.store;
1165
- this.showStore = true;
1166
- this.afterUplload();
1167
- }
1168
- else if (errorData.store?.length && errorData.existEmail?.length) {
1169
- !errorData?.inActiveStores?.length ? this.dialog.dismissAll() : '';
1170
- this.toastService.getErrorToast(`Already ${errorData.store.toString()} assigned to another client`);
1171
- }
1172
- else if (errorData?.inActiveStores?.length) {
1173
- this.inactiveStores = errorData?.inActiveStores;
1174
- this.showInactive = true;
1175
- this.afterUplload();
1176
- }
1177
- else if (errorData?.user?.length && !errorData?.existEmail?.length) {
1178
- this.validatedUser = errorData.user;
1179
- this.showUser = true;
1180
- if (this.upload === 'store') {
1181
- this.confirmUserpopup();
1182
- }
1183
- else {
1184
- this.afterUplload();
1185
- }
1186
- }
1187
- else if (errorData?.user?.length && errorData?.existEmail?.length) {
1188
- this.dialog.dismissAll();
1189
- this.toastService.getErrorToast(`Already ${errorData?.user.toString()} assigned to another client`);
1190
- }
1191
- if (errorData?.duplicates?.length) {
1192
- this.dialog.dismissAll();
1193
- this.toastService.getErrorToast(`${errorData?.duplicates?.toString()} - ${errorData?.message}`);
1194
- }
1195
- }
1196
- },
1197
- });
1198
- }
1199
- Reupload() {
1200
- // this.dialog.dismissAll();
1201
- this.validatedStore = [];
1202
- this.validatedUser = [];
1203
- this.validatedCluster = [];
1204
- this.validatedTeam = [];
1205
- this.newUser = [];
1206
- this.inactiveStores = [];
1207
- this.showUser = false;
1208
- this.showTeam = false;
1209
- this.showStore = false;
1210
- this.showCluster = false;
1211
- this.showInactive = false;
1212
- if (this.fileInput) {
1213
- this.fileInput.nativeElement.value = '';
1214
- }
1215
- if (this.fileInput1) {
1216
- this.fileInput1.nativeElement.value = '';
1217
- }
1218
- let ele = document.getElementById('kt_account_team_size_select_2');
1219
- ele?.click();
1220
- this.cd.detectChanges();
1221
- }
1222
- closeactivepopup() {
1223
- this.dialog.dismissAll();
1224
- }
1225
- // onFileUpload(event: any) {
1226
- // //Empty sheet validation ---done
1227
- // //empty field validation for storeName, userName, userEmail, city. I
1228
- // // validate user email
1229
- // // Email unique for store
1230
- // // Email unique for username
1231
- // const target: DataTransfer = <DataTransfer>(event.target);
1232
- // // let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
1233
- // const reader: FileReader = new FileReader();
1234
- // reader.readAsBinaryString(target.files[0]);
1235
- // reader.onload = (e: any) => {
1236
- // const bstr: string = e.target.result;
1237
- // const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });
1238
- // const wsname: string = wb.SheetNames[0];
1239
- // const ws: XLSX.WorkSheet = wb.Sheets[wsname];
1240
- // const jsonWithPosition: any[] = [];
1241
- // const range = XLSX.utils.decode_range(ws['!ref'] || '');
1242
- // const headers: string[] = [];
1243
- // for (let C = range.s.c; C <= range.e.c; ++C) {
1244
- // const cellAddress = XLSX.utils.encode_cell({ r: range.s.r, c: C });
1245
- // const header = ws[cellAddress]?.v || `Column${C + 1}`;
1246
- // headers.push(header);
1247
- // }
1248
- // for (let R = range.s.r + 1; R <= range.e.r; ++R) {
1249
- // const rowData: any = { row: R + 1 };
1250
- // for (let C = range.s.c; C <= range.e.c; ++C) {
1251
- // const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
1252
- // const cell = ws[cellAddress];
1253
- // const header = headers[C - range.s.c];
1254
- // rowData[header] = cell?.v || "";
1255
- // rowData[`column_${header}`] = XLSX.utils.encode_col(C);
1256
- // }
1257
- // jsonWithPosition.push(rowData);
1258
- // }
1259
- // const filteredData = jsonWithPosition.filter(row => {
1260
- // const keys = Object.keys(row).filter(key => !key.startsWith('column_') && key !== 'row');
1261
- // return keys.some(key => row[key].trim() !== undefined && row[key].trim() !== null && row[key].trim() !== "");
1262
- // });
1263
- // if (!filteredData.length) {
1264
- // return this.toastService.getErrorToast(`Please enter valid details`)
1265
- // }
1266
- // const emptyKeys: any[] = []
1267
- // const invalidEmails: any[] = []
1268
- // filteredData.forEach((row) => {
1269
- // const keys = Object.keys(row).filter(key => !key.startsWith('column_') && key !== 'row')
1270
- // keys.forEach((key) => {
1271
- // if (key === 'userEmail') {
1272
- // const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
1273
- // const isValidMail = emailRegex.test(row['userEmail']);
1274
- // if (!isValidMail) invalidEmails.push(row[`column_${key}`] + row.row)
1275
- // }
1276
- // if (!row[key] && (key === 'storeName' || key === 'userEmail' || key === 'userName')) emptyKeys.push(row[`column_${key}`] + row.row)
1277
- // })
1278
- // })
1279
- // if (emptyKeys.length) {
1280
- // return this.toastService.getErrorToast(`Please fill the cells ${emptyKeys.join(', ')}`)
1281
- // }
1282
- // if (invalidEmails.length) {
1283
- // return this.toastService.getErrorToast(`Please enter valid emails at ${invalidEmails.join(', ')}`)
1284
- // }
1285
- // const groupedByEmail = filteredData.reduce((acc, item) => {
1286
- // if (!acc[item.userEmail]) {
1287
- // acc[item.userEmail] = [];
1288
- // }
1289
- // acc[item.userEmail].push(item.storeName);
1290
- // return acc;
1291
- // }, {} as Record<string, string[]>);
1292
- // const uniqueResult = Object.entries(groupedByEmail).map(([email, storeNames]) => {
1293
- // const uniqueStoreNames = new Set<string>(storeNames as string);
1294
- // return {
1295
- // userEmail: email,
1296
- // isStoreNameUnique: uniqueStoreNames.size === (storeNames as Array<string>).length,
1297
- // storeNames: Array.from(uniqueStoreNames),
1298
- // };
1299
- // });
1300
- // const notUnique = uniqueResult.filter((item) => !item.isStoreNameUnique).map((item) => item.userEmail)
1301
- // if (notUnique.length) {
1302
- // return this.toastService.getErrorToast(`${notUnique.join(', ')} should be unique for store name`)
1303
- // }
1304
- // this.fileInput.nativeElement.value = ''
1305
- // event.target.value = ''
1306
- // const assignList = filteredData.map((data) => {
1307
- // return {
1308
- // storeName: data.storeName,
1309
- // userEmail: data.userEmail,
1310
- // userName: data.userName,
1311
- // userPhone: data?.userPhone,
1312
- // city: data?.city
1313
- // }
1314
- // })
1315
- // const payload = {
1316
- // id: this.currentTaskId,
1317
- // uploadUser: true,
1318
- // clientId: this.headerData.client,
1319
- // assignedUsers: assignList
1320
- // }
1321
- // this.uploadAssigneesList(payload).subscribe({
1322
- // next: (res: any) => {
1323
- // if (res?.data?.validate) {
1324
- // this.getAssignTable()
1325
- // }
1326
- // if (res?.data?.user?.length) {
1327
- // const popupcontent = {
1328
- // displayprop: false,
1329
- // imagesrc: '<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>',
1330
- // title: `Invite new users added in CSV`,
1331
- // content: `This CSV contains new users. Invite users by sending mail to them`,
1332
- // buttontype: 'Invite',
1333
- // user: res.data.user
1334
- // }
1335
- // const dialogRef = this.dialog.open(TraxpopupComponent, {
1336
- // centered: true, size: 'md'
1337
- // });
1338
- // dialogRef.componentInstance.data = popupcontent;
1339
- // dialogRef.result.then((result) => {
1340
- // if (result.message === 'confirm') {
1341
- // const payload = {
1342
- // id: this.currentTaskId,
1343
- // uploadUser: true,
1344
- // clientId: this.headerData.client,
1345
- // assignedUsers: assignList
1346
- // }
1347
- // this.uploadAssigneesList(payload, { addUser: true }).pipe(takeUntil(this.destroy$)).subscribe({
1348
- // next: (res) => {
1349
- // this.getAssignTable()
1350
- // }
1351
- // })
1352
- // }
1353
- // });
1354
- // }
1355
- // if (res?.data?.store?.length) {
1356
- // function formatMessages(messages: any[]): string {
1357
- // const groupedMessages: Record<string, string[]> = {};
1358
- // messages.forEach(({ store, message }) => {
1359
- // if (!groupedMessages[store]) {
1360
- // groupedMessages[store] = [];
1361
- // }
1362
- // groupedMessages[store].push(message);
1363
- // });
1364
- // const formattedMessages = Object.entries(groupedMessages).map(([store, msgs]) => {
1365
- // return `${msgs.join(', ')} in ${store}`;
1366
- // });
1367
- // return formattedMessages.join(', ');
1368
- // }
1369
- // this.toastService.getErrorToast(formatMessages(res?.data?.store))
1370
- // }
1371
- // },
1372
- // error: (err) => {
1373
- // this.toastService.getErrorToast(err?.error?.error || 'Something went wrong')
1374
- // }
1375
- // })
1376
- // }
1377
- // }
1378
- addStoreComponent() {
1379
- const dialogRef = this.dialog.open(TraxStoreComponent, {
1380
- centered: true, size: 'md'
1381
- });
1382
- dialogRef.componentInstance.data = {
1383
- checklistId: this.currentTaskId,
1384
- obj: {
1385
- checkListId: this.currentTaskId,
1386
- clientId: this.headerData.client,
1387
- },
1388
- coverage: this.coverage,
1389
- };
1390
- dialogRef.result.then((res) => {
1391
- if (res) {
1392
- this.userData = res;
1393
- this.upload = 'store';
1394
- this.validateDetails();
1395
- }
1396
- });
1397
- // dialogRef.result.then((res) => {
1398
- // if (res) {
1399
- // const payload = {
1400
- // id: this.currentTaskId,
1401
- // uploadUser: true,
1402
- // clientId: this.headerData.client,
1403
- // assignedUsers: res
1404
- // }
1405
- // this.uploadAssigneesList(payload, { delete: false }).pipe(takeUntil(this.destroy$)).subscribe({
1406
- // next: (res1: any) => {
1407
- // if (res1.code === 200) {
1408
- // if (res1?.data?.user?.length) {
1409
- // const popupcontent = {
1410
- // displayprop: false,
1411
- // imagesrc: '<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>',
1412
- // title: `Invite new users added in CSV`,
1413
- // content: `This CSV contains new users. Invite users by sending mail to them`,
1414
- // buttontype: 'Invite',
1415
- // user: res1.data.user
1416
- // }
1417
- // const dialogRef = this.dialog.open(TraxpopupComponent, {
1418
- // centered: true, size: 'md'
1419
- // });
1420
- // dialogRef.componentInstance.data = popupcontent;
1421
- // dialogRef.result.then((result) => {
1422
- // if (result.message === 'confirm') {
1423
- // const payload = {
1424
- // id: this.currentTaskId,
1425
- // uploadUser: true,
1426
- // clientId: this.headerData.client,
1427
- // assignedUsers: res
1428
- // }
1429
- // this.uploadAssigneesList(payload, { delete: false, addUser: true }).pipe(takeUntil(this.destroy$)).subscribe({
1430
- // next: (res) => {
1431
- // this.getAssignTable()
1432
- // }
1433
- // })
1434
- // }
1435
- // });
1436
- // } else {
1437
- // this.getAssignTable()
1438
- // }
1439
- // }
1440
- // },
1441
- // error: (err) => {
1442
- // this.toastService.getErrorToast(err.error.error)
1443
- // }
1444
- // })
1445
- // }
1446
- // })
1447
- }
1448
- getStoreCounts(data) {
1449
- if (this.storeCoverage) {
1450
- const uniqueStoreNames = new Set(data.map((item) => item.storeName));
1451
- return uniqueStoreNames.size;
1452
- }
1453
- else if (this.userCoverage) {
1454
- const uniqueUserNames = new Set(data.map((item) => item.userName));
1455
- return uniqueUserNames.size;
1456
- }
1457
- }
1458
- uploadAssigneesList(payload, extraArgs) {
1459
- const reqPayload = {
1460
- ...payload,
1461
- ...extraArgs
1462
- };
1463
- return this.traxService.uploadTaskAssignees(reqPayload);
1464
- }
1465
- getFormControlFromArray(index) {
1466
- return this.reminderRepeatSchedules.at(index);
1467
- }
1468
- addMoreSchedules() {
1469
- const scheduleValue = this.reminderRepeatScheduleOptions.filter((val) => !this.reminderRepeatSchedules?.value.includes(val));
1470
- if (this.reminderRepeatSchedules.length < 3) {
1471
- this.reminderRepeatSchedules.push(this.fb.control(scheduleValue[0]));
1472
- }
1473
- }
1474
- disableScheduleOption(option) {
1475
- return this.reminderRepeatSchedules.value.includes(option);
1476
- }
1477
- enableReminder(event) {
1478
- if (event.target.checked) {
1479
- this.reminderRepeatSchedules.clear();
1480
- this.reminderRepeatSchedules.push(this.fb.control(this.reminderRepeatScheduleOptions[0]));
1481
- }
1482
- else {
1483
- this.reminderRepeatSchedules.clear();
1484
- }
1485
- }
1486
- onDragLeave(event) {
1487
- event.preventDefault();
1488
- event.target.classList.remove('drag-over');
1489
- }
1490
- onDragOver(event) {
1491
- event.preventDefault();
1492
- event.stopPropagation();
1493
- // Add a visual effect to indicate drag is over the area
1494
- event.target.classList.add('drag-over');
1495
- }
1496
- onDrop(event) {
1497
- event.preventDefault();
1498
- event.target.classList.remove('drag-over');
1499
- if (event.dataTransfer?.files.length) {
1500
- const file = event.dataTransfer.files[0];
1501
- const fileInputElement = this.fileInput.nativeElement;
1502
- // Manually set the file to the input
1503
- const dataTransfer = new DataTransfer();
1504
- dataTransfer.items.add(file);
1505
- fileInputElement.files = dataTransfer.files;
1506
- // Trigger the change event manually
1507
- fileInputElement.dispatchEvent(new Event('change'));
1508
- }
1509
- }
1510
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskConfigureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.PageInfoService }, { token: i3.TraxService }, { token: i4.NgbModal }, { token: i5.ToastService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
1511
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskConfigureComponent, selector: "lib-task-configure", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["file"], descendants: true }, { propertyName: "fileInput1", first: true, predicate: ["file1"], descendants: true }, { propertyName: "bulkupload", first: true, predicate: ["bulkupload"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }, { propertyName: "confirmUser", first: true, predicate: ["confirmUser"], descendants: true }], ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"c-card d-flex justify-content-between\">\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div [routerLink]=\"'/manage/trax/checklist/managetask'\" class=\"btn btn-sm btn-outline me-5 px-3 py-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8332 10.0003H4.1665M4.1665 10.0003L9.99984 15.8337M4.1665 10.0003L9.99984 4.16699\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></div>\r\n <div *ngIf=\"taskDetails\">\r\n <div class=\"checklist-name mb-5\">{{taskDetails.checkListName}}</div>\r\n <div class=\"checklist-desc\">{{taskDetails.checkListDescription}}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <button class=\"btn btn-primary py-3 me-5\" (click)=\"detassignUpdate('publish')\">Publish</button>\r\n <button class=\"btn btn-outline\" (click)=\"detassignUpdate('save')\">Save as Draft</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <h2 class=\"mb-5\">Schedule</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 2V6M8 2V6M3 10H21M5 4H19C20.1046 4 21 4.89543 21 6V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V6C3 4.89543 3.89543 4 5 4Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{dueDateFormatted}}\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 6V12L16 14M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{dueTimeFormatted}}</span>\r\n </div>\r\n <h2 class=\"mb-5\">Assign</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8M9 2H15C15.5523 2 16 2.44772 16 3V5C16 5.55228 15.5523 6 15 6H9C8.44772 6 8 5.55228 8 5V3C8 2.44772 8.44772 2 9 2Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{coverage}}s\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M3.08995 6.88381L3.02401 6.98681C2.30358 8.25569 3.06101 9.87957 4.46464 10.0664C4.58627 10.0813 4.70112 10.0894 4.8145 10.0894C5.55255 10.0894 6.20523 9.77241 6.65953 9.27929L7.21286 8.67867L7.76432 9.28101C8.21367 9.77184 8.8652 10.0894 9.60776 10.0894C10.3471 10.0894 11.0022 9.77149 11.4512 9.28101L12.0044 8.67677L12.5576 9.28101C13.0066 9.77149 13.6617 10.0894 14.401 10.0894C15.1404 10.0894 15.7954 9.77149 16.2445 9.28101L16.7977 8.67678L17.3508 9.28101C17.7999 9.77149 18.4549 10.0894 19.1943 10.0894C19.3041 10.0894 19.4223 10.0812 19.5433 10.0665C20.9772 9.8718 21.7355 8.164 20.9155 6.88431C20.9154 6.88425 20.9154 6.8842 20.9154 6.88414L18.8056 3.59441L18.8056 3.59441L18.8046 3.59294C18.7582 3.52014 18.6649 3.46436 18.5584 3.46436H5.44307C5.3365 3.46436 5.24326 3.52014 5.19681 3.59295L5.19619 3.59391L3.08995 6.88381ZM4.81818 12.7501C4.71644 12.7501 4.616 12.747 4.5169 12.7411V16.6429V18.9644C4.5169 19.8212 5.22663 20.5358 6.11942 20.5358H17.882C18.7748 20.5358 19.4845 19.8212 19.4845 18.9644V16.6429V12.7416C19.3874 12.7471 19.2893 12.7501 19.1906 12.7501C19.0022 12.7501 18.8157 12.74 18.632 12.7203V16.6429V17.3929H17.882H6.11942H5.36942V16.6429V12.7211C5.18866 12.7402 5.00472 12.7501 4.81818 12.7501Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{assignSingle?.length + groupAssign?.length}} {{coverage}}{{(assignSingle?.length + groupAssign?.length) > 1 ? 's':''}}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-9\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <div class=\"row\">\r\n <div class=\"col-6 mb-5\">\r\n <div class=\"date-picker\">\r\n <label for=\"datepick\" class=\"form-label\">Due date</label>\r\n <div style=\"position: relative;\">\r\n <svg style=\"position: absolute; top: 12px; left:12px;\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <input id=\"datepick\" class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [minDate]=\"minDate\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"scheduleDate\" [autoApply]=\"false\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"timePick\" class=\"form-label\">Due time</label>\r\n <input [formControl]=\"scheduleEndTime\" type=\"time\" class=\"form-control\" id=\"timePick\"\r\n >\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label class=\"form-label\">Approver</label>\r\n <lib-chip-dropdown [data]=\"approversList\" [selectedData]=\"approver.value\"\r\n (selectedList)=\"onApproveAdded($event)\"></lib-chip-dropdown>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"priority\" class=\"form-label\">Priority</label>\r\n <select [formControl]=\"priorityType\" id=\"priority\" class=\"form-select mb-5\">\r\n <option value=\"high\">High</option>\r\n <option value=\"medium\">Medium</option>\r\n <option value=\"low\">Low</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card\" [ngClass]=\"allowedStoreLocation.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"allowedStoreLocation\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Geo fencing</div>\r\n <div class=\"desc\">By enabling, the checklist can be filled by the user only when inside the\r\n store.</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card \" [ngClass]=\"restrictAttendance.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"restrictAttendance\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Restrict attendance</div>\r\n <div class=\"desc\">By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <label class=\"reminder-header me-4\" for=\"reminderToggle\">Reminder</label>\r\n <div class=\"form-check form-switch\">\r\n <input [checked]=\"reminderRepeatSchedules.controls.length\" (change)=\"enableReminder($event)\" class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"reminderToggle\">\r\n </div>\r\n </div>\r\n <div class=\"reminder-description mb-5\" >\r\n By enabling, the users will be reminded in the selected interval \r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mb-5\" >\r\n <ng-container *ngIf=\"reminderRepeatSchedules.controls.length\" >\r\n <div class=\"reminder-sub me-4\" >Notify user before</div>\r\n <ng-container *ngFor=\"let control of reminderRepeatSchedules.controls; let i = index\" >\r\n <div class=\"d-flex align-items-center position-relative w-200px me-4\" >\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1487_47636)\">\r\n <path\r\n d=\"M10.0013 5.00033V10.0003L13.3346 11.667M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1487_47636\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <select [formControl]=\"getFormControlFromArray(i)\" class=\"form-select ps-14 me-5\" >\r\n <ng-container *ngFor=\"let item of reminderRepeatScheduleOptions\" >\r\n <option [ngClass]=\"disableScheduleOption(item) ? 'd-none' : ''\" [ngValue]=\"item\" >{{item}} mins</option>\r\n </ng-container>\r\n </select>\r\n </div> \r\n </ng-container>\r\n </ng-container>\r\n\r\n \r\n <div *ngIf=\"reminderRepeatSchedules.controls.length > 0 && reminderRepeatSchedules.controls.length < 3 \" class=\"me-4\">\r\n <button (click)=\"addMoreSchedules()\" class=\"btn btn-sm btn-outline h-100\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" >\r\n <path d=\"M10.0013 4.16699V15.8337M4.16797 10.0003H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div> \r\n </div>\r\n\r\n <div class=\"reminder-sub me-4\" ><span *ngIf=\"reminderRepeatSchedules.controls?.[0]\" >Send Alerts {{reminderRepeatSchedules.at(0).value}} Mins</span><span *ngIf=\"reminderRepeatSchedules.controls?.[1]\">, {{reminderRepeatSchedules.at(1).value}} Mins </span><span *ngIf=\"reminderRepeatSchedules.controls?.[2]\">and {{reminderRepeatSchedules.at(2).value}} Mins</span> before the checklist end time</div>\r\n \r\n </div>\r\n\r\n\r\n <div class=\"col-12\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <h2>Assign</h2>\r\n </div>\r\n\r\n <div class=\"mb-5 ms-5 d-flex\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"stores\" [checked]=\"storeCoverage\" (click)=\"selectRadio('store')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Stores and Clusters</label>\r\n </div>\r\n <div class=\"form-check ms-5 d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"users\" [checked]=\"userCoverage\" (click)=\"selectRadio('user')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Users and Teams</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex ms-5 align-items-center justify-content-between\">\r\n <div class=\"d-flex overflow-auto h-45px w-75 mt-5\">\r\n <ul *ngIf=\"storeCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('store')\" class=\"nav-item cursor-pointer h-100\"><span\r\n [ngClass]=\"assignType ==='store' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Stores</span>\r\n </li>\r\n <li (click)=\"selectedTab('cluster')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='cluster' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Clusters</a></li>\r\n </ul>\r\n <ul *ngIf=\"userCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('user')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='user' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Users</a>\r\n </li>\r\n <li (click)=\"selectedTab('team')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='team' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Teams</a></li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"d-flex align-items-center\">\r\n <div *ngIf=\"storeCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign Store</span>\r\n </div>\r\n <div *ngIf=\"userCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign User</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 ms-5\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span *ngIf=\"storeCoverage\">{{assignType | titlecase}}s</span></div>\r\n </div>\r\n <div class=\"w-100 mt-3 pe-5\">\r\n <lib-multi-chip-dropdown *ngIf=\"storeList && taskDetails\" [items]=\"storeList\" [multi]=\"true\" [searchField]=\"['storeName','clusterName','storeId','userName','teamName']\" [searchKey]=\"searchKey\" [idField]=\"'_id'\"\r\n (selected)=\"updateAssign($event)\" (removed)=\"removedChip($event)\" [selectedValues]=\"taskDetails.assign\"></lib-multi-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\" class=\"card-body px-0 mt-0 pt-0 pb-0 mx-4 mb-5\">\r\n <div class=\" w-100\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span>{{assignType | titlecase}}s</span> List</div>\r\n <div class=\"d-flex align-items-center justify-content-start\">\r\n <div class=\"me-3\">\r\n <!-- <span class=\"svg-icon svg-icon-1 align-items-center position-absolute mt-3 ms-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\"\r\n rx=\"1\" transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span> -->\r\n <input [formControl]=\"searchInput\" type=\"text\" data-kt-subscription-table-filter=\"search\" (change)=\"searchTableData()\"\r\n class=\"form-control form-control-solid w-200px ps-5 mx-1 me-4\" autocomplete=\"off\" \r\n autocapitalize=\"none\" \r\n spellcheck=\"false\" style=\"text-transform: none\" placeholder=\"Search...\"> \r\n </div>\r\n\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"position-relative w-100 mt-5 mb-5\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\">\r\n <span class=\"me-3 cursor-pointer\" (click)=\"file.click()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span #upload class=\"template-dropdown ms-3 bg-white\">BulkUpload </span></span>\r\n <span class=\"subtitle mx-3 me-2\"> | </span>\r\n <span class=\"cursor-pointer\" (click)=\"openDropdown($event)\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span><input style=\"display: none;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" /></span>\r\n </button>\r\n\r\n <div *ngIf=\"dropDown\" class=\"card template-dropdown h-40px w-100 position-absolute rounded-3 z-1 top-50px end-0\">\r\n <ul class=\"list-unstyled mb-0 w-auto cursor-pointer\" (click)=\"bulkuploadModel()\">\r\n <li class=\"px-5 fw-semibold cursor-pointer py-2\">Download Template</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"['cluster','team'].includes(assignType)\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\" (click)=\"downloadTemplateV2()\">\r\n <span class=\"me-3 cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8.125 13.125H16.3562L14.7438 14.7438L15.625 15.625L18.75 12.5L15.625 9.375L14.7438 10.2562L16.3562 11.875H8.125V13.125Z\" fill=\"black\"/>\r\n <path d=\"M13.75 8.75001V6.25001C13.7505 6.16776 13.7347 6.08622 13.7036 6.01007C13.6725 5.93392 13.6267 5.86466 13.5688 5.80626L9.19375 1.43126C9.13535 1.37333 9.06609 1.32751 8.98994 1.2964C8.91379 1.2653 8.83225 1.24953 8.75 1.25001H2.5C2.16848 1.25001 1.85054 1.38171 1.61612 1.61613C1.3817 1.85055 1.25 2.16849 1.25 2.50001V17.5C1.25 17.8315 1.3817 18.1495 1.61612 18.3839C1.85054 18.6183 2.16848 18.75 2.5 18.75H12.5C12.8315 18.75 13.1495 18.6183 13.3839 18.3839C13.6183 18.1495 13.75 17.8315 13.75 17.5V16.25H12.5V17.5H2.5V2.50001H7.5V6.25001C7.5 6.58153 7.6317 6.89947 7.86612 7.13389C8.10054 7.36831 8.41848 7.50001 8.75 7.50001H12.5V8.75001H13.75ZM8.75 6.25001V2.75626L12.2438 6.25001H8.75Z\" fill=\"black\"/>\r\n </svg> <span class=\"template-dropdown bg-white ms-3\">Export </span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\">\r\n <div class=\"col-lg-12\" *ngIf=\"searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-12\" *ngIf=\"!searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"assignTableData?.length\">\r\n <div class=\"table-responsive mt-5 mx-4\">\r\n <table *ngIf=\"storeCoverage\" class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('storeName')\">\r\n Store Name\r\n <span\r\n *ngIf=\"sortColumn === 'storeName' && sortBy !== 1 || sortColumn !== 'storeName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'storeName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n SPOC Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n SPOC Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='cluster'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('clusterName')\">\r\n Cluster Name\r\n <span\r\n *ngIf=\"sortColumn === 'clusterName' && sortBy !== 1 || sortColumn !== 'clusterName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'clusterName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.storeName}}\r\n </td>\r\n <td>{{data.userName ? data.userName : '--'}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='cluster'\">{{data.clusterName ? data.clusterName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n <table *ngIf=\"userCoverage\" class=\"w-100 table bottom-border text-nowrap\"> \r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n User Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n User Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='team'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('teamName')\">\r\n Teams Name\r\n <span\r\n *ngIf=\"sortColumn === 'teamName' && sortBy !== 1 || sortColumn !== 'teamName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'teamName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.userName}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='team'\">{{data.teamName ? data.teamName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n </div>\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loading' || (assignTableApiState | async) === 'initial'\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div>\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && !['cluster','team'].includes(assignType)\">\r\n <div class=\"row mb-6\">\r\n <div class=\"col-lg-12 assignpadding mb-10 mt-10\">\r\n <div class=\"row\">\r\n <div class=\"hr w-100 border border-1 position-relative\">\r\n <div class=\"position-absolute template-dropdown orposition bg-white w-100px\">or</div>\r\n </div>\r\n <div class=\"uploadpadding mt-10\">\r\n <ul class=\"subtext list-unstyled d-flex flex-column align-items-center mx-4\">\r\n <li>Use the template to upload multiple <span *ngIf=\"storeCoverage\">stores</span> <span *ngIf=\"userCoverage\">users</span> at once.</li> \r\n <li> Download the template here - <span (click)=\"downloadTemplateV2()\" class=\"cursor-pointer\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span><span class=\"text-primary\">Download Template</span></span></li>\r\n <li> Add your data to the Template File</li>\r\n </ul>\r\n </div>\r\n <div class=\"w-100 border border-2 text-center border-dashed rounded-3 border-primary p-5\" (dragover)=\"onDragOver($event)\" \r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"file.click()\">\r\n <div class=\"\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_7979_5202)\">\r\n <path d=\"M26.3335 26.3332L23.0002 22.9999M23.0002 22.9999L19.6669 26.3332M23.0002 22.9999V30.4999M29.9919 28.3249C30.8047 27.8818 31.4467 27.1806 31.8168 26.3321C32.1868 25.4835 32.2637 24.5359 32.0354 23.6388C31.807 22.7417 31.2865 21.9462 30.5558 21.3778C29.8251 20.8094 28.9259 20.5005 28.0002 20.4999H26.9502C26.698 19.5243 26.2278 18.6185 25.5752 17.8507C24.9225 17.0829 24.1042 16.4731 23.182 16.0671C22.2597 15.661 21.2573 15.4694 20.2503 15.5065C19.2433 15.5436 18.2578 15.8085 17.3679 16.2813C16.4779 16.7541 15.7068 17.4225 15.1124 18.2362C14.518 19.05 14.1158 19.9879 13.936 20.9794C13.7563 21.9709 13.8036 22.9903 14.0746 23.961C14.3455 24.9316 14.8329 25.8281 15.5002 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_7979_5202\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg></div>\r\n <div class=\"storetext cursor-pointer fw-bold\"><span class=\"text-primary text-decoration-underline\">Click To Upload</span> \r\n or drag and drop\r\n </div>\r\n <div class=\"headeralign fw-400\">the data added template file for processing.</div>\r\n <input style=\"visibility: hidden;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div class=\"col-lg-12\" *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && ['cluster','team'].includes(assignType)\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto\">Bulk Upload</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step 1 - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplateV2()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step2 - Add your data to the Template File with existing <span *ngIf=\"storeCoverage\">store</span> <span *ngIf=\"userCoverage\">user</span> data</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step3 - Upload it below for processing</div>\r\n\r\n <div class=\"fw-bold storeAssign mt-10\">**Note : On upload, all the existing data will be replaced</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div *ngIf=\"!showStore&&!showTeam&&!showCluster&&!showUser&&!showInactive\">You're about to assign {{getStoreCounts(excelData)}} <span *ngIf=\"storeCoverage\">stores</span><span *ngIf=\"userCoverage\">users</span> to the checklist. Are you sure want to proceed?</div>\r\n <div *ngIf=\"storeCoverage && showStore\" class=\"mt-3\">Store <span *ngFor=\"let store of validatedStore;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n <div *ngIf=\"userCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"userCoverage && showTeam\" class=\"mt-3\">Team <span *ngFor=\"let store of validatedTeam;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/users/client\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Create Team</a></div>\r\n <div *ngIf=\"storeCoverage && showCluster\" class=\"mt-3\">user <span *ngFor=\"let store of validatedCluster;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" class=\"text-decoration-underline cursor-pointer\" [queryParams]=\"{tyoe: 'cluster'}\" (click)=\"closeactivepopup()\">Create Cluster</a></div>\r\n <div *ngIf=\"storeCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"storeCoverage && showInactive\" class=\"mt-3\">Store <span *ngFor=\"let store of inactiveStores;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for is inactive, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError&&!showStore&&!showCluster&&!showUser&&!showTeam&&!showInactive\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError||showStore||showCluster||showUser||showTeam || showInactive\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #confirmUser let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title d-flex flex-column mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/><path d=\"M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/></svg>\r\n </div><br>\r\n <div class=\"config-heading fw-semibold w-auto\">New User found in uploaded file</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">This CSV contains a new User. Add new User in the User Management under Manage menu.</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <!-- <button class=\"btn btn-md btn-default btn-outline\" routerLink=\"/manage/users/client\" (click)=\"closeactivepopup()\">Skip New Entries</button> -->\r\n <button class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"model.close('confirm')\">Invite Selected</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".c-card{padding:24px;background:#fff;border-radius:16px}.plain-input{border:none;outline:none;background:transparent;padding:0;margin:0;width:100%;overflow:hidden;color:var(--black, #101828);text-overflow:ellipsis;font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.plain-input:focus{border-radius:0!important;border:white!important;outline:none!important;box-shadow:none!important}.checklist-name{font-size:20px;font-weight:600;line-height:28px;text-align:left;color:#667085!important}.checklist-desc{font-size:14px;font-weight:400;line-height:18px;text-align:left}:host::ng-deep .date-picker .md-drppicker .btn{line-height:10px!important}:host::ng-deep .date-picker .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .date-picker .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .date-picker .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .date-picker .md-drppicker td.active,:host::ng-deep .date-picker .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .date-picker .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .date-picker .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .date-picker .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .date-picker table th,:host::ng-deep .date-picker table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .date-picker .md-drppicker td.available.prev,:host::ng-deep .date-picker .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker .md-drppicker td.available.next,:host::ng-deep .date-picker .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .date-picker .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .date-picker .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .date-picker .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.assignpadding{padding:0 40px}.uploadpadding{padding:0 20% 9px}.orposition{top:0;left:50%;transform:translate(-50%,-50%);text-align:center}.storetext{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px}.storeAssign{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.storeAssign a:hover{text-decoration:underline!important}.border-primary{border:1px dashed var(--Primary-500, #33B5FF)!important;background:var(--Primary-25, #F6FCFF)!important}.template-dropdown{background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.uploadtext{color:var(--gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.subtext{color:var(--gray-500, #667085);font-family:Inter;font-size:14px;font-weight:400;line-height:20px;align-items:center;gap:8px;align-self:stretch}.selectstore{color:var(--primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subopen{color:var(--black, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.headeralign{color:var(--gray-500, #667085);font-family:Inter;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.selected-radio{width:1.5rem!important;height:1.5rem!important}.subtitle{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0em;text-align:left;color:#667085}.form-control.form-control-solid{display:flex;padding:11px 14px;align-items:center;gap:8px;align-self:stretch;border-radius:8px;border:1px solid var(--gray-500, #D0D5DD);background:var(--white, #FFF);box-shadow:0 1px 2px #1018280d}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip .initials{color:var(--Primary-600, #00A3FF);font-size:12px;font-weight:500;line-height:18px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.toggle-card{padding:16px;display:flex;align-items:center;border-radius:8px;border:1px solid #EAECF0;background:#fff}.toggle-card .header{color:#344054;font-size:16px;font-weight:500;line-height:24px}.toggle-card .desc{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.toggle-card.selected{border:1px solid #6BCAFF}.toggle-card.selected .header{color:#008edf}.toggle-card.selected .desc{color:#00a3ff}.sub-txt{color:#667085;font-size:14px;font-weight:400;line-height:20px;gap:8px}.cstm-blu-btn{padding:8px 14px;border-radius:8px;border:1px solid #EAF8FF;background:#eaf8ff;box-shadow:0 1px 2px #1018280d;color:#009bf3;font-size:14px;font-weight:600;line-height:20px;cursor:pointer;display:flex;align-items:center}.schedule-text{color:#344054;font-size:16px;font-weight:500;line-height:24px}input[type=checkbox].c-checkbox{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox].c-checkbox:checked{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox].c-checkbox:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.reminder-header{color:#101828;font-size:20px;font-weight:600;line-height:30px}.reminder-description{color:#344054;font-size:14px;font-weight:500;line-height:20px}.reminder-sub{color:#101828;font-size:16px;font-weight:500;line-height:24px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.nav{display:flex;align-items:center;gap:16px;flex:1 0 0;align-self:stretch;--bs-nav-link-color: none}.nav-item .nav-link{color:var(--Gray-500, #667085);font-size:16px;font-weight:500}.nav-item .nav-link:hover{border-bottom:none!important}.nav-item .nav-link.active{border-radius:10px!important;border-bottom:none!important}.nav-item .bg-light-primary{background:var(--Primary-50, #EAF8FF)!important}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i9.ChipDropdownComponent, selector: "lib-chip-dropdown", inputs: ["data", "selectedData", "placeholder"], outputs: ["selectedList"] }, { kind: "component", type: i10.MultiChipDropdownComponent, selector: "lib-multi-chip-dropdown", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "badgeValue", "searchKey", "assignType"], outputs: ["selected", "removed"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }] });
1512
- }
1513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskConfigureComponent, decorators: [{
1514
- type: Component,
1515
- args: [{ selector: 'lib-task-configure', template: "<div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"c-card d-flex justify-content-between\">\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div [routerLink]=\"'/manage/trax/checklist/managetask'\" class=\"btn btn-sm btn-outline me-5 px-3 py-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8332 10.0003H4.1665M4.1665 10.0003L9.99984 15.8337M4.1665 10.0003L9.99984 4.16699\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></div>\r\n <div *ngIf=\"taskDetails\">\r\n <div class=\"checklist-name mb-5\">{{taskDetails.checkListName}}</div>\r\n <div class=\"checklist-desc\">{{taskDetails.checkListDescription}}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <button class=\"btn btn-primary py-3 me-5\" (click)=\"detassignUpdate('publish')\">Publish</button>\r\n <button class=\"btn btn-outline\" (click)=\"detassignUpdate('save')\">Save as Draft</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <h2 class=\"mb-5\">Schedule</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 2V6M8 2V6M3 10H21M5 4H19C20.1046 4 21 4.89543 21 6V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V6C3 4.89543 3.89543 4 5 4Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{dueDateFormatted}}\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 6V12L16 14M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{dueTimeFormatted}}</span>\r\n </div>\r\n <h2 class=\"mb-5\">Assign</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8M9 2H15C15.5523 2 16 2.44772 16 3V5C16 5.55228 15.5523 6 15 6H9C8.44772 6 8 5.55228 8 5V3C8 2.44772 8.44772 2 9 2Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{coverage}}s\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M3.08995 6.88381L3.02401 6.98681C2.30358 8.25569 3.06101 9.87957 4.46464 10.0664C4.58627 10.0813 4.70112 10.0894 4.8145 10.0894C5.55255 10.0894 6.20523 9.77241 6.65953 9.27929L7.21286 8.67867L7.76432 9.28101C8.21367 9.77184 8.8652 10.0894 9.60776 10.0894C10.3471 10.0894 11.0022 9.77149 11.4512 9.28101L12.0044 8.67677L12.5576 9.28101C13.0066 9.77149 13.6617 10.0894 14.401 10.0894C15.1404 10.0894 15.7954 9.77149 16.2445 9.28101L16.7977 8.67678L17.3508 9.28101C17.7999 9.77149 18.4549 10.0894 19.1943 10.0894C19.3041 10.0894 19.4223 10.0812 19.5433 10.0665C20.9772 9.8718 21.7355 8.164 20.9155 6.88431C20.9154 6.88425 20.9154 6.8842 20.9154 6.88414L18.8056 3.59441L18.8056 3.59441L18.8046 3.59294C18.7582 3.52014 18.6649 3.46436 18.5584 3.46436H5.44307C5.3365 3.46436 5.24326 3.52014 5.19681 3.59295L5.19619 3.59391L3.08995 6.88381ZM4.81818 12.7501C4.71644 12.7501 4.616 12.747 4.5169 12.7411V16.6429V18.9644C4.5169 19.8212 5.22663 20.5358 6.11942 20.5358H17.882C18.7748 20.5358 19.4845 19.8212 19.4845 18.9644V16.6429V12.7416C19.3874 12.7471 19.2893 12.7501 19.1906 12.7501C19.0022 12.7501 18.8157 12.74 18.632 12.7203V16.6429V17.3929H17.882H6.11942H5.36942V16.6429V12.7211C5.18866 12.7402 5.00472 12.7501 4.81818 12.7501Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{assignSingle?.length + groupAssign?.length}} {{coverage}}{{(assignSingle?.length + groupAssign?.length) > 1 ? 's':''}}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-9\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <div class=\"row\">\r\n <div class=\"col-6 mb-5\">\r\n <div class=\"date-picker\">\r\n <label for=\"datepick\" class=\"form-label\">Due date</label>\r\n <div style=\"position: relative;\">\r\n <svg style=\"position: absolute; top: 12px; left:12px;\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <input id=\"datepick\" class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [minDate]=\"minDate\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"scheduleDate\" [autoApply]=\"false\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"timePick\" class=\"form-label\">Due time</label>\r\n <input [formControl]=\"scheduleEndTime\" type=\"time\" class=\"form-control\" id=\"timePick\"\r\n >\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label class=\"form-label\">Approver</label>\r\n <lib-chip-dropdown [data]=\"approversList\" [selectedData]=\"approver.value\"\r\n (selectedList)=\"onApproveAdded($event)\"></lib-chip-dropdown>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"priority\" class=\"form-label\">Priority</label>\r\n <select [formControl]=\"priorityType\" id=\"priority\" class=\"form-select mb-5\">\r\n <option value=\"high\">High</option>\r\n <option value=\"medium\">Medium</option>\r\n <option value=\"low\">Low</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card\" [ngClass]=\"allowedStoreLocation.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"allowedStoreLocation\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Geo fencing</div>\r\n <div class=\"desc\">By enabling, the checklist can be filled by the user only when inside the\r\n store.</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card \" [ngClass]=\"restrictAttendance.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"restrictAttendance\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Restrict attendance</div>\r\n <div class=\"desc\">By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <label class=\"reminder-header me-4\" for=\"reminderToggle\">Reminder</label>\r\n <div class=\"form-check form-switch\">\r\n <input [checked]=\"reminderRepeatSchedules.controls.length\" (change)=\"enableReminder($event)\" class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"reminderToggle\">\r\n </div>\r\n </div>\r\n <div class=\"reminder-description mb-5\" >\r\n By enabling, the users will be reminded in the selected interval \r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mb-5\" >\r\n <ng-container *ngIf=\"reminderRepeatSchedules.controls.length\" >\r\n <div class=\"reminder-sub me-4\" >Notify user before</div>\r\n <ng-container *ngFor=\"let control of reminderRepeatSchedules.controls; let i = index\" >\r\n <div class=\"d-flex align-items-center position-relative w-200px me-4\" >\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1487_47636)\">\r\n <path\r\n d=\"M10.0013 5.00033V10.0003L13.3346 11.667M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1487_47636\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <select [formControl]=\"getFormControlFromArray(i)\" class=\"form-select ps-14 me-5\" >\r\n <ng-container *ngFor=\"let item of reminderRepeatScheduleOptions\" >\r\n <option [ngClass]=\"disableScheduleOption(item) ? 'd-none' : ''\" [ngValue]=\"item\" >{{item}} mins</option>\r\n </ng-container>\r\n </select>\r\n </div> \r\n </ng-container>\r\n </ng-container>\r\n\r\n \r\n <div *ngIf=\"reminderRepeatSchedules.controls.length > 0 && reminderRepeatSchedules.controls.length < 3 \" class=\"me-4\">\r\n <button (click)=\"addMoreSchedules()\" class=\"btn btn-sm btn-outline h-100\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" >\r\n <path d=\"M10.0013 4.16699V15.8337M4.16797 10.0003H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div> \r\n </div>\r\n\r\n <div class=\"reminder-sub me-4\" ><span *ngIf=\"reminderRepeatSchedules.controls?.[0]\" >Send Alerts {{reminderRepeatSchedules.at(0).value}} Mins</span><span *ngIf=\"reminderRepeatSchedules.controls?.[1]\">, {{reminderRepeatSchedules.at(1).value}} Mins </span><span *ngIf=\"reminderRepeatSchedules.controls?.[2]\">and {{reminderRepeatSchedules.at(2).value}} Mins</span> before the checklist end time</div>\r\n \r\n </div>\r\n\r\n\r\n <div class=\"col-12\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <h2>Assign</h2>\r\n </div>\r\n\r\n <div class=\"mb-5 ms-5 d-flex\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"stores\" [checked]=\"storeCoverage\" (click)=\"selectRadio('store')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Stores and Clusters</label>\r\n </div>\r\n <div class=\"form-check ms-5 d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"users\" [checked]=\"userCoverage\" (click)=\"selectRadio('user')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Users and Teams</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex ms-5 align-items-center justify-content-between\">\r\n <div class=\"d-flex overflow-auto h-45px w-75 mt-5\">\r\n <ul *ngIf=\"storeCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('store')\" class=\"nav-item cursor-pointer h-100\"><span\r\n [ngClass]=\"assignType ==='store' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Stores</span>\r\n </li>\r\n <li (click)=\"selectedTab('cluster')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='cluster' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Clusters</a></li>\r\n </ul>\r\n <ul *ngIf=\"userCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('user')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='user' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Users</a>\r\n </li>\r\n <li (click)=\"selectedTab('team')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='team' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Teams</a></li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"d-flex align-items-center\">\r\n <div *ngIf=\"storeCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign Store</span>\r\n </div>\r\n <div *ngIf=\"userCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign User</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 ms-5\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span *ngIf=\"storeCoverage\">{{assignType | titlecase}}s</span></div>\r\n </div>\r\n <div class=\"w-100 mt-3 pe-5\">\r\n <lib-multi-chip-dropdown *ngIf=\"storeList && taskDetails\" [items]=\"storeList\" [multi]=\"true\" [searchField]=\"['storeName','clusterName','storeId','userName','teamName']\" [searchKey]=\"searchKey\" [idField]=\"'_id'\"\r\n (selected)=\"updateAssign($event)\" (removed)=\"removedChip($event)\" [selectedValues]=\"taskDetails.assign\"></lib-multi-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\" class=\"card-body px-0 mt-0 pt-0 pb-0 mx-4 mb-5\">\r\n <div class=\" w-100\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span>{{assignType | titlecase}}s</span> List</div>\r\n <div class=\"d-flex align-items-center justify-content-start\">\r\n <div class=\"me-3\">\r\n <!-- <span class=\"svg-icon svg-icon-1 align-items-center position-absolute mt-3 ms-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\"\r\n rx=\"1\" transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span> -->\r\n <input [formControl]=\"searchInput\" type=\"text\" data-kt-subscription-table-filter=\"search\" (change)=\"searchTableData()\"\r\n class=\"form-control form-control-solid w-200px ps-5 mx-1 me-4\" autocomplete=\"off\" \r\n autocapitalize=\"none\" \r\n spellcheck=\"false\" style=\"text-transform: none\" placeholder=\"Search...\"> \r\n </div>\r\n\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"position-relative w-100 mt-5 mb-5\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\">\r\n <span class=\"me-3 cursor-pointer\" (click)=\"file.click()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span #upload class=\"template-dropdown ms-3 bg-white\">BulkUpload </span></span>\r\n <span class=\"subtitle mx-3 me-2\"> | </span>\r\n <span class=\"cursor-pointer\" (click)=\"openDropdown($event)\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span><input style=\"display: none;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" /></span>\r\n </button>\r\n\r\n <div *ngIf=\"dropDown\" class=\"card template-dropdown h-40px w-100 position-absolute rounded-3 z-1 top-50px end-0\">\r\n <ul class=\"list-unstyled mb-0 w-auto cursor-pointer\" (click)=\"bulkuploadModel()\">\r\n <li class=\"px-5 fw-semibold cursor-pointer py-2\">Download Template</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"['cluster','team'].includes(assignType)\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\" (click)=\"downloadTemplateV2()\">\r\n <span class=\"me-3 cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8.125 13.125H16.3562L14.7438 14.7438L15.625 15.625L18.75 12.5L15.625 9.375L14.7438 10.2562L16.3562 11.875H8.125V13.125Z\" fill=\"black\"/>\r\n <path d=\"M13.75 8.75001V6.25001C13.7505 6.16776 13.7347 6.08622 13.7036 6.01007C13.6725 5.93392 13.6267 5.86466 13.5688 5.80626L9.19375 1.43126C9.13535 1.37333 9.06609 1.32751 8.98994 1.2964C8.91379 1.2653 8.83225 1.24953 8.75 1.25001H2.5C2.16848 1.25001 1.85054 1.38171 1.61612 1.61613C1.3817 1.85055 1.25 2.16849 1.25 2.50001V17.5C1.25 17.8315 1.3817 18.1495 1.61612 18.3839C1.85054 18.6183 2.16848 18.75 2.5 18.75H12.5C12.8315 18.75 13.1495 18.6183 13.3839 18.3839C13.6183 18.1495 13.75 17.8315 13.75 17.5V16.25H12.5V17.5H2.5V2.50001H7.5V6.25001C7.5 6.58153 7.6317 6.89947 7.86612 7.13389C8.10054 7.36831 8.41848 7.50001 8.75 7.50001H12.5V8.75001H13.75ZM8.75 6.25001V2.75626L12.2438 6.25001H8.75Z\" fill=\"black\"/>\r\n </svg> <span class=\"template-dropdown bg-white ms-3\">Export </span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\">\r\n <div class=\"col-lg-12\" *ngIf=\"searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-12\" *ngIf=\"!searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"assignTableData?.length\">\r\n <div class=\"table-responsive mt-5 mx-4\">\r\n <table *ngIf=\"storeCoverage\" class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('storeName')\">\r\n Store Name\r\n <span\r\n *ngIf=\"sortColumn === 'storeName' && sortBy !== 1 || sortColumn !== 'storeName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'storeName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n SPOC Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n SPOC Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='cluster'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('clusterName')\">\r\n Cluster Name\r\n <span\r\n *ngIf=\"sortColumn === 'clusterName' && sortBy !== 1 || sortColumn !== 'clusterName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'clusterName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.storeName}}\r\n </td>\r\n <td>{{data.userName ? data.userName : '--'}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='cluster'\">{{data.clusterName ? data.clusterName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n <table *ngIf=\"userCoverage\" class=\"w-100 table bottom-border text-nowrap\"> \r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n User Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n User Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='team'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('teamName')\">\r\n Teams Name\r\n <span\r\n *ngIf=\"sortColumn === 'teamName' && sortBy !== 1 || sortColumn !== 'teamName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'teamName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.userName}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='team'\">{{data.teamName ? data.teamName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n </div>\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loading' || (assignTableApiState | async) === 'initial'\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div>\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && !['cluster','team'].includes(assignType)\">\r\n <div class=\"row mb-6\">\r\n <div class=\"col-lg-12 assignpadding mb-10 mt-10\">\r\n <div class=\"row\">\r\n <div class=\"hr w-100 border border-1 position-relative\">\r\n <div class=\"position-absolute template-dropdown orposition bg-white w-100px\">or</div>\r\n </div>\r\n <div class=\"uploadpadding mt-10\">\r\n <ul class=\"subtext list-unstyled d-flex flex-column align-items-center mx-4\">\r\n <li>Use the template to upload multiple <span *ngIf=\"storeCoverage\">stores</span> <span *ngIf=\"userCoverage\">users</span> at once.</li> \r\n <li> Download the template here - <span (click)=\"downloadTemplateV2()\" class=\"cursor-pointer\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span><span class=\"text-primary\">Download Template</span></span></li>\r\n <li> Add your data to the Template File</li>\r\n </ul>\r\n </div>\r\n <div class=\"w-100 border border-2 text-center border-dashed rounded-3 border-primary p-5\" (dragover)=\"onDragOver($event)\" \r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"file.click()\">\r\n <div class=\"\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_7979_5202)\">\r\n <path d=\"M26.3335 26.3332L23.0002 22.9999M23.0002 22.9999L19.6669 26.3332M23.0002 22.9999V30.4999M29.9919 28.3249C30.8047 27.8818 31.4467 27.1806 31.8168 26.3321C32.1868 25.4835 32.2637 24.5359 32.0354 23.6388C31.807 22.7417 31.2865 21.9462 30.5558 21.3778C29.8251 20.8094 28.9259 20.5005 28.0002 20.4999H26.9502C26.698 19.5243 26.2278 18.6185 25.5752 17.8507C24.9225 17.0829 24.1042 16.4731 23.182 16.0671C22.2597 15.661 21.2573 15.4694 20.2503 15.5065C19.2433 15.5436 18.2578 15.8085 17.3679 16.2813C16.4779 16.7541 15.7068 17.4225 15.1124 18.2362C14.518 19.05 14.1158 19.9879 13.936 20.9794C13.7563 21.9709 13.8036 22.9903 14.0746 23.961C14.3455 24.9316 14.8329 25.8281 15.5002 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_7979_5202\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg></div>\r\n <div class=\"storetext cursor-pointer fw-bold\"><span class=\"text-primary text-decoration-underline\">Click To Upload</span> \r\n or drag and drop\r\n </div>\r\n <div class=\"headeralign fw-400\">the data added template file for processing.</div>\r\n <input style=\"visibility: hidden;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div class=\"col-lg-12\" *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && ['cluster','team'].includes(assignType)\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto\">Bulk Upload</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step 1 - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplateV2()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step2 - Add your data to the Template File with existing <span *ngIf=\"storeCoverage\">store</span> <span *ngIf=\"userCoverage\">user</span> data</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step3 - Upload it below for processing</div>\r\n\r\n <div class=\"fw-bold storeAssign mt-10\">**Note : On upload, all the existing data will be replaced</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div *ngIf=\"!showStore&&!showTeam&&!showCluster&&!showUser&&!showInactive\">You're about to assign {{getStoreCounts(excelData)}} <span *ngIf=\"storeCoverage\">stores</span><span *ngIf=\"userCoverage\">users</span> to the checklist. Are you sure want to proceed?</div>\r\n <div *ngIf=\"storeCoverage && showStore\" class=\"mt-3\">Store <span *ngFor=\"let store of validatedStore;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n <div *ngIf=\"userCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"userCoverage && showTeam\" class=\"mt-3\">Team <span *ngFor=\"let store of validatedTeam;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/users/client\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Create Team</a></div>\r\n <div *ngIf=\"storeCoverage && showCluster\" class=\"mt-3\">user <span *ngFor=\"let store of validatedCluster;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" class=\"text-decoration-underline cursor-pointer\" [queryParams]=\"{tyoe: 'cluster'}\" (click)=\"closeactivepopup()\">Create Cluster</a></div>\r\n <div *ngIf=\"storeCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"storeCoverage && showInactive\" class=\"mt-3\">Store <span *ngFor=\"let store of inactiveStores;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for is inactive, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError&&!showStore&&!showCluster&&!showUser&&!showTeam&&!showInactive\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError||showStore||showCluster||showUser||showTeam || showInactive\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #confirmUser let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title d-flex flex-column mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/><path d=\"M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/></svg>\r\n </div><br>\r\n <div class=\"config-heading fw-semibold w-auto\">New User found in uploaded file</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">This CSV contains a new User. Add new User in the User Management under Manage menu.</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <!-- <button class=\"btn btn-md btn-default btn-outline\" routerLink=\"/manage/users/client\" (click)=\"closeactivepopup()\">Skip New Entries</button> -->\r\n <button class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"model.close('confirm')\">Invite Selected</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".c-card{padding:24px;background:#fff;border-radius:16px}.plain-input{border:none;outline:none;background:transparent;padding:0;margin:0;width:100%;overflow:hidden;color:var(--black, #101828);text-overflow:ellipsis;font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.plain-input:focus{border-radius:0!important;border:white!important;outline:none!important;box-shadow:none!important}.checklist-name{font-size:20px;font-weight:600;line-height:28px;text-align:left;color:#667085!important}.checklist-desc{font-size:14px;font-weight:400;line-height:18px;text-align:left}:host::ng-deep .date-picker .md-drppicker .btn{line-height:10px!important}:host::ng-deep .date-picker .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .date-picker .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .date-picker .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .date-picker .md-drppicker td.active,:host::ng-deep .date-picker .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .date-picker .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .date-picker .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .date-picker .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .date-picker table th,:host::ng-deep .date-picker table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .date-picker .md-drppicker td.available.prev,:host::ng-deep .date-picker .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker .md-drppicker td.available.next,:host::ng-deep .date-picker .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .date-picker .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .date-picker .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .date-picker .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.assignpadding{padding:0 40px}.uploadpadding{padding:0 20% 9px}.orposition{top:0;left:50%;transform:translate(-50%,-50%);text-align:center}.storetext{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px}.storeAssign{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.storeAssign a:hover{text-decoration:underline!important}.border-primary{border:1px dashed var(--Primary-500, #33B5FF)!important;background:var(--Primary-25, #F6FCFF)!important}.template-dropdown{background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.uploadtext{color:var(--gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.subtext{color:var(--gray-500, #667085);font-family:Inter;font-size:14px;font-weight:400;line-height:20px;align-items:center;gap:8px;align-self:stretch}.selectstore{color:var(--primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subopen{color:var(--black, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.headeralign{color:var(--gray-500, #667085);font-family:Inter;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.selected-radio{width:1.5rem!important;height:1.5rem!important}.subtitle{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0em;text-align:left;color:#667085}.form-control.form-control-solid{display:flex;padding:11px 14px;align-items:center;gap:8px;align-self:stretch;border-radius:8px;border:1px solid var(--gray-500, #D0D5DD);background:var(--white, #FFF);box-shadow:0 1px 2px #1018280d}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip .initials{color:var(--Primary-600, #00A3FF);font-size:12px;font-weight:500;line-height:18px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.toggle-card{padding:16px;display:flex;align-items:center;border-radius:8px;border:1px solid #EAECF0;background:#fff}.toggle-card .header{color:#344054;font-size:16px;font-weight:500;line-height:24px}.toggle-card .desc{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.toggle-card.selected{border:1px solid #6BCAFF}.toggle-card.selected .header{color:#008edf}.toggle-card.selected .desc{color:#00a3ff}.sub-txt{color:#667085;font-size:14px;font-weight:400;line-height:20px;gap:8px}.cstm-blu-btn{padding:8px 14px;border-radius:8px;border:1px solid #EAF8FF;background:#eaf8ff;box-shadow:0 1px 2px #1018280d;color:#009bf3;font-size:14px;font-weight:600;line-height:20px;cursor:pointer;display:flex;align-items:center}.schedule-text{color:#344054;font-size:16px;font-weight:500;line-height:24px}input[type=checkbox].c-checkbox{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox].c-checkbox:checked{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox].c-checkbox:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.reminder-header{color:#101828;font-size:20px;font-weight:600;line-height:30px}.reminder-description{color:#344054;font-size:14px;font-weight:500;line-height:20px}.reminder-sub{color:#101828;font-size:16px;font-weight:500;line-height:24px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.nav{display:flex;align-items:center;gap:16px;flex:1 0 0;align-self:stretch;--bs-nav-link-color: none}.nav-item .nav-link{color:var(--Gray-500, #667085);font-size:16px;font-weight:500}.nav-item .nav-link:hover{border-bottom:none!important}.nav-item .nav-link.active{border-radius:10px!important;border-bottom:none!important}.nav-item .bg-light-primary{background:var(--Primary-50, #EAF8FF)!important}\n"] }]
1516
- }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.PageInfoService }, { type: i3.TraxService }, { type: i4.NgbModal }, { type: i5.ToastService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i6.FormBuilder }], propDecorators: { fileInput: [{
1517
- type: ViewChild,
1518
- args: ['file']
1519
- }], fileInput1: [{
1520
- type: ViewChild,
1521
- args: ['file1']
1522
- }], bulkupload: [{
1523
- type: ViewChild,
1524
- args: ['bulkupload']
1525
- }], afterValidation: [{
1526
- type: ViewChild,
1527
- args: ['afterValidation']
1528
- }], confirmUser: [{
1529
- type: ViewChild,
1530
- args: ['confirmUser']
1531
- }] } });
1532
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1jb25maWd1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy90YXNrLWNvbmZpZ3VyZS90YXNrLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stY29uZmlndXJlL3Rhc2stY29uZmlndXJlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLFNBQVMsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9GLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUtuQyxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFIdEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU1sQixLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFNaEMsTUFBTSxPQUFPLHNCQUFzQjtJQWdEYjtJQUErQjtJQUN6QztJQUFrQztJQUEwQjtJQUFvQztJQUF3QjtJQUErQjtJQWhEakss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R0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBRXRELHFDQUFxQztZQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLGdCQUFnQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBRTVDLG9DQUFvQztZQUNwQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7d0dBdGlEVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixnaEJDekJuQywycmlFQWd1QmM7OzRGRHZzQkQsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjs0UUEwQ1gsU0FBUztzQkFBM0IsU0FBUzt1QkFBQyxNQUFNO2dCQUNHLFVBQVU7c0JBQTdCLFNBQVM7dUJBQUMsT0FBTztnQkFDTyxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ08sZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0YsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0JztcclxuaW1wb3J0IHsgVGltZVBlcmlvZCB9IGZyb20gJ25neC1kYXRlcmFuZ2VwaWNrZXItbWF0ZXJpYWwvZGF0ZXJhbmdlcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IEhlYWRlckZpbHRlciwgSVRhc2ssIFVzZXJBc3NpZ25EZXRhaWxzIH0gZnJvbSAnLi90YXNrLWNvbmZpZ3VyZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVHJheFN0b3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJheC1zdG9yZS90cmF4LXN0b3JlLmNvbXBvbmVudCc7XHJcbmRheWpzLmV4dGVuZCh1dGMpO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgVHJheHBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJheHBvcHVwL3RyYXhwb3B1cC5jb21wb25lbnQnO1xyXG5cclxuXHJcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRhc2stY29uZmlndXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90YXNrLWNvbmZpZ3VyZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhc2tDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGRheWpzID0gZGF5anNcclxuICBzY2hlZHVsZURhdGU6IGFueTtcclxuICBtaW5EYXRlOiBhbnkgPSB0aGlzLmRheWpzKCkuZm9ybWF0KCk7XHJcbiAgc2NoZWR1bGVFbmRUaW1lID0gbmV3IEZvcm1Db250cm9sKHRoaXMuZ2V0Q3VycmVudFRpbWUoKSlcclxuICBjdXJyZW50VGFza0lkOiBzdHJpbmdcclxuICBoZWFkZXJEYXRhOiBIZWFkZXJGaWx0ZXJcclxuICB0YXNrRGV0YWlsczogSVRhc2tcclxuICBhcHByb3ZlciA9IG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgcHJpb3JpdHlUeXBlID0gbmV3IEZvcm1Db250cm9sKCdoaWdoJylcclxuICBhbGxvd2VkU3RvcmVMb2NhdGlvbiA9IG5ldyBGb3JtQ29udHJvbChmYWxzZSlcclxuICByZXN0cmljdEF0dGVuZGFuY2UgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpXHJcbiAgYXBwcm92ZXJzTGlzdDogeyBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdXHJcbiAgYXNzaWduVGFibGVBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdsb2FkaW5nJylcclxuICBhc3NpZ25UYWJsZURhdGE6IFVzZXJBc3NpZ25EZXRhaWxzW10gfCBudWxsIHwgdW5kZWZpbmVkXHJcbiAgaXRlbXNQZXJQYWdlID0gNVxyXG4gIGN1cnJlbnRQYWdlID0gMVxyXG4gIHRvdGFsSXRlbXMgPSAwXHJcbiAgY29uZmlnRGF0YTogYW55O1xyXG4gIHN0b3JlQ292ZXJhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHVzZXJDb3ZlcmFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHJldXBsb2FkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdXNlckRhdGE6IGFueSA9IFtdO1xyXG4gIGxpc3RvZklkOiBhbnk7XHJcbiAgZXhjZWxVc2VyRGF0YTogYW55ID0gW107XHJcbiAgYXNzaWduVHlwZTogYW55O1xyXG4gIGluaXRpYWxMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBhc3NpZ25TaW5nbGU6IGFueTsgYXNzaWduR3JvdXA6IGFueTtcclxuICBzaW5nbGVBc3NpZ246IGFueTtcclxuICBncm91cEFzc2lnbjphbnk7XHJcbiAgcGFnaW5hdGlvblNpemVzID0gWzUsIDEwLCAyMCwgMzBdXHJcbiAgcGFnZVNpemUgPSA1XHJcbiAgc2VhcmNoSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woJycpXHJcbiAgc2VsZWN0QWxsSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpXHJcbiAgcmVtb3ZlZFVzZXJzID0gbmV3IFNldCgpXHJcbiAgYWRkZWQgPSBbXVxyXG4gIHJlbW92ZWQgPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGUnKSBmaWxlSW5wdXQhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGUxJykgZmlsZUlucHV0MSE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYnVsa3VwbG9hZCcpIGJ1bGt1cGxvYWQ6IGFueTtcclxuICBAVmlld0NoaWxkKCdhZnRlclZhbGlkYXRpb24nKSBhZnRlclZhbGlkYXRpb246IGFueTtcclxuICBAVmlld0NoaWxkKCdjb25maXJtVXNlcicpIGNvbmZpcm1Vc2VyOiBhbnk7XHJcblxyXG4gIHJlbWluZGVyUmVwZWF0U2NoZWR1bGVzOiBGb3JtQXJyYXk7XHJcbiAgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZU9wdGlvbnMgPSBbMzAsIDQ1LCA2MCwgNzUsIDkwXVxyXG4gIFxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsIHByaXZhdGUgZGlhbG9nOiBOZ2JNb2RhbCwgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmhlYWRlckRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZylcclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkucGlwZShkZWJvdW5jZVRpbWUoMTAwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnNlbGVjdEFsbElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWwpID0+IHtcclxuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YT8uZm9yRWFjaCh2YWwgPT4gdmFsLmNoZWNrRmxhZyA9IHRydWUpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVkVXNlcnMuY2xlYXIoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXNzaWduVGFibGVEYXRhPy5mb3JFYWNoKHZhbCA9PiB7IHZhbC5jaGVja0ZsYWcgPSBmYWxzZSwgdGhpcy5vblVzZXJBc3NpZ25DaGFuZ2UodmFsLmNoZWNrRmxhZywgdmFsLmlkKSB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMgPSB0aGlzLmZiLmFycmF5KFtdKVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjaGVkdWxlRGF0ZSA9IHsgc3RhcnREYXRlOiB0aGlzLmRheWpzKCkuZm9ybWF0KCdERC1NTS1ZWVlZJyksIGVuZERhdGU6IHRoaXMuZGF5anMoKS5mb3JtYXQoJ0RELU1NLVlZWVknKSB9O1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpXHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8udGFza0lkKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRUYXNrSWQgPSBwYXJhbXMudGFza0lkXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2sodGhpcy5jdXJyZW50VGFza0lkKVxyXG4gICAgICAgICAgdGhpcy5nZXRDbGllbnRVc2VyKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEluaXRpYWxUYWIoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiVGFza3NcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldERlc2NyaXB0aW9uKFwiXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXHJcbiAgICAgIHsgdGl0bGU6IFwiVGFuZ28gVHJheFwiLCBwYXRoOiBcIi9tYW5hZ2UvdHJheC9kYXNoYm9hcmRcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJUYW5nbyBUcmF4XCIsIHBhdGg6IFwiL21hbmFnZS90cmF4L2Rhc2hib2FyZFwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGFzayhpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmdldFRhc2tjb25maWcoaWQsIHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50ISkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5jb25maWdEYXRhID0gcmVzPy5kYXRhO1xyXG4gICAgICAgICAgdGhpcy50YXNrRGV0YWlscyA9IHJlcy5kYXRhLmNoZWNrTGlzdERldGFpbHNcclxuICAgICAgICAgIHRoaXMudGFza0RldGFpbHMuYXNzaWduID0gW107XHJcbiAgICAgICAgICAvLyB0aGlzLmlkTGlzdCA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbmVkdXNlcnM7XHJcbiAgICAgICAgICAvLyB0aGlzLmxpc3RvZklkID0gdGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWR1c2VycztcclxuICAgICAgICAgIHRoaXMuY292ZXJhZ2UgPSB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5jb3ZlcmFnZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0UmFkaW8odGhpcy5jb3ZlcmFnZSlcclxuICAgICAgICAgIGlmICh0aGlzLnRhc2tEZXRhaWxzPy5zY2hlZHVsZURhdGUpIHtcclxuICAgICAgICAgICAgaWYgKGRheWpzKHRoaXMudGFza0RldGFpbHMuc2NoZWR1bGVEYXRlKS5pc0JlZm9yZShkYXlqcygpKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IHRoaXMuZGF5anModGhpcy50YXNrRGV0YWlscy5zY2hlZHVsZURhdGUpLmZvcm1hdCgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZURhdGUgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kYXlqcyh0aGlzLnRhc2tEZXRhaWxzLnNjaGVkdWxlRGF0ZSkudXRjKCkuZm9ybWF0KCdERC1NTS1ZWVlZJyksIGVuZERhdGU6IHRoaXMuZGF5anModGhpcy50YXNrRGV0YWlscy5zY2hlZHVsZURhdGUpLnV0YygpLmZvcm1hdCgnREQtTU0tWVlZWScpIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGFza0RldGFpbHM/LnJlbW92ZWRVc2Vycz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsSW5wdXQuc2V0VmFsdWUodHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8uc2NoZWR1bGVFbmRUaW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFbmRUaW1lLnNldFZhbHVlKGRheWpzKHRoaXMudGFza0RldGFpbHM/LnNjaGVkdWxlRW5kVGltZSwgJ2hoOm1tIEEnKS5mb3JtYXQoJ0hIOm1tJykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudGFza0RldGFpbHM/LmFwcHJvdmVyPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5hcHByb3Zlci5zZXRWYWx1ZSh0aGlzLnRhc2tEZXRhaWxzPy5hcHByb3ZlcilcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8ucHJpb3JpdHlUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpb3JpdHlUeXBlLnNldFZhbHVlKHRoaXMudGFza0RldGFpbHM/LnByaW9yaXR5VHlwZSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24gPT09IHRydWUgfHwgdGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxsb3dlZFN0b3JlTG9jYXRpb24uc2V0VmFsdWUodGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24pXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudGFza0RldGFpbHM/LnJlc3RyaWN0QXR0ZW5kYW5jZSA9PT0gdHJ1ZSB8fCB0aGlzLnRhc2tEZXRhaWxzPy5yZXN0cmljdEF0dGVuZGFuY2UgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdHJpY3RBdHRlbmRhbmNlLnNldFZhbHVlKHRoaXMudGFza0RldGFpbHM/LnJlc3RyaWN0QXR0ZW5kYW5jZSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8ucmVtYWluZGVyPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5jbGVhcigpXHJcbiAgICAgICAgICAgIHRoaXMudGFza0RldGFpbHM/LnJlbWFpbmRlci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5wdXNoKHRoaXMuZmIuY29udHJvbChpdGVtKSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRUYWIodmFsdWU6YW55KSB7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkgPSBbXTtcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcbiAgICB0aGlzLmFzc2lnblR5cGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnNldFZhbHVlKCcnKTtcclxuICAgIHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbiA9IFtdO1xyXG4gICAgdGhpcy5nZXRhc3NpZ25Ecm9wZG93bigpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0SW5pdGlhbFRhYigpIHtcclxuICAgIHRoaXMuc3RvcmVDb3ZlcmFnZSA/IHRoaXMuYXNzaWduVHlwZSA9ICdzdG9yZScgOiB0aGlzLmFzc2lnblR5cGUgPSAndXNlcidcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRUaW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gY29uc3QgaG91cnMgPSBub3cuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyBjb25zdCBtaW51dGVzID0gbm93LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyByZXR1cm4gYCR7aG91cnN9OiR7bWludXRlc31gO1xyXG4gICAgcmV0dXJuICcyMzo1OSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVlRGF0ZUZvcm1hdHRlZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF5anModGhpcy5zY2hlZHVsZURhdGUuc3RhcnREYXRlLCAnREQtTU0tWVlZWScpPy5mb3JtYXQoJ0REIE1NTSBZWVlZJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVlVGltZUZvcm1hdHRlZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRheWpzKHRoaXMuc2NoZWR1bGVFbmRUaW1lLnZhbHVlLCAnSEg6bW0nKS5mb3JtYXQoJ2g6bW0gQScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xpZW50VXNlcigpIHtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0Q2xpZW50VXNlcih0aGlzLmhlYWRlckRhdGEuY2xpZW50KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmFwcHJvdmVyc0xpc3QgPSByZXMuZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4geyByZXR1cm4geyBuYW1lOiBpdGVtLnVzZXJOYW1lLCB2YWx1ZTogaXRlbS5lbWFpbCwgcm9sZTogaXRlbS5yb2xlIH0gfSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tEZXRhaWxzPy5hcHByb3Zlcj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgdXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgICAgICAgIGlmICh1c2VySW5mbz8udXNlclR5cGUgPT0gJ3RhbmdvJyB8fCAodXNlckluZm8/LnVzZXJUeXBlID09ICdjbGllbnQnICYmIHVzZXJJbmZvPy5yb2xlID09ICd1c2VyJykpIHtcclxuICAgICAgICAgICAgbGV0IHVzZXJMaXN0ID0gdGhpcy5hcHByb3ZlcnNMaXN0LmZpbmQoKGVsZTogYW55KSA9PiBlbGUucm9sZSA9PSAnc3VwZXJhZG1pbicpO1xyXG4gICAgICAgICAgICBpZiAodXNlckxpc3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcHJvdmVyLnNldFZhbHVlKFt7IG5hbWU6IHVzZXJMaXN0Lm5hbWUsIHZhbHVlOiB1c2VyTGlzdC52YWx1ZSB9XSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwcm92ZXIuc2V0VmFsdWUoW3RoaXMuYXBwcm92ZXJzTGlzdC5maW5kKChlbGU6IGFueSkgPT4gZWxlLnZhbHVlID09IHVzZXJJbmZvLmVtYWlsKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXBwcm92ZXJzTGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KGFjdGlvbjogJ3NhdmUnIHwgJ3B1Ymxpc2gnKSB7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHNjaGVkdWxlRGF0ZTogdGhpcy5kYXlqcyh0aGlzLnNjaGVkdWxlRGF0ZS5zdGFydERhdGUsICdERC1NTS1ZWVlZJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHNjaGVkdWxlRW5kVGltZTogdGhpcy5kYXlqcyh0aGlzLnNjaGVkdWxlRW5kVGltZS52YWx1ZSwgJ0hIOm1tJykuZm9ybWF0KCdoaDptbSBBJyksXHJcbiAgICAgIGFwcHJvdmVyOiB0aGlzLmFwcHJvdmVyLnZhbHVlID8/IFtdLFxyXG4gICAgICBwcmlvcml0eVR5cGU6IHRoaXMucHJpb3JpdHlUeXBlLnZhbHVlLFxyXG4gICAgICBhbGxvd2VkU3RvcmVMb2NhdGlvbjogdGhpcy5hbGxvd2VkU3RvcmVMb2NhdGlvbi52YWx1ZSxcclxuICAgICAgcmVzdHJpY3RBdHRlbmRhbmNlOiB0aGlzLnJlc3RyaWN0QXR0ZW5kYW5jZS52YWx1ZSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBzdWJtaXRUeXBlOiBhY3Rpb24sXHJcbiAgICAgIF9pZDogdGhpcy50YXNrRGV0YWlscz8uX2lkLFxyXG4gICAgICByZW1vdmVkVXNlcnM6IFsuLi50aGlzLnJlbW92ZWRVc2Vyc10sXHJcbiAgICAgIHJlbWFpbmRlcjogdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcz8udmFsdWUgfHwgW10sXHJcbiAgICAgIC4uLihhY3Rpb24gPT09ICdwdWJsaXNoJykgPyB7IHB1Ymxpc2g6IHRydWUgfSA6IHsgcHVibGlzaDogZmFsc2UgfSxcclxuICAgICAgYXNzaWduZWRVc2VyczogWy4uLnRoaXMuc2luZ2xlQXNzaWduLCAuLi50aGlzLmdyb3VwQXNzaWduXSxcclxuICAgICAgc3RvcmVDb3VudCA6IHRoaXMuYXNzaWduU2luZ2xlPy5sZW5ndGggKyB0aGlzLmdyb3VwQXNzaWduPy5sZW5ndGgsXHJcbiAgICAgIGNvdmVyYWdlOiB0aGlzLmNvdmVyYWdlLFxyXG4gICAgICBhZGRlZDp0aGlzLmFkZGVkLFxyXG4gICAgICByZW1vdmVkOnRoaXMucmVtb3ZlZFxyXG4gICAgfVxyXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3B1Ymxpc2gnKSB7XHJcbiAgICAgIGxldCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgIGltYWdlc3JjOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0QxRkFERlwiLz48cGF0aCBkPVwiTTM4IDI3LjA4MThWMjguMDAxOEMzNy45OTg4IDMwLjE1ODIgMzcuMzAwNSAzMi4yNTY1IDM2LjAwOTMgMzMuOTgzNkMzNC43MTgyIDM1LjcxMDggMzIuOTAzMyAzNi45NzQzIDMwLjgzNTQgMzcuNTg1N0MyOC43Njc0IDM4LjE5NzEgMjYuNTU3MyAzOC4xMjM3IDI0LjUzNDUgMzcuMzc2NEMyMi41MTE3IDM2LjYyOTEgMjAuNzg0NyAzNS4yNDc5IDE5LjYxMSAzMy40Mzg5QzE4LjQzNzMgMzEuNjI5OSAxNy44Nzk4IDI5LjQ4OTkgMTguMDIxNyAyNy4zMzgxQzE4LjE2MzYgMjUuMTg2NCAxOC45OTcyIDIzLjEzODEgMjAuMzk4MyAyMS40OTg5QzIxLjc5OTQgMTkuODU5NiAyMy42OTI4IDE4LjcxNzIgMjUuNzk2MiAxOC4yNDJDMjcuODk5NiAxNy43NjY3IDMwLjEwMDMgMTcuOTg0MiAzMi4wNyAxOC44NjE4TTM4IDIwLjAwMThMMjggMzAuMDExOEwyNSAyNy4wMTE4XCIgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUNGREYzXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgIHRpdGxlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggJHt0aGlzLnRhc2tEZXRhaWxzPy5jaGVja0xpc3ROYW1lfSB0YXNrP2AsXHJcbiAgICAgICAgY29udGVudDogYFB1Ymxpc2hpbmcgd2lsbCBtYWtlIHRoaXMgdGFzayBsaXZlLCBhbmQgY2hhbmdlcyB3aWxsIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LmAsXHJcbiAgICAgICAgYnV0dG9udHlwZTogJ2NvbmZpcm0nXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUcmF4cG9wdXBDb21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcgfSk7XHJcbiAgICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gcG9wdXBjb250ZW50O1xyXG4gICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgPT0gJ2NvbmZpcm0nKSB7XHJcbiAgICAgICAgICB0aGlzLnRyYXhTZXJ2aWNlLmNvbmZpZ1Rhc2socGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChyZXM/LmRhdGE/Lm1lc3NhZ2UgfHwgJ0NvbmZpZ3VyYXRpb24gdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ21hbmFnZS90cmF4L2NoZWNrbGlzdC9tYW5hZ2V0YXNrJ10pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJykge1xyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRyYXhwb3B1cENvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcclxuICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRhdGEgPSB7XHJcbiAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgIHRpdGxlOiBgVW5zYXZlZCBjaGFuZ2VzYCxcclxuICAgICAgICBjb250ZW50OiBgRG8geW91IHdhbnQgdG8gc2F2ZSBhcyBkcmFmdD9gLFxyXG4gICAgICAgIGJ1dHRvbnR5cGU6ICdkcmFmdCdcclxuICAgICAgfVxyXG4gICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgPT09ICdjb25maXJtJykge1xyXG4gICAgICAgICAgdGhpcy50cmF4U2VydmljZS5jb25maWdUYXNrKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5kYXRhPy5tZXNzYWdlIHx8ICdDb25maWd1cmF0aW9uIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvdHJheC9jaGVja2xpc3QvbWFuYWdldGFzayddKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBkZXRhc3NpZ25VcGRhdGUoYWN0aW9uOiAnc2F2ZScgfCAncHVibGlzaCcpIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgXCJ0YXNrSWRcIjogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgICAgIFwiYXNzaWduZWRMaXN0XCI6IHRoaXMuYXNzaWduU2luZ2xlIHx8IFtdLFxyXG4gICAgICAgIFwiYXNzaWduZWRHcm91cFwiOiB0aGlzLmFzc2lnbkdyb3VwIHx8IFtdLFxyXG4gICAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgICAgXCJjb3ZlcmFnZVwiOiB0aGlzLmNvdmVyYWdlXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hc3NpZ250YXNrVXBkYXRlKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OihyZXM6YW55KT0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuYWRkZWQgPSByZXM/LmRhdGE/LmFkZGVkO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVkID0gcmVzPy5kYXRhPy5yZW1vdmVkO1xyXG4gICAgICAgICAgICAgdGhpcy5vblN1Ym1pdChhY3Rpb24pXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOihlcnI6YW55KT0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG9uQXBwcm92ZUFkZGVkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYXBwcm92ZXIuc2V0VmFsdWUoZXZlbnQpXHJcbiAgfVxyXG5cclxuICBpZExpc3Q6IGFueSA9IFtdO1xyXG5cclxuICBnZXRJbml0aWFsRGF0YShkYXRhOiBhbnksY2hhbmdlPzogYW55KSB7XHJcbiAgICBsZXQgdGVtcElkID0gZGF0YS5tYXAoKGVsOmFueSkgPT4gZWw/LmlkKVxyXG4gICAgbGV0IHJlcyA9IHRoaXMuc3RvcmVMaXN0LmZpbHRlcigoZWw6IGFueSkgPT4gdGVtcElkLmluY2x1ZGVzKGVsPy5faWQpKTtcclxuICAgIHJlcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWUpO1xyXG4gICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24gPSByZXM7XHJcbiAgICBpZiAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnIHx8IHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAvLyB0aGlzLnVzZXJEZXRhaWxzKCksIFxyXG4gICAgICAvLyAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnICYmIHRoaXMuaW5pdGlhbExvYWRpbmcpID8gKHRoaXMuaW5pdGlhbExvYWRpbmcgPSBmYWxzZSkgOiB0aGlzLmdldFRhYmxlRGF0YShjaGFuZ2UgPyBjaGFuZ2UgOiAnJyk7XHJcbiAgICAgIHRoaXMuaWRMaXN0ID0gdGhpcy5zaW5nbGVBc3NpZ247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlkTGlzdCA9IHRoaXMuZ3JvdXBBc3NpZ247XHJcbiAgICAgIHRoaXMudXNlckRldGFpbHNWMigpXHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGdldFRhYmxlRGF0YShjaGFuZ2U/OiBhbnkpIHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBpZiAodGhpcy5hc3NpZ25TaW5nbGU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy50YXNrRGV0YWlscy5hc3NpZ24ubGVuZ3RoICE9IHRoaXMuYXNzaWduU2luZ2xlLmxlbmd0aCkge1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24uZm9yRWFjaCgoYXNzaWduOmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBmaW5kTGlzdCA9IHRoaXMuYXNzaWduU2luZ2xlLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnN0b3JlSWQgPT0gYXNzaWduLnN0b3JlSWQpO1xyXG4gICAgICAgIGlmIChmaW5kTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmIChmaW5kTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFzc2lnbi51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAhPSBmaW5kTGlzdFswXS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAmJiB0aGlzLmNvdmVyYWdlID09PSAnc3RvcmUnKSB7XHJcbiAgICAgICAgICAgICAgYXNzaWduLnVzZXJFbWFpbCA9IGZpbmRMaXN0WzBdLnVzZXJFbWFpbDtcclxuICAgICAgICAgICAgICBhc3NpZ24udXNlck5hbWUgPSBmaW5kTGlzdFswXS51c2VyTmFtZTtcclxuICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgaWYgKGNvdW50KSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWQgPSBjaGFuZ2UgPyAndXBsb2FkJyA6ICdzdG9yZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMudGFibGVBcnJheSA9IHRoaXMuYXNzaWduU2luZ2xlID8gdGhpcy5hc3NpZ25TaW5nbGUgOiB0aGlzLnRhc2tEZXRhaWxzLmFzc2lnbjtcclxuICAgIFxyXG4gICAgY2hhbmdlID8gdGhpcy50YWJsZUFycmF5ID0gdGhpcy5hc3NpZ25TaW5nbGUgOiBbXTtcclxuXHJcbiAgICBpZiAodGhpcy51cGxvYWQgPT09ICdzdG9yZScpIHtcclxuICAgICAgbGV0IHRhYmxlID0gWy4uLnRoaXMudGFibGVBcnJheSwgLi4udGhpcy50YXNrRGV0YWlscy5hc3NpZ25dO1xyXG4gICAgICBcclxuICAgICAgbGV0IHVuaXF1ZVRhYmxlID0gbmV3IE1hcCgpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ29udmVydCBvYmplY3RzIHRvIEpTT04gc3RyaW5ncyBmb3IgZnVsbCBjb21wYXJpc29uXHJcbiAgICAgIHRhYmxlLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGl0ZW0gPSB7XHJcbiAgICAgICAgICBzdG9yZU5hbWU6IGl0ZW0/LnN0b3JlTmFtZSxcclxuICAgICAgICAgIHN0b3JlSWQ6IGl0ZW0uc3RvcmVJZCxcclxuICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgIHVzZXJOYW1lOiBpdGVtLnVzZXJOYW1lLFxyXG4gICAgICAgICAgX2lkOml0ZW0uX2lkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgX2lkOiBpdGVtLl9pZCxcclxuICAgICAgICAgIC4uLih0aGlzLnN0b3JlQ292ZXJhZ2UpPyB7IHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAsc3RvcmVOYW1lOiBpdGVtPy5zdG9yZU5hbWV9Ont9LFxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOyAvLyBDb252ZXJ0IGVudGlyZSBvYmplY3QgdG8gc3RyaW5nIGFzIGEga2V5XHJcbiAgICAgICAgaWYgKCF1bmlxdWVUYWJsZS5oYXMoZGF0YSkpIHtcclxuICAgICAgICAgIHVuaXF1ZVRhYmxlLnNldChrZXksIGl0ZW0pOyAvLyBTdG9yZSB0aGUgb2JqZWN0IG9ubHkgaWYgaXQncyBjb21wbGV0ZWx5IHVuaXF1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gQXJyYXkuZnJvbSh1bmlxdWVUYWJsZS52YWx1ZXMoKSk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnRhYmxlQXJyYXkgPSB0aGlzLmFzc2lnblNpbmdsZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51cGxvYWQgPT09ICd1cGxvYWQnKSB7XHJcbiAgICAgIHRoaXMudGFibGVBcnJheSA9IHRoaXMuYXNzaWduU2luZ2xlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50YWJsZUFycmF5ID0gdGhpcy50YXNrRGV0YWlscy5hc3NpZ247XHJcbiAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gdGhpcy50YWJsZUFycmF5O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyB0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XHJcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLnRhYmxlQXJyYXkubGVuZ3RoO1xyXG4gICAgaWYodGhpcy50b3RhbEl0ZW1zIDwgNSkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gWzUsMTAsMTUsMjBdO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gNTtcclxuICAgIH1cclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcbiAgXHJcbiAgY292ZXJhZ2U6IGFueSA9ICdzdG9yZSc7XHJcblxyXG4gIHNlbGVjdFJhZGlvKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5jb3ZlcmFnZSA9IGRhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMucGFnZVNpemUgPSA1O1xyXG4gICAgdGhpcy5zZWFyY2hJbnB1dC5zZXRWYWx1ZSgnJyk7XHJcbiAgICB0aGlzLnRhc2tEZXRhaWxzLmFzc2lnbiA9IFtdO1xyXG4gICAgdGhpcy50YWJsZUFycmF5ID0gW107XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgaWYgKGRhdGEgPT09ICdzdG9yZScpIHtcclxuICAgICAgdGhpcy5zdG9yZUNvdmVyYWdlID0gdHJ1ZTtcclxuICAgICAgdGhpcy51c2VyQ292ZXJhZ2UgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdmVyYWdlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zdG9yZUNvdmVyYWdlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdEluaXRpYWxUYWIoKTtcclxuICAgIGlmICh0aGlzLmNvdmVyYWdlID09PSB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5jb3ZlcmFnZSkge1xyXG4gICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLnNpbmdsZUFzc2lnbjtcclxuICAgICAgdGhpcy5ncm91cEFzc2lnbiA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmdyb3VwQXNzaWduO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblR5cGUgPyB0aGlzLnVzZXJEZXRhaWxzKCkgOiAnJztcclxuICAgICAgfSwgMzAwMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IFtdOyB0aGlzLmdyb3VwQXNzaWduID0gW107IHRoaXMuYXNzaWduU2luZ2xlID0gW10sIHRoaXMuYXNzaWduR3JvdXAgPSBbXTsgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0YXNzaWduRHJvcGRvd24oKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1Vc2VycG9wdXAoKSB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuY29uZmlybVVzZXIsIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gICAgZGlhbG9nUmVmLmNsb3NlZC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMgPT09ICdjb25maXJtJykge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXRhaWxzKCdhZGRVc2VyJylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0b3JlTGlzdDogYW55ID0gW107XHJcbiAgc2VhcmNoS2V5OiBhbnkgPSBbXTtcclxuXHJcbiAgZ2V0YXNzaWduRHJvcGRvd24oY2hhbmdlPzphbnkpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBcImNvdmVyYWdlXCI6IHRoaXMuY292ZXJhZ2UsXHJcbiAgICAgIFwiYXNzaWduVHlwZVwiOiB0aGlzLmFzc2lnblR5cGVcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmdldGFzc2lnbkRyb3Bkb3duKGRhdGEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcz8uZGF0YT8uZGF0YTtcclxuICAgICAgICBpZiAoZGF0YT8uY292ZXJhZ2UgPT09ICdzdG9yZScpIHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoS2V5ID0gWydzdG9yZU5hbWUnLCAnY2x1c3Rlck5hbWUnXVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YT8uY292ZXJhZ2UgPT09ICd1c2VyJykge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hLZXkgPSBbJ3VzZXJOYW1lJywgJ3RlYW1OYW1lJ11cclxuICAgICAgICB9XHJcbiAgICAgICAgIWNoYW5nZSA/IHRoaXMuZ2V0SW5pdGlhbERhdGEoKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJyB8fCB0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykgPyB0aGlzLnNpbmdsZUFzc2lnbiA6IHRoaXMuZ3JvdXBBc3NpZ24sIGNoYW5nZSA/IGNoYW5nZSA6ICcnKSA6ICcnO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXNlckRldGFpbHNWMihkYXRhPzogYW55KSB7XHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICBcInRhc2tJZFwiOiB0aGlzLmN1cnJlbnRUYXNrSWQsXHJcbiAgICAgIFwiaWRMaXN0XCI6IHRoaXMuaWRMaXN0LFxyXG4gICAgICBcImNvdmVyYWdlXCI6IHRoaXMuY292ZXJhZ2UsIC8vW1wiY2x1c3RlclwiLFwic3RvcmVcIixcInVzZXJcIixcInRlYW1zXCJdXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIFwic2VhcmNoXCI6IHRoaXMuc2VhcmNoSW5wdXQudmFsdWVcclxuICAgIH1cclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSBbXTtcclxuICAgIHRoaXMudHJheFNlcnZpY2Uuc2VsZWN0dGFza0NoaXBzKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICAgIHRoaXMudGFibGVBcnJheSA9IHJlcz8uZGF0YT8udW5pcXVlQXJyOyBcclxuICAgICAgICAgIHRoaXMuYXNzaWduR3JvdXAgPSB0aGlzLnRhYmxlQXJyYXk7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXM/LmRhdGE/LmNvdW50O1xyXG4gICAgICAgICAgaWYgKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFs1LCAxMCwgMTUsIDIwXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdhc3NpZ25UYWJsZURhdGE/Lmxlbmd0aCcsIHRoaXMuYXNzaWduVGFibGVEYXRhPy5sZW5ndGgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50YWJsZUFycmF5ID0gW107XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRlZCcpXHJcbiAgICAgICAgICAvLyB0aGlzLnNob3dJbWFnZSA9IHRydWU7XHJcbiAgICAgICAgICAvLyB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuc3RvcmVDb3ZlcmFnZSA/IHRoaXMuZ2V0SW5pdGlhbERhdGEocmVzPy5kYXRhPy5zdG9yZUxpc3QpIDogdGhpcy5nZXRJbml0aWFsRGF0YShyZXM/LmRhdGE/LnVzZXJMaXN0KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyPy5tZXNzYWdlKVxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHVzZXJEZXRhaWxzKCkge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGluZycpXHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBpZDogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnRcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0dGFza1VzZXJEZXRhaWxzVjEocGFyYW1zKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgaWYgKHJlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zaG93SW1hZ2UgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnZhbHVlKVxyXG4gICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXMuZGF0YS51c2VyRGV0YWlscy5maWx0ZXIoKGVsOiBhbnkpID0+IGVsPy5jbHVzdGVyTmFtZSA9PSAnJyAmJiBlbD8uc3RvcmVJZCAhPSAnJyk7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnbkdyb3VwID0gcmVzLmRhdGEudXNlckRldGFpbHMuZmlsdGVyKChlbDogYW55KSA9PiBlbD8uY2x1c3Rlck5hbWUgIT09ICcnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXMuZGF0YS51c2VyRGV0YWlscy5maWx0ZXIoKGVsOiBhbnkpID0+IGVsPy50ZWFtTmFtZSA9PSAnJyAmJiBlbD8udXNlck5hbWUgIT0gJycpO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25Hcm91cCA9IHJlcy5kYXRhLnVzZXJEZXRhaWxzLmZpbHRlcigoZWw6IGFueSkgPT4gZWw/LnRlYW1OYW1lICE9PSAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gdGhpcy50YWJsZUFycmF5O1xyXG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMudGFibGVBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgLy8gdGhpcy50b3RhbEl0ZW1zID0gcmVzLmRhdGEuY291bnQ7XHJcbiAgICAgICAgaWYodGhpcy50b3RhbEl0ZW1zIDwgNSkge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwxMCwxNSwyMF07XHJcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuXHJcbiAgICAgICAgLy8gdGhpcy5nZXRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIHNvcnRDb2x1bW46IGFueTtcclxuICBzb3J0Qnk6IGFueSA9IC0xO1xyXG5cclxuICBzb3J0RGF0YSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNvcnRDb2x1bW4gPSB2YWx1ZTtcclxuICAgIHRoaXMuc29ydEJ5ICo9IC0xO1xyXG4gICAgY29uc3Qgc29ydEJ5ID0gcGFyc2VJbnQodGhpcy5zb3J0QnksIDEwKSA9PT0gLTEgPyAtMSA6IDE7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgLy8gaWYgKGFbdGhpcy5zb3J0Q29sdW1uXSA9PSBudWxsIHx8IGJbdGhpcy5zb3J0Q29sdW1uXSA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgICAgLy8gaWYgKHR5cGVvZiBhW3RoaXMuc29ydENvbHVtbl0gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBiW3RoaXMuc29ydENvbHVtbl0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRCeSAqIChhW3RoaXMuc29ydENvbHVtbl0gfHwgJycpLmxvY2FsZUNvbXBhcmUoYlt0aGlzLnNvcnRDb2x1bW5dIHx8ICcnKTtcclxuICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gdGhpcy50YWJsZUFycmF5LnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRBc3NpZ25UYWJsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBcImxpbWl0XCI6IHRoaXMucGFnZVNpemUsXHJcbiAgICAgIFwib2Zmc2V0XCI6IHRoaXMuY3VycmVudFBhZ2UgPiAwID8gdGhpcy5jdXJyZW50UGFnZSAtIDEgOiAwLFxyXG4gICAgICBcInNlYXJjaFwiOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlLFxyXG4gICAgICBcInRhc2tJZFwiOiB0aGlzLmN1cnJlbnRUYXNrSWRcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy50cmF4U2VydmljZS5nZXRUYXNrVXNlckRldGFpbHMocXVlcnkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzLmRhdGEuY291bnRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzPy5kYXRhPy51c2Vycykge1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSByZXMuZGF0YS51c2Vyc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5zZWFyY2hUYWJsZS5sZW5ndGg7XHJcbiAgICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCA1KSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gWzUsIDEwLCAxNSwgMjBdO1xyXG4gICAgICAgIC8vIHRoaXMuc2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnNlYXJjaFRhYmxlLnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAgIC8vIHRoaXMuYXNzaWduVGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgLy8gdGhpcy5hc3NpZ25UYWJsZURhdGEgPyB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlIDogdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2VPZmZzZXQ6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VPZmZzZXRcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgLy8gdGhpcy5zZWFyY2hUYWJsZURhdGEoKTtcclxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5zZWFyY2hUYWJsZS5sZW5ndGg7XHJcbiAgICAgIGlmKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwxMCwxNSwyMF07XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgLy8gdGhpcy50YWJsZURhdGEgPyB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlIDogdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgIC8vIHRoaXMudGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuYXNzaWduVGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vIHRoaXMuZ2V0QXNzaWduVGFibGUoKVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVGFibGU6IGFueTtcclxuICBzZWFyY2hUYWJsZURhdGEoKSB7XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIC8vIHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBzZWFyY2hGaWVsZDogYW55ID0gWydzdG9yZU5hbWUnLCAndXNlck5hbWUnLCAndXNlckVtYWlsJywgJ2NsdXN0ZXJOYW1lJywgJ3RlYW1OYW1lJ107XHJcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJyB8fCB0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykgPyAodGhpcy5zaW5nbGVBc3NpZ24gPSB0aGlzLmlkTGlzdCx0aGlzLmdldFRhYmxlRGF0YSgpKSA6ICh0aGlzLmdyb3VwQXNzaWduID0gdGhpcy5pZExpc3QsdGhpcy51c2VyRGV0YWlsc1YyKCkpO1xyXG4gICAgfSBlbHNlIHsgIFxyXG4gICAgICBjb25zdCBzZWFyY2hEYXRhID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBzZWFyY2hUZXJtID0gc2VhcmNoRGF0YS5zcGxpdCgnLCcpLm1hcCgoZWw6IGFueSkgPT4gZWwudHJpbSgpKTtcclxuICAgICAgdGhpcy5zZWFyY2hUYWJsZSA9IHRoaXMudGFibGVBcnJheT8uZmlsdGVyKChpdGVtOiBhbnkpID0+XHJcbiAgICAgICAgc2VhcmNoRmllbGQuc29tZSgoZmllbGQ6IGFueSkgPT4gc2VhcmNoVGVybS5zb21lKCh0ZXJtOiBhbnkpID0+IGl0ZW1bZmllbGRdPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSkpO1xyXG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLnNlYXJjaFRhYmxlLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwgMTAsIDE1LCAyMF07XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnNlYXJjaFRhYmxlLnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XHJcblxyXG4gICAgLy8gbGV0IHBhcmFtcyA9IHtcclxuICAgIC8vICAgb2Zmc2V0OiAwLFxyXG4gICAgLy8gICBsaW1pdDogdGhpcy5zaXplLFxyXG4gICAgLy8gICBzZWFyY2g6IHRoaXMudGFibGVGaWx0ZXIsXHJcbiAgICAvLyAgIGlkOiB0aGlzLmNoZWNrbGlzdElkLFxyXG4gICAgLy8gICBjbGllbnRJZDp0aGlzLmNsaWVudElkXHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZiAodGhpcy50YWJsZUZpbHRlci5sZW5ndGgpIHtcclxuICAgIC8vICAgdGhpcy5Tb3BTZXJ2aWNlLmdldFVzZXJEZXRhaWxzKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vICAgICBpZiAocmVzID09IG51bGwpIHtcclxuICAgIC8vICAgICAgIHRoaXMuc2hvd0ltYWdlID0gdHJ1ZTtcclxuICAgIC8vICAgICAgIGlmICh0aGlzLnRhYmxlRmlsdGVyLmxlbmd0aClcclxuICAgIC8vICAgICAgICAgdGhpcy5zaG93SW1hZ2UgPSBmYWxzZTtcclxuICAgIC8vICAgICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLnNob3dJbWFnZSA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgdGhpcy50YWJsZURhdGEgPSByZXMuZGF0YS51c2VycztcclxuICAgIC8vICAgICAgIHRoaXMucmVjb3Jkc0NvdW50ID0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xyXG4gICAgLy8gICAgICAgdGhpcy5yZWNvcmRzVG90YWwgPSByZXMuZGF0YS5jb3VudDtcclxuICAgIC8vICAgICAgIGxldCBjb3VudCA9IDAgO1xyXG4gICAgLy8gICAgICAgaWYodGhpcy5yZWNvcmRzVG90YWwgPCA1KSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemUgPSBbdGhpcy5yZWNvcmRzVG90YWxdXHJcbiAgICAvLyAgICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMucmVjb3Jkc1RvdGFsO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemUgPSBbNSwxMCwxNSwyMF1cclxuICAgIC8vICAgICAgICAgdGhpcy5zaXplID0gNTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICAgIHRoaXMudGFibGVEYXRhLmZvckVhY2goKGl0ZW06YW55KSA9PntcclxuICAgIC8vICAgICAgICAgaWYoaXRlbS5jaGVja0ZsYWcgJiYgIXRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbmVkVXNlcnMuaW5jbHVkZXMoaXRlbS5pZCkgJiYgIXRoaXMucmVtb3ZlVXNlcnMuaW5jbHVkZXMoaXRlbS5pZCkpXHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWRVc2Vycy5wdXNoKGl0ZW0uaWQpO1xyXG4gIFxyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWRVc2Vycy5pbmNsdWRlcyhpdGVtLmlkKSkge1xyXG4gICAgLy8gICAgICAgICAgIGNvdW50ICs9MTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSlcclxuICAgIC8vICAgICAgIGlmIChjb3VudCA9PSB0aGlzLnJlY29yZHNDb3VudCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICB0aGlzLnVzZXJEZXRhaWxzKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBkcm9wRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9wZW5Ecm9wZG93bihldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmRyb3BEb3duID0gIXRoaXMuZHJvcERvd247XHJcbiAgfVxyXG5cclxuICBidWxrdXBsb2FkTW9kZWwoKSB7XHJcbiAgICB0aGlzLmRyb3BEb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuYnVsa3VwbG9hZCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZXhjZWxFcnJvcjogYW55O1xyXG5cclxuICBhZnRlclVwbGxvYWQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5leGNlbEVycm9yID0gZGF0YTtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4odGhpcy5hZnRlclZhbGlkYXRpb24sIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gIH1cclxuXHJcbiAgb25Vc2VyQXNzaWduQ2hhbmdlKGV2ZW50OiBib29sZWFuLCBpZDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWV2ZW50KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZFVzZXJzLmFkZChpZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZFVzZXJzLmRlbGV0ZShpZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRvd25sb2FkVGVtcGxhdGVWMigpIHtcclxuICAgIGxldCBleGNlbERhdGE6IGFueSA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVBcnJheSA9PSBudWxsIHx8ICF0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIGNpdHk6JydcclxuICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiAnJyxcclxuICAgICAgICAgICAgICBjaXR5OicnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlQXJyYXkgJiYgdGhpcy50YWJsZUFycmF5Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVBcnJheS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICB1c2VyUGhvbmU6IGl0ZW0udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgY2l0eTppdGVtLmNpdHlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogaXRlbS5jbHVzdGVyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgICBjaXR5Oml0ZW0uY2l0eVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVBcnJheSA9PSBudWxsIHx8ICF0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhjZWxEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgIHVzZXJOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyRW1haWw6ICcnLFxyXG4gICAgICAgICAgICAgIHRlYW1OYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50YWJsZUFycmF5ICYmIHRoaXMudGFibGVBcnJheT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBpdGVtLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgdXNlckVtYWlsOiBpdGVtLnVzZXJFbWFpbCxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICB0ZWFtTmFtZTogaXRlbS50ZWFtTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsIGBDaGVja0xpc3RfJHt0aGlzLmFzc2lnblR5cGV9X2ApO1xyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRUZW1wbGF0ZSgpIHtcclxuICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgIGxpbWl0OiAxMDAwMCxcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICB0YXNrSWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0VGFza1VzZXJEZXRhaWxzKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGV4Y2VsRGF0YTogYW55ID0gW107XHJcbiAgICAgIGlmICh0aGlzLnN0b3JlQ292ZXJhZ2UpIHtcclxuICAgICAgICBpZiAocmVzID09IG51bGwpIHtcclxuICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgY2x1c3Rlck5hbWU6ICcnLFxyXG4gICAgICAgICAgICB1c2VyRW1haWw6ICcnLFxyXG4gICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgIHVzZXJQaG9uZTogJycsXHJcbiAgICAgICAgICAgIGNpdHk6ICcnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgcmVzLmRhdGEudXNlcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICBzdG9yZU5hbWU6IGl0ZW0uc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICAgIGNsdXN0ZXJOYW1lOiBpdGVtLmNsdXN0ZXJOYW1lLFxyXG4gICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGl0ZW0udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiBpdGVtLnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICBjaXR5OiBpdGVtLmNpdHlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgIC8vIHN0b3JlTmFtZTogJycsXHJcbiAgICAgICAgICAgIHRlYW1OYW1lOiAnJyxcclxuICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgdXNlck5hbWU6ICcnLFxyXG4gICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICBjaXR5OicnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHJlcz8uZGF0YT8udXNlcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAvLyBzdG9yZU5hbWU6IGl0ZW0uc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICAgIHRlYW1OYW1lOiBpdGVtLnRlYW1OYW1lLFxyXG4gICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGl0ZW0udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiBpdGVtLnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICBjaXR5Oml0ZW0uY2l0eVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsICdUYXNrX1VzZXJsaXN0XycpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBc3NpZ24oZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy51cGxvYWQgPSAnJztcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgLy8gaWYgKHRoaXMudGFza0RldGFpbHMpIHtcclxuICAgICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24gPSBldmVudDtcclxuICAgICAgY29uc3QgYXNzaWduZWR1c2VyID0gZXZlbnQubWFwKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtpZDogZWw/Ll9pZCx0eXBlOiBlbD8udHlwZX1cclxuICAgICAgfSlcclxuICAgICAgLy8gdGhpcy5pZExpc3QgPSBldmVudC5tYXAoKGVsOiBhbnkpID0+IHtcclxuICAgICAgLy8gICByZXR1cm4gZWw/Ll9pZFxyXG4gICAgLy8gfSlcclxuICAgIHRoaXMuaWRMaXN0ID0gYXNzaWduZWR1c2VyO1xyXG4gICAgdGhpcy5zZWFyY2hJbnB1dC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnIHx8IHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSA/ICh0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuaWRMaXN0LHRoaXMuZ2V0VGFibGVEYXRhKCkpIDogKHRoaXMuZ3JvdXBBc3NpZ24gPSB0aGlzLmlkTGlzdCx0aGlzLnVzZXJEZXRhaWxzVjIoZXZlbnQpKTtcclxuICB9XHJcbiBcclxuICByZW1vdmVkQ2hpcChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkgPSB0aGlzLnRhYmxlQXJyYXkuZmlsdGVyKChpdGVtOmFueSkgPT4gIWV2ZW50LmluY2x1ZGVzKGl0ZW0uX2lkKSlcclxuICAgIHRoaXMudGFza0RldGFpbHMuYXNzaWduID0gdGhpcy50YXNrRGV0YWlscy5hc3NpZ24uZmlsdGVyKChpdGVtOiBhbnkpID0+ICFldmVudC5pbmNsdWRlcyhpdGVtLl9pZCkpXHJcbiAgfVxyXG5cclxuICB0YWJsZUFycmF5OiBhbnkgPSBbXTtcclxuICBleGNlbERhdGE6IGFueTtcclxuICBzaG93VXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dUZWFtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd1N0b3JlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0NsdXN0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgb25GaWxlVXBsb2FkKGV2ZW50OiBhbnksIHJldXBsb2FkPzogYW55KSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVkU3RvcmUgPSBbXTtcclxuICAgICAgdGhpcy52YWxpZGF0ZWRVc2VyID0gW107XHJcbiAgICAgIHRoaXMudmFsaWRhdGVkQ2x1c3RlciA9IFtdO1xyXG4gICAgICB0aGlzLnZhbGlkYXRlZFRlYW0gPSBbXTtcclxuICAgICAgdGhpcy5uZXdVc2VyID0gW107XHJcbiAgICAgIHRoaXMuaW5hY3RpdmVTdG9yZXMgPSBbXTtcclxuICAgICAgdGhpcy5zaG93VXNlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dUZWFtID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1N0b3JlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd0NsdXN0ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93SW5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMucmV1cGxvYWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGxvYWQgPSAndXBsb2FkJztcclxuICAgICAgdGhpcy51c2VyRGF0YSA9IHRoaXMuZXhjZWxVc2VyRGF0YSA9IFtdO1xyXG4gICAgICBsZXQgZGF0YTogYW55O1xyXG4gICAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+KGV2ZW50LnRhcmdldCk7XHJcbiAgICAgIGxldCBpc0V4Y2VsRmlsZSA9ICEhdGFyZ2V0LmZpbGVzWzBdLm5hbWUubWF0Y2goLygueGxzfC54bHN4KS8pO1xyXG4gICAgICBsZXQgZXJyb3I6IGFueSA9IFtdO1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlmIChpc0V4Y2VsRmlsZSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyh0YXJnZXQuZmlsZXNbMF0pO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gucmVhZChic3RyLCB7IHR5cGU6ICdiaW5hcnknIH0pO1xyXG4gICAgICAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gICAgICAgICAgY29uc3Qgd3M6IFhMU1guV29ya1NoZWV0ID0gd2IuU2hlZXRzW3dzbmFtZV07XHJcbiAgICAgICAgICBkYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHdzKTtcclxuICAgICAgICAgIHRoaXMuZXhjZWxEYXRhID0gZGF0YTtcclxuICAgICAgICAgIGlmKCFkYXRhLmxlbmd0aCB8fCAoZGF0YS5zb21lKChpdGVtOiBhbnkpID0+ICdjbHVzdGVyTmFtZScgaW4gaXRlbSB8fCAndGVhbU5hbWUnIGluIGl0ZW0pKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdQbGVhc2UgVXBsb2FkIGEgVmFsaWQgZmlsZS4nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVxdWlyZWRLZXlzID0gdGhpcy5zdG9yZUNvdmVyYWdlID8gWydzdG9yZU5hbWUnLCd1c2VyTmFtZScsICd1c2VyRW1haWwnXSA6IFsndXNlck5hbWUnLCAndXNlckVtYWlsJ107IC8vIE11c3QgYWx3YXlzIGJlIHByZXNlbnRcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbmFsS2V5cyA9IHRoaXMuc3RvcmVDb3ZlcmFnZSA/IFsndXNlclBob25lJywgJ2NpdHknXSA6IFsndXNlclBob25lJywgJ2NpdHknXTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcclxuICAgICAgICAgICAgY29uc3QgaGFzUmVxdWlyZWRLZXlzID0gcmVxdWlyZWRLZXlzLmV2ZXJ5KGtleSA9PiBrZXlzLmluY2x1ZGVzKGtleSkpO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxLZXlzQXJlQWxsb3dlZCA9IGtleXMuZXZlcnkoa2V5ID0+IFxyXG4gICAgICAgICAgICAgIHJlcXVpcmVkS2V5cy5pbmNsdWRlcyhrZXkpIHx8IG9wdGlvbmFsS2V5cy5pbmNsdWRlcyhrZXkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiBoYXNSZXF1aXJlZEtleXMgJiYgYWxsS2V5c0FyZUFsbG93ZWQ7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIFVwbG9hZCBhIFZhbGlkIGZpbGUuJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTphbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICgoaXRlbT8uc3RvcmVOYW1lICYmIGl0ZW0/LnN0b3JlTmFtZS50cmltKCkgIT0gJycgJiYgaXRlbT8uc3RvcmVOYW1lLnRyaW0oKSAhPSBudWxsKSB8fCAoaXRlbT8udXNlck5hbWUgJiYgaXRlbT8udXNlck5hbWUudHJpbSgpICE9ICcnICYmIGl0ZW0/LnVzZXJOYW1lLnRyaW0oKSAhPSBudWxsKSB8fCAoaXRlbT8udXNlckVtYWlsICYmIGl0ZW0/LnVzZXJFbWFpbC50cmltKCkgIT0gJycgJiYgaXRlbT8udXNlckVtYWlsLnRyaW0oKSAhPSBudWxsKSlcclxuICAgICAgICAgIH0pXHJcbiAgICBcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50LnVzZXJFbWFpbCA9IGVsZW1lbnQ/LnVzZXJFbWFpbC5yZXBsYWNlKC9cXHMvZywnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmVDb3ZlcmFnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChlbGVtZW50LnN0b3JlTmFtZSAmJiBlbGVtZW50LnN0b3JlTmFtZS50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQuc3RvcmVOYW1lID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBTdG9yZU5hbWUgLSBBJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQudXNlck5hbWUgJiYgZWxlbWVudC51c2VyTmFtZS50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlck5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIFVzZXJOYW1lIC0gQiR7aW5kZXgrMn1gKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKChlbGVtZW50LnVzZXJFbWFpbCAmJiBlbGVtZW50LnVzZXJFbWFpbC50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlckVtYWlsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCB1c2VyRW1haWwgLSBDJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudD8udXNlckVtYWlsICYmICFlbGVtZW50LnVzZXJFbWFpbC5tYXRjaCgvXlthLXpBLVowLTkuXy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsNn0kLykpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCB1c2VyRW1haWwgLSBDJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbHVzdGVyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbHVzdGVyTmFtZS50cmltKCkgPT0gJycgfHwgZWxlbWVudC5jbHVzdGVyTmFtZSA9PSBudWxsKSB7IGVycm9yLnB1c2goYEludmFsaWQgY2x1c3Rlck5hbWUgLSBEJHtpbmRleCArIDJ9YCkgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlICYmICFlbGVtZW50Py5zdG9yZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoZWxlbWVudC51c2VyTmFtZSAmJiBlbGVtZW50LnVzZXJOYW1lLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC51c2VyTmFtZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVycm9yLnB1c2goYEludmFsaWQgVXNlck5hbWUgLSBBJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQudXNlckVtYWlsICYmIGVsZW1lbnQudXNlckVtYWlsLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC51c2VyRW1haWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEIke2luZGV4KzJ9YClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwgJiYgIWVsZW1lbnQudXNlckVtYWlsLm1hdGNoKC9eW2EtekEtWjAtOS5fLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw2fSQvKSkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEIke2luZGV4KzJ9YClcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZWFtTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZWFtTmFtZS50cmltKCkgPT0gJycgfHwgZWxlbWVudC50ZWFtTmFtZSA9PSBudWxsKSB7IGVycm9yLnB1c2goYEludmFsaWQgdGVhbU5hbWUgLSBDJHtpbmRleCArIDJ9YCkgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSB1cGxvYWQgYSB2YWxpZCBmaWxlLicpXHJcbiAgICAgICAgICAgICAgVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lOiBlbGVtZW50Py5zdG9yZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgICAgICAgICAgdXNlck5hbWU6IGVsZW1lbnQ/LnVzZXJOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogZWxlbWVudD8udXNlckVtYWlsPy50b0xvd2VyQ2FzZSgpPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBjaXR5OiBlbGVtZW50Py5jaXR5LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOidzdG9yZSdcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogZWxlbWVudD8uc3RvcmVOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogZWxlbWVudD8uY2x1c3Rlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBjaXR5OiBlbGVtZW50Py5jaXR5LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOidjbHVzdGVyJ1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VyQ292ZXJhZ2UpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5hc3NpZ25UeXBlID09PSAndXNlcicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyUGhvbmU6IGVsZW1lbnQ/LnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gY2hlY2tGbGFnOiBlbGVtZW50Py5jaGVjayA/IGVsZW1lbnQuY2hlY2sgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgdHlwZTondXNlcidcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB0ZWFtTmFtZTogZWxlbWVudD8udGVhbU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAndGVhbXMnXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoZXJyb3IubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlwcm9wOiBmYWxzZSxcclxuICAgICAgICAgICAgICBpbWFnZXNyYzogIGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgICAgY29udGVudDogYFBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIHN0b3JlIGluZm9ybWF0aW9uLmAsXHJcbiAgICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICBlcnJvcjplcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICFWYWxpZGF0aW9uRXJyb3IgPyB0aGlzLmFmdGVyVXBsbG9hZCgpIDogJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLmZpbGVJbnB1dDEpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIFVwbG9hZCBhIEV4Y2VsIGZpbGUuJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICB1cGxvYWQ6IGFueSA9ICd1cGxvYWQnO1xyXG4gIHZhbGlkYXRlZFN0b3JlOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRVc2VyOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRDbHVzdGVyOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRUZWFtOiBhbnkgPSBbXTtcclxuICBuZXdVc2VyOiBhbnkgPSBbXTtcclxuICBpbmFjdGl2ZVN0b3JlczogYW55ID0gW107XHJcbiAgc2hvd0luYWN0aXZlOiBhbnk9IGZhbHNlIDtcclxuXHJcbiAgdmFsaWRhdGVEZXRhaWxzKGFkZFVzZXI/OmFueSkgeyAgICBcclxuICAgICAgbGV0IHBhcmFtczphbnkgPSB7XHJcbiAgICAgICAgdGFza0lkOiB0aGlzLmN1cnJlbnRUYXNrSWQsXHJcbiAgICAgICAgLy8gYXNzaWduVXNlcnM6IHRoaXMudXNlckRhdGEsXHJcbiAgICAgICAgYXNzaWduZWRVc2VyczogdGhpcy51c2VyRGF0YSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgICAgY292ZXJhZ2U6IHRoaXMuY292ZXJhZ2VcclxuICAgIH1cclxuICAgIGFkZFVzZXIgPyBwYXJhbXMuYWRkVXNlciA9IHRydWUgOiAnJztcclxuICAgIHRoaXMudHJheFNlcnZpY2UudGFza3ZhbGlkYXRlVXNlcnYxKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMudXBsb2FkID09PSAnc3RvcmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVBcnJheS51bnNoaWZ0KC4uLnJlcz8uZGF0YT8uZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbiA9IHRoaXMudGFibGVBcnJheTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnRhYmxlQXJyYXkubWFwKChlbDphbnkpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4geyBpZDogZWw/Ll9pZCwgdHlwZTogZWw/LnR5cGUgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmlkTGlzdCA9IGRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlQXNzaWduID0gdGhpcy5pZExpc3Q7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVEYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInID8gdGhpcy5nZXRhc3NpZ25Ecm9wZG93bignY2hhbmdlJykgOiAnJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKVxyXG4gICAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXM/LmRhdGE/LmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gcmVzPy5kYXRhPy5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5hc3NpZ24gPSB0aGlzLnRhYmxlQXJyYXk7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gcmVzPy5kYXRhPy5kYXRhLm1hcCgoZWw6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IGVsPy5faWQsIHR5cGU6IGVsPy50eXBlIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5pZExpc3QgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuaWRMaXN0O1xyXG4gICAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICAgICAgdGhpcy5nZXRUYWJsZURhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5hc3NpZ25UeXBlID09PSAndXNlcicgPyB0aGlzLmdldGFzc2lnbkRyb3Bkb3duKCdjaGFuZ2UnKSA6ICcnOyBcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycj8uZXJyb3I/LmVycm9yICYmIGVycj8uZXJyb3I/LmNvZGUgPT0gNDAwKSB7XHJcbiAgICAgICAgICBsZXQgZXJyb3JEYXRhID0gZXJyPy5lcnJvcj8uZXJyb3I7XHJcbiAgICAgICAgICB0aGlzLmV4Y2VsRGF0YSA9IGVycm9yRGF0YT8uZGF0YTtcclxuICAgICAgICAgIHRoaXMudXNlckRhdGEgPSBlcnJvckRhdGE/LmRhdGE7XHJcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhLmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGBBbHJlYWR5ICR7ZXJyb3JEYXRhLmV4aXN0RW1haWwudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YS5zdG9yZT8ubGVuZ3RoICYmICFlcnJvckRhdGEuZXhpc3RFbWFpbD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkU3RvcmUgPSBlcnJvckRhdGE/LnN0b3JlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dTdG9yZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKCk7XHJcbiAgICAgICAgICB9ZWxzZSBpZiAoZXJyb3JEYXRhLnN0b3JlPy5sZW5ndGggJiYgZXJyb3JEYXRhLmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAhZXJyb3JEYXRhPy5pbkFjdGl2ZVN0b3Jlcz8ubGVuZ3RoID8gdGhpcy5kaWFsb2cuZGlzbWlzc0FsbCgpIDogJyc7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYEFscmVhZHkgJHtlcnJvckRhdGEuc3RvcmUudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YT8uaW5BY3RpdmVTdG9yZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmluYWN0aXZlU3RvcmVzID0gZXJyb3JEYXRhPy5pbkFjdGl2ZVN0b3JlcztcclxuICAgICAgICAgICAgdGhpcy5zaG93SW5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZCgpO1xyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YT8udXNlcj8ubGVuZ3RoICYmICFlcnJvckRhdGE/LmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlZFVzZXIgPSBlcnJvckRhdGEudXNlcjtcclxuICAgICAgICAgICAgdGhpcy5zaG93VXNlciA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZCA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlybVVzZXJwb3B1cCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmIChlcnJvckRhdGE/LnVzZXI/Lmxlbmd0aCAmJiBlcnJvckRhdGE/LmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYEFscmVhZHkgJHtlcnJvckRhdGE/LnVzZXIudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVycm9yRGF0YT8uZHVwbGljYXRlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChgJHtlcnJvckRhdGE/LmR1cGxpY2F0ZXM/LnRvU3RyaW5nKCl9IC0gJHtlcnJvckRhdGE/Lm1lc3NhZ2V9YClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gIH0gXHJcblxyXG4gIFJldXBsb2FkKCkge1xyXG4gICAgLy8gdGhpcy5kaWFsb2cuZGlzbWlzc0FsbCgpO1xyXG4gICAgdGhpcy52YWxpZGF0ZWRTdG9yZSA9IFtdO1xyXG4gICAgdGhpcy52YWxpZGF0ZWRVc2VyID0gW107XHJcbiAgICB0aGlzLnZhbGlkYXRlZENsdXN0ZXIgPSBbXTtcclxuICAgIHRoaXMudmFsaWRhdGVkVGVhbSA9IFtdO1xyXG4gICAgdGhpcy5uZXdVc2VyID0gW107XHJcbiAgICB0aGlzLmluYWN0aXZlU3RvcmVzID0gW107XHJcbiAgICB0aGlzLnNob3dVc2VyID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dUZWFtID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dTdG9yZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q2x1c3RlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93SW5hY3RpdmUgPSBmYWxzZTtcclxuICAgIGlmKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICB0aGlzLmZpbGVJbnB1dDEubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMicpO1xyXG4gICAgZWxlPy5jbGljaygpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG4gIGNsb3NlYWN0aXZlcG9wdXAoKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5kaXNtaXNzQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyBvbkZpbGVVcGxvYWQoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgLy9FbXB0eSBzaGVldCB2YWxpZGF0aW9uIC0tLWRvbmVcclxuICAvLyAgIC8vZW1wdHkgZmllbGQgdmFsaWRhdGlvbiBmb3Igc3RvcmVOYW1lLCB1c2VyTmFtZSwgdXNlckVtYWlsLCBjaXR5LiBJIFxyXG4gIC8vICAgLy8gdmFsaWRhdGUgdXNlciBlbWFpbFxyXG4gIC8vICAgLy8gRW1haWwgdW5pcXVlIGZvciBzdG9yZVxyXG4gIC8vICAgLy8gRW1haWwgdW5pcXVlIGZvciB1c2VybmFtZVxyXG4gIC8vICAgY29uc3QgdGFyZ2V0OiBEYXRhVHJhbnNmZXIgPSA8RGF0YVRyYW5zZmVyPihldmVudC50YXJnZXQpO1xyXG4gIC8vICAgLy8gbGV0IGlzRXhjZWxGaWxlID0gISF0YXJnZXQuZmlsZXNbMF0ubmFtZS5tYXRjaCgvKC54bHN8Lnhsc3gpLyk7XHJcblxyXG4gIC8vICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAvLyAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGJzdHI6IHN0cmluZyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAvLyAgICAgY29uc3Qgd2I6IFhMU1guV29ya0Jvb2sgPSBYTFNYLnJlYWQoYnN0ciwgeyB0eXBlOiAnYmluYXJ5JyB9KTtcclxuICAvLyAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gIC8vICAgICBjb25zdCB3czogWExTWC5Xb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGpzb25XaXRoUG9zaXRpb246IGFueVtdID0gW107XHJcblxyXG4gIC8vICAgICBjb25zdCByYW5nZSA9IFhMU1gudXRpbHMuZGVjb2RlX3JhbmdlKHdzWychcmVmJ10gfHwgJycpO1xyXG5cclxuICAvLyAgICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPSBbXTtcclxuICAvLyAgICAgZm9yIChsZXQgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xyXG4gIC8vICAgICAgIGNvbnN0IGNlbGxBZGRyZXNzID0gWExTWC51dGlscy5lbmNvZGVfY2VsbCh7IHI6IHJhbmdlLnMuciwgYzogQyB9KTtcclxuICAvLyAgICAgICBjb25zdCBoZWFkZXIgPSB3c1tjZWxsQWRkcmVzc10/LnYgfHwgYENvbHVtbiR7QyArIDF9YDtcclxuICAvLyAgICAgICBoZWFkZXJzLnB1c2goaGVhZGVyKTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgZm9yIChsZXQgUiA9IHJhbmdlLnMuciArIDE7IFIgPD0gcmFuZ2UuZS5yOyArK1IpIHtcclxuICAvLyAgICAgICBjb25zdCByb3dEYXRhOiBhbnkgPSB7IHJvdzogUiArIDEgfTtcclxuXHJcbiAgLy8gICAgICAgZm9yIChsZXQgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xyXG4gIC8vICAgICAgICAgY29uc3QgY2VsbEFkZHJlc3MgPSBYTFNYLnV0aWxzLmVuY29kZV9jZWxsKHsgcjogUiwgYzogQyB9KTtcclxuICAvLyAgICAgICAgIGNvbnN0IGNlbGwgPSB3c1tjZWxsQWRkcmVzc107XHJcbiAgLy8gICAgICAgICBjb25zdCBoZWFkZXIgPSBoZWFkZXJzW0MgLSByYW5nZS5zLmNdO1xyXG5cclxuICAvLyAgICAgICAgIHJvd0RhdGFbaGVhZGVyXSA9IGNlbGw/LnYgfHwgXCJcIjtcclxuICAvLyAgICAgICAgIHJvd0RhdGFbYGNvbHVtbl8ke2hlYWRlcn1gXSA9IFhMU1gudXRpbHMuZW5jb2RlX2NvbChDKTtcclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGpzb25XaXRoUG9zaXRpb24ucHVzaChyb3dEYXRhKTtcclxuICAvLyAgICAgfVxyXG5cclxuXHJcbiAgLy8gICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGpzb25XaXRoUG9zaXRpb24uZmlsdGVyKHJvdyA9PiB7XHJcbiAgLy8gICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKGtleSA9PiAha2V5LnN0YXJ0c1dpdGgoJ2NvbHVtbl8nKSAmJiBrZXkgIT09ICdyb3cnKTtcclxuICAvLyAgICAgICByZXR1cm4ga2V5cy5zb21lKGtleSA9PiByb3dba2V5XS50cmltKCkgIT09IHVuZGVmaW5lZCAmJiByb3dba2V5XS50cmltKCkgIT09IG51bGwgJiYgcm93W2tleV0udHJpbSgpICE9PSBcIlwiKTtcclxuICAvLyAgICAgfSk7XHJcblxyXG5cclxuICAvLyAgICAgaWYgKCFmaWx0ZXJlZERhdGEubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYFBsZWFzZSBlbnRlciB2YWxpZCBkZXRhaWxzYClcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgY29uc3QgZW1wdHlLZXlzOiBhbnlbXSA9IFtdXHJcbiAgLy8gICAgIGNvbnN0IGludmFsaWRFbWFpbHM6IGFueVtdID0gW11cclxuXHJcbiAgLy8gICAgIGZpbHRlcmVkRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAvLyAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoa2V5ID0+ICFrZXkuc3RhcnRzV2l0aCgnY29sdW1uXycpICYmIGtleSAhPT0gJ3JvdycpXHJcblxyXG4gIC8vICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoa2V5ID09PSAndXNlckVtYWlsJykge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xyXG4gIC8vICAgICAgICAgICBjb25zdCBpc1ZhbGlkTWFpbCA9IGVtYWlsUmVnZXgudGVzdChyb3dbJ3VzZXJFbWFpbCddKTtcclxuICAvLyAgICAgICAgICAgaWYgKCFpc1ZhbGlkTWFpbCkgaW52YWxpZEVtYWlscy5wdXNoKHJvd1tgY29sdW1uXyR7a2V5fWBdICsgcm93LnJvdylcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmICghcm93W2tleV0gJiYgKGtleSA9PT0gJ3N0b3JlTmFtZScgfHwga2V5ID09PSAndXNlckVtYWlsJyB8fCBrZXkgPT09ICd1c2VyTmFtZScpKSBlbXB0eUtleXMucHVzaChyb3dbYGNvbHVtbl8ke2tleX1gXSArIHJvdy5yb3cpXHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIGlmIChlbXB0eUtleXMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYFBsZWFzZSBmaWxsIHRoZSBjZWxscyAke2VtcHR5S2V5cy5qb2luKCcsICcpfWApXHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChpbnZhbGlkRW1haWxzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGBQbGVhc2UgZW50ZXIgdmFsaWQgZW1haWxzIGF0ICR7aW52YWxpZEVtYWlscy5qb2luKCcsICcpfWApXHJcbiAgLy8gICAgIH1cclxuXHJcblxyXG4gIC8vICAgICBjb25zdCBncm91cGVkQnlFbWFpbCA9IGZpbHRlcmVkRGF0YS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghYWNjW2l0ZW0udXNlckVtYWlsXSkge1xyXG4gIC8vICAgICAgICAgYWNjW2l0ZW0udXNlckVtYWlsXSA9IFtdO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBhY2NbaXRlbS51c2VyRW1haWxdLnB1c2goaXRlbS5zdG9yZU5hbWUpO1xyXG4gIC8vICAgICAgIHJldHVybiBhY2M7XHJcbiAgLy8gICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPik7XHJcblxyXG4gIC8vICAgICBjb25zdCB1bmlxdWVSZXN1bHQgPSBPYmplY3QuZW50cmllcyhncm91cGVkQnlFbWFpbCkubWFwKChbZW1haWwsIHN0b3JlTmFtZXNdKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgdW5pcXVlU3RvcmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPihzdG9yZU5hbWVzIGFzIHN0cmluZyk7XHJcbiAgLy8gICAgICAgcmV0dXJuIHtcclxuICAvLyAgICAgICAgIHVzZXJFbWFpbDogZW1haWwsXHJcbiAgLy8gICAgICAgICBpc1N0b3JlTmFtZVVuaXF1ZTogdW5pcXVlU3RvcmVOYW1lcy5zaXplID09PSAoc3RvcmVOYW1lcyBhcyBBcnJheTxzdHJpbmc+KS5sZW5ndGgsXHJcbiAgLy8gICAgICAgICBzdG9yZU5hbWVzOiBBcnJheS5mcm9tKHVuaXF1ZVN0b3JlTmFtZXMpLFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH0pO1xyXG5cclxuICAvLyAgICAgY29uc3Qgbm90VW5pcXVlID0gdW5pcXVlUmVzdWx0LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNTdG9yZU5hbWVVbmlxdWUpLm1hcCgoaXRlbSkgPT4gaXRlbS51c2VyRW1haWwpXHJcblxyXG4gIC8vICAgICBpZiAobm90VW5pcXVlLmxlbmd0aCkge1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGAke25vdFVuaXF1ZS5qb2luKCcsICcpfSBzaG91bGQgYmUgdW5pcXVlIGZvciBzdG9yZSBuYW1lYClcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnXHJcblxyXG4gIC8vICAgICBjb25zdCBhc3NpZ25MaXN0ID0gZmlsdGVyZWREYXRhLm1hcCgoZGF0YSkgPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiB7XHJcbiAgLy8gICAgICAgICBzdG9yZU5hbWU6IGRhdGEuc3RvcmVOYW1lLFxyXG4gIC8vICAgICAgICAgdXNlckVtYWlsOiBkYXRhLnVzZXJFbWFpbCxcclxuICAvLyAgICAgICAgIHVzZXJOYW1lOiBkYXRhLnVzZXJOYW1lLFxyXG4gIC8vICAgICAgICAgdXNlclBob25lOiBkYXRhPy51c2VyUGhvbmUsXHJcbiAgLy8gICAgICAgICBjaXR5OiBkYXRhPy5jaXR5XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuXHJcbiAgLy8gICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgLy8gICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAvLyAgICAgICB1cGxvYWRVc2VyOiB0cnVlLFxyXG4gIC8vICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGEuY2xpZW50LFxyXG4gIC8vICAgICAgIGFzc2lnbmVkVXNlcnM6IGFzc2lnbkxpc3RcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgdGhpcy51cGxvYWRBc3NpZ25lZXNMaXN0KHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAocmVzPy5kYXRhPy52YWxpZGF0ZSkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmdldEFzc2lnblRhYmxlKClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmIChyZXM/LmRhdGE/LnVzZXI/Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgLy8gICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gIC8vICAgICAgICAgICAgIGltYWdlc3JjOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+JyxcclxuICAvLyAgICAgICAgICAgICB0aXRsZTogYEludml0ZSBuZXcgdXNlcnMgYWRkZWQgaW4gQ1NWYCxcclxuICAvLyAgICAgICAgICAgICBjb250ZW50OiBgVGhpcyBDU1YgY29udGFpbnMgbmV3IHVzZXJzLiBJbnZpdGUgdXNlcnMgYnkgc2VuZGluZyBtYWlsIHRvIHRoZW1gLFxyXG4gIC8vICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdJbnZpdGUnLFxyXG4gIC8vICAgICAgICAgICAgIHVzZXI6IHJlcy5kYXRhLnVzZXJcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRyYXhwb3B1cENvbXBvbmVudCwge1xyXG4gIC8vICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnXHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHBvcHVwY29udGVudDtcclxuICAvLyAgICAgICAgICAgZGlhbG9nUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT09ICdjb25maXJtJykge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAvLyAgICAgICAgICAgICAgICAgdXBsb2FkVXNlcjogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQsXHJcbiAgLy8gICAgICAgICAgICAgICAgIGFzc2lnbmVkVXNlcnM6IGFzc2lnbkxpc3RcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkLCB7IGFkZFVzZXI6IHRydWUgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFzc2lnblRhYmxlKClcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmIChyZXM/LmRhdGE/LnN0b3JlPy5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZXMobWVzc2FnZXM6IGFueVtdKTogc3RyaW5nIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBncm91cGVkTWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG5cclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKCh7IHN0b3JlLCBtZXNzYWdlIH0pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZE1lc3NhZ2VzW3N0b3JlXSkge1xyXG4gIC8vICAgICAgICAgICAgICAgICBncm91cGVkTWVzc2FnZXNbc3RvcmVdID0gW107XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICBncm91cGVkTWVzc2FnZXNbc3RvcmVdLnB1c2gobWVzc2FnZSk7XHJcbiAgLy8gICAgICAgICAgICAgfSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2VzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBlZE1lc3NhZ2VzKS5tYXAoKFtzdG9yZSwgbXNnc10pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHJldHVybiBgJHttc2dzLmpvaW4oJywgJyl9IGluICR7c3RvcmV9YDtcclxuICAvLyAgICAgICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2VzLmpvaW4oJywgJyk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChmb3JtYXRNZXNzYWdlcyhyZXM/LmRhdGE/LnN0b3JlKSlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9LFxyXG4gIC8vICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdTb21ldGhpbmcgd2VudCB3cm9uZycpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBhZGRTdG9yZUNvbXBvbmVudCgpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVHJheFN0b3JlQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHtcclxuICAgICAgY2hlY2tsaXN0SWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgb2JqOiB7XHJcbiAgICAgICAgY2hlY2tMaXN0SWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgICAgfSxcclxuICAgICAgY292ZXJhZ2U6IHRoaXMuY292ZXJhZ2UsXHJcbiAgICB9O1xyXG5cclxuICAgIGRpYWxvZ1JlZi5yZXN1bHQudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmKHJlcykge1xyXG4gICAgICAgIHRoaXMudXNlckRhdGEgPSByZXM7XHJcbiAgICAgICAgdGhpcy51cGxvYWQgPSAnc3RvcmUnO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXRhaWxzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGRpYWxvZ1JlZi5yZXN1bHQudGhlbigocmVzKSA9PiB7XHJcbiAgICAvLyAgIGlmIChyZXMpIHtcclxuICAgIC8vICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgLy8gICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgIC8vICAgICAgIHVwbG9hZFVzZXI6IHRydWUsXHJcbiAgICAvLyAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgIC8vICAgICAgIGFzc2lnbmVkVXNlcnM6IHJlc1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgdGhpcy51cGxvYWRBc3NpZ25lZXNMaXN0KHBheWxvYWQsIHsgZGVsZXRlOiBmYWxzZSB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgICAgIG5leHQ6IChyZXMxOiBhbnkpID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKHJlczEuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgaWYgKHJlczE/LmRhdGE/LnVzZXI/Lmxlbmd0aCkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgLy8gICAgICAgICAgICAgICBkaXNwbGF5cHJvcDogZmFsc2UsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGltYWdlc3JjOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+JyxcclxuICAgIC8vICAgICAgICAgICAgICAgdGl0bGU6IGBJbnZpdGUgbmV3IHVzZXJzIGFkZGVkIGluIENTVmAsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBUaGlzIENTViBjb250YWlucyBuZXcgdXNlcnMuIEludml0ZSB1c2VycyBieSBzZW5kaW5nIG1haWwgdG8gdGhlbWAsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdJbnZpdGUnLFxyXG4gICAgLy8gICAgICAgICAgICAgICB1c2VyOiByZXMxLmRhdGEudXNlclxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUcmF4cG9wdXBDb21wb25lbnQsIHtcclxuICAgIC8vICAgICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCdcclxuICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRhdGEgPSBwb3B1cGNvbnRlbnQ7XHJcbiAgICAvLyAgICAgICAgICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT09ICdjb25maXJtJykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgdXBsb2FkVXNlcjogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGEuY2xpZW50LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgYXNzaWduZWRVc2VyczogcmVzXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkLCB7IGRlbGV0ZTogZmFsc2UsIGFkZFVzZXI6IHRydWUgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXNzaWduVGFibGUoKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5nZXRBc3NpZ25UYWJsZSgpXHJcbiAgICAvLyAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pXHJcblxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVDb3VudHMoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVN0b3JlTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOmFueSkgPT4gaXRlbS5zdG9yZU5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVN0b3JlTmFtZXMuc2l6ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyQ292ZXJhZ2UpIHtcclxuICAgICAgY29uc3QgdW5pcXVlVXNlck5hbWVzID0gbmV3IFNldChkYXRhLm1hcCgoaXRlbTphbnkpID0+IGl0ZW0udXNlck5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVVzZXJOYW1lcy5zaXplO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkOiBhbnksIGV4dHJhQXJncz86IGFueSkge1xyXG4gICAgY29uc3QgcmVxUGF5bG9hZCA9IHtcclxuICAgICAgLi4ucGF5bG9hZCxcclxuICAgICAgLi4uZXh0cmFBcmdzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50cmF4U2VydmljZS51cGxvYWRUYXNrQXNzaWduZWVzKHJlcVBheWxvYWQpXHJcbiAgfVxyXG5cclxuICBnZXRGb3JtQ29udHJvbEZyb21BcnJheShpbmRleDogbnVtYmVyKTogRm9ybUNvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuYXQoaW5kZXgpIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgYWRkTW9yZVNjaGVkdWxlcygpIHtcclxuICAgIGNvbnN0IHNjaGVkdWxlVmFsdWUgPSB0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVPcHRpb25zLmZpbHRlcigodmFsKSA9PiAhdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcz8udmFsdWUuaW5jbHVkZXModmFsKSlcclxuICAgIGlmICh0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5wdXNoKHRoaXMuZmIuY29udHJvbChzY2hlZHVsZVZhbHVlWzBdKSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc2FibGVTY2hlZHVsZU9wdGlvbihvcHRpb246IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMudmFsdWUuaW5jbHVkZXMob3B0aW9uKVxyXG4gIH1cclxuXHJcbiAgZW5hYmxlUmVtaW5kZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY2xlYXIoKVxyXG4gICAgICB0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLnB1c2godGhpcy5mYi5jb250cm9sKHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZU9wdGlvbnNbMF0pKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5jbGVhcigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIC8vIEFkZCBhIHZpc3VhbCBlZmZlY3QgdG8gaW5kaWNhdGUgZHJhZyBpcyBvdmVyIHRoZSBhcmVhXHJcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuYWRkKCdkcmFnLW92ZXInKTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IGZpbGVJbnB1dEVsZW1lbnQgPSB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgLy8gTWFudWFsbHkgc2V0IHRoZSBmaWxlIHRvIHRoZSBpbnB1dFxyXG4gICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XHJcbiAgICAgIGRhdGFUcmFuc2Zlci5pdGVtcy5hZGQoZmlsZSk7XHJcbiAgICAgIGZpbGVJbnB1dEVsZW1lbnQuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XHJcblxyXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBjaGFuZ2UgZXZlbnQgbWFudWFsbHlcclxuICAgICAgZmlsZUlucHV0RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjLWNhcmQgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbcm91dGVyTGlua109XCInL21hbmFnZS90cmF4L2NoZWNrbGlzdC9tYW5hZ2V0YXNrJ1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZSBtZS01IHB4LTMgcHktM1wiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzMiAxMC4wMDAzSDQuMTY2NU00LjE2NjUgMTAuMDAwM0w5Ljk5OTg0IDE1LjgzMzdNNC4xNjY1IDEwLjAwMDNMOS45OTk4NCA0LjE2Njk5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGFza0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tsaXN0LW5hbWUgbWItNVwiPnt7dGFza0RldGFpbHMuY2hlY2tMaXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbGlzdC1kZXNjXCI+e3t0YXNrRGV0YWlscy5jaGVja0xpc3REZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB5LTMgbWUtNVwiIChjbGljayk9XCJkZXRhc3NpZ25VcGRhdGUoJ3B1Ymxpc2gnKVwiPlB1Ymxpc2g8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiZGV0YXNzaWduVXBkYXRlKCdzYXZlJylcIj5TYXZlIGFzIERyYWZ0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiA4MHZoOyBvdmVyZmxvdy15OiBhdXRvO1wiIGNsYXNzPVwiYy1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTVcIj5TY2hlZHVsZTwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE2IDJWNk04IDJWNk0zIDEwSDIxTTUgNEgxOUMyMC4xMDQ2IDQgMjEgNC44OTU0MyAyMSA2VjIwQzIxIDIxLjEwNDYgMjAuMTA0NiAyMiAxOSAyMkg1QzMuODk1NDMgMjIgMyAyMS4xMDQ2IDMgMjBWNkMzIDQuODk1NDMgMy44OTU0MyA0IDUgNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZHVlRGF0ZUZvcm1hdHRlZH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtZS00XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiA2VjEyTDE2IDE0TTIyIDEyQzIyIDE3LjUyMjggMTcuNTIyOCAyMiAxMiAyMkM2LjQ3NzE1IDIyIDIgMTcuNTIyOCAyIDEyQzIgNi40NzcxNSA2LjQ3NzE1IDIgMTIgMkMxNy41MjI4IDIgMjIgNi40NzcxNSAyMiAxMlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtdGV4dFwiPnt7ZHVlVGltZUZvcm1hdHRlZH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItNVwiPkFzc2lnbjwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE2IDRIMThDMTguNTMwNCA0IDE5LjAzOTEgNC4yMTA3MSAxOS40MTQyIDQuNTg1NzlDMTkuNzg5MyA0Ljk2MDg2IDIwIDUuNDY5NTcgMjAgNlYyMEMyMCAyMC41MzA0IDE5Ljc4OTMgMjEuMDM5MSAxOS40MTQyIDIxLjQxNDJDMTkuMDM5MSAyMS43ODkzIDE4LjUzMDQgMjIgMTggMjJINkM1LjQ2OTU3IDIyIDQuOTYwODYgMjEuNzg5MyA0LjU4NTc5IDIxLjQxNDJDNC4yMTA3MSAyMS4wMzkxIDQgMjAuNTMwNCA0IDIwVjZDNCA1LjQ2OTU3IDQuMjEwNzEgNC45NjA4NiA0LjU4NTc5IDQuNTg1NzlDNC45NjA4NiA0LjIxMDcxIDUuNDY5NTcgNCA2IDRIOE05IDJIMTVDMTUuNTUyMyAyIDE2IDIuNDQ3NzIgMTYgM1Y1QzE2IDUuNTUyMjggMTUuNTUyMyA2IDE1IDZIOUM4LjQ0NzcyIDYgOCA1LjU1MjI4IDggNVYzQzggMi40NDc3MiA4LjQ0NzcyIDIgOSAyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY2hlZHVsZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjb3ZlcmFnZX19c1xyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibWUtNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy4wODk5NSA2Ljg4MzgxTDMuMDI0MDEgNi45ODY4MUMyLjMwMzU4IDguMjU1NjkgMy4wNjEwMSA5Ljg3OTU3IDQuNDY0NjQgMTAuMDY2NEM0LjU4NjI3IDEwLjA4MTMgNC43MDExMiAxMC4wODk0IDQuODE0NSAxMC4wODk0QzUuNTUyNTUgMTAuMDg5NCA2LjIwNTIzIDkuNzcyNDEgNi42NTk1MyA5LjI3OTI5TDcuMjEyODYgOC42Nzg2N0w3Ljc2NDMyIDkuMjgxMDFDOC4yMTM2NyA5Ljc3MTg0IDguODY1MiAxMC4wODk0IDkuNjA3NzYgMTAuMDg5NEMxMC4zNDcxIDEwLjA4OTQgMTEuMDAyMiA5Ljc3MTQ5IDExLjQ1MTIgOS4yODEwMUwxMi4wMDQ0IDguNjc2NzdMMTIuNTU3NiA5LjI4MTAxQzEzLjAwNjYgOS43NzE0OSAxMy42NjE3IDEwLjA4OTQgMTQuNDAxIDEwLjA4OTRDMTUuMTQwNCAxMC4wODk0IDE1Ljc5NTQgOS43NzE0OSAxNi4yNDQ1IDkuMjgxMDFMMTYuNzk3NyA4LjY3Njc4TDE3LjM1MDggOS4yODEwMUMxNy43OTk5IDkuNzcxNDkgMTguNDU0OSAxMC4wODk0IDE5LjE5NDMgMTAuMDg5NEMxOS4zMDQxIDEwLjA4OTQgMTkuNDIyMyAxMC4wODEyIDE5LjU0MzMgMTAuMDY2NUMyMC45NzcyIDkuODcxOCAyMS43MzU1IDguMTY0IDIwLjkxNTUgNi44ODQzMUMyMC45MTU0IDYuODg0MjUgMjAuOTE1NCA2Ljg4NDIgMjAuOTE1NCA2Ljg4NDE0TDE4LjgwNTYgMy41OTQ0MUwxOC44MDU2IDMuNTk0NDFMMTguODA0NiAzLjU5Mjk0QzE4Ljc1ODIgMy41MjAxNCAxOC42NjQ5IDMuNDY0MzYgMTguNTU4NCAzLjQ2NDM2SDUuNDQzMDdDNS4zMzY1IDMuNDY0MzYgNS4yNDMyNiAzLjUyMDE0IDUuMTk2ODEgMy41OTI5NUw1LjE5NjE5IDMuNTkzOTFMMy4wODk5NSA2Ljg4MzgxWk00LjgxODE4IDEyLjc1MDFDNC43MTY0NCAxMi43NTAxIDQuNjE2IDEyLjc0NyA0LjUxNjkgMTIuNzQxMVYxNi42NDI5VjE4Ljk2NDRDNC41MTY5IDE5LjgyMTIgNS4yMjY2MyAyMC41MzU4IDYuMTE5NDIgMjAuNTM1OEgxNy44ODJDMTguNzc0OCAyMC41MzU4IDE5LjQ4NDUgMTkuODIxMiAxOS40ODQ1IDE4Ljk2NDRWMTYuNjQyOVYxMi43NDE2QzE5LjM4NzQgMTIuNzQ3MSAxOS4yODkzIDEyLjc1MDEgMTkuMTkwNiAxMi43NTAxQzE5LjAwMjIgMTIuNzUwMSAxOC44MTU3IDEyLjc0IDE4LjYzMiAxMi43MjAzVjE2LjY0MjlWMTcuMzkyOUgxNy44ODJINi4xMTk0Mkg1LjM2OTQyVjE2LjY0MjlWMTIuNzIxMUM1LjE4ODY2IDEyLjc0MDIgNS4wMDQ3MiAxMi43NTAxIDQuODE4MTggMTIuNzUwMVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY2hlZHVsZS10ZXh0XCI+e3thc3NpZ25TaW5nbGU/Lmxlbmd0aCArIGdyb3VwQXNzaWduPy5sZW5ndGh9fSB7e2NvdmVyYWdlfX17eyhhc3NpZ25TaW5nbGU/Lmxlbmd0aCArIGdyb3VwQXNzaWduPy5sZW5ndGgpID4gMSA/ICdzJzonJ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDgwdmg7IG92ZXJmbG93LXk6IGF1dG87XCIgY2xhc3M9XCJjLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRhdGVwaWNrXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RHVlIGRhdGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxMnB4OyBsZWZ0OjEycHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMy4zMzMzIDEuNjY2NjNWNC45OTk5Nk02LjY2NjY3IDEuNjY2NjNWNC45OTk5Nk0yLjUgOC4zMzMyOUgxNy41TTQuMTY2NjcgMy4zMzMyOUgxNS44MzMzQzE2Ljc1MzggMy4zMzMyOSAxNy41IDQuMDc5NDggMTcuNSA0Ljk5OTk2VjE2LjY2NjZDMTcuNSAxNy41ODcxIDE2Ljc1MzggMTguMzMzMyAxNS44MzMzIDE4LjMzMzNINC4xNjY2N0MzLjI0NjE5IDE4LjMzMzMgMi41IDE3LjU4NzEgMi41IDE2LjY2NjZWNC45OTk5NkMyLjUgNC4wNzk0OCAzLjI0NjE5IDMuMzMzMjkgNC4xNjY2NyAzLjMzMzI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkYXRlcGlja1wiIGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4RGF0ZXJhbmdlcGlja2VyTWQgW3NpbmdsZURhdGVQaWNrZXJdPVwidHJ1ZVwiIFttaW5EYXRlXT1cIm1pbkRhdGVcIiBbZHJvcHNdPVwiJ2Rvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3BlbnNdPVwiJ3JpZ2h0J1wiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCIgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFsobmdNb2RlbCldPVwic2NoZWR1bGVEYXRlXCIgW2F1dG9BcHBseV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVyYW5nZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGltZVBpY2tcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5EdWUgdGltZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbF09XCJzY2hlZHVsZUVuZFRpbWVcIiB0eXBlPVwidGltZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ0aW1lUGlja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QXBwcm92ZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hpcC1kcm9wZG93biBbZGF0YV09XCJhcHByb3ZlcnNMaXN0XCIgW3NlbGVjdGVkRGF0YV09XCJhcHByb3Zlci52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZExpc3QpPVwib25BcHByb3ZlQWRkZWQoJGV2ZW50KVwiPjwvbGliLWNoaXAtZHJvcGRvd24+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcmlvcml0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlByaW9yaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFtmb3JtQ29udHJvbF09XCJwcmlvcml0eVR5cGVcIiBpZD1cInByaW9yaXR5XCIgY2xhc3M9XCJmb3JtLXNlbGVjdCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJoaWdoXCI+SGlnaDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWVkaXVtXCI+TWVkaXVtPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsb3dcIj5Mb3c8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtY2FyZFwiIFtuZ0NsYXNzXT1cImFsbG93ZWRTdG9yZUxvY2F0aW9uLnZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiYWxsb3dlZFN0b3JlTG9jYXRpb25cIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJzd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+R2VvIGZlbmNpbmc8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCI+QnkgZW5hYmxpbmcsIHRoZSBjaGVja2xpc3QgY2FuIGJlIGZpbGxlZCBieSB0aGUgdXNlciBvbmx5IHdoZW4gaW5zaWRlIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWNhcmQgXCIgW25nQ2xhc3NdPVwicmVzdHJpY3RBdHRlbmRhbmNlLnZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwicmVzdHJpY3RBdHRlbmRhbmNlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlJlc3RyaWN0IGF0dGVuZGFuY2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCI+QnkgZW5hYmxpbmcsIHVzZXIgY2FuJ3QgYmUgYWJsZSB0byBjbG9ja291dCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyZW1pbmRlci1oZWFkZXIgbWUtNFwiIGZvcj1cInJlbWluZGVyVG9nZ2xlXCI+UmVtaW5kZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzLmxlbmd0aFwiIChjaGFuZ2UpPVwiZW5hYmxlUmVtaW5kZXIoJGV2ZW50KVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBpZD1cInJlbWluZGVyVG9nZ2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZW1pbmRlci1kZXNjcmlwdGlvbiBtYi01XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCeSBlbmFibGluZywgdGhlIHVzZXJzIHdpbGwgYmUgcmVtaW5kZWQgaW4gdGhlIHNlbGVjdGVkIGludGVydmFsICBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItNVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzLmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZW1pbmRlci1zdWIgbWUtNFwiID5Ob3RpZnkgdXNlciBiZWZvcmU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgdy0yMDBweCBtZS00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDg3XzQ3NjM2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC4wMDEzIDUuMDAwMzNWMTAuMDAwM0wxMy4zMzQ2IDExLjY2N00xOC4zMzQ2IDEwLjAwMDNDMTguMzM0NiAxNC42MDI3IDE0LjYwMzcgMTguMzMzNyAxMC4wMDEzIDE4LjMzMzdDNS4zOTg5MyAxOC4zMzM3IDEuNjY3OTcgMTQuNjAyNyAxLjY2Nzk3IDEwLjAwMDNDMS42Njc5NyA1LjM5Nzk1IDUuMzk4OTMgMS42NjY5OSAxMC4wMDEzIDEuNjY2OTlDMTQuNjAzNyAxLjY2Njk5IDE4LjMzNDYgNS4zOTc5NSAxOC4zMzQ2IDEwLjAwMDNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0ODdfNDc2MzZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZ2V0Rm9ybUNvbnRyb2xGcm9tQXJyYXkoaSlcIiBjbGFzcz1cImZvcm0tc2VsZWN0IHBzLTE0IG1lLTVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJlbWluZGVyUmVwZWF0U2NoZWR1bGVPcHRpb25zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nQ2xhc3NdPVwiZGlzYWJsZVNjaGVkdWxlT3B0aW9uKGl0ZW0pID8gJ2Qtbm9uZScgOiAnJ1wiICBbbmdWYWx1ZV09XCJpdGVtXCIgPnt7aXRlbX19IG1pbnM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHMubGVuZ3RoICA+IDAgJiYgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHMubGVuZ3RoICA8IDMgXCIgY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZE1vcmVTY2hlZHVsZXMoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZSBoLTEwMFwiID48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMTMgNC4xNjY5OVYxNS44MzM3TTQuMTY3OTcgMTAuMDAwM0gxNS44MzQ2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbWluZGVyLXN1YiBtZS00XCIgPjxzcGFuICpuZ0lmPVwicmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHM/LlswXVwiID5TZW5kIEFsZXJ0cyB7e3JlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmF0KDApLnZhbHVlfX0gTWluczwvc3Bhbj48c3BhbiAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzPy5bMV1cIj4sIHt7cmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuYXQoMSkudmFsdWV9fSBNaW5zIDwvc3Bhbj48c3BhbiAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzPy5bMl1cIj5hbmQge3tyZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5hdCgyKS52YWx1ZX19IE1pbnM8L3NwYW4+IGJlZm9yZSB0aGUgY2hlY2tsaXN0IGVuZCB0aW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkFzc2lnbjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi01IG1zLTUgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBzZWxlY3RlZC1yYWRpbyBjdXJzb3ItcG9pbnRlciBtZS0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN0b3Jlc1wiIFtjaGVja2VkXT1cInN0b3JlQ292ZXJhZ2VcIiAoY2xpY2spPVwic2VsZWN0UmFkaW8oJ3N0b3JlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZHRleHQgY3Vyc29yLXBvaW50ZXIgZnctc2VtaWJvbGRcIj5Bc3NpZ24gU3RvcmVzIGFuZCBDbHVzdGVyczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtcy01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBzZWxlY3RlZC1yYWRpbyBjdXJzb3ItcG9pbnRlciBtZS0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInVzZXJzXCIgW2NoZWNrZWRdPVwidXNlckNvdmVyYWdlXCIgKGNsaWNrKT1cInNlbGVjdFJhZGlvKCd1c2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZHRleHQgY3Vyc29yLXBvaW50ZXIgZnctc2VtaWJvbGRcIj5Bc3NpZ24gVXNlcnMgYW5kIFRlYW1zPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXMtNSBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBvdmVyZmxvdy1hdXRvIGgtNDVweCB3LTc1IG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInN0b3JlQ292ZXJhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2IG5hdi1zdHJldGNoIG5hdi1saW5lLXRhYnMgbmF2LWxpbmUtdGFicy0yeCBib3JkZXItdHJhbnNwYXJlbnQgZnMtNSBmdy1ib2xkZXIgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNlbGVjdGVkVGFiKCdzdG9yZScpXCIgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlciBoLTEwMFwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhc3NpZ25UeXBlID09PSdzdG9yZScgPyAnYWN0aXZlIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1wcmltYXJ5JyA6JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG0tMCBweC01XCI+U3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIChjbGljayk9XCJzZWxlY3RlZFRhYignY2x1c3RlcicpXCIgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlciBoLTEwMFwiPjxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhc3NpZ25UeXBlID09PSdjbHVzdGVyJyA/ICdhY3RpdmUgYmctbGlnaHQtcHJpbWFyeSB0ZXh0LXByaW1hcnknIDonJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIHRleHQtYWN0aXZlLXByaW1hcnkgbS0wIHB4LTVcIj5DbHVzdGVyczwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFicyBuYXYtbGluZS10YWJzLTJ4IGJvcmRlci10cmFuc3BhcmVudCBmcy01IGZ3LWJvbGRlciBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwic2VsZWN0ZWRUYWIoJ3VzZXInKVwiIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXIgaC0xMDBcIj48YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYXNzaWduVHlwZSA9PT0ndXNlcicgPyAnYWN0aXZlIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1wcmltYXJ5JyA6JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG0tMCBweC01XCI+VXNlcnM8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNlbGVjdGVkVGFiKCd0ZWFtJylcIiBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyIGgtMTAwXCI+PGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFzc2lnblR5cGUgPT09J3RlYW0nID8gJ2FjdGl2ZSBiZy1saWdodC1wcmltYXJ5IHRleHQtcHJpbWFyeScgOicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtLTAgcHgtNVwiPlRlYW1zPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCIgIChjbGljayk9XCJhZGRTdG9yZUNvbXBvbmVudCgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcHgtNCBuZy1zdGFyLWluc2VydGVkIG10LThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDAxIDQuMTY2MDJWMTUuODMyN000LjE2Njc1IDkuOTk5MzVIMTUuODMzNFwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXNzaWduIFN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckNvdmVyYWdlXCIgKGNsaWNrKT1cImFkZFN0b3JlQ29tcG9uZW50KClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBweC00IG5nLXN0YXItaW5zZXJ0ZWQgbXQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjYwMlYxNS44MzI3TTQuMTY2NzUgOS45OTkzNUgxNS44MzM0XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Bc3NpZ24gVXNlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIG1zLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlNlbGVjdGVkIDxzcGFuICpuZ0lmPVwic3RvcmVDb3ZlcmFnZVwiPnt7YXNzaWduVHlwZSB8IHRpdGxlY2FzZX19czwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBtdC0zIHBlLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItbXVsdGktY2hpcC1kcm9wZG93biAqbmdJZj1cInN0b3JlTGlzdCAmJiB0YXNrRGV0YWlsc1wiIFtpdGVtc109XCJzdG9yZUxpc3RcIiBbbXVsdGldPVwidHJ1ZVwiIFtzZWFyY2hGaWVsZF09XCJbJ3N0b3JlTmFtZScsJ2NsdXN0ZXJOYW1lJywnc3RvcmVJZCcsJ3VzZXJOYW1lJywndGVhbU5hbWUnXVwiIFtzZWFyY2hLZXldPVwic2VhcmNoS2V5XCIgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJ1cGRhdGVBc3NpZ24oJGV2ZW50KVwiIChyZW1vdmVkKT1cInJlbW92ZWRDaGlwKCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwidGFza0RldGFpbHMuYXNzaWduXCI+PC9saWItbXVsdGktY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgdGFibGVBcnJheT8ubGVuZ3RoXCIgY2xhc3M9XCJjYXJkLWJvZHkgcHgtMCBtdC0wIHB0LTAgcGItMCBteC00IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5TZWxlY3RlZCA8c3Bhbj57e2Fzc2lnblR5cGUgfCB0aXRsZWNhc2V9fXM8L3NwYW4+IExpc3Q8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xIGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1hYnNvbHV0ZSBtdC0zIG1zLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4PVwiMVwiIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbF09XCJzZWFyY2hJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgZGF0YS1rdC1zdWJzY3JpcHRpb24tdGFibGUtZmlsdGVyPVwic2VhcmNoXCIgKGNoYW5nZSk9XCJzZWFyY2hUYWJsZURhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNvbGlkIHctMjAwcHggcHMtNSBteC0xIG1lLTRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm5vbmVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIiBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBub25lXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIHctMTAwIG10LTUgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBweS0zIGJ0bi1kZWZhdWx0IHctMTAwIGJ0bi1vdXRsaW5lIGJ0bi1vdXRsaW5lLWRlZmF1bHQgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImZpbGUuY2xpY2soKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiA8c3BhbiAjdXBsb2FkIGNsYXNzPVwidGVtcGxhdGUtZHJvcGRvd24gbXMtMyBiZy13aGl0ZVwiPkJ1bGtVcGxvYWQgPC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnRpdGxlIG14LTMgbWUtMlwiPiB8IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bigkZXZlbnQpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiA5TDEyIDE1TDE4IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiAjZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMVwiIChjaGFuZ2UpPVwib25GaWxlVXBsb2FkKCRldmVudClcIiAvPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wRG93blwiIGNsYXNzPVwiY2FyZCB0ZW1wbGF0ZS1kcm9wZG93biBoLTQwcHggdy0xMDAgcG9zaXRpb24tYWJzb2x1dGUgcm91bmRlZC0zIHotMSB0b3AtNTBweCBlbmQtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbWItMCB3LWF1dG8gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYnVsa3VwbG9hZE1vZGVsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicHgtNSBmdy1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlciBweS0yXCI+RG93bmxvYWQgVGVtcGxhdGU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gcHktMyBidG4tZGVmYXVsdCB3LTEwMCBidG4tb3V0bGluZSBidG4tb3V0bGluZS1kZWZhdWx0IHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiIChjbGljayk9XCJkb3dubG9hZFRlbXBsYXRlVjIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMyBjdXJzb3ItcG9pbnRlclwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTI1IDEzLjEyNUgxNi4zNTYyTDE0Ljc0MzggMTQuNzQzOEwxNS42MjUgMTUuNjI1TDE4Ljc1IDEyLjVMMTUuNjI1IDkuMzc1TDE0Ljc0MzggMTAuMjU2MkwxNi4zNTYyIDExLjg3NUg4LjEyNVYxMy4xMjVaXCIgZmlsbD1cImJsYWNrXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjc1IDguNzUwMDFWNi4yNTAwMUMxMy43NTA1IDYuMTY3NzYgMTMuNzM0NyA2LjA4NjIyIDEzLjcwMzYgNi4wMTAwN0MxMy42NzI1IDUuOTMzOTIgMTMuNjI2NyA1Ljg2NDY2IDEzLjU2ODggNS44MDYyNkw5LjE5Mzc1IDEuNDMxMjZDOS4xMzUzNSAxLjM3MzMzIDkuMDY2MDkgMS4zMjc1MSA4Ljk4OTk0IDEuMjk2NEM4LjkxMzc5IDEuMjY1MyA4LjgzMjI1IDEuMjQ5NTMgOC43NSAxLjI1MDAxSDIuNUMyLjE2ODQ4IDEuMjUwMDEgMS44NTA1NCAxLjM4MTcxIDEuNjE2MTIgMS42MTYxM0MxLjM4MTcgMS44NTA1NSAxLjI1IDIuMTY4NDkgMS4yNSAyLjUwMDAxVjE3LjVDMS4yNSAxNy44MzE1IDEuMzgxNyAxOC4xNDk1IDEuNjE2MTIgMTguMzgzOUMxLjg1MDU0IDE4LjYxODMgMi4xNjg0OCAxOC43NSAyLjUgMTguNzVIMTIuNUMxMi44MzE1IDE4Ljc1IDEzLjE0OTUgMTguNjE4MyAxMy4zODM5IDE4LjM4MzlDMTMuNjE4MyAxOC4xNDk1IDEzLjc1IDE3LjgzMTUgMTMuNzUgMTcuNVYxNi4yNUgxMi41VjE3LjVIMi41VjIuNTAwMDFINy41VjYuMjUwMDFDNy41IDYuNTgxNTMgNy42MzE3IDYuODk5NDcgNy44NjYxMiA3LjEzMzg5QzguMTAwNTQgNy4zNjgzMSA4LjQxODQ4IDcuNTAwMDEgOC43NSA3LjUwMDAxSDEyLjVWOC43NTAwMUgxMy43NVpNOC43NSA2LjI1MDAxVjIuNzU2MjZMMTIuMjQzOCA2LjI1MDAxSDguNzVaXCIgZmlsbD1cImJsYWNrXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZS1kcm9wZG93biBiZy13aGl0ZSBtcy0zXCI+RXhwb3J0IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgdGFibGVBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTJcIiAqbmdJZj1cInNlYXJjaElucHV0LnZhbHVlICYmICFhc3NpZ25UYWJsZURhdGE/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBteS04IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGUge3thc3NpZ25UeXBlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTJcIiAqbmdJZj1cIiFzZWFyY2hJbnB1dC52YWx1ZSAmJiAhYXNzaWduVGFibGVEYXRhPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBteS04IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGUge3thc3NpZ25UeXBlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFzc2lnblRhYmxlRGF0YT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBtdC01IG14LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCIgY2xhc3M9XCJ3LTEwMCB0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdzdG9yZU5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmUgTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdzdG9yZU5hbWUnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAnc3RvcmVOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3N0b3JlTmFtZScgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndXNlck5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BPQyBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IDEgfHwgc29ydENvbHVtbiAhPT0gJ3VzZXJOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMTAuNjY2N0w2LjAwMDE2IDEuMzMzMzdNNi4wMDAxNiAxLjMzMzM3TDEuMzMzNSA2LjAwMDA0TTYuMDAwMTYgMS4zMzMzN0wxMC42NjY4IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd1c2VyRW1haWwnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BPQyBFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICd1c2VyRW1haWwnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndXNlckVtYWlsJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJFbWFpbCcgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0nY2x1c3RlcidcIiBjbGFzcz1cInRleHQtYWxpZ24tbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2NsdXN0ZXJOYW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIgTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdjbHVzdGVyTmFtZScgJiYgc29ydEJ5ICE9PSAxIHx8IHNvcnRDb2x1bW4gIT09ICdjbHVzdGVyTmFtZScgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMS4zMzMzN1YxMC42NjY3TTYuMDAwMTYgMTAuNjY2N0wxMC42NjY4IDYuMDAwMDRNNi4wMDAxNiAxMC42NjY3TDEuMzMzNSA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdjbHVzdGVyTmFtZScgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYXNzaWduVGFibGVEYXRhO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS51c2VyTmFtZSA/IGRhdGEudXNlck5hbWUgOiAnLS0nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RhdGEudXNlckVtYWlsID8gZGF0YS51c2VyRW1haWwgOiAnLS0nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFzc2lnblR5cGUgPT09J2NsdXN0ZXInXCI+e3tkYXRhLmNsdXN0ZXJOYW1lID8gZGF0YS5jbHVzdGVyTmFtZSA6ICctLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIiBjbGFzcz1cInctMTAwIHRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXBcIj4gIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndXNlck5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IDEgfHwgc29ydENvbHVtbiAhPT0gJ3VzZXJOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMTAuNjY2N0w2LjAwMDE2IDEuMzMzMzdNNi4wMDAxNiAxLjMzMzM3TDEuMzMzNSA2LjAwMDA0TTYuMDAwMTYgMS4zMzMzN0wxMC42NjY4IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd1c2VyRW1haWwnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICd1c2VyRW1haWwnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndXNlckVtYWlsJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJFbWFpbCcgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0ndGVhbSdcIiBjbGFzcz1cInRleHQtYWxpZ24tbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3RlYW1OYW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW1zIE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzb3J0Q29sdW1uID09PSAndGVhbU5hbWUnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndGVhbU5hbWUnIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEuMzMzMzdWMTAuNjY2N002LjAwMDE2IDEwLjY2NjdMMTAuNjY2OCA2LjAwMDA0TTYuMDAwMTYgMTAuNjY2N0wxLjMzMzUgNi4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzb3J0Q29sdW1uID09PSAndGVhbU5hbWUnICYmIHNvcnRCeSAhPT0gLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxMC42NjY3TDYuMDAwMTYgMS4zMzMzN002LjAwMDE2IDEuMzMzMzdMMS4zMzM1IDYuMDAwMDRNNi4wMDAxNiAxLjMzMzM3TDEwLjY2NjggNi4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFzc2lnblRhYmxlRGF0YTtsZXQgaT1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RhdGEudXNlck5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS51c2VyRW1haWwgPyBkYXRhLnVzZXJFbWFpbCA6ICctLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0ndGVhbSdcIj57e2RhdGEudGVhbU5hbWUgPyBkYXRhLnRlYW1OYW1lIDogJy0tJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihhc3NpZ25UYWJsZUFwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZycgfHwgKGFzc2lnblRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdpbml0aWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGFzc2lnblRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkZWQnICYmICF0YWJsZUFycmF5Py5sZW5ndGggJiYgdGhpcy50YXNrRGV0YWlscz8uYXNzaWduICYmICFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBhc3NpZ25wYWRkaW5nIG1iLTEwIG10LTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhyIHctMTAwIGJvcmRlciBib3JkZXItMSBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdGVtcGxhdGUtZHJvcGRvd24gb3Jwb3NpdGlvbiBiZy13aGl0ZSB3LTEwMHB4XCI+b3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkcGFkZGluZyBtdC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzdWJ0ZXh0IGxpc3QtdW5zdHlsZWQgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBteC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+VXNlIHRoZSB0ZW1wbGF0ZSB0byB1cGxvYWQgbXVsdGlwbGUgPHNwYW4gKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCI+c3RvcmVzPC9zcGFuPiA8c3BhbiAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiPnVzZXJzPC9zcGFuPiBhdCBvbmNlLjwvbGk+ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4gRG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmUgLSA8c3BhbiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZVYyKClcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PHNwYW4gY2xhc3M9XCJtZS0zXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCIgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPjxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+IEFkZCB5b3VyIGRhdGEgdG8gdGhlIFRlbXBsYXRlIEZpbGU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBib3JkZXIgYm9yZGVyLTIgdGV4dC1jZW50ZXIgYm9yZGVyLWRhc2hlZCByb3VuZGVkLTMgYm9yZGVyLXByaW1hcnkgcC01XCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlLmNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNGMkY0RjdcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIiBzdHJva2Utd2lkdGg9XCI2XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF83OTc5XzUyMDIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI2LjMzMzUgMjYuMzMzMkwyMy4wMDAyIDIyLjk5OTlNMjMuMDAwMiAyMi45OTk5TDE5LjY2NjkgMjYuMzMzMk0yMy4wMDAyIDIyLjk5OTlWMzAuNDk5OU0yOS45OTE5IDI4LjMyNDlDMzAuODA0NyAyNy44ODE4IDMxLjQ0NjcgMjcuMTgwNiAzMS44MTY4IDI2LjMzMjFDMzIuMTg2OCAyNS40ODM1IDMyLjI2MzcgMjQuNTM1OSAzMi4wMzU0IDIzLjYzODhDMzEuODA3IDIyLjc0MTcgMzEuMjg2NSAyMS45NDYyIDMwLjU1NTggMjEuMzc3OEMyOS44MjUxIDIwLjgwOTQgMjguOTI1OSAyMC41MDA1IDI4LjAwMDIgMjAuNDk5OUgyNi45NTAyQzI2LjY5OCAxOS41MjQzIDI2LjIyNzggMTguNjE4NSAyNS41NzUyIDE3Ljg1MDdDMjQuOTIyNSAxNy4wODI5IDI0LjEwNDIgMTYuNDczMSAyMy4xODIgMTYuMDY3MUMyMi4yNTk3IDE1LjY2MSAyMS4yNTczIDE1LjQ2OTQgMjAuMjUwMyAxNS41MDY1QzE5LjI0MzMgMTUuNTQzNiAxOC4yNTc4IDE1LjgwODUgMTcuMzY3OSAxNi4yODEzQzE2LjQ3NzkgMTYuNzU0MSAxNS43MDY4IDE3LjQyMjUgMTUuMTEyNCAxOC4yMzYyQzE0LjUxOCAxOS4wNSAxNC4xMTU4IDE5Ljk4NzkgMTMuOTM2IDIwLjk3OTRDMTMuNzU2MyAyMS45NzA5IDEzLjgwMzYgMjIuOTkwMyAxNC4wNzQ2IDIzLjk2MUMxNC4zNDU1IDI0LjkzMTYgMTQuODMyOSAyNS44MjgxIDE1LjUwMDIgMjYuNTgzMlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83OTc5XzUyMDJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMyAxMylcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmV0ZXh0IGN1cnNvci1wb2ludGVyIGZ3LWJvbGRcIj48c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeSB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lXCI+Q2xpY2sgVG8gVXBsb2FkPC9zcGFuPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkcmFnIGFuZCBkcm9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJhbGlnbiBmdy00MDBcIj50aGUgZGF0YSBhZGRlZCB0ZW1wbGF0ZSBmaWxlIGZvciBwcm9jZXNzaW5nLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiIHR5cGU9XCJmaWxlXCIgI2ZpbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwia3RfYWNjb3VudF90ZWFtX3NpemVfc2VsZWN0XzFcIiAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyXCIgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgIXRhYmxlQXJyYXk/Lmxlbmd0aCAmJiB0aGlzLnRhc2tEZXRhaWxzPy5hc3NpZ24gJiYgWydjbHVzdGVyJywndGVhbSddLmluY2x1ZGVzKGFzc2lnblR5cGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgbXktOCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXN1YlwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgdGhlIHt7YXNzaWduVHlwZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2J1bGt1cGxvYWQgbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtNVwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWxpZ2h0LXByaW1hcnkgcm91bmRlZC01IHctNDBweCBoLTQwcHggZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gPHNwYW4gY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1zZW1pYm9sZCBtcy01IHctYXV0b1wiPkJ1bGsgVXBsb2FkPC9zcGFuPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj5TdGVwIDEgLSA8YSBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZVYyKClcIj5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZTwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZUFzc2lnbiBtdC0zXCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwXCI+U3RlcDIgLSBBZGQgeW91ciBkYXRhIHRvIHRoZSBUZW1wbGF0ZSBGaWxlIHdpdGggZXhpc3RpbmcgPHNwYW4gKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCI+c3RvcmU8L3NwYW4+IDxzcGFuICpuZ0lmPVwidXNlckNvdmVyYWdlXCI+dXNlcjwvc3Bhbj4gZGF0YTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj5TdGVwMyAtIFVwbG9hZCBpdCBiZWxvdyBmb3IgcHJvY2Vzc2luZzwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkIHN0b3JlQXNzaWduIG10LTEwXCI+KipOb3RlIDogT24gdXBsb2FkLCBhbGwgdGhlIGV4aXN0aW5nIGRhdGEgd2lsbCBiZSByZXBsYWNlZDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJmaWxlMS5jbGljaygpXCI+VXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhZnRlclZhbGlkYXRpb24gbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtMFwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPjxzcGFuIGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+QXNzaWduIDxzcGFuICpuZklmPVwic3RvcmVDb3ZlcmFnZVwiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIj5Vc2Vyczwvc3Bhbj48L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTgwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlRvdGFsIDxzcGFuICpuZklmPVwic3RvcmVDb3ZlcmFnZVwiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIj5Vc2Vyczwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtODBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2V4Y2VsRGF0YT8ubGVuZ3RofX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Sb3dzIHByb2Nlc3NlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTgwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2Vycm9yLWhlYWRpbmcnOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxFcnJvcj8uZXJyb3I/Lmxlbmd0aCB8fCAwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2V4Y2VsLWVycm9yJzonJ1wiIGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01XCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93U3RvcmUmJiFzaG93VGVhbSYmIXNob3dDbHVzdGVyJiYhc2hvd1VzZXImJiFzaG93SW5hY3RpdmVcIj5Zb3UncmUgYWJvdXQgdG8gYXNzaWduIHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19IDxzcGFuICpuZ0lmPVwic3RvcmVDb3ZlcmFnZVwiPnN0b3Jlczwvc3Bhbj48c3BhbiAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiPnVzZXJzPC9zcGFuPiB0byB0aGUgY2hlY2tsaXN0LiBBcmUgeW91IHN1cmUgd2FudCB0byBwcm9jZWVkPzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd1N0b3JlXCIgY2xhc3M9XCJtdC0zXCI+U3RvcmUgPHNwYW4gKm5nRm9yPVwibGV0IHN0b3JlIG9mIHZhbGlkYXRlZFN0b3JlO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2Uvc3RvcmVzXCIgW3F1ZXJ5UGFyYW1zXT1cInt0eW9lOiAnc3RvcmVzJ31cIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2xvc2VhY3RpdmVwb3B1cCgpXCI+T25ib2FyZCBTdG9yZXM8L2E+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckNvdmVyYWdlICYmIHNob3dVc2VyXCIgY2xhc3M9XCJtdC0zXCI+VXNlciA8c3BhbiAqbmdGb3I9XCJsZXQgc3RvcmUgb2YgdmFsaWRhdGVkVXNlcjtsZXQgbGFzdCA9IGxhc3RcIiBjbGFzcz1cImZ3LXNlbWlib2xkIGNvbmZpZy1oZWFkaW5nXCI+e3tzdG9yZX19PHNwYW4gKm5nSWY9XCIhbGFzdFwiPiw8L3NwYW4+PC9zcGFuPiB0aGF0IEnigJltIGxvb2tpbmcgZm9yIGlzbuKAmXQgIGF2YWlsYWJsZSwgPGEgIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKCk7Y29uZmlybVVzZXJwb3B1cCgpXCI+T25ib2FyZCBVc2VyczwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyQ292ZXJhZ2UgJiYgc2hvd1RlYW1cIiBjbGFzcz1cIm10LTNcIj5UZWFtIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRUZWFtO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2UvdXNlcnMvY2xpZW50XCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPkNyZWF0ZSBUZWFtPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd0NsdXN0ZXJcIiBjbGFzcz1cIm10LTNcIj51c2VyIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRDbHVzdGVyO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2Uvc3RvcmVzXCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgW3F1ZXJ5UGFyYW1zXT1cInt0eW9lOiAnY2x1c3Rlcid9XCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPkNyZWF0ZSBDbHVzdGVyPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd1VzZXJcIiBjbGFzcz1cIm10LTNcIj5Vc2VyIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRVc2VyO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKTtjb25maXJtVXNlcnBvcHVwKClcIj5PbmJvYXJkIFVzZXJzPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd0luYWN0aXZlXCIgY2xhc3M9XCJtdC0zXCI+U3RvcmUgPHNwYW4gKm5nRm9yPVwibGV0IHN0b3JlIG9mIGluYWN0aXZlU3RvcmVzO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXMgaW5hY3RpdmUsIDxhICByb3V0ZXJMaW5rPVwiL21hbmFnZS9zdG9yZXNcIiBbcXVlcnlQYXJhbXNdPVwie3R5b2U6ICdzdG9yZXMnfVwiIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKClcIj5PbmJvYXJkIFN0b3JlczwvYT48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJleGNlbEVycm9yXCIgY2xhc3M9XCJmbGV4LWNvbHVtbiBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctYm9sZFwiPkludmFsaWQgRGV0YWlscyAhPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGUgbXQtNVwiPlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIGxheW91dCBpbmZvcm1hdGlvbi48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZXhjZWxFcnJvcj8uZXJyb3I7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtuZ0NsYXNzXT1cIiFsYXN0ID8gJ21iLTInIDogJydcIiBjbGFzcz1cInRleHQtZXJyb3JcIj57e2kgKyAxfX0pIHt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFleGNlbEVycm9yJiYhc2hvd1N0b3JlJiYhc2hvd0NsdXN0ZXImJiFzaG93VXNlciYmIXNob3dUZWFtJiYhc2hvd0luYWN0aXZlXCIgY2xhc3M9XCJidG4gYnRuLW1kIHB5LTQgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJ2YWxpZGF0ZURldGFpbHMoKVwiPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImV4Y2VsRXJyb3J8fHNob3dTdG9yZXx8c2hvd0NsdXN0ZXJ8fHNob3dVc2VyfHxzaG93VGVhbSB8fCBzaG93SW5hY3RpdmVcIiBjbGFzcz1cImJ0biBweS0zIGJ0bi1tZCBidG4tZGVmYXVsdCBtcy0zIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiUmV1cGxvYWQoKTtcIj5SZXVwbG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIgI2ZpbGUxIHR5cGU9XCJmaWxlXCIgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVVcGxvYWQoJGV2ZW50LCdyZXVwbG9hZCcpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjb25maXJtVXNlciBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC01XCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBkLWZsZXggZmxleC1jb2x1bW4gbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWxpZ2h0LXByaW1hcnkgcm91bmRlZC01IHctNDBweCBoLTQwcHggZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj48YnI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+TmV3IFVzZXIgZm91bmQgaW4gdXBsb2FkZWQgZmlsZTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB0LTBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVBc3NpZ24gbXQtM1wiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMFwiPlRoaXMgQ1NWIGNvbnRhaW5zIGEgbmV3IFVzZXIuIEFkZCBuZXcgVXNlciBpbiB0aGUgVXNlciBNYW5hZ2VtZW50IHVuZGVyIE1hbmFnZSBtZW51LjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdXNlcnMvY2xpZW50XCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPlNraXAgTmV3IEVudHJpZXM8L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTQgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgnY29uZmlybScpXCI+SW52aXRlIFNlbGVjdGVkPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=