@net7/components 3.0.2-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/components/advanced-autocomplete/advanced-autocomplete.mjs +25 -0
  3. package/esm2020/lib/components/advanced-autocomplete/advanced-autocomplete.mock.mjs +100 -0
  4. package/esm2020/lib/components/alert/alert.mjs +24 -0
  5. package/esm2020/lib/components/alert/alert.mock.mjs +11 -0
  6. package/esm2020/lib/components/anchor-wrapper/anchor-wrapper.mjs +35 -0
  7. package/esm2020/lib/components/breadcrumbs/breadcrumbs.mjs +25 -0
  8. package/esm2020/lib/components/breadcrumbs/breadcrumbs.mock.mjs +25 -0
  9. package/esm2020/lib/components/bubble-chart/bubble-chart.mjs +315 -0
  10. package/esm2020/lib/components/bubble-chart/bubble-chart.mock.mjs +4025 -0
  11. package/esm2020/lib/components/carousel/carousel.mjs +89 -0
  12. package/esm2020/lib/components/carousel/carousel.mock.mjs +135 -0
  13. package/esm2020/lib/components/chart/chart.mjs +37 -0
  14. package/esm2020/lib/components/chart/chart.mock.mjs +112 -0
  15. package/esm2020/lib/components/content-placeholder/content-placeholder.mjs +17 -0
  16. package/esm2020/lib/components/content-placeholder/content-placeholder.mock.mjs +13 -0
  17. package/esm2020/lib/components/data-widget/data-widget.mjs +29 -0
  18. package/esm2020/lib/components/data-widget/data-widget.mock.mjs +13 -0
  19. package/esm2020/lib/components/datepicker/datepicker.mjs +44 -0
  20. package/esm2020/lib/components/datepicker/datepicker.mock.mjs +8 -0
  21. package/esm2020/lib/components/facet/facet.mjs +24 -0
  22. package/esm2020/lib/components/facet/facet.mock.mjs +103 -0
  23. package/esm2020/lib/components/facet-header/facet-header.mjs +24 -0
  24. package/esm2020/lib/components/facet-header/facet-header.mock.mjs +9 -0
  25. package/esm2020/lib/components/facet-year-range/facet-year-range.mjs +53 -0
  26. package/esm2020/lib/components/facet-year-range/facet-year-range.mock.mjs +30 -0
  27. package/esm2020/lib/components/footer/footer.mjs +25 -0
  28. package/esm2020/lib/components/footer/footer.mock.mjs +48 -0
  29. package/esm2020/lib/components/header/header.mjs +51 -0
  30. package/esm2020/lib/components/header/header.mock.mjs +83 -0
  31. package/esm2020/lib/components/hero/hero.mjs +41 -0
  32. package/esm2020/lib/components/hero/hero.mock.mjs +25 -0
  33. package/esm2020/lib/components/histogram-range/histogram-range.mjs +376 -0
  34. package/esm2020/lib/components/histogram-range/histogram-range.mock.mjs +243 -0
  35. package/esm2020/lib/components/image-viewer/image-viewer.mjs +55 -0
  36. package/esm2020/lib/components/image-viewer/image-viewer.mock.mjs +25 -0
  37. package/esm2020/lib/components/image-viewer-tools/image-viewer-tools.mjs +28 -0
  38. package/esm2020/lib/components/image-viewer-tools/image-viewer-tools.mock.mjs +54 -0
  39. package/esm2020/lib/components/inner-title/inner-title.mjs +40 -0
  40. package/esm2020/lib/components/inner-title/inner-title.mock.mjs +52 -0
  41. package/esm2020/lib/components/input-checkbox/input-checkbox.mjs +24 -0
  42. package/esm2020/lib/components/input-checkbox/input-checkbox.mock.mjs +25 -0
  43. package/esm2020/lib/components/input-link/input-link.mjs +24 -0
  44. package/esm2020/lib/components/input-link/input-link.mock.mjs +38 -0
  45. package/esm2020/lib/components/input-select/input-select.mjs +24 -0
  46. package/esm2020/lib/components/input-select/input-select.mock.mjs +12 -0
  47. package/esm2020/lib/components/input-text/input-text.mjs +24 -0
  48. package/esm2020/lib/components/input-text/input-text.mock.mjs +13 -0
  49. package/esm2020/lib/components/item-preview/item-preview.mjs +25 -0
  50. package/esm2020/lib/components/item-preview/item-preview.mock.mjs +43 -0
  51. package/esm2020/lib/components/loader/loader.mjs +16 -0
  52. package/esm2020/lib/components/loader/loader.mock.mjs +4 -0
  53. package/esm2020/lib/components/map/map.mjs +64 -0
  54. package/esm2020/lib/components/map/map.mock.mjs +25 -0
  55. package/esm2020/lib/components/metadata-viewer/metadata-viewer.mjs +19 -0
  56. package/esm2020/lib/components/metadata-viewer/metadata-viewer.mock.mjs +74 -0
  57. package/esm2020/lib/components/nav/nav.mjs +22 -0
  58. package/esm2020/lib/components/nav/nav.mock.mjs +29 -0
  59. package/esm2020/lib/components/pagination/pagination.mjs +31 -0
  60. package/esm2020/lib/components/pagination/pagination.mock.mjs +23 -0
  61. package/esm2020/lib/components/progress-line/progress-line.mjs +19 -0
  62. package/esm2020/lib/components/progress-line/progress-line.mock.mjs +5 -0
  63. package/esm2020/lib/components/sidebar-header/sidebar-header.mjs +24 -0
  64. package/esm2020/lib/components/sidebar-header/sidebar-header.mock.mjs +9 -0
  65. package/esm2020/lib/components/signup/signup.mjs +44 -0
  66. package/esm2020/lib/components/signup/signup.mock.mjs +106 -0
  67. package/esm2020/lib/components/simple-autocomplete/simple-autocomplete.mjs +25 -0
  68. package/esm2020/lib/components/simple-autocomplete/simple-autocomplete.mock.mjs +15 -0
  69. package/esm2020/lib/components/table/table.mjs +35 -0
  70. package/esm2020/lib/components/table/table.mock.mjs +152 -0
  71. package/esm2020/lib/components/tag/tag.mjs +24 -0
  72. package/esm2020/lib/components/tag/tag.mock.mjs +8 -0
  73. package/esm2020/lib/components/text-viewer/text-viewer.mjs +37 -0
  74. package/esm2020/lib/components/text-viewer/text-viewer.mock.mjs +39 -0
  75. package/esm2020/lib/components/timeline/timeline.mjs +51 -0
  76. package/esm2020/lib/components/timeline/timeline.mock.mjs +137 -0
  77. package/esm2020/lib/components/toast/toast.mjs +24 -0
  78. package/esm2020/lib/components/toast/toast.mock.mjs +47 -0
  79. package/esm2020/lib/components/tooltip-content/tooltip-content.mjs +25 -0
  80. package/esm2020/lib/components/tooltip-content/tooltip-content.mock.mjs +19 -0
  81. package/esm2020/lib/components/tree/tree.mjs +25 -0
  82. package/esm2020/lib/components/tree/tree.mock.mjs +274 -0
  83. package/esm2020/lib/components/wizard/wizard.mjs +24 -0
  84. package/esm2020/lib/components/wizard/wizard.mock.mjs +29 -0
  85. package/esm2020/lib/dv-components-lib.module.mjs +191 -0
  86. package/esm2020/lib/shared-interfaces.mjs +2 -0
  87. package/esm2020/net7-components.mjs +5 -0
  88. package/esm2020/public-api.mjs +93 -0
  89. package/fesm2015/net7-components.mjs +8154 -0
  90. package/fesm2015/net7-components.mjs.map +1 -0
  91. package/fesm2020/net7-components.mjs +8168 -0
  92. package/fesm2020/net7-components.mjs.map +1 -0
  93. package/lib/components/advanced-autocomplete/advanced-autocomplete.d.ts +57 -0
  94. package/lib/components/advanced-autocomplete/advanced-autocomplete.mock.d.ts +2 -0
  95. package/lib/components/alert/alert.d.ts +46 -0
  96. package/lib/components/alert/alert.mock.d.ts +2 -0
  97. package/lib/components/anchor-wrapper/anchor-wrapper.d.ts +16 -0
  98. package/lib/components/breadcrumbs/breadcrumbs.d.ts +50 -0
  99. package/lib/components/breadcrumbs/breadcrumbs.mock.d.ts +2 -0
  100. package/lib/components/bubble-chart/bubble-chart.d.ts +108 -0
  101. package/lib/components/bubble-chart/bubble-chart.mock.d.ts +2 -0
  102. package/lib/components/carousel/carousel.d.ts +166 -0
  103. package/lib/components/carousel/carousel.mock.d.ts +2 -0
  104. package/lib/components/chart/chart.d.ts +46 -0
  105. package/lib/components/chart/chart.mock.d.ts +2 -0
  106. package/lib/components/content-placeholder/content-placeholder.d.ts +28 -0
  107. package/lib/components/content-placeholder/content-placeholder.mock.d.ts +2 -0
  108. package/lib/components/data-widget/data-widget.d.ts +50 -0
  109. package/lib/components/data-widget/data-widget.mock.d.ts +2 -0
  110. package/lib/components/datepicker/datepicker.d.ts +43 -0
  111. package/lib/components/datepicker/datepicker.mock.d.ts +2 -0
  112. package/lib/components/facet/facet.d.ts +129 -0
  113. package/lib/components/facet/facet.mock.d.ts +2 -0
  114. package/lib/components/facet-header/facet-header.d.ts +44 -0
  115. package/lib/components/facet-header/facet-header.mock.d.ts +2 -0
  116. package/lib/components/facet-year-range/facet-year-range.d.ts +83 -0
  117. package/lib/components/facet-year-range/facet-year-range.mock.d.ts +2 -0
  118. package/lib/components/footer/footer.d.ts +118 -0
  119. package/lib/components/footer/footer.mock.d.ts +2 -0
  120. package/lib/components/header/header.d.ts +281 -0
  121. package/lib/components/header/header.mock.d.ts +2 -0
  122. package/lib/components/hero/hero.d.ts +75 -0
  123. package/lib/components/hero/hero.mock.d.ts +2 -0
  124. package/lib/components/histogram-range/histogram-range.d.ts +113 -0
  125. package/lib/components/histogram-range/histogram-range.mock.d.ts +2 -0
  126. package/lib/components/image-viewer/image-viewer.d.ts +61 -0
  127. package/lib/components/image-viewer/image-viewer.mock.d.ts +2 -0
  128. package/lib/components/image-viewer-tools/image-viewer-tools.d.ts +116 -0
  129. package/lib/components/image-viewer-tools/image-viewer-tools.mock.d.ts +2 -0
  130. package/lib/components/inner-title/inner-title.d.ts +61 -0
  131. package/lib/components/inner-title/inner-title.mock.d.ts +2 -0
  132. package/lib/components/input-checkbox/input-checkbox.d.ts +67 -0
  133. package/lib/components/input-checkbox/input-checkbox.mock.d.ts +2 -0
  134. package/lib/components/input-link/input-link.d.ts +54 -0
  135. package/lib/components/input-link/input-link.mock.d.ts +2 -0
  136. package/lib/components/input-select/input-select.d.ts +67 -0
  137. package/lib/components/input-select/input-select.mock.d.ts +2 -0
  138. package/lib/components/input-text/input-text.d.ts +81 -0
  139. package/lib/components/input-text/input-text.mock.d.ts +2 -0
  140. package/lib/components/item-preview/item-preview.d.ts +93 -0
  141. package/lib/components/item-preview/item-preview.mock.d.ts +2 -0
  142. package/lib/components/loader/loader.d.ts +22 -0
  143. package/lib/components/loader/loader.mock.d.ts +2 -0
  144. package/lib/components/map/map.d.ts +69 -0
  145. package/lib/components/map/map.mock.d.ts +2 -0
  146. package/lib/components/metadata-viewer/metadata-viewer.d.ts +65 -0
  147. package/lib/components/metadata-viewer/metadata-viewer.mock.d.ts +8 -0
  148. package/lib/components/nav/nav.d.ts +66 -0
  149. package/lib/components/nav/nav.mock.d.ts +2 -0
  150. package/lib/components/pagination/pagination.d.ts +94 -0
  151. package/lib/components/pagination/pagination.mock.d.ts +2 -0
  152. package/lib/components/progress-line/progress-line.d.ts +23 -0
  153. package/lib/components/progress-line/progress-line.mock.d.ts +2 -0
  154. package/lib/components/sidebar-header/sidebar-header.d.ts +44 -0
  155. package/lib/components/sidebar-header/sidebar-header.mock.d.ts +2 -0
  156. package/lib/components/signup/signup.d.ts +109 -0
  157. package/lib/components/signup/signup.mock.d.ts +2 -0
  158. package/lib/components/simple-autocomplete/simple-autocomplete.d.ts +40 -0
  159. package/lib/components/simple-autocomplete/simple-autocomplete.mock.d.ts +2 -0
  160. package/lib/components/table/table.d.ts +89 -0
  161. package/lib/components/table/table.mock.d.ts +2 -0
  162. package/lib/components/tag/tag.d.ts +45 -0
  163. package/lib/components/tag/tag.mock.d.ts +2 -0
  164. package/lib/components/text-viewer/text-viewer.d.ts +34 -0
  165. package/lib/components/text-viewer/text-viewer.mock.d.ts +2 -0
  166. package/lib/components/timeline/timeline.d.ts +30 -0
  167. package/lib/components/timeline/timeline.mock.d.ts +2 -0
  168. package/lib/components/toast/toast.d.ts +84 -0
  169. package/lib/components/toast/toast.mock.d.ts +2 -0
  170. package/lib/components/tooltip-content/tooltip-content.d.ts +24 -0
  171. package/lib/components/tooltip-content/tooltip-content.mock.d.ts +2 -0
  172. package/lib/components/tree/tree.d.ts +79 -0
  173. package/lib/components/tree/tree.mock.d.ts +2 -0
  174. package/lib/components/wizard/wizard.d.ts +57 -0
  175. package/lib/components/wizard/wizard.mock.d.ts +2 -0
  176. package/lib/dv-components-lib.module.d.ts +50 -0
  177. package/lib/shared-interfaces.d.ts +60 -0
  178. package/net7-components.d.ts +5 -0
  179. package/package.json +44 -0
  180. package/public-api.d.ts +85 -0
  181. package/src/lib/styles/_imports.scss +77 -0
  182. package/src/lib/styles/atoms/_button.scss +205 -0
  183. package/src/lib/styles/components/_advanced-autocomplete.scss +190 -0
  184. package/src/lib/styles/components/_alert.scss +115 -0
  185. package/src/lib/styles/components/_anchor-wrapper.scss +29 -0
  186. package/src/lib/styles/components/_breadcrumbs.scss +99 -0
  187. package/src/lib/styles/components/_bubble-chart.scss +33 -0
  188. package/src/lib/styles/components/_carousel.scss +184 -0
  189. package/src/lib/styles/components/_chart.scss +28 -0
  190. package/src/lib/styles/components/_content-placeholder.scss +74 -0
  191. package/src/lib/styles/components/_data-widget.scss +93 -0
  192. package/src/lib/styles/components/_datepicker.scss +29 -0
  193. package/src/lib/styles/components/_facet-header.scss +58 -0
  194. package/src/lib/styles/components/_facet-year-range.scss +63 -0
  195. package/src/lib/styles/components/_facet.scss +164 -0
  196. package/src/lib/styles/components/_footer.scss +116 -0
  197. package/src/lib/styles/components/_header.scss +474 -0
  198. package/src/lib/styles/components/_hero.scss +207 -0
  199. package/src/lib/styles/components/_histogram-range.scss +36 -0
  200. package/src/lib/styles/components/_image-viewer-tools.scss +225 -0
  201. package/src/lib/styles/components/_image-viewer.scss +173 -0
  202. package/src/lib/styles/components/_inner-title.scss +161 -0
  203. package/src/lib/styles/components/_input-checkbox.scss +50 -0
  204. package/src/lib/styles/components/_input-link.scss +78 -0
  205. package/src/lib/styles/components/_input-select.scss +25 -0
  206. package/src/lib/styles/components/_input-text.scss +53 -0
  207. package/src/lib/styles/components/_item-preview.scss +218 -0
  208. package/src/lib/styles/components/_loader.scss +54 -0
  209. package/src/lib/styles/components/_map.scss +31 -0
  210. package/src/lib/styles/components/_metadata-viewer.scss +52 -0
  211. package/src/lib/styles/components/_nav.scss +57 -0
  212. package/src/lib/styles/components/_pagination.scss +170 -0
  213. package/src/lib/styles/components/_progress-line.scss +53 -0
  214. package/src/lib/styles/components/_sidebar-header.scss +69 -0
  215. package/src/lib/styles/components/_signup.scss +157 -0
  216. package/src/lib/styles/components/_simple-autocomplete.scss +60 -0
  217. package/src/lib/styles/components/_table.scss +129 -0
  218. package/src/lib/styles/components/_tag.scss +51 -0
  219. package/src/lib/styles/components/_text-viewer.scss +446 -0
  220. package/src/lib/styles/components/_timeline.scss +29 -0
  221. package/src/lib/styles/components/_toast.scss +99 -0
  222. package/src/lib/styles/components/_tooltip-content.scss +29 -0
  223. package/src/lib/styles/components/_tree.scss +208 -0
  224. package/src/lib/styles/components/_wizard.scss +150 -0
  225. package/src/lib/styles/generic/_color_scheme.scss +27 -0
  226. package/src/lib/styles/generic/_mixins.scss +81 -0
  227. package/src/lib/styles/generic/_variables.scss +385 -0
  228. package/src/lib/styles/global/_forms.scss +122 -0
  229. package/src/lib/styles/global/_global.scss +46 -0
  230. package/src/lib/styles/global/_normalize.scss +433 -0
  231. package/src/lib/styles/global/_typography.scss +88 -0
  232. package/src/lib/styles/utilities/_grids.scss +361 -0
@@ -0,0 +1,376 @@
1
+ /* eslint-disable no-use-before-define */
2
+ //---------------------------
3
+ // HISTOGRAM-RANGE.ts
4
+ //---------------------------
5
+ import { Component, Input } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ export class HistogramRangeComponent {
9
+ constructor() {
10
+ this.sliders = [];
11
+ this._loaded = false;
12
+ this.draw = () => {
13
+ const { d3 } = this;
14
+ const { width, margin, height, items, colours, containerId, axis, setSliders } = this.data;
15
+ // data validation
16
+ const rangeMode = items.every((d) => d.range);
17
+ if (!rangeMode && items.some((d) => !d.range)) {
18
+ throw Error('All items must have the "range" property');
19
+ }
20
+ // Helpers - Start:
21
+ const LABELtoX = d3
22
+ .scaleBand()
23
+ .domain(items.map((d) => d.label))
24
+ .range([0, width])
25
+ .paddingInner(0.17)
26
+ .paddingOuter(1);
27
+ const XtoLABEL = (value) => {
28
+ const domain = LABELtoX.domain();
29
+ const paddingOuter = LABELtoX(domain[0]);
30
+ const eachBand = LABELtoX.step();
31
+ const index = Math.floor(((value - paddingOuter) / eachBand));
32
+ return domain[Math.max(0, Math.min(index, domain.length - 1))];
33
+ };
34
+ // YEAR SELECTION CIRCLES
35
+ // let sliders;
36
+ if (setSliders && this.sliders) {
37
+ this.sliders = setSliders
38
+ .map((d) => ({ x: LABELtoX(d) + LABELtoX.bandwidth() / 2, y: height }));
39
+ }
40
+ else {
41
+ this.sliders = d3
42
+ .extent(items, (d) => d.label)
43
+ .map((d) => ({ x: LABELtoX(d) + LABELtoX.bandwidth() / 2, y: height }));
44
+ }
45
+ const isInRange = (y) => {
46
+ const allItems = this.sliders.map((d) => XtoLABEL(d.x));
47
+ if (y >= d3.min(allItems) && y <= d3.max(allItems))
48
+ return true;
49
+ return false;
50
+ };
51
+ function colourBars(d) {
52
+ if (isInRange(d.label))
53
+ return 'url(#gradient)';
54
+ return '#e3e3e3';
55
+ }
56
+ this.colourBars = colourBars;
57
+ this.getSelectedRange = () => {
58
+ const rangeStart = items.find((it) => it.label === XtoLABEL(this.sliders[0].x));
59
+ const rangeEnd = items.find((it) => it.label === XtoLABEL(this.sliders[1].x));
60
+ return [
61
+ rangeStart.payload,
62
+ rangeMode
63
+ ? rangeEnd.range.payload
64
+ : rangeEnd.payload
65
+ ];
66
+ };
67
+ // Helpers - End.
68
+ // clear HTML contents
69
+ document.getElementById(containerId).innerHTML = '';
70
+ const svg = d3
71
+ .select(`#${containerId}`)
72
+ .attr('viewBox', `0 0 ${width + margin.left + margin.right} ${height + margin.top + margin.bottom}`);
73
+ const scaleHeight = d3
74
+ .scaleSymlog() // most similar scale to the original
75
+ .domain([0, d3.max(items, (d) => d.value)])
76
+ .range([height, 0]);
77
+ // GRADIENT
78
+ const defs = svg.append('defs'); // definitions
79
+ const gradient = defs
80
+ .append('linearGradient')
81
+ .attr('id', 'gradient')
82
+ .attr('gradientUnits', 'userSpaceOnUse')
83
+ .attr('x1', 0)
84
+ .attr('y1', height)
85
+ .attr('x2', 0)
86
+ .attr('y2', margin.top);
87
+ gradient
88
+ .append('stop')
89
+ .attr('class', 'start')
90
+ .attr('offset', '0%')
91
+ .attr('stop-color', colours.bottom) // bottom gradient
92
+ .attr('stop-opacity', 1);
93
+ gradient
94
+ .append('stop')
95
+ .attr('class', 'end')
96
+ .attr('offset', '100%')
97
+ .attr('stop-color', colours.top) // top gradient
98
+ .attr('stop-opacity', 1);
99
+ // DRAW INSIDE MARGINS
100
+ const g = svg
101
+ .append('g')
102
+ .attr('class', 'chart')
103
+ .attr('transform', `translate(${margin.left},${margin.top})`);
104
+ const barsLayer = g.append('g').attr('class', 'bars');
105
+ const controlsLayer = g.append('g').attr('class', 'controls');
106
+ // BAR CHART
107
+ barsLayer // bars
108
+ .selectAll('rect.bars')
109
+ .data(items)
110
+ .join('rect')
111
+ .attr('class', 'bars')
112
+ .attr('width', LABELtoX.bandwidth)
113
+ .attr('height', (d) => height - scaleHeight(d.value))
114
+ .attr('y', (d) => scaleHeight(d.value))
115
+ .attr('x', (d) => LABELtoX(d.label))
116
+ .attr('data-start', (d) => d.payload) // make the data easily accessible
117
+ .attr('data-end', (d) => (d.range ? d.range.payload : d.payload))
118
+ .attr('fill', 'url(#gradient)');
119
+ barsLayer // catch bar events
120
+ .on('mousemove', (event) => {
121
+ const year = XtoLABEL(event.offsetX - margin.left);
122
+ d3.selectAll('rect.bars').attr('fill', (d) => {
123
+ if (year === d.label)
124
+ return '#B0CCF8';
125
+ return colourBars(d);
126
+ });
127
+ })
128
+ .on('mouseout', () => {
129
+ d3.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
130
+ })
131
+ .on('click', (event) => {
132
+ const label = XtoLABEL(event.offsetX - margin.left);
133
+ const xAxisValue = LABELtoX(label) + LABELtoX.bandwidth() / 2;
134
+ const newValue = {
135
+ x: xAxisValue,
136
+ y: height
137
+ };
138
+ this.sliders = [
139
+ // avoid joining the two objects!
140
+ { ...newValue },
141
+ { ...newValue }
142
+ ];
143
+ rangePicker
144
+ .data(this.sliders)
145
+ .select('circle')
146
+ .transition()
147
+ .ease(d3.easeQuadOut)
148
+ .duration(550)
149
+ .attr('cx', (d) => d.x);
150
+ controlsLayer
151
+ .select('path.blueline')
152
+ .transition()
153
+ .ease(d3.easeQuadOut)
154
+ .duration(550)
155
+ .attr('d', d3.line()(this.sliders.map((d) => [d.x, d.y])));
156
+ controlsLayer
157
+ .selectAll('text')
158
+ .transition()
159
+ .ease(d3.easeQuadOut)
160
+ .duration(550)
161
+ .attr('x', () => xAxisValue)
162
+ .text((d, i) => {
163
+ if (!rangeMode)
164
+ return label;
165
+ const item = items.find((it) => it.label === label);
166
+ if (i > 0)
167
+ return item.range.label;
168
+ return item.label;
169
+ });
170
+ g.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
171
+ this.textCollision(this.sliders);
172
+ this.emit('rangeselected', this.getSelectedRange());
173
+ });
174
+ controlsLayer // gray line
175
+ .append('path')
176
+ .attr('class', 'grayline')
177
+ .attr('d', d3.line()([
178
+ [0, height],
179
+ [width, height]
180
+ ]))
181
+ .attr('stroke-width', 2)
182
+ .attr('opacity', 1)
183
+ .attr('stroke', '#C1C5C7');
184
+ controlsLayer // blue line
185
+ .append('path')
186
+ .attr('class', 'blueline')
187
+ .attr('d', d3.line()(this.sliders.map((d) => [d.x, d.y])))
188
+ .attr('stroke-width', 2)
189
+ .attr('stroke', colours.accent);
190
+ const rangePicker = controlsLayer
191
+ .selectAll('g.rangepicker')
192
+ .data(this.sliders.sort((a, b) => d3.ascending(a.x, b.x)))
193
+ .join('g')
194
+ .attr('class', 'rangepicker');
195
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
196
+ const self = this; // FIXME: Allow use of class "this" inside dragging update;
197
+ /**
198
+ * Animate the elements while the user is dragging one of the range selectors
199
+ */
200
+ function draggingUpdate(event, data) {
201
+ const label = XtoLABEL(event.x);
202
+ const xAxisValue = LABELtoX(label) + LABELtoX.bandwidth() / 2;
203
+ const yb = [];
204
+ g.selectAll('circle').each(function setBallPosition() {
205
+ yb.push({ x: +d3.select(this).attr('cx'), y: height });
206
+ });
207
+ self.sliders = yb.sort((a, b) => d3.ascending(a.x, b.x));
208
+ // move the circle
209
+ d3.select(this)
210
+ .select('circle')
211
+ .attr('cx', data.x = xAxisValue);
212
+ // move the blue line
213
+ controlsLayer
214
+ .select('path.blueline')
215
+ .attr('d', d3.line()(self.sliders.map((d) => [d.x, d.y])));
216
+ // change the text position
217
+ d3.select(this)
218
+ .select('text')
219
+ .attr('x', () => xAxisValue);
220
+ // change the text values
221
+ controlsLayer
222
+ .selectAll('text')
223
+ .text((d) => {
224
+ const l = XtoLABEL(d.x);
225
+ if (!rangeMode)
226
+ return l;
227
+ const position = self.sliders.findIndex((slider) => slider.x === d.x);
228
+ const range = self.getSelectedRange();
229
+ if (position === 1)
230
+ return range[1];
231
+ return range[0];
232
+ });
233
+ self.textCollision(self.sliders);
234
+ // colour the bars
235
+ g.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
236
+ }
237
+ rangePicker // drag handler
238
+ .call(d3.drag()
239
+ .on('drag', draggingUpdate)
240
+ .on('end', (event, data) => {
241
+ // update one last time to prevent desyncing
242
+ draggingUpdate(event, data);
243
+ // emit the selected range
244
+ this.emit('rangeselected', this.getSelectedRange());
245
+ }));
246
+ rangePicker
247
+ .append('circle')
248
+ .attr('cx', (d) => d.x)
249
+ .attr('cy', (d) => d.y)
250
+ .attr('r', 9)
251
+ .attr('fill', 'white')
252
+ .attr('stroke-width', 2)
253
+ .attr('stroke', colours.accent)
254
+ .attr('style', 'cursor: pointer');
255
+ rangePicker
256
+ .attr('text-anchor', 'middle')
257
+ .attr('font-family', 'Roboto, Arial, sans-serif')
258
+ .attr('font-size', '12px')
259
+ .append('text')
260
+ .attr('y', (d) => d.y + margin.bottom / 2)
261
+ .attr('x', (d) => d.x)
262
+ .attr('fill', colours.accent)
263
+ .text((d, i) => {
264
+ const l = XtoLABEL(d.x);
265
+ if (rangeMode && i === 1) {
266
+ return items.find((item) => item.label === l).range.label;
267
+ }
268
+ return l;
269
+ });
270
+ if (axis?.yAxis?.show) {
271
+ const yAxis = d3.axisLeft(scaleHeight)
272
+ .ticks(axis.yAxis.tickAmount ?? 2)
273
+ .tickValues(axis.yAxis.values ? axis.yAxis.values : null);
274
+ const yAxisGroup = svg.append('g')
275
+ .attr('transform', `translate(${margin.left}, ${margin.top})`)
276
+ .call(yAxis);
277
+ yAxisGroup.selectAll('path, line').style('stroke', colours.accent);
278
+ yAxisGroup.selectAll('text').style('fill', colours.accent);
279
+ }
280
+ };
281
+ /** Avoid collision of the slider labels */
282
+ this.textCollision = (sliders) => {
283
+ // pre-requisites
284
+ const controlsLayer = this.d3.select('g.chart').select('g.controls');
285
+ const { items, margin } = this.data;
286
+ const rangeMode = items.every((d) => d.range);
287
+ // run collision detection
288
+ const isColliding = sliders[0].x === sliders[1].x;
289
+ if (rangeMode && isColliding) {
290
+ controlsLayer
291
+ .selectAll('text')
292
+ .attr('y', (d, i) => (i > 0 ? d.y + margin.bottom / 2 + 12 : d.y + margin.bottom / 2))
293
+ .text((d, i) => {
294
+ const range = this.getSelectedRange();
295
+ return range[i];
296
+ });
297
+ }
298
+ else {
299
+ controlsLayer
300
+ .selectAll('text')
301
+ .attr('y', (d) => d.y + margin.bottom / 2);
302
+ }
303
+ };
304
+ /** Public api that allows to dinamically change the bars */
305
+ this.setBars = (newBars) => {
306
+ this.data.items = newBars;
307
+ this.draw();
308
+ this.d3.selectAll('rect.bars').attr('fill', (d) => this.colourBars(d));
309
+ };
310
+ /** Public api that allows to dinamically change the slider position */
311
+ this.setSliders = ([startLabel, endLabel]) => {
312
+ this.data.setSliders = [`${startLabel}`, `${endLabel}`];
313
+ this.draw();
314
+ this.d3.selectAll('rect.bars').attr('fill', (d) => this.colourBars(d));
315
+ const range = this.getSelectedRange();
316
+ this.emit('rangeselected', range);
317
+ this.textCollision(this.sliders);
318
+ return range;
319
+ };
320
+ }
321
+ ngAfterContentChecked() {
322
+ /*
323
+ Waits for the dom to be loaded, then fires the draw function
324
+ that renders the chart.
325
+ */
326
+ if (this.data) {
327
+ if (this._loaded)
328
+ return;
329
+ this._loaded = true;
330
+ setTimeout(() => {
331
+ import('d3').then((module) => {
332
+ this.d3 = module;
333
+ this.draw();
334
+ this.emitLoaded(true);
335
+ if (this.data && this.data.setDraw) {
336
+ this.data.setDraw(this.draw);
337
+ }
338
+ if (this.data.setApi) { // expose the component api
339
+ this.data.setApi({
340
+ setSliders: this.setSliders,
341
+ setBars: this.setBars,
342
+ });
343
+ }
344
+ // eslint-disable-next-line dot-notation
345
+ window['setSliders'] = this.setSliders;
346
+ });
347
+ });
348
+ }
349
+ }
350
+ /** Get x-axis position from label */
351
+ labelToX() {
352
+ return this.d3
353
+ .scaleBand()
354
+ .domain(this.data.items.map((d) => d.label))
355
+ .range([0, this.data.width])
356
+ .paddingInner(0.17)
357
+ .paddingOuter(1);
358
+ }
359
+ /** Emits an event when the component has loaded */
360
+ emitLoaded(payload) {
361
+ if (!this.emit)
362
+ return;
363
+ this.emit('loaded', payload);
364
+ }
365
+ }
366
+ HistogramRangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HistogramRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
367
+ HistogramRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: HistogramRangeComponent, selector: "n7-histogram-range", inputs: { data: "data", emit: "emit" }, ngImport: i0, template: "<div *ngIf=\"data\" class=\"n7-histogram-range\">\n <svg #histogramRange [id]=\"data.containerId\"></svg>\n</div>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HistogramRangeComponent, decorators: [{
369
+ type: Component,
370
+ args: [{ selector: 'n7-histogram-range', template: "<div *ngIf=\"data\" class=\"n7-histogram-range\">\n <svg #histogramRange [id]=\"data.containerId\"></svg>\n</div>\n" }]
371
+ }], propDecorators: { data: [{
372
+ type: Input
373
+ }], emit: [{
374
+ type: Input
375
+ }] } });
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHYtY29tcG9uZW50cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2hpc3RvZ3JhbS1yYW5nZS9oaXN0b2dyYW0tcmFuZ2UudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdi1jb21wb25lbnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvaGlzdG9ncmFtLXJhbmdlL2hpc3RvZ3JhbS1yYW5nZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6Qyw2QkFBNkI7QUFDN0IscUJBQXFCO0FBQ3JCLDZCQUE2QjtBQUU3QixPQUFPLEVBQXVCLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQTJGdEUsTUFBTSxPQUFPLHVCQUF1QjtJQUpwQztRQVdZLFlBQU8sR0FBWSxFQUFFLENBQUM7UUFFdEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQW1DeEIsU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNSLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDcEIsTUFBTSxFQUNGLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUNyQixLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFDM0IsSUFBSSxFQUFFLFVBQVUsRUFDbkIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRWQsa0JBQWtCO1lBQ2xCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLEtBQUssQ0FBQyww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RCxtREFBbUQ7SUFDbkQsVUFBVSxDQUFDLE9BQU87UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O29IQXRZUSx1QkFBdUI7d0dBQXZCLHVCQUF1QixrR0NoR3BDLHdIQUdBOzJGRDZGYSx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0ksb0JBQW9COzhCQUlyQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBISVNUT0dSQU0tUkFOR0UudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCB7IEFmdGVyQ29udGVudENoZWNrZWQsIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8qKlxuICogSW50ZXJmYWNlIGZvciBIaXN0b2dyYW1SYW5nZUNvbXBvbmVudCdzIFwiZGF0YVwiXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9ncmFtUmFuZ2VEYXRhIHtcbiAgICAvKipcbiAgICAgKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGhpc3RvZ3JhbS1yYW5nZSBzdmdcbiAgICAgKi9cbiAgICBjb250YWluZXJJZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHRvdGFsIHdpZHRoIGZvciB0aGUgc3ZnIGVsZW1lbnRcbiAgICAgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIHRvdGFsIGhlaWdodCBmb3IgdGhlIHN2ZyBlbGVtZW50XG4gICAgICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWFyZ2lucyBvZiB0aGUgc3ZnXG4gICAgICovXG4gICAgbWFyZ2luOiB7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgcmlnaHQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICAgIGJvdHRvbTogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlbWUgb2YgdGhlIGhpc3RvZ3JhbVxuICAgICAqL1xuICAgIGNvbG91cnM6IHtcbiAgICAgICAgdG9wOiBzdHJpbmc7XG4gICAgICAgIGJvdHRvbTogc3RyaW5nO1xuICAgICAgICBhY2NlbnQ6IHN0cmluZztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERhdGEgZm9yIHRoZSBoaXN0b2dyYW0gYmFyc1xuICAgICAqL1xuICAgIGl0ZW1zOiB7XG4gICAgICAgIC8qKiBkZWZhdWx0IGxhYmVsIG9mIHRoZSBpdGVtICovXG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIC8qKiB5LWF4aXMgdmFsdWUgb2YgdGhlIGJhciAoaGVpZ2h0KSAqL1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAvKiogcGF5bG9hZCB0aGF0IHRoZSBpdGVtIHNob3VsZCBlbWl0IHdoZW4gc2VsZWN0ZWQgKi9cbiAgICAgICAgcGF5bG9hZDogYW55O1xuICAgICAgICAvKipcbiAgICAgICAgICogJ3VwcGVyJyB2YWx1ZXMgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBvbmx5IHVzZWQgd2hlbiBlYWNoIGJhciByZXByZXNlbnRzIGEgcmFuZ2UuXG4gICAgICAgICAqL1xuICAgICAgICByYW5nZT86IHtcbiAgICAgICAgICAgIC8qKiBsYWJlbCBsb2FkZWQgd2hlbiBzZWxlY3RlZCBieSB0aGUgcmlnaHQtbW9zdCBwb2ludGVyICovXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICAgICAgLyoqIHBheWxvYWQgZW1pdHRlZCB3aGVuIHNlbGVjdGVkIGJ5IHRoZSByaWdodC1tb3N0IHBvaW50ZXIgKi9cbiAgICAgICAgICAgIHBheWxvYWQ6IGFueTtcbiAgICAgICAgfTtcbiAgICB9W107XG4gICAgLyoqXG4gICAgICogQXhpcyBzZXR0aW5nc1xuICAgICAqL1xuICAgIGF4aXM/OiB7XG4gICAgICAgIC8qKiBZIEF4aXMgc2V0dGluZ3MgKi9cbiAgICAgICAgeUF4aXM/OiB7XG4gICAgICAgICAgICAvKiogVHVybiBvbiBhbmQgb2ZmIHRoZSBheGlzICovXG4gICAgICAgICAgICBzaG93PzogYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBNYW51YWxseSBzZXQgdGhlIGF4aXMgdmFsdWVzIHRvIHNob3cgKi9cbiAgICAgICAgICAgIHZhbHVlcz86IG51bWJlcltdO1xuICAgICAgICAgICAgLyoqIEhvdyBtYW55IHRpY2tzIGRvIHlvdSB3YW50IHRvIHNlZSAqL1xuICAgICAgICAgICAgdGlja0Ftb3VudD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4cG9zZSB0aGUgZHJhdyBmdW5jdGlvbiBvdXRzaWRlIG9mIG43LWZyb250ZW5kL2NvbXBvbmVudHMgbGlicmFyeVxuICAgICAqIHRoaXMgaXMgbmVlZGVkIHRvIHJlZHJhdyBidWJibGUtY2hhcnQtY29tcG9uZW50IG9uIGNvbW1hbmRcbiAgICAgKi9cbiAgICBzZXREcmF3PzogYW55O1xuICAgIC8qKlxuICAgICAqIHNldFNsaWRlcnNcbiAgICAgKi9cbiAgICBzZXRTbGlkZXJzPzogTGFiZWxDb3VwbGU7XG4gICAgLyoqXG4gICAgICogUHVibGljIGFwaVxuICAgICAqL1xuICAgIHNldEFwaT86IGFueTtcbn1cblxudHlwZSBTbGlkZXJzID0geyB4OiBudW1iZXI7IHk6IG51bWJlciB9W107XG50eXBlIExhYmVsQ291cGxlID0gW3N0cmluZywgc3RyaW5nXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduNy1oaXN0b2dyYW0tcmFuZ2UnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaXN0b2dyYW0tcmFuZ2UuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgICBASW5wdXQoKSBkYXRhOiBIaXN0b2dyYW1SYW5nZURhdGE7XG5cbiAgICBASW5wdXQoKSBlbWl0OiBhbnk7XG5cbiAgICBwcml2YXRlIGQzO1xuXG4gICAgcHJpdmF0ZSBzbGlkZXJzOiBTbGlkZXJzID0gW107XG5cbiAgICBwcml2YXRlIF9sb2FkZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29sb3VyQmFycztcblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0ZWRSYW5nZTtcblxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgLypcbiAgICAgICAgIFdhaXRzIGZvciB0aGUgZG9tIHRvIGJlIGxvYWRlZCwgdGhlbiBmaXJlcyB0aGUgZHJhdyBmdW5jdGlvblxuICAgICAgICAgdGhhdCByZW5kZXJzIHRoZSBjaGFydC5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGltcG9ydCgnZDMnKS50aGVuKChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kMyA9IG1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuc2V0RHJhdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNldERyYXcodGhpcy5kcmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnNldEFwaSkgeyAvLyBleHBvc2UgdGhlIGNvbXBvbmVudCBhcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRBcGkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNsaWRlcnM6IHRoaXMuc2V0U2xpZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCYXJzOiB0aGlzLnNldEJhcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvd1snc2V0U2xpZGVycyddID0gdGhpcy5zZXRTbGlkZXJzO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGQzIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aCwgbWFyZ2luLCBoZWlnaHQsXG4gICAgICAgICAgICBpdGVtcywgY29sb3VycywgY29udGFpbmVySWQsXG4gICAgICAgICAgICBheGlzLCBzZXRTbGlkZXJzXG4gICAgICAgIH0gPSB0aGlzLmRhdGE7XG5cbiAgICAgICAgLy8gZGF0YSB2YWxpZGF0aW9uXG4gICAgICAgIGNvbnN0IHJhbmdlTW9kZSA9IGl0ZW1zLmV2ZXJ5KChkKSA9PiBkLnJhbmdlKTtcbiAgICAgICAgaWYgKCFyYW5nZU1vZGUgJiYgaXRlbXMuc29tZSgoZCkgPT4gIWQucmFuZ2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQWxsIGl0ZW1zIG11c3QgaGF2ZSB0aGUgXCJyYW5nZVwiIHByb3BlcnR5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXJzIC0gU3RhcnQ6XG4gICAgICAgIGNvbnN0IExBQkVMdG9YID0gZDNcbiAgICAgICAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgICAgICAgLmRvbWFpbihpdGVtcy5tYXAoKGQpID0+IGQubGFiZWwpKVxuICAgICAgICAgICAgLnJhbmdlKFswLCB3aWR0aF0pXG4gICAgICAgICAgICAucGFkZGluZ0lubmVyKDAuMTcpXG4gICAgICAgICAgICAucGFkZGluZ091dGVyKDEpO1xuXG4gICAgICAgIGNvbnN0IFh0b0xBQkVMID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkb21haW4gPSBMQUJFTHRvWC5kb21haW4oKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdPdXRlciA9IExBQkVMdG9YKGRvbWFpblswXSk7XG4gICAgICAgICAgICBjb25zdCBlYWNoQmFuZCA9IExBQkVMdG9YLnN0ZXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcigoKHZhbHVlIC0gcGFkZGluZ091dGVyKSAvIGVhY2hCYW5kKSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tYWluW01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBkb21haW4ubGVuZ3RoIC0gMSkpXTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBZRUFSIFNFTEVDVElPTiBDSVJDTEVTXG4gICAgICAgIC8vIGxldCBzbGlkZXJzO1xuICAgICAgICBpZiAoc2V0U2xpZGVycyAmJiB0aGlzLnNsaWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVycyA9IHNldFNsaWRlcnNcbiAgICAgICAgICAgICAgICAubWFwKChkKSA9PiAoeyB4OiBMQUJFTHRvWChkKSArIExBQkVMdG9YLmJhbmR3aWR0aCgpIC8gMiwgeTogaGVpZ2h0IH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVycyA9IGQzXG4gICAgICAgICAgICAgICAgLmV4dGVudChpdGVtcywgKGQpID0+IGQubGFiZWwpXG4gICAgICAgICAgICAgICAgLm1hcCgoZCkgPT4gKHsgeDogTEFCRUx0b1goZCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDIsIHk6IGhlaWdodCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0luUmFuZ2UgPSAoeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLnNsaWRlcnMubWFwKChkKSA9PiBYdG9MQUJFTChkLngpKTtcbiAgICAgICAgICAgIGlmICh5ID49IGQzLm1pbihhbGxJdGVtcykgJiYgeSA8PSBkMy5tYXgoYWxsSXRlbXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjb2xvdXJCYXJzKGQpIHtcbiAgICAgICAgICAgIGlmIChpc0luUmFuZ2UoZC5sYWJlbCkpIHJldHVybiAndXJsKCNncmFkaWVudCknO1xuICAgICAgICAgICAgcmV0dXJuICcjZTNlM2UzJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbG91ckJhcnMgPSBjb2xvdXJCYXJzO1xuXG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSBpdGVtcy5maW5kKChpdCkgPT4gaXQubGFiZWwgPT09IFh0b0xBQkVMKHRoaXMuc2xpZGVyc1swXS54KSk7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IGl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5sYWJlbCA9PT0gWHRvTEFCRUwodGhpcy5zbGlkZXJzWzFdLngpKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgcmFuZ2VTdGFydC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIHJhbmdlTW9kZVxuICAgICAgICAgICAgICAgICAgICA/IHJhbmdlRW5kLnJhbmdlLnBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgOiByYW5nZUVuZC5wYXlsb2FkXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICAvLyBIZWxwZXJzIC0gRW5kLlxuXG4gICAgICAgIC8vIGNsZWFyIEhUTUwgY29udGVudHNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjb25zdCBzdmcgPSBkM1xuICAgICAgICAgICAgLnNlbGVjdChgIyR7Y29udGFpbmVySWR9YClcbiAgICAgICAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3dpZHRoICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHR9ICR7aGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b219YCk7XG5cbiAgICAgICAgY29uc3Qgc2NhbGVIZWlnaHQgPSBkM1xuICAgICAgICAgICAgLnNjYWxlU3ltbG9nKCkgLy8gbW9zdCBzaW1pbGFyIHNjYWxlIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLmRvbWFpbihbMCwgZDMubWF4KGl0ZW1zLCAoZCkgPT4gZC52YWx1ZSldKVxuICAgICAgICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcblxuICAgICAgICAvLyBHUkFESUVOVFxuICAgICAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpOyAvLyBkZWZpbml0aW9uc1xuICAgICAgICBjb25zdCBncmFkaWVudCA9IGRlZnNcbiAgICAgICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdncmFkaWVudCcpXG4gICAgICAgICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgaGVpZ2h0KVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgMClcbiAgICAgICAgICAgIC5hdHRyKCd5MicsIG1hcmdpbi50b3ApO1xuICAgICAgICBncmFkaWVudFxuICAgICAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhcnQnKVxuICAgICAgICAgICAgLmF0dHIoJ29mZnNldCcsICcwJScpXG4gICAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIGNvbG91cnMuYm90dG9tKSAvLyBib3R0b20gZ3JhZGllbnRcbiAgICAgICAgICAgIC5hdHRyKCdzdG9wLW9wYWNpdHknLCAxKTtcbiAgICAgICAgZ3JhZGllbnRcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2VuZCcpXG4gICAgICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCBjb2xvdXJzLnRvcCkgLy8gdG9wIGdyYWRpZW50XG4gICAgICAgICAgICAuYXR0cignc3RvcC1vcGFjaXR5JywgMSk7XG5cbiAgICAgICAgLy8gRFJBVyBJTlNJREUgTUFSR0lOU1xuICAgICAgICBjb25zdCBnID0gc3ZnXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdjaGFydCcpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0fSwke21hcmdpbi50b3B9KWApO1xuXG4gICAgICAgIGNvbnN0IGJhcnNMYXllciA9IGcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYmFycycpO1xuICAgICAgICBjb25zdCBjb250cm9sc0xheWVyID0gZy5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdjb250cm9scycpO1xuXG4gICAgICAgIC8vIEJBUiBDSEFSVFxuICAgICAgICBiYXJzTGF5ZXIgLy8gYmFyc1xuICAgICAgICAgICAgLnNlbGVjdEFsbCgncmVjdC5iYXJzJylcbiAgICAgICAgICAgIC5kYXRhKGl0ZW1zKVxuICAgICAgICAgICAgLmpvaW4oJ3JlY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgTEFCRUx0b1guYmFuZHdpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiBoZWlnaHQgLSBzY2FsZUhlaWdodChkLnZhbHVlKSlcbiAgICAgICAgICAgIC5hdHRyKCd5JywgKGQpID0+IHNjYWxlSGVpZ2h0KGQudmFsdWUpKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAoZCkgPT4gTEFCRUx0b1goZC5sYWJlbCkpXG4gICAgICAgICAgICAuYXR0cignZGF0YS1zdGFydCcsIChkKSA9PiBkLnBheWxvYWQpIC8vIG1ha2UgdGhlIGRhdGEgZWFzaWx5IGFjY2Vzc2libGVcbiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWVuZCcsIChkKSA9PiAoZC5yYW5nZSA/IGQucmFuZ2UucGF5bG9hZCA6IGQucGF5bG9hZCkpXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsICd1cmwoI2dyYWRpZW50KScpO1xuXG4gICAgICAgIGJhcnNMYXllciAvLyBjYXRjaCBiYXIgZXZlbnRzXG4gICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHllYXIgPSBYdG9MQUJFTChldmVudC5vZmZzZXRYIC0gbWFyZ2luLmxlZnQpO1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh5ZWFyID09PSBkLmxhYmVsKSByZXR1cm4gJyNCMENDRjgnO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3VyQmFycyhkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBYdG9MQUJFTChldmVudC5vZmZzZXRYIC0gbWFyZ2luLmxlZnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhBeGlzVmFsdWUgPSBMQUJFTHRvWChsYWJlbCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHhBeGlzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHk6IGhlaWdodFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJzID0gW1xuICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBqb2luaW5nIHRoZSB0d28gb2JqZWN0cyFcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5uZXdWYWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IC4uLm5ld1ZhbHVlIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJhbmdlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuc2xpZGVycylcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAuZWFzZShkMy5lYXNlUXVhZE91dClcbiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDU1MClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgKGQpID0+IGQueCk7XG4gICAgICAgICAgICAgICAgY29udHJvbHNMYXllclxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCdwYXRoLmJsdWVsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAuZWFzZShkMy5lYXNlUXVhZE91dClcbiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDU1MClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2QnLCBkMy5saW5lKCkodGhpcy5zbGlkZXJzLm1hcCgoZCkgPT4gW2QueCwgZC55XSkpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sc0xheWVyXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIC5lYXNlKGQzLmVhc2VRdWFkT3V0KVxuICAgICAgICAgICAgICAgICAgICAuZHVyYXRpb24oNTUwKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsICgpID0+IHhBeGlzVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIC50ZXh0KChkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlTW9kZSkgcmV0dXJuIGxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5sYWJlbCA9PT0gbGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSByZXR1cm4gaXRlbS5yYW5nZS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBnLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb24odGhpcy5zbGlkZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCB0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250cm9sc0xheWVyIC8vIGdyYXkgbGluZVxuICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JheWxpbmUnKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ2QnLFxuICAgICAgICAgICAgICAgIGQzLmxpbmUoKShbXG4gICAgICAgICAgICAgICAgICAgIFswLCBoZWlnaHRdLFxuICAgICAgICAgICAgICAgICAgICBbd2lkdGgsIGhlaWdodF1cbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpXG4gICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyNDMUM1QzcnKTtcblxuICAgICAgICBjb250cm9sc0xheWVyIC8vIGJsdWUgbGluZVxuICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYmx1ZWxpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ2QnLCBkMy5saW5lKCkodGhpcy5zbGlkZXJzLm1hcCgoZCkgPT4gW2QueCwgZC55XSkpKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgY29sb3Vycy5hY2NlbnQpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlUGlja2VyID0gY29udHJvbHNMYXllclxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnZy5yYW5nZXBpY2tlcicpXG4gICAgICAgICAgICAuZGF0YSh0aGlzLnNsaWRlcnMuc29ydCgoYSwgYikgPT4gZDMuYXNjZW5kaW5nKGEueCwgYi54KSkpXG4gICAgICAgICAgICAuam9pbignZycpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAncmFuZ2VwaWNrZXInKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7IC8vIEZJWE1FOiBBbGxvdyB1c2Ugb2YgY2xhc3MgXCJ0aGlzXCIgaW5zaWRlIGRyYWdnaW5nIHVwZGF0ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuaW1hdGUgdGhlIGVsZW1lbnRzIHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nIG9uZSBvZiB0aGUgcmFuZ2Ugc2VsZWN0b3JzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkcmFnZ2luZ1VwZGF0ZShldmVudCwgZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBYdG9MQUJFTChldmVudC54KTtcbiAgICAgICAgICAgIGNvbnN0IHhBeGlzVmFsdWUgPSBMQUJFTHRvWChsYWJlbCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDI7XG4gICAgICAgICAgICBjb25zdCB5YiA9IFtdO1xuICAgICAgICAgICAgZy5zZWxlY3RBbGwoJ2NpcmNsZScpLmVhY2goZnVuY3Rpb24gc2V0QmFsbFBvc2l0aW9uKCkge1xuICAgICAgICAgICAgICAgIHliLnB1c2goeyB4OiArZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ2N4JyksIHk6IGhlaWdodCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zbGlkZXJzID0geWIuc29ydCgoYSwgYikgPT4gZDMuYXNjZW5kaW5nKGEueCwgYi54KSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBjaXJjbGVcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAgIC5zZWxlY3QoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgZGF0YS54ID0geEF4aXNWYWx1ZSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBibHVlIGxpbmVcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0KCdwYXRoLmJsdWVsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cignZCcsIGQzLmxpbmUoKShzZWxmLnNsaWRlcnMubWFwKChkKSA9PiBbZC54LCBkLnldKSkpO1xuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBkMy5zZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgICAuc2VsZWN0KCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsICgpID0+IHhBeGlzVmFsdWUpO1xuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlc1xuICAgICAgICAgICAgY29udHJvbHNMYXllclxuICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC50ZXh0KChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBYdG9MQUJFTChkLngpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlTW9kZSkgcmV0dXJuIGw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gc2VsZi5zbGlkZXJzLmZpbmRJbmRleCgoc2xpZGVyKSA9PiBzbGlkZXIueCA9PT0gZC54KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxmLmdldFNlbGVjdGVkUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAxKSByZXR1cm4gcmFuZ2VbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZVswXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGYudGV4dENvbGxpc2lvbihzZWxmLnNsaWRlcnMpO1xuICAgICAgICAgICAgLy8gY29sb3VyIHRoZSBiYXJzXG4gICAgICAgICAgICBnLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhbmdlUGlja2VyIC8vIGRyYWcgaGFuZGxlclxuICAgICAgICAgICAgLmNhbGwoZDMuZHJhZygpXG4gICAgICAgICAgICAgICAgLm9uKCdkcmFnJywgZHJhZ2dpbmdVcGRhdGUpXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG9uZSBsYXN0IHRpbWUgdG8gcHJldmVudCBkZXN5bmNpbmdcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dpbmdVcGRhdGUoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHRoZSBzZWxlY3RlZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCB0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIHJhbmdlUGlja2VyXG4gICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgLmF0dHIoJ2N4JywgKGQpID0+IGQueClcbiAgICAgICAgICAgIC5hdHRyKCdjeScsIChkKSA9PiBkLnkpXG4gICAgICAgICAgICAuYXR0cigncicsIDkpXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsICd3aGl0ZScpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMilcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBjb2xvdXJzLmFjY2VudClcbiAgICAgICAgICAgIC5hdHRyKCdzdHlsZScsICdjdXJzb3I6IHBvaW50ZXInKTtcblxuICAgICAgICByYW5nZVBpY2tlclxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvLCBBcmlhbCwgc2Fucy1zZXJpZicpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEycHgnKVxuICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneScsIChkKSA9PiBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMilcbiAgICAgICAgICAgIC5hdHRyKCd4JywgKGQpID0+IGQueClcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgY29sb3Vycy5hY2NlbnQpXG4gICAgICAgICAgICAudGV4dCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBYdG9MQUJFTChkLngpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZU1vZGUgJiYgaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5sYWJlbCA9PT0gbCkucmFuZ2UubGFiZWw7XG4gICAgICAgICAgICAgICAgfSByZXR1cm4gbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChheGlzPy55QXhpcz8uc2hvdykge1xuICAgICAgICAgICAgY29uc3QgeUF4aXMgPSBkMy5heGlzTGVmdChzY2FsZUhlaWdodClcbiAgICAgICAgICAgICAgICAudGlja3MoYXhpcy55QXhpcy50aWNrQW1vdW50ID8/IDIpXG4gICAgICAgICAgICAgICAgLnRpY2tWYWx1ZXMoYXhpcy55QXhpcy52YWx1ZXMgPyBheGlzLnlBeGlzLnZhbHVlcyA6IG51bGwpO1xuICAgICAgICAgICAgY29uc3QgeUF4aXNHcm91cCA9IHN2Zy5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnR9LCAke21hcmdpbi50b3B9KWApXG4gICAgICAgICAgICAgICAgLmNhbGwoeUF4aXMpO1xuXG4gICAgICAgICAgICB5QXhpc0dyb3VwLnNlbGVjdEFsbCgncGF0aCwgbGluZScpLnN0eWxlKCdzdHJva2UnLCBjb2xvdXJzLmFjY2VudCk7XG4gICAgICAgICAgICB5QXhpc0dyb3VwLnNlbGVjdEFsbCgndGV4dCcpLnN0eWxlKCdmaWxsJywgY29sb3Vycy5hY2NlbnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBBdm9pZCBjb2xsaXNpb24gb2YgdGhlIHNsaWRlciBsYWJlbHMgKi9cbiAgICB0ZXh0Q29sbGlzaW9uID0gKHNsaWRlcnM6IFNsaWRlcnMpID0+IHtcbiAgICAgICAgLy8gcHJlLXJlcXVpc2l0ZXNcbiAgICAgICAgY29uc3QgY29udHJvbHNMYXllciA9IHRoaXMuZDMuc2VsZWN0KCdnLmNoYXJ0Jykuc2VsZWN0KCdnLmNvbnRyb2xzJyk7XG4gICAgICAgIGNvbnN0IHsgaXRlbXMsIG1hcmdpbiB9ID0gdGhpcy5kYXRhO1xuICAgICAgICBjb25zdCByYW5nZU1vZGUgPSBpdGVtcy5ldmVyeSgoZCkgPT4gZC5yYW5nZSk7XG4gICAgICAgIC8vIHJ1biBjb2xsaXNpb24gZGV0ZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzQ29sbGlkaW5nID0gc2xpZGVyc1swXS54ID09PSBzbGlkZXJzWzFdLng7XG4gICAgICAgIGlmIChyYW5nZU1vZGUgJiYgaXNDb2xsaWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIChkLCBpKSA9PiAoaSA+IDAgPyBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMiArIDEyIDogZC55ICsgbWFyZ2luLmJvdHRvbSAvIDIpKVxuICAgICAgICAgICAgICAgIC50ZXh0KChkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRTZWxlY3RlZFJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZVtpXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIChkKSA9PiBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEdldCB4LWF4aXMgcG9zaXRpb24gZnJvbSBsYWJlbCAqL1xuICAgIGxhYmVsVG9YKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kM1xuICAgICAgICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAgICAgICAuZG9tYWluKHRoaXMuZGF0YS5pdGVtcy5tYXAoKGQpID0+IGQubGFiZWwpKVxuICAgICAgICAgICAgLnJhbmdlKFswLCB0aGlzLmRhdGEud2lkdGhdKVxuICAgICAgICAgICAgLnBhZGRpbmdJbm5lcigwLjE3KVxuICAgICAgICAgICAgLnBhZGRpbmdPdXRlcigxKTtcbiAgICB9XG5cbiAgICAvKiogUHVibGljIGFwaSB0aGF0IGFsbG93cyB0byBkaW5hbWljYWxseSBjaGFuZ2UgdGhlIGJhcnMgKi9cbiAgICBzZXRCYXJzID0gKG5ld0JhcnMpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhLml0ZW1zID0gbmV3QmFycztcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICAgIHRoaXMuZDMuc2VsZWN0QWxsKCdyZWN0LmJhcnMnKS5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuY29sb3VyQmFycyhkKSk7XG4gICAgfTtcblxuICAgIC8qKiBQdWJsaWMgYXBpIHRoYXQgYWxsb3dzIHRvIGRpbmFtaWNhbGx5IGNoYW5nZSB0aGUgc2xpZGVyIHBvc2l0aW9uICovXG4gICAgc2V0U2xpZGVycyA9IChbc3RhcnRMYWJlbCwgZW5kTGFiZWxdKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXRTbGlkZXJzID0gW2Ake3N0YXJ0TGFiZWx9YCwgYCR7ZW5kTGFiZWx9YF07XG4gICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgICB0aGlzLmQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmNvbG91ckJhcnMoZCkpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpO1xuICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCByYW5nZSk7XG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbih0aGlzLnNsaWRlcnMpO1xuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfTtcblxuICAgIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGxvYWRlZCAqL1xuICAgIGVtaXRMb2FkZWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoIXRoaXMuZW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2xvYWRlZCcsIHBheWxvYWQpO1xuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJkYXRhXCIgY2xhc3M9XCJuNy1oaXN0b2dyYW0tcmFuZ2VcIj5cbiAgICA8c3ZnICNoaXN0b2dyYW1SYW5nZSBbaWRdPVwiZGF0YS5jb250YWluZXJJZFwiPjwvc3ZnPlxuPC9kaXY+XG4iXX0=