@sidekick-coder/zenith-kit 0.0.17 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/cli/commands/build.js +8 -2
  2. package/commands/release.js +1 -1
  3. package/dist/client/chunk-0Lt9GpW0.mjs +1 -0
  4. package/dist/client/index.d.mts +701 -53
  5. package/dist/client/index.mjs +2 -2
  6. package/dist/components/ClientOnly.vue.d.ts +16 -0
  7. package/dist/components/ColorPicker.vue.d.ts +82 -0
  8. package/dist/components/ColorWheel.vue.d.ts +11 -0
  9. package/dist/components/Component.vue.d.ts +28 -0
  10. package/dist/components/DashboardAddWidgetDrawer.vue.d.ts +26 -0
  11. package/dist/components/DashboardBody.vue.d.ts +13 -0
  12. package/dist/components/DashboardDrawer.vue.d.ts +35 -0
  13. package/dist/components/DashboardGridUnitInput.vue.d.ts +67 -0
  14. package/dist/components/DashboardWidget.vue.d.ts +18 -0
  15. package/dist/components/DashboardWidgetActionSetting.vue.d.ts +64 -0
  16. package/dist/components/DatePicker.vue.d.ts +62 -0
  17. package/dist/components/DialogForm.vue.d.ts +83 -0
  18. package/dist/components/FileUploader.vue.d.ts +135 -0
  19. package/dist/components/FormAutoFieldList.vue.d.ts +27 -0
  20. package/dist/components/FormAutocomplete.vue.d.ts +119 -0
  21. package/dist/components/FormColorPicker.vue.d.ts +59 -0
  22. package/dist/components/FormDatePicker.vue.d.ts +50 -0
  23. package/dist/components/FormFilePicker.vue.d.ts +89 -0
  24. package/dist/components/FormFileUploader.vue.d.ts +96 -0
  25. package/dist/components/FormImageUploader.vue.d.ts +115 -0
  26. package/dist/components/FormJsonInput.vue.d.ts +40 -0
  27. package/dist/components/FormSelect.vue.d.ts +60 -0
  28. package/dist/components/FormStringListInput.vue.d.ts +50 -0
  29. package/dist/components/FormSwitch.vue.d.ts +41 -0
  30. package/dist/components/FormTextField.vue.d.ts +123 -0
  31. package/dist/components/FormTextarea.vue.d.ts +41 -0
  32. package/dist/components/Icon.vue.d.ts +16 -0
  33. package/dist/components/Image.vue.d.ts +24 -0
  34. package/dist/components/JsonInput.vue.d.ts +64 -0
  35. package/dist/components/Logo.vue.d.ts +4 -0
  36. package/dist/components/LogoIcon.vue.d.ts +7 -0
  37. package/dist/components/ObjectInspect.vue.d.ts +64 -0
  38. package/dist/components/PageCrud.vue.d.ts +68 -0
  39. package/dist/components/PageSubtitle.vue.d.ts +26 -0
  40. package/dist/components/PageTable.vue.d.ts +14 -0
  41. package/dist/components/PageTitle.vue.d.ts +26 -0
  42. package/dist/components/StringListInput.vue.d.ts +43 -0
  43. package/dist/components/TextField.vue.d.ts +146 -0
  44. package/dist/components/UserMenu.vue.d.ts +21 -0
  45. package/dist/components/ZAlert.vue.d.ts +39 -0
  46. package/dist/components/ZAlertButton.vue.d.ts +80 -0
  47. package/dist/components/ZButton.vue.d.ts +95 -0
  48. package/dist/components/ZDataTable.vue.d.ts +53 -0
  49. package/dist/components/ZDataTablePagination.vue.d.ts +28 -0
  50. package/dist/components/ZDialogForm.vue.d.ts +76 -0
  51. package/dist/components/ZPagination.vue.d.ts +16 -0
  52. package/dist/components/ZSelect.vue.d.ts +189 -0
  53. package/dist/components/ZSwitch.vue.d.ts +25 -0
  54. package/dist/components/ZTextarea.vue.d.ts +31 -0
  55. package/dist/components/index.d.ts +681 -0
  56. package/dist/components/index.es.js +60092 -58678
  57. package/dist/components/styles.css +94 -1
  58. package/dist/components/ui/accordion/Accordion.vue.d.ts +20 -0
  59. package/dist/components/ui/accordion/AccordionContent.vue.d.ts +18 -0
  60. package/dist/components/ui/accordion/AccordionItem.vue.d.ts +18 -0
  61. package/dist/components/ui/accordion/AccordionTrigger.vue.d.ts +20 -0
  62. package/dist/components/ui/accordion/index.d.ts +4 -0
  63. package/dist/components/ui/alert/Alert.vue.d.ts +19 -0
  64. package/dist/components/ui/alert/AlertDescription.vue.d.ts +17 -0
  65. package/dist/components/ui/alert/AlertTitle.vue.d.ts +17 -0
  66. package/dist/components/ui/alert/index.d.ts +9 -0
  67. package/dist/components/ui/alert-dialog/AlertDialog.vue.d.ts +19 -0
  68. package/dist/components/ui/alert-dialog/AlertDialogAction.vue.d.ts +18 -0
  69. package/dist/components/ui/alert-dialog/AlertDialogCancel.vue.d.ts +18 -0
  70. package/dist/components/ui/alert-dialog/AlertDialogContent.vue.d.ts +32 -0
  71. package/dist/components/ui/alert-dialog/AlertDialogDescription.vue.d.ts +18 -0
  72. package/dist/components/ui/alert-dialog/AlertDialogFooter.vue.d.ts +17 -0
  73. package/dist/components/ui/alert-dialog/AlertDialogHeader.vue.d.ts +17 -0
  74. package/dist/components/ui/alert-dialog/AlertDialogTitle.vue.d.ts +18 -0
  75. package/dist/components/ui/alert-dialog/AlertDialogTrigger.vue.d.ts +15 -0
  76. package/dist/components/ui/alert-dialog/index.d.ts +9 -0
  77. package/dist/components/ui/aspect-ratio/AspectRatio.vue.d.ts +15 -0
  78. package/dist/components/ui/aspect-ratio/index.d.ts +1 -0
  79. package/dist/components/ui/avatar/Avatar.vue.d.ts +17 -0
  80. package/dist/components/ui/avatar/AvatarFallback.vue.d.ts +18 -0
  81. package/dist/components/ui/avatar/AvatarImage.vue.d.ts +15 -0
  82. package/dist/components/ui/avatar/index.d.ts +3 -0
  83. package/dist/components/ui/badge/Badge.vue.d.ts +20 -0
  84. package/dist/components/ui/badge/index.d.ts +7 -0
  85. package/dist/components/ui/breadcrumb/Breadcrumb.vue.d.ts +17 -0
  86. package/dist/components/ui/breadcrumb/BreadcrumbEllipsis.vue.d.ts +17 -0
  87. package/dist/components/ui/breadcrumb/BreadcrumbItem.vue.d.ts +17 -0
  88. package/dist/components/ui/breadcrumb/BreadcrumbLink.vue.d.ts +20 -0
  89. package/dist/components/ui/breadcrumb/BreadcrumbList.vue.d.ts +17 -0
  90. package/dist/components/ui/breadcrumb/BreadcrumbPage.vue.d.ts +17 -0
  91. package/dist/components/ui/breadcrumb/BreadcrumbSeparator.vue.d.ts +17 -0
  92. package/dist/components/ui/breadcrumb/index.d.ts +7 -0
  93. package/dist/components/ui/button/Button.vue.d.ts +23 -0
  94. package/dist/components/ui/button/index.d.ts +8 -0
  95. package/dist/components/ui/calendar/Calendar.vue.d.ts +14 -0
  96. package/dist/components/ui/calendar/CalendarCell.vue.d.ts +18 -0
  97. package/dist/components/ui/calendar/CalendarCellTrigger.vue.d.ts +20 -0
  98. package/dist/components/ui/calendar/CalendarGrid.vue.d.ts +18 -0
  99. package/dist/components/ui/calendar/CalendarGridBody.vue.d.ts +15 -0
  100. package/dist/components/ui/calendar/CalendarGridHead.vue.d.ts +18 -0
  101. package/dist/components/ui/calendar/CalendarGridRow.vue.d.ts +18 -0
  102. package/dist/components/ui/calendar/CalendarHeadCell.vue.d.ts +18 -0
  103. package/dist/components/ui/calendar/CalendarHeader.vue.d.ts +18 -0
  104. package/dist/components/ui/calendar/CalendarHeading.vue.d.ts +19 -0
  105. package/dist/components/ui/calendar/CalendarNextButton.vue.d.ts +18 -0
  106. package/dist/components/ui/calendar/CalendarPrevButton.vue.d.ts +18 -0
  107. package/dist/components/ui/calendar/index.d.ts +12 -0
  108. package/dist/components/ui/card/Card.vue.d.ts +18 -0
  109. package/dist/components/ui/card/CardAction.vue.d.ts +17 -0
  110. package/dist/components/ui/card/CardContent.vue.d.ts +17 -0
  111. package/dist/components/ui/card/CardDescription.vue.d.ts +17 -0
  112. package/dist/components/ui/card/CardFooter.vue.d.ts +17 -0
  113. package/dist/components/ui/card/CardHeader.vue.d.ts +17 -0
  114. package/dist/components/ui/card/CardTitle.vue.d.ts +17 -0
  115. package/dist/components/ui/card/index.d.ts +7 -0
  116. package/dist/components/ui/carousel/Carousel.vue.d.ts +39 -0
  117. package/dist/components/ui/carousel/CarouselContent.vue.d.ts +15 -0
  118. package/dist/components/ui/carousel/CarouselItem.vue.d.ts +15 -0
  119. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +23 -0
  120. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +23 -0
  121. package/dist/components/ui/carousel/index.d.ts +7 -0
  122. package/dist/components/ui/carousel/interface.d.ts +19 -0
  123. package/dist/components/ui/carousel/useCarousel.d.ts +22 -0
  124. package/dist/components/ui/checkbox/Checkbox.vue.d.ts +22 -0
  125. package/dist/components/ui/checkbox/index.d.ts +1 -0
  126. package/dist/components/ui/collapsible/Collapsible.vue.d.ts +21 -0
  127. package/dist/components/ui/collapsible/CollapsibleContent.vue.d.ts +15 -0
  128. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +15 -0
  129. package/dist/components/ui/collapsible/index.d.ts +3 -0
  130. package/dist/components/ui/combobox/Combobox.vue.d.ts +30 -0
  131. package/dist/components/ui/combobox/ComboboxAnchor.vue.d.ts +18 -0
  132. package/dist/components/ui/combobox/ComboboxEmpty.vue.d.ts +18 -0
  133. package/dist/components/ui/combobox/ComboboxGroup.vue.d.ts +19 -0
  134. package/dist/components/ui/combobox/ComboboxInput.vue.d.ts +22 -0
  135. package/dist/components/ui/combobox/ComboboxItem.vue.d.ts +22 -0
  136. package/dist/components/ui/combobox/ComboboxItemIndicator.vue.d.ts +18 -0
  137. package/dist/components/ui/combobox/ComboboxList.vue.d.ts +36 -0
  138. package/dist/components/ui/combobox/ComboboxSeparator.vue.d.ts +18 -0
  139. package/dist/components/ui/combobox/ComboboxTrigger.vue.d.ts +18 -0
  140. package/dist/components/ui/combobox/ComboboxViewport.vue.d.ts +18 -0
  141. package/dist/components/ui/combobox/index.d.ts +11 -0
  142. package/dist/components/ui/command/Command.vue.d.ts +36 -0
  143. package/dist/components/ui/command/CommandDialog.vue.d.ts +26 -0
  144. package/dist/components/ui/command/CommandEmpty.vue.d.ts +18 -0
  145. package/dist/components/ui/command/CommandGroup.vue.d.ts +19 -0
  146. package/dist/components/ui/command/CommandInput.vue.d.ts +8 -0
  147. package/dist/components/ui/command/CommandItem.vue.d.ts +22 -0
  148. package/dist/components/ui/command/CommandList.vue.d.ts +18 -0
  149. package/dist/components/ui/command/CommandSeparator.vue.d.ts +18 -0
  150. package/dist/components/ui/command/CommandShortcut.vue.d.ts +17 -0
  151. package/dist/components/ui/command/index.d.ts +90 -0
  152. package/dist/components/ui/context-menu/ContextMenu.vue.d.ts +19 -0
  153. package/dist/components/ui/context-menu/ContextMenuCheckboxItem.vue.d.ts +24 -0
  154. package/dist/components/ui/context-menu/ContextMenuContent.vue.d.ts +30 -0
  155. package/dist/components/ui/context-menu/ContextMenuGroup.vue.d.ts +15 -0
  156. package/dist/components/ui/context-menu/ContextMenuItem.vue.d.ts +26 -0
  157. package/dist/components/ui/context-menu/ContextMenuLabel.vue.d.ts +19 -0
  158. package/dist/components/ui/context-menu/ContextMenuRadioGroup.vue.d.ts +19 -0
  159. package/dist/components/ui/context-menu/ContextMenuRadioItem.vue.d.ts +22 -0
  160. package/dist/components/ui/context-menu/ContextMenuSeparator.vue.d.ts +8 -0
  161. package/dist/components/ui/context-menu/ContextMenuShortcut.vue.d.ts +17 -0
  162. package/dist/components/ui/context-menu/ContextMenuSub.vue.d.ts +19 -0
  163. package/dist/components/ui/context-menu/ContextMenuSubContent.vue.d.ts +34 -0
  164. package/dist/components/ui/context-menu/ContextMenuSubTrigger.vue.d.ts +19 -0
  165. package/dist/components/ui/context-menu/ContextMenuTrigger.vue.d.ts +15 -0
  166. package/dist/components/ui/context-menu/index.d.ts +14 -0
  167. package/dist/components/ui/dialog/Dialog.vue.d.ts +19 -0
  168. package/dist/components/ui/dialog/DialogClose.vue.d.ts +15 -0
  169. package/dist/components/ui/dialog/DialogContent.vue.d.ts +33 -0
  170. package/dist/components/ui/dialog/DialogDescription.vue.d.ts +18 -0
  171. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +17 -0
  172. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +17 -0
  173. package/dist/components/ui/dialog/DialogOverlay.vue.d.ts +18 -0
  174. package/dist/components/ui/dialog/DialogScrollContent.vue.d.ts +32 -0
  175. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +18 -0
  176. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +15 -0
  177. package/dist/components/ui/dialog/index.d.ts +10 -0
  178. package/dist/components/ui/drawer/Drawer.vue.d.ts +31 -0
  179. package/dist/components/ui/drawer/DrawerClose.vue.d.ts +15 -0
  180. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +32 -0
  181. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +18 -0
  182. package/dist/components/ui/drawer/DrawerFooter.vue.d.ts +17 -0
  183. package/dist/components/ui/drawer/DrawerHeader.vue.d.ts +17 -0
  184. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +8 -0
  185. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +18 -0
  186. package/dist/components/ui/drawer/DrawerTrigger.vue.d.ts +15 -0
  187. package/dist/components/ui/drawer/index.d.ts +9 -0
  188. package/dist/components/ui/dropdown-menu/DropdownMenu.vue.d.ts +19 -0
  189. package/dist/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +24 -0
  190. package/dist/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +32 -0
  191. package/dist/components/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts +15 -0
  192. package/dist/components/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +22 -0
  193. package/dist/components/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts +19 -0
  194. package/dist/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +19 -0
  195. package/dist/components/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +22 -0
  196. package/dist/components/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts +8 -0
  197. package/dist/components/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts +17 -0
  198. package/dist/components/ui/dropdown-menu/DropdownMenuSub.vue.d.ts +19 -0
  199. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +34 -0
  200. package/dist/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts +19 -0
  201. package/dist/components/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts +15 -0
  202. package/dist/components/ui/dropdown-menu/index.d.ts +15 -0
  203. package/dist/components/ui/form/FormControl.vue.d.ts +14 -0
  204. package/dist/components/ui/form/FormDescription.vue.d.ts +17 -0
  205. package/dist/components/ui/form/FormItem.vue.d.ts +17 -0
  206. package/dist/components/ui/form/FormLabel.vue.d.ts +18 -0
  207. package/dist/components/ui/form/FormMessage.vue.d.ts +7 -0
  208. package/dist/components/ui/form/index.d.ts +7 -0
  209. package/dist/components/ui/form/injectionKeys.d.ts +2 -0
  210. package/dist/components/ui/form/useFormField.d.ts +12 -0
  211. package/dist/components/ui/hover-card/HoverCard.vue.d.ts +19 -0
  212. package/dist/components/ui/hover-card/HoverCardContent.vue.d.ts +20 -0
  213. package/dist/components/ui/hover-card/HoverCardTrigger.vue.d.ts +15 -0
  214. package/dist/components/ui/hover-card/index.d.ts +3 -0
  215. package/dist/components/ui/input/Input.vue.d.ts +13 -0
  216. package/dist/components/ui/input/index.d.ts +1 -0
  217. package/dist/components/ui/label/Label.vue.d.ts +18 -0
  218. package/dist/components/ui/label/index.d.ts +1 -0
  219. package/dist/components/ui/menubar/Menubar.vue.d.ts +22 -0
  220. package/dist/components/ui/menubar/MenubarCheckboxItem.vue.d.ts +24 -0
  221. package/dist/components/ui/menubar/MenubarContent.vue.d.ts +22 -0
  222. package/dist/components/ui/menubar/MenubarGroup.vue.d.ts +15 -0
  223. package/dist/components/ui/menubar/MenubarItem.vue.d.ts +24 -0
  224. package/dist/components/ui/menubar/MenubarLabel.vue.d.ts +19 -0
  225. package/dist/components/ui/menubar/MenubarMenu.vue.d.ts +15 -0
  226. package/dist/components/ui/menubar/MenubarRadioGroup.vue.d.ts +19 -0
  227. package/dist/components/ui/menubar/MenubarRadioItem.vue.d.ts +22 -0
  228. package/dist/components/ui/menubar/MenubarSeparator.vue.d.ts +8 -0
  229. package/dist/components/ui/menubar/MenubarShortcut.vue.d.ts +17 -0
  230. package/dist/components/ui/menubar/MenubarSub.vue.d.ts +22 -0
  231. package/dist/components/ui/menubar/MenubarSubContent.vue.d.ts +34 -0
  232. package/dist/components/ui/menubar/MenubarSubTrigger.vue.d.ts +19 -0
  233. package/dist/components/ui/menubar/MenubarTrigger.vue.d.ts +18 -0
  234. package/dist/components/ui/menubar/index.d.ts +15 -0
  235. package/dist/components/ui/navigation-menu/NavigationMenu.vue.d.ts +25 -0
  236. package/dist/components/ui/navigation-menu/NavigationMenuContent.vue.d.ts +28 -0
  237. package/dist/components/ui/navigation-menu/NavigationMenuIndicator.vue.d.ts +8 -0
  238. package/dist/components/ui/navigation-menu/NavigationMenuItem.vue.d.ts +18 -0
  239. package/dist/components/ui/navigation-menu/NavigationMenuLink.vue.d.ts +26 -0
  240. package/dist/components/ui/navigation-menu/NavigationMenuList.vue.d.ts +18 -0
  241. package/dist/components/ui/navigation-menu/NavigationMenuTrigger.vue.d.ts +18 -0
  242. package/dist/components/ui/navigation-menu/NavigationMenuViewport.vue.d.ts +8 -0
  243. package/dist/components/ui/navigation-menu/index.d.ts +10 -0
  244. package/dist/components/ui/number-field/NumberField.vue.d.ts +22 -0
  245. package/dist/components/ui/number-field/NumberFieldContent.vue.d.ts +17 -0
  246. package/dist/components/ui/number-field/NumberFieldDecrement.vue.d.ts +18 -0
  247. package/dist/components/ui/number-field/NumberFieldIncrement.vue.d.ts +18 -0
  248. package/dist/components/ui/number-field/NumberFieldInput.vue.d.ts +7 -0
  249. package/dist/components/ui/number-field/index.d.ts +5 -0
  250. package/dist/components/ui/pagination/Pagination.vue.d.ts +22 -0
  251. package/dist/components/ui/pagination/PaginationContent.vue.d.ts +18 -0
  252. package/dist/components/ui/pagination/PaginationEllipsis.vue.d.ts +18 -0
  253. package/dist/components/ui/pagination/PaginationFirst.vue.d.ts +22 -0
  254. package/dist/components/ui/pagination/PaginationItem.vue.d.ts +23 -0
  255. package/dist/components/ui/pagination/PaginationLast.vue.d.ts +22 -0
  256. package/dist/components/ui/pagination/PaginationNext.vue.d.ts +22 -0
  257. package/dist/components/ui/pagination/PaginationPrevious.vue.d.ts +22 -0
  258. package/dist/components/ui/pagination/index.d.ts +8 -0
  259. package/dist/components/ui/pin-input/PinInput.vue.d.ts +24 -0
  260. package/dist/components/ui/pin-input/PinInputGroup.vue.d.ts +18 -0
  261. package/dist/components/ui/pin-input/PinInputSeparator.vue.d.ts +15 -0
  262. package/dist/components/ui/pin-input/PinInputSlot.vue.d.ts +8 -0
  263. package/dist/components/ui/pin-input/index.d.ts +4 -0
  264. package/dist/components/ui/popover/Popover.vue.d.ts +19 -0
  265. package/dist/components/ui/popover/PopoverAnchor.vue.d.ts +15 -0
  266. package/dist/components/ui/popover/PopoverContent.vue.d.ts +35 -0
  267. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +15 -0
  268. package/dist/components/ui/popover/index.d.ts +4 -0
  269. package/dist/components/ui/progress/Progress.vue.d.ts +10 -0
  270. package/dist/components/ui/progress/index.d.ts +1 -0
  271. package/dist/components/ui/radio-group/RadioGroup.vue.d.ts +22 -0
  272. package/dist/components/ui/radio-group/RadioGroupItem.vue.d.ts +8 -0
  273. package/dist/components/ui/radio-group/index.d.ts +2 -0
  274. package/dist/components/ui/range-calendar/RangeCalendar.vue.d.ts +18 -0
  275. package/dist/components/ui/range-calendar/RangeCalendarCell.vue.d.ts +18 -0
  276. package/dist/components/ui/range-calendar/RangeCalendarCellTrigger.vue.d.ts +20 -0
  277. package/dist/components/ui/range-calendar/RangeCalendarGrid.vue.d.ts +18 -0
  278. package/dist/components/ui/range-calendar/RangeCalendarGridBody.vue.d.ts +15 -0
  279. package/dist/components/ui/range-calendar/RangeCalendarGridHead.vue.d.ts +15 -0
  280. package/dist/components/ui/range-calendar/RangeCalendarGridRow.vue.d.ts +18 -0
  281. package/dist/components/ui/range-calendar/RangeCalendarHeadCell.vue.d.ts +18 -0
  282. package/dist/components/ui/range-calendar/RangeCalendarHeader.vue.d.ts +18 -0
  283. package/dist/components/ui/range-calendar/RangeCalendarHeading.vue.d.ts +19 -0
  284. package/dist/components/ui/range-calendar/RangeCalendarNextButton.vue.d.ts +18 -0
  285. package/dist/components/ui/range-calendar/RangeCalendarPrevButton.vue.d.ts +18 -0
  286. package/dist/components/ui/range-calendar/index.d.ts +12 -0
  287. package/dist/components/ui/resizable/ResizableHandle.vue.d.ts +13 -0
  288. package/dist/components/ui/resizable/ResizablePanel.vue.d.ts +23 -0
  289. package/dist/components/ui/resizable/ResizablePanelGroup.vue.d.ts +22 -0
  290. package/dist/components/ui/resizable/index.d.ts +3 -0
  291. package/dist/components/ui/scroll-area/ScrollArea.vue.d.ts +18 -0
  292. package/dist/components/ui/scroll-area/ScrollBar.vue.d.ts +10 -0
  293. package/dist/components/ui/scroll-area/index.d.ts +2 -0
  294. package/dist/components/ui/select/Select.vue.d.ts +22 -0
  295. package/dist/components/ui/select/SelectContent.vue.d.ts +32 -0
  296. package/dist/components/ui/select/SelectGroup.vue.d.ts +15 -0
  297. package/dist/components/ui/select/SelectItem.vue.d.ts +18 -0
  298. package/dist/components/ui/select/SelectItemText.vue.d.ts +15 -0
  299. package/dist/components/ui/select/SelectLabel.vue.d.ts +18 -0
  300. package/dist/components/ui/select/SelectScrollDownButton.vue.d.ts +18 -0
  301. package/dist/components/ui/select/SelectScrollUpButton.vue.d.ts +18 -0
  302. package/dist/components/ui/select/SelectSeparator.vue.d.ts +8 -0
  303. package/dist/components/ui/select/SelectTrigger.vue.d.ts +21 -0
  304. package/dist/components/ui/select/SelectValue.vue.d.ts +15 -0
  305. package/dist/components/ui/select/index.d.ts +11 -0
  306. package/dist/components/ui/separator/index.d.ts +1 -0
  307. package/dist/components/ui/sheet/Sheet.vue.d.ts +19 -0
  308. package/dist/components/ui/sheet/SheetClose.vue.d.ts +15 -0
  309. package/dist/components/ui/sheet/SheetContent.vue.d.ts +35 -0
  310. package/dist/components/ui/sheet/SheetDescription.vue.d.ts +18 -0
  311. package/dist/components/ui/sheet/SheetFooter.vue.d.ts +17 -0
  312. package/dist/components/ui/sheet/SheetHeader.vue.d.ts +17 -0
  313. package/dist/components/ui/sheet/SheetOverlay.vue.d.ts +18 -0
  314. package/dist/components/ui/sheet/SheetTitle.vue.d.ts +18 -0
  315. package/dist/components/ui/sheet/SheetTrigger.vue.d.ts +15 -0
  316. package/dist/components/ui/sheet/index.d.ts +8 -0
  317. package/dist/components/ui/sidebar/Sidebar.vue.d.ts +23 -0
  318. package/dist/components/ui/sidebar/SidebarContent.vue.d.ts +17 -0
  319. package/dist/components/ui/sidebar/SidebarFooter.vue.d.ts +17 -0
  320. package/dist/components/ui/sidebar/SidebarGroup.vue.d.ts +17 -0
  321. package/dist/components/ui/sidebar/SidebarGroupAction.vue.d.ts +18 -0
  322. package/dist/components/ui/sidebar/SidebarGroupContent.vue.d.ts +17 -0
  323. package/dist/components/ui/sidebar/SidebarGroupLabel.vue.d.ts +18 -0
  324. package/dist/components/ui/sidebar/SidebarHeader.vue.d.ts +17 -0
  325. package/dist/components/ui/sidebar/SidebarInput.vue.d.ts +17 -0
  326. package/dist/components/ui/sidebar/SidebarInset.vue.d.ts +17 -0
  327. package/dist/components/ui/sidebar/SidebarMenu.vue.d.ts +17 -0
  328. package/dist/components/ui/sidebar/SidebarMenuAction.vue.d.ts +21 -0
  329. package/dist/components/ui/sidebar/SidebarMenuBadge.vue.d.ts +17 -0
  330. package/dist/components/ui/sidebar/SidebarMenuButton.vue.d.ts +25 -0
  331. package/dist/components/ui/sidebar/SidebarMenuButtonChild.vue.d.ts +26 -0
  332. package/dist/components/ui/sidebar/SidebarMenuItem.vue.d.ts +17 -0
  333. package/dist/components/ui/sidebar/SidebarMenuSkeleton.vue.d.ts +8 -0
  334. package/dist/components/ui/sidebar/SidebarMenuSub.vue.d.ts +17 -0
  335. package/dist/components/ui/sidebar/SidebarMenuSubButton.vue.d.ts +23 -0
  336. package/dist/components/ui/sidebar/SidebarMenuSubItem.vue.d.ts +17 -0
  337. package/dist/components/ui/sidebar/SidebarProvider.vue.d.ts +26 -0
  338. package/dist/components/ui/sidebar/SidebarRail.vue.d.ts +17 -0
  339. package/dist/components/ui/sidebar/SidebarSeparator.vue.d.ts +17 -0
  340. package/dist/components/ui/sidebar/SidebarTrigger.vue.d.ts +7 -0
  341. package/dist/components/ui/sidebar/index.d.ts +38 -0
  342. package/dist/components/ui/sidebar/utils.d.ts +56 -0
  343. package/dist/components/ui/skeleton/Skeleton.vue.d.ts +7 -0
  344. package/dist/components/ui/skeleton/index.d.ts +1 -0
  345. package/dist/components/ui/slider/Slider.vue.d.ts +14 -0
  346. package/dist/components/ui/slider/index.d.ts +1 -0
  347. package/dist/components/ui/sonner/Sonner.vue.d.ts +5 -0
  348. package/dist/components/ui/sonner/index.d.ts +1 -0
  349. package/dist/components/ui/stepper/Stepper.vue.d.ts +22 -0
  350. package/dist/components/ui/stepper/StepperDescription.vue.d.ts +18 -0
  351. package/dist/components/ui/stepper/StepperIndicator.vue.d.ts +18 -0
  352. package/dist/components/ui/stepper/StepperItem.vue.d.ts +18 -0
  353. package/dist/components/ui/stepper/StepperSeparator.vue.d.ts +8 -0
  354. package/dist/components/ui/stepper/StepperTitle.vue.d.ts +18 -0
  355. package/dist/components/ui/stepper/StepperTrigger.vue.d.ts +18 -0
  356. package/dist/components/ui/stepper/index.d.ts +7 -0
  357. package/dist/components/ui/switch/Switch.vue.d.ts +22 -0
  358. package/dist/components/ui/switch/index.d.ts +1 -0
  359. package/dist/components/ui/table/Table.vue.d.ts +18 -0
  360. package/dist/components/ui/table/TableBody.vue.d.ts +17 -0
  361. package/dist/components/ui/table/TableCaption.vue.d.ts +17 -0
  362. package/dist/components/ui/table/TableCell.vue.d.ts +17 -0
  363. package/dist/components/ui/table/TableEmpty.vue.d.ts +20 -0
  364. package/dist/components/ui/table/TableFooter.vue.d.ts +17 -0
  365. package/dist/components/ui/table/TableHead.vue.d.ts +17 -0
  366. package/dist/components/ui/table/TableHeader.vue.d.ts +17 -0
  367. package/dist/components/ui/table/TableRow.vue.d.ts +17 -0
  368. package/dist/components/ui/table/index.d.ts +9 -0
  369. package/dist/components/ui/table/utils.d.ts +3 -0
  370. package/dist/components/ui/tabs/TabsContent.vue.d.ts +18 -0
  371. package/dist/components/ui/tabs/TabsList.vue.d.ts +18 -0
  372. package/dist/components/ui/tabs/TabsTrigger.vue.d.ts +18 -0
  373. package/dist/components/ui/tabs/index.d.ts +4 -0
  374. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +28 -0
  375. package/dist/components/ui/tags-input/TagsInputInput.vue.d.ts +8 -0
  376. package/dist/components/ui/tags-input/TagsInputItem.vue.d.ts +18 -0
  377. package/dist/components/ui/tags-input/TagsInputItemDelete.vue.d.ts +18 -0
  378. package/dist/components/ui/tags-input/TagsInputItemText.vue.d.ts +8 -0
  379. package/dist/components/ui/tags-input/index.d.ts +5 -0
  380. package/dist/components/ui/textarea/Textarea.vue.d.ts +13 -0
  381. package/dist/components/ui/textarea/index.d.ts +1 -0
  382. package/dist/components/ui/toggle/Toggle.vue.d.ts +29 -0
  383. package/dist/components/ui/toggle/index.d.ts +8 -0
  384. package/dist/components/ui/toggle-group/ToggleGroup.vue.d.ts +27 -0
  385. package/dist/components/ui/toggle-group/ToggleGroupItem.vue.d.ts +23 -0
  386. package/dist/components/ui/toggle-group/index.d.ts +2 -0
  387. package/dist/components/ui/tooltip/Tooltip.vue.d.ts +19 -0
  388. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +26 -0
  389. package/dist/components/ui/tooltip/TooltipProvider.vue.d.ts +17 -0
  390. package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts +15 -0
  391. package/dist/components/ui/tooltip/index.d.ts +4 -0
  392. package/dist/server/index.d.mts +580 -283
  393. package/dist/server/index.mjs +4 -5
  394. package/dist/shared/index.d.mts +519 -32
  395. package/dist/shared/index.mjs +2 -2
  396. package/eslint.config.mts +4 -0
  397. package/legacy/client/components/AlertButton.vue +1 -1
  398. package/legacy/client/layouts/AdminLayout.vue +3 -0
  399. package/package.json +41 -8
  400. package/tsconfig.client.json +15 -9
  401. package/tsdown.config.ts +3 -0
  402. package/vite/createViteConfig.js +5 -0
  403. package/vite.config.ts +31 -33
  404. package/vitest.config.ts +35 -0
@@ -1,2 +1,2 @@
1
- import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as ee,subject as u}from"@casl/ability";function d(...e){return e.reduce((e,t)=>t(e),class{})}function f(e,...t){return t.reduce((e,t)=>t(e),e)}function p(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function m(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function h(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){h(i,e,n);continue}n[e]=i}return n}function g(e){let t={};for(let[n,r]of Object.entries(e))a(t,n,r);return t}async function _(e){try{return[null,await e()]}catch(e){return[e,null]}}_.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function v(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function y(e=``){return e+v()}var b=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return h(this.toRecord())}},x=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},te=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new x(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}},S=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},C=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new S,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||y();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=n=>{t(n),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let e of n)_.sync(()=>e.listener(t))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event`,{handlers:n.length,event:e,args:t});for await(let e of n)await e.listener(t)}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},ne=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new S,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await _(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},re=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new S,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,t)}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},ie=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}},ae=e({array:()=>O,arrayNumber:()=>k,boolean:()=>T,date:()=>E,datetime:()=>D,number:()=>w,object:()=>A});const w=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),T=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),E=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),D=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),O=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),k=()=>s.pipe(O(),s.transform(e=>e.map(Number))),A=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));var j=e({base:()=>M});const M=(e={})=>s.object({page:s.optional(w(),1),limit:s.optional(w(),e.maxLimit||100),orderBy:s.optional(e.orderFields?O(s.picklist(e.orderFields)):O(s.string()),[]),orderDirection:s.optional(O(s.union([s.literal(`asc`),s.literal(`desc`)])),[])}),N={url:ae,pagination:j};var P=class{static __container_entry_key=`ValidatorService`;v={...s,extras:N};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new x(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=s.safeParse(n,e);return r}};function F(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function I(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}const L=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),R=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),z=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});var B=class extends x{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};const V=new P;function H(e={}){return function(t){return class extends t{static from(n){let r=new(typeof this==`function`?this:t),i={...n};return e.parse&&(i=e.parse(n)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}}function U(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}async function W(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function G(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function K(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return G(this,e,t)}static async emit(e,...t){return W(this,e,...t)}}}function q(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}K.emit=W,K.on=G;function J(e){return class extends e{deleted_at=null}}function Y(e){return class extends e{created_at;updated_at}}var X=class extends d(U){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=_.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},oe=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>X.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new S().child({label:`acl`}),this.ability=ee(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=u(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=u(t,n);return this.ability.cannot(e,r)}subject(e,t){return u(e,t)}},se=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};const Z=()=>[{id:`fs`,label:$t(`File System`),description:$t(`Store files on the local file system.`),config_fields:{directory:{component:`text-field`,label:$t(`Directory`),description:$t(`The directory path where files will be stored.`),hint:$t(`Relative to the application root or absolute path, e.g., :0 or :1`,[`/var/zenith/uploads`,`storage/uploads`])}}},{id:`s3`,label:`S3`,description:$t(`Store files on an S3-compatible service like AWS S3, DigitalOcean Spaces, etc.`),config_fields:{accessKeyId:{component:`text-field`,label:$t(`Access Key ID`),hint:$t(`Your AWS access key ID.`),type:`password`},secretAccessKey:{component:`text-field`,label:$t(`Secret Access Key`),hint:$t(`Your AWS secret access key.`),type:`password`},bucket:{component:`text-field`,label:$t(`Bucket Name`),hint:$t(`The name of the S3 bucket to store files in.`)},region:{component:`text-field`,label:$t(`Region`),hint:$t(`The AWS region where your bucket is located.`)},prefix:{component:`text-field`,label:$t(`Prefix`),hint:$t(`An optional prefix (folder path) to store files under in the bucket.`)},endpoint:{component:`text-field`,label:$t(`Endpoint URL`),hint:$t(`Optional custom endpoint URL for S3-compatible services.`)}}}];var ce=class e{static get TYPES(){return Z()}id;name;type;is_default;config;constructor(e){Object.assign(this,e)}get config_fields(){let t=e.TYPES.find(e=>e.id===this.type);return t?t.config_fields:{}}},le=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},ue=class extends d(U,Y,J){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},de=class extends d(U,Y,J){id;file_id;name;value},fe=class extends d(U,Y,J){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},pe=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new x(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Q=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},$=class extends d(U,p(Q)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},me=class extends d(U){id;name;version;description;enabled;author;dependencies;build},he=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},ge=class extends d(U){id;name;version;enabled;aliases},_e=class extends d(U,Y,J){id;name;description},ve=class extends d(U,Y,J){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{oe as AclEntity,U as BaseEntityMixin,x as BaseException,b as ConfigService,te as ContainerService,se as CookieMapEntity,ce as DriveConfigEntity,le as DriveEntryEntity,C as EmmitterService,ue as FileEntity,de as FileMetaEntity,fe as FileUploadSessionEntity,pe as HeaderMapEntity,q as HooksMixin,K as HooksStatic,Q as LifecycleHook,ne as LifecycleService,S as LoggerService,$ as ModuleEntity,me as ModuleManifestEntity,he as PaginationEntity,X as PermissionEntity,ge as PluginEntity,_e as RoleEntity,B as ShellException,J as SoftDeleteMixin,Z as TYPES,Y as TimestampMixin,re as TranslatorService,ie as UploadService,ve as UserEntity,P as ValidatorService,d as compose,f as composeWith,H as createBaseEntity,y as createId,W as emitHook,h as flatten,m as formatBytes,p as mixin,G as onHook,F as parseUrlParams,I as parseUrlQuery,L as permissionAssignmentSchema,R as permissionSchema,z as tokenSchema,_ as tryCatch,g as unflatten,V as validator};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mb3JtYXRCeXRlcy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9IZWFkZXJNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyLCBkZWNpbWFscyA9IDIpIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcydcblxuICAgIGNvbnN0IGsgPSAxMDI0XG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8IDAgPyAwIDogZGVjaW1hbHNcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInXVxuXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpXG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV1cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4ob2JqOiBhbnksIHByZWZpeCA9ICcnLCByZXM6IGFueSA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBpc0luZGV4ID0gL15cXGQrJC8udGVzdChrZXkpXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGlzSW5kZXggPyBgJHtwcmVmaXh9WyR7a2V5fV1gIDogcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZsYXR0ZW4odmFsdWUsIG5ld0tleSwgcmVzKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tuZXdLZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZsYXR0ZW4ob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW50ZXJmYWNlIFRyeWVyIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBhbnlcbn1cblxuaW50ZXJmYWNlIFRyeWVyQXN5bmMge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB8IGFueVxufVxuXG50eXBlIFRyeUNhdGNoUmVzdWx0PFQgZXh0ZW5kcyBUcnllcj4gPSBbbnVsbCwgUmV0dXJuVHlwZTxUPl0gfCBbRXJyb3IsIG51bGxdXG5cbnR5cGUgVHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4gPSBbbnVsbCwgQXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pl0gfCBbRXJyb3IsIG51bGxdXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlDYXRjaDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4odHJ5ZXI6IFQpOiBQcm9taXNlPFRyeUNhdGNoQXN5bmNSZXN1bHQ8VD4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cblxudHJ5Q2F0Y2guc3luYyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgVHJ5ZXI+KHRyeWVyOiBUKTogVHJ5Q2F0Y2hSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiaW1wb3J0IHsgZ2V0LCBzZXQsIGhhcywgdW5zZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmludGVyZmFjZSBFbnRyeSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICB2YWx1ZTogYW55XG4gICAgc291cmNlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29uZmlnU2VydmljZSdcblxuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFbnRyeT5cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnOmJvb2xlYW4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoJzpib29sZWFuJywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21FbnRyaWVzKGVudHJpZXM6IFtzdHJpbmcsIGFueV1bXSwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtrZXldID0gZW50cnkudmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhcyh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlIGFzIFRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LnZhbHVlIDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXQodmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgZGVmYXVsdFZhbHVlKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T25lPFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8VD4oa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdydW50aW1lJyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgbGV0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHByaW1hcnlWYWx1ZSA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5VmFsdWUpIHJldHVyblxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdW5zZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6ICdydW50aW1lJyxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpXG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMudG9SZWNvcmQoKSlcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIHB1YmxpYyBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvcik6IEJhc2VFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VFeGNlcHRpb24oZXJyb3IubWVzc2FnZSwgNTAwKVxuICAgIH1cbn0iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG50eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuXG50eXBlIEVudHJ5S2V5ID0gc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3JcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFpbmVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxFbnRyeUtleSwgYW55PigpXG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRbU3RyaW5nKGtleSldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShwYXlsb2FkOiBFbnRyeUtleSk6IEVudHJ5S2V5IHtcbiAgICAgICAgbGV0IGtleSA9IHBheWxvYWRcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXkgPSBwYXlsb2FkLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uc3RydWN0b3IgPSB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHBheWxvYWQgIT09ICdzeW1ib2wnXG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgIShwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IFRoZSBjb25zdHJ1Y3RvciAke3BheWxvYWQubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBDb25zaWRlciBhZGRpbmcgYSBzdGF0aWMgcHJvcGVydHkgX19jb250YWluZXJfZW50cnlfa2V5IHRvIGF2b2lkIHBvdGVudGlhbCBjb25mbGljdHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmIChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBrZXkgPSAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleVxuXG4gICAgfVxuXG4gICAgcHVibGljIHNldChwYXlsb2FkOiBFbnRyeUtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRW50cnkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZCBpbiBjb250YWluZXIuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIHNpbmdsZXRvbjxUPihjbGFzc0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPik6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSBjbGFzc0NvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgY2xhc3NDb25zdHJ1Y3RvcigpXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBuZXdJbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZW50cmllczogUmVjb3JkPGFueSwgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVtwcm9wXVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChlbnRyeSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlbcHJvcF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BdID0gdmFsdWVcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5cygpOiBFbnRyeUtleVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmtleXMoKSlcbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHByaXZhdGUgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwcml2YXRlIGRlYnVnOiBib29sZWFuXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyLCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2xhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVHJhbnNsYXRvclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBsb2NhbGU6IHN0cmluZ1xuICAgIHB1YmxpYyBsb2NhbGVMb2FkZXJzOiBNYXA8c3RyaW5nLCAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PlxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBjYWNoZTogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8VHJhbnNsYXRvclNlcnZpY2U+ID0ge30pIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gZGF0YS5lbnRyaWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBkYXRhLmxvY2FsZSB8fCAnZW4nXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMuY2FjaGUgPSBkYXRhLmNhY2hlIHx8IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvY2FsZUxvYWRlcnMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4oKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5sb2NhbGVMb2FkZXJzLmtleXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBnZXRFbnRyaWVzKGxvY2FsZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXQobG9jYWxlKSFcblxuICAgICAgICBpZiAoY2FjaGUgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlIFwiJHtsb2NhbGV9XCIgZnJvbSBjYWNoZWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBPYmplY3Qua2V5cyhjYWNoZSkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRlciA9IHRoaXMubG9jYWxlTG9hZGVycy5nZXQobG9jYWxlKVxuXG4gICAgICAgIGlmICghbG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBubyBsb2FkZXIgZm91bmQgZm9yIGxvY2FsZSBcIiR7bG9jYWxlfVwiYClcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGxvYWRlcigpXG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQobG9jYWxlLCBlbnRyaWVzKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbG9hZCBsb2NhbGUgJHtsb2NhbGV9YCwge1xuICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBrZXlzOiBPYmplY3Qua2V5cyhlbnRyaWVzKS5sZW5ndGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cmllc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldEVudHJpZXMobG9jYWxlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKVxuXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgfVxuXG4gICAgcHVibGljIHQoa2V5OiBzdHJpbmcsIGFyZ3M6IGFueSA9IHt9KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYG1pc3NpbmcgdHJhbnNsYXRpb24gZm9yIGtleSBcIiR7a2V5fVwiYCwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSkgfHwga2V5XG5cbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uID0gZW50cnlcblxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFyZ3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5mb3JFYWNoKChbYUtleSwgYVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5yZXBsYWNlKGA6JHthS2V5fWAsIGFWYWx1ZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25cbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0ZShkYXRhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGRhdGV0aW1lKGRhdGE6IHN0cmluZyB8IG51bWJlciB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1VwbG9hZFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc2luZ2xlKG5hbWU6IHN0cmluZyl7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgbXVsdGlwbGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmJvb2xlYW4oKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUodikpLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA/IGZvcm1hdCh2LCAneXl5eS1NTS1kZCcpIDogdiksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRldGltZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4ge1xuICAgICAgICBpZiAoIXYpIHJldHVybiB2XG5cbiAgICAgICAgaWYgKHYgPT09ICdudWxsJykgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gbmV3IERhdGUodilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQodiwgJ3l5eXktTU0tZGQgSEg6bW0nKVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4oc2NoZW1hOiBUID0gdi5hbnkoKSBhcyBhbnkgYXMgVCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYXJyYXkodi5zdHJpbmcoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoJywnKSksXG4gICAgdi5hcnJheShzY2hlbWEpLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXlOdW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgYXJyYXkoKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB2YWx1ZS5tYXAoTnVtYmVyKSksXG4pXG5cbmV4cG9ydCBjb25zdCBvYmplY3QgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcXMucGFyc2UodmFsdWUpIDogdmFsdWUpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBnZXQodmFsdWUsIGtleSkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSksXG4pXG5cbiIsImltcG9ydCB7IG51bWJlciwgYXJyYXkgfSBmcm9tICcuL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uUGFyYW1zIHtcbiAgICBtYXhMaW1pdD86IG51bWJlclxuICAgIG9yZGVyRmllbGRzPzogc3RyaW5nW11cbn1cblxuXG5leHBvcnQgY29uc3QgYmFzZSA9IChvcHRpb25zOiBQYWdpbmF0aW9uUGFyYW1zID0ge30pID0+IHYub2JqZWN0KHtcbiAgICBwYWdlOiB2Lm9wdGlvbmFsKG51bWJlcigpLCAxKSxcbiAgICBsaW1pdDogdi5vcHRpb25hbChudW1iZXIoKSwgb3B0aW9ucy5tYXhMaW1pdCB8fCAxMDApLFxuICAgIG9yZGVyQnk6IHYub3B0aW9uYWwob3B0aW9ucy5vcmRlckZpZWxkcyA/IGFycmF5KHYucGlja2xpc3Qob3B0aW9ucy5vcmRlckZpZWxkcykpIDogYXJyYXkodi5zdHJpbmcoKSksIFtdKSxcbiAgICBvcmRlckRpcmVjdGlvbjogdi5vcHRpb25hbChhcnJheSh2LnVuaW9uKFt2LmxpdGVyYWwoJ2FzYycpLCB2LmxpdGVyYWwoJ2Rlc2MnKV0pKSwgW10pLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCAqIGFzIHVybCBmcm9tICcjc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgcGFnaW5hdGlvbiBmcm9tICcjc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuY29uc3QgZXh0cmFzID0ge1xuICAgIHVybCxcbiAgICBwYWdpbmF0aW9uLFxufVxuXG5leHBvcnQgdHlwZSBWYWxpYm90ID0gdHlwZW9mIHYgJiB7IGV4dHJhczogdHlwZW9mIGV4dHJhcyB9IFxuXG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hID0gdi5CYXNlU2NoZW1hPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYUFzeW5jID0gdi5CYXNlU2NoZW1hQXN5bmM8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ2FsbGJhY2s8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4gPSB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JSZXN1bHQ8VCBleHRlbmRzIHYuT2JqZWN0RW50cmllcz4gPSB2LkluZmVyT3V0cHV0PHYuT2JqZWN0U2NoZW1hPFQsIHVuZGVmaW5lZD4+XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUGF5bG9hZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+ID0gVmFsaWRhdG9yQ2FsbGJhY2s8VD4gfCBUXG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUmVzdWx0PFQgZXh0ZW5kcyBWYWxpZGF0ZVBheWxvYWQ+ID1cbiAgICBUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA/IHYuSW5mZXJPdXRwdXQ8VD4gOlxuICAgIFQgZXh0ZW5kcyBWYWxpZGF0b3JDYWxsYmFjazxpbmZlciBVPiA/IHYuSW5mZXJPdXRwdXQ8VT4gOlxuICAgIHVua25vd25cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdWYWxpZGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHY6IFZhbGlib3QgPSB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGV4dHJhcyxcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihjYjogVmFsaWRhdG9yQ2FsbGJhY2s8VD4pIHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudilcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPikge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ucm9vdCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4uZmxhdHRlbi5yb290KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5uZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuLm5lc3RlZCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkgYXMgW3N0cmluZywgc3RyaW5nW11dXG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi52YWx1ZS5tYXAoKHYpID0+IGAke2tleX06ICR7dn1gKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMubGVuZ3RoID8gbWVzc2FnZXMuam9pbignLCAnKSA6ICdWYWxpZGF0aW9uIGZhaWxlZCdcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCA0MjIpXG5cbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJ1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG1lc3NhZ2VzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUFzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VD4gfCBUKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IGF3YWl0IHYuc2FmZVBhcnNlQXN5bmMoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLnJvb3QsXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5uZXN0ZWQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZGV0YWlscywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgcXMgZnJvbSAncXMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTZWdtZW50cyA9IHJlcXVlc3RTZWdtZW50cy5zbGljZShpKVxuICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFF1ZXJ5KHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHJldHVybiBxcy5wYXJzZShxdWVyeVN0cmluZylcbn1cbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIHBlcm1pc3Npb25faWQ6IHYubnVtYmVyKCksXG4gICAgYXNzaWduYWJsZV90eXBlOiB2LnN0cmluZygpLFxuICAgIGFzc2lnbmFibGVfaWQ6IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgYWN0aW9uOiB2LnN0cmluZygpLFxuICAgIHN1YmplY3Q6IHYuc3RyaW5nKCksXG4gICAgY29uZGl0aW9uczogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFRva2VuID0gdi5JbmZlck91dHB1dDx0eXBlb2YgdG9rZW5TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCB0b2tlblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIHR5cGU6IHYuc3RyaW5nKCksXG4gICAgdXNlcl9pZDogdi5udW1iZXIoKSxcbiAgICB0b2tlbjogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWxsRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gICAgcHVibGljIG91dHB1dDogc3RyaW5nXG4gICAgcHVibGljIGJpbjogc3RyaW5nIFxuICAgIHB1YmxpYyBhcmdzOiBzdHJpbmdbXVxuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZywgYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIDUwMSlcblxuICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dFxuICAgICAgICB0aGlzLmJpbiA9IGJpbiBcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncyBcbiAgICB9XG59XG4iLCJpbXBvcnQgVmFsaWRhdG9yU2VydmljZSBmcm9tIFwiLi4vc2VydmljZXMvVmFsaWRhdG9yU2VydmljZVwiXG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRvclxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuaW50ZXJmYWNlIENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zIHtcbiAgICBwYXJzZT86IChkYXRhOiBhbnkpID0+IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZUVudGl0eShvcHRpb25zOiBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG9wdGlvbnMucGFyc2UoZGF0YSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udHJ1Y3Rvcj8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKGNvbnRydWN0b3IgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSk/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbmVyIHtcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW1pdEhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHsgICAgICAgICAgICAgICAgXG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzLmZpbHRlcigobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCkpIHtcbiAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uSG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBjb25zdCBleGlzdHMgPSBsaXN0ZW5lcnMuZmluZCgobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyIFxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgPSBsaXN0ZW5lcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhvb2tzU3RhdGljPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QuYXBwbHkodGhpcy5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgbGlzdGVuZXJzID0gW10gYXMgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPlxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uSG9vayh0aGlzLCBldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0SG9vayh0aGlzLCBldmVudCwgLi4uYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSG9va3M8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIGxpc3RlbmVyczogTGlzdGVuZXJbXVxuXG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciBcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHB1YmxpYyBhc3luYyBlbWl0QXN5bmMoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkhvb2tzU3RhdGljLmVtaXQgPSBlbWl0SG9va1xuSG9va3NTdGF0aWMub24gPSBvbkhvb2tcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgVFlQRVMgPSAoKSA9PiBbXG4gICAge1xuICAgICAgICBpZDogJ2ZzJyxcbiAgICAgICAgbGFiZWw6ICR0KCdGaWxlIFN5c3RlbScpLFxuICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1N0b3JlIGZpbGVzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4nKSxcbiAgICAgICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICAgICAgZGlyZWN0b3J5OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdEaXJlY3RvcnknKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1RoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSBmaWxlcyB3aWxsIGJlIHN0b3JlZC4nKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnUmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIHJvb3Qgb3IgYWJzb2x1dGUgcGF0aCwgZS5nLiwgOjAgIG9yIDoxJywgWycvdmFyL3plbml0aC91cGxvYWRzJywgJ3N0b3JhZ2UvdXBsb2FkcyddKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogJ3MzJyxcbiAgICAgICAgbGFiZWw6ICdTMycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnU3RvcmUgZmlsZXMgb24gYW4gUzMtY29tcGF0aWJsZSBzZXJ2aWNlIGxpa2UgQVdTIFMzLCBEaWdpdGFsT2NlYW4gU3BhY2VzLCBldGMuJyksXG4gICAgICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc0tleUlkOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdBY2Nlc3MgS2V5IElEJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1lvdXIgQVdTIGFjY2VzcyBrZXkgSUQuJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1NlY3JldCBBY2Nlc3MgS2V5JyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1lvdXIgQVdTIHNlY3JldCBhY2Nlc3Mga2V5LicpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdCdWNrZXQgTmFtZScpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdUaGUgbmFtZSBvZiB0aGUgUzMgYnVja2V0IHRvIHN0b3JlIGZpbGVzIGluLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZ2lvbjoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnUmVnaW9uJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1RoZSBBV1MgcmVnaW9uIHdoZXJlIHlvdXIgYnVja2V0IGlzIGxvY2F0ZWQuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdQcmVmaXgnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnQW4gb3B0aW9uYWwgcHJlZml4IChmb2xkZXIgcGF0aCkgdG8gc3RvcmUgZmlsZXMgdW5kZXIgaW4gdGhlIGJ1Y2tldC4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnRW5kcG9pbnQgVVJMJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ09wdGlvbmFsIGN1c3RvbSBlbmRwb2ludCBVUkwgZm9yIFMzLWNvbXBhdGlibGUgc2VydmljZXMuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgfVxuXVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVDb25maWcge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFRZUEVTKCkge1xuICAgICAgICByZXR1cm4gVFlQRVMoKVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nXG4gICAgcHVibGljIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUNvbmZpZyl7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZ19maWVsZHMoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IERyaXZlQ29uZmlnLlRZUEVTLmZpbmQob3B0ID0+IG9wdC5pZCA9PT0gdGhpcy50eXBlKVxuXG4gICAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24uY29uZmlnX2ZpZWxkcyA6IHt9XG4gICAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlRW50cnkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknXG4gICAgcHVibGljIG1ldGFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlRW50cnkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGRyaXZlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZXR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgY2xpZW50X25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHB1YmxpYzogYm9vbGVhblxuXG4gICAgLy8gZHluYW1pY1xuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgbWV0YXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBwdWJsaWMgaXNJbWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZXR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJylcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZU1ldGEgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZmlsZV9pZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nIHwgbnVsbFxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlc3Npb24gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1lX3R5cGVzOiBzdHJpbmdcbiAgICBwdWJsaWMgbWF4X3NpemU6IG51bWJlclxuXG4gICAgLy8gZHluYW1pYyBcbiAgICBwdWJsaWMgdXBsb2FkX3VybD86IHN0cmluZ1xuICAgIHB1YmxpYyBjcmVhdGVfZmlsZV91cmw/OiBzdHJpbmdcblxuICAgIHB1YmxpYyBnZXRQYXJzZWRNaW1lVHlwZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1lX3R5cGVzLnNwbGl0KCcsJykubWFwKHR5cGUgPT4gdHlwZS50cmltKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZE1pbWVUeXBlKG1pbWVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5nZXRQYXJzZWRNaW1lVHlwZXMoKVxuICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoJyovKicpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZFNpemUoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzaXplIDw9IHRoaXMubWF4X3NpemVcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgc2V0SGVhZGVyPzogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWFkZXJNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0hlYWRlck1hcEVudGl0eSdcbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBzZXRIZWFkZXI/OiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMuc2V0SGVhZGVyID0gZGF0YT8uc2V0SGVhZGVyXG5cbiAgICAgICAgaWYgKGRhdGE/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZyb21SZWNvcmQoZGF0YS5oZWFkZXJzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQobmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldEhlYWRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ3NldEhlYWRlciBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCcpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KG5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCJpbXBvcnQgdHlwZSBNb2R1bGVNYW5pZmVzdCBmcm9tICcuL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSwgbWl4aW4gfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmludGVyZmFjZSBNb2R1bGVVcGdyYWRlSW5mbyB7XG4gICAgc291cmNlOiAnZ2l0JyB8ICd6aXAnXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgbWl4aW4oTGlmZWN5Y2xlSG9vaykpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGJ1aWxkOiBNb2R1bGVNYW5pZmVzdFsnYnVpbGQnXSA9IHt9XG4gICAgcHVibGljIGRpcmVjdG9yeTogc3RyaW5nXG5cbiAgICBwdWJsaWMgdXBncmFkZV9pbmZvPzogTW9kdWxlVXBncmFkZUluZm9cblxuICAgIHB1YmxpYyBzZXREYXRhKGRhdGE6IFBhcnRpYWw8TW9kdWxlIHwgTW9kdWxlTWFuaWZlc3Q+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICApXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBmaWx0ZXJlZClcblxuICAgICAgICB0aGlzLmhvb2tfaWQgPSBgbW9kdWxlOiR7dGhpcy5pZH1gXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bz86IHN0cmluZ1xuICAgIHR5cGU6ICdnbG9iYWxfaW1wb3J0J1xufVxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkIHtcbiAgICBpbXBvcnRzPzogTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZU1hbmlmZXN0IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGF1dGhvcj86IHN0cmluZ1xuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIGJ1aWxkPzogTW9kdWxlTWFuaWZlc3RCdWlsZFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnaW5hdGlvbkVudGl0eTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBpdGVtczogVFtdXG4gICAgcHVibGljIHRvdGFsOiBudW1iZXJcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyXG4gICAgcHVibGljIHBlcl9wYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgdG90YWxfcGFnZXM6IG51bWJlclxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5Pikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tPFQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID4ocGF5bG9hZDogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5PFQ+Pik6IFBhZ2luYXRpb25FbnRpdHk8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25FbnRpdHkocGF5bG9hZCBhcyBhbnkpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGFsaWFzZXM6IHN0cmluZ1tdXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiIyUUFzQkEsU0FBZ0IsRUFFZCxHQUFHLEVBQXVELENBQ3hELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxLQUFNLEdBQVUsQ0FtQnZFLFNBQWdCLEVBSVosRUFDQSxHQUFHLEVBQytDLENBQ2xELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxFQUFpQixDQUd4RSxTQUFnQixFQUFpQyxFQUFlLENBQzVELE9BQU8sU0FBdUMsRUFBaUIsQ0FDM0QsTUFBTSxVQUFjLENBQU8sQ0FDdkIsWUFBWSxHQUFHLEVBQWEsQ0FDeEIsTUFBTSxHQUFHLEVBQUssQ0FDZCxJQUFNLEVBQVMsSUFBSSxFQUFPLEdBQUcsRUFBSyxDQUNsQyxPQUFPLE9BQU8sS0FBTSxFQUFPLEVBS25DLElBQUssSUFBTSxLQUFP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
1
+ import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as ee,subject as u}from"@casl/ability";function d(...e){return e.reduce((e,t)=>t(e),class{})}function f(e,...t){return t.reduce((e,t)=>t(e),e)}function p(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function m(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function h(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){h(i,e,n);continue}n[e]=i}return n}function te(e){let t={};for(let[n,r]of Object.entries(e))a(t,n,r);return t}async function g(e){try{return[null,await e()]}catch(e){return[e,null]}}g.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function _(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function v(e=``){return e+_()}var y=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return h(this.toRecord())}},b=class e extends Error{status=500;constructor(e,t=500){super(e),this.name=`BaseException`,this.status=t}static fromError(t){return new e(t.message,500)}},ne=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new b(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}},x=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},re=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new x,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||v();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let r of n)g.sync(()=>r.listener(t,{event:e}))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event and wait`,{handlers:n.length,event:e,args:t});for await(let r of n)await r.listener(t,{event:e})}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},S=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},ie=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new x,e.onError&&(this.onError=e.onError)}setOnError(e){this.onError=e}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await g(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}on(e,t){let n=new S;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},ae=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new x,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,String(t))}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},oe=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}};const C=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),w=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),T=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),E=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),D=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),O=()=>s.pipe(D(),s.transform(e=>e.map(Number))),k=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));function A(){return k()}A.number=C,A.boolean=w,A.date=T,A.datetime=E,A.array=D,A.arrayNumber=O,A.object=k;const se=()=>s.pipe(s.string(),s.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),a(r,e,n)}return r})),j=(e={})=>s.object({page:s.optional(C(),1),limit:s.optional(C(),e.maxLimit||100),orderBy:s.nullish(e.orderFields?D(s.picklist(e.orderFields)):D(s.string()),[]),orderDirection:s.nullish(D(s.union([s.literal(`asc`),s.literal(`desc`)])),[])});function M(e={}){return j(e)}M.base=j;var ce=e({array:()=>D,arrayNumber:()=>O,base:()=>j,boolean:()=>w,date:()=>T,datetime:()=>E,keyValue:()=>se,number:()=>C,object:()=>k,pagination:()=>M,url:()=>A}),N=class{static __container_entry_key=`ValidatorService`;v={...s,extras:ce};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new b(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=s.safeParse(n,e);return r}};function le(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean);for(let e=0;e<n.length;e++){let t=n[e],i=r[e];if(t===`*`)return!0;if(e>=r.length||!t.startsWith(`:`)&&t!==i)return!1}return!(r.length>n.length)}function P(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function F(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}function I(e){try{return JSON.parse(e)}catch(e){return console.error(`Failed to parse JSON:`,e),null}}function L(e){try{return JSON.stringify(e)}catch(e){return console.error(`Failed to stringify JSON:`,e),null}}const R=new N;function z(){return R.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}z.create=R.create(e=>e.pick(z(),[`dashboard_id`,`name`,`value`])),z.update=R.create(e=>e.partial(z.create));function B(){return R.create(e=>e.object({id:e.number(),name:e.string(),description:e.nullable(e.string()),created_at:e.string(),updated_at:e.string(),deleted_at:e.nullable(e.string()),metas:e.optional(e.record(e.string(),e.any()))}))}B.create=R.create(e=>e.pick(B(),[`name`,`description`])),B.update=R.create(e=>e.partial(B.create));const V=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),H=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),U=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});function W(){return s.object({id:s.number(),name:s.optional(s.string()),email:s.pipe(s.string(),s.email()),password:s.pipe(s.string(),s.minLength(6)),username:s.pipe(s.string(),s.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),deleted_at:s.nullable(s.string())})}W.create=()=>s.omit(W(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),W.update=()=>s.partial(W.create());var ue=class extends b{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};function de(e={}){return function(t){return class extends t{static from(n){let r=new(typeof this==`function`?this:t),i={...n};return e.parse&&(i=e.parse(n)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}}function G(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}async function K(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function q(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function J(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return q(this,e,t)}static async emit(e,...t){return K(this,e,...t)}}}function fe(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}J.emit=K,J.on=q;function Y(e){return class extends e{deleted_at=null}}function X(e){return class extends e{created_at;updated_at}}var Z=class extends d(G){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=g.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},pe=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Z.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new x().child({label:`acl`}),this.ability=ee(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=u(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=u(t,n);return this.ability.cannot(e,r)}subject(e,t){return u(e,t)}},me=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};const Q=()=>[{id:`fs`,label:$t(`File System`),description:$t(`Store files on the local file system.`),config_fields:{directory:{component:`text-field`,label:$t(`Directory`),description:$t(`The directory path where files will be stored.`),hint:$t(`Relative to the application root or absolute path, e.g., :0 or :1`,[`/var/zenith/uploads`,`storage/uploads`])}}},{id:`s3`,label:`S3`,description:$t(`Store files on an S3-compatible service like AWS S3, DigitalOcean Spaces, etc.`),config_fields:{accessKeyId:{component:`text-field`,label:$t(`Access Key ID`),hint:$t(`Your AWS access key ID.`),type:`password`},secretAccessKey:{component:`text-field`,label:$t(`Secret Access Key`),hint:$t(`Your AWS secret access key.`),type:`password`},bucket:{component:`text-field`,label:$t(`Bucket Name`),hint:$t(`The name of the S3 bucket to store files in.`)},region:{component:`text-field`,label:$t(`Region`),hint:$t(`The AWS region where your bucket is located.`)},prefix:{component:`text-field`,label:$t(`Prefix`),hint:$t(`An optional prefix (folder path) to store files under in the bucket.`)},endpoint:{component:`text-field`,label:$t(`Endpoint URL`),hint:$t(`Optional custom endpoint URL for S3-compatible services.`)}}}];var he=class e{static get TYPES(){return Q()}id;name;type;is_default;config;constructor(e){Object.assign(this,e)}get config_fields(){let t=e.TYPES.find(e=>e.id===this.type);return t?t.config_fields:{}}},ge=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},_e=class extends d(G,X,Y){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},ve=class extends d(G,X,Y){id;file_id;name;value},ye=class extends d(G,X,Y){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},be=class{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},$=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},xe=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new b(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Se=class extends d(G,p(S)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},Ce=class extends d(G){id;name;version;description;enabled;author;dependencies;build},we=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},Te=class extends d(G){id;name;version;enabled;aliases;version_channel;version_available_channels},Ee=class extends d(G,X,Y){id;name;description},De=class extends d(G,X,Y){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{pe as AclEntity,G as BaseEntityMixin,b as BaseException,y as ConfigService,ne as ContainerService,me as CookieMapEntity,he as DriveConfigEntity,ge as DriveEntryEntity,re as EmmitterService,_e as FileEntity,ve as FileMetaEntity,ye as FileUploadSessionEntity,be as GitBranchEntity,$ as GitCommitEntity,xe as HeaderMapEntity,fe as HooksMixin,J as HooksStatic,S as LifecycleHook,ie as LifecycleService,x as LoggerService,Se as ModuleEntity,Ce as ModuleManifestEntity,we as PaginationEntity,Z as PermissionEntity,Te as PluginEntity,Ee as RoleEntity,ue as ShellException,Y as SoftDeleteMixin,Q as TYPES,X as TimestampMixin,ae as TranslatorService,oe as UploadService,De as UserEntity,N as ValidatorService,d as compose,f as composeWith,de as createBaseEntity,v as createId,z as dashboardMetaSchema,B as dashboardSchema,K as emitHook,h as flatten,m as formatBytes,le as matchPath,p as mixin,q as onHook,P as parseUrlParams,F as parseUrlQuery,V as permissionAssignmentSchema,H as permissionSchema,I as safeJsonParse,L as safeJsonStringify,U as tokenSchema,g as tryCatch,te as unflatten,W as userSchema,R as validator};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mb3JtYXRCeXRlcy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL2tleVZhbHVlVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL21hdGNoUGF0aHMudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3NhZmVKc29uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRNZXRhU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL2Rhc2hib2FyZFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3VzZXJTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvU2hlbGxFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRCcmFuY2hFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0dpdENvbW1pdEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvSGVhZGVyTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciwgZGVjaW1hbHMgPSAyKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnXG5cbiAgICBjb25zdCBrID0gMTAyNFxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJ11cblxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKVxuXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChwYXlsb2FkOiBFbnRyeUtleSk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlckxpc3RlbmVyT3B0aW9ucyB7XG4gICAgZXZlbnQ6IHN0cmluZ1xufVxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlckxpc3RlbmVyIHtcbiAgICAoZGF0YTogYW55LCBvcHRpb25zOiBFbW1pdHRlckxpc3RlbmVyT3B0aW9ucyk6IHZvaWRcbn1cblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogRW1taXR0ZXJMaXN0ZW5lclxuICAgIG9yaWdpbmFsTGlzdGVuZXI/OiBFbW1pdHRlckxpc3RlbmVyXG59XG5cbmludGVyZmFjZSBPbk9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgdW5pcXVlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgT25EZWJvdW5jZU9wdGlvbnMgZXh0ZW5kcyBPbk9wdGlvbnMge1xuICAgIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbW1pdHRlclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucz86IEVtbWl0dGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnM/LmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucz8ubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtbWl0dGVyIGxvYWRlZCB3aXRoIGRlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9ucz86IEVtbWl0dGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzPihvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2RlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IG9wdGlvbnM/LmlkIHx8IGNyZWF0ZUlkKClcblxuICAgICAgICBpZiAob3B0aW9ucz8udW5pcXVlKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmhhbmRsZXJzLnNvbWUoaCA9PiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHx8IGguaWQgPT09IGlkKVxuXG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyOiBFbW1pdHRlckhhbmRsZXIgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciBhZGRlZCcsIGhhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKGFyZ3M6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzLCBvcHRpb25zKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyIGFzIGFueSwgb3B0aW9ucylcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkRlYm91bmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShsaXN0ZW5lciwgb3B0aW9ucz8uZGVib3VuY2UgfHwgMzAwKVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBkZWJvdW5jZWQgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyLm9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb25BbnlPZjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudHM6IEtbXSwgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IHtcbiAgICAgICAgICAgIGlmIChoLmV2ZW50ID09PSBldmVudCAmJiAoaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIgfHwgaC5vcmlnaW5hbExpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgcmVtb3ZlZCcsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCcsIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgdHJ5Q2F0Y2guc3luYygoKSA9PiBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MsIHsgZXZlbnQgfSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCBhbmQgd2FpdCcsIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyczogaGFuZGxlcnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIubGlzdGVuZXIoYXJncywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdEJ5RXZlbnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKHBheWxvYWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gIWlkcy5pbmNsdWRlcyhoLmlkKSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXJzIHJlbW92ZWQnLCB7IGlkcyB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gW11cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FsbCBoYW5kbGVycyBjbGVhcmVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoID4gMFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcblxudHlwZSBMaWZlY3ljbGVNZXRob2QgPSAncmVnaXN0ZXInIHwgJ2xvYWQnIHwgJ2Jvb3QnIHwgJ3NodXRkb3duJ1xuXG5pbnRlcmZhY2UgTGlzdE9wdGlvbnMge1xuICAgIGluY2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBob29rcz86IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xpZmVjeWNsZVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaG9va3M6IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5ob29rcyA9IGRhdGEuaG9va3MgPz8gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEub25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gZGF0YS5vbkVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T25FcnJvcihoYW5kbGVyOiBSZXF1aXJlZDxMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucz5bJ29uRXJyb3InXSkge1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBoYW5kbGVyXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjb250ZXh0IH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGhvb2sgJHtjb250ZXh0Lm1ldGhvZH0gKCR7Y29udGV4dC5ob29rSWR9KTpgLCBlcnJvcilcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFwQWxpYXNlcyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhbGwpIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suaG9va19hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEFsaWFzID0gaG9vay5ob29rX2FsaWFzZXMuZmluZChhbGlhcyA9PiBhcmdzLmluY2x1ZGVzKGFsaWFzKSlcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChvcHRpb25zPzogTGlzdE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leGNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1ZGUpID8gb3B0aW9ucy5leGNsdWRlIDogW29wdGlvbnMuZXhjbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiAhaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlKSA/IG9wdGlvbnMuaW5jbHVkZSA6IFtvcHRpb25zLmluY2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcyA9IG9yZGVyQnkoaG9va3MsIFsnb3JkZXInXSwgWydhc2MnXSlcblxuICAgICAgICByZXR1cm4gaG9va3NcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKC4uLnBheWxvYWQ6IChMaWZlY3ljbGVIb29rIHwgQ29uc3RydWN0b3I8TGlmZWN5Y2xlSG9vaz4pW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMucHVzaChuZXcgaXRlbSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWhvb2suaG9va19pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1NraXBwaW5nIGhvb2sgd2l0aG91dCBob29rX2lkOicsIGhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ob29rcy5zZXQoaG9vay5ob29rX2lkLCBob29rKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGQgJyArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suc3ViaG9va3MpIHtcbiAgICAgICAgICAgICAgICBob29rLnN1Ymhvb2tzLmZvckVhY2goc3ViaG9vayA9PiB0aGlzLmFkZChzdWJob29rKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TWV0aG9kKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmxpc3Qob3B0aW9ucykgXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlbWl0dGluZyAke21ldGhvZH0gZm9yIGhvb2tzOmAsIHtcbiAgICAgICAgICAgICAgICBob29rczogaG9va3MubWFwKGhvb2sgPT4gaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiB0aGlzLmxpc3Qob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2sucmVnaXN0ZXIoKSwgaG9vay5vblJlZ2lzdGVyKCldKSxcbiAgICAgICAgICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5sb2FkKCksIGhvb2sub25Mb2FkKCldKSxcbiAgICAgICAgICAgICAgICBib290OiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5ib290KCksIGhvb2sub25Cb290KCldKSxcbiAgICAgICAgICAgICAgICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suc2h1dGRvd24oKSwgaG9vay5vblNodXRkb3duKCldKSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IG1hcFttZXRob2RdKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvciwgeyBob29rSWQ6IGhvb2suaG9va19pZCwgbWV0aG9kIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2R9IGAgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdChwYXlsb2FkOiBMaWZlY3ljbGVNZXRob2QgfCBMaWZlY3ljbGVNZXRob2RbXSwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE1ldGhvZChtZXRob2QsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb24obWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIGhhbmRsZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaCA9IG5ldyBMaWZlY3ljbGVIb29rKClcblxuICAgICAgICBoLmhvb2tfaWQgPSBgY3VzdG9tOiR7bWV0aG9kfToke0RhdGUubm93KCl9YFxuXG4gICAgICAgIGhbbWV0aG9kXSA9IGhhbmRsZXJcblxuICAgICAgICB0aGlzLmFkZChoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgncmVnaXN0ZXInLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdsb2FkJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnYm9vdCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NodXRkb3duJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG9va3MuY2xlYXIoKVxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1RyYW5zbGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgbG9jYWxlOiBzdHJpbmdcbiAgICBwdWJsaWMgbG9jYWxlTG9hZGVyczogTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFRyYW5zbGF0b3JTZXJ2aWNlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IGRhdGEuZW50cmllcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMubG9jYWxlID0gZGF0YS5sb2NhbGUgfHwgJ2VuJ1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmNhY2hlID0gZGF0YS5jYWNoZSB8fCBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2NhbGVMb2FkZXJzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubG9jYWxlTG9hZGVycy5rZXlzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgICAgICBjb25zdCBpdGVtczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cmllcyhsb2NhbGU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGxvY2FsZSkhXG5cbiAgICAgICAgaWYgKGNhY2hlICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkIGxvY2FsZSBcIiR7bG9jYWxlfVwiIGZyb20gY2FjaGVgLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogT2JqZWN0LmtleXMoY2FjaGUpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLmxvY2FsZUxvYWRlcnMuZ2V0KGxvY2FsZSlcblxuICAgICAgICBpZiAoIWxvYWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybihgbm8gbG9hZGVyIGZvdW5kIGZvciBsb2NhbGUgXCIke2xvY2FsZX1cImApXG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsb2FkZXIoKVxuXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGxvY2FsZSwgZW50cmllcylcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlICR7bG9jYWxlfWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAga2V5czogT2JqZWN0LmtleXMoZW50cmllcykubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChsb2NhbGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRFbnRyaWVzKGxvY2FsZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhlbnRyaWVzKSlcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIH1cblxuICAgIHB1YmxpYyB0KGtleTogc3RyaW5nLCBhcmdzOiBhbnkgPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBtaXNzaW5nIHRyYW5zbGF0aW9uIGZvciBrZXkgXCIke2tleX1cImAsIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpIHx8IGtleVxuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbiA9IGVudHJ5XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXJncykuZm9yRWFjaCgoW2FLZXksIGFWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb24ucmVwbGFjZShgOiR7YUtleX1gLCBTdHJpbmcoYVZhbHVlKSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25cbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0ZShkYXRhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGRhdGV0aW1lKGRhdGE6IHN0cmluZyB8IG51bWJlciB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1VwbG9hZFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc2luZ2xlKG5hbWU6IHN0cmluZyl7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgbXVsdGlwbGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmJvb2xlYW4oKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUodikpLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA/IGZvcm1hdCh2LCAneXl5eS1NTS1kZCcpIDogdiksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRldGltZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4ge1xuICAgICAgICBpZiAoIXYpIHJldHVybiB2XG5cbiAgICAgICAgaWYgKHYgPT09ICdudWxsJykgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gbmV3IERhdGUodilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQodiwgJ3l5eXktTU0tZGQgSEg6bW0nKVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4oc2NoZW1hOiBUID0gdi5hbnkoKSBhcyBhbnkgYXMgVCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYXJyYXkodi5zdHJpbmcoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoJywnKSksXG4gICAgdi5hcnJheShzY2hlbWEpLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXlOdW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgYXJyYXkoKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB2YWx1ZS5tYXAoTnVtYmVyKSksXG4pXG5cbmV4cG9ydCBjb25zdCBvYmplY3QgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcXMucGFyc2UodmFsdWUpIDogdmFsdWUpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBnZXQodmFsdWUsIGtleSkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSksXG4pXG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gICAgcmV0dXJuIG9iamVjdCgpXG59XG5cbnVybC5udW1iZXIgPSBudW1iZXJcbnVybC5ib29sZWFuID0gYm9vbGVhbiBcbnVybC5kYXRlID0gZGF0ZSBcbnVybC5kYXRldGltZSA9IGRhdGV0aW1lXG51cmwuYXJyYXkgPSBhcnJheVxudXJsLmFycmF5TnVtYmVyID0gYXJyYXlOdW1iZXJcbnVybC5vYmplY3QgPSBvYmplY3RcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCcgXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBjb25zdCBrZXlWYWx1ZSA9ICgpID0+IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuIiwiaW1wb3J0IHsgbnVtYmVyLCBhcnJheSB9IGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25QYXJhbXMge1xuICAgIG1heExpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJGaWVsZHM/OiBzdHJpbmdbXVxufVxuXG5cbmV4cG9ydCBjb25zdCBiYXNlID0gKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkgPT4gdi5vYmplY3Qoe1xuICAgIHBhZ2U6IHYub3B0aW9uYWwobnVtYmVyKCksIDEpLFxuICAgIGxpbWl0OiB2Lm9wdGlvbmFsKG51bWJlcigpLCBvcHRpb25zLm1heExpbWl0IHx8IDEwMCksXG4gICAgb3JkZXJCeTogdi5udWxsaXNoKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYubnVsbGlzaChhcnJheSh2LnVuaW9uKFt2LmxpdGVyYWwoJ2FzYycpLCB2LmxpdGVyYWwoJ2Rlc2MnKV0pKSwgW10pLFxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRpb24ob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGJhc2Uob3B0aW9ucylcbn1cblxucGFnaW5hdGlvbi5iYXNlID0gYmFzZVxuIiwiZXhwb3J0ICogZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5leHBvcnQgKiBmcm9tICcuL2tleVZhbHVlVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzJ1xuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0ICogYXMgZXh0cmFzIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfVxuXG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hID0gdi5CYXNlU2NoZW1hPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuZXhwb3J0IHR5cGUgVmFsaWJvdE9iamVjdFNjaGVtYSA9IHYuT2JqZWN0U2NoZW1hPGFueSwgYW55PlxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYUFzeW5jID0gdi5CYXNlU2NoZW1hQXN5bmM8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ2FsbGJhY2s8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4gPSB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JSZXN1bHQ8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4gPSB2LkluZmVyT3V0cHV0PFQ+XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUGF5bG9hZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+ID0gVmFsaWRhdG9yQ2FsbGJhY2s8VD4gfCBUXG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUmVzdWx0PFQgZXh0ZW5kcyBWYWxpZGF0ZVBheWxvYWQ+ID1cbiAgICBUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA/IHYuSW5mZXJPdXRwdXQ8VD4gOlxuICAgIFQgZXh0ZW5kcyBWYWxpZGF0b3JDYWxsYmFjazxpbmZlciBVPiA/IHYuSW5mZXJPdXRwdXQ8VT4gOlxuICAgIHVua25vd25cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdWYWxpZGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHY6IFZhbGlib3QgPSB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGV4dHJhcyxcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihjYjogVmFsaWRhdG9yQ2FsbGJhY2s8VD4pIHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudilcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPikge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ucm9vdCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4uZmxhdHRlbi5yb290KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5uZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuLm5lc3RlZCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkgYXMgW3N0cmluZywgc3RyaW5nW11dXG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi52YWx1ZS5tYXAoKHYpID0+IGAke2tleX06ICR7dn1gKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMubGVuZ3RoID8gbWVzc2FnZXMuam9pbignLCAnKSA6ICdWYWxpZGF0aW9uIGZhaWxlZCdcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCA0MjIpXG5cbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJ1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG1lc3NhZ2VzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUFzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VD4gfCBUKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IGF3YWl0IHYuc2FmZVBhcnNlQXN5bmMoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLnJvb3QsXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5uZXN0ZWQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZGV0YWlscywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJleHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gU3BsaXQgcGF0aHMgaW50byBzZWdtZW50c1xuICAgIGNvbnN0IHBhdHRlcm5TZWdtZW50cyA9IHBhdHRlcm4uc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAvLyBDaGVjayBlYWNoIHNlZ21lbnRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5TZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSBwYXR0ZXJuU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSBwYXRoU2VnbWVudHNbaV1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgd2lsZGNhcmQgKCopLCBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlJ3ZlIHJ1biBvdXQgb2YgcmVxdWVzdCBzZWdtZW50cyBidXQgc3RpbGwgaGF2ZSByb3V0ZSBzZWdtZW50cywgbm8gbWF0Y2hcbiAgICAgICAgaWYgKGkgPj0gcGF0aFNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgcGFyYW1ldGVyIChzdGFydHMgd2l0aCA6KSwgaXQgbWF0Y2hlcyBhbnkgdmFsdWVcbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHNlZ21lbnRzIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICBpZiAocm91dGVTZWdtZW50ICE9PSByZXF1ZXN0U2VnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgcmVxdWVzdCBzZWdtZW50cyB0aGFuIHJvdXRlIHNlZ21lbnRzIChhbmQgbm8gd2lsZGNhcmQpLCBubyBtYXRjaFxuICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID4gcGF0dGVyblNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxufVxuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2FmZUpzb25QYXJzZTxUPihqc29uU3RyaW5nOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZykgYXMgVDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVKc29uU3RyaW5naWZ5PFQ+KHZhbHVlOiBUKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RyaW5naWZ5IEpTT046JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgVmFsaWRhdG9yU2VydmljZSBmcm9tIFwiLi4vc2VydmljZXMvVmFsaWRhdG9yU2VydmljZVwiXG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRvclxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cblxuZXhwb3J0IHR5cGUgRGFzaGJvYXJkTWV0YVNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRNZXRhU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZE1ldGFTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGUodiA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBkYXNoYm9hcmRfaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkTWV0YVNjaGVtYSgpLCBbJ2Rhc2hib2FyZF9pZCcsICduYW1lJywgJ3ZhbHVlJ10pKVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUpKVxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZFNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRTY2hlbWE+PlxuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGJvYXJkU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG5cbiAgICAgICAgbWV0YXM6IHYub3B0aW9uYWwodi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRTY2hlbWEuY3JlYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGljayhkYXNoYm9hcmRTY2hlbWEoKSwgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10pKVxuXG5kYXNoYm9hcmRTY2hlbWEudXBkYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGFydGlhbChkYXNoYm9hcmRTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIHBlcm1pc3Npb25faWQ6IHYubnVtYmVyKCksXG4gICAgYXNzaWduYWJsZV90eXBlOiB2LnN0cmluZygpLFxuICAgIGFzc2lnbmFibGVfaWQ6IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgYWN0aW9uOiB2LnN0cmluZygpLFxuICAgIHN1YmplY3Q6IHYuc3RyaW5nKCksXG4gICAgY29uZGl0aW9uczogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFRva2VuID0gdi5JbmZlck91dHB1dDx0eXBlb2YgdG9rZW5TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCB0b2tlblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIHR5cGU6IHYuc3RyaW5nKCksXG4gICAgdXNlcl9pZDogdi5udW1iZXIoKSxcbiAgICB0b2tlbjogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmZ1bmN0aW9uIHVzZXJTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgICAgIGVtYWlsOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5lbWFpbCgpKSxcbiAgICAgICAgcGFzc3dvcmQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCg2KSksXG4gICAgICAgIHVzZXJuYW1lOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5yZWdleCgvXlthLXpBLVowLTlfLV0rJC8pKSxcbiAgICAgICAgdmVyaWZpZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSlcbiAgICB9KVxufVxuXG51c2VyU2NoZW1hLmNyZWF0ZSA9ICgpID0+IHYub21pdCh1c2VyU2NoZW1hKCksIFsnaWQnLCAndmVyaWZpZWRfYXQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2RlbGV0ZWRfYXQnXSlcbnVzZXJTY2hlbWEudXBkYXRlID0gKCkgPT4gdi5wYXJ0aWFsKHVzZXJTY2hlbWEuY3JlYXRlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IHVzZXJTY2hlbWFcbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4vQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgICBwdWJsaWMgb3V0cHV0OiBzdHJpbmdcbiAgICBwdWJsaWMgYmluOiBzdHJpbmcgXG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCBiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgNTAxKVxuXG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICAgIHRoaXMuYmluID0gYmluIFxuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lciB7XG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtaXRIb29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7ICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGNvbnN0cnVjdG9yLmxpc3RlbmVycyB8fCBbXVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycy5maWx0ZXIoKGw6IGFueSkgPT4gbC5ldmVudCA9PT0gZXZlbnQpKSB7XG4gICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IGNvbnN0cnVjdG9yLmxpc3RlbmVycyB8fCBbXVxuXG4gICAgY29uc3QgZXhpc3RzID0gbGlzdGVuZXJzLmZpbmQoKGw6IGFueSkgPT4gbC5ldmVudCA9PT0gZXZlbnQgJiYgbC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpXG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxpc3RlbmVycy5wdXNoKHsgXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsaXN0ZW5lciBcbiAgICB9KVxuXG4gICAgY29uc3RydWN0b3IubGlzdGVuZXJzID0gbGlzdGVuZXJzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIb29rc1N0YXRpYzxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5ib290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5ib290LmFwcGx5KHRoaXMuY29uc3RydWN0b3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGxpc3RlbmVycyA9IFtdIGFzIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD5cblxuICAgICAgICBwdWJsaWMgc3RhdGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvbkhvb2sodGhpcywgZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdEhvb2sodGhpcywgZXZlbnQsIC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEhvb2tzPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBsaXN0ZW5lcnM6IExpc3RlbmVyW11cblxuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHsgXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIgXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmZpbmRJbmRleCgobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQgJiYgbC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpXG5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGwgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBwdWJsaWMgYXN5bmMgZW1pdEFzeW5jKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5Ib29rc1N0YXRpYy5lbWl0ID0gZW1pdEhvb2tcbkhvb2tzU3RhdGljLm9uID0gb25Ib29rXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTb2Z0RGVsZXRlTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUaW1lc3RhbXBNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICAgICAgcHVibGljIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBvcmlnaW46IHN0cmluZ1xuICAgIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmdcbiAgICBwdWJsaWMgYWN0aW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZGl0aW9uczogc3RyaW5nIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIGFueT4gPSBudWxsXG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gPT09ICdjdXN0b20nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJzZWRDb25kaXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZGl0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmNvbmRpdGlvbnMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZXJyb3IgPyB7fSA6IGpzb25cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVBYmlsaXR5LCBzdWJqZWN0IGFzIGNyZWF0ZVN1YmplY3QgfSBmcm9tICdAY2FzbC9hYmlsaXR5J1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2xFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0FjbEVudGl0eSdcblxuICAgIHB1YmxpYyBhYmlsaXR5OiBSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVBYmlsaXR5PlxuICAgIHB1YmxpYyBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPEFjbEVudGl0eT4gPSB7fSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGRhdGEucGVybWlzc2lvbnMgfHwgW11cbiAgICAgICAgY29uc3QgcGVybXMgPSBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IFBlcm1pc3Npb24uZnJvbShwZXJtaXNzaW9uKSlcblxuICAgICAgICBcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1zXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKS5jaGlsZCh7IGxhYmVsOiAnYWNsJyB9KVxuICAgICAgICBcbiAgICAgICAgdGhpcy5hYmlsaXR5ID0gZGVmaW5lQWJpbGl0eSgoY2FuKSA9PiB7XG4gICAgICAgICAgICBwZXJtcy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuKHBlcm1pc3Npb24uYWN0aW9uLCBwZXJtaXNzaW9uLnN1YmplY3QsIHBlcm1pc3Npb24ucGFyc2VkQ29uZGl0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW4oYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuXG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIHN1YmplY3Qoc3ViamVjdDogc3RyaW5nLCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgY29va2llcz86IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwcmVmaXg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb29raWVNYXBFbnRpdHknXG5cbiAgICBwdWJsaWMgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBwcmVmaXg6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IENvb2tpZU1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZGF0YT8uY29va2llcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMucHJlZml4ID0gZGF0YT8ucHJlZml4IHx8ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IE1hcDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgaWYgKGNvb2tpZXMgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KGZ1bGxOYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Ugd2FudCB0byBhbGxvdyBhbnkgb3B0aW9ucyB0byBiZSBwYXNzZWQgaGVyZSwgYXMgdGhleSBtYXkgYmUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBjb29raWVcbiAgICAvLyAgZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgdGhpcy5jb29raWVzLnNldChmdWxsTmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh0aGlzLnByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnByZWZpeGVkS2V5ID0ga2V5LnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcblxuICAgICAgICAgICAgICAgIHJlc3VsdFt1bnByZWZpeGVkS2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IFRZUEVTID0gKCkgPT4gW1xuICAgIHtcbiAgICAgICAgaWQ6ICdmcycsXG4gICAgICAgIGxhYmVsOiAkdCgnRmlsZSBTeXN0ZW0nKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICR0KCdTdG9yZSBmaWxlcyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uJyksXG4gICAgICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnRGlyZWN0b3J5JyksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICR0KCdUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgZmlsZXMgd2lsbCBiZSBzdG9yZWQuJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1JlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiByb290IG9yIGFic29sdXRlIHBhdGgsIGUuZy4sIDowICBvciA6MScsIFsnL3Zhci96ZW5pdGgvdXBsb2FkcycsICdzdG9yYWdlL3VwbG9hZHMnXSksXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6ICdzMycsXG4gICAgICAgIGxhYmVsOiAnUzMnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1N0b3JlIGZpbGVzIG9uIGFuIFMzLWNvbXBhdGlibGUgc2VydmljZSBsaWtlIEFXUyBTMywgRGlnaXRhbE9jZWFuIFNwYWNlcywgZXRjLicpLFxuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnQWNjZXNzIEtleSBJRCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdZb3VyIEFXUyBhY2Nlc3Mga2V5IElELicpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdTZWNyZXQgQWNjZXNzIEtleScpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdZb3VyIEFXUyBzZWNyZXQgYWNjZXNzIGtleS4nKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1Y2tldDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnQnVja2V0IE5hbWUnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnVGhlIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCB0byBzdG9yZSBmaWxlcyBpbi4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWdpb246IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1JlZ2lvbicpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdUaGUgQVdTIHJlZ2lvbiB3aGVyZSB5b3VyIGJ1Y2tldCBpcyBsb2NhdGVkLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnUHJlZml4JyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ0FuIG9wdGlvbmFsIHByZWZpeCAoZm9sZGVyIHBhdGgpIHRvIHN0b3JlIGZpbGVzIHVuZGVyIGluIHRoZSBidWNrZXQuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0VuZHBvaW50IFVSTCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdPcHRpb25hbCBjdXN0b20gZW5kcG9pbnQgVVJMIGZvciBTMy1jb21wYXRpYmxlIHNlcnZpY2VzLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH1cbl1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQ29uZmlnIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBUWVBFUygpIHtcbiAgICAgICAgcmV0dXJuIFRZUEVTKClcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBpc19kZWZhdWx0OiBib29sZWFuXG4gICAgcHVibGljIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVDb25maWcpe1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb25maWdfZmllbGRzKCkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBEcml2ZUNvbmZpZy5UWVBFUy5maW5kKG9wdCA9PiBvcHQuaWQgPT09IHRoaXMudHlwZSlcblxuICAgICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmNvbmZpZ19maWVsZHMgOiB7fVxuICAgIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUVudHJ5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhdGg6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5J1xuICAgIHB1YmxpYyBtZXRhczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUVudHJ5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBkcml2ZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWV0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIGNsaWVudF9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdWJsaWM6IGJvb2xlYW5cblxuICAgIC8vIGR5bmFtaWNcbiAgICBwdWJsaWMgdXJsPzogc3RyaW5nXG4gICAgcHVibGljIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGlzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWV0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVNZXRhIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGZpbGVfaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyB8IG51bGxcbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXNzaW9uIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZV90eXBlczogc3RyaW5nXG4gICAgcHVibGljIG1heF9zaXplOiBudW1iZXJcblxuICAgIC8vIGR5bmFtaWMgXG4gICAgcHVibGljIHVwbG9hZF91cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgY3JlYXRlX2ZpbGVfdXJsPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgZ2V0UGFyc2VkTWltZVR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZV90eXBlcy5zcGxpdCgnLCcpLm1hcCh0eXBlID0+IHR5cGUudHJpbSgpKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuZ2V0UGFyc2VkTWltZVR5cGVzKClcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyhtaW1lVHlwZSkgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKCcqLyonKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRTaXplKHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc2l6ZSA8PSB0aGlzLm1heF9zaXplXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0QnJhbmNoRW50aXR5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHJlbW90ZTogc3RyaW5nIHwgbnVsbFxuICAgIHB1YmxpYyBpc19jdXJyZW50OiBib29sZWFuXG4gICAgcHVibGljIGlzX3JlbW90ZTogYm9vbGVhblxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogR2l0QnJhbmNoRW50aXR5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRDb21taXRFbnRpdHkge1xuICAgIHB1YmxpYyBoYXNoOiBzdHJpbmdcbiAgICBwdWJsaWMgc2hvcnRfaGFzaDogc3RyaW5nXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZ1xuICAgIHB1YmxpYyBib2R5OiBzdHJpbmdcbiAgICBwdWJsaWMgYXV0aG9yX25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBhdXRob3JfZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBkYXRlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEdpdENvbW1pdEVudGl0eSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHNldEhlYWRlcj86IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGVhZGVyTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdIZWFkZXJNYXBFbnRpdHknXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgc2V0SGVhZGVyPzogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IEhlYWRlck1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnNldEhlYWRlciA9IGRhdGE/LnNldEhlYWRlclxuXG4gICAgICAgIGlmIChkYXRhPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGcm9tUmVjb3JkKGRhdGEuaGVhZGVycylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KG5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXRIZWFkZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdzZXRIZWFkZXIgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChuYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmVudHJpZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydCB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG8/OiBzdHJpbmdcbiAgICB0eXBlOiAnZ2xvYmFsX2ltcG9ydCdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZCB7XG4gICAgaW1wb3J0cz86IE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnRbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGVNYW5pZmVzdCBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhdXRob3I/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBidWlsZD86IE1vZHVsZU1hbmlmZXN0QnVpbGRcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2luYXRpb25FbnRpdHk8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgaXRlbXM6IFRbXVxuICAgIHB1YmxpYyB0b3RhbDogbnVtYmVyXG4gICAgcHVibGljIHBhZ2U6IG51bWJlclxuICAgIHB1YmxpYyBwZXJfcGFnZTogbnVtYmVyXG4gICAgcHVibGljIHRvdGFsX3BhZ2VzOiBudW1iZXJcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8UGFnaW5hdGlvbkVudGl0eT4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPiA+KHBheWxvYWQ6IFBhcnRpYWw8UGFnaW5hdGlvbkVudGl0eTxUPj4pOiBQYWdpbmF0aW9uRW50aXR5PFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmF0aW9uRW50aXR5KHBheWxvYWQgYXMgYW55KVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxuICAgIHB1YmxpYyB2ZXJzaW9uX2NoYW5uZWw6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uX2F2YWlsYWJsZV9jaGFubmVsczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2Uo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