@rivet-health/design-system 40.44.1 → 40.44.2

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 (148) hide show
  1. package/esm2022/lib/accessibility/sr-only/sr-only.component.mjs +3 -3
  2. package/esm2022/lib/download/download.service.mjs +6 -6
  3. package/esm2022/lib/format/pipes/common.mjs +5 -5
  4. package/esm2022/lib/format/pipes/date.pipe.mjs +3 -3
  5. package/esm2022/lib/format/pipes/days.pipe.mjs +3 -3
  6. package/esm2022/lib/format/pipes/dollars.pipe.mjs +3 -3
  7. package/esm2022/lib/format/pipes/number.pipe.mjs +3 -3
  8. package/esm2022/lib/format/pipes/percentage.pipe.mjs +3 -3
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +4 -4
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +4 -4
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +4 -4
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +5 -5
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +6 -6
  14. package/esm2022/lib/icon/dom-cache.mjs +1 -1
  15. package/esm2022/lib/icon/icon.component.mjs +5 -5
  16. package/esm2022/lib/icon/icons.mjs +1 -1
  17. package/esm2022/lib/input/alphabetic-field/alphabetic-field.component.mjs +3 -3
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +5 -5
  19. package/esm2022/lib/input/button/button.component.mjs +6 -6
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +5 -5
  21. package/esm2022/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/esm2022/lib/input/card-checkbox/card-checkbox.component.mjs +3 -3
  23. package/esm2022/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/esm2022/lib/input/currency-field/currency-field.component.mjs +3 -3
  25. package/esm2022/lib/input/date/date.component.mjs +5 -5
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +4 -4
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +5 -5
  28. package/esm2022/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/esm2022/lib/input/input-label/input-label.component.mjs +3 -3
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +5 -5
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +4 -4
  32. package/esm2022/lib/input/percentage-field/percentage-field.component.mjs +3 -3
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +4 -4
  34. package/esm2022/lib/input/radio/radio.component.mjs +3 -3
  35. package/esm2022/lib/input/search/search.component.mjs +3 -3
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +5 -5
  37. package/esm2022/lib/input/select/select/select.component.mjs +4 -4
  38. package/esm2022/lib/input/select/select-node/select-node.component.mjs +3 -3
  39. package/esm2022/lib/input/select/state.mjs +1 -1
  40. package/esm2022/lib/input/simple-select/option-group.pipe.mjs +3 -3
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +4 -4
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +4 -4
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +4 -4
  44. package/esm2022/lib/input/textarea-field/textarea-field.component.mjs +3 -3
  45. package/esm2022/lib/input/validation-message/validation-message.component.mjs +3 -3
  46. package/esm2022/lib/layout/card/card-actions.component.mjs +3 -3
  47. package/esm2022/lib/layout/card/card-content.component.mjs +6 -6
  48. package/esm2022/lib/layout/card/card-header.component.mjs +6 -6
  49. package/esm2022/lib/layout/card/card-link.component.mjs +5 -5
  50. package/esm2022/lib/layout/card/card-media.component.mjs +3 -3
  51. package/esm2022/lib/layout/card/card.component.mjs +5 -5
  52. package/esm2022/lib/layout/setting-row/setting-row.component.mjs +3 -3
  53. package/esm2022/lib/load/loading/loading.component.mjs +4 -4
  54. package/esm2022/lib/load/loading-cover/loading-cover.component.mjs +3 -3
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +6 -6
  56. package/esm2022/lib/navigation/link/link.component.mjs +6 -6
  57. package/esm2022/lib/navigation/page-header/page-header.component.mjs +3 -3
  58. package/esm2022/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +3 -3
  59. package/esm2022/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +3 -3
  60. package/esm2022/lib/navigation/tabs/tab/tab.component.mjs +3 -3
  61. package/esm2022/lib/navigation/tabs/tabs/tabs.component.mjs +3 -3
  62. package/esm2022/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +3 -3
  63. package/esm2022/lib/navigation/views/edit-view/edit-view.component.mjs +5 -5
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +5 -5
  65. package/esm2022/lib/navigation/views/state.mjs +1 -1
  66. package/esm2022/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +4 -4
  68. package/esm2022/lib/notification/badge/badge.component.mjs +3 -3
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +5 -5
  70. package/esm2022/lib/notification/banner/banner.component.mjs +4 -4
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +5 -5
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +1 -1
  73. package/esm2022/lib/notification/notification-badge/notification-badge.component.mjs +3 -3
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +6 -6
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +1 -1
  76. package/esm2022/lib/overlay/callout/help/help.component.mjs +3 -3
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +8 -8
  78. package/esm2022/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/esm2022/lib/overlay/callout/menu/menu.component.mjs +3 -3
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +4 -4
  81. package/esm2022/lib/overlay/callout/tooltip/tooltip.component.mjs +3 -3
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +5 -5
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +5 -5
  84. package/esm2022/lib/overlay/modal/dialog-stack.service.mjs +3 -3
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +5 -5
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +4 -4
  87. package/esm2022/lib/overlay/modal/side-sheet/side-sheet.component.mjs +3 -3
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +4 -4
  89. package/esm2022/lib/overlay/overlay.directive.mjs +4 -4
  90. package/esm2022/lib/overlay/overlay.service.mjs +4 -4
  91. package/esm2022/lib/overlay/toast/toast-action.component.mjs +3 -3
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +4 -4
  93. package/esm2022/lib/riv.module.mjs +4 -4
  94. package/esm2022/lib/size/size.directive.mjs +5 -5
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +1 -1
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +5 -5
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +5 -5
  98. package/esm2022/lib/table/simple-table/simple-table-row.component.mjs +3 -3
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +4 -4
  100. package/esm2022/lib/table/table/clipboard.mjs +1 -1
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +1 -1
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +1 -1
  103. package/esm2022/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +1 -1
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +1 -1
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +1 -1
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +1 -1
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +1 -1
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +1 -1
  110. package/esm2022/lib/table/table/state.mjs +1 -1
  111. package/esm2022/lib/table/table/table/table.component.mjs +5 -5
  112. package/esm2022/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +4 -4
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +4 -4
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +5 -5
  116. package/esm2022/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +4 -4
  118. package/esm2022/lib/table/table/table-search-columns/table-search-columns.component.mjs +3 -3
  119. package/esm2022/lib/visibility/visibility.directive.mjs +5 -5
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +1 -1
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +5 -5
  122. package/esm2022/lib/visualization/chart/chart.mjs +2 -2
  123. package/esm2022/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/esm2022/lib/visualization/data-table/data-table-header-cell.component.mjs +3 -3
  125. package/esm2022/lib/visualization/data-table/data-table-row.component.mjs +3 -3
  126. package/esm2022/lib/visualization/data-table/data-table.component.mjs +3 -3
  127. package/esm2022/lib/visualization/donut/donut.component.mjs +3 -3
  128. package/esm2022/lib/visualization/funnel-chart/funnel-chart.component.mjs +4 -4
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +1 -1
  130. package/esm2022/lib/visualization/highlight/highlight.component.mjs +3 -3
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +1 -1
  132. package/esm2022/lib/visualization/intervals.mjs +1 -1
  133. package/esm2022/lib/visualization/issue/issue.component.mjs +3 -3
  134. package/esm2022/lib/visualization/legend-item/legend-item.component.mjs +3 -3
  135. package/esm2022/lib/visualization/metric/metric.component.mjs +3 -3
  136. package/esm2022/lib/visualization/mini-pie/mini-pie.component.mjs +3 -3
  137. package/esm2022/lib/visualization/progress/progress.component.mjs +3 -3
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +4 -4
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +1 -1
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +5 -5
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +1 -1
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +4 -4
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +1 -1
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +4 -4
  145. package/esm2022/lib/visualization/zero-state/zero-state.component.mjs +3 -3
  146. package/fesm2022/rivet-health-design-system.mjs +418 -418
  147. package/fesm2022/rivet-health-design-system.mjs.map +1 -1
  148. package/package.json +1 -1
@@ -351,10 +351,10 @@ export class StackedColumnComponent {
351
351
  if (option)
352
352
  this.interval = option.id;
353
353
  }
354
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
355
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", valueFormatter: "valueFormatter", interval: "interval" }, outputs: { intervalChanged: "intervalChanged", stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i5.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
354
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
355
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", valueFormatter: "valueFormatter", interval: "interval" }, outputs: { intervalChanged: "intervalChanged", stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i5.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
356
356
  }
357
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StackedColumnComponent, decorators: [{
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedColumnComponent, decorators: [{
358
358
  type: Component,
359
359
  args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
360
360
  }], propDecorators: { input: [{
@@ -374,4 +374,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
374
374
  type: ViewChild,
375
375
  args: ['controls']
376
376
  }] } });
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBRXRFLE1BQU0sZ0JBQWdCLEdBQWEsT0FBTyxDQUFDO0FBTzNDLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFDM0IsbUdBQW1HO0FBT25H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Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBzY2FsZUJhbmQsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQgeyB1dGNGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgSW50ZXJ2YWwsXG4gIGdldEludGVydmFsVGl0bGUsXG4gIGdldE1ham9ySW50ZXJ2YWwsXG4gIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldFRpbWVJbnRlcnZhbCxcbiAgaW50ZXJ2YWxzLFxufSBmcm9tICcuLi9pbnRlcnZhbHMnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXREYXRlUmFuZ2UsIHBvaW50UmVkdWNlciB9IGZyb20gJy4vc3RhY2tlZC1jb2x1bW4uaGVscGVycyc7XG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsID0gJ21vbnRoJztcblxudHlwZSBJbnRlcnZhbE9wdGlvbiA9IHtcbiAgaWQ6IEludGVydmFsO1xuICB0aXRsZTogc3RyaW5nO1xufTtcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXT4oXG4gICAgW10sXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW5wdXQodjogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cblxuICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxuICBjYWxsb3V0SGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx7XG4gICAgJGltcGxpY2l0OiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LkNhbGxvdXRDb250ZXh0O1xuICB9PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IEhFSUdIVCA9IDMwMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsdWVGb3JtYXR0ZXI6ICh2OiBudW1iZXIpID0+IHN0cmluZyA9IHYgPT4gdi50b1N0cmluZygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4oREVGQVVMVF9JTlRFUlZBTCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW50ZXJ2YWwodjogSW50ZXJ2YWwpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxDaGFuZ2VkLmVtaXQodik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWwkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgaW50ZXJ2YWxDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcnZhbD4oKTtcblxuICBAT3V0cHV0KClcbiAgc3RhY2tDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrQ2xpY2tlZD4oKTtcblxuICBAVmlld0NoaWxkKCdjb250cm9scycpXG4gIHB1YmxpYyByZWFkb25seSBjb250cm9scz86IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OX1dJRFRIUyA9IFs4LCAxNiwgNDAsIDcyXSBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fQ09MVU1OX1dJRFRIID0gdGhpcy5DT0xVTU5fV0lEVEhTWzBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q29sdW1ucyQgPSB0aGlzLndpZHRoJC5waXBlKFxuICAgIG1hcCh3aWR0aCA9PiB7XG4gICAgICBjb25zdCBpbm5lcldpZHRoID0gd2lkdGggLSB0aGlzLkxFRlRfT0ZGU0VUO1xuICAgICAgY29uc3QgY29sdW1uV2lkdGhXaXRoUGFkZGluZyA9XG4gICAgICAgIHRoaXMuTUlOX0NPTFVNTl9XSURUSCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoaW5uZXJXaWR0aCAvIGNvbHVtbldpZHRoV2l0aFBhZGRpbmcpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbDogSW50ZXJ2YWwsIG1pbkRhdGU6IERhdGUsIG1heERhdGU6IERhdGUpIHtcbiAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIHJldHVybiB0aW1lSW50ZXJ2YWwucmFuZ2UoXG4gICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZSksXG4gICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IodGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5tYXhDb2x1bW5zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgbWF4Q29sdW1uc10pID0+IHtcbiAgICAgIGNvbnN0IFttaW5EYXRlLCBtYXhEYXRlXSA9IGdldERhdGVSYW5nZShpbnB1dCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnZhbHMuZmlsdGVyKGludGVydmFsID0+IHtcbiAgICAgICAgY29uc3QgeFN0ZXBzQ291bnQgPSB0aGlzLmdldFhTdGVwc0luUmFuZ2UoaW50ZXJ2YWwsIG1pbkRhdGUsIG1heERhdGUpO1xuICAgICAgICByZXR1cm4gaW5wdXQubGVuZ3RoICogeFN0ZXBzQ291bnQgPD0gbWF4Q29sdW1ucztcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBJbnRlcnZhbE9wdGlvbiA9PiAoe1xuICAgICAgICAgIGlkOiBpbnRlcnZhbCxcbiAgICAgICAgICB0aXRsZTogZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbCksXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmludGVydmFsJCxcbiAgICB0aGlzLmludGVydmFsT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW50ZXJ2YWwsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkSW50ZXJ2YWxzID0gb3B0aW9ucy5tYXAoKHsgaWQgfSkgPT4gaWQgYXMgSW50ZXJ2YWwpO1xuICAgICAgaWYgKCFhbGxvd2VkSW50ZXJ2YWxzLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgICAgICBjb25zdCBmaXJzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KDApO1xuICAgICAgICBjb25zdCBsYXN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoLTEpO1xuICAgICAgICBpZiAoIWZpcnN0QWxsb3dlZCB8fCAhbGFzdEFsbG93ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPCBpbnRlcnZhbHMuaW5kZXhPZihmaXJzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gZmlyc3RBbGxvd2VkO1xuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpID4gaW50ZXJ2YWxzLmluZGV4T2YobGFzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gbGFzdEFsbG93ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gaW50ZXJ2YWwpID8/IG51bGw7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsJCA9IHRoaXMuc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQucGlwZShcbiAgICBtYXAob3B0aW9uID0+IChvcHRpb24gPyAob3B0aW9uLmlkIGFzIEludGVydmFsKSA6IERFRkFVTFRfSU5URVJWQUwpKSxcbiAgKTtcblxuICBzZXRJbnRlcnZhbE9wdGlvbihvcHRpb246IEludGVydmFsT3B0aW9uIHwgbnVsbCkge1xuICAgIGlmIChvcHRpb24pIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIGNvbHVtbldpZHRoJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy53aWR0aCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHNlbGVjdGVkSW50ZXJ2YWwsIHdpZHRoXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcbiAgICAgIGNvbnN0IHhTdGVwQ291bnQgPSB0aGlzLmdldFhTdGVwc0luUmFuZ2UoXG4gICAgICAgIHNlbGVjdGVkSW50ZXJ2YWwsXG4gICAgICAgIG1pbkRhdGUsXG4gICAgICAgIG1heERhdGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpbm5lcldpZHRoID0gd2lkdGggLSB0aGlzLkxFRlRfT0ZGU0VUO1xuICAgICAgY29uc3QgYWxsb3dlZENvbHVtbldpZHRocyA9IHRoaXMuQ09MVU1OX1dJRFRIUy5maWx0ZXIoY29sdW1uV2lkdGggPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aFdpdGhQYWRkaW5nID0gY29sdW1uV2lkdGggKyB0aGlzLkNPTFVNTl9QQURESU5HICogMjtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpbm5lcldpZHRoIC0gaW5wdXQubGVuZ3RoICogeFN0ZXBDb3VudCAqIGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGFsbG93ZWRDb2x1bW5XaWR0aHMuYXQoLTEpO1xuICAgICAgaWYgKCFjb2x1bW5XaWR0aCkgcmV0dXJuIDA7XG5cbiAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGJpbm5lZERhdGFXaXRoUmFuZ2VzJDogT2JzZXJ2YWJsZTx7XG4gICAgc3RhY2tzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW107XG4gICAgZ2V0UmFuZ2U6IChkYXRlOiBudW1iZXIpID0+IHsgbWluRGF0ZTogRGF0ZTsgbWF4RGF0ZTogRGF0ZSB9O1xuICB9PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaW5wdXQkLCB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgaW50ZXJ2YWxdKSA9PiB7XG4gICAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXRlPigpO1xuICAgICAgY29uc3Qgc3RhY2tzID0gaW5wdXQubWFwKChzdGFjayk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2sgPT4ge1xuICAgICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuXG4gICAgICAgIGNvbnN0IHNlcmllcyA9IHN0YWNrLnNlcmllcy5tYXAoc2VyaWVzID0+IHtcbiAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgU3RhY2tlZENvbHVtbkNvbXBvbmVudC5WYWx1ZVtdPigpO1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbktleSA9IHRpbWVJbnRlcnZhbC5mbG9vcihwb2ludC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICBjb25zdCBtYXhEYXRlID0gcmFuZ2VNYXAuZ2V0KGJpbktleSk7XG5cbiAgICAgICAgICAgIGlmICghbWF4RGF0ZSB8fCBtYXhEYXRlIDwgcG9pbnQuZGF0ZSkge1xuICAgICAgICAgICAgICByYW5nZU1hcC5zZXQoYmluS2V5LCBwb2ludC5kYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFiaW5uZWQuaGFzKGJpbktleSkpIHtcbiAgICAgICAgICAgICAgYmlubmVkLnNldChiaW5LZXksIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IGJpbm5lZC5nZXQoYmluS2V5KSE7XG4gICAgICAgICAgICBiaW4ucHVzaChwb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgICBkYXRhOiBbLi4uYmlubmVkLmVudHJpZXMoKV0ubWFwKChbZGF0ZVZhbHVlLCBwb2ludHNdKSA9PiAoe1xuICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZShkYXRlVmFsdWUpLFxuICAgICAgICAgICAgICB2YWx1ZTogcG9pbnRSZWR1Y2VyKHBvaW50cyksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhY2ssXG4gICAgICAgICAgc2VyaWVzOiBzZXJpZXMsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YWNrcyxcbiAgICAgICAgZ2V0UmFuZ2U6IChkYXRlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoZGF0ZSksXG4gICAgICAgICAgICBtYXhEYXRlOiByYW5nZU1hcC5nZXQoZGF0ZSkhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YSQgPSB0aGlzLmJpbm5lZERhdGFXaXRoUmFuZ2VzJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+IGJpbm5lZERhdGEuc3RhY2tzKSxcbiAgKTtcblxuICByZWFkb25seSBnZXRSYW5nZSQgPSB0aGlzLmJpbm5lZERhdGFXaXRoUmFuZ2VzJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+IGJpbm5lZERhdGEuZ2V0UmFuZ2UpLFxuICApO1xuXG4gIHJlYWRvbmx5IExFRlRfT0ZGU0VUID0gNDg7XG4gIHJlYWRvbmx5IENPTFVNTl9QQURESU5HID0gNDtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy5jb2x1bW5XaWR0aCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbYmlubmVkRGF0YSwgd2lkdGgsIGludGVydmFsLCBjb2x1bW5XaWR0aF0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7dGhpcy5IRUlHSFR9YDtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcblxuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGJpbm5lZERhdGEpO1xuICAgICAgY29uc3QgaGFzTXVsdGlwbGVZZWFycyA9IG1pbkRhdGUuZ2V0RnVsbFllYXIoKSA8IG1heERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWlub3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBtaW5vclRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICBjb25zdCB4U3RlcHMgPSBtaW5vclRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZSksXG4gICAgICAgIG1pbm9yVGltZUludGVydmFsLmZsb29yKG1pbm9yVGltZUludGVydmFsLm9mZnNldChtYXhEYXRlLCAxKSksXG4gICAgICApO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWwgPSBnZXRNYWpvckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsRm9ybWF0ID0gZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdChcbiAgICAgICAgeE1ham9ySW50ZXJ2YWwsXG4gICAgICAgIGhhc011bHRpcGxlWWVhcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbWFqb3JGb3JtYXR0ZXIgPSB1dGNGb3JtYXQoeE1ham9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgZnVsbEZvcm1hdHRlciA9IHV0Y0Zvcm1hdChcbiAgICAgICAgYCR7eE1pbm9ySW50ZXJ2YWxGb3JtYXR9ICR7eE1ham9ySW50ZXJ2YWxGb3JtYXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHhPdXRlclNjYWxlID0gc2NhbGVCYW5kKClcbiAgICAgICAgLmRvbWFpbih4U3RlcHMubWFwKGRhdGUgPT4gZnVsbEZvcm1hdHRlcihkYXRlKSkpXG4gICAgICAgIC5yYW5nZShbdGhpcy5MRUZUX09GRlNFVCwgd2lkdGhdKTtcblxuICAgICAgY29uc3Qgb3V0ZXJQYWRkaW5nID1cbiAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC1cbiAgICAgICAgICAodGhpcy5DT0xVTU5fUEFERElORyAqIChiaW5uZWREYXRhLmxlbmd0aCAtIDEpICtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoICogYmlubmVkRGF0YS5sZW5ndGgpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlICYge1xuICAgICAgICBzZXJpZXM6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU2VyaWVzO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBiaW5uZWREYXRhLm1hcChzdGFja0RhdGEgPT4ge1xuICAgICAgICAvKlxuICAgICAgICAgIENyZWF0ZSBhbiBhcnJheSB3aXRoIGV2ZXJ5IGRhdGEgcG9pbnQgKyB0aGVpciBhc3NvY2lhdGVkIHNlcmllcy5cbiAgICAgICAgICBpLmUuIE1ha2UgYW4gYmFja2xpbmsgZm9yIGVhY2ggZWxlbWVudCB0byBpdHMgc2VyaWVzLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkVGFibGUgPSBzdGFja0RhdGEuc2VyaWVzLnJlZHVjZTxTZXJpZXNQb2ludFtdPihcbiAgICAgICAgICAodGFibGUsIHMpID0+IFtcbiAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgLi4ucy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICBNYXBzIGVhY2ggb2YgdGhlIFNlcmllc1BvaW50cyBiYXNlZCBvbiBsYWJlbC5cbiAgICAgICAgICBUaGVuIG1hcCBlYWNoIG9mIHRob3NlIG1hcHMgdG8gYSBkYXRlLlxuXG4gICAgICAgICAgRXhhbXBsZTpcbiAgICAgICAgICAgIElmIHdlIHdlcmUgaW5kZXhpbmcgdGhlIGZvbGxvd2luZyBkYXRhOlxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBDb21wbGV0ZSAtPiA1IGluIEphbnVhcnksIDcgaW4gRmVicnVhcnlcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgSW5jb21wbGV0ZSAtPiAzIGluIEphbnVhcnksIDMgaW4gRmVicnVhcnlcbiAgICAgICAgICAgIFdlIHdvdWxkIGdldCBhbiBpbmRleGVkIHRhYmxlIGxpa2UgdGhlIGZvbGxvd2luZywgKG5vdGUgdGhpcyBpcyBwc2V1ZG9jb2RlKTpcbiAgICAgICAgICAgICAgJ0phbnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA1LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgICAgICAgJ0ZlYnJ1YXJ5JzogeyAnRXN0aW1hdGVzIENvbXBsZXRlJzogNywgJ0VzdGltYXRlcyBJbmNvbXBsZXRlJzogMyB9XG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGluZGV4ZWRUYWJsZTogTWFwPERhdGUsIE1hcDxzdHJpbmcsIFNlcmllc1BvaW50Pj4gPSBpbmRleChcbiAgICAgICAgICBzdGFja2VkVGFibGUsXG4gICAgICAgICAgZCA9PiBkLmRhdGUsXG4gICAgICAgICAgZCA9PiBkLnNlcmllcy5sYWJlbCxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIFRoZSBvdXRwdXQgb2YgXCJzdGFjaygpXCIgaXMgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHR1cGxlcy5cbiAgICAgICAgICAgIFRoZSB0dXBsZXMgdW5uZXN0IGFzIFtiYXNlbGluZSwgdG9wbGluZV0uXG4gICAgICAgICAgICBFYWNoIFwia2V5XCIgaW52b2x2ZWQgaW4gdGhlIHN0YWNrIGhhcyBhbiBhcnJheSBvZiB0dXBsZXMgcmVsYXRpbmcgdG8gaXQuXG4gICAgICAgICAgICAgIGkuZS4gWyBEYXRlIDEgVHVwbGUsIERhdGUgMiBUdXBsZSBdXG4gICAgICAgICAgICBBbGwgXCJrZXlcIiBhcnJheXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgb3V0ZXIgYXJyYXkuXG4gICAgICAgICAgICAgIGkuZS4gWyBLZXkgMSBUdXBsZXMsIEtleSAyIFR1cGxlc11cblxuICAgICAgICAgIFdlIHNlbGVjdCB0aGUga2V5cyB1c2luZyBcIi5rZXlzKClcIi5cbiAgICAgICAgICAgIEZvciBvdXIgcHVycG9zZXMsIHRoZSBrZXlzIGFyZSB0aGUgbGVnZW5kIGVsZW1lbnRzLlxuICAgICAgICAgICAgaS5lLiBJZiB5b3UgaGF2ZSB0d28gYmxvY2tzIG9mIHRoZSBzYW1lIGNvbG9yLCB0aGV5IGhhdmUgdGhlIHNhbWUga2V5LlxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBoZWlnaHRzIG9mIHRoZSBibG9ja3MgdXNpbmcgXCIudmFsdWUoKVwiLlxuXG4gICAgICAgICAgV2UgYXJlIGdvaW5nIHRvIHN0YWNrIHRoZSBibG9ja3Mgb24gdG9wIG9mIGVhY2ggb3RoZXIuXG4gICAgICAgICAgICBUaGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGtleSB0dXBsZXMgYXJlIDAuXG4gICAgICAgICAgICBUaGUgYmFzZWxpbmUgb2YgdGhlIHNlY29uZCBrZXkgdHVwbGVzIGFyZSB0aGUgdG9wbGluZSBvZiB0aGUgYXNzb2NpYXRlZCBmaXJzdCBrZXkgdHVwbGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBzdGFja2luZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGEgc3RhY2sgb2Y6XG4gICAgICAgICAgICAgIFsgIFsgWzAsNV0sWzAsN10gXSwgWyBbNSw4XSxbNywxMF0gXSAgXVxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkID0gc3RhY2s8XG4gICAgICAgICAgdHlwZW9mIGluZGV4ZWRUYWJsZSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPiA/IFtLLCBWXSA6IG5ldmVyXG4gICAgICAgID4oKVxuICAgICAgICAgIC5rZXlzKHN0YWNrRGF0YS5zZXJpZXMubWFwKHYgPT4gdi5sYWJlbCkpXG4gICAgICAgICAgLnZhbHVlKChbXywgZ3JvdXBdLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBncm91cC5nZXQoa2V5KSEudmFsdWU7XG4gICAgICAgICAgfSkoaW5kZXhlZFRhYmxlKTtcblxuICAgICAgICByZXR1cm4geyBpbmRleGVkVGFibGUsIHN0YWNrZWQgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGUgZG9tYWluIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgaGlnaGVzdCB2YWx1ZSBpbiBhbnkgc3RhY2ssIG9uIGFueSBkYXRlLlxuICAgICAgbGV0IGRvbWFpbk1heCA9IDA7XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9KSA9PiB7XG4gICAgICAgIC8vIEZvciBlYWNoIGRhdGUsXG4gICAgICAgIFsuLi5pbmRleGVkVGFibGUudmFsdWVzKCldLmZvckVhY2goKHBvaW50TWFwLCBpKSA9PiB7XG4gICAgICAgICAgLy8gRm9yIGVhY2ggc2VyaWVzLFxuICAgICAgICAgIFsuLi5wb2ludE1hcC52YWx1ZXMoKV0uZm9yRWFjaCgoXywgaikgPT4ge1xuICAgICAgICAgICAgZG9tYWluTWF4ID0gTWF0aC5tYXgoZG9tYWluTWF4LCAuLi5zdGFja2VkW2pdW2ldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChkb21haW5NYXggPT09IDApIGRvbWFpbk1heCA9IDE7XG4gICAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcigpXG4gICAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAgIC5yYW5nZShbdGhpcy5IRUlHSFQgLSBwYWRkaW5nICogMiwgcGFkZGluZ10pO1xuXG4gICAgICBjb25zdCByZWN0czoge1xuICAgICAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBmaWxsOiBzdHJpbmc7XG4gICAgICAgIHN0cmlwZWQ6IGJvb2xlYW47XG4gICAgICAgIHNlcmllc1BvaW50OiBTZXJpZXNQb2ludDtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgLy8gRm9yIGVhY2ggdW5pcXVlIHN0YWNrLFxuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS5lbnRyaWVzKCldLmZvckVhY2goKFtkYXRlLCBwb2ludE1hcF0sIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBib3ggd2UgYXJlIGFib3V0IHRvIGRyYXcuXG4gICAgICAgICAgICBjb25zdCBbYmFzZWxpbmUsIHRvcGxpbmVdID0gc3RhY2tlZFtqXVtpXTtcblxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHlTY2FsZShiYXNlbGluZSkgLSB5U2NhbGUodG9wbGluZSk7XG4gICAgICAgICAgICBjb25zdCB4ID1cbiAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgb3V0ZXJQYWRkaW5nICtcbiAgICAgICAgICAgICAgY29sdW1uV2lkdGggKiBpbmRleCArXG4gICAgICAgICAgICAgIHRoaXMuQ09MVU1OX1BBRERJTkcgKiBpbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB5U2NhbGUoYmFzZWxpbmUpIC0gaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgZmlsbCA9IGB2YXIoJHtzZXJpZXNQb2ludC5zZXJpZXMuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICAgICAgcmVjdHMucHVzaCh7XG4gICAgICAgICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgIGZpbGwsXG4gICAgICAgICAgICAgIHN0cmlwZWQ6IHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSA9PT0gJ3N0cmlwZWQnLFxuICAgICAgICAgICAgICBzZXJpZXNQb2ludCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICBsYWJlbDogbWlub3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICsgeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLyAyLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPVxuICAgICAgICBpbnRlcnZhbCAhPT0gJ3llYXInXG4gICAgICAgICAgPyB4U3RlcHNcbiAgICAgICAgICAgICAgLm1hcChkYXRlID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICBsYWJlbDogbWFqb3JGb3JtYXR0ZXIoZGF0ZSksXG4gICAgICAgICAgICAgICAgeDpcbiAgICAgICAgICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgICAgICAgICB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh0aWNrLCBpLCB0aWNrcykgPT5cbiAgICAgICAgICAgICAgICAgIGkgPT09IDAgfHwgdGljay5sYWJlbCAhPT0gdGlja3NbaSAtIDFdLmxhYmVsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpO1xuXG4gICAgICBjb25zdCBob3ZlckJhbmRXaWR0aCA9XG4gICAgICAgIHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCAqIGNvbHVtbldpZHRoICtcbiAgICAgICAgKHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCArIDEpICogdGhpcy5DT0xVTU5fUEFERElORztcbiAgICAgIGNvbnN0IGhvdmVyQmFuZHMgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICh4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAtIGhvdmVyQmFuZFdpZHRoKSAvIDIsXG4gICAgICAgIHk6IHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgICB3aWR0aDogaG92ZXJCYW5kV2lkdGgsXG4gICAgICAgIGhlaWdodDogeVNjYWxlKDApIC0geVNjYWxlKGRvbWFpbk1heCksXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbldpZHRoLFxuICAgICAgICBob3ZlckJhbmRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgeE1pbm9yVGlja3MsXG4gICAgICAgIHhNYWpvclRpY2tzLFxuICAgICAgICB5U2NhbGUsXG4gICAgICAgIHlUaWNrcyxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PlxuICAgICAgaW5wdXQuZXZlcnkoc3RhY2sgPT5cbiAgICAgICAgc3RhY2suc2VyaWVzLmV2ZXJ5KHNlcmllcyA9PiBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaG92ZXJlZEJhbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZGF0ZVZhbHVlOiBudW1iZXI7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjYWxsb3V0JDogT2JzZXJ2YWJsZTxTdGFja2VkQ29sdW1uQ29tcG9uZW50LkNhbGxvdXRDb250ZXh0IHwgbnVsbD4gPVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmJpbm5lZERhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBiaW5uZWREYXRhXSkgPT4ge1xuICAgICAgICBpZiAoIWhvdmVyZWRCYW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGNvbnRlbnQ6IGJpbm5lZERhdGEubWFwKHN0YWNrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmllc1BvaW50cyA9IHN0YWNrLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICAgIGNvbG9yVG9rZW46IHNlcmllcy5jb2xvclRva2VuLFxuICAgICAgICAgICAgICBzdHlsZTogc2VyaWVzLnN0eWxlLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICBzZXJpZXMuZGF0YS5maW5kKFxuICAgICAgICAgICAgICAgICAgKHsgZGF0ZSB9KSA9PiBkYXRlLnZhbHVlT2YoKSA9PT0gaG92ZXJlZEJhbmQuZGF0ZVZhbHVlLFxuICAgICAgICAgICAgICAgICk/LnZhbHVlID8/IDAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0aXRsZTogc3RhY2sudGl0bGUsXG4gICAgICAgICAgICAgIHRvdGFsOiB0aGlzLnZhbHVlRm9ybWF0dGVyKFxuICAgICAgICAgICAgICAgIHNlcmllc1BvaW50cy5yZWR1Y2UoKGFjYywgcG9pbnQpID0+IHBvaW50LnZhbHVlICsgYWNjLCAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2VyaWVzOiBzZXJpZXNQb2ludHMubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocG9pbnQudmFsdWUpLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICAgICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZENvbHVtbkNvbXBvbmVudCB7XG4gIGV4cG9ydCB0eXBlIFZhbHVlID0ge1xuICAgIGRhdGU6IERhdGU7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBkYXRhOiBWYWx1ZVtdO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZTogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdGFjayA9IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBzZXJpZXM6IFNlcmllc1tdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrQ2xpY2tlZCA9IHtcbiAgICBtaW5EYXRlOiBEYXRlO1xuICAgIG1heERhdGU6IERhdGU7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQ2FsbG91dENvbnRleHQgPSB7XG4gICAgYW5jaG9yOiBET01SZWN0O1xuICAgIGNvbnRlbnQ6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgdG90YWw6IHN0cmluZztcbiAgICAgIHNlcmllczoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogc3RyaW5nO1xuICAgICAgfVtdO1xuICAgIH1bXTtcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgICB5Mj1cIjBcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhNaW5vclRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2stYmFja2dyb3VuZFwiXG4gICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cIihob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSA9PT0gdGljay5kYXRlVmFsdWVcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueCAtIDIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDNcIlxuICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgaGVpZ2h0PVwiMTJcIlxuICAgICAgICByeD1cIjJcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDEyXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1ham9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSgwKSArIDI0XCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueVRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUodGljaylcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBoZWlnaHQ9XCIxXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dCBjbGFzcz1cInRpY2stbGFiZWxcIiB4PVwiMFwiIFthdHRyLnldPVwiZC55U2NhbGUodGljaylcIiBkeT1cIi00XCI+XG4gICAgICAgIHt7IHZhbHVlRm9ybWF0dGVyKHRpY2spIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByZWN0IG9mIGQucmVjdHNcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwiY29sdW1uXCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5kYXRlVmFsdWUgIT09IHJlY3QuZGF0ZVZhbHVlXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRSYW5nZSQgfCBhc3luYzsgbGV0IGdldFJhbmdlXCI+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkLmhvdmVyQmFuZHNcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIlxuICAgICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KHsgZGF0ZVZhbHVlOiByZWN0LmRhdGVWYWx1ZSwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgICBcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkQmFuZCQubmV4dChudWxsKVwiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBzdGFja0NsaWNrZWQuZW1pdChnZXRSYW5nZShyZWN0LmRhdGVWYWx1ZSkpOyBob3ZlcmVkQmFuZCQubmV4dChudWxsKVxuICAgICAgICBcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9zdmc+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGxvdXQkIHwgYXN5bmM7IGxldCBjYWxsb3V0XCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwiY2FsbG91dD8uYW5jaG9yID8/IG51bGxcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2FsbG91dEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjYWxsb3V0IH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtc3RhY2tcIiAqbmdGb3I9XCJsZXQgc3RhY2sgb2YgY2FsbG91dD8uY29udGVudFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic3RhY2sudGl0bGU7IGxldCB0aXRsZVwiIGNsYXNzPVwiY2FsbG91dC1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHN0YWNrLnRvdGFsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2VyaWVzIG9mIHN0YWNrLnNlcmllc1wiIGNsYXNzPVwiY2FsbG91dC1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJzZXJpZXMuY29sb3JUb2tlblwiXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJzZXJpZXMuc3R5bGVcIlxuICAgICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgICAgPHNwYW4+e3sgc2VyaWVzLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj57eyBzZXJpZXMuZm9ybWF0dGVkVmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb250cm9scz5cbiAgPHJpdi1zaW1wbGUtc2VsZWN0XG4gICAgW29wdGlvbkdyb3Vwc109XCJpbnRlcnZhbE9wdGlvbnMkIHwgYXN5bmMgfCByaXZPcHRpb25Hcm91cFwiXG4gICAgW29yZGVyQnldPVwiJ3NvdXJjZSdcIlxuICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzZWxlY3RlZEludGVydmFsT3B0aW9uJCB8IGFzeW5jXCJcbiAgICAoc2VsZWN0ZWRPcHRpb25DaGFuZ2UpPVwic2V0SW50ZXJ2YWxPcHRpb24oJGV2ZW50KVwiXG4gID48L3Jpdi1zaW1wbGUtc2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBRXRFLE1BQU0sZ0JBQWdCLEdBQWEsT0FBTyxDQUFDO0FBTzNDLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFDM0IsbUdBQW1HO0FBT25H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QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHV0Y0Zvcm1hdCB9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5pbXBvcnQgeyBMZWdlbmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGVnZW5kLWl0ZW0vbGVnZW5kLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IGdldERhdGVSYW5nZSwgcG9pbnRSZWR1Y2VyIH0gZnJvbSAnLi9zdGFja2VkLWNvbHVtbi5oZWxwZXJzJztcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnbW9udGgnO1xuXG50eXBlIEludGVydmFsT3B0aW9uID0ge1xuICBpZDogSW50ZXJ2YWw7XG4gIHRpdGxlOiBzdHJpbmc7XG59O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG4vLyBodHRwczovL3d3dy5ub3Rpb24uc28vcml2ZXQvUmVzb2x2ZS1UT0RPcy1hZnRlci1Bbmd1bGFyLXVwZ3JhZGUtMWYyNjY3ZWIyYTMxODBiNzlmNmFkOTJhN2U1NzZmMDhcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIHByb3RlY3RlZCBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gIGNhbGxvdXRIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQ7XG4gIH0+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgSEVJR0hUID0gMzAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVydmFsPihERUZBVUxUX0lOVEVSVkFMKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnRlcnZhbCh2OiBJbnRlcnZhbCkge1xuICAgIGlmICh2ICE9PSB0aGlzLmludGVydmFsJC5nZXRWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmludGVydmFsJC5uZXh0KHYpO1xuICAgICAgdGhpcy5pbnRlcnZhbENoYW5nZWQuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpbnRlcnZhbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpO1xuXG4gIEBPdXRwdXQoKVxuICBzdGFja0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tDbGlja2VkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJylcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzPzogVGVtcGxhdGVSZWY8dm9pZD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5fV0lEVEhTID0gWzgsIDE2LCA0MCwgNzJdIGFzIGNvbnN0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DT0xVTU5fV0lEVEggPSB0aGlzLkNPTFVNTl9XSURUSFNbMF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDb2x1bW5zJCA9IHRoaXMud2lkdGgkLnBpcGUoXG4gICAgbWFwKHdpZHRoID0+IHtcbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBjb2x1bW5XaWR0aFdpdGhQYWRkaW5nID1cbiAgICAgICAgdGhpcy5NSU5fQ09MVU1OX1dJRFRIICsgdGhpcy5DT0xVTU5fUEFERElORyAqIDI7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gY29sdW1uV2lkdGhXaXRoUGFkZGluZyk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICBnZXRYU3RlcHNJblJhbmdlKGludGVydmFsOiBJbnRlcnZhbCwgbWluRGF0ZTogRGF0ZSwgbWF4RGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgcmV0dXJuIHRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcih0aW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICApLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEludGVydmFscyQ6IE9ic2VydmFibGU8SW50ZXJ2YWxbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLm1heENvbHVtbnMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBtYXhDb2x1bW5zXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB4U3RlcHNDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbCwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGggKiB4U3RlcHNDb3VudCA8PSBtYXhDb2x1bW5zO1xuICAgICAgfSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBpbnRlcnZhbE9wdGlvbnMkID0gdGhpcy5hbGxvd2VkSW50ZXJ2YWxzJC5waXBlKFxuICAgIG1hcChpbnRlcnZhbHMgPT5cbiAgICAgIGludGVydmFscy5tYXAoXG4gICAgICAgIChpbnRlcnZhbCk6IEludGVydmFsT3B0aW9uID0+ICh7XG4gICAgICAgICAgaWQ6IGludGVydmFsLFxuICAgICAgICAgIHRpdGxlOiBnZXRJbnRlcnZhbFRpdGxlKGludGVydmFsKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsT3B0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW50ZXJ2YWwkLFxuICAgIHRoaXMuaW50ZXJ2YWxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnRlcnZhbCwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGFsbG93ZWRJbnRlcnZhbHMgPSBvcHRpb25zLm1hcCgoeyBpZCB9KSA9PiBpZCBhcyBJbnRlcnZhbCk7XG4gICAgICBpZiAoIWFsbG93ZWRJbnRlcnZhbHMuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgtMSk7XG4gICAgICAgIGlmICghZmlyc3RBbGxvd2VkIHx8ICFsYXN0QWxsb3dlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA8IGludGVydmFscy5pbmRleE9mKGZpcnN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBmaXJzdEFsbG93ZWQ7XG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPiBpbnRlcnZhbHMuaW5kZXhPZihsYXN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBsYXN0QWxsb3dlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLmlkID09PSBpbnRlcnZhbCkgPz8gbnVsbDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWwkID0gdGhpcy5zZWxlY3RlZEludGVydmFsT3B0aW9uJC5waXBlKFxuICAgIG1hcChvcHRpb24gPT4gKG9wdGlvbiA/IChvcHRpb24uaWQgYXMgSW50ZXJ2YWwpIDogREVGQVVMVF9JTlRFUlZBTCkpLFxuICApO1xuXG4gIHNldEludGVydmFsT3B0aW9uKG9wdGlvbjogSW50ZXJ2YWxPcHRpb24gfCBudWxsKSB7XG4gICAgaWYgKG9wdGlvbikgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbi5pZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sdW1uV2lkdGgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLndpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgc2VsZWN0ZWRJbnRlcnZhbCwgd2lkdGhdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuICAgICAgY29uc3QgeFN0ZXBDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShcbiAgICAgICAgc2VsZWN0ZWRJbnRlcnZhbCxcbiAgICAgICAgbWluRGF0ZSxcbiAgICAgICAgbWF4RGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBhbGxvd2VkQ29sdW1uV2lkdGhzID0gdGhpcy5DT0xVTU5fV0lEVEhTLmZpbHRlcihjb2x1bW5XaWR0aCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPSBjb2x1bW5XaWR0aCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlubmVyV2lkdGggLSBpbnB1dC5sZW5ndGggKiB4U3RlcENvdW50ICogY29sdW1uV2lkdGhXaXRoUGFkZGluZyA+PSAwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gYWxsb3dlZENvbHVtbldpZHRocy5hdCgtMSk7XG4gICAgICBpZiAoIWNvbHVtbldpZHRoKSByZXR1cm4gMDtcblxuICAgICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YVdpdGhSYW5nZXMkOiBPYnNlcnZhYmxlPHtcbiAgICBzdGFja3M6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXTtcbiAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4geyBtaW5EYXRlOiBEYXRlOyBtYXhEYXRlOiBEYXRlIH07XG4gIH0+ID0gY29tYmluZUxhdGVzdChbdGhpcy5pbnB1dCQsIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCRdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBpbnRlcnZhbF0pID0+IHtcbiAgICAgIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcDxudW1iZXIsIERhdGU+KCk7XG4gICAgICBjb25zdCBzdGFja3MgPSBpbnB1dC5tYXAoKHN0YWNrKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWVzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYmluS2V5ID0gdGltZUludGVydmFsLmZsb29yKHBvaW50LmRhdGUpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSByYW5nZU1hcC5nZXQoYmluS2V5KTtcblxuICAgICAgICAgICAgaWYgKCFtYXhEYXRlIHx8IG1heERhdGUgPCBwb2ludC5kYXRlKSB7XG4gICAgICAgICAgICAgIHJhbmdlTWFwLnNldChiaW5LZXksIHBvaW50LmRhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluS2V5KSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbktleSwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmluID0gYmlubmVkLmdldChiaW5LZXkpITtcbiAgICAgICAgICAgIGJpbi5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGFjayxcbiAgICAgICAgICBzZXJpZXM6IHNlcmllcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhY2tzLFxuICAgICAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZShkYXRlKSxcbiAgICAgICAgICAgIG1heERhdGU6IHJhbmdlTWFwLmdldChkYXRlKSEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5zdGFja3MpLFxuICApO1xuXG4gIHJlYWRvbmx5IGdldFJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5nZXRSYW5nZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgTEVGVF9PRkZTRVQgPSA0ODtcbiAgcmVhZG9ubHkgQ09MVU1OX1BBRERJTkcgPSA0O1xuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLmNvbHVtbldpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5uZWREYXRhLCB3aWR0aCwgaW50ZXJ2YWwsIGNvbHVtbldpZHRoXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHt0aGlzLkhFSUdIVH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDE2O1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoYmlubmVkRGF0YSk7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgeE1pbm9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsKTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdXRjRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IG1pbm9yVGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhTdGVwcyA9IG1pbm9yVGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWlub3JUaW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICAgICAgICB4TWFqb3JJbnRlcnZhbCxcbiAgICAgICAgaGFzTXVsdGlwbGVZZWFycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdXRjRm9ybWF0KFxuICAgICAgICBgJHt4TWlub3JJbnRlcnZhbEZvcm1hdH0gJHt4TWFqb3JJbnRlcnZhbEZvcm1hdH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiBmdWxsRm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkxFRlRfT0ZGU0VULCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgICh0aGlzLkNPTFVNTl9QQURESU5HICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSkgK1xuICAgICAgICAgICAgY29sdW1uV2lkdGggKiBiaW5uZWREYXRhLmxlbmd0aCkpIC9cbiAgICAgICAgMjtcblxuICAgICAgdHlwZSBTZXJpZXNQb2ludCA9IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuVmFsdWUgJiB7XG4gICAgICAgIHNlcmllczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TZXJpZXM7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW5kZXJJbmZvcm1hdGlvbiA9IGJpbm5lZERhdGEubWFwKHN0YWNrRGF0YSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQ3JlYXRlIGFuIGFycmF5IHdpdGggZXZlcnkgZGF0YSBwb2ludCArIHRoZWlyIGFzc29jaWF0ZWQgc2VyaWVzLlxuICAgICAgICAgIGkuZS4gTWFrZSBhbiBiYWNrbGluayBmb3IgZWFjaCBlbGVtZW50IHRvIGl0cyBzZXJpZXMuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWRUYWJsZSA9IHN0YWNrRGF0YS5zZXJpZXMucmVkdWNlPFNlcmllc1BvaW50W10+KFxuICAgICAgICAgICh0YWJsZSwgcykgPT4gW1xuICAgICAgICAgICAgLi4udGFibGUsXG4gICAgICAgICAgICAuLi5zLmRhdGEubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgICBzZXJpZXM6IHMsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIE1hcHMgZWFjaCBvZiB0aGUgU2VyaWVzUG9pbnRzIGJhc2VkIG9uIGxhYmVsLlxuICAgICAgICAgIFRoZW4gbWFwIGVhY2ggb2YgdGhvc2UgbWFwcyB0byBhIGRhdGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBpbmRleGluZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGFuIGluZGV4ZWQgdGFibGUgbGlrZSB0aGUgZm9sbG93aW5nLCAobm90ZSB0aGlzIGlzIHBzZXVkb2NvZGUpOlxuICAgICAgICAgICAgICAnSmFudWFyeSc6IHsgJ0VzdGltYXRlcyBDb21wbGV0ZSc6IDUsICdFc3RpbWF0ZXMgSW5jb21wbGV0ZSc6IDMgfVxuICAgICAgICAgICAgICAnRmVicnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA3LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW5kZXhlZFRhYmxlOiBNYXA8RGF0ZSwgTWFwPHN0cmluZywgU2VyaWVzUG9pbnQ+PiA9IGluZGV4KFxuICAgICAgICAgIHN0YWNrZWRUYWJsZSxcbiAgICAgICAgICBkID0+IGQuZGF0ZSxcbiAgICAgICAgICBkID0+IGQuc2VyaWVzLmxhYmVsLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIG91dHB1dCBvZiBcInN0YWNrKClcIiBpcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgdHVwbGVzLlxuICAgICAgICAgICAgVGhlIHR1cGxlcyB1bm5lc3QgYXMgW2Jhc2VsaW5lLCB0b3BsaW5lXS5cbiAgICAgICAgICAgIEVhY2ggXCJrZXlcIiBpbnZvbHZlZCBpbiB0aGUgc3RhY2sgaGFzIGFuIGFycmF5IG9mIHR1cGxlcyByZWxhdGluZyB0byBpdC5cbiAgICAgICAgICAgICAgaS5lLiBbIERhdGUgMSBUdXBsZSwgRGF0ZSAyIFR1cGxlIF1cbiAgICAgICAgICAgIEFsbCBcImtleVwiIGFycmF5cyBhcmUgY29udGFpbmVkIGluIHRoZSBvdXRlciBhcnJheS5cbiAgICAgICAgICAgICAgaS5lLiBbIEtleSAxIFR1cGxlcywgS2V5IDIgVHVwbGVzXVxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBrZXlzIHVzaW5nIFwiLmtleXMoKVwiLlxuICAgICAgICAgICAgRm9yIG91ciBwdXJwb3NlcywgdGhlIGtleXMgYXJlIHRoZSBsZWdlbmQgZWxlbWVudHMuXG4gICAgICAgICAgICBpLmUuIElmIHlvdSBoYXZlIHR3byBibG9ja3Mgb2YgdGhlIHNhbWUgY29sb3IsIHRoZXkgaGF2ZSB0aGUgc2FtZSBrZXkuXG5cbiAgICAgICAgICBXZSBzZWxlY3QgdGhlIGhlaWdodHMgb2YgdGhlIGJsb2NrcyB1c2luZyBcIi52YWx1ZSgpXCIuXG5cbiAgICAgICAgICBXZSBhcmUgZ29pbmcgdG8gc3RhY2sgdGhlIGJsb2NrcyBvbiB0b3Agb2YgZWFjaCBvdGhlci5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qga2V5IHR1cGxlcyBhcmUgMC5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgc2Vjb25kIGtleSB0dXBsZXMgYXJlIHRoZSB0b3BsaW5lIG9mIHRoZSBhc3NvY2lhdGVkIGZpcnN0IGtleSB0dXBsZS5cblxuICAgICAgICAgIEV4YW1wbGU6XG4gICAgICAgICAgICBJZiB3ZSB3ZXJlIHN0YWNraW5nIHRoZSBmb2xsb3dpbmcgZGF0YTpcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgQ29tcGxldGUgLT4gNSBpbiBKYW51YXJ5LCA3IGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIEluY29tcGxldGUgLT4gMyBpbiBKYW51YXJ5LCAzIGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICBXZSB3b3VsZCBnZXQgYSBzdGFjayBvZjpcbiAgICAgICAgICAgICAgWyAgWyBbMCw1XSxbMCw3XSBdLCBbIFs1LDhdLFs3LDEwXSBdICBdXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWQgPSBzdGFjazxcbiAgICAgICAgICB0eXBlb2YgaW5kZXhlZFRhYmxlIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFY+ID8gW0ssIFZdIDogbmV2ZXJcbiAgICAgICAgPigpXG4gICAgICAgICAgLmtleXMoc3RhY2tEYXRhLnNlcmllcy5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSBkb21haW4gc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBoaWdoZXN0IHZhbHVlIGluIGFueSBzdGFjaywgb24gYW55IGRhdGUuXG4gICAgICBsZXQgZG9tYWluTWF4ID0gMDtcbiAgICAgIC8vIEZvciBlYWNoIHVuaXF1ZSBzdGFjayxcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0pID0+IHtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS52YWx1ZXMoKV0uZm9yRWFjaCgocG9pbnRNYXAsIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLnZhbHVlcygpXS5mb3JFYWNoKChfLCBqKSA9PiB7XG4gICAgICAgICAgICBkb21haW5NYXggPSBNYXRoLm1heChkb21haW5NYXgsIC4uLnN0YWNrZWRbal1baV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRvbWFpbk1heCA9PT0gMCkgZG9tYWluTWF4ID0gMTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkhFSUdIVCAtIHBhZGRpbmcgKiAyLCBwYWRkaW5nXSk7XG5cbiAgICAgIGNvbnN0IHJlY3RzOiB7XG4gICAgICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIGZpbGw6IHN0cmluZztcbiAgICAgICAgc3RyaXBlZDogYm9vbGVhbjtcbiAgICAgICAgc2VyaWVzUG9pbnQ6IFNlcmllc1BvaW50O1xuICAgICAgfVtdID0gW107XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLmVudHJpZXMoKV0uZm9yRWFjaCgoW2RhdGUsIHBvaW50TWFwXSwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAuZW50cmllcygpXS5mb3JFYWNoKChbXywgc2VyaWVzUG9pbnRdLCBqKSA9PiB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGJveCB3ZSBhcmUgYWJvdXQgdG8gZHJhdy5cbiAgICAgICAgICAgIGNvbnN0IFtiYXNlbGluZSwgdG9wbGluZV0gPSBzdGFja2VkW2pdW2ldO1xuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNvbHVtbldpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0geVNjYWxlKGJhc2VsaW5lKSAtIHlTY2FsZSh0b3BsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICAgICBvdXRlclBhZGRpbmcgK1xuICAgICAgICAgICAgICBjb2x1bW5XaWR0aCAqIGluZGV4ICtcbiAgICAgICAgICAgICAgdGhpcy5DT0xVTU5fUEFERElORyAqIGluZGV4O1xuICAgICAgICAgICAgY29uc3QgeSA9IHlTY2FsZShiYXNlbGluZSkgLSBoZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhNaW5vclRpY2tzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIGxhYmVsOiBtaW5vckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgKyB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCB4TWFqb3JUaWNrcyA9XG4gICAgICAgIGludGVydmFsICE9PSAneWVhcidcbiAgICAgICAgICA/IHhTdGVwc1xuICAgICAgICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBtYWpvckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgICAgICAgICB4OlxuICAgICAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgICAgIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHRpY2ssIGksIHRpY2tzKSA9PlxuICAgICAgICAgICAgICAgICAgaSA9PT0gMCB8fCB0aWNrLmxhYmVsICE9PSB0aWNrc1tpIC0gMV0ubGFiZWwsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSk7XG5cbiAgICAgIGNvbnN0IGhvdmVyQmFuZFdpZHRoID1cbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICogY29sdW1uV2lkdGggK1xuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICsgMSkgKiB0aGlzLkNPTFVNTl9QQURESU5HO1xuICAgICAgY29uc3QgaG92ZXJCYW5kcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC0gaG92ZXJCYW5kV2lkdGgpIC8gMixcbiAgICAgICAgeTogeVNjYWxlKGRvbWFpbk1heCksXG4gICAgICAgIHdpZHRoOiBob3ZlckJhbmRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5U2NhbGUoMCkgLSB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgIGhvdmVyQmFuZHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICB2aWV3Qm94LFxuICAgICAgICB4TWlub3JUaWNrcyxcbiAgICAgICAgeE1ham9yVGlja3MsXG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVRpY2tzLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+XG4gICAgICBpbnB1dC5ldmVyeShzdGFjayA9PlxuICAgICAgICBzdGFjay5zZXJpZXMuZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkOiBPYnNlcnZhYmxlPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQgfCBudWxsPiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuYmlubmVkRGF0YSRdKS5waXBlKFxuICAgICAgbWFwKChbaG92ZXJlZEJhbmQsIGJpbm5lZERhdGFdKSA9PiB7XG4gICAgICAgIGlmICghaG92ZXJlZEJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgY29udGVudDogYmlubmVkRGF0YS5tYXAoc3RhY2sgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzUG9pbnRzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgY29sb3JUb2tlbjogc2VyaWVzLmNvbG9yVG9rZW4sXG4gICAgICAgICAgICAgIHN0eWxlOiBzZXJpZXMuc3R5bGUsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIHNlcmllcy5kYXRhLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoeyBkYXRlIH0pID0+IGRhdGUudmFsdWVPZigpID09PSBob3ZlcmVkQmFuZC5kYXRlVmFsdWUsXG4gICAgICAgICAgICAgICAgKT8udmFsdWUgPz8gMCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRpdGxlOiBzdGFjay50aXRsZSxcbiAgICAgICAgICAgICAgdG90YWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgc2VyaWVzUG9pbnRzLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4gcG9pbnQudmFsdWUgKyBhY2MsIDApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXJpZXM6IHNlcmllc1BvaW50cy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihwb2ludC52YWx1ZSksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgZXhwb3J0IHR5cGUgVmFsdWUgPSB7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNlcmllcyA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRhdGE6IFZhbHVlW107XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlOiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrID0ge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcmllczogU2VyaWVzW107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU3RhY2tDbGlja2VkID0ge1xuICAgIG1pbkRhdGU6IERhdGU7XG4gICAgbWF4RGF0ZTogRGF0ZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBDYWxsb3V0Q29udGV4dCA9IHtcbiAgICBhbmNob3I6IERPTVJlY3Q7XG4gICAgY29udGVudDoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICB0b3RhbDogc3RyaW5nO1xuICAgICAgc2VyaWVzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgICAgc3R5bGU6IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG4gICAgICB9W107XG4gICAgfVtdO1xuICB9O1xufVxuIiwiPGRpdlxuICAqbmdJZj1cIihlbXB0eSQgfCBhc3luYykgPT09IGZhbHNlOyBlbHNlIHplcm9TdGF0ZVwiXG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFJhbmdlJCB8IGFzeW5jOyBsZXQgZ2V0UmFuZ2VcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIHN0YWNrQ2xpY2tlZC5lbWl0KGdldFJhbmdlKHJlY3QuZGF0ZVZhbHVlKSk7IGhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1vdmVybGF5XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0Py5hbmNob3IgPz8gbnVsbFwiXG4gICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2NlbnRlci1yaWdodCdcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjYWxsb3V0SGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNhbGxvdXQgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1zdGFja1wiICpuZ0Zvcj1cImxldCBzdGFjayBvZiBjYWxsb3V0Py5jb250ZW50XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGFjay50aXRsZTsgbGV0IHRpdGxlXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgc3RhY2sudG90YWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZXJpZXMgb2Ygc3RhY2suc2VyaWVzXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cInNlcmllcy5jb2xvclRva2VuXCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInNlcmllcy5zdHlsZVwiXG4gICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICA8c3Bhbj57eyBzZXJpZXMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHNlcmllcy5mb3JtYXR0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xzPlxuICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICBbb3B0aW9uR3JvdXBzXT1cImludGVydmFsT3B0aW9ucyQgfCBhc3luYyB8IHJpdk9wdGlvbkdyb3VwXCJcbiAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -15,4 +15,4 @@ export function getDateRange(stacks) {
15
15
  export function pointReducer(points) {
16
16
  return points.reduce((total, { value }) => total + value, 0);
17
17
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDNUI7U0FDRjtLQUNGO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBc0M7SUFDakUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrZWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIHN0YWNrczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuIl19
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBc0M7SUFDakUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrZWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIHN0YWNrczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuIl19
@@ -56,7 +56,7 @@ export class StackedRowComponent {
56
56
  */
57
57
  this.TARGET_HEIGHT = 300;
58
58
  this.RECTANGLE_HEIGHTS = {
59
- MIN_HEIGHT: 12,
59
+ MIN_HEIGHT: 12, // Sets the smallest size a row can shrink to
60
60
  MAX_HEIGHT: 42, // Sets the largest size a row can expand to
61
61
  };
62
62
  this.LABEL_HEIGHT = 8;
@@ -249,10 +249,10 @@ export class StackedRowComponent {
249
249
  };
250
250
  });
251
251
  }
252
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
253
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, outputs: { stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i6.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
253
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, outputs: { stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i6.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
254
254
  }
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StackedRowComponent, decorators: [{
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedRowComponent, decorators: [{
256
256
  type: Component,
257
257
  args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
258
258
  }], propDecorators: { input: [{
@@ -267,4 +267,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
267
267
  }], stackClicked: [{
268
268
  type: Output
269
269
  }] } });
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUtMLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLG9CQUFvQixHQUNyQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFFL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQzNDLEVBQUUsQ0FDSCxDQUFDO1FBU0YsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUt6RCwrRUFBK0U7UUFFeEUsbUJBQWMsR0FBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQ3RELHFCQUFxQixDQUN0QixDQUFDO1FB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QixFQUM3QixLQUFhLEVBQ2IsU0FBaUI7UUFFakIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hFLG9GQUFvRjtZQUNwRixNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUM7Z0JBQ3JCLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFFaEIsT0FBTztnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUN4QyxDQUFDLEVBQUUsU0FBUztnQkFDWixDQUFDLEVBQUUsU0FBUzthQUNiLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBdFNVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlQQWtDaEIsV0FBVyxnREN6RTNCLG03SEE2SUE7OzRGRHRHYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBUXBDLEtBQUs7c0JBRGYsS0FBSztnQkFnQkMsY0FBYztzQkFEcEIsS0FBSztnQkFPSyxnQkFBZ0I7c0JBRDFCLEtBQUs7Z0JBU04scUJBQXFCO3NCQURwQixZQUFZO3VCQUFDLFdBQVc7Z0JBTXpCLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcm5TZXQgfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBSb3dEaXNwbGF5SW5mbyxcbiAgUm93TGFiZWwsXG4gIFJvd1JlY3RhbmdsZSxcbiAgU3RhY2tlZFJvd0RyYXdEYXRhLFxuICBnZXRLZXlPcmRlcixcbiAgZ2V0TGVnZW5kSXRlbXMsXG4gIGdldFJvd0Rpc3BsYXlJbmZvLFxuICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyxcbn0gZnJvbSAnLi9zdGFja2VkLXJvdy5oZWxwZXJzJztcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFdpZHRoIGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cblxuICAvLyBWYWx1ZUZvcm1hdHRlciBkZXRlcm1pbmVzIGhvdyB3ZSBzdHlsZSB0aGUgdmFsdWVzIGluIGEgbWV0cmljIGFuZCB0aGUgeC1heGlzXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB6ZXJvU3RhdGVNZXNzYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgemVyb1N0YXRlTWVzc2FnZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLnplcm9TdGF0ZU1lc3NhZ2UkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB6ZXJvU3RhdGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gIGNhbGxvdXRIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFN0YWNrZWRSb3dDb21wb25lbnQuQ2FsbG91dENvbnRleHQ7XG4gIH0+O1xuXG4gIEBPdXRwdXQoKVxuICBzdGFja0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWNrZWRSb3dDb21wb25lbnQuU3RhY2tDbGlja2VkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRBbmRSb3dIZWlnaHRzJCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodFdpdGhvdXRSb3dzID1cbiAgICAgICAgaW5wdXQubGVuZ3RoICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICogMiArXG4gICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgICAgLy8gVGhlIGNvbWJpbmVkIGhlaWdodCBvZiBhbGwgcm93cyBhdCB0aGVpciBtaW4vbWF4XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPVxuICAgICAgICBpbnB1dC5sZW5ndGggKiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1JTl9IRUlHSFQgKyBoZWlnaHRXaXRob3V0Um93cztcbiAgICAgIGNvbnN0IG1heEhlaWdodCA9XG4gICAgICAgIGlucHV0Lmxlbmd0aCAqIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUFYX0hFSUdIVCArIGhlaWdodFdpdGhvdXRSb3dzO1xuXG4gICAgICAvLyBJZiB0aGUgbWF4LXNpemVkIHJvd3MgZG9uJ3QgbmVlZCB0aGUgdGFyZ2V0IHNpemUsIHNocmluayB0aGUgY2hhcnRcbiAgICAgIGlmIChtYXhIZWlnaHQgPCB0aGlzLlRBUkdFVF9IRUlHSFQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhcnRIZWlnaHQ6IG1heEhlaWdodCxcbiAgICAgICAgICByb3dIZWlnaHQ6IHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUFYX0hFSUdIVCxcbiAgICAgICAgfTtcbiAgICAgIC8vIElmIHRoZSBtaW4tc2l6ZWQgcm93cyBuZWVkIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IHNpemUsIGdyb3cgdGhlIGNoYXJ0XG4gICAgICBpZiAobWluSGVpZ2h0ID4gdGhpcy5UQVJHRVRfSEVJR0hUKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoYXJ0SGVpZ2h0OiBtaW5IZWlnaHQsXG4gICAgICAgICAgcm93SGVpZ2h0OiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1JTl9IRUlHSFQsXG4gICAgICAgIH07XG4gICAgICAvLyBPdGhlcndpc2Ugc2hyaW5rIHRoZSByb3dzIHRvIGZpdCB0aGUgdGFyZ2V0IHNpemVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYXJ0SGVpZ2h0OiB0aGlzLlRBUkdFVF9IRUlHSFQsXG4gICAgICAgIHJvd0hlaWdodDogKHRoaXMuVEFSR0VUX0hFSUdIVCAtIGhlaWdodFdpdGhvdXRSb3dzKSAvIGlucHV0Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgLypcbiAgICBUaGUgbGF5b3V0IHdlIGFyZSBzaG9vdGluZyBmb3IgaXM6XG5cbiAgICAgICAgICAgICAgfCAgIFggQXhpcyBMYWJlbHMgIHxcbiAgICBSb3cgTmFtZSAgfCAgIFJlY3RhbmdsZXMgICAgIHwgICBUb3RhbHNcbiAgKi9cbiAgcmVhZG9ubHkgVEFSR0VUX0hFSUdIVCA9IDMwMDtcblxuICByZWFkb25seSBSRUNUQU5HTEVfSEVJR0hUUyA9IHtcbiAgICBNSU5fSEVJR0hUOiAxMiwgLy8gU2V0cyB0aGUgc21hbGxlc3Qgc2l6ZSBhIHJvdyBjYW4gc2hyaW5rIHRvXG4gICAgTUFYX0hFSUdIVDogNDIsIC8vIFNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBhIHJvdyBjYW4gZXhwYW5kIHRvXG4gIH07XG5cbiAgcmVhZG9ubHkgTEFCRUxfSEVJR0hUID0gODtcblxuICByZWFkb25seSBTRUNUSU9OX0hFSUdIVFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB4LWF4aXMgbGFiZWxzXG4gICAgWF9BWElTX0xBQkVMOiAxNCxcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1dJRFRIUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIG5hbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByb3dcbiAgICBST1dfTkFNRTogMTAwLFxuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgdG90YWxzIGF0IHRoZSBlbmQgb2YgdGhlIHJvd1xuICAgIFJPV19UT1RBTF9MQUJFTDogNzIsXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9QQURESU5HID0ge1xuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiBlYWNoIGVkZ2Ugb2YgdGhlIHZpZXdib3ggYW5kIHRoZSBjb250ZW50XG4gICAgT1VURVJfVE9QX0JPVFRPTTogNCxcbiAgICBPVVRFUl9MRUZUX1JJR0hUOiA0LFxuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiB0aGUgYm90dG9tIG9mIG9uZSByb3cgYW5kIHRoZSB0b3Agb2YgdGhlIG5leHQgcm93XG4gICAgQkVUV0VFTl9ST1c6IDQsXG4gICAgLy8gU3BhY2UgYmV0d2VlbiB0aGUgcm93IGFuZCB0aGUgdG9wIG9mIGEgcmVjdGFuZ2xlIGluIHRoYXQgcm93XG4gICAgUkVDVEFOR0xFX1RPX1JPVzogNixcbiAgfTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIFgtYXhpcyBzZWdtZW50cyB0byBjcmVhdGUsIHdpdGggbGFiZWxzIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNlZ21lbnQuXG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVF9NQVggPSA4O1xuICByZWFkb25seSBYX1RJQ0tfQ09VTlRfTUlOID0gMztcbiAgcmVhZG9ubHkgWF9USUNLX01BWF9XSURUSCA9IDkwMDtcbiAgcmVhZG9ubHkgWF9USUNLX01JTl9XSURUSCA9IDQwMDtcblxuICAvLyBaZXJvIG9uIHRoZSBYIGF4aXMgaXMgYWZ0ZXIgdGhlIGxlZnQgcGFkZGluZyBhbmQgdGhlIHJvdyBuYW1lLlxuICBsb2NhdGlvbk9mWEF4aXNaZXJvKCkge1xuICAgIHJldHVybiB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUICsgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfTkFNRTtcbiAgfVxuICAvLyBUaGUgZW5kIG9mIHRoZSBYIGF4aXMgaXMgcmlnaHQgYmVmb3JlIHRoZSByb3cgdG90YWwgYW5kIHRoZSByaWdodCBwYWRkaW5nLlxuICBsb2NhdGlvbk9mWEF4aXNFbmQod2lkdGg6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlT25SaWdodDogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX1RPVEFMX0xBQkVMICtcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgcmV0dXJuIHdpZHRoIC0gc3BhY2VPblJpZ2h0O1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB4LWF4aXMgdGlja3NcbiAgbG9jYXRpb25PZlhBeGlzVGljaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTFxuICAgICk7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHRvcCBvZiB0aGUgY3VycmVudCByb3dcbiAgZ2V0VG9wT2ZSb3cocm93SW5kZXg6IG51bWJlciwgcm93SGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZUFib3ZlUm93czogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICBjb25zdCBhYm92ZVJvd3M6IG51bWJlciA9IHJvd0luZGV4ICogcm93SGVpZ2h0O1xuICAgIGNvbnN0IGFib3ZlUm93UGFkZGluZ3M6IG51bWJlciA9XG4gICAgICByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XO1xuICAgIGNvbnN0IGFsbEFib3ZlUm93czogbnVtYmVyID0gYWJvdmVSb3dzICsgYWJvdmVSb3dQYWRkaW5ncztcblxuICAgIHJldHVybiBzcGFjZUFib3ZlUm93cyArIGFsbEFib3ZlUm93cztcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhbGwgdGhlIHZhbHVlcyB3ZSBuZWVkIGZvciBkaXNwbGF5aW5nIHRoZSBncmFwaCBvbiBzY3JlZW4uXG4gIGdldERyYXduRGF0YShcbiAgICByb3dTdGFja3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGNoYXJ0SGVpZ2h0OiBudW1iZXIsXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICkge1xuICAgIGlmIChyb3dTdGFja3MubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2NoYXJ0SGVpZ2h0fWA7XG5cbiAgICBjb25zdCBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4gPSBnZXRLZXlPcmRlcihyb3dTdGFja3MpO1xuICAgIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSA9XG4gICAgICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyhyb3dTdGFja3MsIGtleXNJbk9yZGVyKTtcbiAgICBjb25zdCByb3dzRm9yRGlzcGxheTogUm93RGlzcGxheUluZm9bXSA9IHN0YW5kYXJkaXplZFJvd3MubWFwKFxuICAgICAgKHN0YWNrRGF0YSwgaSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Um93RGlzcGxheUluZm8oc3RhY2tEYXRhLCBpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkb21haW4gc2hvdWxkIGJlIHRoZSBoaWdoZXN0IHRvdGFsIHZhbHVlIGZyb20gdGhlIHJvd3MuXG4gICAgY29uc3QgZG9tYWluTWF4ID0gTWF0aC5tYXgoMCwgLi4ucm93c0ZvckRpc3BsYXkubWFwKHJvdyA9PiByb3cucm93VG90YWwpKTtcbiAgICBjb25zdCB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4gPSBzY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgLnJhbmdlKFt0aGlzLmxvY2F0aW9uT2ZYQXhpc1plcm8oKSwgdGhpcy5sb2NhdGlvbk9mWEF4aXNFbmQod2lkdGgpXSk7XG5cbiAgICAvLyBTZXR1cCBhIGxpbmVhciBzY2FsZSBmb3IgdGljayBjb3VudCBiYXNlZCBvbiB3aWR0aFxuICAgIGNvbnN0IHRpY2tTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oW3RoaXMuWF9USUNLX01JTl9XSURUSCwgdGhpcy5YX1RJQ0tfTUFYX1dJRFRIXSlcbiAgICAgIC5yYW5nZShbdGhpcy5YX1RJQ0tfQ09VTlRfTUlOLCB0aGlzLlhfVElDS19DT1VOVF9NQVhdKVxuICAgICAgLmNsYW1wKHRydWUpOyAvLyBFbnN1cmVzIHRoZSBzY2FsZSBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGRlZmluZWQgcmFuZ2VcblxuICAgIGNvbnN0IHh0aWNrQ291bnRBZGp1c3RlZCA9IE1hdGgucm91bmQodGlja1NjYWxlKHdpZHRoKSk7XG4gICAgY29uc3QgeFRpY2tzID0geFNjYWxlLnRpY2tzKHh0aWNrQ291bnRBZGp1c3RlZCk7XG5cbiAgICBjb25zdCByZWN0czogUm93UmVjdGFuZ2xlW10gPSB0aGlzLmNyZWF0ZVJlY3RhbmdsZXNGcm9tUm93cyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgeFNjYWxlLFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCByb3dOYW1lc1RvRHJhdzogUm93TGFiZWxbXSA9IHRoaXMuZ2V0Um93TmFtZXNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHJvd0hlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IHJvd1RvdGFsc1RvRHJhdzogUm93TGFiZWxbXSA9IHRoaXMuZ2V0Um93VG90YWxzVG9EcmF3KFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB3aWR0aCxcbiAgICAgIHJvd0hlaWdodCxcbiAgICApO1xuXG4gICAgY29uc3QgbGVnZW5kSXRlbXMgPSBnZXRMZWdlbmRJdGVtcyhyb3dzRm9yRGlzcGxheSwga2V5c0luT3JkZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZ2VuZEl0ZW1zOiBsZWdlbmRJdGVtcyxcbiAgICAgIHJvd0hlaWdodDogcm93SGVpZ2h0LFxuICAgICAgcmVjdHM6IHJlY3RzLFxuICAgICAgcm93TmFtZXM6IHJvd05hbWVzVG9EcmF3LFxuICAgICAgcm93VG90YWxzOiByb3dUb3RhbHNUb0RyYXcsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgeFNjYWxlOiB4U2NhbGUsXG4gICAgICB4VGlja3M6IHhUaWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZm9yIGFsbCB0aGUgcmVjdGFuZ2xlcyBmb3IgYWxsIHRoZSByb3dzXG4gIGNyZWF0ZVJlY3RhbmdsZXNGcm9tUm93cyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd1JlY3RhbmdsZVtdIHtcbiAgICBjb25zdCByZWN0YW5nbGVzOiBSb3dSZWN0YW5nbGVbXSA9IFtdO1xuICAgIGRpc3BsYXlSb3dzLmZvckVhY2goKGN1cnJlbnRSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjdXJyZW50Um93LmVsZW1lbnRzQnV0U3RhY2tlZC5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgXykgPT4ge1xuICAgICAgICBjb25zdCB0b3BPZlJvdzogbnVtYmVyID0gdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVXaWR0aDogbnVtYmVyID1cbiAgICAgICAgICB4U2NhbGUoY3VycmVudEVsZW1lbnQudG9wbGluZSkgLSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVIZWlnaHQ6IG51bWJlciA9IHJvd0hlaWdodDtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVYOiBudW1iZXIgPSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVZOiBudW1iZXIgPVxuICAgICAgICAgIHRvcE9mUm93ICsgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVztcblxuICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke2N1cnJlbnRFbGVtZW50LmNvbG9yVG9rZW59KWA7XG5cbiAgICAgICAgcmVjdGFuZ2xlcy5wdXNoKHtcbiAgICAgICAgICB4OiByZWN0YW5nbGVYLFxuICAgICAgICAgIHk6IHJlY3RhbmdsZVksXG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KHJlY3RhbmdsZVdpZHRoLCAwKSxcbiAgICAgICAgICBoZWlnaHQ6IHJlY3RhbmdsZUhlaWdodCxcbiAgICAgICAgICBmaWxsOiBmaWxsLFxuICAgICAgICAgIHN0cmlwZWQ6IGN1cnJlbnRFbGVtZW50LnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgcm93TmFtZTogY3VycmVudFJvdy5yb3dOYW1lLFxuICAgICAgICAgIHN0YWNrZWRSb3dFbGVtZW50OiBjdXJyZW50RWxlbWVudCxcbiAgICAgICAgICBzdGFja0luZGV4OiBjdXJyZW50Um93LnN0YWNrSW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZXM7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBvbiB0aGUgcm93IG5hbWVzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd05hbWVzVG9EcmF3KFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHJvd0hlaWdodDogbnVtYmVyLFxuICApOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgICAgLy8gVGhlIHJvdyBuYW1lIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLkxBQkVMX0hFSUdIVCAvIDIgK1xuICAgICAgICByb3dIZWlnaHQgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcm93LnJvd05hbWUsXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgdG90YWxzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd1RvdGFsc1RvRHJhdyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIHJvd0hlaWdodDogbnVtYmVyLFxuICApOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB3aWR0aCAtIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IHRvdGFscyBsb29rcyByaWdodCBpZiBpdHMgYmFzZSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgYXNzb2NpYXRlZCByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHJvd0xhYmVsWSA9XG4gICAgICAgIHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgsIHJvd0hlaWdodCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5MQUJFTF9IRUlHSFQgLyAyICtcbiAgICAgICAgcm93SGVpZ2h0IC8gMjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIocm93LnJvd1RvdGFsKSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPFN0YWNrZWRSb3dEcmF3RGF0YSB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5jaGFydEFuZFJvd0hlaWdodHMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCB3aWR0aCwgaGVpZ2h0XSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJhd25EYXRhKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodC5jaGFydEhlaWdodCxcbiAgICAgICAgaGVpZ2h0LnJvd0hlaWdodCxcbiAgICAgICk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICAvLyBMZXRzIHVzIGtub3cgd2hldGhlciB0byBkaXNwbGF5IHRoZSB6ZXJvIGRhdGEgc3RhdGVcbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4gaW5wdXQuZXZlcnkoc3RhY2sgPT4gc3RhY2suZGF0YS5sZW5ndGggPT09IDApKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIFdoYXQgcmVjdGFuZ2xlIHdlIGFyZSBjdXJyZW50bHkgaG92ZXJpbmcgb3ZlclxuICByZWFkb25seSBob3ZlcmVkUmVjdGFuZ2xlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJlY3RhbmdsZTogUm93UmVjdGFuZ2xlO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gV2hhdCBiYW5kIHdlIGFyZSBjdXJyZW50bHkgaG92ZXJpbmcgb3ZlclxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICByb3dOYW1lOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBDcmVhdGUgdGhlIG1ldHJpYyB0byBkaXNwbGF5IGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgaG92ZXJlZCByZWN0YW5nbGVcbiAgcmVhZG9ubHkgY2FsbG91dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmhvdmVyZWRCYW5kJCwgdGhpcy5kcmF3RGF0YSRdKS5waXBlKFxuICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBkcmF3RGF0YV0pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZEJhbmQgfHwgIWRyYXdEYXRhKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRCYW5kLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LnJvd05hbWUgPT09IGhvdmVyZWRCYW5kLnJvd05hbWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgbGFiZWw6IHJlY3Quc3RhY2tlZFJvd0VsZW1lbnQubGFiZWwsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocmVjdC5zdGFja2VkUm93RWxlbWVudC52YWx1ZSksXG4gICAgICAgICAgY29sb3JUb2tlbjogcmVjdC5zdGFja2VkUm93RWxlbWVudC5jb2xvclRva2VuLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZFJvd0NvbXBvbmVudCB7XG4gIC8vIEEgc3BlY2lmaWNhbGx5IGNvbG9yZWQgc2VjdGlvbiBvZiBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dFbGVtZW50ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7IC8vIExlZ2VuZCBlbGVtZW50IG5hbWVcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZT86IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gIH07XG4gIC8vIFRoZSBpbnB1dCB0aGF0IGRldGVybWluZXMgb25lIHJvdy5cbiAgZXhwb3J0IHR5cGUgUm93U3RhY2sgPSB7XG4gICAgcm93TmFtZTogc3RyaW5nO1xuICAgIGRhdGE6IFJvd0VsZW1lbnRbXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdGFja0NsaWNrZWQgPSB7XG4gICAgc3RhY2tJbmRleDogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIENhbGxvdXRDb250ZXh0ID0ge1xuICAgIGFuY2hvcjogRE9NUmVjdDtcbiAgICBtZXRyaWNzOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGNvbG9yVG9rZW46IHN0cmluZyB9W107XG4gIH07XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwiKGVtcHR5JCB8IGFzeW5jKSA9PT0gZmFsc2U7IGVsc2UgemVyb1N0YXRlXCJcbiAgY2xhc3M9XCJjb250YWluZXJcIlxuICAocml2Q2xpZW50U2l6ZSk9XCJ3aWR0aCA9ICRldmVudC53aWR0aFwiXG4+XG4gIDxzdmdcbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZHJhd1wiXG4gICAgW2F0dHIudmlld0JveF09XCJkcmF3LnZpZXdCb3hcIlxuICA+XG4gICAgPGRlZnM+XG4gICAgICA8cGF0dGVyblxuICAgICAgICBpZD1cInN0cmlwZXNcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgW2F0dHIueDFdPVwiMFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwiMFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICAgIFthdHRyLnkyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBzdHJva2U9XCJ2YXIoLS13aGl0ZS0xMDApXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvbGluZT5cbiAgICAgIDwvcGF0dGVybj5cbiAgICA8L2RlZnM+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd05hbWVUb0RyYXcgb2YgZHJhdy5yb3dOYW1lc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgcml2U1ZHVGV4dFRydW5jYXRlXG4gICAgICAgIFt0ZXh0XT1cInJvd05hbWVUb0RyYXcubGFiZWxcIlxuICAgICAgICBbd2lkdGhdPVwiU0VDVElPTl9XSURUSFMuUk9XX05BTUVcIlxuICAgICAgICBjbGFzcz1cInJvdy10aXRsZVwiXG4gICAgICAgIFthdHRyLnhdPVwicm93TmFtZVRvRHJhdy54XCJcbiAgICAgICAgW2F0dHIueV09XCJyb3dOYW1lVG9EcmF3LnlcIlxuICAgICAgPjwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZHJhdy54VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIHdpZHRoPVwiMVwiXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICBbYXR0ci55XT1cImxvY2F0aW9uT2ZYQXhpc1RpY2soKVwiXG4gICAgICAgIGR4PVwiNFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8Z1xuICAgICAgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZHJhdy5yZWN0c1wiXG4gICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkQmFuZCQubmV4dCh7IHJvd05hbWU6IHJlY3Qucm93TmFtZSwgZXZlbnQ6ICRldmVudCB9KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkQmFuZCQubmV4dChudWxsKVwiXG4gICAgICAoY2xpY2spPVwiXG4gICAgICAgIHN0YWNrQ2xpY2tlZC5lbWl0KHsgc3RhY2tJbmRleDogcmVjdC5zdGFja0luZGV4IH0pO1xuICAgICAgICBob3ZlcmVkQmFuZCQubmV4dChudWxsKVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInJvd1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8ucm93TmFtZSAhPT0gcmVjdC5yb3dOYW1lXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dUb3RhbFRvRHJhdyBvZiBkcmF3LnJvd1RvdGFsc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJyb3ctdG90YWxcIlxuICAgICAgICBbYXR0ci54XT1cInJvd1RvdGFsVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd1RvdGFsVG9EcmF3LnlcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd1RvdGFsVG9EcmF3LmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICA8L3N2Zz5cbiAgPGxlZ2VuZCAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZHJhd1wiPlxuICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRyYXcubGVnZW5kSXRlbXNcIlxuICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgW2NvbG9yVG9rZW5dPVwiaXRlbS5jb2xvclRva2VuXCJcbiAgICAgIFtzdHlsZV09XCJpdGVtLnN0eWxlID8gaXRlbS5zdHlsZSA6ICdzb2xpZCdcIlxuICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgPC9sZWdlbmQ+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGxvdXQkIHwgYXN5bmM7IGxldCBjYWxsb3V0XCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwiY2FsbG91dD8uYW5jaG9yID8/IG51bGxcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1jZW50ZXInXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNhbGxvdXRIZWFkZXJUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY2FsbG91dCB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Py5tZXRyaWNzXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW0gW2NvbG9yVG9rZW5dPVwibWV0cmljLmNvbG9yVG9rZW5cIj48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICA8c3Bhbj57eyBtZXRyaWMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgbWV0cmljLnZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZSBbbWVzc2FnZV09XCJ6ZXJvU3RhdGVNZXNzYWdlXCI+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUtMLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLG9CQUFvQixHQUNyQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFFL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQzNDLEVBQUUsQ0FDSCxDQUFDO1FBU0YsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUt6RCwrRUFBK0U7UUFFeEUsbUJBQWMsR0FBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQ3RELHFCQUFxQixDQUN0QixDQUFDO1FB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SUFDNUMsa0JBQWtCLENBQ2hCLFdBQTZCLEVBQzdCLEtBQWEsRUFDYixTQUFpQjtRQUVqQixPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDaEUsb0ZBQW9GO1lBQ3BGLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztnQkFDckIsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUVoQixPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLENBQUMsRUFBRSxTQUFTO2dCQUNaLENBQUMsRUFBRSxTQUFTO2FBQ2IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0U1UsbUJBQW1CO21HQUFuQixtQkFBbUIseVBBa0NoQixXQUFXLGdEQ3pFM0IsbTdIQTZJQTs7NEZEdEdhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTs4QkFRcEMsS0FBSztzQkFEZixLQUFLO2dCQWdCQyxjQUFjO3NCQURwQixLQUFLO2dCQU9LLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFTTixxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsV0FBVztnQkFNekIsWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludGVyblNldCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMZWdlbmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGVnZW5kLWl0ZW0vbGVnZW5kLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJvd0Rpc3BsYXlJbmZvLFxuICBSb3dMYWJlbCxcbiAgUm93UmVjdGFuZ2xlLFxuICBTdGFja2VkUm93RHJhd0RhdGEsXG4gIGdldEtleU9yZGVyLFxuICBnZXRMZWdlbmRJdGVtcyxcbiAgZ2V0Um93RGlzcGxheUluZm8sXG4gIHN0YW5kYXJkaXplUm93U3RhY2tzLFxufSBmcm9tICcuL3N0YWNrZWQtcm93LmhlbHBlcnMnO1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG4vLyBodHRwczovL3d3dy5ub3Rpb24uc28vcml2ZXQvUmVzb2x2ZS1UT0RPcy1hZnRlci1Bbmd1bGFyLXVwZ3JhZGUtMWYyNjY3ZWIyYTMxODBiNzlmNmFkOTJhN2U1NzZmMDhcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLXJvdycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtcm93LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRSb3dDb21wb25lbnQge1xuICAvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIHJvd3Mgd2Ugd2lsbCBkaXNwbGF5LCBpbiB0aGUgb3JkZXIgd2Ugd2lsbCBkaXNwbGF5IHRoZW0uXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10+KFxuICAgIFtdLFxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSkge1xuICAgIHRoaXMuaW5wdXQkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dCgpOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gV2lkdGggaGVscHMgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB2aWV3Ym94IHRoaXMgZ3JhcGggaXMgZGlzcGxheWluZyBpbi5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZilcbiAgY2FsbG91dEhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8e1xuICAgICRpbXBsaWNpdDogU3RhY2tlZFJvd0NvbXBvbmVudC5DYWxsb3V0Q29udGV4dDtcbiAgfT47XG5cbiAgQE91dHB1dCgpXG4gIHN0YWNrQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RhY2tlZFJvd0NvbXBvbmVudC5TdGFja0NsaWNrZWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydEFuZFJvd0hlaWdodHMkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0V2l0aG91dFJvd3MgPVxuICAgICAgICBpbnB1dC5sZW5ndGggKiB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVyArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKiAyICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMO1xuXG4gICAgICAvLyBUaGUgY29tYmluZWQgaGVpZ2h0IG9mIGFsbCByb3dzIGF0IHRoZWlyIG1pbi9tYXhcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9XG4gICAgICAgIGlucHV0Lmxlbmd0aCAqIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCArIGhlaWdodFdpdGhvdXRSb3dzO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID1cbiAgICAgICAgaW5wdXQubGVuZ3RoICogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hUICsgaGVpZ2h0V2l0aG91dFJvd3M7XG5cbiAgICAgIC8vIElmIHRoZSBtYXgtc2l6ZWQgcm93cyBkb24ndCBuZWVkIHRoZSB0YXJnZXQgc2l6ZSwgc2hyaW5rIHRoZSBjaGFydFxuICAgICAgaWYgKG1heEhlaWdodCA8IHRoaXMuVEFSR0VUX0hFSUdIVClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFydEhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICAgIHJvd0hlaWdodDogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICB9O1xuICAgICAgLy8gSWYgdGhlIG1pbi1zaXplZCByb3dzIG5lZWQgbW9yZSB0aGFuIHRoZSB0YXJnZXQgc2l6ZSwgZ3JvdyB0aGUgY2hhcnRcbiAgICAgIGlmIChtaW5IZWlnaHQgPiB0aGlzLlRBUkdFVF9IRUlHSFQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhcnRIZWlnaHQ6IG1pbkhlaWdodCxcbiAgICAgICAgICByb3dIZWlnaHQ6IHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCxcbiAgICAgICAgfTtcbiAgICAgIC8vIE90aGVyd2lzZSBzaHJpbmsgdGhlIHJvd3MgdG8gZml0IHRoZSB0YXJnZXQgc2l6ZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhcnRIZWlnaHQ6IHRoaXMuVEFSR0VUX0hFSUdIVCxcbiAgICAgICAgcm93SGVpZ2h0OiAodGhpcy5UQVJHRVRfSEVJR0hUIC0gaGVpZ2h0V2l0aG91dFJvd3MpIC8gaW5wdXQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9KSxcbiAgKTtcblxuICAvKlxuICAgIFRoZSBsYXlvdXQgd2UgYXJlIHNob290aW5nIGZvciBpczpcblxuICAgICAgICAgICAgICB8ICAgWCBBeGlzIExhYmVscyAgfFxuICAgIFJvdyBOYW1lICB8ICAgUmVjdGFuZ2xlcyAgICAgfCAgIFRvdGFsc1xuICAqL1xuICByZWFkb25seSBUQVJHRVRfSEVJR0hUID0gMzAwO1xuXG4gIHJlYWRvbmx5IFJFQ1RBTkdMRV9IRUlHSFRTID0ge1xuICAgIE1JTl9IRUlHSFQ6IDEyLCAvLyBTZXRzIHRoZSBzbWFsbGVzdCBzaXplIGEgcm93IGNhbiBzaHJpbmsgdG9cbiAgICBNQVhfSEVJR0hUOiA0MiwgLy8gU2V0cyB0aGUgbGFyZ2VzdCBzaXplIGEgcm93IGNhbiBleHBhbmQgdG9cbiAgfTtcblxuICByZWFkb25seSBMQUJFTF9IRUlHSFQgPSA4O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fV0lEVEhTID0ge1xuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgbmFtZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvd1xuICAgIFJPV19OQU1FOiAxMDAsXG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB0b3RhbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93XG4gICAgUk9XX1RPVEFMX0xBQkVMOiA3MixcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1BBRERJTkcgPSB7XG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIGVhY2ggZWRnZSBvZiB0aGUgdmlld2JveCBhbmQgdGhlIGNvbnRlbnRcbiAgICBPVVRFUl9UT1BfQk9UVE9NOiA0LFxuICAgIE9VVEVSX0xFRlRfUklHSFQ6IDQsXG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIHRoZSBib3R0b20gb2Ygb25lIHJvdyBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb3dcbiAgICBCRVRXRUVOX1JPVzogNCxcbiAgICAvLyBTcGFjZSBiZXR3ZWVuIHRoZSByb3cgYW5kIHRoZSB0b3Agb2YgYSByZWN0YW5nbGUgaW4gdGhhdCByb3dcbiAgICBSRUNUQU5HTEVfVE9fUk9XOiA2LFxuICB9O1xuXG4gIC8vIFRoZSBudW1iZXIgb2YgWC1heGlzIHNlZ21lbnRzIHRvIGNyZWF0ZSwgd2l0aCBsYWJlbHMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2VnbWVudC5cbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UX01BWCA9IDg7XG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVF9NSU4gPSAzO1xuICByZWFkb25seSBYX1RJQ0tfTUFYX1dJRFRIID0gOTAwO1xuICByZWFkb25seSBYX1RJQ0tfTUlOX1dJRFRIID0gNDAwO1xuXG4gIC8vIFplcm8gb24gdGhlIFggYXhpcyBpcyBhZnRlciB0aGUgbGVmdCBwYWRkaW5nIGFuZCB0aGUgcm93IG5hbWUuXG4gIGxvY2F0aW9uT2ZYQXhpc1plcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQgKyB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FO1xuICB9XG4gIC8vIFRoZSBlbmQgb2YgdGhlIFggYXhpcyBpcyByaWdodCBiZWZvcmUgdGhlIHJvdyB0b3RhbCBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gIGxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3BhY2VPblJpZ2h0OiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfVE9UQUxfTEFCRUwgK1xuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICByZXR1cm4gd2lkdGggLSBzcGFjZU9uUmlnaHQ7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHgtYXhpcyB0aWNrc1xuICBsb2NhdGlvbk9mWEF4aXNUaWNrKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICsgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMXG4gICAgKTtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHJvd1xuICBnZXRUb3BPZlJvdyhyb3dJbmRleDogbnVtYmVyLCByb3dIZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlQWJvdmVSb3dzOiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgIGNvbnN0IGFib3ZlUm93czogbnVtYmVyID0gcm93SW5kZXggKiByb3dIZWlnaHQ7XG4gICAgY29uc3QgYWJvdmVSb3dQYWRkaW5nczogbnVtYmVyID1cbiAgICAgIHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1c7XG4gICAgY29uc3QgYWxsQWJvdmVSb3dzOiBudW1iZXIgPSBhYm92ZVJvd3MgKyBhYm92ZVJvd1BhZGRpbmdzO1xuXG4gICAgcmV0dXJuIHNwYWNlQWJvdmVSb3dzICsgYWxsQWJvdmVSb3dzO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGFsbCB0aGUgdmFsdWVzIHdlIG5lZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGdyYXBoIG9uIHNjcmVlbi5cbiAgZ2V0RHJhd25EYXRhKFxuICAgIHJvd1N0YWNrczogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgY2hhcnRIZWlnaHQ6IG51bWJlcixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHJvd1N0YWNrcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7Y2hhcnRIZWlnaHR9YDtcblxuICAgIGNvbnN0IGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IGdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkUm93czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdID1cbiAgICAgIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcywga2V5c0luT3JkZXIpO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoXG4gICAgICAoc3RhY2tEYXRhLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEsIGkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcblxuICAgIC8vIFNldHVwIGEgbGluZWFyIHNjYWxlIGZvciB0aWNrIGNvdW50IGJhc2VkIG9uIHdpZHRoXG4gICAgY29uc3QgdGlja1NjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5YX1RJQ0tfTUlOX1dJRFRILCB0aGlzLlhfVElDS19NQVhfV0lEVEhdKVxuICAgICAgLnJhbmdlKFt0aGlzLlhfVElDS19DT1VOVF9NSU4sIHRoaXMuWF9USUNLX0NPVU5UX01BWF0pXG4gICAgICAuY2xhbXAodHJ1ZSk7IC8vIEVuc3VyZXMgdGhlIHNjYWxlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZGVmaW5lZCByYW5nZVxuXG4gICAgY29uc3QgeHRpY2tDb3VudEFkanVzdGVkID0gTWF0aC5yb3VuZCh0aWNrU2NhbGUod2lkdGgpKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoeHRpY2tDb3VudEFkanVzdGVkKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgICByb3dIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiByb3dIZWlnaHQsXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVdpZHRoOiBudW1iZXIgPVxuICAgICAgICAgIHhTY2FsZShjdXJyZW50RWxlbWVudC50b3BsaW5lKSAtIHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZUhlaWdodDogbnVtYmVyID0gcm93SGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVg6IG51bWJlciA9IHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVk6IG51bWJlciA9XG4gICAgICAgICAgdG9wT2ZSb3cgKyB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XO1xuXG4gICAgICAgIGNvbnN0IGZpbGwgPSBgdmFyKCR7Y3VycmVudEVsZW1lbnQuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICByZWN0YW5nbGVzLnB1c2goe1xuICAgICAgICAgIHg6IHJlY3RhbmdsZVgsXG4gICAgICAgICAgeTogcmVjdGFuZ2xlWSxcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgocmVjdGFuZ2xlV2lkdGgsIDApLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICAgIHN0YWNrSW5kZXg6IGN1cnJlbnRSb3cuc3RhY2tJbmRleCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjdGFuZ2xlcztcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgbmFtZXMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93TmFtZXNUb0RyYXcoXG4gICAgZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10sXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IG5hbWUgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgIHRoaXMuTEFCRUxfSEVJR0hUIC8gMiArXG4gICAgICAgIHJvd0hlaWdodCAvIDI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiByb3cucm93TmFtZSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyB0b3RhbHMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93VG90YWxzVG9EcmF3KFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHdpZHRoIC0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgdG90YWxzIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLkxBQkVMX0hFSUdIVCAvIDIgK1xuICAgICAgICByb3dIZWlnaHQgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogdGhpcy52YWx1ZUZvcm1hdHRlcihyb3cucm93VG90YWwpLFxuICAgICAgICB4OiByb3dMYWJlbFgsXG4gICAgICAgIHk6IHJvd0xhYmVsWSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZWFkb25seSBkcmF3RGF0YSQ6IE9ic2VydmFibGU8U3RhY2tlZFJvd0RyYXdEYXRhIHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmNoYXJ0QW5kUm93SGVpZ2h0cyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREcmF3bkRhdGEoXG4gICAgICAgIGlucHV0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LmNoYXJ0SGVpZ2h0LFxuICAgICAgICBoZWlnaHQucm93SGVpZ2h0LFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIExldHMgdXMga25vdyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHplcm8gZGF0YSBzdGF0ZVxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gV2hhdCByZWN0YW5nbGUgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRSZWN0YW5nbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcmVjdGFuZ2xlOiBSb3dSZWN0YW5nbGU7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IGJhbmQgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJvd05hbWU6IHN0cmluZztcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWV0cmljIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBob3ZlcmVkIHJlY3RhbmdsZVxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCB8fCAhZHJhd0RhdGEpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBjb2xvclRva2VuOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gZHJhd0RhdGEucmVjdHNcbiAgICAgICAgLmZpbHRlcihyZWN0ID0+IHJlY3Qucm93TmFtZSA9PT0gaG92ZXJlZEJhbmQucm93TmFtZSlcbiAgICAgICAgLm1hcChyZWN0ID0+ICh7XG4gICAgICAgICAgcmVjdCxcbiAgICAgICAgICBsYWJlbDogcmVjdC5zdGFja2VkUm93RWxlbWVudC5sYWJlbCxcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihyZWN0LnN0YWNrZWRSb3dFbGVtZW50LnZhbHVlKSxcbiAgICAgICAgICBjb2xvclRva2VuOiByZWN0LnN0YWNrZWRSb3dFbGVtZW50LmNvbG9yVG9rZW4sXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gQSBzcGVjaWZpY2FsbHkgY29sb3JlZCBzZWN0aW9uIG9mIG9uZSByb3cuXG4gIGV4cG9ydCB0eXBlIFJvd0VsZW1lbnQgPSB7XG4gICAgbGFiZWw6IHN0cmluZzsgLy8gTGVnZW5kIGVsZW1lbnQgbmFtZVxuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlPzogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZTtcbiAgfTtcbiAgLy8gVGhlIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dTdGFjayA9IHtcbiAgICByb3dOYW1lOiBzdHJpbmc7XG4gICAgZGF0YTogUm93RWxlbWVudFtdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrQ2xpY2tlZCA9IHtcbiAgICBzdGFja0luZGV4OiBudW1iZXI7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQ2FsbG91dENvbnRleHQgPSB7XG4gICAgYW5jaG9yOiBET01SZWN0O1xuICAgIG1ldHJpY3M6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH1bXTtcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImRyYXcudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICBbYXR0ci54MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgW2F0dHIueTJdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcm93TmFtZVRvRHJhdyBvZiBkcmF3LnJvd05hbWVzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgW3RleHRdPVwicm93TmFtZVRvRHJhdy5sYWJlbFwiXG4gICAgICAgIFt3aWR0aF09XCJTRUNUSU9OX1dJRFRIUy5ST1dfTkFNRVwiXG4gICAgICAgIGNsYXNzPVwicm93LXRpdGxlXCJcbiAgICAgICAgW2F0dHIueF09XCJyb3dOYW1lVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd05hbWVUb0RyYXcueVwiXG4gICAgICA+PC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkcmF3LnhUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgd2lkdGg9XCIxXCJcbiAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIFthdHRyLnldPVwibG9jYXRpb25PZlhBeGlzVGljaygpXCJcbiAgICAgICAgZHg9XCI0XCJcbiAgICAgICAgZHk9XCItNFwiXG4gICAgICA+XG4gICAgICAgIHt7IHZhbHVlRm9ybWF0dGVyKHRpY2spIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnXG4gICAgICAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkcmF3LnJlY3RzXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWRCYW5kJC5uZXh0KHsgcm93TmFtZTogcmVjdC5yb3dOYW1lLCBldmVudDogJGV2ZW50IH0pXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICAgIChjbGljayk9XCJcbiAgICAgICAgc3RhY2tDbGlja2VkLmVtaXQoeyBzdGFja0luZGV4OiByZWN0LnN0YWNrSW5kZXggfSk7XG4gICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1vdmVybGF5XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0Py5hbmNob3IgPz8gbnVsbFwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLWNlbnRlcidcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2FsbG91dEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjYWxsb3V0IH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQ/Lm1ldHJpY3NcIiBjbGFzcz1cImNhbGxvdXQtcm93XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbSBbY29sb3JUb2tlbl09XCJtZXRyaWMuY29sb3JUb2tlblwiPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgIDxzcGFuPnt7IG1ldHJpYy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBtZXRyaWMudmFsdWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cInplcm9TdGF0ZU1lc3NhZ2VcIj48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==