@coreui/angular-pro 4.5.6 → 4.5.8

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 (247) hide show
  1. package/README.md +11 -1
  2. package/esm2022/lib/accordion/accordion/accordion.component.mjs +3 -3
  3. package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +3 -3
  4. package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +3 -3
  5. package/esm2022/lib/accordion/accordion.module.mjs +4 -4
  6. package/esm2022/lib/accordion/accordion.service.mjs +3 -3
  7. package/esm2022/lib/alert/alert-heading.directive.mjs +3 -3
  8. package/esm2022/lib/alert/alert-link.directive.mjs +3 -3
  9. package/esm2022/lib/alert/alert.component.mjs +3 -3
  10. package/esm2022/lib/alert/alert.module.mjs +4 -4
  11. package/esm2022/lib/avatar/avatar.component.mjs +3 -3
  12. package/esm2022/lib/avatar/avatar.module.mjs +4 -4
  13. package/esm2022/lib/backdrop/backdrop.service.mjs +3 -3
  14. package/esm2022/lib/badge/badge.component.mjs +3 -3
  15. package/esm2022/lib/badge/badge.module.mjs +4 -4
  16. package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +3 -3
  17. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +3 -3
  18. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +3 -3
  19. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +3 -3
  20. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +4 -4
  21. package/esm2022/lib/button/button-close.directive.mjs +3 -3
  22. package/esm2022/lib/button/button.directive.mjs +3 -3
  23. package/esm2022/lib/button/button.module.mjs +4 -4
  24. package/esm2022/lib/button-group/button-group/button-group.component.mjs +3 -3
  25. package/esm2022/lib/button-group/button-group.module.mjs +4 -4
  26. package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +3 -3
  27. package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +3 -3
  28. package/esm2022/lib/calendar/calendar/calendar.component.mjs +3 -3
  29. package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +3 -3
  30. package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +3 -3
  31. package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +3 -3
  32. package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +3 -3
  33. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +3 -3
  34. package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +3 -3
  35. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +3 -3
  36. package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +3 -3
  37. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +3 -3
  38. package/esm2022/lib/calendar/calendar.module.mjs +4 -4
  39. package/esm2022/lib/calendar/calendar.service.mjs +3 -3
  40. package/esm2022/lib/callout/callout.component.mjs +3 -3
  41. package/esm2022/lib/callout/callout.module.mjs +4 -4
  42. package/esm2022/lib/card/card-body.component.mjs +3 -3
  43. package/esm2022/lib/card/card-footer.component.mjs +3 -3
  44. package/esm2022/lib/card/card-group.component.mjs +3 -3
  45. package/esm2022/lib/card/card-header-actions.component.mjs +3 -3
  46. package/esm2022/lib/card/card-header.component.mjs +3 -3
  47. package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +3 -3
  48. package/esm2022/lib/card/card-img.directive.mjs +3 -3
  49. package/esm2022/lib/card/card-link.directive.mjs +3 -3
  50. package/esm2022/lib/card/card-subtitle.directive.mjs +3 -3
  51. package/esm2022/lib/card/card-text.directive.mjs +3 -3
  52. package/esm2022/lib/card/card-title.directive.mjs +3 -3
  53. package/esm2022/lib/card/card.component.mjs +3 -3
  54. package/esm2022/lib/card/card.module.mjs +4 -4
  55. package/esm2022/lib/carousel/carousel/carousel.component.mjs +3 -3
  56. package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +3 -3
  57. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +3 -3
  58. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +3 -3
  59. package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +3 -3
  60. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +3 -3
  61. package/esm2022/lib/carousel/carousel-state.mjs +3 -3
  62. package/esm2022/lib/carousel/carousel.config.mjs +3 -3
  63. package/esm2022/lib/carousel/carousel.module.mjs +4 -4
  64. package/esm2022/lib/carousel/carousel.service.mjs +3 -3
  65. package/esm2022/lib/collapse/collapse.directive.mjs +3 -3
  66. package/esm2022/lib/collapse/collapse.module.mjs +4 -4
  67. package/esm2022/lib/date-picker/date-picker.component.mjs +3 -3
  68. package/esm2022/lib/date-picker/date-picker.module.mjs +4 -4
  69. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +3 -3
  70. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +4 -4
  71. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +6 -6
  72. package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +3 -3
  73. package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +3 -3
  74. package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +3 -3
  75. package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +3 -3
  76. package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +3 -3
  77. package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +3 -3
  78. package/esm2022/lib/dropdown/dropdown.module.mjs +4 -4
  79. package/esm2022/lib/dropdown/dropdown.service.mjs +3 -3
  80. package/esm2022/lib/element-cover/element-cover.component.mjs +3 -3
  81. package/esm2022/lib/element-cover/element-cover.module.mjs +4 -4
  82. package/esm2022/lib/footer/footer.component.mjs +3 -3
  83. package/esm2022/lib/footer/footer.module.mjs +4 -4
  84. package/esm2022/lib/form/form/form.directive.mjs +3 -3
  85. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +3 -3
  86. package/esm2022/lib/form/form-check/form-check-label.directive.mjs +3 -3
  87. package/esm2022/lib/form/form-check/form-check.component.mjs +3 -3
  88. package/esm2022/lib/form/form-control/form-control.directive.mjs +3 -3
  89. package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +3 -3
  90. package/esm2022/lib/form/form-floating/form-floating.directive.mjs +3 -3
  91. package/esm2022/lib/form/form-label/form-label.directive.mjs +3 -3
  92. package/esm2022/lib/form/form-select/form-select.directive.mjs +3 -3
  93. package/esm2022/lib/form/form-text/form-text.directive.mjs +3 -3
  94. package/esm2022/lib/form/form.module.mjs +4 -4
  95. package/esm2022/lib/form/input-group/input-group.component.mjs +3 -3
  96. package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +3 -3
  97. package/esm2022/lib/grid/col.component.mjs +3 -3
  98. package/esm2022/lib/grid/col.directive.mjs +3 -3
  99. package/esm2022/lib/grid/container.component.mjs +3 -3
  100. package/esm2022/lib/grid/grid.module.mjs +4 -4
  101. package/esm2022/lib/grid/gutter.directive.mjs +3 -3
  102. package/esm2022/lib/grid/row.component.mjs +3 -3
  103. package/esm2022/lib/grid/row.directive.mjs +3 -3
  104. package/esm2022/lib/header/header/header.component.mjs +3 -3
  105. package/esm2022/lib/header/header-brand/header-brand.component.mjs +3 -3
  106. package/esm2022/lib/header/header-divider/header-divider.component.mjs +3 -3
  107. package/esm2022/lib/header/header-nav/header-nav.component.mjs +3 -3
  108. package/esm2022/lib/header/header-text/header-text.component.mjs +3 -3
  109. package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +3 -3
  110. package/esm2022/lib/header/header.module.mjs +4 -4
  111. package/esm2022/lib/image/img.directive.mjs +3 -3
  112. package/esm2022/lib/image/img.module.mjs +4 -4
  113. package/esm2022/lib/list-group/list-group-item.directive.mjs +3 -3
  114. package/esm2022/lib/list-group/list-group.directive.mjs +3 -3
  115. package/esm2022/lib/list-group/list-group.module.mjs +4 -4
  116. package/esm2022/lib/loading-button/loading-button.component.mjs +3 -3
  117. package/esm2022/lib/loading-button/loading-button.module.mjs +4 -4
  118. package/esm2022/lib/modal/modal/modal.component.mjs +3 -3
  119. package/esm2022/lib/modal/modal-body/modal-body.component.mjs +3 -3
  120. package/esm2022/lib/modal/modal-content/modal-content.component.mjs +3 -3
  121. package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +3 -3
  122. package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +3 -3
  123. package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +3 -3
  124. package/esm2022/lib/modal/modal-header/modal-header.component.mjs +3 -3
  125. package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +3 -3
  126. package/esm2022/lib/modal/modal.module.mjs +4 -4
  127. package/esm2022/lib/modal/modal.service.mjs +3 -3
  128. package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +3 -3
  129. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +8 -7
  130. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +3 -3
  131. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +3 -3
  132. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +3 -3
  133. package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +68 -99
  134. package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +5 -5
  135. package/esm2022/lib/multi-select/multi-select.module.mjs +4 -4
  136. package/esm2022/lib/multi-select/multi-select.service.mjs +3 -3
  137. package/esm2022/lib/nav/nav-item.component.mjs +3 -3
  138. package/esm2022/lib/nav/nav-link.directive.mjs +3 -3
  139. package/esm2022/lib/nav/nav.component.mjs +3 -3
  140. package/esm2022/lib/nav/nav.module.mjs +4 -4
  141. package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +3 -3
  142. package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +3 -3
  143. package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +3 -3
  144. package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +3 -3
  145. package/esm2022/lib/navbar/navbar.component.mjs +3 -3
  146. package/esm2022/lib/navbar/navbar.module.mjs +4 -4
  147. package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +3 -3
  148. package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +3 -3
  149. package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +3 -3
  150. package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +3 -3
  151. package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +3 -3
  152. package/esm2022/lib/offcanvas/offcanvas.module.mjs +4 -4
  153. package/esm2022/lib/offcanvas/offcanvas.service.mjs +3 -3
  154. package/esm2022/lib/pagination/page-item/page-item.component.mjs +3 -3
  155. package/esm2022/lib/pagination/page-item/page-item.directive.mjs +4 -4
  156. package/esm2022/lib/pagination/page-link/page-link.directive.mjs +3 -3
  157. package/esm2022/lib/pagination/pagination/pagination.component.mjs +3 -3
  158. package/esm2022/lib/pagination/pagination.module.mjs +4 -4
  159. package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +3 -3
  160. package/esm2022/lib/placeholder/placeholder.directive.mjs +3 -3
  161. package/esm2022/lib/placeholder/placeholder.module.mjs +4 -4
  162. package/esm2022/lib/popover/popover/popover.component.mjs +3 -3
  163. package/esm2022/lib/popover/popover.directive.mjs +3 -3
  164. package/esm2022/lib/popover/popover.module.mjs +4 -4
  165. package/esm2022/lib/progress/progress-bar.component.mjs +3 -3
  166. package/esm2022/lib/progress/progress.component.mjs +3 -3
  167. package/esm2022/lib/progress/progress.module.mjs +4 -4
  168. package/esm2022/lib/services/class-toggle.service.mjs +3 -3
  169. package/esm2022/lib/services/intersection.service.mjs +3 -3
  170. package/esm2022/lib/services/listeners.service.mjs +3 -3
  171. package/esm2022/lib/shared/html-attr.directive.mjs +3 -3
  172. package/esm2022/lib/shared/shared.module.mjs +4 -4
  173. package/esm2022/lib/shared/template-id.directive.mjs +3 -3
  174. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +3 -3
  175. package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +3 -3
  176. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +3 -3
  177. package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +3 -3
  178. package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
  179. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +3 -3
  180. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +3 -3
  181. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +3 -3
  182. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +3 -3
  183. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +3 -3
  184. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +3 -3
  185. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +6 -6
  186. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +3 -3
  187. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +3 -3
  188. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +6 -6
  189. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +6 -6
  190. package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +3 -3
  191. package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.component.mjs +3 -3
  192. package/esm2022/lib/sidebar/sidebar.module.mjs +4 -4
  193. package/esm2022/lib/sidebar/sidebar.service.mjs +3 -3
  194. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +3 -3
  195. package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +4 -4
  196. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +3 -3
  197. package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +3 -3
  198. package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +3 -3
  199. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +3 -3
  200. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +3 -3
  201. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +3 -3
  202. package/esm2022/lib/smart-table/smart-table.module.mjs +4 -4
  203. package/esm2022/lib/spinner/spinner.component.mjs +3 -3
  204. package/esm2022/lib/spinner/spinner.module.mjs +4 -4
  205. package/esm2022/lib/table/table-active.directive.mjs +3 -3
  206. package/esm2022/lib/table/table-color.directive.mjs +3 -3
  207. package/esm2022/lib/table/table.directive.mjs +3 -3
  208. package/esm2022/lib/table/table.module.mjs +4 -4
  209. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +3 -3
  210. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +3 -3
  211. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +3 -3
  212. package/esm2022/lib/tabs/tab.service.mjs +3 -3
  213. package/esm2022/lib/tabs/tabs.module.mjs +4 -4
  214. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +6 -6
  215. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +6 -6
  216. package/esm2022/lib/time-picker/time-picker.component.mjs +3 -3
  217. package/esm2022/lib/time-picker/time-picker.module.mjs +4 -4
  218. package/esm2022/lib/toast/toast/toast.component.mjs +37 -59
  219. package/esm2022/lib/toast/toast-body/toast-body.component.mjs +3 -3
  220. package/esm2022/lib/toast/toast-close.directive.mjs +3 -3
  221. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +3 -3
  222. package/esm2022/lib/toast/toast.module.mjs +4 -4
  223. package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +3 -3
  224. package/esm2022/lib/toast/toaster/toaster.component.mjs +22 -28
  225. package/esm2022/lib/toast/toaster/toaster.service.mjs +3 -3
  226. package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +3 -3
  227. package/esm2022/lib/tooltip/tooltip.directive.mjs +3 -3
  228. package/esm2022/lib/tooltip/tooltip.module.mjs +4 -4
  229. package/esm2022/lib/utilities/align.directive.mjs +3 -3
  230. package/esm2022/lib/utilities/bg-color.directive.mjs +3 -3
  231. package/esm2022/lib/utilities/border.directive.mjs +3 -3
  232. package/esm2022/lib/utilities/rounded.directive.mjs +3 -3
  233. package/esm2022/lib/utilities/text-color.directive.mjs +3 -3
  234. package/esm2022/lib/utilities/utilities.module.mjs +4 -4
  235. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +3 -3
  236. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +3 -3
  237. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +3 -3
  238. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +3 -3
  239. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +3 -3
  240. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +3 -3
  241. package/esm2022/lib/widget/widget.module.mjs +4 -4
  242. package/fesm2022/coreui-angular-pro.mjs +899 -957
  243. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  244. package/lib/multi-select/multi-select-option/multi-select-option.component.d.ts +1 -2
  245. package/lib/toast/toast/toast.component.d.ts +2 -7
  246. package/lib/toast/toaster/toaster.component.d.ts +4 -6
  247. package/package.json +1 -1
@@ -191,6 +191,7 @@ export class MultiSelectComponent {
191
191
  this._subtreeFocused = this.focusOrigin(null);
192
192
  this.activeOption = null;
193
193
  this.differ = this.iterableDiffers.find(this.#value).create();
194
+ this.multiSelectService.setSelectionModel(this.multiple);
194
195
  }
195
196
  #destroy$;
196
197
  #optionsReady$;
@@ -259,6 +260,7 @@ export class MultiSelectComponent {
259
260
  */
260
261
  set multiple(value) {
261
262
  this._multiple = coerceBooleanProperty(value);
263
+ this.multiSelectService.setSelectionModel(this._multiple);
262
264
  }
263
265
  get multiple() {
264
266
  return this._multiple;
@@ -530,7 +532,6 @@ export class MultiSelectComponent {
530
532
  return !!origin;
531
533
  }
532
534
  ngOnInit() {
533
- this.multiSelectService.setSelectionModel(this.multiple);
534
535
  this.multiSelectService.selectionModel.changed
535
536
  .pipe(filter(() => !this.multiple), delay(0), tap(change => {
536
537
  if (change.added.length) {
@@ -956,15 +957,15 @@ export class MultiSelectComponent {
956
957
  }
957
958
  this.activeOption = this.listKeyManager?.activeItem ?? null;
958
959
  }
959
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.FocusMonitor }, { token: i2.MultiSelectService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
960
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: MultiSelectComponent, isStandalone: true, selector: "c-multi-select", inputs: { allowCreateOptions: "allowCreateOptions", cleaner: "cleaner", disabled: "disabled", loading: "loading", multiple: "multiple", nativeFormId: "nativeFormId", nativeId: "nativeId", nativeName: "nativeName", options: "options", optionsMaxHeight: "optionsMaxHeight", optionsStyle: "optionsStyle", placeholder: "placeholder", search: "search", searchNoResultsLabel: "searchNoResultsLabel", searchValue: "searchValue", selectAll: "selectAll", selectAllLabel: "selectAllLabel", selectionType: "selectionType", selectionTypeCounterText: "selectionTypeCounterText", selectionTypeCounterTextPluralMap: "selectionTypeCounterTextPluralMap", size: "size", value: "value", valid: "valid", virtualScroller: "virtualScroller", visibleItems: "visibleItems", itemSize: "itemSize", itemMinWidth: "itemMinWidth", visible: "visible", popperjsOptions: ["popperOptions", "popperjsOptions"] }, outputs: { searchValueChange: "searchValueChange", valueChange: "valueChange", visibleChange: "visibleChange" }, host: { listeners: { "keyup": "onKeyUp($event)", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "this.hostClasses", "attr.aria-multiselectable": "this.ariaMultiSelectable", "attr.aria-expanded": "this.ariaExpanded", "attr.tabindex": "this.tabIndex" } }, providers: [
960
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.FocusMonitor }, { token: i2.MultiSelectService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
961
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: MultiSelectComponent, isStandalone: true, selector: "c-multi-select", inputs: { allowCreateOptions: "allowCreateOptions", cleaner: "cleaner", disabled: "disabled", loading: "loading", multiple: "multiple", nativeFormId: "nativeFormId", nativeId: "nativeId", nativeName: "nativeName", options: "options", optionsMaxHeight: "optionsMaxHeight", optionsStyle: "optionsStyle", placeholder: "placeholder", search: "search", searchNoResultsLabel: "searchNoResultsLabel", searchValue: "searchValue", selectAll: "selectAll", selectAllLabel: "selectAllLabel", selectionType: "selectionType", selectionTypeCounterText: "selectionTypeCounterText", selectionTypeCounterTextPluralMap: "selectionTypeCounterTextPluralMap", size: "size", value: "value", valid: "valid", virtualScroller: "virtualScroller", visibleItems: "visibleItems", itemSize: "itemSize", itemMinWidth: "itemMinWidth", visible: "visible", popperjsOptions: ["popperOptions", "popperjsOptions"] }, outputs: { searchValueChange: "searchValueChange", valueChange: "valueChange", visibleChange: "visibleChange" }, host: { listeners: { "keyup": "onKeyUp($event)", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "this.hostClasses", "attr.aria-multiselectable": "this.ariaMultiSelectable", "attr.aria-expanded": "this.ariaExpanded", "attr.tabindex": "this.tabIndex" } }, providers: [
961
962
  MultiSelectService,
962
963
  {
963
964
  provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiSelectComponent), multi: true
964
965
  }
965
- ], queries: [{ propertyName: "multiSelectOptionsContent", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "optionsElementRef", first: true, predicate: ["options"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true, read: ElementRef }, { propertyName: "multiSelectOptionsView", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "scrollViewportView", predicate: ["scrollViewport"], descendants: true }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label ?? option.value\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"(visibleOptions() && options.length > 0) || loading\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n tabindex=\"0\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n <ng-template [ngIf]=\"loading\">\n <c-element-cover [ngStyle]=\"{'border-radius': '6px', 'z-index': 2}\" />\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n class=\"form-multi-select-options\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: I18nPluralPipe, name: "i18nPlural" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option", "disabled", "label", "value"], outputs: ["remove"] }, { kind: "component", type: MultiSelectOptionComponent, selector: "c-multi-select-option", inputs: ["optionsStyle", "label", "text", "visible", "disabled", "selected", "value", "active", "role"], outputs: ["selectedChange", "focusChange"], exportAs: ["cMultiSelectOption"] }, { kind: "directive", type: MultiSelectSearchDirective, selector: "[cMultiSelectSearch]", inputs: ["delay", "value"], outputs: ["valueChange"], exportAs: ["cMultiSelectSearch"] }, { kind: "component", type: DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }] }); }
966
+ ], queries: [{ propertyName: "multiSelectOptionsContent", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "optionsElementRef", first: true, predicate: ["options"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }, { propertyName: "dropdownToggle", first: true, predicate: DropdownToggleDirective, descendants: true, read: ElementRef }, { propertyName: "multiSelectOptionsView", predicate: MultiSelectOptionComponent, descendants: true }, { propertyName: "scrollViewportView", predicate: ["scrollViewport"], descendants: true }], exportAs: ["cMultiSelect"], usesOnChanges: true, ngImport: i0, template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label ?? option.value\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"(visibleOptions() && options.length > 0) || loading\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n tabindex=\"0\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n <ng-template [ngIf]=\"loading\">\n <c-element-cover [ngStyle]=\"{'border-radius': '6px', 'z-index': 2}\" />\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n class=\"form-multi-select-options\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: I18nPluralPipe, name: "i18nPlural" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MultiSelectTagComponent, selector: "c-multi-select-tag", inputs: ["option", "disabled", "label", "value"], outputs: ["remove"] }, { kind: "component", type: MultiSelectOptionComponent, selector: "c-multi-select-option", inputs: ["optionsStyle", "label", "text", "visible", "disabled", "selected", "value", "active", "role"], outputs: ["selectedChange", "focusChange"], exportAs: ["cMultiSelectOption"] }, { kind: "directive", type: MultiSelectSearchDirective, selector: "[cMultiSelectSearch]", inputs: ["delay", "value"], outputs: ["valueChange"], exportAs: ["cMultiSelectSearch"] }, { kind: "component", type: DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "component", type: ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }] }); }
966
967
  }
967
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: MultiSelectComponent, decorators: [{
968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: MultiSelectComponent, decorators: [{
968
969
  type: Component,
969
970
  args: [{ selector: 'c-multi-select', exportAs: 'cMultiSelect', providers: [
970
971
  MultiSelectService,
@@ -990,7 +991,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
990
991
  DropdownToggleDirective,
991
992
  DropdownMenuDirective,
992
993
  ElementCoverComponent
993
- ], template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label ?? option.value\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"(visibleOptions() && options.length > 0) || loading\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n tabindex=\"0\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n <ng-template [ngIf]=\"loading\">\n <c-element-cover [ngStyle]=\"{'border-radius': '6px', 'z-index': 2}\" />\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n class=\"form-multi-select-options\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"] }]
994
+ ], template: "<c-dropdown #dropdown=\"cDropdown\"\n [(visible)]=\"visible\"\n [autoClose]=\"'outside'\"\n [ngClass]=\"multiselectClasses\"\n [popperOptions]=\"popperjsOptions\"\n class=\"picker\">\n <div #dropdownToggle=\"cDropdownToggle\" [caret]=\"false\" [disabled]=\"disabled\" cDropdownToggle>\n <div class=\"form-multi-select-selection\">\n <ng-template [ngIf]=\"selectionType === 'tags'\">\n <ng-container *ngIf=\"(optionsSelected$ | async) as optionTags\">\n <c-multi-select-tag\n (remove)=\"handleTagRemove($event)\"\n *ngFor=\"let option of optionTags; index as i\"\n [disabled]=\"option.disabled ?? false\"\n [label]=\"option.label ?? option.value\"\n [option]=\"option\"\n [value]=\"option.value\"\n class=\"form-multi-select-tag\"\n tabindex=\"-1\">\n </c-multi-select-tag>\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'text' && !!selectedOptionsText\">\n <span class=\"form-multi-select-search\">{{ selectedOptionsText }}</span>\n </ng-template>\n <ng-template [ngIf]=\"selectionType === 'counter'\">\n <span *ngIf=\"counterTextType === 'string'; else pluralMap\">{{ counterText }}</span>\n <ng-template #pluralMap>\n <span>{{selectedOptions.length}} {{ selectedOptions.length | i18nPlural: selectionTypeCounterTextPluralMap ?? { other: counterText } }}</span>\n </ng-template>\n </ng-template>\n <!-- <ng-template [ngIf]=\"!search && selectedOptions.length === 0 && selectionType !== 'counter'\">-->\n <!-- <span class=\"form-multi-select-search\">{{ placeholder }}</span>-->\n <!-- </ng-template>-->\n </div>\n\n <input\n #inputElement\n (keydown)=\"handleSearchKeyDown($event)\"\n (valueChange)=\"handleSearchValueChange($event)\"\n [attr.placeholder]=\"optionsSelected.size === 0 && selectionType !== 'counter' ? placeholder : null\"\n [disabled]=\"disabled || !search\"\n [ngClass]=\"{ 'form-multi-select-search': true, disabled: (disabled || !search) }\"\n [ngModel]=\"searchValue\"\n [value]=\"searchValue\"\n autocomplete=\"off\"\n cMultiSelectSearch\n size=\"3\"\n tabindex=\"{{ disabled ? -1 : 0 }}\"\n type=\"text\"\n >\n\n <button\n (click)=\"clearAllOptions($event)\"\n *ngIf=\"cleaner && optionsSelected.size > 0 && !disabled\"\n [disabled]=\"disabled || !isDropdownVisible\"\n aria-label=\"Clear all\"\n class=\"form-multi-select-selection-cleaner\"\n ></button>\n </div>\n <div #dropdownMenu=\"cDropdownMenu\" *ngIf=\"!disabled\" [visible]=\"dropdown.visible\" cDropdownMenu>\n <ng-template [ngIfElse]=\"optionsEmpty\" [ngIf]=\"(visibleOptions() && options.length > 0) || loading\">\n <button (click)=\"selectAllOptions()\"\n *ngIf=\"selectAll && multiple && !virtualScroller\"\n class=\"form-multi-select-all\"\n tabindex=\"0\"\n >\n {{ selectAllLabel }}\n </button>\n <ng-container *ngTemplateOutlet=\"virtualScroller ? multiselectVirtualScroller : multiselectOptionsDiv\" />\n </ng-template>\n <ng-template #optionsEmpty>\n <div class=\"form-multi-select-options-empty\">{{ searchNoResultsLabel }}</div>\n </ng-template>\n <ng-template [ngIf]=\"loading\">\n <c-element-cover [ngStyle]=\"{'border-radius': '6px', 'z-index': 2}\" />\n </ng-template>\n </div>\n</c-dropdown>\n\n<ng-template #multiselectVirtualScroller>\n <cdk-virtual-scroll-viewport\n #scrollViewport\n (scrolledIndexChange)=\"handleScrolledIndexChange($event, scrollViewport)\"\n *ngIf=\"optionsArray$ | async as optionsArray\"\n [itemSize]=\"itemSize\"\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'height.px': optionsMaxHeight, 'maxHeight.px': optionsMaxHeight, 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden' } : { 'minWidth.px': itemMinWidth ?? 196, overflowX: 'hidden'}\"\n maxBufferPx=\"{{itemSize * visibleItems}}\"\n minBufferPx=\"{{itemSize * visibleItems}}\"\n class=\"form-multi-select-options\"\n >\n <ng-container\n #cdkVirtualFor\n *cdkVirtualFor=\"let option of optionsArray; trackBy: trackByFn; templateCacheSize: 0; even as even; odd as odd; index as index; count as count; first as first; last as last;\"\n [ngTemplateOutletContext]=\"{$implicit: option, even, odd, index, count, first, last}\"\n [ngTemplateOutlet]=\"templates['multiSelectOptionTemplate'] || defaultMultiSelectOptionTemplate\"\n >\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n</ng-template>\n\n<ng-template #multiselectOptionsDiv>\n <div\n [ngStyle]=\"optionsMaxHeight !== 'auto' ? { 'maxHeight.px': optionsMaxHeight, overflowY: 'scroll' } : {}\"\n class=\"form-multi-select-options\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n\n<ng-template #defaultMultiSelectOptionTemplate let-option>\n <c-multi-select-option\n [disabled]=\"option.disabled\"\n [label]=\"option.label\"\n [text]=\"option.text\"\n [value]=\"option.value\"\n [visible]=\"option.visible\"\n >\n {{option.text}}\n </c-multi-select-option>\n</ng-template>\n", styles: [":host{display:block}:host:focus-visible{outline:none}:host.cdk-focused:not(.disabled) .form-multi-select{color:var(--cui-form-multi-select-focus-color, rgba(44, 56, 74, .95));background-color:var(--cui-form-multi-select-focus-bg, #fff);border-color:var(--cui-form-multi-select-focus-border-color, #6557e4);box-shadow:0 0 0 .25rem #321fdb40}:host:not(.cdk-focused) .form-multi-select:not(.show) input.form-multi-select-search:not([placeholder]){width:.1rem;margin-inline-start:0}:host .form-multi-select-search[size]{display:inline-block}:host .form-multi-select-selection-tags .form-multi-select-search{height:1.5rem}:host ::ng-deep .cdk-virtual-scroll-content-wrapper{padding:var(--cui-form-multi-select-options-padding-y) var(--cui-form-multi-select-options-padding-x);font-size:1rem;color:var(--cui-form-multi-select-options-color)}:host .cdk-virtual-scroll-viewport{width:var(--cui-dropdown-min-width)}:host .dropdown-menu{--cui-dropdown-padding-y: 0}:host-context(.dark-theme)::ng-deep .form-multi-select-optgroup-label{color:var(--cui-form-multi-select-disabled-color)}\n"] }]
994
995
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i1.FocusMonitor }, { type: i2.MultiSelectService }, { type: i0.IterableDiffers }]; }, propDecorators: { allowCreateOptions: [{
995
996
  type: Input
996
997
  }], cleaner: [{
@@ -1105,4 +1106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
1105
1106
  type: HostListener,
1106
1107
  args: ['click', ['$event']]
1107
1108
  }] } });
1108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQU9MLE1BQU0sRUFHTixNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRyxPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBbUIsZUFBZSxFQUE2QixNQUFNLG1CQUFtQixDQUFDO0FBQ2hHLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFB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QUMyQixRQUFRO3NCQUEzRCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDUSxjQUFjO3NCQUF2RSxTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHcEQsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU87Z0JBcUJSLG1CQUFtQjtzQkFEOUIsV0FBVzt1QkFBQywyQkFBMkI7Z0JBTTVCLFlBQVk7c0JBRHZCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU1yQixRQUFRO3NCQURuQixXQUFXO3VCQUFDLGVBQWU7Z0JBYU8sT0FBTztzQkFBekMsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0VJLFNBQVM7c0JBQTdDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdDbkMsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcixcbiAgSXRlcmFibGVEaWZmZXJzLFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBJMThuUGx1cmFsUGlwZSwgTmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9jdXNhYmxlT3B0aW9uLCBGb2N1c0tleU1hbmFnZXIsIEZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCwgQ2RrVmlydHVhbEZvck9mLCBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0V2l0aCwgZGVib3VuY2VUaW1lLCBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNb2RpZmllciwgTW9kaWZpZXJBcmd1bWVudHMsIE9wdGlvbnMgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBEcm9wZG93bk1lbnVEaXJlY3RpdmUsIERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24nO1xuaW1wb3J0IHsgRWxlbWVudENvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZWxlbWVudC1jb3Zlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IElNdWx0aVNlbGVjdCwgSU9wdGlvbiwgU2VhcmNoRm4gfSBmcm9tICcuLi9tdWx0aS1zZWxlY3QudHlwZSc7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3Quc2VydmljZSc7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL211bHRpLXNlbGVjdC1vcHRpb24vbXVsdGktc2VsZWN0LW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3ROYXRpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3QtbmF0aXZlLXNlbGVjdC9tdWx0aS1zZWxlY3QtbmF0aXZlLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RUYWdDb21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3QtdGFnL211bHRpLXNlbGVjdC10YWcuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0U2VhcmNoRGlyZWN0aXZlIH0gZnJvbSAnLi9tdWx0aS1zZWxlY3Qtc2VhcmNoLmRpcmVjdGl2ZSc7XG5cbmludGVyZmFjZSBJUGx1cmFsTWFwIHtcbiAgW2s6IHN0cmluZ106IHN0cmluZztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IG9ic2VydmVSZWZlcmVuY2VNb2RpZmllcjogTW9kaWZpZXI8c3RyaW5nLCBhbnk+ID0ge1xuICBuYW1lOiAnb2JzZXJ2ZVJlZmVyZW5jZU1vZGlmaWVyJywgZW5hYmxlZDogdHJ1ZSwgcGhhc2U6ICdtYWluJywgZm4oeyBzdGF0ZSB9KSB7fSxcblxuICBlZmZlY3Q6ICh7IHN0YXRlLCBpbnN0YW5jZSB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikgPT4ge1xuICAgIGNvbnN0IFJPX1BST1AgPSAnX19wb3BwZXJqc1JPX18nO1xuICAgIGNvbnN0IHsgcmVmZXJlbmNlIH0gPSBzdGF0ZS5lbGVtZW50cztcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZWZlcmVuY2VbUk9fUFJPUF0gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJlZmVyZW5jZVtST19QUk9QXS5vYnNlcnZlKHJlZmVyZW5jZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJlZmVyZW5jZVtST19QUk9QXS5kaXNjb25uZWN0KCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBkZWxldGUgcmVmZXJlbmNlW1JPX1BST1BdO1xuICAgIH07XG4gIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtbXVsdGktc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL211bHRpLXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NNdWx0aVNlbGVjdCcsXG4gIHByb3ZpZGVyczogW1xuICAgIE11bHRpU2VsZWN0U2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLCBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEFzeW5jUGlwZSxcbiAgICBJMThuUGx1cmFsUGlwZSxcbiAgICBOZ0NsYXNzLFxuICAgIE5nSWYsXG4gICAgTmdGb3JPZixcbiAgICBOZ1N0eWxlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCxcbiAgICBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsXG4gICAgQ2RrVmlydHVhbEZvck9mLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE11bHRpU2VsZWN0VGFnQ29tcG9uZW50LFxuICAgIE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50LFxuICAgIE11bHRpU2VsZWN0U2VhcmNoRGlyZWN0aXZlLFxuICAgIERyb3Bkb3duQ29tcG9uZW50LFxuICAgIERyb3Bkb3duVG9nZ2xlRGlyZWN0aXZlLFxuICAgIERyb3Bkb3duTWVudURpcmVjdGl2ZSxcbiAgICBFbGVtZW50Q292ZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIElNdWx0aVNlbGVjdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICBwcml2YXRlIG11bHRpU2VsZWN0U2VydmljZTogTXVsdGlTZWxlY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnNcbiAgKSB7XG4gICAgdGhpcy5kaWZmZXIgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuI3ZhbHVlKS5jcmVhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRpZmZlciE6IEl0ZXJhYmxlRGlmZmVyPGFueT47XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2FsbG93Q3JlYXRlT3B0aW9uczogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2xvYWRpbmc6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX211bHRpcGxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV92aXJ0dWFsU2Nyb2xsZXI6IEJvb2xlYW5JbnB1dDtcblxuICByZWFkb25seSAjZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSAjb3B0aW9uc1JlYWR5JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG9wdGlvbnNBcnJheSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElPcHRpb25bXT4oW10pO1xuICByZWFkb25seSAjb3B0aW9uczogTWFwPGFueSwgSU9wdGlvbj4gPSBuZXcgTWFwKCk7XG4gIHJlYWRvbmx5IG9wdGlvbnNTZWxlY3RlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElPcHRpb25bXT4oW10pO1xuICByZWFkb25seSBvcHRpb25zU2VsZWN0ZWQ6IE1hcDxhbnksIElPcHRpb24+ID0gbmV3IE1hcCgpO1xuICByZWFkb25seSB2YWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSk7XG5cbiAgb25DaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IChzdHJpbmcgfCBzdHJpbmdbXSkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiBbdmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gQXJyYXkoMCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB1c2VycyB0byBjcmVhdGUgb3B0aW9ucyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucy5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAc2luY2UgNC41LjJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBhbGxvd0NyZWF0ZU9wdGlvbnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNhbGxvd0NyZWF0ZU9wdGlvbnMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFsbG93Q3JlYXRlT3B0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsb3dDcmVhdGVPcHRpb25zO1xuICB9XG5cbiAgI2FsbG93Q3JlYXRlT3B0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHNlbGVjdGlvbiBjbGVhbmVyIGVsZW1lbnRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBjbGVhbmVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGlzYWJsZXMgbXVsdGktc2VsZWN0IGNvbXBvbmVudFxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICB0aGlzLnNldEZvY3VzTW9uaXRvcighdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBZGQgbG9hZGluZyBzcGlubmVyIGFuZCByZWR1Y2VkIG9wYWNpdHkuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHNpbmNlIDQuNS4yXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuI2xvYWRpbmcgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2xvYWRpbmc7XG4gIH1cblxuICAjbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhhdCBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCBhdCBvbmNlXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cblxuICBwcml2YXRlIF9tdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIaWRkZW4gbmF0aXZlIHNlbGVjdCBmb3JtXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KCkgbmF0aXZlRm9ybUlkID0gJyc7XG5cbiAgLyoqXG4gICAqIEhpZGRlbiBuYXRpdmUgc2VsZWN0IGlkXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KCkgbmF0aXZlSWQgPSAnJztcblxuICAvKipcbiAgICogSGlkZGVuIG5hdGl2ZSBzZWxlY3QgbmFtZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpIG5hdGl2ZU5hbWUgPSAnJztcblxuICAvKipcbiAgICogTGlzdCBvZiBvcHRpb24gZWxlbWVudHNcbiAgICogQHR5cGUgSU9wdGlvbltdXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgb3B0aW9ucyhvcHRpb25zOiBJT3B0aW9uW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI29wdGlvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWF4SGVpZ2h0IG9mIG9wdGlvbnMgbGlzdCBpbiBweFxuICAgKiBAdHlwZSAoc3RyaW5nIHwgbnVtYmVyKVxuICAgKiBAZGVmYXVsdCAnYXV0bydcbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnNNYXhIZWlnaHQgPSAnYXV0byc7XG5cbiAgLyoqXG4gICAqIFNldHMgb3B0aW9uIHN0eWxlXG4gICAqIEB0eXBlICdjaGVja2JveCcgfCAndGV4dCdcbiAgICogQGRlZmF1bHQgJ2NoZWNrYm94J1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG9wdGlvbnNTdHlsZSh2YWx1ZTogJ2NoZWNrYm94JyB8ICd0ZXh0Jykge1xuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLm9wdGlvbnNTdHlsZSA9IHZhbHVlID8/ICdjaGVja2JveCc7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgc2hvcnQgaGludCB0aGF0IGlzIHZpc2libGUgaW4gdGhlIHNlYXJjaCBpbnB1dFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJ1NlbGVjdC4uLidcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdC4uLic7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgc2VhcmNoIGlucHV0IGVsZW1lbnRcbiAgICogQHR5cGUgYm9vbGVhbiB8IFNlYXJjaEZuIHwgJ2V4dGVybmFsJ1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBzZWFyY2g6IChib29sZWFuIHwgJ2V4dGVybmFsJyB8IFNlYXJjaEZuKSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxhYmVsIGZvciBubyByZXN1bHRzIHdoZW4gZmlsdGVyaW5nXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnbm8gaXRlbXMnXG4gICAqL1xuICBASW5wdXQoKSBzZWFyY2hOb1Jlc3VsdHNMYWJlbCA9ICdubyBpdGVtcyc7XG5cbiAgLyoqXG4gICAqIFNldHMgaW5pdGlhbCBzZWFyY2ggc3RyaW5nXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHNlYXJjaFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX3NlYXJjaFZhbHVlICE9PSB2YWx1ZS50cmltU3RhcnQoKSkge1xuICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB2YWx1ZS50cmltU3RhcnQoKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9ICEhdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggPyB0cnVlIDogdGhpcy52aXNpYmxlO1xuICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKHRoaXMuc2VhcmNoVmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnRTaXplKCk7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fc2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWFyY2hWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHNlYXJjaFZhbHVlIHN0cmluZyBmb3IgZXh0ZXJuYWwgZmlsdGVyaW5nXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlYXJjaFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgc2VsZWN0IGFsbCBidXR0b25cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RBbGwgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3QgYWxsIGJ1dHRvbiBsYWJlbFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJ1NlbGVjdCBhbGwgb3B0aW9ucydcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdEFsbExhYmVsID0gJ1NlbGVjdCBhbGwgb3B0aW9ucyc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdGlvbiB0eXBlXG4gICAqIEB0eXBlICdjb3VudGVyJyB8ICd0YWdzJyB8ICd0ZXh0J1xuICAgKiBAZGVmYXVsdCAndGFncydcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvblR5cGU6ICdjb3VudGVyJyB8ICd0YWdzJyB8ICd0ZXh0JyA9ICd0YWdzJztcblxuICAvKipcbiAgICogQ291bnRlciBzZWxlY3Rpb24gbGFiZWwgdmFsdWVcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICdpdGVtKHMpIHNlbGVjdGVkJ1xuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0OiBzdHJpbmcgPSAnaXRlbShzKSBzZWxlY3RlZCc7XG5cbiAgLyoqXG4gICAqIENvdW50ZXIgc2VsZWN0aW9uIGxhYmVsIHBsdXJhbCBtYXAgZm9yIEkxOG5QbHVyYWxQaXBlXG4gICAqIEB0eXBlIElQbHVyYWxNYXBcbiAgICogQGRlZmF1bHQgeyAnPTEnOiAnaXRlbSBzZWxlY3RlZCcsICdvdGhlcic6ICdpdGVtcyBzZWxlY3RlZCcgfVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0UGx1cmFsTWFwPzogSVBsdXJhbE1hcCA9IHsgJz0xJzogJ2l0ZW0gc2VsZWN0ZWQnLCAnb3RoZXInOiAnaXRlbXMgc2VsZWN0ZWQnIH07XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIGNvbXBvbmVudCBzbWFsbCBvciBsYXJnZS5cbiAgICogQHR5cGUgJ3NtJyB8ICdsZycgfCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU/OiAnc20nIHwgJ2xnJztcblxuICAvKipcbiAgICogSW5pdGlhbCB2YWx1ZSBvZiBtdWx0aS1zZWxlY3RcbiAgICogQHR5cGUgc3RyaW5nIHwgc3RyaW5nW11cbiAgICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IFt2YWx1ZSA/PyB1bmRlZmluZWRdO1xuICAgIGlmICh0aGlzLmRpZmZlcikge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYobmV3VmFsdWUpO1xuICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy4jdmFsdWUgPSBbLi4ubmV3VmFsdWVdO1xuICAgICAgICB0aGlzLnZhbHVlJC5uZXh0KFsuLi5uZXdWYWx1ZV0pO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICAvLyB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8/IFsuLi50aGlzLiN2YWx1ZV07XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBbLi4udmFsdWVdIDogdmFsdWU/LnRvU3RyaW5nKCkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgI3ZhbHVlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB2YWx1ZUNoYW5nZVxuICAgKiBAdHlwZSBzdHJpbmcgfCBzdHJpbmdbXVxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBzdHJpbmdbXT4oKTtcblxuICAvKipcbiAgICogVG9nZ2xlIHZpc3VhbCB2YWxpZGF0aW9uIGZlZWRiYWNrLlxuICAgKiBAdHlwZSBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdmlydHVhbCBzY3JvbGxlciBmb3Igb3B0aW9ucyBsaXN0LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmlydHVhbFNjcm9sbGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdmlydHVhbFNjcm9sbGVyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2aXJ0dWFsU2Nyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxTY3JvbGxlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3ZpcnR1YWxTY3JvbGxlciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBbW91bnQgb2YgdmlzaWJsZSBvcHRpb25zLCBpZiBzZXQgLSBvdmVyd3JpdGVzIG9wdGlvbnNNYXhIZWlnaHRcbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IDhcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCB2aXNpYmxlSXRlbXModmFsdWUpIHtcbiAgICB0aGlzLl92aXNpYmxlSXRlbXMgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSB8fCA4KTtcbiAgICB0aGlzLm9wdGlvbnNNYXhIZWlnaHQgPSAoKHRoaXMuaXRlbVNpemUgKiB0aGlzLl92aXNpYmxlSXRlbXMpICsgMTYpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBnZXQgdmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlSXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF92aXNpYmxlSXRlbXMgPSA4O1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgb3B0aW9uIGl0ZW0gaW4gdGhlIGxpc3QgKGluIHBpeGVscykuXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVmYXVsdCA0MFxuICAgKi9cbiAgQElucHV0KCkgaXRlbVNpemU6IG51bWJlciA9IDQwO1xuXG4gIC8qKlxuICAgKiBNaW4gd2lkdGggb2YgdGhlIG9wdGlvbnMgbGlzdCAoaW4gcGl4ZWxzKS5cbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IDE5NlxuICAgKi9cbiAgQElucHV0KCkgaXRlbU1pbldpZHRoOiBudW1iZXIgPSAxOTY7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZHJvcGRvd24gc2VsZWN0IGNvbXBvbmVudC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2aXNpYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodmlzaWJsZSAhPT0gdGhpcy5fdmlzaWJsZSkge1xuICAgICAgdGhpcy5fdmlzaWJsZSA9IHZpc2libGU7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS50b2dnbGVWaXNpYmxlKHZpc2libGUpO1xuICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgIC8vIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2libGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgdmlzaWJsZUNoYW5nZVxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgcG9wcGVyIE9wdGlvbnMgb2JqZWN0XG4gICAqIEB0eXBlIFBhcnRpYWw8T3B0aW9ucz5cbiAgICovXG4gIEBJbnB1dCgncG9wcGVyT3B0aW9ucycpIHBvcHBlcmpzT3B0aW9uczogUGFydGlhbDxPcHRpb25zPiA9IHtcbiAgICBzdHJhdGVneTogJ2ZpeGVkJywgbW9kaWZpZXJzOiBbb2JzZXJ2ZVJlZmVyZW5jZU1vZGlmaWVyLCB7XG4gICAgICBuYW1lOiAnb2Zmc2V0Jywgb3B0aW9uczoge1xuICAgICAgICBvZmZzZXQ6ICgpID0+IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3RhZ3MnICYmIHRoaXMub3B0aW9uc1NlbGVjdGVkLnNpemUgPyBbLTIsIDhdIDogWy0xMiwgMTJdXG4gICAgICB9XG4gICAgfV1cbiAgfTtcblxuICBpc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuXG4gIGdldCBzZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm9wdGlvbnNTZWxlY3RlZC52YWx1ZXMoKV07XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ubGFiZWwpLmpvaW4oJywgJyk7XG4gIH1cblxuICBnZXQgY291bnRlclRleHQoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aH0gJHt0aGlzLnNlbGVjdGlvblR5cGVDb3VudGVyVGV4dH1gO1xuICB9XG5cbiAgZ2V0IGNvdW50ZXJUZXh0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5zZWxlY3Rpb25UeXBlQ291bnRlclRleHRQbHVyYWxNYXAgPz8gdHlwZW9mIHRoaXMuc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0O1xuICB9O1xuXG4gIHByaXZhdGUgZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgbXVsdGlTZWxlY3RPcHRpb25zQ29udGVudCE6IFF1ZXJ5TGlzdDxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGRyZW4oTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQpIG11bHRpU2VsZWN0T3B0aW9uc1ZpZXchOiBRdWVyeUxpc3Q8TXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQ+O1xuICBAVmlld0NoaWxkcmVuKCdzY3JvbGxWaWV3cG9ydCcpIHNjcm9sbFZpZXdwb3J0VmlldyE6IFF1ZXJ5TGlzdDxDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ+O1xuICBAVmlld0NoaWxkKCdvcHRpb25zJykgb3B0aW9uc0VsZW1lbnRSZWYhOiBFbGVtZW50UmVmO1xuXG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3cG9ydCE6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcblxuICBwcm90ZWN0ZWQgdGVtcGxhdGVzOiB7IFtpZDogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9ID0ge307XG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVJZERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBjb250ZW50VGVtcGxhdGVzITogUXVlcnlMaXN0PFRlbXBsYXRlSWREaXJlY3RpdmU+O1xuXG4gIHByaXZhdGUgbGlzdEtleU1hbmFnZXIhOiBGb2N1c0tleU1hbmFnZXI8TXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RWxlbWVudCcpIGlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duTWVudScpIGRyb3Bkb3duTWVudSE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoRHJvcGRvd25Db21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoRHJvcGRvd25Ub2dnbGVEaXJlY3RpdmUsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93blRvZ2dsZSE6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0IG11bHRpc2VsZWN0Q2xhc3NlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2Zvcm0tbXVsdGktc2VsZWN0JzogdHJ1ZSxcbiAgICAgICdmb3JtLW11bHRpLXNlbGVjdC1zZWxlY3Rpb24tdGFncyc6IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3RhZ3MnICYmIHRoaXMub3B0aW9uc1NlbGVjdGVkLnNpemUgPiAwLFxuICAgICAgW2Bmb3JtLW11bHRpLXNlbGVjdC0ke3RoaXMuc2l6ZX1gXTogISF0aGlzLnNpemUsXG4gICAgICAnZm9ybS1tdWx0aS1zZWxlY3Qtd2l0aC1jbGVhbmVyJzogdGhpcy5jbGVhbmVyLFxuICAgICAgc2hvdzogdGhpcy52aXNpYmxlLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQsXG4gICAgICAnaXMtdmFsaWQnOiB0aGlzLnZhbGlkID09PSB0cnVlLFxuICAgICAgJ2lzLWludmFsaWQnOiB0aGlzLnZhbGlkID09PSBmYWxzZVxuICAgIH07XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGUnKVxuICBwcml2YXRlIGdldCBhcmlhTXVsdGlTZWxlY3RhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICBwcml2YXRlIGdldCBhcmlhRXhwYW5kZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIHByaXZhdGUgZ2V0IHRhYkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl90YWJJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0IHRhYkluZGV4KHZhbHVlKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90YWJJbmRleCA9IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5zZWFyY2ggPyAtMSA6IHZhbHVlID09PSBudWxsID8gbnVsbCA6IDA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF90YWJJbmRleDogbnVtYmVyIHwgbnVsbCA9IC0xO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSkgb25LZXlVcCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIGNvbnN0IHRhcmdldFRhZ05hbWUgPSAoJGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZTtcbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydFbnRlcicsICdTcGFjZScsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkgJiYgW3RoaXMuaW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudF0uaW5jbHVkZXMoJGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXRoaXMuc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoWydUYWInXS5pbmNsdWRlcygkZXZlbnQua2V5KSkge1xuXG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaCkge1xuICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRhcmdldFRhZ05hbWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlzaWJsZSAmJiB0aGlzLnN1YnRyZWVGb2N1c2VkKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdOYW1lID09PSAnQy1NVUxUSS1TRUxFQ1QtT1BUSU9OJykge1xuXG4gICAgICAgICAgaWYgKHRoaXMudGFiVGFyZ2V0ID09PSAnQy1NVUxUSS1TRUxFQ1QtT1BUSU9OJykge1xuICAgICAgICAgICAgaWYgKCRldmVudC5zaGlmdEtleSAmJiB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKS5zbGljZSgwKVswXS52YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCdrZXlib2FyZCcsICdvbktleVVwJyk7XG4gICAgICAgICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISRldmVudC5zaGlmdEtleSAmJiB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnZhbHVlID09PSB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKS5zbGljZSgtMSlbMF0udmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRhcmdldFRhZ05hbWU7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlSXRlbSgwKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtIHx8IHRoaXMudGFiVGFyZ2V0ICE9PSB0YXJnZXRUYWdOYW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRldmVudC5zaGlmdEtleSA/IHRoaXMubGlzdEtleU1hbmFnZXIuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCkgOiB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0VGFnTmFtZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xuICAgIGlmICgkZXZlbnQua2V5ID09PSAnRW50ZXInICYmIHRhcmdldFRhZ05hbWUgPT09ICdJTlBVVCcpIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nICYmIHRhcmdldFRhZ05hbWUgIT09ICdDLU1VTFRJLVNFTEVDVC1PUFRJT04nKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXZvaWQgc2V0dGluZyBmb2N1cyB0byBvcHRpb24gd2hpbGUgb24gaW5wdXQgZWxlbWVudFxuICAgIGlmICgkZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgkZXZlbnQua2V5ICE9PSAnVGFiJykge1xuICAgICAgdGhpcy5saXN0S2V5TWFuYWdlcj8ub25LZXlkb3duKCRldmVudCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50XS5pbmNsdWRlcygkZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLnNldEZvY3VzKCdtb3VzZScsICdvbkNsaWNrJyk7XG4gIH1cblxuICBwdWJsaWMgdmlzaWJsZU9wdGlvbnMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIGdldCBzdWJ0cmVlRm9jdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VidHJlZUZvY3VzZWQ7XG4gIH1cblxuICBzZXQgc3VidHJlZUZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3N1YnRyZWVGb2N1c2VkID0gdGhpcy5kaXNhYmxlZCA/IGZhbHNlIDogZm9jdXNlZDtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgdGhpcy52aXNpYmxlID0gZm9jdXNlZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRoaXMudmlzaWJsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdWJ0cmVlRm9jdXNlZCA9IHRoaXMuZm9jdXNPcmlnaW4obnVsbCk7XG5cbiAgcHJpdmF0ZSBuYXRpdmVTZWxlY3RSZWYhOiBhbnk7XG5cbiAgZm9jdXNPcmlnaW4ob3JpZ2luOiBGb2N1c09yaWdpbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIW9yaWdpbjtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5tdWx0aXBsZSk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLm11bHRpcGxlKSxcbiAgICAgICAgZGVsYXkoMCksXG4gICAgICAgIHRhcChjaGFuZ2UgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2UuYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjbG9zZSBkcm9wZG93biBmb3Igc2luZ2xlIHNlbGVjdCAoIW11bHRpcGxlKVxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLmNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBkZWxheSgwKSxcbiAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy4jb3B0aW9uc1JlYWR5JCksXG4gICAgICAgIHRhcCgoW2NoYW5nZSwgcmVhZHldKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBhZGRlZCwgcmVtb3ZlZCB9ID0geyAuLi5jaGFuZ2UgfTtcbiAgICAgICAgICAvLyBhZGRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgLy8gICBjb25zdCB2YWx1ZSA9IHRoaXMuI29wdGlvbnMuZ2V0KGtleSk7XG4gICAgICAgICAgLy8gICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAvLyAgICAgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgIC8vICAgfVxuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZC5kZWxldGUodmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jb3B0aW9ucy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZCQubmV4dChBcnJheS5mcm9tKHRoaXMub3B0aW9uc1NlbGVjdGVkLnZhbHVlcygpKSk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi50aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZF07XG5cbiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIHNldCBpbml0aWFsIHZhbHVlc1xuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCguLi50aGlzLiN2YWx1ZSk7XG5cbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQWxsT3B0aW9ucygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLm9wdGlvbnNBcnJheSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAob3B0aW9ucyA9PiB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlT3B0aW9ucy5zZXQob3B0aW9ucy5zb21lKChpdGVtKSA9PiBpdGVtLnZpc2libGUpKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICBvcHRpb24uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNldFJlbmRlcmVkUmFuZ2UoeyBzdGFydDogMCwgZW5kOiB0aGlzLnZpc2libGVJdGVtcyB9KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IG9wdGlvbnMuZmluZChpdGVtID0+IGl0ZW0udmFsdWUgPT09IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgIG9wdGlvbi52aXNpYmxlID0gZm91bmQ/LnZpc2libGUgPz8gZmFsc2U7XG4gICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLmZpcnN0Rm9jdXNhYmxlSXRlbTtcbiAgICAgICAgICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oZmlyc3RGb2N1c2FibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtKDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8ubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJz0+IG9wdGlvbnNBcnJheSQnLCBvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy50YWJJbmRleCA9IDA7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNkZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy4jZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNldEZvY3VzTW9uaXRvcihmYWxzZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyA9IGNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgICBpZiAodmFsdWVDaGFuZ2VzLmN1cnJlbnRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhckFsbE9wdGlvbnMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG1ha2VPcHRpb25zKG9wdGlvbnM6IElPcHRpb25bXSkge1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoID09PSAnZXh0ZXJuYWwnICYmIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLiNvcHRpb25zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgdmFsdWUudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24udmFsdWU7XG4gICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSA/PyBvcHRpb24ubGFiZWwsXG4gICAgICAgIGxhYmVsOiBvcHRpb24ubGFiZWwgPz8gb3B0aW9uLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkID09PSB0cnVlLFxuICAgICAgICB2aXNpYmxlOiB0aGlzLnNlYXJjaCA9PT0gJ2V4dGVybmFsJyA/IHRydWUgOiBvcHRpb24udmlzaWJsZSAhPT0gZmFsc2UsXG4gICAgICAgIHRleHQ6IG9wdGlvbi50ZXh0ID8/IG9wdGlvbi5sYWJlbCA/PyBvcHRpb24udmFsdWUsXG4gICAgICAgIHNlbGVjdGVkOiBvcHRpb24uc2VsZWN0ZWRcbiAgICAgICAgLy8gc2VsZWN0ZWQ6IHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uLnZhbHVlKSxcbiAgICAgICAgLy8gaWQ6IG9wdGlvbi5pZFxuICAgICAgfTtcbiAgICAgIHRoaXMuI29wdGlvbnMuc2V0KGtleSwgeyAuLi52YWx1ZSB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsdGVyT3B0aW9ucyh0aGlzLnNlYXJjaFZhbHVlKTtcblxuICAgIHRoaXMuI29wdGlvbnNSZWFkeSQubmV4dCh0cnVlKTtcbiAgICAvLyBjb25zb2xlLmxvZygnbWFrZU9wdGlvbnMnLCB0aGlzLiNvcHRpb25zLnNpemUpO1xuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8ubm90aWZ5T25DaGFuZ2VzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGxlcigpO1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkoMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91czogUXVlcnlMaXN0PE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBwcmV2aW91cy50b0FycmF5KCkubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1cnIgPSBjdXJyZW50LnRvQXJyYXkoKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByZXYpID09PSBKU09OLnN0cmluZ2lmeShjdXJyKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVPcHRpb25zLnNldCh0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQ/LnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZpc2libGUpKTtcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZU9wdGlvbnMoKSkge1xuICAgICAgICAgIHRoaXMubWFrZU9wdGlvbnModGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50LnRvQXJyYXkoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlT3B0aW9ucy5zZXQodGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5sZW5ndGggPiAwKTtcbiAgICBpZiAodGhpcy52aXNpYmxlT3B0aW9ucygpKSB7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tdWx0aXNlbGVjdFN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5zZXRGb2N1c01vbml0b3IoIXRoaXMuZGlzYWJsZWQpO1xuXG4gICAgdGhpcy5zZXRMaXN0S2V5TWFuYWdlcigpO1xuXG4gICAgdGhpcy5pbnB1dEVsZW1lbnRTaXplKCk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlTmF0aXZlU2VsZWN0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5tdWx0aVNlbGVjdEZvY3VzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZU9wdGlvbj8udmFsdWUgIT09IG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0YWJUYXJnZXQhOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdFN1YnNjcmliZShzdWJzY3JpYmU6IGJvb2xlYW4gPSB0cnVlKSB7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5tdWx0aVNlbGVjdFZpc2libGUkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh2aXNpYmxlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25WaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodmlzaWJsZSk7XG4gICAgICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0Py5zZXRSZW5kZXJlZFJhbmdlKHsgc3RhcnQ6IDAsIGVuZDogdGhpcy52aXNpYmxlSXRlbXMgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7XG4gICAgICB9KTtcblxuICB9XG5cbiAgY2xlYXJBbGxPcHRpb25zKCRldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNTZWxlY3RlZC52YWx1ZXMoKSkuZmlsdGVyKG9wdGlvbiA9PiAhb3B0aW9uLmRpc2FibGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCguLi5lbmFibGVkT3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdjbGVhckFsbE9wdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGxPcHRpb25zKCkge1xuICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLiNvcHRpb25zLnZhbHVlcygpKS5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4uZW5hYmxlZE9wdGlvbnMpO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICB9XG5cbiAgaGFuZGxlVGFnUmVtb3ZlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdoYW5kbGVUYWdSZW1vdmUnKTtcbiAgfVxuXG4gIHNldEZvY3VzKG9yaWdpbjogRm9jdXNPcmlnaW4gPSAncHJvZ3JhbScsIG1ldGhvZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50Pih0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50ID8/IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICBjb25zdCBwcmV2ZW50U2Nyb2xsID0gb3JpZ2luID09PSAncHJvZ3JhbSc7XG4gICAgdGhpcy5mb2N1c01vbml0b3I/LmZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgeyBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50U2Nyb2xsIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXRGb2N1cycsIG9yaWdpbiwgbWV0aG9kTmFtZSwgJ3ByZXZlbnRTY3JvbGw6JywgcHJldmVudFNjcm9sbCwgZWxlbWVudC50YWdOYW1lKTtcbiAgfVxuXG4gIGZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgdGhpcy4jb3B0aW9ucy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHNlYXJjaFN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpdGVtLnZpc2libGUgPSB0aGlzLnNlYXJjaChpdGVtLCBzZWFyY2hTdHJpbmcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2ggPT09ICdleHRlcm5hbCcgfHwgIXNlYXJjaFN0cmluZykge1xuICAgICAgICAvLyBpdGVtLnZpc2libGUgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnZpc2libGUgPSBpdGVtLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZykgPz8gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLm9wdGlvbnNBcnJheSQubmV4dChBcnJheS5mcm9tKHRoaXMuI29wdGlvbnMudmFsdWVzKCkpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52aXNpYmxlKSk7XG5cbiAgfVxuXG4gIGNyZWF0ZU5hdGl2ZVNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50KTtcbiAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICB9XG5cbiAgdXBkYXRlTmF0aXZlU2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5uYXRpdmVTZWxlY3RSZWYgfHwgIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20odGhpcy5vcHRpb25zU2VsZWN0ZWQpLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0ZWQsIHZhbHVlLCBsYWJlbCB9ID0gaXRlbVsxXTtcbiAgICAgIHJldHVybiB7IHNlbGVjdGVkLCB2YWx1ZSwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5mb3JtID0gdGhpcy5uYXRpdmVGb3JtSWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuaWQgPSB0aGlzLm5hdGl2ZUlkO1xuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm5hbWUgPSB0aGlzLm5hdGl2ZU5hbWU7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2Uub3B0aW9ucyA9IFsuLi5vcHRpb25zXTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpbnB1dEVsZW1lbnRTaXplKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGlmICgodGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgfHwgdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnY291bnRlcicpICYmICF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Py5kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzaXplJywgKHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoICsgMikudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggfHwgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ0JhY2tzcGFjZScsICdEZWxldGUnXS5pbmNsdWRlcygkZXZlbnQua2V5KSkge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gIW9wdGlvbi5kaXNhYmxlZCkucG9wKCk7XG4gICAgICBpZiAobGFzdCkge1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChsYXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZvY3VzTW9uaXRvcihtb25pdG9yOiBib29sZWFuKSB7XG4gICAgaWYgKG1vbml0b3IgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uID0gdGhpcy5mb2N1c01vbml0b3I/Lm1vbml0b3IodGhpcy5lbGVtZW50UmVmLCB0cnVlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyB0byBhdm9pZCBmb2N1cyBsb3N0IG9uIHNwZWVkIHNjcm9sbGluZyB3aXRoIHZpcnR1YWxTY3JvbGxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKG9yaWdpbikgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihvcmlnaW4pO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvcj8uc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2ZU9wdGlvbjogKEZvY3VzYWJsZU9wdGlvbiAmIE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSB8IG51bGwgPSBudWxsO1xuXG4gIGhhbmRsZVNjcm9sbGVkSW5kZXhDaGFuZ2Uoc2Nyb2xsZWRJbmRleDogbnVtYmVyLCBzY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG5cbiAgICBpZiAoIXRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQgPSBzY3JvbGxWaWV3cG9ydDtcbiAgICB9XG5cbiAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnZpc2libGUpO1xuICAgIGNvbnN0IGZpcnN0VmlzaWJsZU9wdGlvbiA9IGF2YWlsYWJsZU9wdGlvbnNbc2Nyb2xsZWRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uSW5kZXggPSBhdmFpbGFibGVPcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLmFjdGl2ZU9wdGlvbj8udmFsdWUpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC50b0FycmF5KCk7XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCA+IGFjdGl2ZU9wdGlvbkluZGV4KSB7XG4gICAgICBjb25zdCBmaXJzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmQob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gZmlyc3RWaXNpYmxlT3B0aW9uPy52YWx1ZSk7XG4gICAgICBpZiAoZmlyc3RWaXNpYmxlSXRlbSAmJiBzY3JvbGxlZEluZGV4KSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShmaXJzdFZpc2libGVJdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCArIHRoaXMudmlzaWJsZUl0ZW1zIC0gMiA8PSBhY3RpdmVPcHRpb25JbmRleCkge1xuICAgICAgY29uc3QgbGFzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdFZpc2libGVPcHRpb24udmFsdWUpO1xuICAgICAgaWYgKGxhc3RWaXNpYmxlSXRlbSA+IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShsYXN0VmlzaWJsZUl0ZW0gKyB0aGlzLnZpc2libGVJdGVtcyAtIDIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIG9wdGlvbjogSU9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gIH1cblxuICBoYW5kbGVTZWFyY2hWYWx1ZUNoYW5nZShzZWFyY2hWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlO1xuICAgIGlmICghc2VhcmNoVmFsdWUpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaXJ0dWFsU2Nyb2xsZXIoKSB7XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBmb3IgdmlydHVhbFNjcm9sbGVyXG4gICAgdGhpcy5jb250ZW50VGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICB9KTtcblxuICAgIC8vIGlmIG5vIHRlbXBsYXRlIGZvdW5kLCBnZXQgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGUgZnJvbSB2aWV3XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlc1snbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQgPSB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc1ZpZXc7XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25zQ29udGVudCBnZXRzIG91dCBvZiBvcmRlciBvbiBjaGFuZ2VzXG4gICAgLy8gZG8gc29ydCgpIGFuZCByZXNldCgpXG4gICAgY29uc3QgaW5kZXhPZk9wdGlvbiA9IChvcHRpb246IE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSA9PiB7XG4gICAgICByZXR1cm4gWy4uLm9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0/LmluZGV4T2Yob3B0aW9uLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNDaGFuZ2UkOiBPYnNlcnZhYmxlPFF1ZXJ5TGlzdDxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD4+ID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50LmNoYW5nZXM7XG5cbiAgICBjb25zdCBzb3J0ZWRPcHRpb25zJCA9IG9wdGlvbnNDaGFuZ2UkLnBpcGUoXG4gICAgICBtYXAob3B0aW9ucyA9PiBvcHRpb25zLnRvQXJyYXkoKSksXG4gICAgICBmaWx0ZXIob3B0aW9ucyA9PiBvcHRpb25zLmxlbmd0aCA+IDApLFxuICAgICAgbWFwKG9wdGlvbnMgPT4gb3B0aW9ucy5zb3J0KChhLCBiKSA9PiBpbmRleE9mT3B0aW9uKGEpIC0gaW5kZXhPZk9wdGlvbihiKSkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICApO1xuXG4gICAgc29ydGVkT3B0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShzb3J0ZWRPcHRpb25zID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5yZXNldChzb3J0ZWRPcHRpb25zKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zY3JvbGxWaWV3cG9ydFZpZXcuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcChjaGFuZ2VzID0+IGNoYW5nZXMudG9BcnJheSgpWzBdKSxcbiAgICAgICAgdGFwKChzY3JvbGxWaWV3cG9ydCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQgPSBzY3JvbGxWaWV3cG9ydDtcblxuICAgICAgICAgICAgICBjb25zdCBjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIgPSB0aGlzLnNjcm9sbFZpZXdwb3J0LmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgaWYgKGNka1ZpcnR1YWxTY3JvbGxDb250ZW50V3JhcHBlcikge1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNka1ZpcnR1YWxTY3JvbGxDb250ZW50V3JhcHBlciwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpID8/ICcxMnB4JykgKiAzO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25SZWNvcmRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICBtdXRhdGlvblJlY29yZHMuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZGVkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gJ0MtTVVMVEktU0VMRUNULU9QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gdGhpcy5pdGVtTWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtTWluV2lkdGggPSB3aWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy4jZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGlzdEtleU1hbmFnZXIoKSB7XG5cbiAgICAvLyBydW4gb25jZSBvbiBtdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50IGZpcnN0IHNldFxuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoY2hhbmdlID0+IHtcblxuICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQpXG4gICAgICAgICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAgICAgICAuc2tpcFByZWRpY2F0ZSgob3B0aW9uKSA9PiAob3B0aW9uLmRpc2FibGVkIHx8ICFvcHRpb24udmlzaWJsZSkpO1xuXG4gICAgICAgIGlmICghdGhpcy5fdmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci53aXRoVHlwZUFoZWFkKDMwMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLmNoYW5nZVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoYW5nZSA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVPcHRpb24gPyB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24pIDogdGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgIHRoaXMuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZpcnN0Rm9jdXNhYmxlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5maW5kKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rmlyc3RJdGVtQWN0aXZlKCkge1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlSXRlbSA9IHRoaXMuZmlyc3RGb2N1c2FibGVJdGVtO1xuICAgIGZpcnN0Rm9jdXNhYmxlSXRlbSA/IHRoaXMubGlzdEtleU1hbmFnZXI/LnNldEFjdGl2ZUl0ZW0oZmlyc3RGb2N1c2FibGVJdGVtKSA6IHRoaXMubGlzdEtleU1hbmFnZXI/LnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgIHRoaXMuYWN0aXZlT3B0aW9uID0gdGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSA/PyBudWxsO1xuICB9XG5cbiAgdXBkYXRlQWN0aXZlSXRlbShpbmRleDogbnVtYmVyKTogdm9pZDtcblxuICB1cGRhdGVBY3RpdmVJdGVtPFQgZXh0ZW5kcyAoTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQgJiBGb2N1c2FibGVPcHRpb24pPihpdGVtOiBUKTogdm9pZDtcblxuICB1cGRhdGVBY3RpdmVJdGVtKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlSXRlbSA9IHRoaXMuZmlyc3RGb2N1c2FibGVJdGVtID8/IGl0ZW07XG4gICAgZmlyc3RGb2N1c2FibGVJdGVtID8gdGhpcy5saXN0S2V5TWFuYWdlcj8udXBkYXRlQWN0aXZlSXRlbShmaXJzdEZvY3VzYWJsZUl0ZW0pIDogdGhpcy5saXN0S2V5TWFuYWdlcj8udXBkYXRlQWN0aXZlSXRlbSgwKTtcbiAgICBpZiAodGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSkge1xuICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlT3B0aW9uID0gdGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSA/PyBudWxsO1xuICB9XG59XG4iLCI8Yy1kcm9wZG93biAjZHJvcGRvd249XCJjRHJvcGRvd25cIlxuICAgICAgICAgICAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm11bHRpc2VsZWN0Q2xhc3Nlc1wiXG4gICAgICAgICAgICBbcG9wcGVyT3B0aW9uc109XCJwb3BwZXJqc09wdGlvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJwaWNrZXJcIj5cbiAgPGRpdiAjZHJvcGRvd25Ub2dnbGU9XCJjRHJvcGRvd25Ub2dnbGVcIiBbY2FyZXRdPVwiZmFsc2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjRHJvcGRvd25Ub2dnbGU+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvblwiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlbGVjdGlvblR5cGUgPT09ICd0YWdzJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG9wdGlvbnNTZWxlY3RlZCQgfCBhc3luYykgYXMgb3B0aW9uVGFnc1wiPlxuICAgICAgICAgIDxjLW11bHRpLXNlbGVjdC10YWdcbiAgICAgICAgICAgIChyZW1vdmUpPVwiaGFuZGxlVGFnUmVtb3ZlKCRldmVudClcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25UYWdzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbCA/PyBvcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXRhZ1wiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPC9jLW11bHRpLXNlbGVjdC10YWc+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWxlY3Rpb25UeXBlID09PSAndGV4dCcgJiYgISFzZWxlY3RlZE9wdGlvbnNUZXh0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtc2VhcmNoXCI+e3sgc2VsZWN0ZWRPcHRpb25zVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2NvdW50ZXInXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY291bnRlclRleHRUeXBlID09PSAnc3RyaW5nJzsgZWxzZSBwbHVyYWxNYXBcIj57eyBjb3VudGVyVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwbHVyYWxNYXA+XG4gICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZE9wdGlvbnMubGVuZ3RofX0ge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB8IGkxOG5QbHVyYWw6IHNlbGVjdGlvblR5cGVDb3VudGVyVGV4dFBsdXJhbE1hcCA/PyB7IG90aGVyOiBjb3VudGVyVGV4dCB9IH19PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNlYXJjaCAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSAwICYmIHNlbGVjdGlvblR5cGUgIT09ICdjb3VudGVyJ1wiPi0tPlxuICAgICAgPCEtLSAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLW11bHRpLXNlbGVjdC1zZWFyY2hcIj57eyBwbGFjZWhvbGRlciB9fTwvc3Bhbj4tLT5cbiAgICAgIDwhLS0gICAgICA8L25nLXRlbXBsYXRlPi0tPlxuICAgIDwvZGl2PlxuXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRFbGVtZW50XG4gICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWFyY2hLZXlEb3duKCRldmVudClcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwib3B0aW9uc1NlbGVjdGVkLnNpemUgPT09IDAgJiYgc2VsZWN0aW9uVHlwZSAhPT0gJ2NvdW50ZXInID8gcGxhY2Vob2xkZXIgOiBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhc2VhcmNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2Zvcm0tbXVsdGktc2VsZWN0LXNlYXJjaCc6IHRydWUsIGRpc2FibGVkOiAoZGlzYWJsZWQgfHwgIXNlYXJjaCkgfVwiXG4gICAgICBbbmdNb2RlbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGNNdWx0aVNlbGVjdFNlYXJjaFxuICAgICAgc2l6ZT1cIjNcIlxuICAgICAgdGFiaW5kZXg9XCJ7eyBkaXNhYmxlZCA/IC0xIDogMCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsT3B0aW9ucygkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiY2xlYW5lciAmJiBvcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgJiYgIWRpc2FibGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhaXNEcm9wZG93blZpc2libGVcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIGFsbFwiXG4gICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvbi1jbGVhbmVyXCJcbiAgICA+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2ICNkcm9wZG93bk1lbnU9XCJjRHJvcGRvd25NZW51XCIgKm5nSWY9XCIhZGlzYWJsZWRcIiBbdmlzaWJsZV09XCJkcm9wZG93bi52aXNpYmxlXCIgY0Ryb3Bkb3duTWVudT5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZFbHNlXT1cIm9wdGlvbnNFbXB0eVwiIFtuZ0lmXT1cIih2aXNpYmxlT3B0aW9ucygpICYmIG9wdGlvbnMubGVuZ3RoID4gMCkgfHwgbG9hZGluZ1wiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2VsZWN0QWxsT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RBbGwgJiYgbXVsdGlwbGUgJiYgIXZpcnR1YWxTY3JvbGxlclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3QtYWxsXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgID5cbiAgICAgICAge3sgc2VsZWN0QWxsTGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpcnR1YWxTY3JvbGxlciA/IG11bHRpc2VsZWN0VmlydHVhbFNjcm9sbGVyIDogbXVsdGlzZWxlY3RPcHRpb25zRGl2XCIgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uc0VtcHR5PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LW9wdGlvbnMtZW1wdHlcIj57eyBzZWFyY2hOb1Jlc3VsdHNMYWJlbCB9fTwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImxvYWRpbmdcIj5cbiAgICAgIDxjLWVsZW1lbnQtY292ZXIgW25nU3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzZweCcsICd6LWluZGV4JzogMn1cIiAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9jLWRyb3Bkb3duPlxuXG48bmctdGVtcGxhdGUgI211bHRpc2VsZWN0VmlydHVhbFNjcm9sbGVyPlxuICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgI3Njcm9sbFZpZXdwb3J0XG4gICAgKHNjcm9sbGVkSW5kZXhDaGFuZ2UpPVwiaGFuZGxlU2Nyb2xsZWRJbmRleENoYW5nZSgkZXZlbnQsIHNjcm9sbFZpZXdwb3J0KVwiXG4gICAgKm5nSWY9XCJvcHRpb25zQXJyYXkkIHwgYXN5bmMgYXMgb3B0aW9uc0FycmF5XCJcbiAgICBbaXRlbVNpemVdPVwiaXRlbVNpemVcIlxuICAgIFtuZ1N0eWxlXT1cIm9wdGlvbnNNYXhIZWlnaHQgIT09ICdhdXRvJyA/IHsgJ2hlaWdodC5weCc6IG9wdGlvbnNNYXhIZWlnaHQsICdtYXhIZWlnaHQucHgnOiBvcHRpb25zTWF4SGVpZ2h0LCAnbWluV2lkdGgucHgnOiBpdGVtTWluV2lkdGggPz8gMTk2LCBvdmVyZmxvd1g6ICdoaWRkZW4nIH0gOiB7ICdtaW5XaWR0aC5weCc6IGl0ZW1NaW5XaWR0aCA/PyAxOTYsIG92ZXJmbG93WDogJ2hpZGRlbid9XCJcbiAgICBtYXhCdWZmZXJQeD1cInt7aXRlbVNpemUgKiB2aXNpYmxlSXRlbXN9fVwiXG4gICAgbWluQnVmZmVyUHg9XCJ7e2l0ZW1TaXplICogdmlzaWJsZUl0ZW1zfX1cIlxuICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9uc1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAjY2RrVmlydHVhbEZvclxuICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNBcnJheTsgdHJhY2tCeTogdHJhY2tCeUZuOyB0ZW1wbGF0ZUNhY2hlU2l6ZTogMDsgZXZlbiBhcyBldmVuOyBvZGQgYXMgb2RkOyBpbmRleCBhcyBpbmRleDsgY291bnQgYXMgY291bnQ7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3Q7XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb24sIGV2ZW4sIG9kZCwgaW5kZXgsIGNvdW50LCBmaXJzdCwgbGFzdH1cIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVzWydtdWx0aVNlbGVjdE9wdGlvblRlbXBsYXRlJ10gfHwgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGVcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbXVsdGlzZWxlY3RPcHRpb25zRGl2PlxuICA8ZGl2XG4gICAgW25nU3R5bGVdPVwib3B0aW9uc01heEhlaWdodCAhPT0gJ2F1dG8nID8geyAnbWF4SGVpZ2h0LnB4Jzogb3B0aW9uc01heEhlaWdodCwgb3ZlcmZsb3dZOiAnc2Nyb2xsJyB9IDoge31cIlxuICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9uc1wiXG4gID5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPlxuICA8Yy1tdWx0aS1zZWxlY3Qtb3B0aW9uXG4gICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXG4gICAgW3RleHRdPVwib3B0aW9uLnRleHRcIlxuICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgIFt2aXNpYmxlXT1cIm9wdGlvbi52aXNpYmxlXCJcbiAgPlxuICAgIHt7b3B0aW9uLnRleHR9fVxuICA8L2MtbXVsdGktc2VsZWN0LW9wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
1109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQU9MLE1BQU0sRUFHTixNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRyxPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBbUIsZUFBZSxFQUE2QixNQUFNLG1CQUFtQixDQUFDO0FBQ2hHLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFB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aEMsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNFLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDMkIsUUFBUTtzQkFBM0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ1EsY0FBYztzQkFBdkUsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBR3BELFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPO2dCQXFCUixtQkFBbUI7c0JBRDlCLFdBQVc7dUJBQUMsMkJBQTJCO2dCQU01QixZQUFZO3NCQUR2QixXQUFXO3VCQUFDLG9CQUFvQjtnQkFNckIsUUFBUTtzQkFEbkIsV0FBVzt1QkFBQyxlQUFlO2dCQWFPLE9BQU87c0JBQXpDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWtFSSxTQUFTO3NCQUE3QyxZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQ25DLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBzaWduYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgSTE4blBsdXJhbFBpcGUsIE5nQ2xhc3MsIE5nRm9yT2YsIE5nSWYsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvY3VzYWJsZU9wdGlvbiwgRm9jdXNLZXlNYW5hZ2VyLCBGb2N1c01vbml0b3IsIEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsIENka1ZpcnR1YWxGb3JPZiwgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdFdpdGgsIGRlYm91bmNlVGltZSwgZGVsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTW9kaWZpZXIsIE1vZGlmaWVyQXJndW1lbnRzLCBPcHRpb25zIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25NZW51RGlyZWN0aXZlLCBEcm9wZG93blRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2Ryb3Bkb3duJztcbmltcG9ydCB7IEVsZW1lbnRDb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnQtY292ZXInO1xuaW1wb3J0IHsgVGVtcGxhdGVJZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBJTXVsdGlTZWxlY3QsIElPcHRpb24sIFNlYXJjaEZuIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnR5cGUnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1zZWxlY3Qtb3B0aW9uL211bHRpLXNlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QvbXVsdGktc2VsZWN0LW5hdGl2ZS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0VGFnQ29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktc2VsZWN0LXRhZy9tdWx0aS1zZWxlY3QtdGFnLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdFNlYXJjaERpcmVjdGl2ZSB9IGZyb20gJy4vbXVsdGktc2VsZWN0LXNlYXJjaC5kaXJlY3RpdmUnO1xuXG5pbnRlcmZhY2UgSVBsdXJhbE1hcCB7XG4gIFtrOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBvYnNlcnZlUmVmZXJlbmNlTW9kaWZpZXI6IE1vZGlmaWVyPHN0cmluZywgYW55PiA9IHtcbiAgbmFtZTogJ29ic2VydmVSZWZlcmVuY2VNb2RpZmllcicsIGVuYWJsZWQ6IHRydWUsIHBoYXNlOiAnbWFpbicsIGZuKHsgc3RhdGUgfSkge30sXG5cbiAgZWZmZWN0OiAoeyBzdGF0ZSwgaW5zdGFuY2UgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pID0+IHtcbiAgICBjb25zdCBST19QUk9QID0gJ19fcG9wcGVyanNST19fJztcbiAgICBjb25zdCB7IHJlZmVyZW5jZSB9ID0gc3RhdGUuZWxlbWVudHM7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmVmZXJlbmNlW1JPX1BST1BdID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZWZlcmVuY2VbUk9fUFJPUF0ub2JzZXJ2ZShyZWZlcmVuY2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZWZlcmVuY2VbUk9fUFJPUF0uZGlzY29ubmVjdCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVsZXRlIHJlZmVyZW5jZVtST19QUk9QXTtcbiAgICB9O1xuICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjTXVsdGlTZWxlY3QnLFxuICBwcm92aWRlcnM6IFtcbiAgICBNdWx0aVNlbGVjdFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0Q29tcG9uZW50KSwgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgSTE4blBsdXJhbFBpcGUsXG4gICAgTmdDbGFzcyxcbiAgICBOZ0lmLFxuICAgIE5nRm9yT2YsXG4gICAgTmdTdHlsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsXG4gICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxuICAgIENka1ZpcnR1YWxGb3JPZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNdWx0aVNlbGVjdFRhZ0NvbXBvbmVudCxcbiAgICBNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICBNdWx0aVNlbGVjdFNlYXJjaERpcmVjdGl2ZSxcbiAgICBEcm9wZG93bkNvbXBvbmVudCxcbiAgICBEcm9wZG93blRvZ2dsZURpcmVjdGl2ZSxcbiAgICBEcm9wZG93bk1lbnVEaXJlY3RpdmUsXG4gICAgRWxlbWVudENvdmVyQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBJTXVsdGlTZWxlY3QsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSBtdWx0aVNlbGVjdFNlcnZpY2U6IE11bHRpU2VsZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzXG4gICkge1xuICAgIHRoaXMuZGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLiN2YWx1ZSkuY3JlYXRlKCk7XG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5tdWx0aXBsZSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkaWZmZXIhOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9hbGxvd0NyZWF0ZU9wdGlvbnM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9sb2FkaW5nOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9tdWx0aXBsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdmlydHVhbFNjcm9sbGVyOiBCb29sZWFuSW5wdXQ7XG5cbiAgcmVhZG9ubHkgI2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcmVhZG9ubHkgI29wdGlvbnNSZWFkeSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICByZWFkb25seSBvcHRpb25zQXJyYXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJT3B0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgI29wdGlvbnM6IE1hcDxhbnksIElPcHRpb24+ID0gbmV3IE1hcCgpO1xuICByZWFkb25seSBvcHRpb25zU2VsZWN0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJT3B0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgb3B0aW9uc1NlbGVjdGVkOiBNYXA8YW55LCBJT3B0aW9uPiA9IG5ldyBNYXAoKTtcbiAgcmVhZG9ubHkgdmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuXG4gIG9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHt9O1xuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiAoc3RyaW5nIHwgc3RyaW5nW10pKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW3ZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IEFycmF5KDApO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdXNlcnMgdG8gY3JlYXRlIG9wdGlvbnMgaWYgdGhleSBhcmUgbm90IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHNpbmNlIDQuNS4yXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgYWxsb3dDcmVhdGVPcHRpb25zKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jYWxsb3dDcmVhdGVPcHRpb25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NyZWF0ZU9wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbG93Q3JlYXRlT3B0aW9ucztcbiAgfVxuXG4gICNhbGxvd0NyZWF0ZU9wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW5hYmxlcyBzZWxlY3Rpb24gY2xlYW5lciBlbGVtZW50XG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgY2xlYW5lciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIG11bHRpLXNlbGVjdCBjb21wb25lbnRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgICAgdGhpcy5zZXRGb2N1c01vbml0b3IoIXZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWRkIGxvYWRpbmcgc3Bpbm5lciBhbmQgcmVkdWNlZCBvcGFjaXR5LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBzaW5jZSA0LjUuMlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNsb2FkaW5nID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsb2FkaW5nO1xuICB9XG5cbiAgI2xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoYXQgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZVxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5fbXVsdGlwbGUpO1xuICB9XG5cbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgfVxuXG4gIHByaXZhdGUgX211bHRpcGxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGRlbiBuYXRpdmUgc2VsZWN0IGZvcm1cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBASW5wdXQoKSBuYXRpdmVGb3JtSWQgPSAnJztcblxuICAvKipcbiAgICogSGlkZGVuIG5hdGl2ZSBzZWxlY3QgaWRcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBASW5wdXQoKSBuYXRpdmVJZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBIaWRkZW4gbmF0aXZlIHNlbGVjdCBuYW1lXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KCkgbmF0aXZlTmFtZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG9wdGlvbiBlbGVtZW50c1xuICAgKiBAdHlwZSBJT3B0aW9uW11cbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBvcHRpb25zKG9wdGlvbnM6IElPcHRpb25bXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jb3B0aW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBtYXhIZWlnaHQgb2Ygb3B0aW9ucyBsaXN0IGluIHB4XG4gICAqIEB0eXBlIChzdHJpbmcgfCBudW1iZXIpXG4gICAqIEBkZWZhdWx0ICdhdXRvJ1xuICAgKi9cbiAgQElucHV0KCkgb3B0aW9uc01heEhlaWdodCA9ICdhdXRvJztcblxuICAvKipcbiAgICogU2V0cyBvcHRpb24gc3R5bGVcbiAgICogQHR5cGUgJ2NoZWNrYm94JyB8ICd0ZXh0J1xuICAgKiBAZGVmYXVsdCAnY2hlY2tib3gnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgb3B0aW9uc1N0eWxlKHZhbHVlOiAnY2hlY2tib3gnIHwgJ3RleHQnKSB7XG4gICAgdGhpcy5tdWx0aVNlbGVjdFNlcnZpY2Uub3B0aW9uc1N0eWxlID0gdmFsdWUgPz8gJ2NoZWNrYm94JztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBzaG9ydCBoaW50IHRoYXQgaXMgdmlzaWJsZSBpbiB0aGUgc2VhcmNoIGlucHV0XG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnU2VsZWN0Li4uJ1xuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0Li4uJztcblxuICAvKipcbiAgICogRW5hYmxlcyBzZWFyY2ggaW5wdXQgZWxlbWVudFxuICAgKiBAdHlwZSBib29sZWFuIHwgU2VhcmNoRm4gfCAnZXh0ZXJuYWwnXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHNlYXJjaDogKGJvb2xlYW4gfCAnZXh0ZXJuYWwnIHwgU2VhcmNoRm4pID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgbGFiZWwgZm9yIG5vIHJlc3VsdHMgd2hlbiBmaWx0ZXJpbmdcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICdubyBpdGVtcydcbiAgICovXG4gIEBJbnB1dCgpIHNlYXJjaE5vUmVzdWx0c0xhYmVsID0gJ25vIGl0ZW1zJztcblxuICAvKipcbiAgICogU2V0cyBpbml0aWFsIHNlYXJjaCBzdHJpbmdcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2VhcmNoVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5fc2VhcmNoVmFsdWUgIT09IHZhbHVlLnRyaW1TdGFydCgpKSB7XG4gICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbHVlLnRyaW1TdGFydCgpO1xuICAgICAgdGhpcy52aXNpYmxlID0gISF0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aCA/IHRydWUgOiB0aGlzLnZpc2libGU7XG4gICAgICB0aGlzLmZpbHRlck9wdGlvbnModGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl9zZWFyY2hWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlYXJjaFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogRW1pdHMgc2VhcmNoVmFsdWUgc3RyaW5nIGZvciBleHRlcm5hbCBmaWx0ZXJpbmdcbiAgICogQHR5cGUgc3RyaW5nXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VhcmNoVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRW5hYmxlcyBzZWxlY3QgYWxsIGJ1dHRvblxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdEFsbCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdCBhbGwgYnV0dG9uIGxhYmVsXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCAnU2VsZWN0IGFsbCBvcHRpb25zJ1xuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0QWxsTGFiZWwgPSAnU2VsZWN0IGFsbCBvcHRpb25zJztcblxuICAvKipcbiAgICogU2VsZWN0aW9uIHR5cGVcbiAgICogQHR5cGUgJ2NvdW50ZXInIHwgJ3RhZ3MnIHwgJ3RleHQnXG4gICAqIEBkZWZhdWx0ICd0YWdzJ1xuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uVHlwZTogJ2NvdW50ZXInIHwgJ3RhZ3MnIHwgJ3RleHQnID0gJ3RhZ3MnO1xuXG4gIC8qKlxuICAgKiBDb3VudGVyIHNlbGVjdGlvbiBsYWJlbCB2YWx1ZVxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgJ2l0ZW0ocykgc2VsZWN0ZWQnXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlQ291bnRlclRleHQ6IHN0cmluZyA9ICdpdGVtKHMpIHNlbGVjdGVkJztcblxuICAvKipcbiAgICogQ291bnRlciBzZWxlY3Rpb24gbGFiZWwgcGx1cmFsIG1hcCBmb3IgSTE4blBsdXJhbFBpcGVcbiAgICogQHR5cGUgSVBsdXJhbE1hcFxuICAgKiBAZGVmYXVsdCB7ICc9MSc6ICdpdGVtIHNlbGVjdGVkJywgJ290aGVyJzogJ2l0ZW1zIHNlbGVjdGVkJyB9XG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlQ291bnRlclRleHRQbHVyYWxNYXA/OiBJUGx1cmFsTWFwID0geyAnPTEnOiAnaXRlbSBzZWxlY3RlZCcsICdvdGhlcic6ICdpdGVtcyBzZWxlY3RlZCcgfTtcblxuICAvKipcbiAgICogU2l6ZSB0aGUgY29tcG9uZW50IHNtYWxsIG9yIGxhcmdlLlxuICAgKiBAdHlwZSAnc20nIHwgJ2xnJyB8IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgc2l6ZT86ICdzbScgfCAnbGcnO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHZhbHVlIG9mIG11bHRpLXNlbGVjdFxuICAgKiBAdHlwZSBzdHJpbmcgfCBzdHJpbmdbXVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW3ZhbHVlID8/IHVuZGVmaW5lZF07XG4gICAgaWYgKHRoaXMuZGlmZmVyKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZihuZXdWYWx1ZSk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICB0aGlzLiN2YWx1ZSA9IFsuLi5uZXdWYWx1ZV07XG4gICAgICAgIHRoaXMudmFsdWUkLm5leHQoWy4uLm5ld1ZhbHVlXSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgICAgIC8vIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbD8uc2VsZWN0ZWQgPz8gWy4uLnRoaXMuI3ZhbHVlXTtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IFsuLi52YWx1ZV0gOiB2YWx1ZT8udG9TdHJpbmcoKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAjdmFsdWU6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEVtaXRzIHZhbHVlQ2hhbmdlXG4gICAqIEB0eXBlIHN0cmluZyB8IHN0cmluZ1tdXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IHN0cmluZ1tdPigpO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzdWFsIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqIEB0eXBlIGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB2aXJ0dWFsIHNjcm9sbGVyIGZvciBvcHRpb25zIGxpc3QuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCB2aXJ0dWFsU2Nyb2xsZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl92aXJ0dWFsU2Nyb2xsZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHZpcnR1YWxTY3JvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlydHVhbFNjcm9sbGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmlydHVhbFNjcm9sbGVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFtb3VudCBvZiB2aXNpYmxlIG9wdGlvbnMsIGlmIHNldCAtIG92ZXJ3cml0ZXMgb3B0aW9uc01heEhlaWdodFxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlZmF1bHQgOFxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZpc2libGVJdGVtcyh2YWx1ZSkge1xuICAgIHRoaXMuX3Zpc2libGVJdGVtcyA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlIHx8IDgpO1xuICAgIHRoaXMub3B0aW9uc01heEhlaWdodCA9ICgodGhpcy5pdGVtU2l6ZSAqIHRoaXMuX3Zpc2libGVJdGVtcykgKyAxNikudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlSXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVJdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2libGVJdGVtcyA9IDg7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBvcHRpb24gaXRlbSBpbiB0aGUgbGlzdCAoaW4gcGl4ZWxzKS5cbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IDQwXG4gICAqL1xuICBASW5wdXQoKSBpdGVtU2l6ZTogbnVtYmVyID0gNDA7XG5cbiAgLyoqXG4gICAqIE1pbiB3aWR0aCBvZiB0aGUgb3B0aW9ucyBsaXN0IChpbiBwaXhlbHMpLlxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlZmF1bHQgMTk2XG4gICAqL1xuICBASW5wdXQoKSBpdGVtTWluV2lkdGg6IG51bWJlciA9IDE5NjtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBkcm9wZG93biBzZWxlY3QgY29tcG9uZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHZpc2libGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh2aXNpYmxlICE9PSB0aGlzLl92aXNpYmxlKSB7XG4gICAgICB0aGlzLl92aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnRvZ2dsZVZpc2libGUodmlzaWJsZSk7XG4gICAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgICAgLy8gdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmlzaWJsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB2aXNpYmxlQ2hhbmdlXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwb3BwZXIgT3B0aW9ucyBvYmplY3RcbiAgICogQHR5cGUgUGFydGlhbDxPcHRpb25zPlxuICAgKi9cbiAgQElucHV0KCdwb3BwZXJPcHRpb25zJykgcG9wcGVyanNPcHRpb25zOiBQYXJ0aWFsPE9wdGlvbnM+ID0ge1xuICAgIHN0cmF0ZWd5OiAnZml4ZWQnLCBtb2RpZmllcnM6IFtvYnNlcnZlUmVmZXJlbmNlTW9kaWZpZXIsIHtcbiAgICAgIG5hbWU6ICdvZmZzZXQnLCBvcHRpb25zOiB7XG4gICAgICAgIG9mZnNldDogKCkgPT4gdGhpcy5zZWxlY3Rpb25UeXBlID09PSAndGFncycgJiYgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA/IFstMiwgOF0gOiBbLTEyLCAxMl1cbiAgICAgIH1cbiAgICB9XVxuICB9O1xuXG4gIGlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub3B0aW9uc1NlbGVjdGVkLnZhbHVlcygpXTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZE9wdGlvbnNUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5sYWJlbCkuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldCBjb3VudGVyVGV4dCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RofSAke3RoaXMuc2VsZWN0aW9uVHlwZUNvdW50ZXJUZXh0fWA7XG4gIH1cblxuICBnZXQgY291bnRlclRleHRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnNlbGVjdGlvblR5cGVDb3VudGVyVGV4dFBsdXJhbE1hcCA/PyB0eXBlb2YgdGhpcy5zZWxlY3Rpb25UeXBlQ291bnRlclRleHQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBmb2N1c01vbml0b3JTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG5cbiAgQENvbnRlbnRDaGlsZHJlbihNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBtdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50ITogUXVlcnlMaXN0PE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcbiAgQFZpZXdDaGlsZHJlbihNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudCkgbXVsdGlTZWxlY3RPcHRpb25zVmlldyE6IFF1ZXJ5TGlzdDxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGRyZW4oJ3Njcm9sbFZpZXdwb3J0Jykgc2Nyb2xsVmlld3BvcnRWaWV3ITogUXVlcnlMaXN0PENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydD47XG4gIEBWaWV3Q2hpbGQoJ29wdGlvbnMnKSBvcHRpb25zRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY7XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFZpZXdwb3J0ITogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHByb3RlY3RlZCB0ZW1wbGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IH0gPSB7fTtcbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZUlkRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGNvbnRlbnRUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVJZERpcmVjdGl2ZT47XG5cbiAgcHJpdmF0ZSBsaXN0S2V5TWFuYWdlciE6IEZvY3VzS2V5TWFuYWdlcjxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JykgaW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd25NZW51JykgZHJvcGRvd25NZW51ITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChEcm9wZG93bkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChEcm9wZG93blRvZ2dsZURpcmVjdGl2ZSwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duVG9nZ2xlITogRWxlbWVudFJlZjtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgIH07XG4gIH1cblxuICBnZXQgbXVsdGlzZWxlY3RDbGFzc2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnZm9ybS1tdWx0aS1zZWxlY3QnOiB0cnVlLFxuICAgICAgJ2Zvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvbi10YWdzJzogdGhpcy5zZWxlY3Rpb25UeXBlID09PSAndGFncycgJiYgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAsXG4gICAgICBbYGZvcm0tbXVsdGktc2VsZWN0LSR7dGhpcy5zaXplfWBdOiAhIXRoaXMuc2l6ZSxcbiAgICAgICdmb3JtLW11bHRpLXNlbGVjdC13aXRoLWNsZWFuZXInOiB0aGlzLmNsZWFuZXIsXG4gICAgICBzaG93OiB0aGlzLnZpc2libGUsXG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICAgICdpcy12YWxpZCc6IHRoaXMudmFsaWQgPT09IHRydWUsXG4gICAgICAnaXMtaW52YWxpZCc6IHRoaXMudmFsaWQgPT09IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZScpXG4gIHByaXZhdGUgZ2V0IGFyaWFNdWx0aVNlbGVjdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gIHByaXZhdGUgZ2V0IGFyaWFFeHBhbmRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgcHJpdmF0ZSBnZXQgdGFiSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXQgdGFiSW5kZXgodmFsdWUpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3RhYkluZGV4ID0gdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnNlYXJjaCA/IC0xIDogdmFsdWUgPT09IG51bGwgPyBudWxsIDogMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3RhYkluZGV4OiBudW1iZXIgfCBudWxsID0gLTE7XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5dXAnLCBbJyRldmVudCddKSBvbktleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgY29uc3QgdGFyZ2V0VGFnTmFtZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xuICAgIGlmICgkZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICB0aGlzLnNldEZvY3VzKCdrZXlib2FyZCcsICdvbktleVVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbJ0VudGVyJywgJ1NwYWNlJywgJ0Fycm93RG93biddLmluY2x1ZGVzKCRldmVudC5jb2RlKSAmJiBbdGhpcy5pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XS5pbmNsdWRlcygkZXZlbnQudGFyZ2V0KSkge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghdGhpcy5zZWFyY2gpIHtcbiAgICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ1RhYiddLmluY2x1ZGVzKCRldmVudC5rZXkpKSB7XG5cbiAgICAgIGlmICgkZXZlbnQudGFyZ2V0ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoKSB7XG4gICAgICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aXNpYmxlICYmIHRoaXMuc3VidHJlZUZvY3VzZWQpIHtcbiAgICAgICAgaWYgKHRhcmdldFRhZ05hbWUgPT09ICdDLU1VTFRJLVNFTEVDVC1PUFRJT04nKSB7XG5cbiAgICAgICAgICBpZiAodGhpcy50YWJUYXJnZXQgPT09ICdDLU1VTFRJLVNFTEVDVC1PUFRJT04nKSB7XG4gICAgICAgICAgICBpZiAoJGV2ZW50LnNoaWZ0S2V5ICYmIHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbT8udmFsdWUgPT09IHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLnNsaWNlKDApWzBdLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoJ2tleWJvYXJkJywgJ29uS2V5VXAnKTtcbiAgICAgICAgICAgICAgdGhpcy50YWJUYXJnZXQgPSB0YXJnZXRUYWdOYW1lO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghJGV2ZW50LnNoaWZ0S2V5ICYmIHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbT8udmFsdWUgPT09IHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLnNsaWNlKC0xKVswXS52YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCdrZXlib2FyZCcsICdvbktleVVwJyk7XG4gICAgICAgICAgICAgIHRoaXMudGFiVGFyZ2V0ID0gdGFyZ2V0VGFnTmFtZTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtKDApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0gfHwgdGhpcy50YWJUYXJnZXQgIT09IHRhcmdldFRhZ05hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZU9wdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5saXN0S2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKSA6IHRoaXMubGlzdEtleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJUYXJnZXQgPSB0YXJnZXRUYWdOYW1lO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXRUYWdOYW1lID0gKCRldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWU7XG4gICAgaWYgKCRldmVudC5rZXkgPT09ICdFbnRlcicgJiYgdGFyZ2V0VGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmICgkZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgdGhpcy50YWJUYXJnZXQgPSB0YXJnZXRUYWdOYW1lO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgdGFyZ2V0VGFnTmFtZSAhPT0gJ0MtTVVMVEktU0VMRUNULU9QVElPTicpIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoJGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5zZXRGb2N1cygna2V5Ym9hcmQnLCAnb25LZXlVcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBhdm9pZCBzZXR0aW5nIGZvY3VzIHRvIG9wdGlvbiB3aGlsZSBvbiBpbnB1dCBlbGVtZW50XG4gICAgaWYgKCRldmVudC50YXJnZXQgPT09IHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCRldmVudC5rZXkgIT09ICdUYWInKSB7XG4gICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyPy5vbktleWRvd24oJGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFt0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnRdLmluY2x1ZGVzKCRldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSAhdGhpcy52aXNpYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuc2V0Rm9jdXMoJ21vdXNlJywgJ29uQ2xpY2snKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpYmxlT3B0aW9ucyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgZ2V0IHN1YnRyZWVGb2N1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdWJ0cmVlRm9jdXNlZDtcbiAgfVxuXG4gIHNldCBzdWJ0cmVlRm9jdXNlZChmb2N1c2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3VidHJlZUZvY3VzZWQgPSB0aGlzLmRpc2FibGVkID8gZmFsc2UgOiBmb2N1c2VkO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBmb2N1c2VkID09PSBmYWxzZSA/IGZhbHNlIDogdGhpcy52aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihudWxsKTtcblxuICBwcml2YXRlIG5hdGl2ZVNlbGVjdFJlZiE6IGFueTtcblxuICBmb2N1c09yaWdpbihvcmlnaW46IEZvY3VzT3JpZ2luKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhb3JpZ2luO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLm11bHRpcGxlKSxcbiAgICAgICAgZGVsYXkoMCksXG4gICAgICAgIHRhcChjaGFuZ2UgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2UuYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjbG9zZSBkcm9wZG93biBmb3Igc2luZ2xlIHNlbGVjdCAoIW11bHRpcGxlKVxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLmNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBkZWxheSgwKSxcbiAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy4jb3B0aW9uc1JlYWR5JCksXG4gICAgICAgIHRhcCgoW2NoYW5nZSwgcmVhZHldKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBhZGRlZCwgcmVtb3ZlZCB9ID0geyAuLi5jaGFuZ2UgfTtcbiAgICAgICAgICAvLyBhZGRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgLy8gICBjb25zdCB2YWx1ZSA9IHRoaXMuI29wdGlvbnMuZ2V0KGtleSk7XG4gICAgICAgICAgLy8gICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAvLyAgICAgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgIC8vICAgfVxuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZC5kZWxldGUodmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jb3B0aW9ucy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLm9wdGlvbnNTZWxlY3RlZCQubmV4dChBcnJheS5mcm9tKHRoaXMub3B0aW9uc1NlbGVjdGVkLnZhbHVlcygpKSk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi50aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZF07XG5cbiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudFNpemUoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIHNldCBpbml0aWFsIHZhbHVlc1xuICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCguLi50aGlzLiN2YWx1ZSk7XG5cbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQWxsT3B0aW9ucygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLm9wdGlvbnNBcnJheSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAob3B0aW9ucyA9PiB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlT3B0aW9ucy5zZXQob3B0aW9ucy5zb21lKChpdGVtKSA9PiBpdGVtLnZpc2libGUpKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICBvcHRpb24uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNldFJlbmRlcmVkUmFuZ2UoeyBzdGFydDogMCwgZW5kOiB0aGlzLnZpc2libGVJdGVtcyB9KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8uZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IG9wdGlvbnMuZmluZChpdGVtID0+IGl0ZW0udmFsdWUgPT09IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgIG9wdGlvbi52aXNpYmxlID0gZm91bmQ/LnZpc2libGUgPz8gZmFsc2U7XG4gICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLmZpcnN0Rm9jdXNhYmxlSXRlbTtcbiAgICAgICAgICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oZmlyc3RGb2N1c2FibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtKDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8ubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJz0+IG9wdGlvbnNBcnJheSQnLCBvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy50YWJJbmRleCA9IDA7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNkZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy4jZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNldEZvY3VzTW9uaXRvcihmYWxzZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10pIHtcbiAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyA9IGNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgICBpZiAodmFsdWVDaGFuZ2VzLmN1cnJlbnRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhckFsbE9wdGlvbnMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG1ha2VPcHRpb25zKG9wdGlvbnM6IElPcHRpb25bXSkge1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoID09PSAnZXh0ZXJuYWwnICYmIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLiNvcHRpb25zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgdmFsdWUudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24udmFsdWU7XG4gICAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSA/PyBvcHRpb24ubGFiZWwsXG4gICAgICAgIGxhYmVsOiBvcHRpb24ubGFiZWwgPz8gb3B0aW9uLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkID09PSB0cnVlLFxuICAgICAgICB2aXNpYmxlOiB0aGlzLnNlYXJjaCA9PT0gJ2V4dGVybmFsJyA/IHRydWUgOiBvcHRpb24udmlzaWJsZSAhPT0gZmFsc2UsXG4gICAgICAgIHRleHQ6IG9wdGlvbi50ZXh0ID8/IG9wdGlvbi5sYWJlbCA/PyBvcHRpb24udmFsdWUsXG4gICAgICAgIHNlbGVjdGVkOiBvcHRpb24uc2VsZWN0ZWRcbiAgICAgICAgLy8gc2VsZWN0ZWQ6IHRoaXMubXVsdGlTZWxlY3RTZXJ2aWNlLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uLnZhbHVlKSxcbiAgICAgICAgLy8gaWQ6IG9wdGlvbi5pZFxuICAgICAgfTtcbiAgICAgIHRoaXMuI29wdGlvbnMuc2V0KGtleSwgeyAuLi52YWx1ZSB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsdGVyT3B0aW9ucyh0aGlzLnNlYXJjaFZhbHVlKTtcblxuICAgIHRoaXMuI29wdGlvbnNSZWFkeSQubmV4dCh0cnVlKTtcbiAgICAvLyBjb25zb2xlLmxvZygnbWFrZU9wdGlvbnMnLCB0aGlzLiNvcHRpb25zLnNpemUpO1xuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudD8ubm90aWZ5T25DaGFuZ2VzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGxlcigpO1xuXG4gICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkoMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91czogUXVlcnlMaXN0PE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50PiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBwcmV2aW91cy50b0FycmF5KCkubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1cnIgPSBjdXJyZW50LnRvQXJyYXkoKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByZXYpID09PSBKU09OLnN0cmluZ2lmeShjdXJyKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVPcHRpb25zLnNldCh0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQ/LnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZpc2libGUpKTtcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZU9wdGlvbnMoKSkge1xuICAgICAgICAgIHRoaXMubWFrZU9wdGlvbnModGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50LnRvQXJyYXkoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy52aXNpYmxlT3B0aW9ucy5zZXQodGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5sZW5ndGggPiAwKTtcbiAgICBpZiAodGhpcy52aXNpYmxlT3B0aW9ucygpKSB7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tdWx0aXNlbGVjdFN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5zZXRGb2N1c01vbml0b3IoIXRoaXMuZGlzYWJsZWQpO1xuXG4gICAgdGhpcy5zZXRMaXN0S2V5TWFuYWdlcigpO1xuXG4gICAgdGhpcy5pbnB1dEVsZW1lbnRTaXplKCk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlTmF0aXZlU2VsZWN0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5tdWx0aVNlbGVjdEZvY3VzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZU9wdGlvbj8udmFsdWUgIT09IG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0YWJUYXJnZXQhOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdFN1YnNjcmliZShzdWJzY3JpYmU6IGJvb2xlYW4gPSB0cnVlKSB7XG5cbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5tdWx0aVNlbGVjdFZpc2libGUkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh2aXNpYmxlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25WaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodmlzaWJsZSk7XG4gICAgICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0Py5zZXRSZW5kZXJlZFJhbmdlKHsgc3RhcnQ6IDAsIGVuZDogdGhpcy52aXNpYmxlSXRlbXMgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0oMCk7XG4gICAgICB9KTtcblxuICB9XG5cbiAgY2xlYXJBbGxPcHRpb25zKCRldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNTZWxlY3RlZC52YWx1ZXMoKSkuZmlsdGVyKG9wdGlvbiA9PiAhb3B0aW9uLmRpc2FibGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCguLi5lbmFibGVkT3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdjbGVhckFsbE9wdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGxPcHRpb25zKCkge1xuICAgIGNvbnN0IGVuYWJsZWRPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLiNvcHRpb25zLnZhbHVlcygpKS5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4uZW5hYmxlZE9wdGlvbnMpO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50U2l6ZSgpO1xuICB9XG5cbiAgaGFuZGxlVGFnUmVtb3ZlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRGb2N1cygncHJvZ3JhbScsICdoYW5kbGVUYWdSZW1vdmUnKTtcbiAgfVxuXG4gIHNldEZvY3VzKG9yaWdpbjogRm9jdXNPcmlnaW4gPSAncHJvZ3JhbScsIG1ldGhvZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50Pih0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50ID8/IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICBjb25zdCBwcmV2ZW50U2Nyb2xsID0gb3JpZ2luID09PSAncHJvZ3JhbSc7XG4gICAgdGhpcy5mb2N1c01vbml0b3I/LmZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgeyBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50U2Nyb2xsIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXRGb2N1cycsIG9yaWdpbiwgbWV0aG9kTmFtZSwgJ3ByZXZlbnRTY3JvbGw6JywgcHJldmVudFNjcm9sbCwgZWxlbWVudC50YWdOYW1lKTtcbiAgfVxuXG4gIGZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gICAgdGhpcy4jb3B0aW9ucy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHNlYXJjaFN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpdGVtLnZpc2libGUgPSB0aGlzLnNlYXJjaChpdGVtLCBzZWFyY2hTdHJpbmcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWFyY2ggPT09ICdleHRlcm5hbCcgfHwgIXNlYXJjaFN0cmluZykge1xuICAgICAgICAvLyBpdGVtLnZpc2libGUgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtLnZpc2libGUgPSBpdGVtLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFN0cmluZykgPz8gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLm9wdGlvbnNBcnJheSQubmV4dChBcnJheS5mcm9tKHRoaXMuI29wdGlvbnMudmFsdWVzKCkpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52aXNpYmxlKSk7XG5cbiAgfVxuXG4gIGNyZWF0ZU5hdGl2ZVNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE11bHRpU2VsZWN0TmF0aXZlU2VsZWN0Q29tcG9uZW50KTtcbiAgICB0aGlzLnVwZGF0ZU5hdGl2ZVNlbGVjdCgpO1xuICB9XG5cbiAgdXBkYXRlTmF0aXZlU2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5uYXRpdmVTZWxlY3RSZWYgfHwgIXRoaXMubmF0aXZlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20odGhpcy5vcHRpb25zU2VsZWN0ZWQpLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0ZWQsIHZhbHVlLCBsYWJlbCB9ID0gaXRlbVsxXTtcbiAgICAgIHJldHVybiB7IHNlbGVjdGVkLCB2YWx1ZSwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5mb3JtID0gdGhpcy5uYXRpdmVGb3JtSWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuaWQgPSB0aGlzLm5hdGl2ZUlkO1xuICAgIHRoaXMubmF0aXZlU2VsZWN0UmVmLmluc3RhbmNlLm5hbWUgPSB0aGlzLm5hdGl2ZU5hbWU7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2Uub3B0aW9ucyA9IFsuLi5vcHRpb25zXTtcbiAgICB0aGlzLm5hdGl2ZVNlbGVjdFJlZi5pbnN0YW5jZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgdGhpcy5uYXRpdmVTZWxlY3RSZWYuaW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpbnB1dEVsZW1lbnRTaXplKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGlmICgodGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgfHwgdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnY291bnRlcicpICYmICF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Py5kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzaXplJywgKHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoICsgMikudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU2VhcmNoS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGggfHwgdGhpcy5vcHRpb25zU2VsZWN0ZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ0JhY2tzcGFjZScsICdEZWxldGUnXS5pbmNsdWRlcygkZXZlbnQua2V5KSkge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gIW9wdGlvbi5kaXNhYmxlZCkucG9wKCk7XG4gICAgICBpZiAobGFzdCkge1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0U2VydmljZS5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChsYXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZvY3VzTW9uaXRvcihtb25pdG9yOiBib29sZWFuKSB7XG4gICAgaWYgKG1vbml0b3IgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uID0gdGhpcy5mb2N1c01vbml0b3I/Lm1vbml0b3IodGhpcy5lbGVtZW50UmVmLCB0cnVlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyB0byBhdm9pZCBmb2N1cyBsb3N0IG9uIHNwZWVkIHNjcm9sbGluZyB3aXRoIHZpcnR1YWxTY3JvbGxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKG9yaWdpbikgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnRyZWVGb2N1c2VkID0gdGhpcy5mb2N1c09yaWdpbihvcmlnaW4pO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvcj8uc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICAgIHRoaXMuZm9jdXNNb25pdG9yU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2ZU9wdGlvbjogKEZvY3VzYWJsZU9wdGlvbiAmIE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSB8IG51bGwgPSBudWxsO1xuXG4gIGhhbmRsZVNjcm9sbGVkSW5kZXhDaGFuZ2Uoc2Nyb2xsZWRJbmRleDogbnVtYmVyLCBzY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG5cbiAgICBpZiAoIXRoaXMuc2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQgPSBzY3JvbGxWaWV3cG9ydDtcbiAgICB9XG5cbiAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnZpc2libGUpO1xuICAgIGNvbnN0IGZpcnN0VmlzaWJsZU9wdGlvbiA9IGF2YWlsYWJsZU9wdGlvbnNbc2Nyb2xsZWRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uSW5kZXggPSBhdmFpbGFibGVPcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLmFjdGl2ZU9wdGlvbj8udmFsdWUpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC50b0FycmF5KCk7XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCA+IGFjdGl2ZU9wdGlvbkluZGV4KSB7XG4gICAgICBjb25zdCBmaXJzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmQob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gZmlyc3RWaXNpYmxlT3B0aW9uPy52YWx1ZSk7XG4gICAgICBpZiAoZmlyc3RWaXNpYmxlSXRlbSAmJiBzY3JvbGxlZEluZGV4KSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShmaXJzdFZpc2libGVJdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsZWRJbmRleCArIHRoaXMudmlzaWJsZUl0ZW1zIC0gMiA8PSBhY3RpdmVPcHRpb25JbmRleCkge1xuICAgICAgY29uc3QgbGFzdFZpc2libGVJdGVtID0gb3B0aW9uc0FycmF5LmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdFZpc2libGVPcHRpb24udmFsdWUpO1xuICAgICAgaWYgKGxhc3RWaXNpYmxlSXRlbSA+IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShsYXN0VmlzaWJsZUl0ZW0gKyB0aGlzLnZpc2libGVJdGVtcyAtIDIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIG9wdGlvbjogSU9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gIH1cblxuICBoYW5kbGVTZWFyY2hWYWx1ZUNoYW5nZShzZWFyY2hWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlO1xuICAgIGlmICghc2VhcmNoVmFsdWUpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaXJ0dWFsU2Nyb2xsZXIoKSB7XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBmb3IgdmlydHVhbFNjcm9sbGVyXG4gICAgdGhpcy5jb250ZW50VGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcbiAgICB9KTtcblxuICAgIC8vIGlmIG5vIHRlbXBsYXRlIGZvdW5kLCBnZXQgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGUgZnJvbSB2aWV3XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlc1snbXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQgPSB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc1ZpZXc7XG4gICAgfVxuXG4gICAgLy8gbXVsdGlTZWxlY3RPcHRpb25zQ29udGVudCBnZXRzIG91dCBvZiBvcmRlciBvbiBjaGFuZ2VzXG4gICAgLy8gZG8gc29ydCgpIGFuZCByZXNldCgpXG4gICAgY29uc3QgaW5kZXhPZk9wdGlvbiA9IChvcHRpb246IE11bHRpU2VsZWN0T3B0aW9uQ29tcG9uZW50KSA9PiB7XG4gICAgICByZXR1cm4gWy4uLm9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0/LmluZGV4T2Yob3B0aW9uLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNDaGFuZ2UkOiBPYnNlcnZhYmxlPFF1ZXJ5TGlzdDxNdWx0aVNlbGVjdE9wdGlvbkNvbXBvbmVudD4+ID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50LmNoYW5nZXM7XG5cbiAgICBjb25zdCBzb3J0ZWRPcHRpb25zJCA9IG9wdGlvbnNDaGFuZ2UkLnBpcGUoXG4gICAgICBtYXAob3B0aW9ucyA9PiBvcHRpb25zLnRvQXJyYXkoKSksXG4gICAgICBmaWx0ZXIob3B0aW9ucyA9PiBvcHRpb25zLmxlbmd0aCA+IDApLFxuICAgICAgbWFwKG9wdGlvbnMgPT4gb3B0aW9ucy5zb3J0KChhLCBiKSA9PiBpbmRleE9mT3B0aW9uKGEpIC0gaW5kZXhPZk9wdGlvbihiKSkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICApO1xuXG4gICAgc29ydGVkT3B0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShzb3J0ZWRPcHRpb25zID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5yZXNldChzb3J0ZWRPcHRpb25zKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zY3JvbGxWaWV3cG9ydFZpZXcuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcChjaGFuZ2VzID0+IGNoYW5nZXMudG9BcnJheSgpWzBdKSxcbiAgICAgICAgdGFwKChzY3JvbGxWaWV3cG9ydCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlld3BvcnQgPSBzY3JvbGxWaWV3cG9ydDtcblxuICAgICAgICAgICAgICBjb25zdCBjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIgPSB0aGlzLnNjcm9sbFZpZXdwb3J0LmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgaWYgKGNka1ZpcnR1YWxTY3JvbGxDb250ZW50V3JhcHBlcikge1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNka1ZpcnR1YWxTY3JvbGxDb250ZW50V3JhcHBlciwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpID8/ICcxMnB4JykgKiAzO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25SZWNvcmRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICBtdXRhdGlvblJlY29yZHMuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZGVkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gJ0MtTVVMVEktU0VMRUNULU9QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gdGhpcy5pdGVtTWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtTWluV2lkdGggPSB3aWR0aCArIHBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShjZGtWaXJ0dWFsU2Nyb2xsQ29udGVudFdyYXBwZXIsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy4jZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGlzdEtleU1hbmFnZXIoKSB7XG5cbiAgICAvLyBydW4gb25jZSBvbiBtdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50IGZpcnN0IHNldFxuICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoY2hhbmdlID0+IHtcblxuICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLm11bHRpU2VsZWN0T3B0aW9uc0NvbnRlbnQpXG4gICAgICAgICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAgICAgICAuc2tpcFByZWRpY2F0ZSgob3B0aW9uKSA9PiAob3B0aW9uLmRpc2FibGVkIHx8ICFvcHRpb24udmlzaWJsZSkpO1xuXG4gICAgICAgIGlmICghdGhpcy5fdmlydHVhbFNjcm9sbGVyKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci53aXRoVHlwZUFoZWFkKDMwMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLmNoYW5nZVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoYW5nZSA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVPcHRpb24gPyB0aGlzLmxpc3RLZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24pIDogdGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU9wdGlvbiA9IHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zQ29udGVudC5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgIHRoaXMuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZpcnN0Rm9jdXNhYmxlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5maW5kKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rmlyc3RJdGVtQWN0aXZlKCkge1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlSXRlbSA9IHRoaXMuZmlyc3RGb2N1c2FibGVJdGVtO1xuICAgIGZpcnN0Rm9jdXNhYmxlSXRlbSA/IHRoaXMubGlzdEtleU1hbmFnZXI/LnNldEFjdGl2ZUl0ZW0oZmlyc3RGb2N1c2FibGVJdGVtKSA6IHRoaXMubGlzdEtleU1hbmFnZXI/LnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgIHRoaXMuYWN0aXZlT3B0aW9uID0gdGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSA/PyBudWxsO1xuICB9XG5cbiAgdXBkYXRlQWN0aXZlSXRlbShpbmRleDogbnVtYmVyKTogdm9pZDtcblxuICB1cGRhdGVBY3RpdmVJdGVtPFQgZXh0ZW5kcyAoTXVsdGlTZWxlY3RPcHRpb25Db21wb25lbnQgJiBGb2N1c2FibGVPcHRpb24pPihpdGVtOiBUKTogdm9pZDtcblxuICB1cGRhdGVBY3RpdmVJdGVtKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlSXRlbSA9IHRoaXMuZmlyc3RGb2N1c2FibGVJdGVtID8/IGl0ZW07XG4gICAgZmlyc3RGb2N1c2FibGVJdGVtID8gdGhpcy5saXN0S2V5TWFuYWdlcj8udXBkYXRlQWN0aXZlSXRlbShmaXJzdEZvY3VzYWJsZUl0ZW0pIDogdGhpcy5saXN0S2V5TWFuYWdlcj8udXBkYXRlQWN0aXZlSXRlbSgwKTtcbiAgICBpZiAodGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSkge1xuICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnNDb250ZW50Py5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlT3B0aW9uID0gdGhpcy5saXN0S2V5TWFuYWdlcj8uYWN0aXZlSXRlbSA/PyBudWxsO1xuICB9XG59XG4iLCI8Yy1kcm9wZG93biAjZHJvcGRvd249XCJjRHJvcGRvd25cIlxuICAgICAgICAgICAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm11bHRpc2VsZWN0Q2xhc3Nlc1wiXG4gICAgICAgICAgICBbcG9wcGVyT3B0aW9uc109XCJwb3BwZXJqc09wdGlvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJwaWNrZXJcIj5cbiAgPGRpdiAjZHJvcGRvd25Ub2dnbGU9XCJjRHJvcGRvd25Ub2dnbGVcIiBbY2FyZXRdPVwiZmFsc2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjRHJvcGRvd25Ub2dnbGU+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvblwiPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlbGVjdGlvblR5cGUgPT09ICd0YWdzJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG9wdGlvbnNTZWxlY3RlZCQgfCBhc3luYykgYXMgb3B0aW9uVGFnc1wiPlxuICAgICAgICAgIDxjLW11bHRpLXNlbGVjdC10YWdcbiAgICAgICAgICAgIChyZW1vdmUpPVwiaGFuZGxlVGFnUmVtb3ZlKCRldmVudClcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25UYWdzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbCA/PyBvcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXRhZ1wiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPC9jLW11bHRpLXNlbGVjdC10YWc+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWxlY3Rpb25UeXBlID09PSAndGV4dCcgJiYgISFzZWxlY3RlZE9wdGlvbnNUZXh0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtc2VhcmNoXCI+e3sgc2VsZWN0ZWRPcHRpb25zVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2NvdW50ZXInXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY291bnRlclRleHRUeXBlID09PSAnc3RyaW5nJzsgZWxzZSBwbHVyYWxNYXBcIj57eyBjb3VudGVyVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwbHVyYWxNYXA+XG4gICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZE9wdGlvbnMubGVuZ3RofX0ge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB8IGkxOG5QbHVyYWw6IHNlbGVjdGlvblR5cGVDb3VudGVyVGV4dFBsdXJhbE1hcCA/PyB7IG90aGVyOiBjb3VudGVyVGV4dCB9IH19PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNlYXJjaCAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSAwICYmIHNlbGVjdGlvblR5cGUgIT09ICdjb3VudGVyJ1wiPi0tPlxuICAgICAgPCEtLSAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLW11bHRpLXNlbGVjdC1zZWFyY2hcIj57eyBwbGFjZWhvbGRlciB9fTwvc3Bhbj4tLT5cbiAgICAgIDwhLS0gICAgICA8L25nLXRlbXBsYXRlPi0tPlxuICAgIDwvZGl2PlxuXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRFbGVtZW50XG4gICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWFyY2hLZXlEb3duKCRldmVudClcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwib3B0aW9uc1NlbGVjdGVkLnNpemUgPT09IDAgJiYgc2VsZWN0aW9uVHlwZSAhPT0gJ2NvdW50ZXInID8gcGxhY2Vob2xkZXIgOiBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhc2VhcmNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2Zvcm0tbXVsdGktc2VsZWN0LXNlYXJjaCc6IHRydWUsIGRpc2FibGVkOiAoZGlzYWJsZWQgfHwgIXNlYXJjaCkgfVwiXG4gICAgICBbbmdNb2RlbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIGNNdWx0aVNlbGVjdFNlYXJjaFxuICAgICAgc2l6ZT1cIjNcIlxuICAgICAgdGFiaW5kZXg9XCJ7eyBkaXNhYmxlZCA/IC0xIDogMCB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgPlxuXG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsT3B0aW9ucygkZXZlbnQpXCJcbiAgICAgICpuZ0lmPVwiY2xlYW5lciAmJiBvcHRpb25zU2VsZWN0ZWQuc2l6ZSA+IDAgJiYgIWRpc2FibGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCAhaXNEcm9wZG93blZpc2libGVcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIGFsbFwiXG4gICAgICBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LXNlbGVjdGlvbi1jbGVhbmVyXCJcbiAgICA+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2ICNkcm9wZG93bk1lbnU9XCJjRHJvcGRvd25NZW51XCIgKm5nSWY9XCIhZGlzYWJsZWRcIiBbdmlzaWJsZV09XCJkcm9wZG93bi52aXNpYmxlXCIgY0Ryb3Bkb3duTWVudT5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZFbHNlXT1cIm9wdGlvbnNFbXB0eVwiIFtuZ0lmXT1cIih2aXNpYmxlT3B0aW9ucygpICYmIG9wdGlvbnMubGVuZ3RoID4gMCkgfHwgbG9hZGluZ1wiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2VsZWN0QWxsT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RBbGwgJiYgbXVsdGlwbGUgJiYgIXZpcnR1YWxTY3JvbGxlclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3QtYWxsXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgID5cbiAgICAgICAge3sgc2VsZWN0QWxsTGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpcnR1YWxTY3JvbGxlciA/IG11bHRpc2VsZWN0VmlydHVhbFNjcm9sbGVyIDogbXVsdGlzZWxlY3RPcHRpb25zRGl2XCIgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uc0VtcHR5PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbXVsdGktc2VsZWN0LW9wdGlvbnMtZW1wdHlcIj57eyBzZWFyY2hOb1Jlc3VsdHNMYWJlbCB9fTwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImxvYWRpbmdcIj5cbiAgICAgIDxjLWVsZW1lbnQtY292ZXIgW25nU3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzZweCcsICd6LWluZGV4JzogMn1cIiAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9jLWRyb3Bkb3duPlxuXG48bmctdGVtcGxhdGUgI211bHRpc2VsZWN0VmlydHVhbFNjcm9sbGVyPlxuICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgI3Njcm9sbFZpZXdwb3J0XG4gICAgKHNjcm9sbGVkSW5kZXhDaGFuZ2UpPVwiaGFuZGxlU2Nyb2xsZWRJbmRleENoYW5nZSgkZXZlbnQsIHNjcm9sbFZpZXdwb3J0KVwiXG4gICAgKm5nSWY9XCJvcHRpb25zQXJyYXkkIHwgYXN5bmMgYXMgb3B0aW9uc0FycmF5XCJcbiAgICBbaXRlbVNpemVdPVwiaXRlbVNpemVcIlxuICAgIFtuZ1N0eWxlXT1cIm9wdGlvbnNNYXhIZWlnaHQgIT09ICdhdXRvJyA/IHsgJ2hlaWdodC5weCc6IG9wdGlvbnNNYXhIZWlnaHQsICdtYXhIZWlnaHQucHgnOiBvcHRpb25zTWF4SGVpZ2h0LCAnbWluV2lkdGgucHgnOiBpdGVtTWluV2lkdGggPz8gMTk2LCBvdmVyZmxvd1g6ICdoaWRkZW4nIH0gOiB7ICdtaW5XaWR0aC5weCc6IGl0ZW1NaW5XaWR0aCA/PyAxOTYsIG92ZXJmbG93WDogJ2hpZGRlbid9XCJcbiAgICBtYXhCdWZmZXJQeD1cInt7aXRlbVNpemUgKiB2aXNpYmxlSXRlbXN9fVwiXG4gICAgbWluQnVmZmVyUHg9XCJ7e2l0ZW1TaXplICogdmlzaWJsZUl0ZW1zfX1cIlxuICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9uc1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAjY2RrVmlydHVhbEZvclxuICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNBcnJheTsgdHJhY2tCeTogdHJhY2tCeUZuOyB0ZW1wbGF0ZUNhY2hlU2l6ZTogMDsgZXZlbiBhcyBldmVuOyBvZGQgYXMgb2RkOyBpbmRleCBhcyBpbmRleDsgY291bnQgYXMgY291bnQ7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3Q7XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb24sIGV2ZW4sIG9kZCwgaW5kZXgsIGNvdW50LCBmaXJzdCwgbGFzdH1cIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVzWydtdWx0aVNlbGVjdE9wdGlvblRlbXBsYXRlJ10gfHwgZGVmYXVsdE11bHRpU2VsZWN0T3B0aW9uVGVtcGxhdGVcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbXVsdGlzZWxlY3RPcHRpb25zRGl2PlxuICA8ZGl2XG4gICAgW25nU3R5bGVdPVwib3B0aW9uc01heEhlaWdodCAhPT0gJ2F1dG8nID8geyAnbWF4SGVpZ2h0LnB4Jzogb3B0aW9uc01heEhlaWdodCwgb3ZlcmZsb3dZOiAnc2Nyb2xsJyB9IDoge31cIlxuICAgIGNsYXNzPVwiZm9ybS1tdWx0aS1zZWxlY3Qtb3B0aW9uc1wiXG4gID5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3RPcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPlxuICA8Yy1tdWx0aS1zZWxlY3Qtb3B0aW9uXG4gICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXG4gICAgW3RleHRdPVwib3B0aW9uLnRleHRcIlxuICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgIFt2aXNpYmxlXT1cIm9wdGlvbi52aXNpYmxlXCJcbiAgPlxuICAgIHt7b3B0aW9uLnRleHR9fVxuICA8L2MtbXVsdGktc2VsZWN0LW9wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=