@tolle_/tolle-ui 18.2.29 → 18.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 (294) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +12 -12
  4. package/esm2022/lib/alert-dialog.component.mjs +82 -64
  5. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  6. package/esm2022/lib/alert.component.mjs +5 -11
  7. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  8. package/esm2022/lib/attachment.component.mjs +334 -0
  9. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  10. package/esm2022/lib/avatar.component.mjs +4 -9
  11. package/esm2022/lib/badge.component.mjs +4 -9
  12. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  15. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  16. package/esm2022/lib/bubble.component.mjs +301 -0
  17. package/esm2022/lib/button.component.mjs +5 -11
  18. package/esm2022/lib/calendar.component.mjs +5 -11
  19. package/esm2022/lib/card.component.mjs +14 -43
  20. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  21. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  22. package/esm2022/lib/chart-pie.component.mjs +386 -0
  23. package/esm2022/lib/chart.component.mjs +1146 -0
  24. package/esm2022/lib/chart.service.mjs +555 -0
  25. package/esm2022/lib/checkbox.component.mjs +5 -11
  26. package/esm2022/lib/checkpoint.component.mjs +134 -0
  27. package/esm2022/lib/collapsible.component.mjs +4 -11
  28. package/esm2022/lib/combobox.component.mjs +372 -0
  29. package/esm2022/lib/command-dialog.component.mjs +164 -0
  30. package/esm2022/lib/command.component.mjs +514 -0
  31. package/esm2022/lib/command.service.mjs +130 -0
  32. package/esm2022/lib/confirmation.component.mjs +219 -0
  33. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  34. package/esm2022/lib/context-menu.component.mjs +460 -0
  35. package/esm2022/lib/context-menu.service.mjs +125 -0
  36. package/esm2022/lib/context.component.mjs +377 -0
  37. package/esm2022/lib/conversation.component.mjs +442 -0
  38. package/esm2022/lib/country-selector.component.mjs +5 -11
  39. package/esm2022/lib/data-table.component.mjs +59 -12
  40. package/esm2022/lib/date-picker.component.mjs +251 -198
  41. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  42. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  43. package/esm2022/lib/direction.component.mjs +79 -0
  44. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  48. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  49. package/esm2022/lib/empty-state.component.mjs +4 -9
  50. package/esm2022/lib/field.component.mjs +394 -0
  51. package/esm2022/lib/hover-card.component.mjs +6 -16
  52. package/esm2022/lib/inline-citation.component.mjs +263 -0
  53. package/esm2022/lib/input-group.component.mjs +418 -0
  54. package/esm2022/lib/input.component.mjs +5 -11
  55. package/esm2022/lib/item.component.mjs +243 -0
  56. package/esm2022/lib/kbd.component.mjs +82 -0
  57. package/esm2022/lib/label.component.mjs +4 -9
  58. package/esm2022/lib/marker.component.mjs +135 -0
  59. package/esm2022/lib/masked-input.component.mjs +5 -11
  60. package/esm2022/lib/menubar.component.mjs +683 -0
  61. package/esm2022/lib/message-scroller.component.mjs +353 -0
  62. package/esm2022/lib/message-scroller.service.mjs +157 -0
  63. package/esm2022/lib/message.component.mjs +228 -0
  64. package/esm2022/lib/modal-ref.mjs +36 -7
  65. package/esm2022/lib/modal.component.mjs +42 -28
  66. package/esm2022/lib/modal.mjs +2 -29
  67. package/esm2022/lib/modal.service.mjs +26 -4
  68. package/esm2022/lib/model-selector.component.mjs +310 -0
  69. package/esm2022/lib/multi-select.component.mjs +155 -72
  70. package/esm2022/lib/native-select.component.mjs +201 -0
  71. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  72. package/esm2022/lib/otp-group.component.mjs +3 -3
  73. package/esm2022/lib/otp-slot.component.mjs +4 -9
  74. package/esm2022/lib/otp.component.mjs +5 -11
  75. package/esm2022/lib/pagination.component.mjs +7 -10
  76. package/esm2022/lib/plan.component.mjs +335 -0
  77. package/esm2022/lib/popover-content.component.mjs +4 -9
  78. package/esm2022/lib/popover.component.mjs +15 -13
  79. package/esm2022/lib/progress.component.mjs +4 -9
  80. package/esm2022/lib/prompt-input.component.mjs +526 -0
  81. package/esm2022/lib/queue.component.mjs +280 -0
  82. package/esm2022/lib/radio-group.component.mjs +6 -13
  83. package/esm2022/lib/radio-item.component.mjs +4 -9
  84. package/esm2022/lib/range-calendar.component.mjs +5 -11
  85. package/esm2022/lib/reasoning.component.mjs +335 -0
  86. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  87. package/esm2022/lib/resizable.component.mjs +219 -0
  88. package/esm2022/lib/segment.component.mjs +19 -9
  89. package/esm2022/lib/select-group.component.mjs +4 -8
  90. package/esm2022/lib/select-item.component.mjs +4 -9
  91. package/esm2022/lib/select-separator.component.mjs +4 -8
  92. package/esm2022/lib/select.component.mjs +133 -49
  93. package/esm2022/lib/separator.component.mjs +4 -9
  94. package/esm2022/lib/sheet.component.mjs +38 -56
  95. package/esm2022/lib/shimmer.component.mjs +84 -0
  96. package/esm2022/lib/sidebar.component.mjs +11 -1
  97. package/esm2022/lib/skeleton.component.mjs +4 -9
  98. package/esm2022/lib/sources.component.mjs +452 -0
  99. package/esm2022/lib/spinner.component.mjs +68 -0
  100. package/esm2022/lib/suggestion.component.mjs +207 -0
  101. package/esm2022/lib/switch.component.mjs +5 -11
  102. package/esm2022/lib/table.component.mjs +213 -0
  103. package/esm2022/lib/tabs.component.mjs +4 -11
  104. package/esm2022/lib/tag-input.component.mjs +5 -11
  105. package/esm2022/lib/task.component.mjs +359 -0
  106. package/esm2022/lib/textarea.component.mjs +5 -11
  107. package/esm2022/lib/theme.service.mjs +17 -6
  108. package/esm2022/lib/time-picker.component.mjs +923 -0
  109. package/esm2022/lib/toast.service.mjs +3 -2
  110. package/esm2022/lib/toaster.component.mjs +76 -39
  111. package/esm2022/lib/toggle-group.component.mjs +4 -9
  112. package/esm2022/lib/toggle.component.mjs +5 -11
  113. package/esm2022/lib/tool.component.mjs +462 -0
  114. package/esm2022/lib/typography.component.mjs +83 -0
  115. package/esm2022/lib/utils/color.mjs +140 -19
  116. package/esm2022/public-api.mjs +61 -1
  117. package/fesm2022/tolle-ui.mjs +16642 -1105
  118. package/fesm2022/tolle-ui.mjs.map +1 -1
  119. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  120. package/lib/alert-dialog.component.d.ts +23 -2
  121. package/lib/aspect-ratio.component.d.ts +20 -0
  122. package/lib/attachment.component.d.ts +101 -0
  123. package/lib/bubble.component.d.ts +112 -0
  124. package/lib/chain-of-thought.component.d.ts +166 -0
  125. package/lib/chart-pie.component.d.ts +108 -0
  126. package/lib/chart.component.d.ts +369 -0
  127. package/lib/chart.service.d.ts +222 -0
  128. package/lib/checkpoint.component.d.ts +51 -0
  129. package/lib/combobox.component.d.ts +90 -0
  130. package/lib/command-dialog.component.d.ts +53 -0
  131. package/lib/command.component.d.ts +189 -0
  132. package/lib/command.service.d.ts +67 -0
  133. package/lib/confirmation.component.d.ts +70 -0
  134. package/lib/context-menu-trigger.directive.d.ts +12 -0
  135. package/lib/context-menu.component.d.ts +41 -0
  136. package/lib/context-menu.service.d.ts +38 -0
  137. package/lib/context.component.d.ts +134 -0
  138. package/lib/conversation.component.d.ts +165 -0
  139. package/lib/data-table.component.d.ts +26 -1
  140. package/lib/date-picker.component.d.ts +72 -11
  141. package/lib/date-range-picker.component.d.ts +63 -6
  142. package/lib/date-time-picker.component.d.ts +119 -0
  143. package/lib/direction.component.d.ts +45 -0
  144. package/lib/field.component.d.ts +201 -0
  145. package/lib/inline-citation.component.d.ts +103 -0
  146. package/lib/input-group.component.d.ts +150 -0
  147. package/lib/item.component.d.ts +154 -0
  148. package/lib/kbd.component.d.ts +50 -0
  149. package/lib/marker.component.d.ts +58 -0
  150. package/lib/menubar.component.d.ts +247 -0
  151. package/lib/message-scroller.component.d.ts +159 -0
  152. package/lib/message-scroller.service.d.ts +73 -0
  153. package/lib/message.component.d.ts +128 -0
  154. package/lib/modal-ref.d.ts +6 -1
  155. package/lib/modal.component.d.ts +7 -4
  156. package/lib/modal.d.ts +9 -3
  157. package/lib/model-selector.component.d.ts +103 -0
  158. package/lib/multi-select.component.d.ts +66 -14
  159. package/lib/native-select.component.d.ts +57 -0
  160. package/lib/navigation-menu.component.d.ts +230 -0
  161. package/lib/plan.component.d.ts +120 -0
  162. package/lib/popover.component.d.ts +1 -0
  163. package/lib/prompt-input.component.d.ts +194 -0
  164. package/lib/queue.component.d.ts +106 -0
  165. package/lib/reasoning.component.d.ts +127 -0
  166. package/lib/resizable.component.d.ts +43 -0
  167. package/lib/segment.component.d.ts +13 -3
  168. package/lib/select.component.d.ts +37 -5
  169. package/lib/sheet.component.d.ts +3 -0
  170. package/lib/shimmer.component.d.ts +38 -0
  171. package/lib/sidebar.component.d.ts +2 -0
  172. package/lib/sources.component.d.ts +156 -0
  173. package/lib/spinner.component.d.ts +29 -0
  174. package/lib/suggestion.component.d.ts +96 -0
  175. package/lib/table.component.d.ts +106 -0
  176. package/lib/task.component.d.ts +151 -0
  177. package/lib/theme.service.d.ts +9 -0
  178. package/lib/time-picker.component.d.ts +243 -0
  179. package/lib/toast.service.d.ts +3 -1
  180. package/lib/toaster.component.d.ts +26 -9
  181. package/lib/tool.component.d.ts +158 -0
  182. package/lib/typography.component.d.ts +32 -0
  183. package/lib/utils/color.d.ts +19 -5
  184. package/package.json +3 -2
  185. package/preset.js +7 -1
  186. package/public-api.d.ts +50 -0
  187. package/registry/docs-content.json +8480 -1542
  188. package/registry/llms-full.txt +2679 -319
  189. package/registry/llms.txt +43 -4
  190. package/registry/manifest.json +9090 -1742
  191. package/registry/r/accordion-item.json +1 -1
  192. package/registry/r/accordion.json +1 -1
  193. package/registry/r/alert-dialog-dynamic.json +1 -1
  194. package/registry/r/alert-dialog.json +1 -1
  195. package/registry/r/alert.json +1 -1
  196. package/registry/r/attachment.json +23 -0
  197. package/registry/r/avatar-fallback.json +1 -1
  198. package/registry/r/avatar.json +1 -1
  199. package/registry/r/badge.json +1 -1
  200. package/registry/r/breadcrumb-item.json +1 -1
  201. package/registry/r/breadcrumb-link.json +1 -1
  202. package/registry/r/breadcrumb-separator.json +1 -1
  203. package/registry/r/breadcrumb.json +1 -1
  204. package/registry/r/bubble.json +23 -0
  205. package/registry/r/button.json +1 -1
  206. package/registry/r/calendar.json +1 -1
  207. package/registry/r/card.json +1 -1
  208. package/registry/r/carousel.json +1 -1
  209. package/registry/r/chain-of-thought.json +23 -0
  210. package/registry/r/chart-pie.json +30 -0
  211. package/registry/r/chart.json +28 -0
  212. package/registry/r/checkbox.json +1 -1
  213. package/registry/r/checkpoint.json +23 -0
  214. package/registry/r/collapsible.json +1 -1
  215. package/registry/r/combobox.json +31 -0
  216. package/registry/r/command-dialog.json +21 -0
  217. package/registry/r/command.json +26 -0
  218. package/registry/r/confirmation.json +23 -0
  219. package/registry/r/context-menu-trigger.json +1 -1
  220. package/registry/r/context-menu.json +1 -1
  221. package/registry/r/context.json +26 -0
  222. package/registry/r/conversation.json +23 -0
  223. package/registry/r/country-selector.json +1 -1
  224. package/registry/r/data-table.json +1 -1
  225. package/registry/r/date-picker.json +4 -4
  226. package/registry/r/date-range-picker.json +3 -3
  227. package/registry/r/date-time-picker.json +28 -0
  228. package/registry/r/direction.json +16 -0
  229. package/registry/r/dropdown-item.json +1 -1
  230. package/registry/r/dropdown-label.json +1 -1
  231. package/registry/r/dropdown-menu.json +1 -1
  232. package/registry/r/dropdown-separator.json +1 -1
  233. package/registry/r/dropdown-trigger.json +1 -1
  234. package/registry/r/empty-state.json +1 -1
  235. package/registry/r/field.json +23 -0
  236. package/registry/r/hover-card.json +1 -1
  237. package/registry/r/inline-citation.json +26 -0
  238. package/registry/r/input-group.json +23 -0
  239. package/registry/r/input.json +1 -1
  240. package/registry/r/item.json +23 -0
  241. package/registry/r/kbd.json +23 -0
  242. package/registry/r/label.json +1 -1
  243. package/registry/r/marker.json +23 -0
  244. package/registry/r/masked-input.json +1 -1
  245. package/registry/r/menubar.json +24 -0
  246. package/registry/r/message-scroller.json +26 -0
  247. package/registry/r/message.json +23 -0
  248. package/registry/r/modal.json +3 -3
  249. package/registry/r/model-selector.json +32 -0
  250. package/registry/r/multi-select.json +2 -2
  251. package/registry/r/native-select.json +23 -0
  252. package/registry/r/navigation-menu.json +24 -0
  253. package/registry/r/otp-group.json +1 -1
  254. package/registry/r/otp-slot.json +1 -1
  255. package/registry/r/otp.json +1 -1
  256. package/registry/r/pagination.json +3 -2
  257. package/registry/r/plan.json +23 -0
  258. package/registry/r/popover-content.json +1 -1
  259. package/registry/r/popover.json +1 -1
  260. package/registry/r/progress.json +1 -1
  261. package/registry/r/prompt-input.json +23 -0
  262. package/registry/r/queue.json +23 -0
  263. package/registry/r/radio-group.json +1 -1
  264. package/registry/r/radio-item.json +1 -1
  265. package/registry/r/range-calendar.json +1 -1
  266. package/registry/r/reasoning.json +23 -0
  267. package/registry/r/resizable-panel.json +1 -1
  268. package/registry/r/segment.json +1 -1
  269. package/registry/r/select-group.json +1 -1
  270. package/registry/r/select-item.json +1 -1
  271. package/registry/r/select-separator.json +1 -1
  272. package/registry/r/select.json +4 -3
  273. package/registry/r/separator.json +1 -1
  274. package/registry/r/sheet.json +1 -1
  275. package/registry/r/shimmer.json +23 -0
  276. package/registry/r/sidebar.json +1 -1
  277. package/registry/r/skeleton.json +1 -1
  278. package/registry/r/sources.json +23 -0
  279. package/registry/r/spinner.json +23 -0
  280. package/registry/r/suggestion.json +23 -0
  281. package/registry/r/switch.json +1 -1
  282. package/registry/r/table.json +21 -0
  283. package/registry/r/tabs.json +1 -1
  284. package/registry/r/tag-input.json +1 -1
  285. package/registry/r/task.json +23 -0
  286. package/registry/r/textarea.json +1 -1
  287. package/registry/r/time-picker.json +24 -0
  288. package/registry/r/toaster.json +2 -2
  289. package/registry/r/toggle-group.json +1 -1
  290. package/registry/r/toggle.json +1 -1
  291. package/registry/r/tool.json +23 -0
  292. package/registry/r/typography.json +23 -0
  293. package/registry/registry.json +915 -22
  294. package/theme.css +121 -8
@@ -1,4 +1,4 @@
1
- import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core';
1
+ import { Injectable, Inject, PLATFORM_ID, Optional, RendererStyleFlags2, } from '@angular/core';
2
2
  import { DOCUMENT, isPlatformBrowser } from '@angular/common';
3
3
  import { TOLLE_CONFIG } from './tolle-config';
4
4
  import { BehaviorSubject } from 'rxjs';
@@ -89,11 +89,22 @@ export class ThemeService {
89
89
  localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
90
90
  }
91
91
  }
92
+ /**
93
+ * Sets a CSS custom property on an element.
94
+ *
95
+ * `Renderer2.setStyle(el, '--x', v)` without `DashCase` compiles to
96
+ * `el.style['--x'] = v`, which is a silent no-op for custom properties — the
97
+ * theme control appears to work and simply changes nothing. Every custom
98
+ * property goes through here so no call site can forget the flag.
99
+ */
100
+ setCssVar(el, name, value) {
101
+ this.renderer.setStyle(el, name, value, RendererStyleFlags2.DashCase);
102
+ }
92
103
  /** Set a typography stack (`--font-sans` / `--font-serif` / `--font-mono`). */
93
104
  setFont(kind, stack, persist = true) {
94
105
  if (!isPlatformBrowser(this.platformId))
95
106
  return;
96
- this.renderer.setStyle(this.document.documentElement, `--font-${kind}`, stack);
107
+ this.setCssVar(this.document.documentElement, `--font-${kind}`, stack);
97
108
  if (persist) {
98
109
  localStorage.setItem(`tolle-font-${kind}`, stack);
99
110
  }
@@ -155,7 +166,7 @@ export class ThemeService {
155
166
  if (!isPlatformBrowser(this.platformId))
156
167
  return;
157
168
  const root = this.document.documentElement;
158
- this.renderer.setStyle(root, '--radius', radius);
169
+ this.setCssVar(root, '--radius', radius);
159
170
  this.updateRadiusInDynamicStyles(radius);
160
171
  this.updateAllRadiusVariables(radius);
161
172
  if (persist) {
@@ -173,7 +184,7 @@ export class ThemeService {
173
184
  for (const [name, value] of Object.entries(scale)) {
174
185
  if (name === '--radius')
175
186
  continue;
176
- this.renderer.setStyle(root, name, value);
187
+ this.setCssVar(root, name, value);
177
188
  }
178
189
  }
179
190
  updateRadiusInDynamicStyles(radius) {
@@ -255,7 +266,7 @@ export class ThemeService {
255
266
  this.generatePrimaryShades(color);
256
267
  const rgb = hexToRgb(color);
257
268
  if (rgb) {
258
- this.renderer.setStyle(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
269
+ this.setCssVar(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
259
270
  }
260
271
  if (persist) {
261
272
  localStorage.setItem('tolle-primary-color', color);
@@ -345,4 +356,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
345
356
  type: Inject,
346
357
  args: [TOLLE_CONFIG]
347
358
  }] }, { type: i0.RendererFactory2 }] });
348
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczRyxNQUFNLE9BQU8sWUFBWTtJQVVLO0lBQ0c7SUFDYTtJQVhwQyxRQUFRLENBQVk7SUFDcEIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXJDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztJQUNoQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBRTNDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QywyQ0FBMkM7UUFDM0MsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7YUFDMUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVMLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzt3R0F2V1UsWUFBWSxrQkFVYixRQUFRLGFBQ1IsV0FBVyxhQUNDLFlBQVk7NEdBWnZCLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVc3QixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVE9MTEVfQ09ORklHLCBUb2xsZUNvbmZpZyB9IGZyb20gJy4vdG9sbGUtY29uZmlnJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaGV4VG9SZ2IsIHJhZGl1c1NjYWxlLCBnZW5lcmF0ZVRoZW1lQ3NzLCBnZW5lcmF0ZUJhc2VDc3MsIGdlbmVyYXRlQ2hhcnRDc3MgfSBmcm9tICcuL3V0aWxzL2NvbG9yJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG4gIHByaXZhdGUgYmFzZVN0eWxlSWQgPSAndG9sbGUtYmFzZS10aGVtZSc7XG4gIHByaXZhdGUgY2hhcnRTdHlsZUlkID0gJ3RvbGxlLWNoYXJ0LXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIC8vIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICBsZXQgc2hvdWxkQmVEYXJrID0gc3lzdGVtUHJlZmVyc0Rhcms7XG5cbiAgICBpZiAoc2F2ZWRUaGVtZSkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gdGhpcy5jb25maWcuZGFya0J5RGVmYXVsdDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSBtb2RlXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBQcmltYXJ5IENvbG9yXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBSYWRpdXNcbiAgICBpZiAoc2F2ZWRSYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHNhdmVkUmFkaXVzLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyh0aGlzLmNvbmZpZy5yYWRpdXMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBCYXNlIChuZXV0cmFsKSBjb2xvciAoc2F2ZWQgPiBjb25maWcgPiB0aGVtZS5jc3MgZGVmYXVsdCA9IHppbmMpXG4gICAgY29uc3Qgc2F2ZWRCYXNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWJhc2UtY29sb3InKTtcbiAgICBpZiAoc2F2ZWRCYXNlKSB7XG4gICAgICB0aGlzLnNldEJhc2VDb2xvcihzYXZlZEJhc2UsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5iYXNlQ29sb3IpIHtcbiAgICAgIHRoaXMuc2V0QmFzZUNvbG9yKHRoaXMuY29uZmlnLmJhc2VDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IENoYXJ0IGNvbG9yIChzYXZlZCA+IGNvbmZpZylcbiAgICBjb25zdCBzYXZlZENoYXJ0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gICAgaWYgKHNhdmVkQ2hhcnQpIHtcbiAgICAgIHRoaXMuc2V0Q2hhcnRDb2xvcihzYXZlZENoYXJ0LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uY2hhcnRDb2xvcikge1xuICAgICAgdGhpcy5zZXRDaGFydENvbG9yKHRoaXMuY29uZmlnLmNoYXJ0Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBUeXBvZ3JhcGh5IChzYXZlZCBwcmVmZXJlbmNlID4gY29uZmlnIGRlZmF1bHQgPiB0aGVtZS5jc3MgZGVmYXVsdClcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWydzYW5zJywgJ3NlcmlmJywgJ21vbm8nXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgdG9sbGUtZm9udC0ke2tpbmR9YCk7XG4gICAgICBjb25zdCBmcm9tQ29uZmlnID0gdGhpcy5jb25maWc/LltgZm9udCR7a2luZFswXS50b1VwcGVyQ2FzZSgpfSR7a2luZC5zbGljZSgxKX1gIGFzICdmb250U2FucycgfCAnZm9udFNlcmlmJyB8ICdmb250TW9ubyddO1xuICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBzYXZlZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChmcm9tQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBmcm9tQ29uZmlnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IGEgdHlwb2dyYXBoeSBzdGFjayAoYC0tZm9udC1zYW5zYCAvIGAtLWZvbnQtc2VyaWZgIC8gYC0tZm9udC1tb25vYCkuICovXG4gIHNldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJywgc3RhY2s6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBgLS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGB0b2xsZS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgc3RhY2sgZm9yIGEgZm9udCByb2xlIGZyb20gdGhlIGxpdmUgZG9jdW1lbnQuICovXG4gIGdldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tZm9udC0ke2tpbmR9YCkudHJpbSgpO1xuICB9XG5cbiAgLyoqIFNldCBsaWdodC9kYXJrIGV4cGxpY2l0bHkgKGEgZGlyZWN0aW9uYWwgY29tcGFuaW9uIHRvIGB0b2dnbGVUaGVtZWApLiAqL1xuICBzZXRBcHBlYXJhbmNlKG1vZGU6ICdsaWdodCcgfCAnZGFyaycsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgbW9kZSA9PT0gJ2RhcmsnID8gdGhpcy5lbmFibGVEYXJrTW9kZShwZXJzaXN0KSA6IHRoaXMuZGlzYWJsZURhcmtNb2RlKHBlcnNpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmV1dHJhbCBiYXNlLWNvbG9yIGZhbWlseSAoYmFja2dyb3VuZC9mb3JlZ3JvdW5kL2NhcmQvbXV0ZWQvYm9yZGVy4oCmKS5cbiAgICogQWNjZXB0cyBhIGZhbWlseSBpZDogYHppbmNgIHwgYHNsYXRlYCB8IGBncmF5YCB8IGBuZXV0cmFsYCB8IGBzdG9uZWAuXG4gICAqL1xuICBzZXRCYXNlQ29sb3IoYmFzZUlkOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5iYXNlU3R5bGVJZCwgZ2VuZXJhdGVCYXNlQ3NzKGJhc2VJZCkpO1xuICAgIGlmIChwZXJzaXN0KSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicsIGJhc2VJZCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjaGFydCBwYWxldHRlIGZyb20gYSBiYXNlIGhleDsgZGVyaXZlcyBgLS1jaGFydC0x4oCmNWAuICovXG4gIHNldENoYXJ0Q29sb3IoaGV4OiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5jaGFydFN0eWxlSWQsIGdlbmVyYXRlQ2hhcnRDc3MoaGV4KSk7XG4gICAgaWYgKHBlcnNpc3QpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1jaGFydC1jb2xvcicsIGhleCk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgY3VycmVudCBiYXNlLWNvbG9yIGZhbWlseSBpZCAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGJhc2VDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicpO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcnQgYmFzZSBjb2xvciAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGNoYXJ0Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gIH1cblxuICAvKiogVXBzZXJ0IGEga2V5ZWQgPHN0eWxlPiBlbGVtZW50IGluIDxoZWFkPiB3aXRoIHRoZSBnaXZlbiBDU1MgdGV4dC4gKi9cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZUJ5SWQoaWQ6IHN0cmluZywgY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgZWwuaWQgPSBpZDtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgZWwpO1xuICB9XG5cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzJywgcmFkaXVzKTtcbiAgICB0aGlzLnVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlQWxsUmFkaXVzVmFyaWFibGVzKHJhZGl1cyk7XG5cbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXJhZGl1cycsIHJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMoYmFzZVJhZGl1czogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gcmFkaXVzU2NhbGUoYmFzZVJhZGl1cyk7XG4gICAgaWYgKCFzY2FsZSkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHJhZGl1cyBmb3JtYXQ6ICR7YmFzZVJhZGl1c30uIFVzaW5nIGRlZmF1bHQgdmFsdWVzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgLS1yYWRpdXNgIGl0c2VsZiBpcyBzZXQgYnkgc2V0UmFkaXVzKCk7IGFwcGx5IHRoZSBkZXJpdmVkIHNjYWxlIGhlcmUuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgICAgaWYgKG5hbWUgPT09ICctLXJhZGl1cycpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIC8vIFJhZGl1cyBpcyByZWFkIGZyb20gdGhlIERPTSBoZXJlOyB0aGUgdG9rZW4gbWF0aCBsaXZlcyBpbiB1dGlscy9jb2xvci5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFJhZGl1cyA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yYWRpdXMnKS50cmltKCkgfHwgJzAuNXJlbSc7XG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGdlbmVyYXRlVGhlbWVDc3MoYmFzZUNvbG9yLCBjdXJyZW50UmFkaXVzKSk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSBoZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKHJnYikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICctLXByaW1hcnknLFxuICAgICAgICBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicsIGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFRoZW1lKCk6ICdkYXJrJyB8ICdsaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBnZXQgaXNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgY29uc3QgcmdiUGFydHMgPSBjc3NWYWx1ZS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICAgICAgaWYgKHJnYlBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCMke3JnYlBhcnRzWzBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1syXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICB9XG5cbiAgcmVzZXRUb0NvbmZpZ0RlZmF1bHRzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIGdldFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKSxcbiAgICAgIHByaW1hcnlDb2xvcjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKSxcbiAgICAgIHJhZGl1czogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyVXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBQ1gsUUFBUSxFQUdSLG1CQUFtQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczRyxNQUFNLE9BQU8sWUFBWTtJQVVLO0lBQ0c7SUFDYTtJQVhwQyxRQUFRLENBQVk7SUFDcEIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXJDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztJQUNoQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBRTNDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxl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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3QsXG4gIFBMQVRGT1JNX0lELFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBSZW5kZXJlckZhY3RvcnkyLFxuICBSZW5kZXJlclN0eWxlRmxhZ3MyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVE9MTEVfQ09ORklHLCBUb2xsZUNvbmZpZyB9IGZyb20gJy4vdG9sbGUtY29uZmlnJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaGV4VG9SZ2IsIHJhZGl1c1NjYWxlLCBnZW5lcmF0ZVRoZW1lQ3NzLCBnZW5lcmF0ZUJhc2VDc3MsIGdlbmVyYXRlQ2hhcnRDc3MgfSBmcm9tICcuL3V0aWxzL2NvbG9yJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG4gIHByaXZhdGUgYmFzZVN0eWxlSWQgPSAndG9sbGUtYmFzZS10aGVtZSc7XG4gIHByaXZhdGUgY2hhcnRTdHlsZUlkID0gJ3RvbGxlLWNoYXJ0LXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIC8vIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICBsZXQgc2hvdWxkQmVEYXJrID0gc3lzdGVtUHJlZmVyc0Rhcms7XG5cbiAgICBpZiAoc2F2ZWRUaGVtZSkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gdGhpcy5jb25maWcuZGFya0J5RGVmYXVsdDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSBtb2RlXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBQcmltYXJ5IENvbG9yXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBSYWRpdXNcbiAgICBpZiAoc2F2ZWRSYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHNhdmVkUmFkaXVzLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyh0aGlzLmNvbmZpZy5yYWRpdXMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBCYXNlIChuZXV0cmFsKSBjb2xvciAoc2F2ZWQgPiBjb25maWcgPiB0aGVtZS5jc3MgZGVmYXVsdCA9IHppbmMpXG4gICAgY29uc3Qgc2F2ZWRCYXNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWJhc2UtY29sb3InKTtcbiAgICBpZiAoc2F2ZWRCYXNlKSB7XG4gICAgICB0aGlzLnNldEJhc2VDb2xvcihzYXZlZEJhc2UsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5iYXNlQ29sb3IpIHtcbiAgICAgIHRoaXMuc2V0QmFzZUNvbG9yKHRoaXMuY29uZmlnLmJhc2VDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IENoYXJ0IGNvbG9yIChzYXZlZCA+IGNvbmZpZylcbiAgICBjb25zdCBzYXZlZENoYXJ0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gICAgaWYgKHNhdmVkQ2hhcnQpIHtcbiAgICAgIHRoaXMuc2V0Q2hhcnRDb2xvcihzYXZlZENoYXJ0LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uY2hhcnRDb2xvcikge1xuICAgICAgdGhpcy5zZXRDaGFydENvbG9yKHRoaXMuY29uZmlnLmNoYXJ0Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBUeXBvZ3JhcGh5IChzYXZlZCBwcmVmZXJlbmNlID4gY29uZmlnIGRlZmF1bHQgPiB0aGVtZS5jc3MgZGVmYXVsdClcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWydzYW5zJywgJ3NlcmlmJywgJ21vbm8nXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgdG9sbGUtZm9udC0ke2tpbmR9YCk7XG4gICAgICBjb25zdCBmcm9tQ29uZmlnID0gdGhpcy5jb25maWc/LltgZm9udCR7a2luZFswXS50b1VwcGVyQ2FzZSgpfSR7a2luZC5zbGljZSgxKX1gIGFzICdmb250U2FucycgfCAnZm9udFNlcmlmJyB8ICdmb250TW9ubyddO1xuICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBzYXZlZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChmcm9tQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBmcm9tQ29uZmlnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXRzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBgUmVuZGVyZXIyLnNldFN0eWxlKGVsLCAnLS14JywgdilgIHdpdGhvdXQgYERhc2hDYXNlYCBjb21waWxlcyB0b1xuICAgKiBgZWwuc3R5bGVbJy0teCddID0gdmAsIHdoaWNoIGlzIGEgc2lsZW50IG5vLW9wIGZvciBjdXN0b20gcHJvcGVydGllcyDigJQgdGhlXG4gICAqIHRoZW1lIGNvbnRyb2wgYXBwZWFycyB0byB3b3JrIGFuZCBzaW1wbHkgY2hhbmdlcyBub3RoaW5nLiBFdmVyeSBjdXN0b21cbiAgICogcHJvcGVydHkgZ29lcyB0aHJvdWdoIGhlcmUgc28gbm8gY2FsbCBzaXRlIGNhbiBmb3JnZXQgdGhlIGZsYWcuXG4gICAqL1xuICBwcml2YXRlIHNldENzc1ZhcihlbDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWwsIG5hbWUsIHZhbHVlLCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKTtcbiAgfVxuXG4gIC8qKiBTZXQgYSB0eXBvZ3JhcGh5IHN0YWNrIChgLS1mb250LXNhbnNgIC8gYC0tZm9udC1zZXJpZmAgLyBgLS1mb250LW1vbm9gKS4gKi9cbiAgc2V0Rm9udChraW5kOiAnc2FucycgfCAnc2VyaWYnIHwgJ21vbm8nLCBzdGFjazogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0Q3NzVmFyKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBgLS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGB0b2xsZS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgc3RhY2sgZm9yIGEgZm9udCByb2xlIGZyb20gdGhlIGxpdmUgZG9jdW1lbnQuICovXG4gIGdldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tZm9udC0ke2tpbmR9YCkudHJpbSgpO1xuICB9XG5cbiAgLyoqIFNldCBsaWdodC9kYXJrIGV4cGxpY2l0bHkgKGEgZGlyZWN0aW9uYWwgY29tcGFuaW9uIHRvIGB0b2dnbGVUaGVtZWApLiAqL1xuICBzZXRBcHBlYXJhbmNlKG1vZGU6ICdsaWdodCcgfCAnZGFyaycsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgbW9kZSA9PT0gJ2RhcmsnID8gdGhpcy5lbmFibGVEYXJrTW9kZShwZXJzaXN0KSA6IHRoaXMuZGlzYWJsZURhcmtNb2RlKHBlcnNpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmV1dHJhbCBiYXNlLWNvbG9yIGZhbWlseSAoYmFja2dyb3VuZC9mb3JlZ3JvdW5kL2NhcmQvbXV0ZWQvYm9yZGVy4oCmKS5cbiAgICogQWNjZXB0cyBhIGZhbWlseSBpZDogYHppbmNgIHwgYHNsYXRlYCB8IGBncmF5YCB8IGBuZXV0cmFsYCB8IGBzdG9uZWAuXG4gICAqL1xuICBzZXRCYXNlQ29sb3IoYmFzZUlkOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5iYXNlU3R5bGVJZCwgZ2VuZXJhdGVCYXNlQ3NzKGJhc2VJZCkpO1xuICAgIGlmIChwZXJzaXN0KSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicsIGJhc2VJZCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjaGFydCBwYWxldHRlIGZyb20gYSBiYXNlIGhleDsgZGVyaXZlcyBgLS1jaGFydC0x4oCmNWAuICovXG4gIHNldENoYXJ0Q29sb3IoaGV4OiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5jaGFydFN0eWxlSWQsIGdlbmVyYXRlQ2hhcnRDc3MoaGV4KSk7XG4gICAgaWYgKHBlcnNpc3QpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1jaGFydC1jb2xvcicsIGhleCk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgY3VycmVudCBiYXNlLWNvbG9yIGZhbWlseSBpZCAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGJhc2VDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicpO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcnQgYmFzZSBjb2xvciAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGNoYXJ0Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gIH1cblxuICAvKiogVXBzZXJ0IGEga2V5ZWQgPHN0eWxlPiBlbGVtZW50IGluIDxoZWFkPiB3aXRoIHRoZSBnaXZlbiBDU1MgdGV4dC4gKi9cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZUJ5SWQoaWQ6IHN0cmluZywgY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgZWwuaWQgPSBpZDtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgZWwpO1xuICB9XG5cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMuc2V0Q3NzVmFyKHJvb3QsICctLXJhZGl1cycsIHJhZGl1cyk7XG4gICAgdGhpcy51cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzKTtcbiAgICB0aGlzLnVwZGF0ZUFsbFJhZGl1c1ZhcmlhYmxlcyhyYWRpdXMpO1xuXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWxsUmFkaXVzVmFyaWFibGVzKGJhc2VSYWRpdXM6IHN0cmluZykge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBzY2FsZSA9IHJhZGl1c1NjYWxlKGJhc2VSYWRpdXMpO1xuICAgIGlmICghc2NhbGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCByYWRpdXMgZm9ybWF0OiAke2Jhc2VSYWRpdXN9LiBVc2luZyBkZWZhdWx0IHZhbHVlcy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYC0tcmFkaXVzYCBpdHNlbGYgaXMgc2V0IGJ5IHNldFJhZGl1cygpOyBhcHBseSB0aGUgZGVyaXZlZCBzY2FsZSBoZXJlLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2FsZSkpIHtcbiAgICAgIGlmIChuYW1lID09PSAnLS1yYWRpdXMnKSBjb250aW51ZTtcbiAgICAgIHRoaXMuc2V0Q3NzVmFyKHJvb3QsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXM6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgbGV0IGNzcyA9IGV4aXN0aW5nU3R5bGUudGV4dENvbnRlbnQgfHwgJyc7XG5cbiAgICAgIC8vIFBhcnNlIHRoZSByYWRpdXMgdG8gY2FsY3VsYXRlIGRlcml2ZWQgdmFsdWVzXG4gICAgICBjb25zdCByYWRpdXNNYXRjaCA9IHJhZGl1cy5tYXRjaCgvXihcXGQqXFwuP1xcZCspKFthLXpdK3wlKSQvKTtcbiAgICAgIGlmIChyYWRpdXNNYXRjaCkge1xuICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSBwYXJzZUZsb2F0KHJhZGl1c01hdGNoWzFdKTtcbiAgICAgICAgY29uc3QgdW5pdCA9IHJhZGl1c01hdGNoWzJdO1xuXG4gICAgICAgIGNvbnN0IGRlcml2ZWRSYWRpaSA9IHtcbiAgICAgICAgICAnLS1yYWRpdXMtc20nOiBgJHtudW1lcmljVmFsdWUgKiAwLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLW1kJzogYCR7bnVtZXJpY1ZhbHVlfSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1sZyc6IGAke251bWVyaWNWYWx1ZSAqIDEuNX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMteGwnOiBgJHtudW1lcmljVmFsdWUgKiAyfSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy0yeGwnOiBgJHtudW1lcmljVmFsdWUgKiAzfSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy0zeGwnOiBgJHtudW1lcmljVmFsdWUgKiA0fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1mdWxsJzogJzk5OTlweCdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVcGRhdGUgYmFzZSByYWRpdXNcbiAgICAgICAgaWYgKGNzcy5pbmNsdWRlcygnLS1yYWRpdXM6JykpIHtcbiAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvLS1yYWRpdXM6W147XSs7L2csIGAtLXJhZGl1czogJHtyYWRpdXN9O2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGFsbCBkZXJpdmVkIHJhZGl1cyB2YXJpYWJsZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZGVyaXZlZFJhZGlpKS5mb3JFYWNoKChbdmFyTmFtZSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgaWYgKGNzcy5pbmNsdWRlcyh2YXJOYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAke3Zhck5hbWV9OlteO10rO2AsICdnJyk7XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZShyZWdleCwgYCR7dmFyTmFtZX06ICR7dmFsdWV9O2ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHZhcmlhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgIGNzcyA9IGNzcy5yZXBsYWNlKC86cm9vdFxccyp7LywgYDpyb290IHtcXG4gICAgICAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGJhc2VDb2xvcjogc3RyaW5nKSB7XG4gICAgLy8gUmFkaXVzIGlzIHJlYWQgZnJvbSB0aGUgRE9NIGhlcmU7IHRoZSB0b2tlbiBtYXRoIGxpdmVzIGluIHV0aWxzL2NvbG9yLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50UmFkaXVzID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJhZGl1cycpLnRyaW0oKSB8fCAnMC41cmVtJztcbiAgICB0aGlzLmluamVjdER5bmFtaWNTdHlsZXMoZ2VuZXJhdGVUaGVtZUNzcyhiYXNlQ29sb3IsIGN1cnJlbnRSYWRpdXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0RHluYW1pY1N0eWxlcyhjc3M6IHN0cmluZykge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhpc3RpbmdTdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdHlsZUlkKTtcbiAgICBpZiAoZXhpc3RpbmdTdHlsZSkge1xuICAgICAgZXhpc3RpbmdTdHlsZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmlkID0gdGhpcy5zdHlsZUlkO1xuICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgc3R5bGVFbGVtZW50KTtcbiAgfVxuXG4gIHRvZ2dsZVRoZW1lKCkge1xuICAgIGNvbnN0IGlzQ3VycmVudGx5RGFyayA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGFyaycpO1xuICAgIGlzQ3VycmVudGx5RGFyayA/IHRoaXMuZGlzYWJsZURhcmtNb2RlKCkgOiB0aGlzLmVuYWJsZURhcmtNb2RlKCk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZURhcmtNb2RlKHNhdmVUb1N0b3JhZ2UgPSB0cnVlKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2RhcmsnKTtcbiAgICBpZiAoc2F2ZVRvU3RvcmFnZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXRoZW1lJywgJ2RhcmsnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdsaWdodCcpO1xuICAgIH1cbiAgICB0aGlzLl9pc0RhcmsubmV4dChmYWxzZSk7XG4gIH1cblxuICBzZXRQcmltYXJ5Q29sb3IoY29sb3I6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuZ2VuZXJhdGVQcmltYXJ5U2hhZGVzKGNvbG9yKTtcblxuICAgIGNvbnN0IHJnYiA9IGhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnNldENzc1Zhcih0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJy0tcHJpbWFyeScsIGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWApO1xuICAgIH1cblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicsIGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFRoZW1lKCk6ICdkYXJrJyB8ICdsaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBnZXQgaXNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgY29uc3QgcmdiUGFydHMgPSBjc3NWYWx1ZS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICAgICAgaWYgKHJnYlBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCMke3JnYlBhcnRzWzBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1syXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICB9XG5cbiAgcmVzZXRUb0NvbmZpZ0RlZmF1bHRzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIGdldFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKSxcbiAgICAgIHByaW1hcnlDb2xvcjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKSxcbiAgICAgIHJhZGl1czogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyVXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19