@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.32 → 0.0.2-ang-17-20

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 (122) hide show
  1. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +710 -189
  2. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
  3. package/index.d.ts +1052 -3
  4. package/index.d.ts.map +1 -0
  5. package/package.json +13 -15
  6. package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
  7. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -42
  8. package/esm2022/lib/components/approval/approval.component.mjs +0 -20
  9. package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -65
  10. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -45
  11. package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -56
  12. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -75
  13. package/esm2022/lib/components/connector/connector.component.mjs +0 -60
  14. package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -84
  15. package/esm2022/lib/components/create-term/create-term.component.mjs +0 -848
  16. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -825
  17. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -224
  18. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -65
  19. package/esm2022/lib/components/term-card/term-card.component.mjs +0 -343
  20. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -357
  21. package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -862
  22. package/esm2022/lib/constants/app-constant.mjs +0 -40
  23. package/esm2022/lib/constants/data.mjs +0 -6972
  24. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -93
  25. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -15
  26. package/esm2022/lib/labels/strings.mjs +0 -40
  27. package/esm2022/lib/models/approval.model.mjs +0 -2
  28. package/esm2022/lib/models/connection-type.model.mjs +0 -2
  29. package/esm2022/lib/models/connection.model.mjs +0 -2
  30. package/esm2022/lib/models/framework.model.mjs +0 -2
  31. package/esm2022/lib/models/variable-type.model.mjs +0 -2
  32. package/esm2022/lib/pipes/order-by.pipe.mjs +0 -36
  33. package/esm2022/lib/services/approval.service.mjs +0 -48
  34. package/esm2022/lib/services/connection.service.mjs +0 -3
  35. package/esm2022/lib/services/connector.service.mjs +0 -287
  36. package/esm2022/lib/services/framework.service.mjs +0 -532
  37. package/esm2022/lib/services/local-connection.service.mjs +0 -76
  38. package/esm2022/lib/services/odcs.service.mjs +0 -24
  39. package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -44
  40. package/esm2022/lib/tree-hierarchy.component.mjs +0 -25
  41. package/esm2022/lib/tree-hierarchy.module.mjs +0 -146
  42. package/esm2022/lib/tree-hierarchy.service.mjs +0 -62
  43. package/esm2022/material.module.mjs +0 -200
  44. package/esm2022/public-api.mjs +0 -9
  45. package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
  46. package/lib/components/action-bar/action-bar.component.d.ts +0 -17
  47. package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
  48. package/lib/components/approval/approval.component.d.ts +0 -10
  49. package/lib/components/approval/approval.component.d.ts.map +0 -1
  50. package/lib/components/approve-view/approve-view.component.d.ts +0 -27
  51. package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
  52. package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
  53. package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
  54. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
  55. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
  56. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
  57. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
  58. package/lib/components/connector/connector.component.d.ts +0 -23
  59. package/lib/components/connector/connector.component.d.ts.map +0 -1
  60. package/lib/components/create-categories/create-categories.component.d.ts +0 -26
  61. package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
  62. package/lib/components/create-term/create-term.component.d.ts +0 -148
  63. package/lib/components/create-term/create-term.component.d.ts.map +0 -1
  64. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
  65. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
  66. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
  67. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
  68. package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
  69. package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
  70. package/lib/components/term-card/term-card.component.d.ts +0 -54
  71. package/lib/components/term-card/term-card.component.d.ts.map +0 -1
  72. package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -57
  73. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
  74. package/lib/components/tree-view/tree-view.component.d.ts +0 -103
  75. package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
  76. package/lib/constants/app-constant.d.ts +0 -44
  77. package/lib/constants/app-constant.d.ts.map +0 -1
  78. package/lib/constants/data.d.ts +0 -117
  79. package/lib/constants/data.d.ts.map +0 -1
  80. package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
  81. package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
  82. package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
  83. package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
  84. package/lib/labels/strings.d.ts +0 -40
  85. package/lib/labels/strings.d.ts.map +0 -1
  86. package/lib/models/approval.model.d.ts +0 -11
  87. package/lib/models/approval.model.d.ts.map +0 -1
  88. package/lib/models/connection-type.model.d.ts +0 -6
  89. package/lib/models/connection-type.model.d.ts.map +0 -1
  90. package/lib/models/connection.model.d.ts +0 -7
  91. package/lib/models/connection.model.d.ts.map +0 -1
  92. package/lib/models/framework.model.d.ts +0 -89
  93. package/lib/models/framework.model.d.ts.map +0 -1
  94. package/lib/models/variable-type.model.d.ts +0 -46
  95. package/lib/models/variable-type.model.d.ts.map +0 -1
  96. package/lib/pipes/order-by.pipe.d.ts +0 -10
  97. package/lib/pipes/order-by.pipe.d.ts.map +0 -1
  98. package/lib/services/approval.service.d.ts +0 -21
  99. package/lib/services/approval.service.d.ts.map +0 -1
  100. package/lib/services/connection.service.d.ts +0 -4
  101. package/lib/services/connection.service.d.ts.map +0 -1
  102. package/lib/services/connector.service.d.ts +0 -18
  103. package/lib/services/connector.service.d.ts.map +0 -1
  104. package/lib/services/framework.service.d.ts +0 -89
  105. package/lib/services/framework.service.d.ts.map +0 -1
  106. package/lib/services/local-connection.service.d.ts +0 -18
  107. package/lib/services/local-connection.service.d.ts.map +0 -1
  108. package/lib/services/odcs.service.d.ts +0 -11
  109. package/lib/services/odcs.service.d.ts.map +0 -1
  110. package/lib/tree-hierarchy-routing.module.d.ts +0 -8
  111. package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
  112. package/lib/tree-hierarchy.component.d.ts +0 -13
  113. package/lib/tree-hierarchy.component.d.ts.map +0 -1
  114. package/lib/tree-hierarchy.module.d.ts +0 -33
  115. package/lib/tree-hierarchy.module.d.ts.map +0 -1
  116. package/lib/tree-hierarchy.service.d.ts +0 -22
  117. package/lib/tree-hierarchy.service.d.ts.map +0 -1
  118. package/material.module.d.ts +0 -52
  119. package/material.module.d.ts.map +0 -1
  120. package/public-api.d.ts +0 -9
  121. package/public-api.d.ts.map +0 -1
  122. package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
@@ -1,287 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { defaultConfig } from '../constants/app-constant';
3
- import * as d3 from 'd3';
4
- import * as i0 from "@angular/core";
5
- class ConnectorService {
6
- constructor() {
7
- this.connectorMap = {};
8
- this.containerSelector = '#treeViewContainer';
9
- }
10
- _drawLine(source, target, options = defaultConfig, sourceContainerId = undefined, targetContainerId = undefined) {
11
- const _options = { ...defaultConfig, ...options };
12
- _options['dashed'] = true;
13
- if (Array.isArray(target)) {
14
- let connectedDots = [];
15
- target.forEach((_target) => {
16
- const tempLine = this.renderLine(source, _target, _options);
17
- connectedDots.push({
18
- target: _target,
19
- line: tempLine
20
- });
21
- if (sourceContainerId) {
22
- const sourceContainer = document.querySelector(sourceContainerId);
23
- if (sourceContainer) {
24
- sourceContainer.addEventListener('scroll', () => {
25
- try {
26
- tempLine && tempLine.position();
27
- }
28
- catch (e) {
29
- }
30
- }, true);
31
- }
32
- }
33
- if (targetContainerId) {
34
- const targetContainer = document.querySelector(targetContainerId);
35
- if (targetContainer) {
36
- targetContainer.addEventListener('scroll', () => {
37
- try {
38
- tempLine && tempLine.position();
39
- }
40
- catch (e) {
41
- }
42
- }, true);
43
- }
44
- }
45
- });
46
- return connectedDots;
47
- }
48
- else {
49
- return this.renderLine(source, target, _options);
50
- }
51
- }
52
- renderLine(source, target, options) {
53
- const treeViewComponent = document.querySelector(this.containerSelector);
54
- if (!treeViewComponent) {
55
- return {
56
- source: null,
57
- target: null,
58
- path: null,
59
- svg: null,
60
- position: () => { },
61
- show: () => { },
62
- remove: () => { }
63
- };
64
- }
65
- let container = treeViewComponent.querySelector('#leader-line-container');
66
- if (!container) {
67
- let overflowWrapper = document.createElement('div');
68
- overflowWrapper.id = 'leader-line-overflow-wrapper';
69
- overflowWrapper.style.position = 'absolute';
70
- overflowWrapper.style.top = '80px';
71
- overflowWrapper.style.bottom = '0';
72
- overflowWrapper.style.left = '0';
73
- overflowWrapper.style.right = '0';
74
- overflowWrapper.style.overflow = 'hidden';
75
- overflowWrapper.style.pointerEvents = 'none';
76
- container = document.createElement('div');
77
- container.id = 'leader-line-container';
78
- container.style.position = 'absolute';
79
- container.style.top = '0';
80
- container.style.bottom = '0';
81
- container.style.left = '0';
82
- container.style.right = '0';
83
- container.style.width = '100%';
84
- container.style.height = '100%';
85
- const resizeObserver = new ResizeObserver(entries => {
86
- for (const entry of entries) {
87
- if (entry.target === treeViewComponent) {
88
- container.style.width = `${entry.contentRect.width}px`;
89
- if (this.connectorMap) {
90
- Object.values(this.connectorMap).forEach((connector) => {
91
- if (connector && connector.lines) {
92
- connector.lines.forEach((item) => {
93
- if (item.line && typeof item.line.position === 'function') {
94
- item.line.position();
95
- }
96
- });
97
- }
98
- });
99
- }
100
- }
101
- }
102
- });
103
- resizeObserver.observe(treeViewComponent);
104
- treeViewComponent.addEventListener('scroll', () => {
105
- overflowWrapper.style.width = `${treeViewComponent.scrollWidth}px`;
106
- overflowWrapper.style.height = `${treeViewComponent.scrollHeight}px`;
107
- this.repositionAllLines();
108
- });
109
- overflowWrapper.appendChild(container);
110
- treeViewComponent.appendChild(overflowWrapper);
111
- }
112
- this.elmWrapper = container;
113
- let sourceElement = source;
114
- let targetElement;
115
- if (target.targetType === 'id') {
116
- targetElement = document.getElementById(target.target);
117
- }
118
- else {
119
- targetElement = target.target;
120
- }
121
- if (!sourceElement || !targetElement) {
122
- return {
123
- source: null,
124
- target: null,
125
- path: null,
126
- svg: null,
127
- position: () => { },
128
- show: () => { },
129
- remove: () => { }
130
- };
131
- }
132
- const svgId = 'd3-line-' + Math.random().toString(36).substr(2, 9);
133
- const svg = d3.select(container)
134
- .append('svg')
135
- .attr('id', svgId)
136
- .attr('class', 'leader-line')
137
- .style('position', 'absolute')
138
- .style('top', '0')
139
- .style('left', '0')
140
- .style('width', '100%')
141
- .style('height', '100%')
142
- .style('pointer-events', 'none')
143
- .style('overflow', 'visible');
144
- const sourceRect = sourceElement.getBoundingClientRect();
145
- const targetRect = targetElement.getBoundingClientRect();
146
- const containerRect = container.getBoundingClientRect();
147
- let sourceX, sourceY, targetX, targetY;
148
- sourceX = sourceRect.right - containerRect.left;
149
- sourceY = sourceRect.top + (sourceRect.height / 2) - containerRect.top;
150
- targetX = targetRect.left - containerRect.left;
151
- targetY = targetRect.top + (targetRect.height / 2) - containerRect.top;
152
- const path = svg.append('path')
153
- .attr('d', createGridPath(sourceX, sourceY, targetX, targetY))
154
- .style('stroke', '#000')
155
- .style('stroke-width', options.size || 2)
156
- .style('fill', 'none')
157
- .style('opacity', 1)
158
- .style('stroke-linejoin', 'round')
159
- .style('stroke-dasharray', options.dashed ? '5,5' : 'none');
160
- function createGridPath(x1, y1, x2, y2) {
161
- const midX = x1 + (x2 - x1) / 2;
162
- return `M ${x1} ${y1} L ${midX} ${y1} L ${midX} ${y2} L ${x2} ${y2}`;
163
- }
164
- const defs = svg.append('defs');
165
- if (options.startPlug === 'disc' || options.startPlug !== false) {
166
- defs.append('marker')
167
- .attr('id', `start-circle-${svgId}`)
168
- .attr('viewBox', '0 0 10 10')
169
- .attr('refX', 5)
170
- .attr('refY', 5)
171
- .attr('markerWidth', 8)
172
- .attr('markerHeight', 8)
173
- .attr('orient', 'auto')
174
- .append('circle')
175
- .attr('cx', 5)
176
- .attr('cy', 5)
177
- .attr('r', 4.5)
178
- .style('fill', options.color || '#333');
179
- path.attr('marker-start', `url(#start-circle-${svgId})`);
180
- }
181
- if (options.endPlug === 'arrow' || options.endPlug !== false) {
182
- defs.append('marker')
183
- .attr('id', `arrowhead-${svgId}`)
184
- .attr('viewBox', '0 0 10 10')
185
- .attr('refX', 8)
186
- .attr('refY', 5)
187
- .attr('markerWidth', 9)
188
- .attr('markerHeight', 9)
189
- .attr('orient', 'auto')
190
- .append('path')
191
- .attr('d', 'M 0 0 L 10 5 L 0 10 z')
192
- .style('fill', options.color || '#333');
193
- path.attr('marker-end', `url(#arrowhead-${svgId})`);
194
- }
195
- const d3Line = {
196
- source: sourceElement,
197
- target: targetElement,
198
- path: path,
199
- svg: svg,
200
- position: function () {
201
- const updatedSourceRect = sourceElement.getBoundingClientRect();
202
- const updatedTargetRect = targetElement.getBoundingClientRect();
203
- const updatedContainerRect = container.getBoundingClientRect();
204
- const updatedSourceX = updatedSourceRect.right - updatedContainerRect.left;
205
- const updatedSourceY = updatedSourceRect.top + (updatedSourceRect.height / 2) - updatedContainerRect.top;
206
- const updatedTargetX = updatedTargetRect.left - updatedContainerRect.left;
207
- const updatedTargetY = updatedTargetRect.top + (updatedTargetRect.height / 2) - updatedContainerRect.top;
208
- const midX = updatedSourceX + (updatedTargetX - updatedSourceX) / 2;
209
- path.attr('d', `M ${updatedSourceX} ${updatedSourceY} L ${midX} ${updatedSourceY} L ${midX} ${updatedTargetY} L ${updatedTargetX} ${updatedTargetY}`)
210
- .style('stroke-dasharray', options.dashed ? '5,5' : 'none')
211
- .attr('marker-start', options.startPlug !== false ? `url(#start-circle-${svgId})` : null)
212
- .attr('marker-end', options.endPlug !== false ? `url(#arrowhead-${svgId})` : null);
213
- },
214
- show: function (animation = '') {
215
- if (animation === 'draw') {
216
- const pathNode = path.node();
217
- if (!pathNode)
218
- return;
219
- const totalLength = pathNode.getTotalLength();
220
- path.style('opacity', 1)
221
- .attr('stroke-dasharray', totalLength)
222
- .attr('stroke-dashoffset', totalLength)
223
- .transition()
224
- .duration(options.animOptions?.duration || 2000)
225
- .ease(d3.easeLinear)
226
- .attr('stroke-dashoffset', 0);
227
- }
228
- else {
229
- path.style('opacity', 1);
230
- }
231
- },
232
- remove: function () {
233
- svg.remove();
234
- }
235
- };
236
- d3Line.show(options.animation);
237
- return d3Line;
238
- }
239
- updateConnectorsMap(map) {
240
- this.connectorMap = map;
241
- }
242
- position(line) {
243
- if (!line || !line.position)
244
- return;
245
- this.elmWrapper.style.transform = 'none';
246
- var rectWrapper = this.elmWrapper.getBoundingClientRect();
247
- this.elmWrapper.style.transform = 'translate(' +
248
- ((rectWrapper.left + window.pageXOffset) * -1) + 'px, ' +
249
- ((rectWrapper.top + window.pageYOffset) * -1) + 'px)';
250
- line.position();
251
- }
252
- removeAllLines() {
253
- if (this.connectorMap) {
254
- for (const key in this.connectorMap) {
255
- if (this.connectorMap[key] && this.connectorMap[key].lines && this.connectorMap[key].lines.length > 0) {
256
- const lines = this.connectorMap[key].lines;
257
- lines.forEach(async (element, index) => {
258
- await element.line && element.line.remove();
259
- lines.splice(index, 1);
260
- });
261
- this.connectorMap[key].lines = lines;
262
- }
263
- }
264
- }
265
- this.updateConnectorsMap({});
266
- }
267
- repositionAllLines() {
268
- if (this.connectorMap) {
269
- Object.values(this.connectorMap).forEach((connector) => {
270
- if (connector && connector.lines) {
271
- connector.lines.forEach((item) => {
272
- if (item.line && typeof item.line.position === 'function') {
273
- item.line.position();
274
- }
275
- });
276
- }
277
- });
278
- }
279
- }
280
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConnectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
281
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConnectorService }); }
282
- }
283
- export { ConnectorService };
284
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConnectorService, decorators: [{
285
- type: Injectable
286
- }], ctorParameters: function () { return []; } });
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9zZXJ2aWNlcy9jb25uZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQzs7QUFpQnpCLE1BQ2EsZ0JBQWdCO0lBSzNCO1FBSkEsaUJBQVksR0FBeUIsRUFBRSxDQUFDO1FBRXhDLHNCQUFpQixHQUFHLG9CQUFvQixDQUFDO0lBR3pDLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBVyxFQUFFLE1BQVcsRUFBRSxVQUFlLGFBQWEsRUFBRSxvQkFBeUIsU0FBUyxFQUFFLG9CQUF5QixTQUFTO1FBQ3RJLE1BQU0sUUFBUSxHQUFRLEVBQUMsR0FBRyxhQUFhLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQztRQUNyRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6QixJQUFJLGFBQWEsR0FBbUIsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RCxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUNqQixNQUFNLEVBQUUsT0FBTztvQkFDZixJQUFJLEVBQUUsUUFBUTtpQkFDZixDQUFDLENBQUM7Z0JBRUgsSUFBRyxpQkFBaUIsRUFBRTtvQkFDcEIsTUFB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Q29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG5pbnRlcmZhY2UgQ29ubmVjdGVkRG90IHtcbiAgdGFyZ2V0OiBhbnk7XG4gIGxpbmU6IGFueTtcbn1cblxuaW50ZXJmYWNlIEQzTGluZSB7XG4gIHNvdXJjZTogYW55O1xuICB0YXJnZXQ6IGFueTtcbiAgcGF0aDogYW55O1xuICBzdmc6IGFueTtcbiAgcG9zaXRpb246ICgpID0+IHZvaWQ7XG4gIHNob3c6IChhbmltYXRpb24/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbm5lY3RvclNlcnZpY2Uge1xuICBjb25uZWN0b3JNYXA6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG4gIGVsbVdyYXBwZXI6IGFueTtcbiAgY29udGFpbmVyU2VsZWN0b3IgPSAnI3RyZWVWaWV3Q29udGFpbmVyJzsgLy8gWW91IG1pZ2h0IG5lZWQgdG8gYWRqdXN0IHRoaXMgc2VsZWN0b3JcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIF9kcmF3TGluZShzb3VyY2U6IGFueSwgdGFyZ2V0OiBhbnksIG9wdGlvbnM6IGFueSA9IGRlZmF1bHRDb25maWcsIHNvdXJjZUNvbnRhaW5lcklkOiBhbnkgPSB1bmRlZmluZWQsIHRhcmdldENvbnRhaW5lcklkOiBhbnkgPSB1bmRlZmluZWQpOiBhbnkge1xuICAgIGNvbnN0IF9vcHRpb25zID0gPGFueT57Li4uZGVmYXVsdENvbmZpZywgLi4ub3B0aW9uc307XG4gICAgX29wdGlvbnNbJ2Rhc2hlZCddID0gdHJ1ZVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgIGxldCBjb25uZWN0ZWREb3RzOiBDb25uZWN0ZWREb3RbXSA9IFtdO1xuICAgICAgdGFyZ2V0LmZvckVhY2goKF90YXJnZXQpID0+IHtcbiAgICAgICAgY29uc3QgdGVtcExpbmUgPSB0aGlzLnJlbmRlckxpbmUoc291cmNlLCBfdGFyZ2V0LCBfb3B0aW9ucyk7XG4gICAgICAgIGNvbm5lY3RlZERvdHMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBfdGFyZ2V0LFxuICAgICAgICAgIGxpbmU6IHRlbXBMaW5lXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaWYoc291cmNlQ29udGFpbmVySWQpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNvdXJjZUNvbnRhaW5lcklkKTtcbiAgICAgICAgICBpZiAoc291cmNlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBzb3VyY2VDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRlbXBMaW5lICYmIHRlbXBMaW5lLnBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIEVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRhcmdldENvbnRhaW5lcklkKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRDb250YWluZXJJZCk7XG4gICAgICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0ZW1wTGluZSAmJiB0ZW1wTGluZS5wb3NpdGlvbigpO1xuICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBFcnJvciBoYW5kbGluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbm5lY3RlZERvdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckxpbmUoc291cmNlLCB0YXJnZXQsIF9vcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckxpbmUoc291cmNlOiBhbnksIHRhcmdldDogYW55LCBvcHRpb25zOiBhbnkpOiBEM0xpbmUge1xuICAgIC8vIEZpbmQgb3IgY3JlYXRlIHRoZSBjb250YWluZXIgZWxlbWVudFxuICAgIGNvbnN0IHRyZWVWaWV3Q29tcG9uZW50OiBhbnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGFpbmVyU2VsZWN0b3IpO1xuICAgIGlmICghdHJlZVZpZXdDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICBwYXRoOiBudWxsLFxuICAgICAgICBzdmc6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiAoKSA9PiB7fSxcbiAgICAgICAgc2hvdzogKCkgPT4ge30sXG4gICAgICAgIHJlbW92ZTogKCkgPT4ge31cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBvciBnZXQgY29udGFpbmVyIGZvciB0aGUgU1ZHXG4gICAgbGV0IGNvbnRhaW5lcjogYW55ID0gdHJlZVZpZXdDb21wb25lbnQucXVlcnlTZWxlY3RvcignI2xlYWRlci1saW5lLWNvbnRhaW5lcicpO1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAvLyBDcmVhdGUgYSB3cmFwcGVyIGNvbnRhaW5lciB0byBjb250cm9sIHRoZSBvdmVyZmxvdyBhdCB0aGUgdG9wXG4gICAgICBsZXQgb3ZlcmZsb3dXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBvdmVyZmxvd1dyYXBwZXIuaWQgPSAnbGVhZGVyLWxpbmUtb3ZlcmZsb3ctd3JhcHBlcic7XG4gICAgICBvdmVyZmxvd1dyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgb3ZlcmZsb3dXcmFwcGVyLnN0eWxlLnRvcCA9ICc4MHB4JzsgLy8gU2FtZSB0b3AgcG9zaXRpb25cbiAgICAgIG92ZXJmbG93V3JhcHBlci5zdHlsZS5ib3R0b20gPSAnMCc7XG4gICAgICBvdmVyZmxvd1dyYXBwZXIuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgIG92ZXJmbG93V3JhcHBlci5zdHlsZS5yaWdodCA9ICcwJztcbiAgICAgIG92ZXJmbG93V3JhcHBlci5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOyAvLyBIaWRlIGFueXRoaW5nIGFib3ZlIHRoaXMgY29udGFpbmVyXG4gICAgICBvdmVyZmxvd1dyYXBwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gQWxsb3cgY2xpY2tzIHRvIHBhc3MgdGhyb3VnaFxuICAgICAgXG4gICAgICAvLyBPcmlnaW5hbCBjb250YWluZXIgcmVtYWlucyB0aGUgc2FtZSBidXQgcG9zaXRpb25lZCBhdCB0b3A6MCB3aXRoaW4gdGhlIHdyYXBwZXJcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29udGFpbmVyLmlkID0gJ2xlYWRlci1saW5lLWNvbnRhaW5lcic7XG4gICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJzsgLy8gQ2hhbmdlZCB0byAwIGFzIGl0J3Mgbm93IHJlbGF0aXZlIHRvIHdyYXBwZXJcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAnMCc7XG4gICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcwJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICBcbiAgICAgIC8vIEFkZCByZXNpemUgb2JzZXJ2ZXIgdG8gZHluYW1pY2FsbHkgYWRqdXN0IGNvbnRhaW5lciB3aWR0aFxuICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGlmIChlbnRyeS50YXJnZXQgPT09IHRyZWVWaWV3Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHtlbnRyeS5jb250ZW50UmVjdC53aWR0aH1weGA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlcG9zaXRpb24gYWxsIGxpbmVzIHdoZW4gY29udGFpbmVyIHJlc2l6ZXNcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rvck1hcCkge1xuICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuY29ubmVjdG9yTWFwKS5mb3JFYWNoKChjb25uZWN0b3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3IgJiYgY29ubmVjdG9yLmxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICBjb25uZWN0b3IubGluZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmxpbmUgJiYgdHlwZW9mIGl0ZW0ubGluZS5wb3NpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubGluZS5wb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFN0YXJ0IG9ic2VydmluZyB0aGUgdHJlZVZpZXdDb21wb25lbnRcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodHJlZVZpZXdDb21wb25lbnQpO1xuICAgICAgXG4gICAgICAvLyBBbHNvIGxpc3RlbiBmb3Igc2Nyb2xsIGV2ZW50cyB0byByZXBvc2l0aW9uIGxpbmVzXG4gICAgICB0cmVlVmlld0NvbXBvbmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgIC8vIFVwZGF0ZSBjb250YWluZXIgZGltZW5zaW9ucyBiYXNlZCBvbiB2aXNpYmxlIGFyZWFcbiAgICAgICAgb3ZlcmZsb3dXcmFwcGVyLnN0eWxlLndpZHRoID0gYCR7dHJlZVZpZXdDb21wb25lbnQuc2Nyb2xsV2lkdGh9cHhgO1xuICAgICAgICBvdmVyZmxvd1dyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dHJlZVZpZXdDb21wb25lbnQuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlcG9zaXRpb24gYWxsIGFjdGl2ZSBsaW5lc1xuICAgICAgICB0aGlzLnJlcG9zaXRpb25BbGxMaW5lcygpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG92ZXJmbG93V3JhcHBlci5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgdHJlZVZpZXdDb21wb25lbnQuYXBwZW5kQ2hpbGQob3ZlcmZsb3dXcmFwcGVyKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU3RvcmUgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgYWNjZXNzIGluIG90aGVyIG1ldGhvZHNcbiAgICB0aGlzLmVsbVdyYXBwZXIgPSBjb250YWluZXI7XG4gICAgXG4gICAgLy8gR2V0IHRoZSBzb3VyY2UgYW5kIHRhcmdldCBlbGVtZW50c1xuICAgIGxldCBzb3VyY2VFbGVtZW50ID0gc291cmNlO1xuICAgIGxldCB0YXJnZXRFbGVtZW50OiBhbnk7XG4gICAgXG4gICAgaWYgKHRhcmdldC50YXJnZXRUeXBlID09PSAnaWQnKSB7XG4gICAgICB0YXJnZXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0LnRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEVsZW1lbnQgPSB0YXJnZXQudGFyZ2V0O1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgYm90aCBlbGVtZW50cyBleGlzdFxuICAgIGlmICghc291cmNlRWxlbWVudCB8fCAhdGFyZ2V0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAgIHBhdGg6IG51bGwsXG4gICAgICAgIHN2ZzogbnVsbCxcbiAgICAgICAgcG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICBzaG93OiAoKSA9PiB7fSxcbiAgICAgICAgcmVtb3ZlOiAoKSA9PiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIElEIGZvciB0aGUgU1ZHXG4gICAgY29uc3Qgc3ZnSWQgPSAnZDMtbGluZS0nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBTVkcgZWxlbWVudFxuICAgIGNvbnN0IHN2ZyA9IGQzLnNlbGVjdChjb250YWluZXIpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ2lkJywgc3ZnSWQpXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGVhZGVyLWxpbmUnKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAuc3R5bGUoJ3RvcCcsICcwJylcbiAgICAgIC5zdHlsZSgnbGVmdCcsICcwJylcbiAgICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXG4gICAgICAuc3R5bGUoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb25zXG4gICAgY29uc3Qgc291cmNlUmVjdCA9IHNvdXJjZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgZWRnZSBjb25uZWN0aW9uIHBvaW50cyAtIGFsd2F5cyByaWdodCB0byBsZWZ0XG4gICAgbGV0IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFk7XG5cbiAgICAvLyBTb3VyY2UgLSBhbHdheXMgY29ubmVjdCBmcm9tIHRoZSByaWdodCBlZGdlXG4gICAgc291cmNlWCA9IHNvdXJjZVJlY3QucmlnaHQgLSBjb250YWluZXJSZWN0LmxlZnQ7XG4gICAgc291cmNlWSA9IHNvdXJjZVJlY3QudG9wICsgKHNvdXJjZVJlY3QuaGVpZ2h0IC8gMikgLSBjb250YWluZXJSZWN0LnRvcDtcblxuICAgIC8vIFRhcmdldCAtIGFsd2F5cyBjb25uZWN0IHRvIHRoZSBsZWZ0IGVkZ2VcbiAgICB0YXJnZXRYID0gdGFyZ2V0UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIHRhcmdldFkgPSB0YXJnZXRSZWN0LnRvcCArICh0YXJnZXRSZWN0LmhlaWdodCAvIDIpIC0gY29udGFpbmVyUmVjdC50b3A7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGxpbmUgd2l0aCBpbml0aWFsIG9wYWNpdHkgMSAodmlzaWJsZSBpbW1lZGlhdGVseSlcbiAgICAvLyBJbnN0ZWFkIG9mIGEgc3RyYWlnaHQgbGluZSwgY3JlYXRlIGEgZ3JpZCBsaW5lIHdpdGggcmlnaHQgYW5nbGVzXG4gICAgY29uc3QgcGF0aDogYW55ID0gc3ZnLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIGNyZWF0ZUdyaWRQYXRoKHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFkpKVxuICAgICAgLnN0eWxlKCdzdHJva2UnLCAnIzAwMCcpIC8vIERhcmtlciBjb2xvciBmb3IgYmV0dGVyIHZpc2liaWxpdHlcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgb3B0aW9ucy5zaXplIHx8IDIpXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAxKSAvLyBTdGFydCB2aXNpYmxlXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpIC8vIFJvdW5kIGNvcm5lcnMgZm9yIGEgc21vb3RoZXIgbG9va1xuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5Jywgb3B0aW9ucy5kYXNoZWQgPyAnNSw1JyA6ICdub25lJyk7IC8vIEFkZCBkYXNoZWQgc3R5bGUgaWYgc3BlY2lmaWVkXG4gICAgXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGdyaWQgcGF0aFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUdyaWRQYXRoKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbWlkcG9pbnQgb24gdGhlIHgtYXhpc1xuICAgICAgY29uc3QgbWlkWCA9IHgxICsgKHgyIC0geDEpIC8gMjtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgcGF0aCB3aXRoIDMgc2VnbWVudHMgKGhvcml6b250YWwsIHZlcnRpY2FsLCBob3Jpem9udGFsKVxuICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9IEwgJHttaWRYfSAke3kxfSBMICR7bWlkWH0gJHt5Mn0gTCAke3gyfSAke3kyfWA7XG4gICAgfVxuICBcbiAgICAvLyBEZWZpbmUgbWFya2VycyAoZGlzayBhdCBzdGFydCBhbmQgYXJyb3cgYXQgZW5kKVxuICAgIGNvbnN0IGRlZnMgPSBzdmcuYXBwZW5kKCdkZWZzJyk7XG4gICAgXG4gICAgLy8gQWRkIHN0YXJ0IG1hcmtlciAoZGlzay9jaXJjbGUpXG4gICAgaWYgKG9wdGlvbnMuc3RhcnRQbHVnID09PSAnZGlzYycgfHwgb3B0aW9ucy5zdGFydFBsdWcgIT09IGZhbHNlKSB7XG4gICAgICBkZWZzLmFwcGVuZCgnbWFya2VyJylcbiAgICAgICAgLmF0dHIoJ2lkJywgYHN0YXJ0LWNpcmNsZS0ke3N2Z0lkfWApXG4gICAgICAgIC5hdHRyKCd2aWV3Qm94JywgJzAgMCAxMCAxMCcpXG4gICAgICAgIC5hdHRyKCdyZWZYJywgNSlcbiAgICAgICAgLmF0dHIoJ3JlZlknLCA1KVxuICAgICAgICAuYXR0cignbWFya2VyV2lkdGgnLCA4KVxuICAgICAgICAuYXR0cignbWFya2VySGVpZ2h0JywgOClcbiAgICAgICAgLmF0dHIoJ29yaWVudCcsICdhdXRvJylcbiAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgNSlcbiAgICAgICAgLmF0dHIoJ2N5JywgNSlcbiAgICAgICAgLmF0dHIoJ3InLCA0LjUpXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsIG9wdGlvbnMuY29sb3IgfHwgJyMzMzMnKTtcbiAgICAgIFxuICAgICAgcGF0aC5hdHRyKCdtYXJrZXItc3RhcnQnLCBgdXJsKCNzdGFydC1jaXJjbGUtJHtzdmdJZH0pYCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBlbmQgbWFya2VyIChhcnJvdylcbiAgICBpZiAob3B0aW9ucy5lbmRQbHVnID09PSAnYXJyb3cnIHx8IG9wdGlvbnMuZW5kUGx1ZyAhPT0gZmFsc2UpIHtcbiAgICAgIGRlZnMuYXBwZW5kKCdtYXJrZXInKVxuICAgICAgICAuYXR0cignaWQnLCBgYXJyb3doZWFkLSR7c3ZnSWR9YClcbiAgICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCAnMCAwIDEwIDEwJylcbiAgICAgICAgLmF0dHIoJ3JlZlgnLCA4KSAgXG4gICAgICAgIC5hdHRyKCdyZWZZJywgNSlcbiAgICAgICAgLmF0dHIoJ21hcmtlcldpZHRoJywgOSlcbiAgICAgICAgLmF0dHIoJ21hcmtlckhlaWdodCcsIDkpXG4gICAgICAgIC5hdHRyKCdvcmllbnQnLCAnYXV0bycpXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cignZCcsICdNIDAgMCBMIDEwIDUgTCAwIDEwIHonKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBvcHRpb25zLmNvbG9yIHx8ICcjMzMzJyk7XG4gICAgICBcbiAgICAgIHBhdGguYXR0cignbWFya2VyLWVuZCcsIGB1cmwoI2Fycm93aGVhZC0ke3N2Z0lkfSlgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSBEM0xpbmUgb2JqZWN0IHdpdGggQVBJIHNpbWlsYXIgdG8gTGVhZGVyTGluZVxuICAgIGNvbnN0IGQzTGluZTogRDNMaW5lID0ge1xuICAgICAgc291cmNlOiBzb3VyY2VFbGVtZW50LFxuICAgICAgdGFyZ2V0OiB0YXJnZXRFbGVtZW50LFxuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIHN2Zzogc3ZnLFxuICAgICAgXG4gICAgICAvLyBQb3NpdGlvbiBtZXRob2QgdG8gdXBkYXRlIGxpbmUgY29vcmRpbmF0ZXNcbiAgICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gR2V0IHVwZGF0ZWQgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTb3VyY2VSZWN0ID0gc291cmNlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFRhcmdldFJlY3QgPSB0YXJnZXRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNvdXJjZSAtIGFsd2F5cyBjb25uZWN0IGZyb20gdGhlIHJpZ2h0IGVkZ2VcbiAgICAgICAgY29uc3QgdXBkYXRlZFNvdXJjZVggPSB1cGRhdGVkU291cmNlUmVjdC5yaWdodCAtIHVwZGF0ZWRDb250YWluZXJSZWN0LmxlZnQ7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTb3VyY2VZID0gdXBkYXRlZFNvdXJjZVJlY3QudG9wICsgKHVwZGF0ZWRTb3VyY2VSZWN0LmhlaWdodCAvIDIpIC0gdXBkYXRlZENvbnRhaW5lclJlY3QudG9wO1xuICAgICAgICBcbiAgICAgICAgLy8gVGFyZ2V0IC0gYWx3YXlzIGNvbm5lY3QgdG8gdGhlIGxlZnQgZWRnZVxuICAgICAgICBjb25zdCB1cGRhdGVkVGFyZ2V0WCA9IHVwZGF0ZWRUYXJnZXRSZWN0LmxlZnQgLSB1cGRhdGVkQ29udGFpbmVyUmVjdC5sZWZ0O1xuICAgICAgICBjb25zdCB1cGRhdGVkVGFyZ2V0WSA9IHVwZGF0ZWRUYXJnZXRSZWN0LnRvcCArICh1cGRhdGVkVGFyZ2V0UmVjdC5oZWlnaHQgLyAyKSAtIHVwZGF0ZWRDb250YWluZXJSZWN0LnRvcDtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBwYXRoIHdpdGggZ3JpZCBwYXRoXG4gICAgICAgIGNvbnN0IG1pZFggPSB1cGRhdGVkU291cmNlWCArICh1cGRhdGVkVGFyZ2V0WCAtIHVwZGF0ZWRTb3VyY2VYKSAvIDI7XG4gICAgICAgIHBhdGguYXR0cignZCcsIGBNICR7dXBkYXRlZFNvdXJjZVh9ICR7dXBkYXRlZFNvdXJjZVl9IEwgJHttaWRYfSAke3VwZGF0ZWRTb3VyY2VZfSBMICR7bWlkWH0gJHt1cGRhdGVkVGFyZ2V0WX0gTCAke3VwZGF0ZWRUYXJnZXRYfSAke3VwZGF0ZWRUYXJnZXRZfWApXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCBvcHRpb25zLmRhc2hlZCA/ICc1LDUnIDogJ25vbmUnKVxuICAgICAgICAgICAgLy8gRW5zdXJlIG1hcmtlcnMgYXJlIHByZXNlcnZlZCBkdXJpbmcgcmVwb3NpdGlvbmluZ1xuICAgICAgICAgICAgLmF0dHIoJ21hcmtlci1zdGFydCcsIG9wdGlvbnMuc3RhcnRQbHVnICE9PSBmYWxzZSA/IGB1cmwoI3N0YXJ0LWNpcmNsZS0ke3N2Z0lkfSlgIDogbnVsbClcbiAgICAgICAgICAgIC5hdHRyKCdtYXJrZXItZW5kJywgb3B0aW9ucy5lbmRQbHVnICE9PSBmYWxzZSA/IGB1cmwoI2Fycm93aGVhZC0ke3N2Z0lkfSlgIDogbnVsbCk7XG4gICAgICB9LFxuICAgICAgXG4gICAgICAvLyBTaG93IG1ldGhvZCB3aXRoIGFuaW1hdGlvbiBvcHRpb25cbiAgICAgIHNob3c6IGZ1bmN0aW9uKGFuaW1hdGlvbiA9ICcnKSB7XG4gICAgICAgIGlmIChhbmltYXRpb24gPT09ICdkcmF3Jykge1xuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBoYXMgYSBub2RlIGJlZm9yZSBjYWxjdWxhdGluZyB0b3RhbCBsZW5ndGhcbiAgICAgICAgICBjb25zdCBwYXRoTm9kZSA9IHBhdGgubm9kZSgpO1xuICAgICAgICAgIGlmICghcGF0aE5vZGUpIHJldHVybjtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IHBhdGhOb2RlLmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcGF0aC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hhcnJheScsIHRvdGFsTGVuZ3RoKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNob2Zmc2V0JywgdG90YWxMZW5ndGgpXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24ob3B0aW9ucy5hbmltT3B0aW9ucz8uZHVyYXRpb24gfHwgMjAwMClcbiAgICAgICAgICAgIC5lYXNlKGQzLmVhc2VMaW5lYXIpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLWRhc2hvZmZzZXQnLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBtZXRob2RcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN2Zy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIC8vIEltbWVkaWF0ZWx5IGNhbGwgc2hvdyB0byBtYWtlIHRoZSBsaW5lIHZpc2libGVcbiAgICBkM0xpbmUuc2hvdyhvcHRpb25zLmFuaW1hdGlvbik7XG4gICAgXG4gICAgcmV0dXJuIGQzTGluZTtcbiAgfVxuXG4gIHVwZGF0ZUNvbm5lY3RvcnNNYXAobWFwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rvck1hcCA9IG1hcDtcbiAgfVxuXG4gIHBvc2l0aW9uKGxpbmU6IGFueSk6IHZvaWQge1xuICAgIGlmICghbGluZSB8fCAhbGluZS5wb3NpdGlvbikgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuZWxtV3JhcHBlci5zdHlsZS50cmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgdmFyIHJlY3RXcmFwcGVyID0gdGhpcy5lbG1XcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vIE1vdmUgdG8gdGhlIG9yaWdpbiBvZiBjb29yZGluYXRlcyBhcyB0aGUgZG9jdW1lbnRcbiAgICB0aGlzLmVsbVdyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICtcbiAgICAgICgocmVjdFdyYXBwZXIubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldCkgKiAtMSkgKyAncHgsICcgK1xuICAgICAgKChyZWN0V3JhcHBlci50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQpICogLTEpICsgJ3B4KSc7XG4gICAgXG4gICAgbGluZS5wb3NpdGlvbigpO1xuICB9XG5cbiAgcmVtb3ZlQWxsTGluZXMoKTogdm9pZCB7XG4gICAgaWYodGhpcy5jb25uZWN0b3JNYXApIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29ubmVjdG9yTWFwKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbi0xIGxpbmVzIGFuZCBrZWVwIG9ubHkgY3VycmVudCBzZWxlY3Rpb24sIGFsc28gY2xlYXIgbisxIGxpbmVzXG4gICAgICAgIGlmKHRoaXMuY29ubmVjdG9yTWFwW2tleV0gJiYgdGhpcy5jb25uZWN0b3JNYXBba2V5XS5saW5lcyAmJiB0aGlzLmNvbm5lY3Rvck1hcFtrZXldLmxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29ubmVjdG9yTWFwW2tleV0ubGluZXM7XG4gICAgICAgICAgbGluZXMuZm9yRWFjaChhc3luYyAoZWxlbWVudDogYW55LCBpbmRleDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IGVsZW1lbnQubGluZSAmJiBlbGVtZW50LmxpbmUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBba2V5XS5saW5lcyA9IGxpbmVzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRvIHJlc2V0IGNvbm5lY3RvciBtYXAgYWZ0ZXIgY2xlYXJpbmcgYWxsIHRoZSBsaW5lc1xuICAgIHRoaXMudXBkYXRlQ29ubmVjdG9yc01hcCh7fSk7XG4gIH1cblxuICByZXBvc2l0aW9uQWxsTGluZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29ubmVjdG9yTWFwKSB7XG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuY29ubmVjdG9yTWFwKS5mb3JFYWNoKChjb25uZWN0b3I6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY29ubmVjdG9yICYmIGNvbm5lY3Rvci5saW5lcykge1xuICAgICAgICAgIGNvbm5lY3Rvci5saW5lcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmxpbmUgJiYgdHlwZW9mIGl0ZW0ubGluZS5wb3NpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBpdGVtLmxpbmUucG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59Il19