ngx-hana-nameserver-history-viewer 1.2.1 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +2 -1
  2. package/{fesm2020 → fesm2022}/ngx-hana-nameserver-history-viewer.mjs +2898 -3983
  3. package/fesm2022/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  4. package/ngx-hana-nameserver-history-viewer-21.1.0.tgz +0 -0
  5. package/package.json +20 -27
  6. package/types/ngx-hana-nameserver-history-viewer.d.ts +545 -0
  7. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +0 -5
  8. package/esm2020/public-api.mjs +0 -2
  9. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +0 -68
  10. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +0 -22
  11. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +0 -3
  12. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +0 -112
  13. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +0 -2
  14. package/esm2020/src/nameserver-history-viewer/components/index.mjs +0 -9
  15. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +0 -2
  16. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +0 -42
  17. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +0 -557
  18. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +0 -2
  19. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +0 -69
  20. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +0 -41
  21. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +0 -2
  22. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +0 -40
  23. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +0 -2
  24. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +0 -70
  25. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +0 -2
  26. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +0 -88
  27. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +0 -47
  28. package/esm2020/src/nameserver-history-viewer/index.mjs +0 -3
  29. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +0 -63
  30. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +0 -328
  31. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +0 -390
  32. package/esm2020/src/nameserver-history-viewer/services/index.mjs +0 -4
  33. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +0 -557
  34. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +0 -6
  35. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +0 -8
  36. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +0 -2
  37. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +0 -2
  38. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +0 -2
  39. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +0 -2
  40. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +0 -2
  41. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +0 -2
  42. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +0 -9
  43. package/esm2020/src/nameserver-history-viewer/types/index.mjs +0 -28
  44. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +0 -14
  45. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +0 -2
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +0 -2
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +0 -2
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +0 -2
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +0 -2
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +0 -2
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +0 -2
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +0 -2
  53. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +0 -2
  54. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +0 -2
  55. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +0 -2
  56. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +0 -2
  57. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +0 -2
  58. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +0 -2
  59. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +0 -17
  60. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +0 -10
  61. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +0 -14
  62. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +0 -25
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +0 -2
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +0 -56
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +0 -139
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +0 -41
  67. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +0 -106
  68. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +0 -167
  69. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +0 -114
  70. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +0 -527
  71. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +0 -2
  72. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +0 -161
  73. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +0 -5
  74. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +0 -99
  75. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +0 -162
  76. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +0 -4098
  77. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  78. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  79. package/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  80. package/public-api.d.ts +0 -1
  81. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +0 -21
  82. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -8
  83. package/src/nameserver-history-viewer/components/alert/index.d.ts +0 -2
  84. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +0 -16
  85. package/src/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -1
  86. package/src/nameserver-history-viewer/components/index.d.ts +0 -8
  87. package/src/nameserver-history-viewer/components/instruction/index.d.ts +0 -1
  88. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -17
  89. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +0 -262
  90. package/src/nameserver-history-viewer/components/port-selector/index.d.ts +0 -1
  91. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +0 -31
  92. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +0 -14
  93. package/src/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -1
  94. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -6
  95. package/src/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -1
  96. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -19
  97. package/src/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -1
  98. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +0 -26
  99. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +0 -21
  100. package/src/nameserver-history-viewer/index.d.ts +0 -2
  101. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -19
  102. package/src/nameserver-history-viewer/services/chart.service.d.ts +0 -59
  103. package/src/nameserver-history-viewer/services/file.service.d.ts +0 -63
  104. package/src/nameserver-history-viewer/services/index.d.ts +0 -3
  105. package/src/nameserver-history-viewer/services/ui.service.d.ts +0 -88
  106. package/src/nameserver-history-viewer/types/abort.types.d.ts +0 -4
  107. package/src/nameserver-history-viewer/types/alert.types.d.ts +0 -6
  108. package/src/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -4
  109. package/src/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -4
  110. package/src/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -4
  111. package/src/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -3
  112. package/src/nameserver-history-viewer/types/chart-content.types.d.ts +0 -10
  113. package/src/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -6
  114. package/src/nameserver-history-viewer/types/html-element.type.d.ts +0 -7
  115. package/src/nameserver-history-viewer/types/index.d.ts +0 -27
  116. package/src/nameserver-history-viewer/types/item.types.d.ts +0 -12
  117. package/src/nameserver-history-viewer/types/legend-color.types.d.ts +0 -4
  118. package/src/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -7
  119. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -7
  120. package/src/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -15
  121. package/src/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -13
  122. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -11
  123. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -5
  124. package/src/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -10
  125. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -10
  126. package/src/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -16
  127. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -5
  128. package/src/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -9
  129. package/src/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -22
  130. package/src/nameserver-history-viewer/types/port.types.d.ts +0 -5
  131. package/src/nameserver-history-viewer/types/scale-group.types.d.ts +0 -15
  132. package/src/nameserver-history-viewer/types/unit-category.types.d.ts +0 -8
  133. package/src/nameserver-history-viewer/types/unit.types.d.ts +0 -12
  134. package/src/nameserver-history-viewer/utils/chart-util.d.ts +0 -14
  135. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -89
  136. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -32
  137. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -78
  138. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -1
  139. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +0 -57
  140. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -55
  141. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -64
  142. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -30
  143. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -1
  144. package/src/nameserver-history-viewer/utils/file-util.d.ts +0 -68
  145. package/src/nameserver-history-viewer/utils/index.d.ts +0 -4
  146. package/src/nameserver-history-viewer/utils/time-util.d.ts +0 -23
  147. package/src/nameserver-history-viewer/utils/ui-util.d.ts +0 -41
@@ -1,527 +0,0 @@
1
- /**
2
- * this plugin is adapted from: https://github.com/chartjs/chartjs-plugin-zoom
3
- * for following two open issues:
4
- * https://github.com/chartjs/chartjs-plugin-zoom/pull/155
5
- * https://github.com/chartjs/chartjs-plugin-zoom/pull/150
6
- *
7
- * The MIT License (MIT) Copyright (c) 2013-2016 Nick Downie
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this
9
- * software and associated documentation files (the "Software"), to deal in the Software
10
- * without restriction, including without limitation the rights to use, copy, modify, merge,
11
- * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
12
- * to whom the Software is furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in all copies or
15
- * substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
18
- * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
19
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- * THE SOFTWARE.
23
- */
24
- /*jslint browser:true, devel:true, white:true, vars:true */
25
- /*global require*/
26
- // hammer JS for touch support
27
- import * as hammerjs from 'hammerjs';
28
- const Hammer = window && window.Hammer ? window.Hammer : hammerjs.Hammer;
29
- // Get the chart variable
30
- import * as chartjs from 'chart.js';
31
- const Chart = window && window.Chart ? window.Chart : chartjs.Chart;
32
- const helpers = Chart.helpers;
33
- // Take the zoom namespace of Chart
34
- const zoomNS = Chart.Zoom = Chart.Zoom || {};
35
- // Where we store functions to handle different scale types
36
- const zoomFunctions = zoomNS.zoomFunctions = zoomNS.zoomFunctions || {};
37
- const panFunctions = zoomNS.panFunctions = zoomNS.panFunctions || {};
38
- // Default options if none are provided
39
- const defaultOptions = zoomNS.defaults = {
40
- pan: {
41
- enabled: true,
42
- mode: 'xy',
43
- speed: 20,
44
- threshold: 10
45
- },
46
- zoom: {
47
- enabled: true,
48
- mode: 'xy',
49
- sensitivity: 3
50
- }
51
- };
52
- function directionEnabled(mode, dir) {
53
- if (mode === undefined) {
54
- return true;
55
- }
56
- else if (typeof mode === 'string') {
57
- return mode.indexOf(dir) !== -1;
58
- }
59
- return false;
60
- }
61
- function rangeMaxLimiter(zoomPanOptions, newMax) {
62
- if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMax &&
63
- !helpers.isNullOrUndef(zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes])) {
64
- const rangeMax = zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes];
65
- if (newMax > rangeMax) {
66
- newMax = rangeMax;
67
- }
68
- }
69
- return newMax;
70
- }
71
- function rangeMinLimiter(zoomPanOptions, newMin) {
72
- if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMin &&
73
- !helpers.isNullOrUndef(zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes])) {
74
- const rangeMin = zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes];
75
- if (newMin < rangeMin) {
76
- newMin = rangeMin;
77
- }
78
- }
79
- return newMin;
80
- }
81
- function zoomIndexScale(scale, zoom, center, zoomOptions) {
82
- const labels = scale.chart.data.labels;
83
- let minIndex = scale.minIndex;
84
- const lastLabelIndex = labels.length - 1;
85
- let maxIndex = scale.maxIndex;
86
- const sensitivity = zoomOptions.sensitivity;
87
- const chartCenter = scale.isHorizontal() ? scale.left + (scale.width / 2) : scale.top + (scale.height / 2);
88
- const centerPointer = scale.isHorizontal() ? center.x : center.y;
89
- zoomNS.zoomCumulativeDelta = zoom > 1 ? zoomNS.zoomCumulativeDelta + 1 : zoomNS.zoomCumulativeDelta - 1;
90
- if (Math.abs(zoomNS.zoomCumulativeDelta) > sensitivity) {
91
- if (zoomNS.zoomCumulativeDelta < 0) {
92
- if (centerPointer >= chartCenter) {
93
- if (minIndex <= 0) {
94
- maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
95
- }
96
- else {
97
- minIndex = Math.max(0, minIndex - 1);
98
- }
99
- }
100
- else if (centerPointer < chartCenter) {
101
- if (maxIndex >= lastLabelIndex) {
102
- minIndex = Math.max(0, minIndex - 1);
103
- }
104
- else {
105
- maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
106
- }
107
- }
108
- zoomNS.zoomCumulativeDelta = 0;
109
- }
110
- else if (zoomNS.zoomCumulativeDelta > 0) {
111
- if (centerPointer >= chartCenter) {
112
- minIndex = minIndex < maxIndex ? minIndex = Math.min(maxIndex, minIndex + 1) : minIndex;
113
- }
114
- else if (centerPointer < chartCenter) {
115
- maxIndex = maxIndex > minIndex ? maxIndex = Math.max(minIndex, maxIndex - 1) : maxIndex;
116
- }
117
- zoomNS.zoomCumulativeDelta = 0;
118
- }
119
- scale.options.ticks.min = rangeMinLimiter(zoomOptions, labels[minIndex]);
120
- scale.options.ticks.max = rangeMaxLimiter(zoomOptions, labels[maxIndex]);
121
- }
122
- }
123
- function zoomTimeScale(scale, zoom, center, zoomOptions) {
124
- const options = scale.options;
125
- // var range;
126
- // var min_percent;
127
- // if (scale.isHorizontal()) {
128
- // range = scale.right - scale.left;
129
- // min_percent = (center.x - scale.left) / range;
130
- // } else {
131
- // range = scale.bottom - scale.top;
132
- // min_percent = (center.y - scale.top) / range;
133
- // }
134
- //
135
- // var max_percent = 1 - min_percent;
136
- const range = scale.max - scale.min;
137
- const newDiff = range * (zoom - 1);
138
- const cursorPixel = scale.isHorizontal() ? center.x : center.y;
139
- const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
140
- const max_percent = 1 - min_percent;
141
- const minDelta = newDiff * min_percent;
142
- const maxDelta = newDiff * max_percent;
143
- const newMin = scale.min + minDelta;
144
- const newMax = scale.max - maxDelta;
145
- const diffMinMax = newMax - newMin;
146
- const minLimitExceeded = rangeMinLimiter(zoomOptions, diffMinMax) !== diffMinMax;
147
- const maxLimitExceeded = rangeMaxLimiter(zoomOptions, diffMinMax) !== diffMinMax;
148
- if (!minLimitExceeded && !maxLimitExceeded) {
149
- options.time.min = newMin;
150
- options.time.max = newMax;
151
- }
152
- }
153
- function zoomNumericalScale(scale, zoom, center, zoomOptions) {
154
- const range = scale.max - scale.min;
155
- const newDiff = range * (zoom - 1);
156
- const cursorPixel = scale.isHorizontal() ? center.x : center.y;
157
- const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
158
- const max_percent = 1 - min_percent;
159
- const minDelta = newDiff * min_percent;
160
- const maxDelta = newDiff * max_percent;
161
- scale.options.ticks.min = rangeMinLimiter(zoomOptions, scale.min + minDelta);
162
- scale.options.ticks.max = rangeMaxLimiter(zoomOptions, scale.max - maxDelta);
163
- }
164
- function zoomScale(scale, zoom, center, zoomOptions) {
165
- const fn = zoomFunctions[scale.options.type];
166
- if (fn) {
167
- fn(scale, zoom, center, zoomOptions);
168
- }
169
- }
170
- function doZoom(chartInstance, zoom, center, whichAxes) {
171
- const ca = chartInstance.chartArea;
172
- if (!center) {
173
- center = {
174
- x: (ca.left + ca.right) / 2,
175
- y: (ca.top + ca.bottom) / 2,
176
- };
177
- }
178
- const zoomOptions = chartInstance.options.zoom;
179
- if (zoomOptions && helpers.getValueOrDefault(zoomOptions.enabled, defaultOptions.zoom.enabled)) {
180
- // Do the zoom here
181
- const zoomMode = helpers.getValueOrDefault(chartInstance.options.zoom.mode, defaultOptions.zoom.mode);
182
- zoomOptions.sensitivity = helpers.getValueOrDefault(chartInstance.options.zoom.sensitivity, defaultOptions.zoom.sensitivity);
183
- // Which axe should be modified when figers were used.
184
- let _whichAxes;
185
- if (zoomMode === 'xy' && whichAxes !== undefined) {
186
- // based on fingers positions
187
- _whichAxes = whichAxes;
188
- }
189
- else {
190
- // no effect
191
- _whichAxes = 'xy';
192
- }
193
- helpers.each(chartInstance.scales, function (scale, id) {
194
- if (scale.isHorizontal() && directionEnabled(zoomMode, 'x') && directionEnabled(_whichAxes, 'x')) {
195
- zoomOptions.scaleAxes = 'x';
196
- zoomScale(scale, zoom, center, zoomOptions);
197
- }
198
- else if (!scale.isHorizontal() && directionEnabled(zoomMode, 'y') && directionEnabled(_whichAxes, 'y')) {
199
- // Do Y zoom
200
- zoomOptions.scaleAxes = 'y';
201
- zoomScale(scale, zoom, center, zoomOptions);
202
- }
203
- });
204
- chartInstance.update(0);
205
- if (typeof zoomOptions.onZoom === 'function') {
206
- zoomOptions.onZoom();
207
- }
208
- }
209
- }
210
- function panIndexScale(scale, delta, panOptions) {
211
- const labels = scale.chart.data.labels;
212
- const lastLabelIndex = labels.length - 1;
213
- const offsetAmt = Math.max((scale.ticks.length - ((scale.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
214
- const panSpeed = panOptions.speed;
215
- let minIndex = scale.minIndex;
216
- const step = Math.round(scale.width / (offsetAmt * panSpeed));
217
- let maxIndex;
218
- zoomNS.panCumulativeDelta += delta;
219
- minIndex = zoomNS.panCumulativeDelta > step ? Math.max(0, minIndex - 1) : zoomNS.panCumulativeDelta < -step ? Math.min(lastLabelIndex - offsetAmt + 1, minIndex + 1) : minIndex;
220
- zoomNS.panCumulativeDelta = minIndex !== scale.minIndex ? 0 : zoomNS.panCumulativeDelta;
221
- maxIndex = Math.min(lastLabelIndex, minIndex + offsetAmt - 1);
222
- scale.options.ticks.min = rangeMinLimiter(panOptions, labels[minIndex]);
223
- scale.options.ticks.max = rangeMaxLimiter(panOptions, labels[maxIndex]);
224
- }
225
- function panTimeScale(scale, delta, panOptions) {
226
- const options = scale.options;
227
- const limitedMax = rangeMaxLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.max) - delta));
228
- const limitedMin = rangeMinLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.min) - delta));
229
- const limitedTimeDelta = delta < 0 ? limitedMax - scale.max : limitedMin - scale.min;
230
- options.time.max = scale.max + limitedTimeDelta;
231
- options.time.min = scale.min + limitedTimeDelta;
232
- }
233
- function panNumericalScale(scale, delta, panOptions) {
234
- const tickOpts = scale.options.ticks;
235
- const start = scale.start, end = scale.end;
236
- if (tickOpts.reverse) {
237
- tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
238
- tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
239
- }
240
- else {
241
- tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
242
- tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
243
- }
244
- tickOpts.min = rangeMinLimiter(panOptions, tickOpts.min);
245
- tickOpts.max = rangeMaxLimiter(panOptions, tickOpts.max);
246
- }
247
- function panScale(scale, delta, panOptions) {
248
- const fn = panFunctions[scale.options.type];
249
- if (fn) {
250
- fn(scale, delta, panOptions);
251
- }
252
- }
253
- function doPan(chartInstance, deltaX, deltaY) {
254
- const panOptions = chartInstance.options.pan;
255
- if (panOptions && helpers.getValueOrDefault(panOptions.enabled, defaultOptions.pan.enabled)) {
256
- const panMode = helpers.getValueOrDefault(chartInstance.options.pan.mode, defaultOptions.pan.mode);
257
- panOptions.speed = helpers.getValueOrDefault(chartInstance.options.pan.speed, defaultOptions.pan.speed);
258
- helpers.each(chartInstance.scales, function (scale, id) {
259
- if (scale.isHorizontal() && directionEnabled(panMode, 'x') && deltaX !== 0) {
260
- panOptions.scaleAxes = 'x';
261
- panScale(scale, deltaX, panOptions);
262
- }
263
- else if (!scale.isHorizontal() && directionEnabled(panMode, 'y') && deltaY !== 0) {
264
- panOptions.scaleAxes = 'y';
265
- panScale(scale, deltaY, panOptions);
266
- }
267
- });
268
- chartInstance.update(0);
269
- if (typeof panOptions.onPan === 'function') {
270
- panOptions.onPan();
271
- }
272
- }
273
- }
274
- function positionInChartArea(chartInstance, position) {
275
- return (position.x >= chartInstance.chartArea.left && position.x <= chartInstance.chartArea.right) &&
276
- (position.y >= chartInstance.chartArea.top && position.y <= chartInstance.chartArea.bottom);
277
- }
278
- function getYAxis(chartInstance) {
279
- const scales = chartInstance.scales;
280
- for (const scaleId in scales) {
281
- if (scales.hasOwnProperty(scaleId)) {
282
- const scale = scales[scaleId];
283
- if (!scale.isHorizontal()) {
284
- return scale;
285
- }
286
- }
287
- }
288
- }
289
- // Store these for later
290
- zoomNS.zoomFunctions.category = zoomIndexScale;
291
- zoomNS.zoomFunctions.time = zoomTimeScale;
292
- zoomNS.zoomFunctions.linear = zoomNumericalScale;
293
- zoomNS.zoomFunctions.logarithmic = zoomNumericalScale;
294
- zoomNS.panFunctions.category = panIndexScale;
295
- zoomNS.panFunctions.time = panTimeScale;
296
- zoomNS.panFunctions.linear = panNumericalScale;
297
- zoomNS.panFunctions.logarithmic = panNumericalScale;
298
- // Globals for catergory pan and zoom
299
- zoomNS.panCumulativeDelta = 0;
300
- zoomNS.zoomCumulativeDelta = 0;
301
- // Chartjs Zoom Plugin
302
- export const zoomPlugin = {
303
- afterInit: function (chartInstance) {
304
- helpers.each(chartInstance.scales, function (scale) {
305
- scale.originalOptions = helpers.clone(scale.options);
306
- });
307
- chartInstance.resetZoom = function () {
308
- helpers.each(chartInstance.scales, function (scale, id) {
309
- const timeOptions = scale.options.time;
310
- const tickOptions = scale.options.ticks;
311
- if (timeOptions) {
312
- timeOptions.min = scale.originalOptions.time.min;
313
- timeOptions.max = scale.originalOptions.time.max;
314
- }
315
- if (tickOptions) {
316
- tickOptions.min = scale.originalOptions.ticks.min;
317
- tickOptions.max = scale.originalOptions.ticks.max;
318
- }
319
- });
320
- helpers.each(chartInstance.data.datasets, function (dataset, id) {
321
- dataset._meta = null;
322
- });
323
- chartInstance.update();
324
- };
325
- },
326
- beforeInit: function (chartInstance) {
327
- chartInstance.zoom = {};
328
- const node = chartInstance.zoom.node = chartInstance.chart.ctx.canvas;
329
- const options = chartInstance.options;
330
- const panThreshold = helpers.getValueOrDefault(options.pan ? options.pan.threshold : undefined, zoomNS.defaults.pan.threshold);
331
- if (!options.zoom || !options.zoom.enabled) {
332
- return;
333
- }
334
- if (options.zoom.drag) {
335
- // Only want to zoom horizontal axis
336
- options.zoom.mode = 'x';
337
- chartInstance.zoom._mouseDownHandler = function (event) {
338
- chartInstance.zoom._dragZoomStart = event;
339
- };
340
- node.addEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
341
- chartInstance.zoom._mouseMoveHandler = function (event) {
342
- if (chartInstance.zoom._dragZoomStart) {
343
- chartInstance.zoom._dragZoomEnd = event;
344
- chartInstance.update(0);
345
- }
346
- };
347
- node.addEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
348
- chartInstance.zoom._mouseUpHandler = function (event) {
349
- if (chartInstance.zoom._dragZoomStart) {
350
- const chartArea = chartInstance.chartArea;
351
- const yAxis = getYAxis(chartInstance);
352
- const beginPoint = chartInstance.zoom._dragZoomStart;
353
- const offsetX = beginPoint.target.getBoundingClientRect().left;
354
- const startX = Math.max(Math.min(beginPoint.clientX, event.clientX) - offsetX, chartArea.left);
355
- const endX = Math.min(Math.max(beginPoint.clientX, event.clientX) - offsetX, chartArea.right);
356
- const dragDistance = endX - startX;
357
- const chartDistance = chartArea.right - chartArea.left;
358
- const zoom = 1 + (chartDistance - dragDistance) / chartDistance;
359
- const centerX = chartArea.left + (startX - chartArea.left) / (zoom - 1);
360
- // Remove drag start and end before chart update to stop drawing selected area
361
- chartInstance.zoom._dragZoomStart = null;
362
- chartInstance.zoom._dragZoomEnd = null;
363
- if (dragDistance > 0) {
364
- doZoom(chartInstance, zoom, {
365
- x: centerX,
366
- y: (yAxis.bottom - yAxis.top) / 2,
367
- });
368
- }
369
- }
370
- };
371
- // node.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
372
- node.ownerDocument.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
373
- }
374
- else {
375
- chartInstance.zoom._wheelHandler = function (event) {
376
- const rect = event.target.getBoundingClientRect();
377
- const offsetX = event.clientX - rect.left;
378
- const offsetY = event.clientY - rect.top;
379
- const center = {
380
- x: offsetX,
381
- y: offsetY
382
- };
383
- if (event.deltaY < 0) {
384
- doZoom(chartInstance, 1.1, center);
385
- }
386
- else {
387
- doZoom(chartInstance, 0.909, center);
388
- }
389
- // Prevent the event from triggering the default behavior (eg. Content scrolling).
390
- event.preventDefault();
391
- };
392
- node.addEventListener('wheel', chartInstance.zoom._wheelHandler);
393
- }
394
- if (Hammer) {
395
- const mc = new Hammer.Manager(node);
396
- mc.add(new Hammer.Pinch());
397
- mc.add(new Hammer.Pan({
398
- threshold: panThreshold
399
- }));
400
- // Hammer reports the total scaling. We need the incremental amount
401
- let currentPinchScaling;
402
- const handlePinch = function (e) {
403
- const diff = 1 / (currentPinchScaling) * e.scale;
404
- const rect = e.target.getBoundingClientRect();
405
- const offsetX = e.center.x - rect.left;
406
- const offsetY = e.center.y - rect.top;
407
- const center = {
408
- x: offsetX,
409
- y: offsetY
410
- };
411
- // fingers position difference
412
- const x = Math.abs(e.pointers[0].clientX - e.pointers[1].clientX);
413
- const y = Math.abs(e.pointers[0].clientY - e.pointers[1].clientY);
414
- // diagonal fingers will change both (xy) axes
415
- const p = x / y;
416
- let xy;
417
- if (p > 0.3 && p < 1.7) {
418
- xy = 'xy';
419
- }
420
- else if (x > y) {
421
- // x axis
422
- xy = 'x';
423
- }
424
- else {
425
- // y axis
426
- xy = 'y';
427
- }
428
- doZoom(chartInstance, diff, center, xy);
429
- // Keep track of overall scale
430
- currentPinchScaling = e.scale;
431
- };
432
- mc.on('pinchstart', function (e) {
433
- currentPinchScaling = 1; // reset tracker
434
- });
435
- mc.on('pinch', handlePinch);
436
- mc.on('pinchend', function (e) {
437
- handlePinch(e);
438
- currentPinchScaling = null; // reset
439
- zoomNS.zoomCumulativeDelta = 0;
440
- });
441
- let currentDeltaX = null, currentDeltaY = null, panning = false;
442
- const handlePan = function (e) {
443
- if (currentDeltaX !== null && currentDeltaY !== null) {
444
- panning = true;
445
- const deltaX = e.deltaX - currentDeltaX;
446
- const deltaY = e.deltaY - currentDeltaY;
447
- currentDeltaX = e.deltaX;
448
- currentDeltaY = e.deltaY;
449
- doPan(chartInstance, deltaX, deltaY);
450
- }
451
- };
452
- mc.on('panstart', function (e) {
453
- currentDeltaX = 0;
454
- currentDeltaY = 0;
455
- handlePan(e);
456
- });
457
- mc.on('panmove', handlePan);
458
- mc.on('panend', function (e) {
459
- currentDeltaX = null;
460
- currentDeltaY = null;
461
- zoomNS.panCumulativeDelta = 0;
462
- setTimeout(function () { panning = false; }, 500);
463
- });
464
- chartInstance.zoom._ghostClickHandler = function (e) {
465
- if (panning) {
466
- e.stopImmediatePropagation();
467
- e.preventDefault();
468
- }
469
- };
470
- node.addEventListener('click', chartInstance.zoom._ghostClickHandler);
471
- chartInstance._mc = mc;
472
- }
473
- },
474
- beforeDatasetsDraw: function (chartInstance) {
475
- const ctx = chartInstance.chart.ctx;
476
- const chartArea = chartInstance.chartArea;
477
- ctx.save();
478
- ctx.beginPath();
479
- if (chartInstance.zoom._dragZoomEnd) {
480
- const yAxis = getYAxis(chartInstance);
481
- const beginPoint = chartInstance.zoom._dragZoomStart;
482
- const endPoint = chartInstance.zoom._dragZoomEnd;
483
- const offsetX = beginPoint.target.getBoundingClientRect().left;
484
- const startX = Math.min(beginPoint.clientX, endPoint.clientX) - offsetX;
485
- const endX = Math.max(beginPoint.clientX, endPoint.clientX) - offsetX;
486
- const rectWidth = endX - startX;
487
- ctx.fillStyle = 'rgba(225,225,225,0.5)';
488
- ctx.lineWidth = 5;
489
- ctx.fillRect(startX, yAxis.top, rectWidth, yAxis.bottom - yAxis.top);
490
- }
491
- ctx.rect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
492
- ctx.clip();
493
- },
494
- afterDatasetsDraw: function (chartInstance) {
495
- chartInstance.chart.ctx.restore();
496
- },
497
- destroy: function (chartInstance) {
498
- if (chartInstance.zoom) {
499
- const options = chartInstance.options;
500
- const node = chartInstance.zoom.node;
501
- if (options.zoom && options.zoom.drag) {
502
- node.removeEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
503
- node.removeEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
504
- // node.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
505
- node.ownerDocument.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
506
- }
507
- else {
508
- node.removeEventListener('wheel', chartInstance.zoom._wheelHandler);
509
- }
510
- if (Hammer) {
511
- node.removeEventListener('click', chartInstance.zoom._ghostClickHandler);
512
- }
513
- delete chartInstance.zoom;
514
- const mc = chartInstance._mc;
515
- if (mc) {
516
- mc.remove('pinchstart');
517
- mc.remove('pinch');
518
- mc.remove('pinchend');
519
- mc.remove('panstart');
520
- mc.remove('pan');
521
- mc.remove('panend');
522
- }
523
- }
524
- }
525
- };
526
- Chart.pluginService.register(zoomPlugin);
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuem9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtem9vbS9jaGFydC56b29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsMkRBQTJEO0FBQzNELGtCQUFrQjtBQUVsQiw4QkFBOEI7QUFDOUIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFLLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFFM0YseUJBQXlCO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBRXRGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFFOUIsbUNBQW1DO0FBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFFN0MsMkRBQTJEO0FBQzNELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7QUFDeEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztBQUVyRSx1Q0FBdUM7QUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRztJQUN2QyxHQUFHLEVBQUU7UUFD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TTtnQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMxRTtZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQztZQUUxQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQzdCLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7Q0FDRixDQUFDO0FBRUYsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogdGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tXHJcbiAqIGZvciBmb2xsb3dpbmcgdHdvIG9wZW4gaXNzdWVzOlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tL3B1bGwvMTU1XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL2NoYXJ0anMtcGx1Z2luLXpvb20vcHVsbC8xNTBcclxuICpcclxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpIENvcHlyaWdodCAoYykgMjAxMy0yMDE2IE5pY2sgRG93bmllXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpc1xyXG4gKiBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmVcclxuICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcclxuICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zXHJcbiAqIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3JcclxuICogc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxyXG4gKiBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxyXG4gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcclxuICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcblxyXG4vKmpzbGludCBicm93c2VyOnRydWUsIGRldmVsOnRydWUsIHdoaXRlOnRydWUsIHZhcnM6dHJ1ZSAqL1xyXG4vKmdsb2JhbCByZXF1aXJlKi9cclxuXHJcbi8vIGhhbW1lciBKUyBmb3IgdG91Y2ggc3VwcG9ydFxyXG5pbXBvcnQgKiBhcyBoYW1tZXJqcyBmcm9tICdoYW1tZXJqcyc7XHJcbmNvbnN0IEhhbW1lciA9IHdpbmRvdyAmJiAod2luZG93IGFzIGFueSkuSGFtbWVyID8gKHdpbmRvdyBhcyBhbnkpLkhhbW1lciA6IGhhbW1lcmpzLkhhbW1lcjtcclxuXHJcbi8vIEdldCB0aGUgY2hhcnQgdmFyaWFibGVcclxuaW1wb3J0ICogYXMgY2hhcnRqcyBmcm9tICdjaGFydC5qcyc7XHJcbmNvbnN0IENoYXJ0ID0gd2luZG93ICYmICh3aW5kb3cgYXMgYW55KS5DaGFydCA/ICh3aW5kb3cgYXMgYW55KS5DaGFydCA6IGNoYXJ0anMuQ2hhcnQ7XHJcblxyXG5jb25zdCBoZWxwZXJzID0gQ2hhcnQuaGVscGVycztcclxuXHJcbi8vIFRha2UgdGhlIHpvb20gbmFtZXNwYWNlIG9mIENoYXJ0XHJcbmNvbnN0IHpvb21OUyA9IENoYXJ0Llpvb20gPSBDaGFydC5ab29tIHx8IHt9O1xyXG5cclxuLy8gV2hlcmUgd2Ugc3RvcmUgZnVuY3Rpb25zIHRvIGhhbmRsZSBkaWZmZXJlbnQgc2NhbGUgdHlwZXNcclxuY29uc3Qgem9vbUZ1bmN0aW9ucyA9IHpvb21OUy56b29tRnVuY3Rpb25zID0gem9vbU5TLnpvb21GdW5jdGlvbnMgfHwge307XHJcbmNvbnN0IHBhbkZ1bmN0aW9ucyA9IHpvb21OUy5wYW5GdW5jdGlvbnMgPSB6b29tTlMucGFuRnVuY3Rpb25zIHx8IHt9O1xyXG5cclxuLy8gRGVmYXVsdCBvcHRpb25zIGlmIG5vbmUgYXJlIHByb3ZpZGVkXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0gem9vbU5TLmRlZmF1bHRzID0ge1xyXG4gIHBhbjoge1xyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgIG1vZGU6ICd4eScsXHJcbiAgICBzcGVlZDogMjAsXHJcbiAgICB0aHJlc2hvbGQ6IDEwXHJcbiAgfSxcclxuICB6b29tOiB7XHJcbiAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgbW9kZTogJ3h5JyxcclxuICAgIHNlbnNpdGl2aXR5OiAzXHJcbiAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZGlyZWN0aW9uRW5hYmxlZChtb2RlLCBkaXIpIHtcclxuICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgcmV0dXJuIG1vZGUuaW5kZXhPZihkaXIpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmFuZ2VNYXhMaW1pdGVyKHpvb21QYW5PcHRpb25zLCBuZXdNYXgpIHtcclxuICBpZiAoem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzICYmIHpvb21QYW5PcHRpb25zLnJhbmdlTWF4ICYmXHJcbiAgICAhaGVscGVycy5pc051bGxPclVuZGVmKHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc10pKSB7XHJcbiAgICBjb25zdCByYW5nZU1heCA9IHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc107XHJcbiAgICBpZiAobmV3TWF4ID4gcmFuZ2VNYXgpIHtcclxuICAgICAgbmV3TWF4ID0gcmFuZ2VNYXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBuZXdNYXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJhbmdlTWluTGltaXRlcih6b29tUGFuT3B0aW9ucywgbmV3TWluKSB7XHJcbiAgaWYgKHpvb21QYW5PcHRpb25zLnNjYWxlQXhlcyAmJiB6b29tUGFuT3B0aW9ucy5yYW5nZU1pbiAmJlxyXG4gICAgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZih6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdKSkge1xyXG4gICAgY29uc3QgcmFuZ2VNaW4gPSB6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdO1xyXG4gICAgaWYgKG5ld01pbiA8IHJhbmdlTWluKSB7XHJcbiAgICAgIG5ld01pbiA9IHJhbmdlTWluO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbmV3TWluO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tSW5kZXhTY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IGxhc3RMYWJlbEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcbiAgbGV0IG1heEluZGV4ID0gc2NhbGUubWF4SW5kZXg7XHJcbiAgY29uc3Qgc2Vuc2l0aXZpdHkgPSB6b29tT3B0aW9ucy5zZW5zaXRpdml0eTtcclxuICBjb25zdCBjaGFydENlbnRlciA9ICBzY2FsZS5pc0hvcml6b250YWwoKSA/IHNjYWxlLmxlZnQgKyAoc2NhbGUud2lkdGggLyAyKSA6IHNjYWxlLnRvcCArIChzY2FsZS5oZWlnaHQgLyAyKTtcclxuICBjb25zdCBjZW50ZXJQb2ludGVyID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBjZW50ZXIueCA6IGNlbnRlci55O1xyXG5cclxuICB6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA9IHpvb20gPiAxID8gem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgKyAxIDogem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgLSAxO1xyXG5cclxuICBpZiAoTWF0aC5hYnMoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEpID4gc2Vuc2l0aXZpdHkpIHtcclxuICAgIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA8IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWluSW5kZXggPD0gMCkge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWluSW5kZXggPSBNYXRoLm1heCgwLCBtaW5JbmRleCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjZW50ZXJQb2ludGVyIDwgY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWF4SW5kZXggPj0gbGFzdExhYmVsSW5kZXgpIHtcclxuICAgICAgICAgIG1pbkluZGV4ID0gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA+IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBtaW5JbmRleCA9IG1pbkluZGV4IDwgbWF4SW5kZXggPyBtaW5JbmRleCA9IE1hdGgubWluKG1heEluZGV4LCBtaW5JbmRleCArIDEpIDogbWluSW5kZXg7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2VudGVyUG9pbnRlciA8IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgbWF4SW5kZXggPSBtYXhJbmRleCA+IG1pbkluZGV4ID8gbWF4SW5kZXggPSBNYXRoLm1heChtaW5JbmRleCwgbWF4SW5kZXggLSAxKSA6IG1heEluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgIH1cclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWluID0gcmFuZ2VNaW5MaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWluSW5kZXhdKTtcclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWF4SW5kZXhdKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21UaW1lU2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuXHJcbiAgLy8gdmFyIHJhbmdlO1xyXG4gIC8vIHZhciBtaW5fcGVyY2VudDtcclxuICAvLyBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkpIHtcclxuICAvLyAgIHJhbmdlID0gc2NhbGUucmlnaHQgLSBzY2FsZS5sZWZ0O1xyXG4gIC8vICAgbWluX3BlcmNlbnQgPSAoY2VudGVyLnggLSBzY2FsZS5sZWZ0KSAvIHJhbmdlO1xyXG4gIC8vIH0gZWxzZSB7XHJcbiAgLy8gICByYW5nZSA9IHNjYWxlLmJvdHRvbSAtIHNjYWxlLnRvcDtcclxuICAvLyAgIG1pbl9wZXJjZW50ID0gKGNlbnRlci55IC0gc2NhbGUudG9wKSAvIHJhbmdlO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHZhciBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuICBjb25zdCByYW5nZSA9IHNjYWxlLm1heCAtIHNjYWxlLm1pbjtcclxuICBjb25zdCBuZXdEaWZmID0gcmFuZ2UgKiAoem9vbSAtIDEpO1xyXG5cclxuICBjb25zdCBjdXJzb3JQaXhlbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gY2VudGVyLnggOiBjZW50ZXIueTtcclxuICBjb25zdCBtaW5fcGVyY2VudCA9IChzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKGN1cnNvclBpeGVsKSAtIHNjYWxlLm1pbikgLyByYW5nZTtcclxuICBjb25zdCBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuXHJcbiAgY29uc3QgbWluRGVsdGEgPSBuZXdEaWZmICogbWluX3BlcmNlbnQ7XHJcbiAgY29uc3QgbWF4RGVsdGEgPSBuZXdEaWZmICogbWF4X3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG5ld01pbiA9IHNjYWxlLm1pbiArIG1pbkRlbHRhO1xyXG4gIGNvbnN0IG5ld01heCA9IHNjYWxlLm1heCAtIG1heERlbHRhO1xyXG5cclxuICBjb25zdCBkaWZmTWluTWF4ID0gbmV3TWF4IC0gbmV3TWluO1xyXG4gIGNvbnN0IG1pbkxpbWl0RXhjZWVkZWQgPSByYW5nZU1pbkxpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG4gIGNvbnN0IG1heExpbWl0RXhjZWVkZWQgPSByYW5nZU1heExpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG5cclxuICBpZiAoIW1pbkxpbWl0RXhjZWVkZWQgJiYgIW1heExpbWl0RXhjZWVkZWQpIHtcclxuICAgIG9wdGlvbnMudGltZS5taW4gPSBuZXdNaW47XHJcbiAgICBvcHRpb25zLnRpbWUubWF4ID0gbmV3TWF4O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gem9vbU51bWVyaWNhbFNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKSB7XHJcbiAgY29uc3QgcmFuZ2UgPSBzY2FsZS5tYXggLSBzY2FsZS5taW47XHJcbiAgY29uc3QgbmV3RGlmZiA9IHJhbmdlICogKHpvb20gLSAxKTtcclxuXHJcbiAgY29uc3QgY3Vyc29yUGl4ZWwgPSBzY2FsZS5pc0hvcml6b250YWwoKSA/IGNlbnRlci54IDogY2VudGVyLnk7XHJcbiAgY29uc3QgbWluX3BlcmNlbnQgPSAoc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChjdXJzb3JQaXhlbCkgLSBzY2FsZS5taW4pIC8gcmFuZ2U7XHJcbiAgY29uc3QgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG1pbkRlbHRhID0gbmV3RGlmZiAqIG1pbl9wZXJjZW50O1xyXG4gIGNvbnN0IG1heERlbHRhID0gbmV3RGlmZiAqIG1heF9wZXJjZW50O1xyXG5cclxuICBzY2FsZS5vcHRpb25zLnRpY2tzLm1pbiA9IHJhbmdlTWluTGltaXRlcih6b29tT3B0aW9ucywgc2NhbGUubWluICsgbWluRGVsdGEpO1xyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBzY2FsZS5tYXggLSBtYXhEZWx0YSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gem9vbUZ1bmN0aW9uc1tzY2FsZS5vcHRpb25zLnR5cGVdO1xyXG4gIGlmIChmbikge1xyXG4gICAgZm4oc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9ab29tKGNoYXJ0SW5zdGFuY2UsIHpvb20sIGNlbnRlciwgd2hpY2hBeGVzPykge1xyXG4gIGNvbnN0IGNhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgaWYgKCFjZW50ZXIpIHtcclxuICAgIGNlbnRlciA9IHtcclxuICAgICAgeDogKGNhLmxlZnQgKyBjYS5yaWdodCkgLyAyLFxyXG4gICAgICB5OiAoY2EudG9wICsgY2EuYm90dG9tKSAvIDIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgem9vbU9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnMuem9vbTtcclxuXHJcbiAgaWYgKHpvb21PcHRpb25zICYmIGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoem9vbU9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMuem9vbS5lbmFibGVkKSkge1xyXG4gICAgLy8gRG8gdGhlIHpvb20gaGVyZVxyXG4gICAgY29uc3Qgem9vbU1vZGUgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy56b29tLm1vZGUsIGRlZmF1bHRPcHRpb25zLnpvb20ubW9kZSk7XHJcbiAgICB6b29tT3B0aW9ucy5zZW5zaXRpdml0eSA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoY2hhcnRJbnN0YW5jZS5vcHRpb25zLnpvb20uc2Vuc2l0aXZpdHksIGRlZmF1bHRPcHRpb25zLnpvb20uc2Vuc2l0aXZpdHkpO1xyXG5cclxuICAgIC8vIFdoaWNoIGF4ZSBzaG91bGQgYmUgbW9kaWZpZWQgd2hlbiBmaWdlcnMgd2VyZSB1c2VkLlxyXG4gICAgbGV0IF93aGljaEF4ZXM7XHJcbiAgICBpZiAoem9vbU1vZGUgPT09ICd4eScgJiYgd2hpY2hBeGVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gYmFzZWQgb24gZmluZ2VycyBwb3NpdGlvbnNcclxuICAgICAgX3doaWNoQXhlcyA9IHdoaWNoQXhlcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIG5vIGVmZmVjdFxyXG4gICAgICBfd2hpY2hBeGVzID0gJ3h5JztcclxuICAgIH1cclxuXHJcbiAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlLCBpZCkge1xyXG4gICAgICBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3gnKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd4JykpIHtcclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneCc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3knKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd5JykpIHtcclxuICAgICAgICAvLyBEbyBZIHpvb21cclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneSc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICBpZiAodHlwZW9mIHpvb21PcHRpb25zLm9uWm9vbSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB6b29tT3B0aW9ucy5vblpvb20oKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhbkluZGV4U2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgbGFiZWxzID0gc2NhbGUuY2hhcnQuZGF0YS5sYWJlbHM7XHJcbiAgY29uc3QgbGFzdExhYmVsSW5kZXggPSBsYWJlbHMubGVuZ3RoIC0gMTtcclxuICBjb25zdCBvZmZzZXRBbXQgPSBNYXRoLm1heCgoc2NhbGUudGlja3MubGVuZ3RoIC0gKChzY2FsZS5vcHRpb25zLmdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMpID8gMCA6IDEpKSwgMSk7XHJcbiAgY29uc3QgcGFuU3BlZWQgPSBwYW5PcHRpb25zLnNwZWVkO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IHN0ZXAgPSBNYXRoLnJvdW5kKHNjYWxlLndpZHRoIC8gKG9mZnNldEFtdCAqIHBhblNwZWVkKSk7XHJcbiAgbGV0IG1heEluZGV4O1xyXG5cclxuICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhICs9IGRlbHRhO1xyXG5cclxuICBtaW5JbmRleCA9IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPiBzdGVwID8gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKSA6IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPCAtc3RlcCA/IE1hdGgubWluKGxhc3RMYWJlbEluZGV4IC0gb2Zmc2V0QW10ICsgMSwgbWluSW5kZXggKyAxKSA6IG1pbkluZGV4O1xyXG4gIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSBtaW5JbmRleCAhPT0gc2NhbGUubWluSW5kZXggPyAwIDogem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YTtcclxuXHJcbiAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWluSW5kZXggKyBvZmZzZXRBbXQgLSAxKTtcclxuXHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5taW4gPSByYW5nZU1pbkxpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21pbkluZGV4XSk7XHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5tYXggPSByYW5nZU1heExpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21heEluZGV4XSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblRpbWVTY2FsZShzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuICBjb25zdCBsaW1pdGVkTWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5tYXgpIC0gZGVsdGEpKTtcclxuICBjb25zdCBsaW1pdGVkTWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5taW4pIC0gZGVsdGEpKTtcclxuXHJcbiAgY29uc3QgbGltaXRlZFRpbWVEZWx0YSA9IGRlbHRhIDwgMCA/IGxpbWl0ZWRNYXggLSBzY2FsZS5tYXggOiBsaW1pdGVkTWluIC0gc2NhbGUubWluO1xyXG5cclxuICBvcHRpb25zLnRpbWUubWF4ID0gc2NhbGUubWF4ICsgbGltaXRlZFRpbWVEZWx0YTtcclxuICBvcHRpb25zLnRpbWUubWluID0gc2NhbGUubWluICsgbGltaXRlZFRpbWVEZWx0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFuTnVtZXJpY2FsU2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG4gIGNvbnN0IHN0YXJ0ID0gc2NhbGUuc3RhcnQsXHJcbiAgICBlbmQgPSBzY2FsZS5lbmQ7XHJcblxyXG4gIGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpIC0gZGVsdGEpO1xyXG4gICAgdGlja09wdHMubWluID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKGVuZCkgLSBkZWx0YSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRpY2tPcHRzLm1pbiA9IHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCkgLSBkZWx0YSk7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZW5kKSAtIGRlbHRhKTtcclxuICB9XHJcbiAgdGlja09wdHMubWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1pbik7XHJcbiAgdGlja09wdHMubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1heCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gcGFuRnVuY3Rpb25zW3NjYWxlLm9wdGlvbnMudHlwZV07XHJcbiAgaWYgKGZuKSB7XHJcbiAgICBmbihzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9QYW4oY2hhcnRJbnN0YW5jZSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICBjb25zdCBwYW5PcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zLnBhbjtcclxuICBpZiAocGFuT3B0aW9ucyAmJiBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KHBhbk9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMucGFuLmVuYWJsZWQpKSB7XHJcbiAgICBjb25zdCBwYW5Nb2RlID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMucGFuLm1vZGUsIGRlZmF1bHRPcHRpb25zLnBhbi5tb2RlKTtcclxuICAgIHBhbk9wdGlvbnMuc3BlZWQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy5wYW4uc3BlZWQsIGRlZmF1bHRPcHRpb25zLnBhbi5zcGVlZCk7XHJcblxyXG4gICAgaGVscGVycy5lYWNoKGNoYXJ0SW5zdGFuY2Uuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSwgaWQpIHtcclxuICAgICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQocGFuTW9kZSwgJ3gnKSAmJiBkZWx0YVggIT09IDApIHtcclxuICAgICAgICBwYW5PcHRpb25zLnNjYWxlQXhlcyA9ICd4JztcclxuICAgICAgICBwYW5TY2FsZShzY2FsZSwgZGVsdGFYLCBwYW5PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZChwYW5Nb2RlLCAneScpICYmIGRlbHRhWSAhPT0gMCkge1xyXG4gICAgICAgIHBhbk9wdGlvbnMuc2NhbGVBeGVzID0gJ3knO1xyXG4gICAgICAgIHBhblNjYWxlKHNjYWxlLCBkZWx0YVksIHBhbk9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjaGFydEluc3RhbmNlLnVwZGF0ZSgwKTtcclxuICAgIGlmICh0eXBlb2YgcGFuT3B0aW9ucy5vblBhbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBwYW5PcHRpb25zLm9uUGFuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwb3NpdGlvbkluQ2hhcnRBcmVhKGNoYXJ0SW5zdGFuY2UsIHBvc2l0aW9uKSB7XHJcbiAgcmV0dXJuICAgKHBvc2l0aW9uLnggPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEubGVmdCAmJiBwb3NpdGlvbi54IDw9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLnJpZ2h0KSAmJlxyXG4gICAgKHBvc2l0aW9uLnkgPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEudG9wICYmIHBvc2l0aW9uLnkgPD0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEuYm90dG9tKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSkge1xyXG4gIGNvbnN0IHNjYWxlcyA9IGNoYXJ0SW5zdGFuY2Uuc2NhbGVzO1xyXG5cclxuICBmb3IgKGNvbnN0IHNjYWxlSWQgaW4gc2NhbGVzKSB7XHJcbiAgICBpZiAoc2NhbGVzLmhhc093blByb3BlcnR5KHNjYWxlSWQpKSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVzW3NjYWxlSWRdO1xyXG4gICAgICBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTdG9yZSB0aGVzZSBmb3IgbGF0ZXJcclxuem9vbU5TLnpvb21GdW5jdGlvbnMuY2F0ZWdvcnkgPSB6b29tSW5kZXhTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMudGltZSA9IHpvb21UaW1lU2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmxpbmVhciA9IHpvb21OdW1lcmljYWxTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSB6b29tTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMuY2F0ZWdvcnkgPSBwYW5JbmRleFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLnRpbWUgPSBwYW5UaW1lU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubGluZWFyID0gcGFuTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSBwYW5OdW1lcmljYWxTY2FsZTtcclxuLy8gR2xvYmFscyBmb3IgY2F0ZXJnb3J5IHBhbiBhbmQgem9vbVxyXG56b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG5cclxuLy8gQ2hhcnRqcyBab29tIFBsdWdpblxyXG5leHBvcnQgY29uc3Qgem9vbVBsdWdpbiA9IHtcclxuICBhZnRlckluaXQ6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUpIHtcclxuICAgICAgc2NhbGUub3JpZ2luYWxPcHRpb25zID0gaGVscGVycy5jbG9uZShzY2FsZS5vcHRpb25zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNoYXJ0SW5zdGFuY2UucmVzZXRab29tID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIGlkKSB7XHJcbiAgICAgICAgY29uc3QgdGltZU9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpbWU7XHJcbiAgICAgICAgY29uc3QgdGlja09wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG5cclxuICAgICAgICBpZiAodGltZU9wdGlvbnMpIHtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1pbiA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1pbjtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aWNrT3B0aW9ucykge1xyXG4gICAgICAgICAgdGlja09wdGlvbnMubWluID0gc2NhbGUub3JpZ2luYWxPcHRpb25zLnRpY2tzLm1pbjtcclxuICAgICAgICAgIHRpY2tPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aWNrcy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGlkKSB7XHJcbiAgICAgICAgZGF0YXNldC5fbWV0YSA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoKTtcclxuICAgIH07XHJcblxyXG4gIH0sXHJcbiAgYmVmb3JlSW5pdDogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgY2hhcnRJbnN0YW5jZS56b29tID0ge307XHJcblxyXG4gICAgY29uc3Qgbm9kZSA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5ub2RlID0gY2hhcnRJbnN0YW5jZS5jaGFydC5jdHguY2FudmFzO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnM7XHJcbiAgICBjb25zdCBwYW5UaHJlc2hvbGQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KG9wdGlvbnMucGFuID8gb3B0aW9ucy5wYW4udGhyZXNob2xkIDogdW5kZWZpbmVkLCB6b29tTlMuZGVmYXVsdHMucGFuLnRocmVzaG9sZCk7XHJcbiAgICBpZiAoIW9wdGlvbnMuem9vbSB8fCAhb3B0aW9ucy56b29tLmVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgIC8vIE9ubHkgd2FudCB0byB6b29tIGhvcml6b250YWwgYXhpc1xyXG4gICAgICBvcHRpb25zLnpvb20ubW9kZSA9ICd4JztcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VEb3duSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gZXZlbnQ7XHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZURvd25IYW5kbGVyKTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCkge1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZCA9IGV2ZW50O1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlcik7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICBpZiAoY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0KSB7XHJcbiAgICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydEluc3RhbmNlLmNoYXJ0QXJlYTtcclxuICAgICAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICBjb25zdCBiZWdpblBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0O1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChNYXRoLm1pbihiZWdpblBvaW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFgpIC0gb2Zmc2V0WCwgY2hhcnRBcmVhLmxlZnQpO1xyXG4gICAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKE1hdGgubWF4KGJlZ2luUG9pbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WCkgLSBvZmZzZXRYLCBjaGFydEFyZWEucmlnaHQpO1xyXG4gICAgICAgICAgY29uc3QgZHJhZ0Rpc3RhbmNlID0gZW5kWCAtIHN0YXJ0WDtcclxuICAgICAgICAgIGNvbnN0IGNoYXJ0RGlzdGFuY2UgPSBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdDtcclxuICAgICAgICAgIGNvbnN0IHpvb20gPSAxICsgKGNoYXJ0RGlzdGFuY2UgLSBkcmFnRGlzdGFuY2UpIC8gY2hhcnREaXN0YW5jZTtcclxuICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBjaGFydEFyZWEubGVmdCArIChzdGFydFggLSBjaGFydEFyZWEubGVmdCkgLyAoem9vbSAtIDEpO1xyXG5cclxuICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIHN0YXJ0IGFuZCBlbmQgYmVmb3JlIGNoYXJ0IHVwZGF0ZSB0byBzdG9wIGRyYXdpbmcgc2VsZWN0ZWQgYXJlYVxyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCB6b29tLCB7XHJcbiAgICAgICAgICAgICAgeDogY2VudGVyWCxcclxuICAgICAgICAgICAgICB5OiAoeUF4aXMuYm90dG9tIC0geUF4aXMudG9wKSAvIDIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgLy8gbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXIgPSB7XHJcbiAgICAgICAgICB4IDogb2Zmc2V0WCxcclxuICAgICAgICAgIHkgOiBvZmZzZXRZXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAxLjEsIGNlbnRlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAwLjkwOSwgY2VudGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJldmVudCB0aGUgZXZlbnQgZnJvbSB0cmlnZ2VyaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChlZy4gQ29udGVudCBzY3JvbGxpbmcpLlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgY29uc3QgbWMgPSBuZXcgSGFtbWVyLk1hbmFnZXIobm9kZSk7XHJcbiAgICAgIG1jLmFkZChuZXcgSGFtbWVyLlBpbmNoKCkpO1xyXG4gICAgICBtYy5hZGQobmV3IEhhbW1lci5QYW4oe1xyXG4gICAgICAgIHRocmVzaG9sZDogcGFuVGhyZXNob2xkXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEhhbW1lciByZXBvcnRzIHRoZSB0b3RhbCBzY2FsaW5nLiBXZSBuZWVkIHRoZSBpbmNyZW1lbnRhbCBhbW91bnRcclxuICAgICAgbGV0IGN1cnJlbnRQaW5jaFNjYWxpbmc7XHJcbiAgICAgIGNvbnN0IGhhbmRsZVBpbmNoID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBjb25zdCBkaWZmID0gMSAvIChjdXJyZW50UGluY2hTY2FsaW5nKSAqIGUuc2NhbGU7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBlLmNlbnRlci54IC0gcmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBlLmNlbnRlci55IC0gcmVjdC50b3A7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xyXG4gICAgICAgICAgeCA6IG9mZnNldFgsXHJcbiAgICAgICAgICB5IDogb2Zmc2V0WVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIGZpbmdlcnMgcG9zaXRpb24gZGlmZmVyZW5jZVxyXG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFggLSBlLnBvaW50ZXJzWzFdLmNsaWVudFgpO1xyXG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFkgLSBlLnBvaW50ZXJzWzFdLmNsaWVudFkpO1xyXG5cclxuICAgICAgICAvLyBkaWFnb25hbCBmaW5nZXJzIHdpbGwgY2hhbmdlIGJvdGggKHh5KSBheGVzXHJcbiAgICAgICAgY29uc3QgcCA9IHggLyB5O1xyXG4gICAgICAgIGxldCB4eTtcclxuICAgICAgICBpZiAocCA+IDAuMyAmJiBwIDwgMS43KSB7XHJcbiAgICAgICAgICB4eSA9ICd4eSc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh4ID4geSkge1xyXG4gICAgICAgICAgLy8geCBheGlzXHJcbiAgICAgICAgICB4eSA9ICd4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8geSBheGlzXHJcbiAgICAgICAgICB4eSA9ICd5JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCBkaWZmLCBjZW50ZXIsIHh5KTtcclxuXHJcbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdmVyYWxsIHNjYWxlXHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IGUuc2NhbGU7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGluY2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjdXJyZW50UGluY2hTY2FsaW5nID0gMTsgLy8gcmVzZXQgdHJhY2tlclxyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3BpbmNoJywgaGFuZGxlUGluY2gpO1xyXG4gICAgICBtYy5vbigncGluY2hlbmQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgaGFuZGxlUGluY2goZSk7XHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IG51bGw7IC8vIHJlc2V0XHJcbiAgICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50RGVsdGFYID0gbnVsbCwgY3VycmVudERlbHRhWSA9IG51bGwsIHBhbm5pbmcgPSBmYWxzZTtcclxuICAgICAgY29uc3QgaGFuZGxlUGFuID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoY3VycmVudERlbHRhWCAhPT0gbnVsbCAmJiBjdXJyZW50RGVsdGFZICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBwYW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IGUuZGVsdGFYIC0gY3VycmVudERlbHRhWDtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGUuZGVsdGFZIC0gY3VycmVudERlbHRhWTtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVggPSBlLmRlbHRhWDtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVkgPSBlLmRlbHRhWTtcclxuICAgICAgICAgIGRvUGFuKGNoYXJ0SW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGFuc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY3VycmVudERlbHRhWCA9IDA7XHJcbiAgICAgICAgY3VycmVudERlbHRhWSA9IDA7XHJcbiAgICAgICAgaGFuZGxlUGFuKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3Bhbm1vdmUnLCBoYW5kbGVQYW4pO1xyXG4gICAgICBtYy5vbigncGFuZW5kJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVggPSBudWxsO1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVkgPSBudWxsO1xyXG4gICAgICAgIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHBhbm5pbmcgPSBmYWxzZTsgfSwgNTAwKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX2dob3N0Q2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmIChwYW5uaW5nKSB7XHJcbiAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZ2hvc3RDbGlja0hhbmRsZXIpO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS5fbWMgPSBtYztcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBiZWZvcmVEYXRhc2V0c0RyYXc6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGN0eCA9IGNoYXJ0SW5zdGFuY2UuY2hhcnQuY3R4O1xyXG4gICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgICBjdHguc2F2ZSgpO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tRW5kKSB7XHJcbiAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgIGNvbnN0IGJlZ2luUG9pbnQgPSBjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tU3RhcnQ7XHJcbiAgICAgIGNvbnN0IGVuZFBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZDtcclxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWluKGJlZ2luUG9pbnQuY2xpZW50WCwgZW5kUG9pbnQuY2xpZW50WCkgLSBvZmZzZXRYO1xyXG4gICAgICBjb25zdCBlbmRYID0gTWF0aC5tYXgoYmVnaW5Qb2ludC5jbGllbnRYLCBlbmRQb2ludC5jbGllbnRYKSAtIG9mZnNldFg7XHJcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9IGVuZFggLSBzdGFydFg7XHJcblxyXG5cclxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDIyNSwyMjUsMjI1LDAuNSknO1xyXG4gICAgICBjdHgubGluZVdpZHRoID0gNTtcclxuICAgICAgY3R4LmZpbGxSZWN0KHN0YXJ0WCwgeUF4aXMudG9wLCByZWN0V2lkdGgsIHlBeGlzLmJvdHRvbSAtIHlBeGlzLnRvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnJlY3QoY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS50b3AsIGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XHJcbiAgICBjdHguY2xpcCgpO1xyXG4gIH0sXHJcblxyXG4gIGFmdGVyRGF0YXNldHNEcmF3OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBjaGFydEluc3RhbmNlLmNoYXJ0LmN0eC5yZXN0b3JlKCk7XHJcbiAgfSxcclxuXHJcbiAgZGVzdHJveTogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbSkge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zO1xyXG4gICAgICBjb25zdCBub2RlID0gY2hhcnRJbnN0YW5jZS56b29tLm5vZGU7XHJcblxyXG4gICAgICBpZiAob3B0aW9ucy56b29tICYmIG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlRG93bkhhbmRsZXIpO1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZU1vdmVIYW5kbGVyKTtcclxuICAgICAgICAvLyBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyKTtcclxuICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hhcnRJbnN0YW5jZS56b29tLl9naG9zdENsaWNrSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlbGV0ZSBjaGFydEluc3RhbmNlLnpvb207XHJcblxyXG4gICAgICBjb25zdCBtYyA9IGNoYXJ0SW5zdGFuY2UuX21jO1xyXG4gICAgICBpZiAobWMpIHtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoJyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaGVuZCcpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbicpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuZW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5DaGFydC5wbHVnaW5TZXJ2aWNlLnJlZ2lzdGVyKHpvb21QbHVnaW4pO1xyXG4iXX0=
@@ -1,2 +0,0 @@
1
- export * from './chart.zoom';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLXpvb20vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NoYXJ0Lnpvb20nO1xyXG4iXX0=