@sidekick-coder/zenith-kit 0.1.0 → 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 +698 -52
  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 +54764 -53506
  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 +438 -188
  393. package/dist/server/index.mjs +4 -4
  394. package/dist/shared/index.d.mts +495 -31
  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 +39 -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 -31
  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 and wait`,{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{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},me=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},Q=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}},$=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},he=class extends d(U,p($)){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}`}},ge=class extends d(U){id;name;version;description;enabled;author;dependencies;build},_e=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},ve=class extends d(U){id;name;version;enabled;aliases;version_channel;version_available_channels},ye=class extends d(U,Y,J){id;name;description},be=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 GitBranchEntity,me as GitCommitEntity,Q as HeaderMapEntity,q as HooksMixin,K as HooksStatic,$ as LifecycleHook,ne as LifecycleService,S as LoggerService,he as ModuleEntity,ge as ModuleManifestEntity,_e as PaginationEntity,X as PermissionEntity,ve as PluginEntity,ye as RoleEntity,B as ShellException,J as SoftDeleteMixin,Z as TYPES,Y as TimestampMixin,re as TranslatorService,ie as UploadService,be 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mb3JtYXRCeXRlcy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRCcmFuY2hFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0dpdENvbW1pdEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvSGVhZGVyTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciwgZGVjaW1hbHMgPSAyKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnXG5cbiAgICBjb25zdCBrID0gMTAyNFxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJ11cblxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKVxuXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHByaXZhdGUgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwcml2YXRlIGRlYnVnOiBib29sZWFuXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyLCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCBhbmQgd2FpdCcsIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyczogaGFuZGxlcnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIubGlzdGVuZXIoYXJncylcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RCeUV2ZW50KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShwYXlsb2FkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+ICFpZHMuaW5jbHVkZXMoaC5pZCkpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVycyByZW1vdmVkJywgeyBpZHMgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IFtdXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhbGwgaGFuZGxlcnMgY2xlYXJlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDBcbiAgICB9XG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcblxudHlwZSBMaWZlY3ljbGVNZXRob2QgPSAncmVnaXN0ZXInIHwgJ2xvYWQnIHwgJ2Jvb3QnIHwgJ3NodXRkb3duJ1xuXG5pbnRlcmZhY2UgTGlzdE9wdGlvbnMge1xuICAgIGluY2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBob29rcz86IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xpZmVjeWNsZVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaG9va3M6IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5ob29rcyA9IGRhdGEuaG9va3MgPz8gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEub25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gZGF0YS5vbkVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjb250ZXh0IH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGhvb2sgJHtjb250ZXh0Lm1ldGhvZH0gKCR7Y29udGV4dC5ob29rSWR9KTpgLCBlcnJvcilcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFwQWxpYXNlcyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhbGwpIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suaG9va19hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEFsaWFzID0gaG9vay5ob29rX2FsaWFzZXMuZmluZChhbGlhcyA9PiBhcmdzLmluY2x1ZGVzKGFsaWFzKSlcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChvcHRpb25zPzogTGlzdE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leGNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1ZGUpID8gb3B0aW9ucy5leGNsdWRlIDogW29wdGlvbnMuZXhjbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiAhaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlKSA/IG9wdGlvbnMuaW5jbHVkZSA6IFtvcHRpb25zLmluY2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcyA9IG9yZGVyQnkoaG9va3MsIFsnb3JkZXInXSwgWydhc2MnXSlcblxuICAgICAgICByZXR1cm4gaG9va3NcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKC4uLnBheWxvYWQ6IChMaWZlY3ljbGVIb29rIHwgQ29uc3RydWN0b3I8TGlmZWN5Y2xlSG9vaz4pW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMucHVzaChuZXcgaXRlbSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWhvb2suaG9va19pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1NraXBwaW5nIGhvb2sgd2l0aG91dCBob29rX2lkOicsIGhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ob29rcy5zZXQoaG9vay5ob29rX2lkLCBob29rKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGQgJyArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suc3ViaG9va3MpIHtcbiAgICAgICAgICAgICAgICBob29rLnN1Ymhvb2tzLmZvckVhY2goc3ViaG9vayA9PiB0aGlzLmFkZChzdWJob29rKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TWV0aG9kKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmxpc3Qob3B0aW9ucykgXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlbWl0dGluZyAke21ldGhvZH0gZm9yIGhvb2tzOmAsIHtcbiAgICAgICAgICAgICAgICBob29rczogaG9va3MubWFwKGhvb2sgPT4gaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiB0aGlzLmxpc3Qob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2sucmVnaXN0ZXIoKSwgaG9vay5vblJlZ2lzdGVyKCldKSxcbiAgICAgICAgICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5sb2FkKCksIGhvb2sub25Mb2FkKCldKSxcbiAgICAgICAgICAgICAgICBib290OiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5ib290KCksIGhvb2sub25Cb290KCldKSxcbiAgICAgICAgICAgICAgICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suc2h1dGRvd24oKSwgaG9vay5vblNodXRkb3duKCldKSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IG1hcFttZXRob2RdKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvciwgeyBob29rSWQ6IGhvb2suaG9va19pZCwgbWV0aG9kIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2R9IGAgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdChwYXlsb2FkOiBMaWZlY3ljbGVNZXRob2QgfCBMaWZlY3ljbGVNZXRob2RbXSwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE1ldGhvZChtZXRob2QsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zbGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdUcmFuc2xhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIGxvY2FsZTogc3RyaW5nXG4gICAgcHVibGljIGxvY2FsZUxvYWRlcnM6IE1hcDxzdHJpbmcsICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+XG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGNhY2hlOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxUcmFuc2xhdG9yU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBkYXRhLmVudHJpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLmxvY2FsZSA9IGRhdGEubG9jYWxlIHx8ICdlbidcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5jYWNoZSA9IGRhdGEuY2FjaGUgfHwgbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIHRoaXMubG9jYWxlTG9hZGVycyA9IG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PigpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmxvY2FsZUxvYWRlcnMua2V5cygpKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICAgICAgY29uc3QgaXRlbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW11cblxuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuXG4gICAgcHVibGljIGFzeW5jIGdldEVudHJpZXMobG9jYWxlOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlLmdldChsb2NhbGUpIVxuXG4gICAgICAgIGlmIChjYWNoZSAmJiB0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbG9hZCBsb2NhbGUgXCIke2xvY2FsZX1cIiBmcm9tIGNhY2hlYCwge1xuICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IE9iamVjdC5rZXlzKGNhY2hlKS5sZW5ndGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9hZGVyID0gdGhpcy5sb2NhbGVMb2FkZXJzLmdldChsb2NhbGUpXG5cbiAgICAgICAgaWYgKCFsb2FkZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYG5vIGxvYWRlciBmb3VuZCBmb3IgbG9jYWxlIFwiJHtsb2NhbGV9XCJgKVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgbG9hZGVyKClcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChsb2NhbGUsIGVudHJpZXMpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkIGxvY2FsZSAke2xvY2FsZX1gLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIGtleXM6IE9iamVjdC5rZXlzKGVudHJpZXMpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQobG9jYWxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZ2V0RW50cmllcyhsb2NhbGUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oT2JqZWN0LmVudHJpZXMoZW50cmllcykpXG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVcbiAgICB9XG5cbiAgICBwdWJsaWMgdChrZXk6IHN0cmluZywgYXJnczogYW55ID0ge30pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSAmJiB0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbWlzc2luZyB0cmFuc2xhdGlvbiBmb3Iga2V5IFwiJHtrZXl9XCJgLCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KSB8fCBrZXlcblxuICAgICAgICBsZXQgdHJhbnNsYXRpb24gPSBlbnRyeVxuXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoYXJncykubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGFyZ3MpLmZvckVhY2goKFthS2V5LCBhVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UoYDoke2FLZXl9YCwgYVZhbHVlKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgIH1cblxuICAgIHB1YmxpYyBkYXRlKGRhdGE6IHN0cmluZyB8IG51bWJlciB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCdcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0ZXRpbWUoZGF0YTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0YSlcblxuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVXBsb2FkU2VydmljZSdcblxuICAgIHB1YmxpYyBzaW5nbGUobmFtZTogc3RyaW5nKXtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBtdWx0aXBsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cbiIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJ1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5cbmV4cG9ydCBjb25zdCBudW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5udW1iZXIoKV0pLFxuICAgIHYudHJhbnNmb3JtKE51bWJlciksXG4gICAgdi5pbnRlZ2VyKCksXG4pXG5cbmV4cG9ydCBjb25zdCBib29sZWFuID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYm9vbGVhbigpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRlID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuZGF0ZSgpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2IGluc3RhbmNlb2YgRGF0ZSA/IHYgOiBuZXcgRGF0ZSh2KSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2ID8gZm9ybWF0KHYsICd5eXl5LU1NLWRkJykgOiB2KSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGV0aW1lID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuZGF0ZSgpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB7XG4gICAgICAgIGlmICghdikgcmV0dXJuIHZcblxuICAgICAgICBpZiAodiA9PT0gJ251bGwnKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHYgPSBuZXcgRGF0ZSh2KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2LCAneXl5eS1NTS1kZCBISDptbScpXG4gICAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCBhcnJheSA9IDxUIGV4dGVuZHMgdi5CYXNlU2NoZW1hPGFueSwgYW55LCBhbnk+PihzY2hlbWE6IFQgPSB2LmFueSgpIGFzIGFueSBhcyBUKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5hcnJheSh2LnN0cmluZygpKV0pLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS5zcGxpdCgnLCcpKSxcbiAgICB2LmFycmF5KHNjaGVtYSksXG4pXG5cbmV4cG9ydCBjb25zdCBhcnJheU51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICBhcnJheSgpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHZhbHVlLm1hcChOdW1iZXIpKSxcbilcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LnJlY29yZCh2LnN0cmluZygpLCB2LmFueSgpKV0pLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBxcy5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBzZXQocmVzdWx0LCBrZXksIGdldCh2YWx1ZSwga2V5KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9KSxcbilcblxuIiwiaW1wb3J0IHsgbnVtYmVyLCBhcnJheSB9IGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25QYXJhbXMge1xuICAgIG1heExpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJGaWVsZHM/OiBzdHJpbmdbXVxufVxuXG5cbmV4cG9ydCBjb25zdCBiYXNlID0gKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkgPT4gdi5vYmplY3Qoe1xuICAgIHBhZ2U6IHYub3B0aW9uYWwobnVtYmVyKCksIDEpLFxuICAgIGxpbWl0OiB2Lm9wdGlvbmFsKG51bWJlcigpLCBvcHRpb25zLm1heExpbWl0IHx8IDEwMCksXG4gICAgb3JkZXJCeTogdi5vcHRpb25hbChvcHRpb25zLm9yZGVyRmllbGRzID8gYXJyYXkodi5waWNrbGlzdChvcHRpb25zLm9yZGVyRmllbGRzKSkgOiBhcnJheSh2LnN0cmluZygpKSwgW10pLFxuICAgIG9yZGVyRGlyZWN0aW9uOiB2Lm9wdGlvbmFsKGFycmF5KHYudW5pb24oW3YubGl0ZXJhbCgnYXNjJyksIHYubGl0ZXJhbCgnZGVzYycpXSkpLCBbXSksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyBwYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5jb25zdCBleHRyYXMgPSB7XG4gICAgdXJsLFxuICAgIHBhZ2luYXRpb24sXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlib3QgPSB0eXBlb2YgdiAmIHsgZXh0cmFzOiB0eXBlb2YgZXh0cmFzIH0gXG5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWEgPSB2LkJhc2VTY2hlbWE8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hQXN5bmMgPSB2LkJhc2VTY2hlbWFBc3luYzx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JDYWxsYmFjazxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yQ2FsbGJhY2tBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPiA9IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvclJlc3VsdDxUIGV4dGVuZHMgdi5PYmplY3RFbnRyaWVzPiA9IHYuSW5mZXJPdXRwdXQ8di5PYmplY3RTY2hlbWE8VCwgdW5kZWZpbmVkPj5cblxuZXhwb3J0IHR5cGUgVmFsaWRhdGVQYXlsb2FkPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID0gVmFsaWJvdFNjaGVtYT4gPSBWYWxpZGF0b3JDYWxsYmFjazxUPiB8IFRcblxuZXhwb3J0IHR5cGUgVmFsaWRhdGVSZXN1bHQ8VCBleHRlbmRzIFZhbGlkYXRlUGF5bG9hZD4gPVxuICAgIFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID8gdi5JbmZlck91dHB1dDxUPiA6XG4gICAgVCBleHRlbmRzIFZhbGlkYXRvckNhbGxiYWNrPGluZmVyIFU+ID8gdi5JbmZlck91dHB1dDxVPiA6XG4gICAgdW5rbm93blxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1ZhbGlkYXRvclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgdjogVmFsaWJvdCA9IHtcbiAgICAgICAgLi4udixcbiAgICAgICAgZXh0cmFzLFxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KGNiOiBWYWxpZGF0b3JDYWxsYmFjazxUPikge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52KVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBbXSBhcyBzdHJpbmdbXVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5yb290KSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi5mbGF0dGVuLnJvb3QpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLm5lc3RlZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4ubmVzdGVkKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeSBhcyBbc3RyaW5nLCBzdHJpbmdbXV1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLnZhbHVlLm1hcCgodikgPT4gYCR7a2V5fTogJHt2fWApKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5sZW5ndGggPyBtZXNzYWdlcy5qb2luKCcsICcpIDogJ1ZhbGlkYXRpb24gZmFpbGVkJ1xuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKG1lc3NhZ2UsIDQyMilcblxuICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InXG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbWVzc2FnZXMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdG9yQ2FsbGJhY2tBc3luYzxUPiB8IFQpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gYXdhaXQgdi5zYWZlUGFyc2VBc3luYyhzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ucm9vdCxcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLm5lc3RlZCxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBkZXRhaWxzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhbGlkPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NcbiAgICB9XG59XG5cbiIsImltcG9ydCBxcyBmcm9tICdxcycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFBhcmFtcyhyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcmVxdWVzdFNlZ21lbnRzW2ldXG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcmVxdWVzdFNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbGwgcmVtYWluaW5nIHNlZ21lbnRzIGFzIGEgc2luZ2xlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMV1cblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxufVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uQXNzaWdubWVudCA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgcGVybWlzc2lvbl9pZDogdi5udW1iZXIoKSxcbiAgICBhc3NpZ25hYmxlX3R5cGU6IHYuc3RyaW5nKCksXG4gICAgYXNzaWduYWJsZV9pZDogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBkZXNjcmlwdGlvbjogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBhY3Rpb246IHYuc3RyaW5nKCksXG4gICAgc3ViamVjdDogdi5zdHJpbmcoKSxcbiAgICBjb25kaXRpb25zOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgVG9rZW4gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiB0b2tlblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHRva2VuU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgdHlwZTogdi5zdHJpbmcoKSxcbiAgICB1c2VyX2lkOiB2Lm51bWJlcigpLFxuICAgIHRva2VuOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4vQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgICBwdWJsaWMgb3V0cHV0OiBzdHJpbmdcbiAgICBwdWJsaWMgYmluOiBzdHJpbmcgXG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCBiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgNTAxKVxuXG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICAgIHRoaXMuYmluID0gYmluIFxuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIFxuICAgIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JTZXJ2aWNlIGZyb20gXCIuLi9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlXCJcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU29mdERlbGV0ZU1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGltZXN0YW1wTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgICAgIHB1YmxpYyB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBUWVBFUyA9ICgpID0+IFtcbiAgICB7XG4gICAgICAgIGlkOiAnZnMnLFxuICAgICAgICBsYWJlbDogJHQoJ0ZpbGUgU3lzdGVtJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnU3RvcmUgZmlsZXMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLicpLFxuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0RpcmVjdG9yeScpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIGZpbGVzIHdpbGwgYmUgc3RvcmVkLicpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdSZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gcm9vdCBvciBhYnNvbHV0ZSBwYXRoLCBlLmcuLCA6MCAgb3IgOjEnLCBbJy92YXIvemVuaXRoL3VwbG9hZHMnLCAnc3RvcmFnZS91cGxvYWRzJ10pLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiAnczMnLFxuICAgICAgICBsYWJlbDogJ1MzJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICR0KCdTdG9yZSBmaWxlcyBvbiBhbiBTMy1jb21wYXRpYmxlIHNlcnZpY2UgbGlrZSBBV1MgUzMsIERpZ2l0YWxPY2VhbiBTcGFjZXMsIGV0Yy4nKSxcbiAgICAgICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0FjY2VzcyBLZXkgSUQnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1MgYWNjZXNzIGtleSBJRC4nKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnU2VjcmV0IEFjY2VzcyBLZXknKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1Mgc2VjcmV0IGFjY2VzcyBrZXkuJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0J1Y2tldCBOYW1lJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1RoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgdG8gc3RvcmUgZmlsZXMgaW4uJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnaW9uOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdSZWdpb24nKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnVGhlIEFXUyByZWdpb24gd2hlcmUgeW91ciBidWNrZXQgaXMgbG9jYXRlZC4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1ByZWZpeCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdBbiBvcHRpb25hbCBwcmVmaXggKGZvbGRlciBwYXRoKSB0byBzdG9yZSBmaWxlcyB1bmRlciBpbiB0aGUgYnVja2V0LicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdFbmRwb2ludCBVUkwnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnT3B0aW9uYWwgY3VzdG9tIGVuZHBvaW50IFVSTCBmb3IgUzMtY29tcGF0aWJsZSBzZXJ2aWNlcy4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9XG5dXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUNvbmZpZyB7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgVFlQRVMoKSB7XG4gICAgICAgIHJldHVybiBUWVBFUygpXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgaXNfZGVmYXVsdDogYm9vbGVhblxuICAgIHB1YmxpYyBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlQ29uZmlnKXtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnX2ZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gRHJpdmVDb25maWcuVFlQRVMuZmluZChvcHQgPT4gb3B0LmlkID09PSB0aGlzLnR5cGUpXG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5jb25maWdfZmllbGRzIDoge31cbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVFbnRyeSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmdcbiAgICBwdWJsaWMgdHlwZTogJ2ZpbGUnIHwgJ2RpcmVjdG9yeSdcbiAgICBwdWJsaWMgbWV0YXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVFbnRyeSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZHJpdmU6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1ldHlwZTogc3RyaW5nXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBjbGllbnRfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVibGljOiBib29sZWFuXG5cbiAgICAvLyBkeW5hbWljXG4gICAgcHVibGljIHVybD86IHN0cmluZ1xuICAgIHB1YmxpYyBtZXRhcz86IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBmaWxlX2lkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgfCBudWxsXG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpdEJyYW5jaEVudGl0eSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyByZW1vdGU6IHN0cmluZyB8IG51bGxcbiAgICBwdWJsaWMgaXNfY3VycmVudDogYm9vbGVhblxuICAgIHB1YmxpYyBpc19yZW1vdGU6IGJvb2xlYW5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEdpdEJyYW5jaEVudGl0eSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0Q29tbWl0RW50aXR5IHtcbiAgICBwdWJsaWMgaGFzaDogc3RyaW5nXG4gICAgcHVibGljIHNob3J0X2hhc2g6IHN0cmluZ1xuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmdcbiAgICBwdWJsaWMgYm9keTogc3RyaW5nXG4gICAgcHVibGljIGF1dGhvcl9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgYXV0aG9yX2VtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgZGF0ZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBHaXRDb21taXRFbnRpdHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBzZXRIZWFkZXI/OiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlYWRlck1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnSGVhZGVyTWFwRW50aXR5J1xuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHNldEhlYWRlcj86IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5zZXRIZWFkZXIgPSBkYXRhPy5zZXRIZWFkZXJcblxuICAgICAgICBpZiAoZGF0YT8uaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5sb2FkRnJvbVJlY29yZChkYXRhLmhlYWRlcnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChuYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuc2V0SGVhZGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignc2V0SGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQobmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIGl0ZW1zOiBUW11cbiAgICBwdWJsaWMgdG90YWw6IG51bWJlclxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgcGVyX3BhZ2U6IG51bWJlclxuICAgIHB1YmxpYyB0b3RhbF9wYWdlczogbnVtYmVyXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPihwYXlsb2FkOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk8VD4+KTogUGFnaW5hdGlvbkVudGl0eTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkVudGl0eShwYXlsb2FkIGFzIGFueSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYWxpYXNlczogc3RyaW5nW11cbiAgICBwdWJsaWMgdmVyc2lvbl9jaGFubmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbl9hdmFpbGFibGVfY2hhbm5lbHM6IHN0cmluZ1tdXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiIyUUFzQkEsU0FBZ0IsRUFFZCxHQUFHLEVBQXVELENBQ3hELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxLQUFNLEdBQVUsQ0FtQnZFLFNBQWdCLEVBSVosRUFDQSxHQUFHLEVBQytDLENBQ2xELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxFQUFpQixDQUd4RSxTQUFnQixFQUFpQyxFQUFlLENBQzVELE9BQU8sU0FBdUMsRUFBaUIsQ0FDM0QsTUFBTSxVQUFjLENBQU8sQ0FDdkIsWUFBWSxHQUFHLEVBQWEsQ0FDeEIsTUFBTSxHQUFHLEVBQUssQ0FDZCxJQUFNLEVBQVMsSUFBSSxFQUFPLEdBQUcsRUFBSyxDQUNsQyxPQUFPLE9BQU8sS0FBTSxFQUFPLEVBS25DLElBQUssSUFBTSxLQUFPLFFBQVEsUUFBUSxFQUFPLFVBQVUsQ0FDM0MsSUFBUSxlQUNSLE9BQU8sZUFDSCxFQUFNLFVBQ04sRUFDQSxPQUFPLHlCQUF5QixFQUFPLFVBQVcsRUFBSSxDQUN6RCxDQUlULE9BQU8sR0MzRWYsU0FBZ0IsRUFBWSxFQUFlLEVBQVcsRUFBRyxDQUNyRCxHQUFJLElBQVUsRUFBRyxNQUFPLFVBRXhCLElBQU0sRUFBSSxLQUNKLEVBQUssRUFBVyxFQUFJLEVBQUksRUFDeEIsRUFBUSxDQUFDLFFBQVMsS0FBTSxLQUFNLEtBQU0sS0FBTSxLQUFLLENBRS9DLEVBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFNLENBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUVuRCxPQUFPLFlBQVksRUFBaUIsSUFBRyxHQUFJLFFBQVEsRUFBRyxDQUFDLENBQUcsSUFBTSxFQUFNLEdDUDFFLFNBQWdCLEVBQVEsRUFBVSxFQUFTLEdBQUksRUFBVyxFQUFFLENBQXVCLENBQy9FLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsRUFBSSxDQUFFLENBRTVDLElBQU0sRUFEVSxRQUFRLEtBQUssRUFBSSxDQUNSLEdBQUcsRUFBTyxHQUFHLEVBQUksR0FBSyxFQUFTLEdBQUcsRUFBTyxHQUFHLElBQVEsRUFFN0UsR0FBSSxHQUFTLE9BQU8sR0FBVSxTQUFVLENBQ3BDLEVBQVEsRUFBTyxFQUFRLEVBQUksQ0FDM0IsU0FHSixFQUFJLEdBQVUsRUFHbEIsT0FBTyxFQUdYLFNBQWdCLEVBQVUsRUFBK0IsQ0FDckQsSUFBTSxFQUFTLEVBQUUsQ0FDakIsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFJLENBQzFDLEVBQUksRUFBUSxFQUFLLEVBQU0sQ0FFM0IsT0FBTyxFQ1hYLGVBQXNCLEVBQStCLEVBQTJDLENBQzVGLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxNQUFNLEdBQU8sQ0FDUCxPQUNoQixFQUFPLENBQ1osTUFBTyxDQUFDLEVBQWMsS0FBSyxFQUluQyxFQUFTLEtBQU8sU0FBMkIsRUFBNkIsQ0FDcEUsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLEdBQU8sQ0FDRCxPQUNoQixFQUFPLENBQ1osTUFBTyxDQUFDLEVBQWMsS0FBSyxHQzFCbkMsU0FBUyxHQUFNLENBWVgsT0FYSSxPQUFPLE9BQVcsS0FBZSxPQUFPLFdBQ2pDLE9BQU8sWUFBWSxDQUUxQixPQUFPLEtBQVMsS0FBZSxLQUFLLFFBQVUsS0FBSyxPQUFPLFdBQ25ELEtBQUssT0FBTyxZQUFZLENBRS9CLE9BQU8sT0FBVyxLQUFlLE9BQU8sUUFBVSxPQUFPLE9BQU8sV0FDekQsT0FBTyxPQUFPLFlBQVksQ0FJOUIsdUNBQXVDLFFBQVEsUUFBUyxTQUFVLEVBQUcsQ0FDeEUsSUFBTSxFQUFLLEtBQUssUUFBUSxDQUFHLEdBQU0sRUFFakMsT0FEVSxJQUFNLElBQU0sRUFBSyxFQUFJLEVBQU8sR0FDN0IsU0FBUyxHQUFHLEVBQ3ZCLENBR04sU0FBZ0IsRUFBUyxFQUFTLEdBQUksQ0FDbEMsT0FBTyxFQUFTLEdBQU0sQ0NYMUIsSUFBcUIsRUFBckIsS0FBbUMsQ0FDL0IsT0FBYyxzQkFBd0IsZ0JBRXRDLFFBRUEsYUFBYyxDQUNWLEtBQUssUUFBVSxJQUFJLElBR3ZCLE1BQWMsQ0FDVixPQUFPLE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxDQUFDLENBRzVDLFdBQWtCLEVBQWlCLENBSy9CLE9BSkksT0FBTyxHQUFVLFVBQVksRUFBTSxTQUFTLFdBQVcsQ0FDaEQsRUFBTSxRQUFRLFdBQVksR0FBRyxDQUFDLE1BQU0sR0FBSyxPQUc3QyxFQUdYLGVBQXNCLEVBQTZCLEVBQVMsU0FBZ0IsQ0FDeEUsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFPLENBQzdDLEtBQUssUUFBUSxJQUFJLEVBQUssQ0FDbEIsTUFDQSxNQUFPLEtBQUssV0FBVyxFQUFNLENBQzdCLFNBQ0gsQ0FBQyxDQUlWLGdCQUF1QixFQUEwQixFQUFTLFNBQWdCLENBQ3RFLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxFQUN2QixLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2xCLE1BQ0EsTUFBTyxLQUFLLFdBQVcsRUFBTSxDQUM3QixTQUNILENBQUMsQ0FJVixVQUF1QyxDQUNuQyxJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEVBQU8sR0FBTyxFQUFNLE1BR3hCLE9BQU8sRUFHWCxJQUFXLEVBQXNCLENBRzdCLEdBRmMsS0FBSyxRQUFRLElBQUksRUFBSSxDQUcvQixNQUFPLEdBR1gsR0FBSSxDQUFDLEVBQUksU0FBUyxJQUFJLENBQ2xCLE1BQU8sR0FHWCxJQUFNLEVBQVUsRUFBSSxNQUFNLElBQUksQ0FBQyxHQUN6QixFQUFlLEtBQUssUUFBUSxJQUFJLEVBQVEsQ0FFOUMsR0FBSSxDQUFDLEVBR0QsTUFGYyxPQUFLLFFBQVEsSUFBSSxFQUFJLENBS3ZDLElBQU0sRUFBUSxFQUFhLE1BTTNCLE9BSkksT0FBTyxHQUFVLFVBQVksTUFBTSxRQUFRLEVBQU0sQ0FDMUMsR0FHSixFQUFJLEVBQU8sRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUMsQ0FHeEQsSUFBZ0MsRUFBYSxFQUF1QixDQUNoRSxJQUFNLEVBQVEsS0FBSyxRQUFRLElBQUksRUFBSSxDQUVuQyxHQUFJLEVBQ0EsT0FBTyxFQUFNLE1BR2pCLEdBQUksQ0FBQyxFQUFJLFNBQVMsSUFBSSxDQUNsQixPQUFPLEVBR1gsSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDekIsRUFBZSxLQUFLLFFBQVEsSUFBSSxFQUFRLENBRTlDLEdBQUksQ0FBQyxFQUFjLENBQ2YsSUFBTSxFQUFRLEtBQUssUUFBUSxJQUFJLEVBQUksQ0FFbkMsT0FBTyxFQUFRLEVBQU0sTUFBUSxFQUdqQyxJQUFNLEVBQVEsRUFBYSxNQVEzQixPQU5JLE9BQU8sR0FBVSxVQUFZLE1BQU0sUUFBUSxFQUFNLENBQzFDLEVBR0ksRUFBSSxFQUFPLEVBQUksVUFBVSxFQUFRLE9BQVMsRUFBRSxDQUFFLEVBQWEsQ0FLOUUsT0FBbUMsRUFBZ0IsRUFBdUIsQ0FDdEUsSUFBSyxJQUFNLEtBQU8sRUFDZCxHQUFJLEtBQUssSUFBSSxFQUFJLENBQ2IsT0FBTyxLQUFLLElBQU8sRUFBSSxDQUkvQixPQUFPLEVBR1gsSUFBVyxFQUFhLEVBQVksRUFBUyxVQUFpQixDQUMxRCxHQUFJLENBQUMsRUFBSSxTQUFTLElBQUksQ0FBRSxDQUNwQixLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2IsTUFDRyxTQUNSLFFBQ0gsQ0FBQyxDQUNGLE9BR0osSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDM0IsRUFBZSxLQUFLLElBQUksRUFBUyxFQUFFLENBQUMsRUFFcEMsT0FBTyxHQUFpQixVQUFZLE1BQU0sUUFBUSxFQUFhLElBQy9ELEVBQWUsRUFBRSxFQUdyQixFQUFJLEVBQWMsRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUUsRUFBTSxDQUUzRCxLQUFLLFFBQVEsSUFBSSxFQUFTLENBQ3RCLElBQUssRUFDRyxTQUNSLE1BQU8sRUFDVixDQUFDLENBR04sTUFBYSxFQUFtQixDQUM1QixHQUFJLENBQUMsRUFBSSxTQUFTLElBQUksQ0FBRSxDQUNwQixLQUFLLFFBQVEsT0FBTyxFQUFJLENBQ3hCLE9BR0osSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDekIsRUFBZSxLQUFLLElBQUksRUFBUyxFQUFFLENBQUMsQ0FFckMsSUFFRCxPQUFPLEdBQWlCLFVBQVksTUFBTSxRQUFRLEVBQWEsR0FJbkUsRUFBTSxFQUFjLEVBQUksVUFBVSxFQUFRLE9BQVMsRUFBRSxDQUFDLENBRXRELEtBQUssUUFBUSxJQUFJLEVBQVMsQ0FDdEIsSUFBSyxFQUNMLE9BQVEsVUFDUixNQUFPLEVBQ1YsQ0FBQyxHQUdOLE9BQXFCLENBQ2pCLEtBQUssUUFBUSxPQUFPLENBR3hCLE1BQW1DLENBQy9CLE9BQU8sRUFBUSxLQUFLLFVBQVUsQ0FBQyxHQ3pMbEIsRUFBckIsTUFBcUIsVUFBc0IsS0FBTSxDQUM3QyxXQUE0QixJQUM1QixZQUFZLEVBQWlCLEVBQXFCLElBQUssQ0FDbkQsTUFBTSxFQUFRLENBQ2QsS0FBSyxLQUFPLEtBQUssWUFBWSxLQUM3QixLQUFLLFdBQWEsRUFHdEIsT0FBYyxVQUFVLEVBQTZCLENBQ2pELE9BQU8sSUFBSSxFQUFjLEVBQU0sUUFBUyxJQUFJLEdDSC9CLEdBQXJCLEtBQXNDLENBQ2xDLFFBQWtCLElBQUksSUFFdEIsZUFBc0IsRUFBbUMsQ0FDckQsT0FBTyxRQUFRLEVBQU8sQ0FBQyxTQUFTLENBQUMsRUFBSyxLQUFXLENBQzdDLEtBQUssSUFBSSxFQUFLLEVBQU0sRUFDdEIsQ0FHTixVQUF1QyxDQUNuQyxJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEVBQU8sT0FBTyxFQUFJLEVBQUksRUFHMUIsT0FBTyxFQUdYLE9BQWUsRUFBNkIsQ0FDeEMsSUFBSSxFQUFNLEdBRU4sT0FBTyxHQUFZLFlBQWMsT0FBTyxHQUFZLFlBQ3BELEVBQU0sRUFBUSxNQUdsQixJQUFNLEVBQWdCLE9BQU8sR0FBWSxVQUFZLE9BQU8sR0FBWSxTQVV4RSxPQVJJLEdBQWlCLENBQUUsRUFBZ0IsdUJBQ25DLFFBQVEsS0FBSyw0QkFBNEIsRUFBUSxLQUFLLDJIQUEySCxDQUdqTCxHQUFrQixFQUFnQix3QkFDbEMsRUFBTyxFQUFnQix1QkFHcEIsRUFJWCxJQUFXLEVBQW1CLEVBQVksQ0FDdEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBSWhDLE9BRkEsS0FBSyxRQUFRLElBQUksRUFBSyxFQUFNLENBRXJCLEtBR1gsSUFBVyxFQUE0QixDQUNuQyxJQUFNLEVBQU0sS0FBSyxPQUFPLEVBQVEsQ0FFaEMsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBR2hDLElBQWMsRUFBc0IsQ0FDaEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBRWhDLEdBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBQ3RCLE1BQU0sSUFBSSxFQUFjLG1CQUFtQixPQUFPLEVBQUksQ0FBQywyQkFBMkIsQ0FLdEYsT0FGYyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBS3ZDLFVBQW9CLEVBQXFDLENBQ3JELElBQU0sRUFBTSxFQUFpQixLQUN2QixFQUFtQixLQUFLLFFBQVEsSUFBSSxFQUFJLENBRTlDLEdBQUksRUFDQSxPQUFPLEVBR1gsSUFBTSxFQUFjLElBQUksRUFFeEIsT0FEQSxLQUFLLFFBQVEsSUFBSSxFQUFLLEVBQVksQ0FDM0IsRUFHWCxLQUFZLEVBQWlDLENBQ3pDLE9BQU8sUUFBUSxFQUFRLENBQUMsU0FBUyxDQUFDLEVBQUssS0FBVyxDQUM5QyxLQUFLLElBQUksRUFBSyxFQUFNLEVBQ3RCLENBR04sTUFBMEIsRUFBa0IsQ0FDeEMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFFLENBQ2pCLEtBQU0sRUFBUyxJQUFTLENBQ3BCLElBQU0sRUFBUSxLQUFLLElBQU8sRUFBSSxDQUN4QixFQUFRLEVBQU0sR0FNcEIsT0FKSSxPQUFPLEdBQVUsV0FDVixFQUFNLEtBQUssRUFBTSxDQUdyQixFQUFNLElBRWpCLEtBQU0sRUFBUyxFQUFNLElBQVUsQ0FDM0IsSUFBTSxFQUFRLEtBQUssSUFBTyxFQUFJLENBSTlCLE1BRkEsR0FBTSxHQUFRLEVBRVAsSUFFZCxDQUFDLENBR04sTUFBMEIsQ0FDdEIsT0FBTyxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0sQ0FBQyxHQzlHekIsRUFBckIsTUFBcUIsQ0FBYyxDQUMvQixPQUFjLHNCQUF3QixnQkFFdEMsS0FBWSxFQUFpQixFQUFrQixFQUkvQyxNQUFhLEVBQWlCLEVBQWtCLEVBSWhELEtBQVksRUFBaUIsRUFBa0IsRUFJL0MsTUFBYSxFQUF5QixFQUFrQixFQUl4RCxNQUFhLEVBQTZCLENBRXRDLE9BQU8sSUFBSSxJQ0FFLEVBQXJCLE1BQXFCLENBQTBFLENBQzNGLE9BQWMsc0JBQXdCLGtCQUV0QyxTQUFzQyxFQUFFLENBQ3hDLE1BQ0EsT0FFQSxZQUFhLEVBQWtDLENBQzNDLEtBQUssTUFBUSxHQUFTLE9BQVMsR0FDL0IsS0FBSyxPQUFTLEdBQVMsUUFBVSxJQUFJLEVBRWpDLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSwwQ0FBMEMsQ0FJcEUsT0FBYyxPQUFpRSxFQUFrQyxDQUM3RyxPQUFPLElBQUksRUFBd0IsRUFBUSxDQUcvQyxTQUFnQixFQUFnQixDQUM1QixLQUFLLE1BQVEsRUFFVCxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBSS9DLFVBQWlCLEVBQXVCLENBQ3BDLEtBQUssT0FBUyxFQUtsQixHQUFVLEVBQWUsRUFBdUMsRUFBcUIsQ0FDakYsSUFBTSxFQUFLLEdBQVMsSUFBTSxHQUFVLENBRXBDLEdBQUksR0FBUyxRQUNNLEtBQUssU0FBUyxLQUFLLEdBQU0sRUFBRSxRQUFVLEdBQVMsRUFBRSxXQUFhLEdBQWEsRUFBRSxLQUFPLEVBQUcsQ0FHakcsT0FJUixJQUFNLEVBQTJCLENBQzdCLEtBQ0EsUUFDQSxXQUNILENBUUQsT0FOQSxLQUFLLFNBQVMsS0FBSyxFQUFRLENBRXZCLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxnQkFBaUIsRUFBUSxDQUd4QyxFQUtYLEtBQVksRUFBZSxFQUF1QyxFQUFxQixDQUNuRixJQUFNLEVBQVcsR0FBYyxDQUMzQixFQUFTLEVBQUssQ0FFZCxLQUFLLElBQUksRUFBTyxFQUFRLEVBRzVCLE9BQU8sS0FBSyxHQUFHLEVBQU8sRUFBUyxFQUFRLENBTTNDLFdBQWtCLEVBQWUsRUFBdUMsRUFBNkIsQ0FDakcsSUFBTSxFQUFZLEVBQVMsRUFBVSxHQUFTLFVBQVksSUFBSSxDQUV4RCxFQUFVLEtBQUssR0FBRyxFQUFPLEVBQVcsRUFBUSxDQU1sRCxPQUpJLElBQ0EsRUFBUSxpQkFBbUIsR0FHeEIsRUFLWCxRQUFlLEVBQWtCLEVBQW9CLEVBQXFCLENBQ3RFLElBQU0sRUFBOEIsRUFBRSxDQUV0QyxJQUFLLElBQU0sS0FBUyxFQUFRLENBQ3hCLElBQU0sRUFBVSxLQUFLLEdBQUcsRUFBTyxFQUFpQixFQUFRLENBRXBELEdBQ0EsRUFBUyxLQUFLLEVBQVEsQ0FJOUIsT0FBTyxFQUdYLElBQVcsRUFBZSxFQUFvQixDQUMxQyxLQUFLLFNBQVcsS0FBSyxTQUFTLE9BQU8sR0FDakMsRUFBSSxFQUFFLFFBQVUsSUFBVSxFQUFFLFdBQWEsR0FBWSxFQUFFLG1CQUFxQixJQUs5RSxDQUVFLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxrQkFBbUIsQ0FBRSxRQUFPLENBQUMsQ0FNdkQsS0FBWSxFQUFlLEVBQVksQ0FFL0IsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLGlCQUFrQixDQUNoQyxRQUNBLE9BQ0gsQ0FBQyxDQUdOLElBQU0sRUFBVyxLQUFLLFNBQVMsT0FBTyxHQUFLLEVBQUUsUUFBVSxFQUFNLENBRTdELElBQUssSUFBTSxLQUFXLEVBQ2xCLEVBQVMsU0FBVyxFQUFRLFNBQVMsRUFBSyxDQUFDLENBTW5ELE1BQWEsWUFBWSxFQUFlLEVBQVksQ0FDaEQsSUFBTSxFQUFXLEtBQUssU0FBUyxPQUFPLEdBQUssRUFBRSxRQUFVLEVBQU0sQ0FFekQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDBCQUEyQixDQUN6QyxTQUFVLEVBQVMsT0FDbkIsUUFDQSxPQUNILENBQUMsQ0FHTixVQUFXLElBQU0sS0FBVyxFQUN4QixNQUFNLEVBQVEsU0FBUyxFQUFLLENBS3BDLE1BQWMsQ0FDVixPQUFPLEtBQUssU0FHaEIsWUFBbUIsRUFBZSxDQUM5QixPQUFPLEtBQUssU0FBUyxPQUFPLEdBQUssRUFBRSxRQUFVLEVBQU0sQ0FHdkQsT0FBYyxFQUE0QixDQUN0QyxJQUFNLEVBQU0sTUFBTSxRQUFRLEVBQVEsQ0FBRyxFQUFVLENBQUMsRUFBUSxDQUV4RCxLQUFLLFNBQVcsS0FBSyxTQUFTLE9BQU8sR0FBSyxDQUFDLEVBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUUxRCxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sbUJBQW9CLENBQUUsTUFBSyxDQUFDLENBSXRELE9BQWUsQ0FDWCxLQUFLLFNBQVcsRUFBRSxDQUVkLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSx1QkFBdUIsQ0FJakQsYUFBcUIsQ0FDakIsT0FBTyxLQUFLLFNBQVMsT0FBUyxJQzFMakIsR0FBckIsS0FBc0MsQ0FDbEMsT0FBYyxzQkFBd0IsbUJBRXRDLE1BQ0EsT0FDQSxNQUFlLEdBRWYsWUFBWSxFQUFnQyxFQUFFLENBQUUsQ0FDNUMsS0FBSyxNQUFRLEVBQUssT0FBUyxLQUFLLE1BQ2hDLEtBQUssTUFBUSxFQUFLLE9BQVMsSUFBSSxJQUMvQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksRUFFN0IsRUFBSyxVQUNMLEtBQUssUUFBVSxFQUFLLFNBSTVCLFFBQWUsRUFBYyxFQUFzRCxDQUMvRSxPQUFPLE9BQU8sRUFBTyxDQUFFLFVBQVMsQ0FBQyxDQUVqQyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsRUFBUSxPQUFPLElBQUksRUFBUSxPQUFPLElBQUssRUFBTSxDQUdwRixXQUFrQixFQUFnQixDQUM5QixJQUFNLEVBQW1CLEVBQUUsQ0FDckIsRUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxJQUFLLElBQU0sS0FBUSxFQUFLLENBQ3BCLEdBQUksRUFBSyxTQUFTLEVBQUssUUFBUSxDQUFFLENBQzdCLEVBQU8sS0FBSyxFQUFLLFFBQVEsQ0FDekIsU0FHQSxFQUFLLGNBQ2dCLEVBQUssYUFBYSxLQUFLLEdBQVMsRUFBSyxTQUFTLEVBQU0sQ0FBQyxFQUd0RSxFQUFPLEtBQUssRUFBSyxRQUFRLENBS3JDLE9BQU8sRUFHWCxLQUFZLEVBQXVCLENBQy9CLElBQUksRUFBUSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxHQUFJLEdBQVMsUUFBUyxDQUNsQixJQUFJLEVBQU0sTUFBTSxRQUFRLEVBQVEsUUFBUSxDQUFHLEVBQVEsUUFBVSxDQUFDLEVBQVEsUUFBUSxDQUU5RSxFQUFNLEtBQUssV0FBVyxFQUFJLENBRTFCLEVBQVEsRUFBTSxPQUFPLEdBQVEsQ0FBQyxFQUFJLFNBQVMsRUFBSyxRQUFRLENBQUMsQ0FHN0QsR0FBSSxHQUFTLFFBQVMsQ0FDbEIsSUFBSSxFQUFNLE1BQU0sUUFBUSxFQUFRLFFBQVEsQ0FBRyxFQUFRLFFBQVUsQ0FBQyxFQUFRLFFBQVEsQ0FFOUUsRUFBTSxLQUFLLFdBQVcsRUFBSSxDQUUxQixFQUFRLEVBQU0sT0FBTyxHQUFRLEVBQUksU0FBUyxFQUFLLFFBQVEsQ0FBQyxDQUs1RCxNQUZBLEdBQVEsRUFBUSxFQUFPLENBQUMsUUFBUSxDQUFFLENBQUMsTUFBTSxDQUFDLENBRW5DLEVBR1gsSUFBVyxHQUFHLEVBQStELENBQ3pFLElBQU0sRUFBNkIsRUFBRSxDQUVyQyxJQUFLLElBQU0sS0FBUSxFQUFTLENBQ3hCLEdBQUksT0FBTyxHQUFTLFdBQVksQ0FDNUIsRUFBVSxLQUFLLElBQUksRUFBTyxDQUMxQixTQUdKLEVBQVUsS0FBSyxFQUFLLENBR3hCLElBQUssSUFBTSxLQUFRLEVBQVcsQ0FDMUIsR0FBSSxDQUFDLEVBQUssUUFBUyxDQUNmLEtBQUssT0FBTyxLQUFLLGlDQUFrQyxFQUFLLENBQ3hELFNBR0osS0FBSyxNQUFNLElBQUksRUFBSyxRQUFTLEVBQUssQ0FFOUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLE9BQVMsRUFBSyxRQUFRLENBR3hDLEVBQUssVUFDTCxFQUFLLFNBQVMsUUFBUSxHQUFXLEtBQUssSUFBSSxFQUFRLENBQUMsRUFLL0QsTUFBYSxXQUFXLEVBQXlCLEVBQXNDLENBQ25GLElBQU0sRUFBUSxLQUFLLEtBQUssRUFBUSxDQUU1QixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sWUFBWSxFQUFPLGFBQWMsQ0FDL0MsTUFBTyxFQUFNLElBQUksR0FBUSxFQUFLLFFBQVEsQ0FDekMsQ0FBQyxDQUdOLElBQUssSUFBTSxLQUFRLEtBQUssS0FBSyxFQUFRLENBQUUsQ0FDbkMsSUFBTSxFQUFNLENBQ1IsYUFBZ0IsUUFBUSxJQUFJLENBQUMsRUFBSyxVQUFVLENBQUUsRUFBSyxZQUFZLENBQUMsQ0FBQyxDQUNqRSxTQUFZLFFBQVEsSUFBSSxDQUFDLEVBQUssTUFBTSxDQUFFLEVBQUssUUFBUSxDQUFDLENBQUMsQ0FDckQsU0FBWSxRQUFRLElBQUksQ0FBQyxFQUFLLE1BQU0sQ0FBRSxFQUFLLFFBQVEsQ0FBQyxDQUFDLENBQ3JELGFBQWdCLFFBQVEsSUFBSSxDQUFDLEVBQUssVUFBVSxDQUFFLEVBQUssWUFBWSxDQUFDLENBQUMsQ0FDcEUsQ0FFSyxDQUFDLEdBQVMsTUFBTSxNQUFlLEVBQUksSUFBUyxDQUFDLENBRW5ELEdBQUksRUFBTyxDQUNQLEtBQUssUUFBUSxFQUFPLENBQUUsT0FBUSxFQUFLLFFBQVMsU0FBUSxDQUFDLENBQ3JELFNBR0EsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLEdBQUcsRUFBTyxHQUFLLEVBQUssUUFBUSxFQUsxRCxNQUFhLEtBQUssRUFBOEMsRUFBc0MsQ0FDbEcsSUFBTSxFQUFVLE1BQU0sUUFBUSxFQUFRLENBQUcsRUFBVSxDQUFDLEVBQVEsQ0FFNUQsSUFBSyxJQUFNLEtBQVUsRUFDakIsTUFBTSxLQUFLLFdBQVcsRUFBUSxFQUFRLENBSTlDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxPQUFPLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHekMsTUFBYSxLQUFLLEVBQXNDLENBQ3BELE9BQU8sS0FBSyxLQUFLLE9BQVEsRUFBUSxDQUdyQyxNQUFhLEtBQUssRUFBc0MsQ0FDcEQsT0FBTyxLQUFLLEtBQUssT0FBUSxFQUFRLENBR3JDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxNQUFNLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHeEMsT0FBcUIsQ0FDakIsS0FBSyxNQUFNLE9BQU8sR0M1S0wsR0FBckIsS0FBdUMsQ0FDbkMsT0FBYyxzQkFBd0Isb0JBRXRDLFFBQ0EsT0FDQSxjQUNBLE1BQXdCLEdBQ3hCLE9BQ0EsTUFFQSxZQUFZLEVBQW1DLEVBQUUsQ0FBRSxDQUMvQyxLQUFLLFFBQVUsRUFBSyxTQUFXLElBQUksSUFDbkMsS0FBSyxPQUFTLEVBQUssUUFBVSxLQUM3QixLQUFLLE1BQVEsRUFBSyxPQUFTLEdBQzNCLEtBQUssTUFBUSxFQUFLLE9BQVMsSUFBSSxJQUMvQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksRUFDakMsS0FBSyxjQUFnQixJQUFJLElBRXJCLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSw0QkFBNkIsQ0FBRSxPQUFRLEtBQUssT0FBUSxDQUFDLENBSS9FLElBQVcsU0FBb0IsQ0FDM0IsT0FBTyxNQUFNLEtBQUssS0FBSyxjQUFjLE1BQU0sQ0FBQyxDQUdoRCxNQUFnRCxDQUM1QyxJQUFNLEVBQTBDLEVBQUUsQ0FTbEQsT0FQQSxLQUFLLFFBQVEsU0FBUyxFQUFPLElBQVEsQ0FDakMsRUFBTSxLQUFLLENBQ1AsTUFDQSxRQUNILENBQUMsRUFDSixDQUVLLEVBSVgsTUFBYSxXQUFXLEVBQWlELENBQ3JFLElBQU0sRUFBUSxLQUFLLE1BQU0sSUFBSSxFQUFPLENBU3BDLEdBUEksR0FBUyxLQUFLLE9BQ2QsS0FBSyxPQUFPLE1BQU0sZ0JBQWdCLEVBQU8sY0FBZSxDQUNwRCxTQUNBLE9BQVEsT0FBTyxLQUFLLEVBQU0sQ0FBQyxPQUM5QixDQUFDLENBR0YsRUFDQSxPQUFPLEVBR1gsSUFBTSxFQUFTLEtBQUssY0FBYyxJQUFJLEVBQU8sQ0FFN0MsR0FBSSxDQUFDLEVBRUQsT0FEQSxLQUFLLE9BQU8sS0FBSywrQkFBK0IsRUFBTyxHQUFHLENBQ25ELEVBQUUsQ0FHYixJQUFNLEVBQVUsTUFBTSxHQUFRLENBVzlCLE9BVEEsS0FBSyxNQUFNLElBQUksRUFBUSxFQUFRLENBRTNCLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxlQUFlLElBQVUsQ0FDdkMsU0FDQSxLQUFNLE9BQU8sS0FBSyxFQUFRLENBQUMsT0FDOUIsQ0FBQyxDQUdDLEVBR1gsTUFBYSxLQUFLLEVBQWdCLENBQzlCLElBQU0sRUFBVSxNQUFNLEtBQUssV0FBVyxFQUFPLENBRTdDLEtBQUssUUFBVSxJQUFJLElBQW9CLE9BQU8sUUFBUSxFQUFRLENBQUMsQ0FFL0QsS0FBSyxPQUFTLEVBR2xCLEVBQVMsRUFBYSxFQUFZLEVBQUUsQ0FBVSxDQUN0QyxDQUFDLEtBQUssUUFBUSxJQUFJLEVBQUksRUFBSSxLQUFLLE9BQy9CLEtBQUssT0FBTyxNQUFNLGdDQUFnQyxFQUFJLEdBQUksQ0FDdEQsTUFDQSxPQUFRLEtBQUssT0FDaEIsQ0FBQyxDQUtOLElBQUksRUFGVSxLQUFLLFFBQVEsSUFBSSxFQUFJLEVBQUksRUFZdkMsT0FSSyxPQUFPLEtBQUssRUFBSyxDQUFDLFFBSXZCLE9BQU8sUUFBUSxFQUFLLENBQUMsU0FBUyxDQUFDLEVBQU0sS0FBWSxDQUM3QyxFQUFjLEVBQVksUUFBUSxJQUFJLElBQVEsRUFBTyxFQUN2RCxDQUxTLEVBVWYsS0FBWSxFQUE4QixDQUd0QyxPQUZhLElBQUksS0FBSyxFQUFLLENBRWYsbUJBQW1CLEtBQUssT0FBUSxDQUN4QyxLQUFNLFVBQ04sTUFBTyxVQUNQLElBQUssVUFDUixDQUFDLENBR04sU0FBZ0IsRUFBOEIsQ0FHMUMsT0FGYSxJQUFJLEtBQUssRUFBSyxDQUVmLGVBQWUsS0FBSyxPQUFRLENBQ3BDLEtBQU0sVUFDTixNQUFPLFVBQ1AsSUFBSyxVQUNMLEtBQU0sVUFDTixPQUFRLFVBQ1gsQ0FBQyxHQ2hJVyxHQUFyQixLQUFtQyxDQUMvQixPQUFjLHNCQUF3QixnQkFFdEMsT0FBYyxFQUFhLENBQ3ZCLElBQU0sRUFBWSxNQUFNLDBCQUEwQixDQUlsRCxNQUZBLE9BQU8sT0FBTyxFQUFPLENBQUUsT0FBTSxDQUFDLENBRXhCLEVBR1YsU0FBZ0IsRUFBYyxDQUMxQixJQUFNLEVBQVksTUFBTSwwQkFBMEIsQ0FJbEQsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE9BQU0sQ0FBQyxDQUV4Qiw0R0NYZCxNQUFhLE1BQWUsRUFBRSxLQUMxQixFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQ2pDLEVBQUUsVUFBVSxPQUFPLENBQ25CLEVBQUUsU0FBUyxDQUNkLENBRVksTUFBZ0IsRUFBRSxLQUMzQixFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQ2xDLEVBQUUsVUFBVSxHQUFLLElBQU0sSUFBUSxJQUFNLE9BQU8sQ0FDL0MsQ0FFWSxNQUFhLEVBQUUsS0FDeEIsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUMvQixFQUFFLFVBQVUsR0FBSyxhQUFhLEtBQU8sRUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDLENBQ3JELEVBQUUsVUFBVSxHQUFLLEdBQUksRUFBTyxFQUFHLGFBQWEsQ0FBSyxDQUNwRCxDQUVZLE1BQWlCLEVBQUUsS0FDNUIsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUMvQixFQUFFLFVBQVUsR0FDSCxJQUVELElBQU0sT0FBZSxNQUVyQixPQUFPLEdBQU0sV0FDYixFQUFJLElBQUksS0FBSyxFQUFFLEVBR1osRUFBTyxFQUFHLG1CQUFtQixHQUN0QyxDQUNMLENBRVksR0FBZ0QsRUFBWSxFQUFFLEtBQUssR0FBaUIsRUFBRSxLQUMvRixFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQzFDLEVBQUUsVUFBVSxHQUFTLE1BQU0sUUFBUSxFQUFNLENBQUcsRUFBUSxFQUFNLE1BQU0sSUFBSSxDQUFDLENBQ3JFLEVBQUUsTUFBTSxFQUFPLENBQ2xCLENBRVksTUFBb0IsRUFBRSxLQUMvQixHQUFPLENBQ1AsRUFBRSxVQUFVLEdBQVMsRUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUMxQyxDQUVZLE1BQWUsRUFBRSxLQUMxQixFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3BELEVBQUUsVUFBVSxHQUFTLE9BQU8sR0FBVSxTQUFXLEVBQUcsTUFBTSxFQUFNLENBQUcsRUFBTSxDQUN6RSxFQUFFLFVBQVUsR0FBUyxDQUNqQixJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxJQUFNLEtBQU8sRUFDZCxFQUFJLEVBQVEsRUFBSyxFQUFJLEVBQU8sRUFBSSxDQUFDLENBR3JDLE9BQU8sR0FDVCxDQUNMLHVCQ25ERCxNQUFhLEdBQVEsRUFBNEIsRUFBRSxHQUFLLEVBQUUsT0FBTyxDQUM3RCxLQUFNLEVBQUUsU0FBUyxHQUFRLENBQUUsRUFBRSxDQUM3QixNQUFPLEVBQUUsU0FBUyxHQUFRLENBQUUsRUFBUSxVQUFZLElBQUksQ0FDcEQsUUFBUyxFQUFFLFNBQVMsRUFBUSxZQUFjLEVBQU0sRUFBRSxTQUFTLEVBQVEsWUFBWSxDQUFDLENBQUcsRUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFFLEVBQUUsQ0FBQyxDQUN6RyxlQUFnQixFQUFFLFNBQVMsRUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsTUFBTSxDQUFFLEVBQUUsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUUsRUFBRSxDQUFDLENBQ3hGLENBQUMsQ0NUSSxFQUFTLENBQ1gsSUFBQSxHQUNBLFdBQUEsRUFDSCxDQXlCRCxJQUFxQixFQUFyQixLQUFzQyxDQUNsQyxPQUFjLHNCQUF3QixtQkFFdEMsRUFBb0IsQ0FDaEIsR0FBRyxFQUNILFNBQ0gsQ0FFRCxPQUF1QyxFQUEwQixDQUM3RCxPQUFPLEVBQUcsS0FBSyxFQUFFLENBR3JCLFNBQXlDLEVBQWMsRUFBd0IsQ0FDM0UsSUFBTSxFQUFZLE9BQU8sR0FBTyxXQUFhLEVBQUcsS0FBSyxFQUFFLENBQUcsRUFFcEQsQ0FBRSxTQUFRLFNBQVEsV0FBWSxFQUFFLFVBQVUsRUFBUSxFQUFRLENBRWhFLEdBQUksQ0FBQyxFQUFTLENBQ1YsSUFBTSxFQUFVLEVBQUUsUUFBUSxFQUFPLENBQzNCLEVBQVcsRUFBRSxDQUVmLEVBQVEsTUFDUixFQUFTLEtBQUssR0FBRyxFQUFRLEtBQUssQ0FHOUIsRUFBUSxRQUNSLE9BQU8sUUFBUSxFQUFRLE9BQU8sQ0FBQyxRQUFTLEdBQVUsQ0FDOUMsR0FBTSxDQUFDLEVBQUssR0FBUyxFQUVyQixFQUFTLEtBQUssR0FBRyxFQUFNLElBQUssR0FBTSxHQUFHLEVBQUksSUFBSSxJQUFJLENBQUMsRUFDcEQsQ0FLTixJQUFNLEVBQVEsSUFBSSxFQUZGLEVBQVMsT0FBUyxFQUFTLEtBQUssS0FBSyxDQUFHLG9CQUVmLElBQUksQ0FNN0MsS0FKQSxHQUFNLEtBQU8sa0JBRWIsT0FBTyxPQUFPLEVBQU8sQ0FBRSxXQUFXLENBQUMsQ0FFN0IsRUFHVixPQUFPLEVBR1gsTUFBYSxjQUE0QyxFQUFjLEVBQW1DLENBQ3RHLElBQU0sRUFBWSxPQUFPLEdBQU8sV0FBYSxFQUFHLEtBQUssRUFBRSxDQUFHLEVBRXBELENBQUUsU0FBUSxTQUFRLFdBQVksTUFBTSxFQUFFLGVBQWUsRUFBUSxFQUFRLENBRTNFLEdBQUksQ0FBQyxFQUFTLENBQ1YsSUFBTSxFQUFZLE1BQU0sb0JBQW9CLENBQ3RDLEVBQVUsRUFBRSxRQUFRLEVBQU8sQ0FDM0IsRUFBVSxDQUNaLEdBQUcsRUFBUSxLQUNYLEdBQUcsRUFBUSxPQUNkLENBSUQsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLFVBQVUsQ0FBQyxDQUU1QixFQUdWLE9BQU8sRUFHWCxRQUF3QyxFQUFjLEVBQWlDLENBQ25GLElBQU0sRUFBWSxPQUFPLEdBQU8sV0FBYSxFQUFHLEtBQUssRUFBRSxDQUFHLEVBRXBELENBQUUsV0FBWSxFQUFFLFVBQVUsRUFBUSxFQUFRLENBRWhELE9BQU8sSUN4R2YsU0FBZ0IsRUFBZSxFQUFtQixFQUE2QyxDQUMzRixJQUFNLEVBQWlDLEVBQUUsQ0FFbkMsRUFBZ0IsRUFBVSxNQUFNLElBQUksQ0FBQyxPQUFPLFFBQVEsQ0FDcEQsRUFBa0IsRUFBWSxNQUFNLElBQUksQ0FBQyxPQUFPLFFBQVEsQ0FFOUQsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQWMsT0FBUSxJQUFLLENBQzNDLElBQU0sRUFBZSxFQUFjLEdBQzdCLEVBQWlCLEVBQWdCLEdBRXZDLEdBQUksRUFBYSxXQUFXLElBQUksQ0FBRSxDQUM5QixJQUFNLEVBQVksRUFBYSxNQUFNLEVBQUUsQ0FDdkMsRUFBTyxHQUFhLEVBR3hCLEdBQUksSUFBaUIsSUFBSyxDQUd0QixFQUFPLEtBRG1CLEVBQWdCLE1BQU0sRUFBRSxDQUNsQixLQUFLLElBQUksQ0FDekMsT0FJUixPQUFPLEVBR1gsU0FBZ0IsRUFBYyxFQUEwQyxDQUNwRSxJQUFNLEVBQWdDLEVBQUUsQ0FDbEMsRUFBYyxFQUFZLE1BQU0sSUFBSSxDQUFDLEdBTTNDLE9BSkssRUFJRSxFQUFHLE1BQU0sRUFBWSxDQUhqQixFQzdCZixNQUFhLEVBQTZCLEVBQUUsT0FBTyxDQUMvQyxHQUFJLEVBQUUsUUFBUSxDQUNkLGNBQWUsRUFBRSxRQUFRLENBQ3pCLGdCQUFpQixFQUFFLFFBQVEsQ0FDM0IsY0FBZSxFQUFFLFFBQVEsQ0FDekIsV0FBWSxFQUFFLFFBQVEsQ0FDdEIsV0FBWSxFQUFFLFFBQVEsQ0FDekIsQ0FBQyxDQ1BXLEVBQW1CLEVBQUUsT0FBTyxDQUNyQyxHQUFJLEVBQUUsUUFBUSxDQUNkLEtBQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQzVCLFlBQWEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ25DLE9BQVEsRUFBRSxRQUFRLENBQ2xCLFFBQVMsRUFBRSxRQUFRLENBQ25CLFdBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ2xDLFdBQVksRUFBRSxRQUFRLENBQ3RCLFdBQVksRUFBRSxRQUFRLENBQ3RCLFdBQVksRUFBRSxRQUFRLENBQ3pCLENBQUMsQ0NWVyxFQUFjLEVBQUUsT0FBTyxDQUNoQyxHQUFJLEVBQUUsUUFBUSxDQUNkLEtBQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQzVCLEtBQU0sRUFBRSxRQUFRLENBQ2hCLFFBQVMsRUFBRSxRQUFRLENBQ25CLE1BQU8sRUFBRSxRQUFRLENBQ2pCLFdBQVksRUFBRSxRQUFRLENBQ3RCLFdBQVksRUFBRSxRQUFRLENBQ3RCLFdBQVksRUFBRSxRQUFRLENBQ3pCLENBQUMsQ0NYRixJQUFxQixFQUFyQixjQUE0QyxDQUFjLENBQ3RELE9BQ0EsSUFDQSxLQUVBLFlBQVksRUFBaUIsRUFBZ0IsRUFBYSxFQUFnQixDQUN0RSxNQUFNLEVBQVMsSUFBSSxDQUVuQixLQUFLLE9BQVMsRUFDZCxLQUFLLElBQU0sRUFDWCxLQUFLLEtBQU8sSUNWcEIsTUFBYSxFQUFZLElBQUksRUNJN0IsU0FBZ0IsRUFBaUIsRUFBbUMsRUFBRSxDQUFFLENBQ3BFLE9BQU8sU0FBK0MsRUFBYSxDQUMvRCxPQUFPLGNBQWMsQ0FBSyxDQUN0QixPQUFjLEtBQTJCLEVBQXFCLENBRzFELElBQU0sRUFBVyxJQUZHLE9BQU8sTUFBUyxXQUFhLEtBQU8sR0FJcEQsRUFBVSxDQUFFLEdBQUcsRUFBTSxDQVF6QixPQU5JLEVBQVEsUUFDUixFQUFVLEVBQVEsTUFBTSxFQUFLLEVBR2pDLE9BQU8sT0FBTyxFQUFpQixFQUFRLENBRWhDLEVBR1gsTUFBYSxFQUEyQixDQUVwQyxPQURBLE9BQU8sT0FBTyxLQUFNLEVBQUssQ0FDbEIsUUFNdkIsU0FBd0IsRUFBc0MsRUFBYSxDQUN2RSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixPQUFjLEtBQTJCLEVBQXFCLENBQzFELElBQU0sRUFBYyxPQUFPLE1BQVMsV0FBYSxLQUFPLEVBRWxELEVBQVcsSUFBSSxFQUVqQixFQUFVLENBQUUsR0FBRyxFQUFNLENBWXpCLE9BVkksT0FBTyxHQUFZLE9BQVUsYUFDN0IsRUFBVyxFQUFtQixNQUFNLEVBQUssRUFHekMsT0FBUSxNQUFjLE9BQVUsYUFDaEMsRUFBVyxLQUFhLE1BQU0sRUFBSyxFQUd2QyxPQUFPLE9BQU8sRUFBaUIsRUFBUSxDQUVoQyxFQUdYLE1BQWEsRUFBMkIsQ0FFcEMsT0FEQSxPQUFPLE9BQU8sS0FBTSxFQUFLLENBQ2xCLE9DbERuQixlQUFzQixFQUFTLEVBQWtCLEVBQWUsR0FBRyxFQUFhLENBQzVFLElBQU0sRUFBWSxFQUFZLFdBQWEsRUFBRSxDQUU3QyxVQUFXLElBQU0sS0FBSyxFQUFVLE9BQVEsR0FBVyxFQUFFLFFBQVUsRUFBTSxDQUNqRSxNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUssQ0FJakMsU0FBZ0IsRUFBTyxFQUFrQixFQUFlLEVBQW9DLENBQ3hGLElBQU0sRUFBWSxFQUFZLFdBQWEsRUFBRSxDQUU5QixFQUFVLEtBQU0sR0FBVyxFQUFFLFFBQVUsR0FBUyxFQUFFLFdBQWEsRUFBUyxHQU12RixFQUFVLEtBQUssQ0FDWCxRQUNBLFdBQ0gsQ0FBQyxDQUVGLEVBQVksVUFBWSxHQUc1QixTQUFnQixFQUF1QyxFQUFhLENBQ2hFLE9BQU8sY0FBYyxDQUFLLENBQ3RCLFlBQVksR0FBRyxFQUFhLENBQ3hCLE1BQU0sR0FBRyxFQUFLLENBRVYsT0FBUSxLQUFLLFlBQW9CLE1BQVMsWUFDekMsS0FBSyxZQUFvQixLQUFLLE1BQU0sS0FBSyxZQUFZLENBSTlELE9BQWMsVUFBWSxFQUFFLENBRTVCLE9BQWMsR0FBRyxFQUFlLEVBQW9DLENBQ2hFLE9BQU8sRUFBTyxLQUFNLEVBQU8sRUFBUyxDQUd4QyxhQUFvQixLQUFLLEVBQWUsR0FBRyxFQUFhLENBQ3BELE9BQU8sRUFBUyxLQUFNLEVBQU8sR0FBRyxFQUFLLEdBS2pELFNBQXdCLEVBQWlDLEVBQWEsQ0FDbEUsT0FBTyxjQUFjLENBQUssQ0FDdEIsVUFFQSxZQUFZLEdBQUcsRUFBYSxDQUN4QixNQUFNLEdBQUcsRUFBSyxDQUNkLEtBQUssVUFBWSxFQUFFLENBR3ZCLEdBQVUsRUFBZSxFQUFvQyxDQUN6RCxLQUFLLFVBQVUsS0FBSyxDQUNoQixRQUNBLFdBQ0gsQ0FBQyxDQUdOLElBQVcsRUFBZSxFQUFvQyxDQUMxRCxJQUFNLEVBQVEsS0FBSyxVQUFVLFVBQVcsR0FBTSxFQUFFLFFBQVUsR0FBUyxFQUFFLFdBQWEsRUFBUyxDQUd2RixJQUFVLElBSWQsS0FBSyxVQUFVLE9BQU8sRUFBTyxFQUFFLENBR25DLEtBQVksRUFBZSxHQUFHLEVBQWEsQ0FDdkMsSUFBTSxFQUFZLEtBQUssVUFBVSxPQUFRLEdBQU0sRUFBRSxRQUFVLEVBQU0sQ0FHakUsSUFBSyxJQUFNLEtBQUssRUFDWixFQUFFLFNBQVMsR0FBRyxFQUFLLENBSTNCLE1BQWEsVUFBVSxFQUFlLEdBQUcsRUFBYSxDQUNsRCxJQUFNLEVBQVksS0FBSyxVQUFVLE9BQVEsR0FBTSxFQUFFLFFBQVUsRUFBTSxDQUVqRSxVQUFXLElBQU0sS0FBSyxFQUNsQixNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUssR0FNekMsRUFBWSxLQUFPLEVBQ25CLEVBQVksR0FBSyxFQ25HakIsU0FBd0IsRUFBdUMsRUFBUyxDQUNwRSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixXQUEwQyxNQ0ZsRCxTQUF3QixFQUFzQyxFQUFTLENBQ25FLE9BQU8sY0FBYyxDQUFLLENBQ3RCLFdBQ0EsWUNEUixJQUFxQixFQUFyQixjQUE4QyxFQUFRLEVBQVcsQUFBQyxDQUM5RCxHQUNBLEtBQ0EsWUFBb0MsS0FDcEMsT0FDQSxRQUNBLE9BQ0EsV0FBeUQsS0FFekQsSUFBVyxVQUFXLENBQ2xCLE9BQU8sS0FBSyxTQUFXLFNBRzNCLElBQVcsa0JBQW1CLENBQzFCLEdBQUksQ0FBQyxLQUFLLFdBQ04sTUFBTyxFQUFFLENBR2IsR0FBTSxDQUFDLEVBQU8sR0FBUSxFQUFTLFNBQ3ZCLE9BQU8sS0FBSyxZQUFlLFNBQ3BCLEtBQUssTUFBTSxLQUFLLFdBQXFCLENBR3pDLEtBQUssV0FDZCxDQUVGLE9BQU8sRUFBUSxFQUFFLENBQUcsSUMxQlAsR0FBckIsS0FBK0IsQ0FDM0IsT0FBYyxzQkFBd0IsWUFFdEMsUUFDQSxZQUNBLE1BQXdCLEdBQ3hCLE9BRUEsWUFBWSxFQUEyQixFQUFFLENBQUUsQ0FFdkMsSUFBTSxHQURjLEVBQUssYUFBZSxFQUFFLEVBQ2hCLElBQUssR0FBZUEsRUFBVyxLQUFLLEVBQVcsQ0FBQyxDQUcxRSxLQUFLLFlBQWMsRUFDbkIsS0FBSyxNQUFRLEVBQUssT0FBUyxHQUMzQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksR0FBZSxDQUFDLE1BQU0sQ0FBRSxNQUFPLE1BQU8sQ0FBQyxDQUV4RSxLQUFLLFFBQVUsR0FBZSxHQUFRLENBQ2xDLEVBQU0sUUFBUyxHQUFlLENBQzFCLEVBQUksRUFBVyxPQUFRLEVBQVcsUUFBUyxFQUFXLGlCQUFpQixFQUN6RSxFQUNKLENBRUUsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDRCQUE2QixDQUMzQyxZQUFhLEtBQUssWUFDckIsQ0FBQyxDQUlWLElBQVcsRUFBZ0IsRUFBYyxFQUE4QixDQUVuRSxHQUFJLENBQUMsRUFDRCxPQUFPLEtBQUssUUFBUSxJQUFJLEVBQVFDLEVBQVEsQ0FHNUMsSUFBTSxFQUFvQkMsRUFBY0QsRUFBUyxFQUFPLENBRXhELE9BQU8sS0FBSyxRQUFRLElBQUksRUFBUSxFQUFrQixDQUd0RCxPQUFjLEVBQWdCLEVBQWMsRUFBOEIsQ0FDdEUsR0FBSSxDQUFDLEVBQ0QsT0FBTyxLQUFLLFFBQVEsT0FBTyxFQUFRQSxFQUFRLENBRy9DLElBQU0sRUFBb0JDLEVBQWNELEVBQVMsRUFBTyxDQUV4RCxPQUFPLEtBQUssUUFBUSxPQUFPLEVBQVEsRUFBa0IsQ0FHekQsUUFBZSxFQUFpQixFQUE2QixDQUN6RCxPQUFPQyxFQUFjRCxFQUFTLEVBQU8sR0NuRHhCLEdBQXJCLEtBQXFDLENBQ2pDLE9BQWMsc0JBQXdCLGtCQUV0QyxRQUNBLE9BRUEsWUFBWSxFQUErQixDQUN2QyxLQUFLLFFBQVUsR0FBTSxTQUFXLElBQUksSUFDcEMsS0FBSyxPQUFTLEdBQU0sUUFBVSxHQUdsQyxLQUFZLEVBQXVELENBQy9ELEdBQUksYUFBbUIsSUFBSyxDQUN4QixJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsRUFBUSxTQUFTLENBQ3hDLEtBQUssSUFBSSxFQUFLLEVBQU0sQ0FHeEIsT0FHSixJQUFLLElBQU0sS0FBTyxPQUFPLEtBQUssRUFBUSxDQUNsQyxLQUFLLElBQUksRUFBSyxFQUFRLEdBQUssQ0FJbkMsSUFBVyxFQUFjLEVBQThCLEtBQXFCLENBQ3hFLElBQU0sRUFBVyxLQUFLLE9BQVMsRUFFL0IsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFTLEVBQUksRUFLekMsSUFBVyxFQUFjLEVBQWUsRUFBZSxDQUNuRCxJQUFNLEVBQVcsS0FBSyxPQUFTLEVBRS9CLEtBQUssUUFBUSxJQUFJLEVBQVUsRUFBTSxDQUdyQyxVQUEwQyxDQUN0QyxJQUFNLEVBQWlDLEVBQUUsQ0FFekMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEdBQUksRUFBSSxXQUFXLEtBQUssT0FBTyxDQUFFLENBQzdCLElBQU0sRUFBZ0IsRUFBSSxNQUFNLEtBQUssT0FBTyxPQUFPLENBRW5ELEVBQU8sR0FBaUIsRUFJaEMsT0FBTyxJQ3ZEZixNQUFhLE1BQWMsQ0FDdkIsQ0FDSSxHQUFJLEtBQ0osTUFBTyxHQUFHLGNBQWMsQ0FDeEIsWUFBYSxHQUFHLHdDQUF3QyxDQUN4RCxjQUFlLENBQ1gsVUFBVyxDQUNQLFVBQVcsYUFDWCxNQUFPLEdBQUcsWUFBWSxDQUN0QixZQUFhLEdBQUcsaURBQWlELENBQ2pFLEtBQU0sR0FBRyxxRUFBc0UsQ0FBQyxzQkFBdUIsa0JBQWtCLENBQUMsQ0FDN0gsQ0FDSixDQUNKLENBQ0QsQ0FDSSxHQUFJLEtBQ0osTUFBTyxLQUNQLFlBQWEsR0FBRyxpRkFBaUYsQ0FDakcsY0FBZSxDQUNYLFlBQWEsQ0FDVCxVQUFXLGFBQ1gsTUFBTyxHQUFHLGdCQUFnQixDQUMxQixLQUFNLEdBQUcsMEJBQTBCLENBQ25DLEtBQU0sV0FDVCxDQUNELGdCQUFpQixDQUNiLFVBQVcsYUFDWCxNQUFPLEdBQUcsb0JBQW9CLENBQzlCLEtBQU0sR0FBRyw4QkFBOEIsQ0FDdkMsS0FBTSxXQUNULENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsY0FBYyxDQUN4QixLQUFNLEdBQUcsK0NBQStDLENBQzNELENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsU0FBUyxDQUNuQixLQUFNLEdBQUcsK0NBQStDLENBQzNELENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsU0FBUyxDQUNuQixLQUFNLEdBQUcsdUVBQXVFLENBQ25GLENBQ0QsU0FBVSxDQUNOLFVBQVcsYUFDWCxNQUFPLEdBQUcsZUFBZSxDQUN6QixLQUFNLEdBQUcsMkRBQTJELENBQ3ZFLENBQ0osQ0FDSixDQUNKLENBQ0QsSUFBcUIsR0FBckIsTUFBcUIsQ0FBWSxDQUM3QixXQUFrQixPQUFRLENBQ3RCLE9BQU8sR0FBTyxDQUdsQixHQUNBLEtBQ0EsS0FDQSxXQUNBLE9BRUEsWUFBWSxFQUFrQixDQUMxQixPQUFPLE9BQU8sS0FBTSxFQUFLLENBRzdCLElBQVcsZUFBZ0IsQ0FDdkIsSUFBTSxFQUFTLEVBQVksTUFBTSxLQUFLLEdBQU8sRUFBSSxLQUFPLEtBQUssS0FBSyxDQUVsRSxPQUFPLEVBQVMsRUFBTyxjQUFnQixFQUFFLEdDeEU1QixHQUFyQixLQUFnQyxDQUM1QixLQUNBLEtBQ0EsS0FDQSxNQUFvQyxFQUFFLENBRXRDLFlBQVksRUFBa0IsQ0FDMUIsT0FBTyxPQUFPLEtBQU0sRUFBSyxHQ0ZaLEdBQXJCLGNBQXdDLEVBQVFFLEVBQWlCLEVBQWdCLEVBQWdCLEFBQUMsQ0FDOUYsR0FDQSxNQUNBLFNBQ0EsUUFDQSxZQUNBLFNBQ0EsT0FHQSxJQUNBLE1BRUEsU0FBMEIsQ0FDdEIsT0FBTyxLQUFLLFNBQVMsV0FBVyxTQUFTLEdDZDVCLEdBQXJCLGNBQXNDLEVBQVFDLEVBQWlCLEVBQWdCLEVBQWdCLEFBQUMsQ0FDNUYsR0FDQSxRQUNBLEtBQ0EsT0NKaUIsR0FBckIsY0FBMkMsRUFBUUMsRUFBaUIsRUFBZ0IsRUFBZ0IsQUFBQyxDQUNqRyxHQUNBLFFBQ0EsV0FDQSxTQUdBLFdBQ0EsZ0JBRUEsb0JBQXNDLENBQ2xDLE9BQU8sS0FBSyxXQUFXLE1BQU0sSUFBSSxDQUFDLElBQUksR0FBUSxFQUFLLE1BQU0sQ0FBQyxDQUc5RCxrQkFBeUIsRUFBMkIsQ0FDaEQsSUFBTSxFQUFlLEtBQUssb0JBQW9CLENBQzlDLE9BQU8sRUFBYSxTQUFTLEVBQVMsRUFBSSxFQUFhLFNBQVMsTUFBTSxDQUcxRSxjQUFxQixFQUF1QixDQUN4QyxPQUFPLEdBQVEsS0FBSyxXQ3pCUCxHQUFyQixLQUFxQyxDQUNqQyxLQUNBLE9BQ0EsV0FDQSxVQUVBLFlBQVksRUFBdUIsQ0FDL0IsT0FBTyxPQUFPLEtBQU0sRUFBSyxHQ1BaLEdBQXJCLEtBQXFDLENBQ2pDLEtBQ0EsV0FDQSxRQUNBLEtBQ0EsWUFDQSxhQUNBLEtBRUEsWUFBWSxFQUF1QixDQUMvQixPQUFPLE9BQU8sS0FBTSxFQUFLLEdDSFosRUFBckIsS0FBcUMsQ0FDakMsT0FBYyxzQkFBd0Isa0JBQ3RDLFFBQ0EsVUFFQSxZQUFZLEVBQStCLENBQ3ZDLEtBQUssUUFBVSxJQUFJLElBQ25CLEtBQUssVUFBWSxHQUFNLFVBRW5CLEdBQU0sU0FDTixLQUFLLGVBQWUsRUFBSyxRQUFRLENBSXpDLGVBQXNCLEVBQWlDLENBQ25ELElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxFQUFRLENBQ2xDLEtBQUssSUFBSSxFQUFLLEVBQVEsR0FBSyxDQUluQyxJQUFXLEVBQWMsRUFBOEIsS0FBcUIsQ0FDeEUsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFLLEVBQUksRUFHckMsSUFBVyxFQUFjLEVBQWUsQ0FDcEMsR0FBSSxDQUFDLEtBQUssVUFDTixNQUFNLElBQUksRUFBYyxvQ0FBb0MsQ0FHaEUsS0FBSyxRQUFRLElBQUksRUFBTSxFQUFNLENBR2pDLFVBQTBDLENBQ3RDLElBQU0sRUFBaUMsRUFBRSxDQUVuQyxFQUFVLE1BQU0sS0FBSyxLQUFLLFFBQVEsU0FBUyxDQUFDLENBRWxELElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxFQUN2QixFQUFPLEdBQU8sRUFHbEIsT0FBTyxJQ2hETSxFQUFyQixLQUFtQyxDQUMvQixRQUNBLGFBQ0EsTUFDQSxTQUVBLE1BQWEsVUFBMEIsRUFDdkMsTUFBYSxNQUFzQixFQUNuQyxNQUFhLE1BQXNCLEVBQ25DLE1BQWEsVUFBMEIsRUFHdkMsTUFBYSxZQUE0QixFQUV6QyxNQUFhLFFBQXdCLEVBRXJDLE1BQWEsUUFBd0IsRUFFckMsTUFBYSxZQUE0QixJQ1J4QixHQUFyQixjQUFvQyxFQUFRLEVBQVksRUFBTSxFQUFjLENBQUMsQUFBQyxDQUMxRSxHQUNBLEtBQ0EsUUFBMEIsR0FDMUIsYUFBMkMsRUFBRSxDQUM3QyxNQUF3QyxFQUFFLENBQzFDLFVBRUEsYUFFQSxRQUFlLEVBQXdDLENBQ25ELElBQU0sRUFBVyxPQUFPLFlBQ3BCLE9BQU8sUUFBUSxFQUFLLENBQUMsUUFBUSxFQUFHLEtBQU8sSUFBTSxJQUFBLEdBQVUsQ0FDMUQsQ0FFRCxPQUFPLE9BQU8sS0FBTSxFQUFTLENBRTdCLEtBQUssUUFBVSxVQUFVLEtBQUssT0NmakIsR0FBckIsY0FBNEMsRUFBUSxFQUFXLEFBQUMsQ0FDNUQsR0FDQSxLQUNBLFFBQ0EsWUFDQSxRQUNBLE9BQ0EsYUFDQSxPQ3BCaUIsR0FBckIsTUFBcUIsQ0FBMEMsQ0FDM0QsTUFDQSxNQUNBLEtBQ0EsU0FDQSxZQUVBLFlBQVksRUFBaUMsQ0FDekMsT0FBTyxPQUFPLEtBQU0sRUFBSyxDQUc3QixPQUFjLEtBQWtDLEVBQTRELENBQ3hHLE9BQU8sSUFBSSxFQUFpQixFQUFlLEdDVDlCLEdBQXJCLGNBQTBDLEVBQVEsRUFBVyxBQUFDLENBQzFELEdBQ0EsS0FDQSxRQUNBLFFBQ0EsUUFDQSxnQkFDQSw0QkNMaUIsR0FBckIsY0FBa0MsRUFBUSxFQUFZLEVBQWdCLEVBQWdCLEFBQUMsQ0FDbkYsR0FDQSxLQUNBLGFDRGlCLEdBQXJCLGNBQXdDLEVBQVEsRUFBWSxFQUFnQixFQUFnQixBQUFDLENBQ3pGLEdBQ0EsTUFDQSxLQUNBLFNBQ0EsU0FDQSxZQUVBLFlBQ0EsTUFFQSxJQUFXLFVBQVUsQ0FDakIsR0FBTSxDQUFDLEVBQVcsR0FBYyxLQUFLLEtBQUssTUFBTSxJQUFJLENBU3BELE9BUEssRUFJSyxFQUFVLEdBQUcsYUFBYSxDQUMxQixFQUFXLEdBQUcsYUFBYSxDQUoxQixFQUFVLEdBQUcsYUFBYSJ9
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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