@tetacom/svg-charts 1.4.21 → 1.4.22

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 (137) hide show
  1. package/chart/base/series-base.component.d.ts +1 -1
  2. package/chart/chart/chart.component.d.ts +1 -1
  3. package/chart/chart-container/annotation/annotation.component.d.ts +1 -1
  4. package/chart/chart-container/chart-container.component.d.ts +1 -1
  5. package/chart/chart-container/crosshair/crosshair.component.d.ts +1 -1
  6. package/chart/chart-container/gridlines/gridlines.component.d.ts +1 -1
  7. package/chart/chart-container/plotband/plot-band.component.d.ts +1 -1
  8. package/chart/chart-container/plotline/plotline.component.d.ts +1 -1
  9. package/chart/chart-container/series/area-series/area-series.component.d.ts +1 -1
  10. package/chart/chart-container/series/bar/bar-series.component.d.ts +1 -1
  11. package/chart/chart-container/series/block-area-series/block-area-series.component.d.ts +1 -1
  12. package/chart/chart-container/series/block-series/block-series.component.d.ts +1 -1
  13. package/chart/chart-container/series/line/line-series.component.d.ts +1 -1
  14. package/chart/chart-container/series/linear-series-base.d.ts +1 -1
  15. package/chart/chart-container/series/scatter-series/scatter-series.component.d.ts +1 -1
  16. package/chart/chart-container/series-host/series-host.component.d.ts +1 -1
  17. package/chart/chart-container/tooltip/tooltip.component.d.ts +1 -1
  18. package/chart/chart-container/x-axis/x-axis.component.d.ts +1 -1
  19. package/chart/chart-container/y-axis/y-axis.component.d.ts +1 -1
  20. package/chart/directives/brushable.directive.d.ts +1 -1
  21. package/chart/directives/draggable-point.directive.d.ts +1 -1
  22. package/chart/directives/zoomable.directive.d.ts +1 -1
  23. package/chart/legend/legend.component.d.ts +1 -1
  24. package/chart/model/i-broadcast-message.d.ts +2 -2
  25. package/chart/stories/bandseries/bandseries.component.d.ts +1 -1
  26. package/esm2022/chart/base/series-base.component.mjs +50 -0
  27. package/esm2022/chart/chart/chart.component.mjs +175 -0
  28. package/esm2022/chart/chart-container/annotation/annotation.component.mjs +108 -0
  29. package/esm2022/chart/chart-container/chart-container.component.mjs +194 -0
  30. package/esm2022/chart/chart-container/crosshair/crosshair.component.mjs +39 -0
  31. package/esm2022/chart/chart-container/gridlines/gridlines.component.mjs +45 -0
  32. package/esm2022/chart/chart-container/plotband/plot-band.component.mjs +174 -0
  33. package/esm2022/chart/chart-container/plotline/plotline.component.mjs +98 -0
  34. package/esm2022/chart/chart-container/series/area-series/area-series.component.mjs +74 -0
  35. package/esm2022/chart/chart-container/series/bar/bar-series.component.mjs +68 -0
  36. package/esm2022/chart/chart-container/series/block-area-series/block-area-series.component.mjs +69 -0
  37. package/esm2022/chart/chart-container/series/block-series/block-series.component.mjs +69 -0
  38. package/{esm2020 → esm2022}/chart/chart-container/series/line/line-series.component.mjs +37 -30
  39. package/esm2022/chart/chart-container/series/linear-series-base.mjs +210 -0
  40. package/esm2022/chart/chart-container/series/scatter-series/scatter-series.component.mjs +53 -0
  41. package/esm2022/chart/chart-container/series-host/series-host.component.mjs +50 -0
  42. package/{esm2020 → esm2022}/chart/chart-container/tooltip/tooltip.component.mjs +18 -5
  43. package/esm2022/chart/chart-container/x-axis/x-axis.component.mjs +54 -0
  44. package/esm2022/chart/chart-container/y-axis/y-axis.component.mjs +40 -0
  45. package/{esm2020 → esm2022}/chart/chart.module.mjs +36 -36
  46. package/esm2022/chart/core/axis/axis.mjs +135 -0
  47. package/esm2022/chart/core/axis/builders/axis-size-builder.mjs +31 -0
  48. package/esm2022/chart/core/axis/builders/extremes-builder.mjs +33 -0
  49. package/esm2022/chart/directives/brushable.directive.mjs +162 -0
  50. package/esm2022/chart/directives/draggable-point.directive.mjs +147 -0
  51. package/esm2022/chart/directives/zoomable.directive.mjs +263 -0
  52. package/esm2022/chart/legend/legend.component.mjs +38 -0
  53. package/{esm2020 → esm2022}/chart/model/chart-bounds.mjs +5 -5
  54. package/esm2022/chart/model/i-broadcast-message.mjs +27 -0
  55. package/esm2022/chart/model/plot-band.mjs +28 -0
  56. package/esm2022/chart/model/plot-line.mjs +21 -0
  57. package/esm2022/chart/service/broadcast.service.mjs +24 -0
  58. package/esm2022/chart/service/brush.service.mjs +22 -0
  59. package/esm2022/chart/service/chart.service.mjs +244 -0
  60. package/esm2022/chart/service/scale.service.mjs +206 -0
  61. package/esm2022/chart/service/zoom.service.mjs +85 -0
  62. package/esm2022/chart/stories/bandseries/bandseries.component.mjs +36 -0
  63. package/{fesm2020 → fesm2022}/tetacom-svg-charts.mjs +583 -337
  64. package/{fesm2020 → fesm2022}/tetacom-svg-charts.mjs.map +1 -1
  65. package/package.json +8 -14
  66. package/esm2020/chart/base/series-base.component.mjs +0 -42
  67. package/esm2020/chart/chart/chart.component.mjs +0 -172
  68. package/esm2020/chart/chart-container/annotation/annotation.component.mjs +0 -99
  69. package/esm2020/chart/chart-container/chart-container.component.mjs +0 -182
  70. package/esm2020/chart/chart-container/crosshair/crosshair.component.mjs +0 -34
  71. package/esm2020/chart/chart-container/gridlines/gridlines.component.mjs +0 -37
  72. package/esm2020/chart/chart-container/plotband/plot-band.component.mjs +0 -163
  73. package/esm2020/chart/chart-container/plotline/plotline.component.mjs +0 -87
  74. package/esm2020/chart/chart-container/series/area-series/area-series.component.mjs +0 -67
  75. package/esm2020/chart/chart-container/series/bar/bar-series.component.mjs +0 -59
  76. package/esm2020/chart/chart-container/series/block-area-series/block-area-series.component.mjs +0 -60
  77. package/esm2020/chart/chart-container/series/block-series/block-series.component.mjs +0 -60
  78. package/esm2020/chart/chart-container/series/linear-series-base.mjs +0 -198
  79. package/esm2020/chart/chart-container/series/scatter-series/scatter-series.component.mjs +0 -43
  80. package/esm2020/chart/chart-container/series-host/series-host.component.mjs +0 -46
  81. package/esm2020/chart/chart-container/x-axis/x-axis.component.mjs +0 -48
  82. package/esm2020/chart/chart-container/y-axis/y-axis.component.mjs +0 -36
  83. package/esm2020/chart/core/axis/axis.mjs +0 -128
  84. package/esm2020/chart/core/axis/builders/axis-size-builder.mjs +0 -33
  85. package/esm2020/chart/core/axis/builders/extremes-builder.mjs +0 -35
  86. package/esm2020/chart/directives/brushable.directive.mjs +0 -153
  87. package/esm2020/chart/directives/draggable-point.directive.mjs +0 -141
  88. package/esm2020/chart/directives/zoomable.directive.mjs +0 -254
  89. package/esm2020/chart/legend/legend.component.mjs +0 -36
  90. package/esm2020/chart/model/i-broadcast-message.mjs +0 -18
  91. package/esm2020/chart/model/plot-band.mjs +0 -17
  92. package/esm2020/chart/model/plot-line.mjs +0 -13
  93. package/esm2020/chart/service/broadcast.service.mjs +0 -23
  94. package/esm2020/chart/service/brush.service.mjs +0 -21
  95. package/esm2020/chart/service/chart.service.mjs +0 -229
  96. package/esm2020/chart/service/scale.service.mjs +0 -203
  97. package/esm2020/chart/service/zoom.service.mjs +0 -80
  98. package/esm2020/chart/stories/bandseries/bandseries.component.mjs +0 -29
  99. package/fesm2015/tetacom-svg-charts.mjs +0 -3095
  100. package/fesm2015/tetacom-svg-charts.mjs.map +0 -1
  101. /package/{esm2020 → esm2022}/chart/chart-container/series/public-api.mjs +0 -0
  102. /package/{esm2020 → esm2022}/chart/core/axis/builders/public-api.mjs +0 -0
  103. /package/{esm2020 → esm2022}/chart/core/utils/generate-ticks.mjs +0 -0
  104. /package/{esm2020 → esm2022}/chart/core/utils/get-text-width.mjs +0 -0
  105. /package/{esm2020 → esm2022}/chart/core/utils/public-api.mjs +0 -0
  106. /package/{esm2020 → esm2022}/chart/default/default-axis-config.mjs +0 -0
  107. /package/{esm2020 → esm2022}/chart/default/default-chart-config.mjs +0 -0
  108. /package/{esm2020 → esm2022}/chart/default/default-series-config.mjs +0 -0
  109. /package/{esm2020 → esm2022}/chart/default/defaultSeriesTypeMapping.mjs +0 -0
  110. /package/{esm2020 → esm2022}/chart/model/annotation.mjs +0 -0
  111. /package/{esm2020 → esm2022}/chart/model/axis-options.mjs +0 -0
  112. /package/{esm2020 → esm2022}/chart/model/base-point.mjs +0 -0
  113. /package/{esm2020 → esm2022}/chart/model/enum/axis-orientation.mjs +0 -0
  114. /package/{esm2020 → esm2022}/chart/model/enum/brush-type.mjs +0 -0
  115. /package/{esm2020 → esm2022}/chart/model/enum/clip-points-direction.mjs +0 -0
  116. /package/{esm2020 → esm2022}/chart/model/enum/drag-point-type.mjs +0 -0
  117. /package/{esm2020 → esm2022}/chart/model/enum/fill-type.mjs +0 -0
  118. /package/{esm2020 → esm2022}/chart/model/enum/public-api.mjs +0 -0
  119. /package/{esm2020 → esm2022}/chart/model/enum/scale-type.mjs +0 -0
  120. /package/{esm2020 → esm2022}/chart/model/enum/series-type.mjs +0 -0
  121. /package/{esm2020 → esm2022}/chart/model/enum/tooltip-tracking.mjs +0 -0
  122. /package/{esm2020 → esm2022}/chart/model/enum/zoom-behavior-type.mjs +0 -0
  123. /package/{esm2020 → esm2022}/chart/model/enum/zoom-type.mjs +0 -0
  124. /package/{esm2020 → esm2022}/chart/model/i-builder.mjs +0 -0
  125. /package/{esm2020 → esm2022}/chart/model/i-chart-config.mjs +0 -0
  126. /package/{esm2020 → esm2022}/chart/model/i-chart-event.mjs +0 -0
  127. /package/{esm2020 → esm2022}/chart/model/i-display-tooltip.mjs +0 -0
  128. /package/{esm2020 → esm2022}/chart/model/i-point-move.mjs +0 -0
  129. /package/{esm2020 → esm2022}/chart/model/i-scales-map.mjs +0 -0
  130. /package/{esm2020 → esm2022}/chart/model/marker-options.mjs +0 -0
  131. /package/{esm2020 → esm2022}/chart/model/public-api.mjs +0 -0
  132. /package/{esm2020 → esm2022}/chart/model/series.mjs +0 -0
  133. /package/{esm2020 → esm2022}/chart/model/svg-attributes.mjs +0 -0
  134. /package/{esm2020 → esm2022}/chart/model/tooltip-options.mjs +0 -0
  135. /package/{esm2020 → esm2022}/chart/service/public-api.mjs +0 -0
  136. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  137. /package/{esm2020 → esm2022}/tetacom-svg-charts.mjs +0 -0
@@ -0,0 +1,24 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { filter, ReplaySubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class BroadcastService {
5
+ zoomEmitter;
6
+ constructor() {
7
+ this.zoomEmitter = new ReplaySubject(1);
8
+ }
9
+ broadcastZoom(value) {
10
+ this.zoomEmitter.next(value);
11
+ }
12
+ subscribeToZoom(channel) {
13
+ return this.zoomEmitter.asObservable().pipe(filter((msg) => channel && msg.channel === channel));
14
+ }
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BroadcastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
16
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BroadcastService, providedIn: 'root' });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BroadcastService, decorators: [{
19
+ type: Injectable,
20
+ args: [{
21
+ providedIn: 'root',
22
+ }]
23
+ }], ctorParameters: function () { return []; } });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2hhcnQvc2VydmljZS9icm9hZGNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxNQUFNLEVBQWMsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUt2RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLFdBQVcsQ0FBZ0Q7SUFFbkU7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksYUFBYSxDQUFpQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQXFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZTtRQUM3QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUN6QyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUNwRCxDQUFDO0lBQ0osQ0FBQzt1R0FmVSxnQkFBZ0I7MkdBQWhCLGdCQUFnQixjQUZmLE1BQU07OzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJQnJvYWRjYXN0TWVzc2FnZSwgWm9vbU1lc3NhZ2V9IGZyb20gJy4uL21vZGVsL2ktYnJvYWRjYXN0LW1lc3NhZ2UnO1xuaW1wb3J0IHtmaWx0ZXIsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQnJvYWRjYXN0U2VydmljZSB7XG4gIHByaXZhdGUgem9vbUVtaXR0ZXI6IFJlcGxheVN1YmplY3Q8SUJyb2FkY2FzdE1lc3NhZ2U8Wm9vbU1lc3NhZ2U+PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnpvb21FbWl0dGVyID0gbmV3IFJlcGxheVN1YmplY3Q8SUJyb2FkY2FzdE1lc3NhZ2U8Wm9vbU1lc3NhZ2U+PigxKTtcbiAgfVxuXG4gIGJyb2FkY2FzdFpvb20odmFsdWU6IElCcm9hZGNhc3RNZXNzYWdlPFpvb21NZXNzYWdlPikge1xuICAgIHRoaXMuem9vbUVtaXR0ZXIubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzdWJzY3JpYmVUb1pvb20oY2hhbm5lbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxJQnJvYWRjYXN0TWVzc2FnZTxab29tTWVzc2FnZT4+IHtcbiAgICByZXR1cm4gdGhpcy56b29tRW1pdHRlci5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgZmlsdGVyKChtc2cpID0+IGNoYW5uZWwgJiYgbXNnLmNoYW5uZWwgPT09IGNoYW5uZWwpXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,22 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ReplaySubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class BrushService {
5
+ brushDomain;
6
+ _brushDomain = new ReplaySubject(1);
7
+ constructor() {
8
+ this.brushDomain = this._brushDomain.asObservable();
9
+ }
10
+ setBrush(brush) {
11
+ this._brushDomain.next(brush);
12
+ }
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BrushService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BrushService, providedIn: 'root' });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: BrushService, decorators: [{
17
+ type: Injectable,
18
+ args: [{
19
+ providedIn: 'root',
20
+ }]
21
+ }], ctorParameters: function () { return []; } });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ1c2guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9zZXJ2aWNlL2JydXNoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQWEsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQU0vQyxNQUFNLE9BQU8sWUFBWTtJQUN2QixXQUFXLENBQTJCO0lBQzlCLFlBQVksR0FBRyxJQUFJLGFBQWEsQ0FBZSxDQUFDLENBQUMsQ0FBQztJQUUxRDtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQW1CO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7dUdBVlUsWUFBWTsyR0FBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7QnJ1c2hNZXNzYWdlfSBmcm9tICcuLi9tb2RlbC9pLWJyb2FkY2FzdC1tZXNzYWdlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEJydXNoU2VydmljZSB7XG4gIGJydXNoRG9tYWluOiBPYnNlcnZhYmxlPEJydXNoTWVzc2FnZT47XG4gIHByaXZhdGUgX2JydXNoRG9tYWluID0gbmV3IFJlcGxheVN1YmplY3Q8QnJ1c2hNZXNzYWdlPigxKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJydXNoRG9tYWluID0gdGhpcy5fYnJ1c2hEb21haW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBzZXRCcnVzaChicnVzaDogQnJ1c2hNZXNzYWdlKSB7XG4gICAgdGhpcy5fYnJ1c2hEb21haW4ubmV4dChicnVzaCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,244 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, filter, lastValueFrom, map, of, shareReplay, Subject, take, withLatestFrom, } from 'rxjs';
3
+ import { defaultChartConfig } from '../default/default-chart-config';
4
+ import { defaultAxisConfig } from '../default/default-axis-config';
5
+ import { defaultSeriesConfig } from '../default/default-series-config';
6
+ import { ClipPointsDirection } from "../model/enum/clip-points-direction";
7
+ import * as i0 from "@angular/core";
8
+ export class ChartService {
9
+ id;
10
+ config;
11
+ size;
12
+ pointerMove;
13
+ tooltips;
14
+ plotBandEvent;
15
+ plotLineMove;
16
+ plotBandClick;
17
+ plotBandContextMenu;
18
+ pointMove;
19
+ annotationMove;
20
+ annotationClick;
21
+ annotationContextMenu;
22
+ chartClick;
23
+ chartContextMenu;
24
+ config$ = new BehaviorSubject(defaultChartConfig());
25
+ size$ = new BehaviorSubject(null);
26
+ pointerMove$ = new Subject();
27
+ tooltips$ = new BehaviorSubject(new Map());
28
+ plotBandEvent$ = new Subject();
29
+ plotLineMove$ = new Subject();
30
+ pointMove$ = new Subject();
31
+ chartClick$ = new Subject();
32
+ chartContextMenu$ = new Subject();
33
+ annotationEvent$ = new Subject();
34
+ annotationMove$ = new Subject();
35
+ static _hiddenSeriesPostfix = 'hidden_series';
36
+ constructor() {
37
+ this.id = of((Date.now() + Math.random()).toString(36));
38
+ this.config = this.config$.asObservable().pipe(withLatestFrom(this.id), map(this.setDefaults), map(this.setPreparationData), map(this.restoreLocalStorage), shareReplay({
39
+ bufferSize: 1,
40
+ refCount: true,
41
+ }));
42
+ this.size = this.size$.asObservable().pipe(filter((size) => size != null));
43
+ this.pointerMove = this.pointerMove$.asObservable();
44
+ this.tooltips = this.tooltips$.asObservable();
45
+ this.plotBandEvent = this.plotBandEvent$.asObservable();
46
+ this.plotLineMove = this.plotLineMove$.asObservable();
47
+ this.pointMove = this.pointMove$.asObservable();
48
+ this.chartClick = this.chartClick$.asObservable();
49
+ this.chartContextMenu = this.chartContextMenu$.asObservable();
50
+ this.annotationClick = this.annotationEvent$
51
+ .asObservable()
52
+ .pipe(filter((_) => _?.event?.type === 'click'));
53
+ this.annotationContextMenu = this.annotationEvent$
54
+ .asObservable()
55
+ .pipe(filter((_) => _?.event?.type === 'contextmenu'));
56
+ this.annotationMove = this.annotationMove$.asObservable();
57
+ this.plotBandClick = this.plotBandEvent$
58
+ .asObservable()
59
+ .pipe(filter((_) => _?.event?.type === 'click'));
60
+ this.plotBandContextMenu = this.plotBandEvent$
61
+ .asObservable()
62
+ .pipe(filter((_) => _?.event?.type === 'contextmenu'));
63
+ // this.zoomInstance = this.zoomInstance$.asObservable();
64
+ // this.brushInstance = this.brushInstance$.asObservable();
65
+ }
66
+ setConfig(config) {
67
+ this.clearTooltips();
68
+ this.config$.next(config);
69
+ }
70
+ setSize(size) {
71
+ this.size$.next(size);
72
+ }
73
+ setPointerMove(event) {
74
+ this.pointerMove$.next(event);
75
+ }
76
+ setTooltip(tooltip) {
77
+ const currentTooltips = this.tooltips$.value;
78
+ if (!tooltip.point) {
79
+ currentTooltips.delete(tooltip.series);
80
+ }
81
+ else {
82
+ currentTooltips.set(tooltip.series, tooltip);
83
+ }
84
+ this.tooltips$.next(new Map(currentTooltips));
85
+ }
86
+ clearTooltips() {
87
+ this.tooltips$.next(new Map());
88
+ }
89
+ async toggleVisibilitySeries(seriesIndex, visible) {
90
+ if (seriesIndex?.length === 0) {
91
+ return;
92
+ }
93
+ const currentConfig = await lastValueFrom(this.config.pipe(take(1)));
94
+ seriesIndex.forEach((serieIndex) => {
95
+ const currentSerieIndex = currentConfig.series.findIndex((_) => _.id === serieIndex);
96
+ if (currentSerieIndex === -1) {
97
+ return;
98
+ }
99
+ currentConfig.series[currentSerieIndex].visible = visible !== undefined ? visible : !currentConfig.series[currentSerieIndex].visible;
100
+ const seriesLinkCount = currentConfig.series.filter((_) => _.yAxisIndex === currentConfig.series[currentSerieIndex].yAxisIndex && _.visible === true).length;
101
+ currentConfig.yAxis[currentConfig.series[currentSerieIndex].yAxisIndex].visible = seriesLinkCount !== 0;
102
+ });
103
+ try {
104
+ this.saveCookie(currentConfig);
105
+ }
106
+ finally {
107
+ this.config$.next(currentConfig);
108
+ }
109
+ }
110
+ emitMoveAnnotation(event) {
111
+ this.annotationMove$.next(event);
112
+ }
113
+ emitAnnotation(event) {
114
+ this.annotationEvent$.next(event);
115
+ }
116
+ emitPlotband(event) {
117
+ this.plotBandEvent$.next(event);
118
+ }
119
+ emitPlotline(event) {
120
+ this.plotLineMove$.next(event);
121
+ }
122
+ emitPoint(event) {
123
+ this.pointMove$.next(event);
124
+ }
125
+ emitChartClick(event) {
126
+ this.chartClick$.next(event);
127
+ }
128
+ emitChartContextMenu(event) {
129
+ this.chartContextMenu$.next(event);
130
+ }
131
+ // public emitZoomInstance(event: ZoomService) {
132
+ // this.zoomInstance$.next(event);
133
+ // }
134
+ //
135
+ // public emitZoomInstance(event: ZoomService) {
136
+ // this.zoomInstance$.next(event);
137
+ // }
138
+ saveCookie(config) {
139
+ if (!config.name)
140
+ return;
141
+ const hiddenSeries = config.series?.filter((_) => !_.visible).map((_) => _.id);
142
+ localStorage.setItem(`${config.name}_${ChartService._hiddenSeriesPostfix}`, JSON.stringify(hiddenSeries));
143
+ }
144
+ restoreLocalStorage(config) {
145
+ if (!config.name)
146
+ return config;
147
+ const hiddenSeries = localStorage.getItem(`${config.name}_${ChartService._hiddenSeriesPostfix}`);
148
+ if (hiddenSeries) {
149
+ const json = JSON.parse(hiddenSeries);
150
+ config.series = config.series.map((serie, index) => {
151
+ serie.visible = !json.includes(serie.id);
152
+ const currentSerieIndex = config.series.findIndex((_) => _.id === serie.id);
153
+ if (currentSerieIndex !== -1) {
154
+ const seriesLinkCount = config.series.filter((_) => _.yAxisIndex === config.series[currentSerieIndex].yAxisIndex && _.visible === true).length;
155
+ config.yAxis[config.series[currentSerieIndex].yAxisIndex].visible = seriesLinkCount !== 0;
156
+ }
157
+ return serie;
158
+ });
159
+ return config;
160
+ }
161
+ return config;
162
+ }
163
+ setDefaults(data) {
164
+ let [config, id] = data;
165
+ const defaultConfig = (defaultConfig) => {
166
+ return (source) => {
167
+ return Object.assign({}, defaultConfig, source);
168
+ };
169
+ };
170
+ config = Object.assign({}, defaultChartConfig(), config);
171
+ config.id = config.id ?? id;
172
+ config.xAxis = config.xAxis.map(defaultConfig(defaultAxisConfig));
173
+ config.yAxis = config.yAxis.map(defaultConfig(defaultAxisConfig));
174
+ config.series = config.series.map(defaultConfig(defaultSeriesConfig()));
175
+ config.series = config.series.map((_, index) => {
176
+ return {
177
+ ..._,
178
+ data: _.data ?? [],
179
+ id: _.id ?? index,
180
+ };
181
+ });
182
+ const oppositeYCount = config.yAxis?.filter((_) => _.opposite);
183
+ const oppositeXCount = config.xAxis?.filter((_) => _.opposite);
184
+ const nonOppositeYCount = config.yAxis?.filter((_) => !_.opposite);
185
+ const nonOppositeXCount = config.xAxis?.filter((_) => !_.opposite);
186
+ if (nonOppositeXCount?.length > 1) {
187
+ config.bounds.bottom = 0;
188
+ }
189
+ if (oppositeXCount?.length > 1) {
190
+ config.bounds.top = 0;
191
+ }
192
+ if (nonOppositeYCount?.length > 1) {
193
+ config.bounds.left = 0;
194
+ }
195
+ if (oppositeYCount?.length > 1) {
196
+ config.bounds.right = 0;
197
+ }
198
+ config.tooltip = Object.assign({}, defaultChartConfig().tooltip, config.tooltip);
199
+ config.zoom = Object.assign({}, defaultChartConfig().zoom, config.zoom);
200
+ config.zoom.syncChannel = config.zoom?.syncChannel ?? id;
201
+ return config;
202
+ }
203
+ setPreparationData(config) {
204
+ if (config.inverted) {
205
+ const xAxes = [...config.xAxis];
206
+ const yAxes = [...config.yAxis];
207
+ config.xAxis = yAxes;
208
+ config.yAxis = xAxes;
209
+ config.series = config.series?.map((serie) => {
210
+ const x = serie.xAxisIndex;
211
+ const y = serie.yAxisIndex;
212
+ serie.xAxisIndex = y;
213
+ serie.yAxisIndex = x;
214
+ return {
215
+ ...serie,
216
+ clipPointsDirection: ClipPointsDirection.y,
217
+ data: serie?.data?.map((point) => {
218
+ return {
219
+ ...point,
220
+ x: point?.y,
221
+ y: point?.x,
222
+ x1: point?.y1,
223
+ y1: point?.x1,
224
+ };
225
+ }),
226
+ };
227
+ });
228
+ }
229
+ if (config?.brush?.enable) {
230
+ config.yAxis = config.yAxis.map((_) => ({ ..._, zoom: false }));
231
+ config.xAxis = config.xAxis.map((_) => ({ ..._, zoom: false }));
232
+ }
233
+ return config;
234
+ }
235
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
236
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ChartService, providedIn: 'root' });
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ChartService, decorators: [{
239
+ type: Injectable,
240
+ args: [{
241
+ providedIn: 'root',
242
+ }]
243
+ }], ctorParameters: function () { return []; } });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixhQUFhLEVBQ2IsR0FBRyxFQUVILEVBQUUsRUFDRixXQUFXLEVBQ1gsT0FBTyxFQUNQLElBQUksRUFDSixjQUFjLEdBQ2YsTUFBTSxNQUFNLENBQUM7QUFNZCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUlyRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFLeEUsTUFBTSxPQUFPLFlBQVk7SUFDaEIsRUFBRSxDQUFxQjtJQUN2QixNQUFNLENBQTJCO0lBQ2pDLElBQUksQ0FBc0I7SUFDMUIsV0FBVyxDQUEyQjtJQUN0QyxRQUFRLENBQXNEO0lBQzlELGFBQWEsQ0FBb0M7SUFDakQsWUFBWSxDQUFvQztJQUNoRCxhQUFhLENBQW9DO0lBQ2pELG1CQUFtQixDQUFvQztJQUN2RCxTQUFTLENBQXNDO0lBQy9DLGNBQWMsQ0FBc0M7SUFDcEQsZUFBZSxDQUFzQztJQUNyRCxxQkFBcUIsQ0FBc0M7SUFDM0QsVUFBVSxDQUFxQztJQUMvQyxnQkFBZ0IsQ0FBcUM7SUFFcEQsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFlLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNsRSxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDM0MsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO0lB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O29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lDaGFydENvbmZpZ30gZnJvbSAnLi4vbW9kZWwvaS1jaGFydC1jb25maWcnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBmaWx0ZXIsXG4gIGxhc3RWYWx1ZUZyb20sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHNoYXJlUmVwbGF5LFxuICBTdWJqZWN0LFxuICB0YWtlLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0lDaGFydEV2ZW50fSBmcm9tICcuLi9tb2RlbC9pLWNoYXJ0LWV2ZW50JztcbmltcG9ydCB7SURpc3BsYXlUb29sdGlwfSBmcm9tICcuLi9tb2RlbC9pLWRpc3BsYXktdG9vbHRpcCc7XG5pbXBvcnQge1Bsb3RCYW5kfSBmcm9tICcuLi9tb2RlbC9wbG90LWJhbmQnO1xuaW1wb3J0IHtQbG90TGluZX0gZnJvbSAnLi4vbW9kZWwvcGxvdC1saW5lJztcbmltcG9ydCB7SVBvaW50TW92ZX0gZnJvbSAnLi4vbW9kZWwvaS1wb2ludC1tb3ZlJztcbmltcG9ydCB7ZGVmYXVsdENoYXJ0Q29uZmlnfSBmcm9tICcuLi9kZWZhdWx0L2RlZmF1bHQtY2hhcnQtY29uZmlnJztcbmltcG9ydCB7ZGVmYXVsdEF4aXNDb25maWd9IGZyb20gJy4uL2RlZmF1bHQvZGVmYXVsdC1heGlzLWNvbmZpZyc7XG5pbXBvcnQge2RlZmF1bHRTZXJpZXNDb25maWd9IGZyb20gJy4uL2RlZmF1bHQvZGVmYXVsdC1zZXJpZXMtY29uZmlnJztcbmltcG9ydCB7QmFzZVBvaW50fSBmcm9tICcuLi9tb2RlbC9iYXNlLXBvaW50JztcbmltcG9ydCB7U2VyaWVzfSBmcm9tICcuLi9tb2RlbC9zZXJpZXMnO1xuaW1wb3J0IHtBbm5vdGF0aW9ufSBmcm9tICcuLi9tb2RlbC9hbm5vdGF0aW9uJztcbmltcG9ydCB7Q2xpcFBvaW50c0RpcmVjdGlvbn0gZnJvbSBcIi4uL21vZGVsL2VudW0vY2xpcC1wb2ludHMtZGlyZWN0aW9uXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFNlcnZpY2Uge1xuICBwdWJsaWMgaWQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgcHVibGljIGNvbmZpZzogT2JzZXJ2YWJsZTxJQ2hhcnRDb25maWc+O1xuICBwdWJsaWMgc2l6ZTogT2JzZXJ2YWJsZTxET01SZWN0PjtcbiAgcHVibGljIHBvaW50ZXJNb3ZlOiBPYnNlcnZhYmxlPFBvaW50ZXJFdmVudD47XG4gIHB1YmxpYyB0b29sdGlwczogT2JzZXJ2YWJsZTxNYXA8U2VyaWVzPEJhc2VQb2ludD4sIElEaXNwbGF5VG9vbHRpcD4+O1xuICBwdWJsaWMgcGxvdEJhbmRFdmVudDogT2JzZXJ2YWJsZTxJQ2hhcnRFdmVudDxQbG90QmFuZD4+O1xuICBwdWJsaWMgcGxvdExpbmVNb3ZlOiBPYnNlcnZhYmxlPElDaGFydEV2ZW50PFBsb3RMaW5lPj47XG4gIHB1YmxpYyBwbG90QmFuZENsaWNrOiBPYnNlcnZhYmxlPElDaGFydEV2ZW50PFBsb3RCYW5kPj47XG4gIHB1YmxpYyBwbG90QmFuZENvbnRleHRNZW51OiBPYnNlcnZhYmxlPElDaGFydEV2ZW50PFBsb3RCYW5kPj47XG4gIHB1YmxpYyBwb2ludE1vdmU6IE9ic2VydmFibGU8SUNoYXJ0RXZlbnQ8SVBvaW50TW92ZT4+O1xuICBwdWJsaWMgYW5ub3RhdGlvbk1vdmU6IE9ic2VydmFibGU8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+O1xuICBwdWJsaWMgYW5ub3RhdGlvbkNsaWNrOiBPYnNlcnZhYmxlPElDaGFydEV2ZW50PEFubm90YXRpb24+PjtcbiAgcHVibGljIGFubm90YXRpb25Db250ZXh0TWVudTogT2JzZXJ2YWJsZTxJQ2hhcnRFdmVudDxBbm5vdGF0aW9uPj47XG4gIHB1YmxpYyBjaGFydENsaWNrOiBPYnNlcnZhYmxlPElDaGFydEV2ZW50PEJhc2VQb2ludD4+O1xuICBwdWJsaWMgY2hhcnRDb250ZXh0TWVudTogT2JzZXJ2YWJsZTxJQ2hhcnRFdmVudDxCYXNlUG9pbnQ+PjtcblxuICBwcml2YXRlIGNvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGFydENvbmZpZz4oZGVmYXVsdENoYXJ0Q29uZmlnKCkpO1xuICBwcml2YXRlIHNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxET01SZWN0PihudWxsKTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZSQgPSBuZXcgU3ViamVjdDxQb2ludGVyRXZlbnQ+KCk7XG4gIHByaXZhdGUgdG9vbHRpcHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXA8U2VyaWVzPEJhc2VQb2ludD4sIElEaXNwbGF5VG9vbHRpcD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgcGxvdEJhbmRFdmVudCQgPSBuZXcgU3ViamVjdDxJQ2hhcnRFdmVudDxQbG90QmFuZD4+KCk7XG4gIHByaXZhdGUgcGxvdExpbmVNb3ZlJCA9IG5ldyBTdWJqZWN0PElDaGFydEV2ZW50PFBsb3RMaW5lPj4oKTtcbiAgcHJpdmF0ZSBwb2ludE1vdmUkID0gbmV3IFN1YmplY3Q8SUNoYXJ0RXZlbnQ8SVBvaW50TW92ZT4+KCk7XG4gIHByaXZhdGUgY2hhcnRDbGljayQgPSBuZXcgU3ViamVjdDxJQ2hhcnRFdmVudDxCYXNlUG9pbnQ+PigpO1xuICBwcml2YXRlIGNoYXJ0Q29udGV4dE1lbnUkID0gbmV3IFN1YmplY3Q8SUNoYXJ0RXZlbnQ8QmFzZVBvaW50Pj4oKTtcbiAgcHJpdmF0ZSBhbm5vdGF0aW9uRXZlbnQkID0gbmV3IFN1YmplY3Q8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG4gIHByaXZhdGUgYW5ub3RhdGlvbk1vdmUkID0gbmV3IFN1YmplY3Q8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG5cblxuICBwcml2YXRlIHN0YXRpYyBfaGlkZGVuU2VyaWVzUG9zdGZpeCA9ICdoaWRkZW5fc2VyaWVzJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkID0gb2YoKERhdGUubm93KCkgKyBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmNvbmZpZyQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuaWQpLFxuICAgICAgbWFwKHRoaXMuc2V0RGVmYXVsdHMpLFxuICAgICAgbWFwKHRoaXMuc2V0UHJlcGFyYXRpb25EYXRhKSxcbiAgICAgIG1hcCh0aGlzLnJlc3RvcmVMb2NhbFN0b3JhZ2UpLFxuICAgICAgc2hhcmVSZXBsYXkoe1xuICAgICAgICBidWZmZXJTaXplOiAxLFxuICAgICAgICByZWZDb3VudDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKTtcblxuXG4gICAgdGhpcy5zaXplID0gdGhpcy5zaXplJC5hc09ic2VydmFibGUoKS5waXBlKGZpbHRlcigoc2l6ZSkgPT4gc2l6ZSAhPSBudWxsKSk7XG4gICAgdGhpcy5wb2ludGVyTW92ZSA9IHRoaXMucG9pbnRlck1vdmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMudG9vbHRpcHMgPSB0aGlzLnRvb2x0aXBzJC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnBsb3RCYW5kRXZlbnQgPSB0aGlzLnBsb3RCYW5kRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucGxvdExpbmVNb3ZlID0gdGhpcy5wbG90TGluZU1vdmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucG9pbnRNb3ZlID0gdGhpcy5wb2ludE1vdmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuY2hhcnRDbGljayA9IHRoaXMuY2hhcnRDbGljayQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5jaGFydENvbnRleHRNZW51ID0gdGhpcy5jaGFydENvbnRleHRNZW51JC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFubm90YXRpb25DbGljayA9IHRoaXMuYW5ub3RhdGlvbkV2ZW50JFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShmaWx0ZXIoKF8pID0+IF8/LmV2ZW50Py50eXBlID09PSAnY2xpY2snKSk7XG4gICAgdGhpcy5hbm5vdGF0aW9uQ29udGV4dE1lbnUgPSB0aGlzLmFubm90YXRpb25FdmVudCRcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoZmlsdGVyKChfKSA9PiBfPy5ldmVudD8udHlwZSA9PT0gJ2NvbnRleHRtZW51JykpO1xuICAgIHRoaXMuYW5ub3RhdGlvbk1vdmUgPSB0aGlzLmFubm90YXRpb25Nb3ZlJC5hc09ic2VydmFibGUoKTtcblxuICAgIHRoaXMucGxvdEJhbmRDbGljayA9IHRoaXMucGxvdEJhbmRFdmVudCRcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoZmlsdGVyKChfKSA9PiBfPy5ldmVudD8udHlwZSA9PT0gJ2NsaWNrJykpO1xuICAgIHRoaXMucGxvdEJhbmRDb250ZXh0TWVudSA9IHRoaXMucGxvdEJhbmRFdmVudCRcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoZmlsdGVyKChfKSA9PiBfPy5ldmVudD8udHlwZSA9PT0gJ2NvbnRleHRtZW51JykpO1xuICAgIC8vIHRoaXMuem9vbUluc3RhbmNlID0gdGhpcy56b29tSW5zdGFuY2UkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIC8vIHRoaXMuYnJ1c2hJbnN0YW5jZSA9IHRoaXMuYnJ1c2hJbnN0YW5jZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogSUNoYXJ0Q29uZmlnKSB7XG4gICAgdGhpcy5jbGVhclRvb2x0aXBzKCk7XG4gICAgdGhpcy5jb25maWckLm5leHQoY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTaXplKHNpemU6IERPTVJlY3QpIHtcbiAgICB0aGlzLnNpemUkLm5leHQoc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIHRoaXMucG9pbnRlck1vdmUkLm5leHQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIHNldFRvb2x0aXAodG9vbHRpcDogSURpc3BsYXlUb29sdGlwKSB7XG4gICAgY29uc3QgY3VycmVudFRvb2x0aXBzID0gdGhpcy50b29sdGlwcyQudmFsdWU7XG4gICAgaWYgKCF0b29sdGlwLnBvaW50KSB7XG4gICAgICBjdXJyZW50VG9vbHRpcHMuZGVsZXRlKHRvb2x0aXAuc2VyaWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudFRvb2x0aXBzLnNldCh0b29sdGlwLnNlcmllcywgdG9vbHRpcCk7XG4gICAgfVxuICAgIHRoaXMudG9vbHRpcHMkLm5leHQoXG4gICAgICBuZXcgTWFwPFNlcmllczxCYXNlUG9pbnQ+LCBJRGlzcGxheVRvb2x0aXA+KGN1cnJlbnRUb29sdGlwcylcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVG9vbHRpcHMoKSB7XG4gICAgdGhpcy50b29sdGlwcyQubmV4dChuZXcgTWFwKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRvZ2dsZVZpc2liaWxpdHlTZXJpZXMoc2VyaWVzSW5kZXg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sIHZpc2libGU/OiBib29sZWFuKSB7XG5cbiAgICBpZiAoc2VyaWVzSW5kZXg/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMuY29uZmlnLnBpcGUodGFrZSgxKSkpO1xuXG4gICAgc2VyaWVzSW5kZXguZm9yRWFjaCgoc2VyaWVJbmRleCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFNlcmllSW5kZXggPSBjdXJyZW50Q29uZmlnLnNlcmllcy5maW5kSW5kZXgoKF8pID0+IF8uaWQgPT09IHNlcmllSW5kZXgpO1xuXG4gICAgICBpZiAoY3VycmVudFNlcmllSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDb25maWcuc2VyaWVzW2N1cnJlbnRTZXJpZUluZGV4XS52aXNpYmxlID0gdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICFjdXJyZW50Q29uZmlnLnNlcmllc1tjdXJyZW50U2VyaWVJbmRleF0udmlzaWJsZTtcblxuICAgICAgY29uc3Qgc2VyaWVzTGlua0NvdW50ID0gY3VycmVudENvbmZpZy5zZXJpZXMuZmlsdGVyKChfKSA9PiBfLnlBeGlzSW5kZXggPT09IGN1cnJlbnRDb25maWcuc2VyaWVzW2N1cnJlbnRTZXJpZUluZGV4XS55QXhpc0luZGV4ICYmIF8udmlzaWJsZSA9PT0gdHJ1ZSkubGVuZ3RoXG4gICAgICBjdXJyZW50Q29uZmlnLnlBeGlzW2N1cnJlbnRDb25maWcuc2VyaWVzW2N1cnJlbnRTZXJpZUluZGV4XS55QXhpc0luZGV4XS52aXNpYmxlID0gc2VyaWVzTGlua0NvdW50ICE9PSAwO1xuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zYXZlQ29va2llKGN1cnJlbnRDb25maWcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbmZpZyQubmV4dChjdXJyZW50Q29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdE1vdmVBbm5vdGF0aW9uKGV2ZW50OiBJQ2hhcnRFdmVudDxBbm5vdGF0aW9uPikge1xuICAgIHRoaXMuYW5ub3RhdGlvbk1vdmUkLm5leHQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGVtaXRBbm5vdGF0aW9uKGV2ZW50OiBJQ2hhcnRFdmVudDxBbm5vdGF0aW9uPikge1xuICAgIHRoaXMuYW5ub3RhdGlvbkV2ZW50JC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0UGxvdGJhbmQoZXZlbnQ6IElDaGFydEV2ZW50PFBsb3RCYW5kPikge1xuICAgIHRoaXMucGxvdEJhbmRFdmVudCQubmV4dChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdFBsb3RsaW5lKGV2ZW50OiBJQ2hhcnRFdmVudDxQbG90TGluZT4pIHtcbiAgICB0aGlzLnBsb3RMaW5lTW92ZSQubmV4dChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdFBvaW50KGV2ZW50OiBJQ2hhcnRFdmVudDxJUG9pbnRNb3ZlPikge1xuICAgIHRoaXMucG9pbnRNb3ZlJC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0Q2hhcnRDbGljayhldmVudDogSUNoYXJ0RXZlbnQ8QmFzZVBvaW50Pikge1xuICAgIHRoaXMuY2hhcnRDbGljayQubmV4dChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdENoYXJ0Q29udGV4dE1lbnUoZXZlbnQ6IElDaGFydEV2ZW50PEJhc2VQb2ludD4pIHtcbiAgICB0aGlzLmNoYXJ0Q29udGV4dE1lbnUkLm5leHQoZXZlbnQpO1xuICB9XG5cbiAgLy8gcHVibGljIGVtaXRab29tSW5zdGFuY2UoZXZlbnQ6IFpvb21TZXJ2aWNlKSB7XG4gIC8vICAgdGhpcy56b29tSW5zdGFuY2UkLm5leHQoZXZlbnQpO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBlbWl0Wm9vbUluc3RhbmNlKGV2ZW50OiBab29tU2VydmljZSkge1xuICAvLyAgIHRoaXMuem9vbUluc3RhbmNlJC5uZXh0KGV2ZW50KTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgc2F2ZUNvb2tpZShjb25maWc6IElDaGFydENvbmZpZykge1xuICAgIGlmKCFjb25maWcubmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGhpZGRlblNlcmllcyA9IGNvbmZpZy5zZXJpZXM/LmZpbHRlcigoXykgPT4gIV8udmlzaWJsZSkubWFwKChfKSA9PiBfLmlkKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtjb25maWcubmFtZX1fJHtDaGFydFNlcnZpY2UuX2hpZGRlblNlcmllc1Bvc3RmaXh9YCwgSlNPTi5zdHJpbmdpZnkoaGlkZGVuU2VyaWVzKSlcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUxvY2FsU3RvcmFnZShjb25maWc6IElDaGFydENvbmZpZyk6IElDaGFydENvbmZpZyB7XG4gICAgaWYoIWNvbmZpZy5uYW1lKSByZXR1cm4gY29uZmlnO1xuXG4gICAgY29uc3QgaGlkZGVuU2VyaWVzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7Y29uZmlnLm5hbWV9XyR7Q2hhcnRTZXJ2aWNlLl9oaWRkZW5TZXJpZXNQb3N0Zml4fWApO1xuICAgIGlmIChoaWRkZW5TZXJpZXMpIHtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGhpZGRlblNlcmllcykgYXMgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICAgIGNvbmZpZy5zZXJpZXMgPSBjb25maWcuc2VyaWVzLm1hcCgoc2VyaWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHNlcmllLnZpc2libGUgPSAhanNvbi5pbmNsdWRlcyhzZXJpZS5pZCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFNlcmllSW5kZXggPSBjb25maWcuc2VyaWVzLmZpbmRJbmRleCgoXykgPT4gXy5pZCA9PT0gc2VyaWUuaWQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50U2VyaWVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXNMaW5rQ291bnQgPSBjb25maWcuc2VyaWVzLmZpbHRlcigoXykgPT4gXy55QXhpc0luZGV4ID09PSBjb25maWcuc2VyaWVzW2N1cnJlbnRTZXJpZUluZGV4XS55QXhpc0luZGV4ICYmIF8udmlzaWJsZSA9PT0gdHJ1ZSkubGVuZ3RoXG4gICAgICAgICAgY29uZmlnLnlBeGlzW2NvbmZpZy5zZXJpZXNbY3VycmVudFNlcmllSW5kZXhdLnlBeGlzSW5kZXhdLnZpc2libGUgPSBzZXJpZXNMaW5rQ291bnQgIT09IDA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBzZXJpZTtcbiAgICAgIH0pO1xuXG5cbiAgICAgIHJldHVybiBjb25maWdcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHRzKGRhdGE6IFtJQ2hhcnRDb25maWcsIHN0cmluZ10pOiBJQ2hhcnRDb25maWcge1xuXG4gICAgbGV0IFtjb25maWcsIGlkXSA9IGRhdGE7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gKGRlZmF1bHRDb25maWcpID0+IHtcbiAgICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBzb3VyY2UpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENoYXJ0Q29uZmlnKCksIGNvbmZpZyk7XG4gICAgY29uZmlnLmlkID0gY29uZmlnLmlkID8/IGlkO1xuXG4gICAgY29uZmlnLnhBeGlzID0gY29uZmlnLnhBeGlzLm1hcChkZWZhdWx0Q29uZmlnKGRlZmF1bHRBeGlzQ29uZmlnKSk7XG4gICAgY29uZmlnLnlBeGlzID0gY29uZmlnLnlBeGlzLm1hcChkZWZhdWx0Q29uZmlnKGRlZmF1bHRBeGlzQ29uZmlnKSk7XG4gICAgY29uZmlnLnNlcmllcyA9IGNvbmZpZy5zZXJpZXMubWFwKGRlZmF1bHRDb25maWcoZGVmYXVsdFNlcmllc0NvbmZpZygpKSk7XG5cbiAgICBjb25maWcuc2VyaWVzID0gY29uZmlnLnNlcmllcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5fLFxuICAgICAgICBkYXRhOiBfLmRhdGEgPz8gW10sXG4gICAgICAgIGlkOiBfLmlkID8/IGluZGV4LFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wcG9zaXRlWUNvdW50ID0gY29uZmlnLnlBeGlzPy5maWx0ZXIoKF8pID0+IF8ub3Bwb3NpdGUpO1xuICAgIGNvbnN0IG9wcG9zaXRlWENvdW50ID0gY29uZmlnLnhBeGlzPy5maWx0ZXIoKF8pID0+IF8ub3Bwb3NpdGUpO1xuXG4gICAgY29uc3Qgbm9uT3Bwb3NpdGVZQ291bnQgPSBjb25maWcueUF4aXM/LmZpbHRlcigoXykgPT4gIV8ub3Bwb3NpdGUpO1xuICAgIGNvbnN0IG5vbk9wcG9zaXRlWENvdW50ID0gY29uZmlnLnhBeGlzPy5maWx0ZXIoKF8pID0+ICFfLm9wcG9zaXRlKTtcblxuICAgIGlmIChub25PcHBvc2l0ZVhDb3VudD8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uZmlnLmJvdW5kcy5ib3R0b20gPSAwO1xuICAgIH1cblxuICAgIGlmIChvcHBvc2l0ZVhDb3VudD8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uZmlnLmJvdW5kcy50b3AgPSAwO1xuICAgIH1cblxuICAgIGlmIChub25PcHBvc2l0ZVlDb3VudD8ubGVuZ3RoID4gMSkge1xuICAgICAgY29uZmlnLmJvdW5kcy5sZWZ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3Bwb3NpdGVZQ291bnQ/Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbmZpZy5ib3VuZHMucmlnaHQgPSAwO1xuICAgIH1cblxuICAgIGNvbmZpZy50b29sdGlwID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgZGVmYXVsdENoYXJ0Q29uZmlnKCkudG9vbHRpcCxcbiAgICAgIGNvbmZpZy50b29sdGlwXG4gICAgKTtcblxuICAgIGNvbmZpZy56b29tID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgZGVmYXVsdENoYXJ0Q29uZmlnKCkuem9vbSxcbiAgICAgIGNvbmZpZy56b29tXG4gICAgKTtcblxuICAgIGNvbmZpZy56b29tLnN5bmNDaGFubmVsID0gY29uZmlnLnpvb20/LnN5bmNDaGFubmVsID8/IGlkO1xuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJlcGFyYXRpb25EYXRhKGNvbmZpZzogSUNoYXJ0Q29uZmlnKTogSUNoYXJ0Q29uZmlnIHtcbiAgICBpZiAoY29uZmlnLmludmVydGVkKSB7XG5cblxuICAgICAgY29uc3QgeEF4ZXMgPSBbLi4uY29uZmlnLnhBeGlzXTtcbiAgICAgIGNvbnN0IHlBeGVzID0gWy4uLmNvbmZpZy55QXhpc107XG5cbiAgICAgIGNvbmZpZy54QXhpcyA9IHlBeGVzO1xuICAgICAgY29uZmlnLnlBeGlzID0geEF4ZXM7XG5cbiAgICAgIGNvbmZpZy5zZXJpZXMgPSBjb25maWcuc2VyaWVzPy5tYXAoKHNlcmllKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSBzZXJpZS54QXhpc0luZGV4O1xuICAgICAgICBjb25zdCB5ID0gc2VyaWUueUF4aXNJbmRleDtcbiAgICAgICAgc2VyaWUueEF4aXNJbmRleCA9IHk7XG4gICAgICAgIHNlcmllLnlBeGlzSW5kZXggPSB4O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNlcmllLFxuICAgICAgICAgIGNsaXBQb2ludHNEaXJlY3Rpb246IENsaXBQb2ludHNEaXJlY3Rpb24ueSxcbiAgICAgICAgICBkYXRhOiBzZXJpZT8uZGF0YT8ubWFwKChwb2ludCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICAgIHg6IHBvaW50Py55LFxuICAgICAgICAgICAgICB5OiBwb2ludD8ueCxcbiAgICAgICAgICAgICAgeDE6IHBvaW50Py55MSxcbiAgICAgICAgICAgICAgeTE6IHBvaW50Py54MSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnPy5icnVzaD8uZW5hYmxlKSB7XG4gICAgICBjb25maWcueUF4aXMgPSBjb25maWcueUF4aXMubWFwKChfKSA9PiAoey4uLl8sIHpvb206IGZhbHNlfSkpO1xuICAgICAgY29uZmlnLnhBeGlzID0gY29uZmlnLnhBeGlzLm1hcCgoXykgPT4gKHsuLi5fLCB6b29tOiBmYWxzZX0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,206 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as d3 from 'd3';
3
+ import { Axis } from '../core/axis/axis';
4
+ import { AxisOrientation } from '../model/enum/axis-orientation';
5
+ import { combineLatest, map, shareReplay, take, withLatestFrom, } from 'rxjs';
6
+ import { ScaleType } from '../model/enum/scale-type';
7
+ import { ZoomMessage } from '../model/i-broadcast-message';
8
+ import { ZoomType } from "../model/enum/zoom-type";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./chart.service";
11
+ import * as i2 from "./zoom.service";
12
+ export class ScaleService {
13
+ chartService;
14
+ zoomService;
15
+ scales;
16
+ transformCacheX = new Map();
17
+ transformCacheY = new Map();
18
+ scaleMapping = new Map()
19
+ .set(ScaleType.linear, d3.scaleLinear)
20
+ .set(ScaleType.time, d3.scaleTime)
21
+ .set(ScaleType.log, d3.scaleLog)
22
+ .set(ScaleType.symlog, d3.scaleSymlog)
23
+ .set(ScaleType.pow, d3.scalePow)
24
+ .set(ScaleType.sqrt, d3.scaleSqrt)
25
+ .set(ScaleType.band, d3.scaleBand);
26
+ constructor(chartService, zoomService) {
27
+ this.chartService = chartService;
28
+ this.zoomService = zoomService;
29
+ this.scales = combineLatest([
30
+ this.chartService.size,
31
+ this.chartService.config,
32
+ this.zoomService.zoomed,
33
+ ]).pipe(map((data) => {
34
+ const [size, config, zoom] = data;
35
+ const xAxisMap = new Map();
36
+ const yAxisMap = new Map();
37
+ config.yAxis.map((_, index) => {
38
+ yAxisMap.set(index, Axis.createAxis(AxisOrientation.y, config, index));
39
+ });
40
+ config.xAxis.map((_, index) => {
41
+ xAxisMap.set(index, Axis.createAxis(AxisOrientation.x, config, index));
42
+ });
43
+ // Generate x scales
44
+ const left = Array.from(yAxisMap.values())
45
+ .filter((_) => _.options?.visible && _.options?.opposite)
46
+ .reduce((acc, cur) => acc + cur.selfSize, 0);
47
+ const right = Array.from(yAxisMap.values())
48
+ .filter((_) => _.options?.visible && _.options?.opposite !== true)
49
+ .reduce((acc, cur) => acc + cur.selfSize, 0);
50
+ const finalWidth = (size.width || 0) - left - right;
51
+ xAxisMap.forEach((axis) => {
52
+ let domain = axis.extremes;
53
+ if (axis?.options.inverted) {
54
+ domain = [...axis.extremes].reverse();
55
+ }
56
+ let scale = this.scaleMapping
57
+ .get(axis.options.scaleType.type)()
58
+ .domain(domain)
59
+ .range([0, finalWidth - config.bounds.right]);
60
+ if (axis.options.niceTicks) {
61
+ scale.nice();
62
+ }
63
+ if (axis.options.scaleType.type === ScaleType.log) {
64
+ scale.base(axis.options.scaleType.base);
65
+ }
66
+ if (axis.options.scaleType.type === ScaleType.band) {
67
+ scale.paddingInner(0.1);
68
+ scale.paddingOuter(0.1);
69
+ scale.align(0.1);
70
+ }
71
+ axis.setScale(scale);
72
+ axis.setOriginDomain(scale.domain());
73
+ const hasCache = this.transformCacheX.has(axis.index);
74
+ const shouldRestore = zoom?.axis?.orientation !== AxisOrientation.x ||
75
+ zoom.axis?.index !== axis.index;
76
+ if (hasCache && shouldRestore) {
77
+ const restoredTransform = this.transformCacheX.get(axis.index);
78
+ axis.setScale(restoredTransform.rescaleX(scale));
79
+ }
80
+ });
81
+ if (zoom && zoom.domain) {
82
+ if (zoom.axis?.orientation === AxisOrientation.x) {
83
+ if (xAxisMap.has(zoom.axis.index)) {
84
+ const x = xAxisMap.get(zoom.axis.index);
85
+ const transform = this.zoomService.getD3Transform(zoom.domain, x.originDomain, x.scale, AxisOrientation.x, x.options.inverted);
86
+ const rescaled = transform.rescaleX(x.scale.copy());
87
+ x.setScale(rescaled);
88
+ this.transformCacheX.set(x.index, transform);
89
+ }
90
+ }
91
+ }
92
+ // Generate y axis
93
+ const top = Array.from(xAxisMap.values())
94
+ .filter((_) => _.options?.visible && _.options?.opposite)
95
+ .reduce((acc, cur) => acc + cur.selfSize, 0);
96
+ const bottom = Array.from(xAxisMap.values())
97
+ .filter((_) => _.options?.visible && _.options?.opposite !== true)
98
+ .reduce((acc, cur) => acc + cur.selfSize, 0);
99
+ const finalHeight = (size.height || 0) -
100
+ top -
101
+ bottom -
102
+ config?.bounds?.top -
103
+ config.bounds?.bottom;
104
+ yAxisMap.forEach((axis) => {
105
+ let domain = axis.extremes;
106
+ if (axis.orientation === AxisOrientation.y) {
107
+ domain = [...axis.extremes].reverse();
108
+ }
109
+ if (axis?.options.inverted) {
110
+ domain = domain.reverse();
111
+ }
112
+ const scale = this.scaleMapping
113
+ .get(axis.options.scaleType.type)()
114
+ .domain(domain)
115
+ .range([config.bounds.top, finalHeight]);
116
+ if (axis.options.niceTicks) {
117
+ scale.nice();
118
+ }
119
+ if (axis.options.scaleType.type === ScaleType.log) {
120
+ scale.base(axis.options.scaleType.base);
121
+ }
122
+ if (axis.options.scaleType.type === ScaleType.band) {
123
+ scale.paddingInner(0.1);
124
+ scale.paddingOuter(0.1);
125
+ scale.align(0.1);
126
+ }
127
+ axis.setScale(scale);
128
+ axis.setOriginDomain(scale.domain());
129
+ const hasCache = this.transformCacheY.has(axis.index);
130
+ const shouldRestore = zoom?.axis?.orientation !== AxisOrientation.y ||
131
+ zoom.axis?.index !== axis.index;
132
+ if (hasCache && shouldRestore) {
133
+ const restoredTransform = this.transformCacheY.get(axis.index);
134
+ axis.setScale(restoredTransform.rescaleY(scale));
135
+ }
136
+ });
137
+ if (zoom && zoom.domain) {
138
+ if (zoom.axis?.orientation === AxisOrientation.y) {
139
+ if (yAxisMap.has(zoom.axis.index)) {
140
+ const y = yAxisMap.get(zoom.axis.index);
141
+ const transform = this.zoomService.getD3Transform(zoom.domain, y.originDomain, y.scale, AxisOrientation.y, y.options.inverted);
142
+ const rescaled = transform.rescaleY(y.scale.copy());
143
+ y.setScale(rescaled);
144
+ this.transformCacheY.set(y.index, transform);
145
+ }
146
+ }
147
+ }
148
+ return {
149
+ x: xAxisMap,
150
+ y: yAxisMap
151
+ };
152
+ }), shareReplay({
153
+ bufferSize: 1,
154
+ refCount: true,
155
+ }));
156
+ }
157
+ resetZoom() {
158
+ this.chartService.config.pipe(take(1), withLatestFrom(this.scales)).subscribe(([config, scales]) => {
159
+ config.xAxis.forEach((axis, index) => {
160
+ const scale = scales?.x?.get(index)?.originDomain;
161
+ if (scale) {
162
+ const msg = new ZoomMessage({
163
+ eventType: "end",
164
+ axis: {
165
+ index,
166
+ orientation: AxisOrientation.x
167
+ },
168
+ domain: scale,
169
+ chartId: config.id
170
+ });
171
+ this.zoomService.fireZoom(msg);
172
+ if (config.zoom.syncChannel && config.zoom.syncType === ZoomType.x) {
173
+ this.zoomService.broadcastZoom(msg);
174
+ }
175
+ }
176
+ });
177
+ config.yAxis.forEach((axis, index) => {
178
+ const scale = scales?.y?.get(index)?.originDomain;
179
+ if (scale) {
180
+ const msg = new ZoomMessage({
181
+ eventType: "end",
182
+ axis: {
183
+ index,
184
+ orientation: AxisOrientation.y
185
+ },
186
+ domain: scale,
187
+ chartId: config.id
188
+ });
189
+ this.zoomService.fireZoom(msg);
190
+ if (config.zoom.syncChannel && config.zoom.syncType === ZoomType.y) {
191
+ this.zoomService.broadcastZoom(msg);
192
+ }
193
+ }
194
+ });
195
+ });
196
+ }
197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ScaleService, deps: [{ token: i1.ChartService }, { token: i2.ZoomService }], target: i0.ɵɵFactoryTarget.Injectable });
198
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ScaleService, providedIn: 'root' });
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ScaleService, decorators: [{
201
+ type: Injectable,
202
+ args: [{
203
+ providedIn: 'root',
204
+ }]
205
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i2.ZoomService }]; } });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9zZXJ2aWNlL3NjYWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBRy9ELE9BQU8sRUFBQyxhQUFhLEVBQUUsR0FBRyxFQUFjLFdBQVcsRUFBRSxJQUFJLEVBQUUsY0FBYyxHQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHlCQUF5QixDQUFDOzs7O0FBS2pELE1BQU0sT0FBTyxZQUFZO0lBZ0JiO0lBQ0E7SUFoQkgsTUFBTSxDQUF5QjtJQUU5QixlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFDbkQsZUFBZSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRW5ELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0I7U0FDN0MsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUNyQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQ2pDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDL0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUNyQyxH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V0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNuQyxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUM7Z0JBQ2xELElBQUksS0FBSyxFQUFFO29CQUNULE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDO3dCQUMxQixTQUFTLEVBQUUsS0FBSzt3QkFDaEIsSUFBSSxFQUFFOzRCQUNKLEtBQUs7NEJBQ0wsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO3lCQUMvQjt3QkFDRCxNQUFNLEVBQUUsS0FBSzt3QkFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUU7cUJBQ25CLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFO3dCQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzt1R0E5T1UsWUFBWTsyR0FBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHtab29tVHJhbnNmb3JtfSBmcm9tICdkMyc7XG5pbXBvcnQge0F4aXN9IGZyb20gJy4uL2NvcmUvYXhpcy9heGlzJztcbmltcG9ydCB7QXhpc09yaWVudGF0aW9ufSBmcm9tICcuLi9tb2RlbC9lbnVtL2F4aXMtb3JpZW50YXRpb24nO1xuaW1wb3J0IHtJQ2hhcnRDb25maWd9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcbmltcG9ydCB7Q2hhcnRTZXJ2aWNlfSBmcm9tICcuL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCB0YWtlLCB3aXRoTGF0ZXN0RnJvbSx9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtab29tU2VydmljZX0gZnJvbSAnLi96b29tLnNlcnZpY2UnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uL21vZGVsL2VudW0vc2NhbGUtdHlwZSc7XG5pbXBvcnQge0lTY2FsZXNNYXB9IGZyb20gJy4uL21vZGVsL2ktc2NhbGVzLW1hcCc7XG5pbXBvcnQge1pvb21NZXNzYWdlfSBmcm9tICcuLi9tb2RlbC9pLWJyb2FkY2FzdC1tZXNzYWdlJztcbmltcG9ydCB7Wm9vbVR5cGV9IGZyb20gXCIuLi9tb2RlbC9lbnVtL3pvb20tdHlwZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NhbGVTZXJ2aWNlIHtcbiAgcHVibGljIHNjYWxlczogT2JzZXJ2YWJsZTxJU2NhbGVzTWFwPjtcblxuICBwcml2YXRlIHRyYW5zZm9ybUNhY2hlWCA9IG5ldyBNYXA8bnVtYmVyLCBab29tVHJhbnNmb3JtPigpO1xuICBwcml2YXRlIHRyYW5zZm9ybUNhY2hlWSA9IG5ldyBNYXA8bnVtYmVyLCBab29tVHJhbnNmb3JtPigpO1xuXG4gIHByaXZhdGUgc2NhbGVNYXBwaW5nID0gbmV3IE1hcDxTY2FsZVR5cGUsIGFueT4oKVxuICAgIC5zZXQoU2NhbGVUeXBlLmxpbmVhciwgZDMuc2NhbGVMaW5lYXIpXG4gICAgLnNldChTY2FsZVR5cGUudGltZSwgZDMuc2NhbGVUaW1lKVxuICAgIC5zZXQoU2NhbGVUeXBlLmxvZywgZDMuc2NhbGVMb2cpXG4gICAgLnNldChTY2FsZVR5cGUuc3ltbG9nLCBkMy5zY2FsZVN5bWxvZylcbiAgICAuc2V0KFNjYWxlVHlwZS5wb3csIGQzLnNjYWxlUG93KVxuICAgIC5zZXQoU2NhbGVUeXBlLnNxcnQsIGQzLnNjYWxlU3FydClcbiAgICAuc2V0KFNjYWxlVHlwZS5iYW5kLCBkMy5zY2FsZUJhbmQpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFydFNlcnZpY2U6IENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHpvb21TZXJ2aWNlOiBab29tU2VydmljZVxuICApIHtcblxuICAgIHRoaXMuc2NhbGVzID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNoYXJ0U2VydmljZS5zaXplLFxuICAgICAgdGhpcy5jaGFydFNlcnZpY2UuY29uZmlnLFxuICAgICAgdGhpcy56b29tU2VydmljZS56b29tZWQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoZGF0YTogW0RPTVJlY3RSZWFkT25seSwgSUNoYXJ0Q29uZmlnLCBab29tTWVzc2FnZV0pID0+IHtcbiAgICAgICAgY29uc3QgW3NpemUsIGNvbmZpZywgem9vbV0gPSBkYXRhO1xuXG4gICAgICAgIGNvbnN0IHhBeGlzTWFwID0gbmV3IE1hcDxudW1iZXIsIEF4aXM+KCk7XG4gICAgICAgIGNvbnN0IHlBeGlzTWFwID0gbmV3IE1hcDxudW1iZXIsIEF4aXM+KCk7XG5cbiAgICAgICAgY29uZmlnLnlBeGlzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICB5QXhpc01hcC5zZXQoaW5kZXgsIEF4aXMuY3JlYXRlQXhpcyhBeGlzT3JpZW50YXRpb24ueSwgY29uZmlnLCBpbmRleCkpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGNvbmZpZy54QXhpcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgeEF4aXNNYXAuc2V0KGluZGV4LCBBeGlzLmNyZWF0ZUF4aXMoQXhpc09yaWVudGF0aW9uLngsIGNvbmZpZywgaW5kZXgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgeCBzY2FsZXNcbiAgICAgICAgY29uc3QgbGVmdCA9IEFycmF5LmZyb20oeUF4aXNNYXAudmFsdWVzKCkpXG4gICAgICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zPy52aXNpYmxlICYmIF8ub3B0aW9ucz8ub3Bwb3NpdGUpXG4gICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ci5zZWxmU2l6ZSwgMCk7XG5cbiAgICAgICAgY29uc3QgcmlnaHQgPSBBcnJheS5mcm9tKHlBeGlzTWFwLnZhbHVlcygpKVxuICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucz8udmlzaWJsZSAmJiBfLm9wdGlvbnM/Lm9wcG9zaXRlICE9PSB0cnVlKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIuc2VsZlNpemUsIDApO1xuXG4gICAgICAgIGNvbnN0IGZpbmFsV2lkdGggPSAoc2l6ZS53aWR0aCB8fCAwKSAtIGxlZnQgLSByaWdodDtcblxuICAgICAgICB4QXhpc01hcC5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICAgICAgbGV0IGRvbWFpbiA9IGF4aXMuZXh0cmVtZXM7XG5cbiAgICAgICAgICBpZiAoYXhpcz8ub3B0aW9ucy5pbnZlcnRlZCkge1xuICAgICAgICAgICAgZG9tYWluID0gWy4uLmF4aXMuZXh0cmVtZXNdLnJldmVyc2UoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgc2NhbGUgPSB0aGlzLnNjYWxlTWFwcGluZ1xuICAgICAgICAgICAgLmdldChheGlzLm9wdGlvbnMuc2NhbGVUeXBlLnR5cGUpKClcbiAgICAgICAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgICAgICAgLnJhbmdlKFswLCBmaW5hbFdpZHRoIC0gY29uZmlnLmJvdW5kcy5yaWdodF0pO1xuXG4gICAgICAgICAgaWYgKGF4aXMub3B0aW9ucy5uaWNlVGlja3MpIHtcbiAgICAgICAgICAgIHNjYWxlLm5pY2UoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXhpcy5vcHRpb25zLnNjYWxlVHlwZS50eXBlID09PSBTY2FsZVR5cGUubG9nKSB7XG4gICAgICAgICAgICBzY2FsZS5iYXNlKGF4aXMub3B0aW9ucy5zY2FsZVR5cGUuYmFzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZVR5cGUudHlwZSA9PT0gU2NhbGVUeXBlLmJhbmQpIHtcbiAgICAgICAgICAgIHNjYWxlLnBhZGRpbmdJbm5lcigwLjEpO1xuICAgICAgICAgICAgc2NhbGUucGFkZGluZ091dGVyKDAuMSk7XG4gICAgICAgICAgICBzY2FsZS5hbGlnbigwLjEpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXhpcy5zZXRTY2FsZShzY2FsZSk7XG4gICAgICAgICAgYXhpcy5zZXRPcmlnaW5Eb21haW4oc2NhbGUuZG9tYWluKCkpO1xuXG5cbiAgICAgICAgICBjb25zdCBoYXNDYWNoZSA9IHRoaXMudHJhbnNmb3JtQ2FjaGVYLmhhcyhheGlzLmluZGV4KTtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZXN0b3JlID1cbiAgICAgICAgICAgIHpvb20/LmF4aXM/Lm9yaWVudGF0aW9uICE9PSBBeGlzT3JpZW50YXRpb24ueCB8fFxuICAgICAgICAgICAgem9vbS5heGlzPy5pbmRleCAhPT0gYXhpcy5pbmRleDtcblxuICAgICAgICAgIGlmIChoYXNDYWNoZSAmJiBzaG91bGRSZXN0b3JlKSB7XG4gICAgICAgICAgICBjb25zdCByZXN0b3JlZFRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtQ2FjaGVYLmdldChheGlzLmluZGV4KTtcbiAgICAgICAgICAgIGF4aXMuc2V0U2NhbGUocmVzdG9yZWRUcmFuc2Zvcm0ucmVzY2FsZVgoc2NhbGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh6b29tICYmIHpvb20uZG9tYWluKSB7XG4gICAgICAgICAgaWYgKHpvb20uYXhpcz8ub3JpZW50YXRpb24gPT09IEF4aXNPcmllbnRhdGlvbi54KSB7XG4gICAgICAgICAgICBpZiAoeEF4aXNNYXAuaGFzKHpvb20uYXhpcy5pbmRleCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgeCA9IHhBeGlzTWFwLmdldCh6b29tLmF4aXMuaW5kZXgpO1xuICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLnpvb21TZXJ2aWNlLmdldEQzVHJhbnNmb3JtKHpvb20uZG9tYWluLCB4Lm9yaWdpbkRvbWFpbiwgeC5zY2FsZSwgQXhpc09yaWVudGF0aW9uLngsIHgub3B0aW9ucy5pbnZlcnRlZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc2NhbGVkID0gdHJhbnNmb3JtLnJlc2NhbGVYKHguc2NhbGUuY29weSgpKTtcbiAgICAgICAgICAgICAgeC5zZXRTY2FsZShyZXNjYWxlZCk7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ2FjaGVYLnNldCh4LmluZGV4LCB0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgeSBheGlzXG5cbiAgICAgICAgY29uc3QgdG9wID0gQXJyYXkuZnJvbSh4QXhpc01hcC52YWx1ZXMoKSlcbiAgICAgICAgICAuZmlsdGVyKChfKSA9PiBfLm9wdGlvbnM/LnZpc2libGUgJiYgXy5vcHRpb25zPy5vcHBvc2l0ZSlcbiAgICAgICAgICAucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICsgY3VyLnNlbGZTaXplLCAwKTtcblxuICAgICAgICBjb25zdCBib3R0b20gPSBBcnJheS5mcm9tKHhBeGlzTWFwLnZhbHVlcygpKVxuICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucz8udmlzaWJsZSAmJiBfLm9wdGlvbnM/Lm9wcG9zaXRlICE9PSB0cnVlKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIuc2VsZlNpemUsIDApO1xuXG4gICAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID1cbiAgICAgICAgICAoc2l6ZS5oZWlnaHQgfHwgMCkgLVxuICAgICAgICAgIHRvcCAtXG4gICAgICAgICAgYm90dG9tIC1cbiAgICAgICAgICBjb25maWc/LmJvdW5kcz8udG9wIC1cbiAgICAgICAgICBjb25maWcuYm91bmRzPy5ib3R0b207XG5cbiAgICAgICAgeUF4aXNNYXAuZm9yRWFjaCgoYXhpcykgPT4ge1xuICAgICAgICAgIGxldCBkb21haW4gPSBheGlzLmV4dHJlbWVzO1xuXG4gICAgICAgICAgaWYgKGF4aXMub3JpZW50YXRpb24gPT09IEF4aXNPcmllbnRhdGlvbi55KSB7XG4gICAgICAgICAgICBkb21haW4gPSBbLi4uYXhpcy5leHRyZW1lc10ucmV2ZXJzZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChheGlzPy5vcHRpb25zLmludmVydGVkKSB7XG4gICAgICAgICAgICBkb21haW4gPSBkb21haW4ucmV2ZXJzZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZU1hcHBpbmdcbiAgICAgICAgICAgIC5nZXQoYXhpcy5vcHRpb25zLnNjYWxlVHlwZS50eXBlKSgpXG4gICAgICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgICAgIC5yYW5nZShbY29uZmlnLmJvdW5kcy50b3AsIGZpbmFsSGVpZ2h0XSk7XG5cblxuICAgICAgICAgIGlmIChheGlzLm9wdGlvbnMubmljZVRpY2tzKSB7XG4gICAgICAgICAgICBzY2FsZS5uaWNlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF4aXMub3B0aW9ucy5zY2FsZVR5cGUudHlwZSA9PT0gU2NhbGVUeXBlLmxvZykge1xuICAgICAgICAgICAgc2NhbGUuYmFzZShheGlzLm9wdGlvbnMuc2NhbGVUeXBlLmJhc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChheGlzLm9wdGlvbnMuc2NhbGVUeXBlLnR5cGUgPT09IFNjYWxlVHlwZS5iYW5kKSB7XG4gICAgICAgICAgICBzY2FsZS5wYWRkaW5nSW5uZXIoMC4xKTtcbiAgICAgICAgICAgIHNjYWxlLnBhZGRpbmdPdXRlcigwLjEpO1xuICAgICAgICAgICAgc2NhbGUuYWxpZ24oMC4xKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF4aXMuc2V0U2NhbGUoc2NhbGUpO1xuICAgICAgICAgIGF4aXMuc2V0T3JpZ2luRG9tYWluKHNjYWxlLmRvbWFpbigpKTtcblxuICAgICAgICAgIGNvbnN0IGhhc0NhY2hlID0gdGhpcy50cmFuc2Zvcm1DYWNoZVkuaGFzKGF4aXMuaW5kZXgpO1xuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVzdG9yZSA9XG4gICAgICAgICAgICB6b29tPy5heGlzPy5vcmllbnRhdGlvbiAhPT0gQXhpc09yaWVudGF0aW9uLnkgfHxcbiAgICAgICAgICAgIHpvb20uYXhpcz8uaW5kZXggIT09IGF4aXMuaW5kZXg7XG5cbiAgICAgICAgICBpZiAoaGFzQ2FjaGUgJiYgc2hvdWxkUmVzdG9yZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdG9yZWRUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybUNhY2hlWS5nZXQoYXhpcy5pbmRleCk7XG4gICAgICAgICAgICBheGlzLnNldFNjYWxlKHJlc3RvcmVkVHJhbnNmb3JtLnJlc2NhbGVZKHNjYWxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoem9vbSAmJiB6b29tLmRvbWFpbikge1xuICAgICAgICAgIGlmICh6b29tLmF4aXM/Lm9yaWVudGF0aW9uID09PSBBeGlzT3JpZW50YXRpb24ueSkge1xuICAgICAgICAgICAgaWYgKHlBeGlzTWFwLmhhcyh6b29tLmF4aXMuaW5kZXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHkgPSB5QXhpc01hcC5nZXQoem9vbS5heGlzLmluZGV4KTtcbiAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy56b29tU2VydmljZS5nZXREM1RyYW5zZm9ybSh6b29tLmRvbWFpbixcbiAgICAgICAgICAgICAgICB5Lm9yaWdpbkRvbWFpbixcbiAgICAgICAgICAgICAgICB5LnNjYWxlLFxuICAgICAgICAgICAgICAgIEF4aXNPcmllbnRhdGlvbi55LFxuICAgICAgICAgICAgICAgIHkub3B0aW9ucy5pbnZlcnRlZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCByZXNjYWxlZCA9IHRyYW5zZm9ybS5yZXNjYWxlWSh5LnNjYWxlLmNvcHkoKSk7XG4gICAgICAgICAgICAgIHkuc2V0U2NhbGUocmVzY2FsZWQpO1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNhY2hlWS5zZXQoeS5pbmRleCwgdHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4QXhpc01hcCxcbiAgICAgICAgICB5OiB5QXhpc01hcFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7XG4gICAgICAgIGJ1ZmZlclNpemU6IDEsXG4gICAgICAgIHJlZkNvdW50OiB0cnVlLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmVzZXRab29tKCkge1xuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLmNvbmZpZy5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc2NhbGVzKVxuICAgICkuc3Vic2NyaWJlKChbY29uZmlnLCBzY2FsZXNdOiBbSUNoYXJ0Q29uZmlnLCBJU2NhbGVzTWFwXSkgPT4ge1xuICAgICAgY29uZmlnLnhBeGlzLmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVzPy54Py5nZXQoaW5kZXgpPy5vcmlnaW5Eb21haW47XG4gICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IG5ldyBab29tTWVzc2FnZSh7XG4gICAgICAgICAgICBldmVudFR5cGU6IFwiZW5kXCIsXG4gICAgICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBvcmllbnRhdGlvbjogQXhpc09yaWVudGF0aW9uLnhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21haW46IHNjYWxlLFxuICAgICAgICAgICAgY2hhcnRJZDogY29uZmlnLmlkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy56b29tU2VydmljZS5maXJlWm9vbShtc2cpO1xuICAgICAgICAgIGlmIChjb25maWcuem9vbS5zeW5jQ2hhbm5lbCAmJiBjb25maWcuem9vbS5zeW5jVHlwZSA9PT0gWm9vbVR5cGUueCkge1xuICAgICAgICAgICAgdGhpcy56b29tU2VydmljZS5icm9hZGNhc3Rab29tKG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY29uZmlnLnlBeGlzLmZvckVhY2goKGF4aXMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVzPy55Py5nZXQoaW5kZXgpPy5vcmlnaW5Eb21haW47XG4gICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IG5ldyBab29tTWVzc2FnZSh7XG4gICAgICAgICAgICBldmVudFR5cGU6IFwiZW5kXCIsXG4gICAgICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBvcmllbnRhdGlvbjogQXhpc09yaWVudGF0aW9uLnlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21haW46IHNjYWxlLFxuICAgICAgICAgICAgY2hhcnRJZDogY29uZmlnLmlkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy56b29tU2VydmljZS5maXJlWm9vbShtc2cpO1xuICAgICAgICAgIGlmIChjb25maWcuem9vbS5zeW5jQ2hhbm5lbCAmJiBjb25maWcuem9vbS5zeW5jVHlwZSA9PT0gWm9vbVR5cGUueSkge1xuICAgICAgICAgICAgdGhpcy56b29tU2VydmljZS5icm9hZGNhc3Rab29tKG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==