@ruc-lib/org-chart 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,182 @@
1
+ import { jsPDF } from 'jspdf';
2
+ import html2canvas from 'html2canvas';
3
+ export const downloadChart = (chartContainer, format) => {
4
+ if (!chartContainer) {
5
+ console.error('Chart container not found!');
6
+ return;
7
+ }
8
+ // Capture the chart container as an image (either PNG or JPEG)
9
+ if (format === 'pdf') {
10
+ createPDF(chartContainer);
11
+ }
12
+ else {
13
+ captureElementAsImage(chartContainer, format)
14
+ .then((imgData) => {
15
+ downloadImage(imgData, format); // Download as PNG or JPEG
16
+ })
17
+ .catch(handleCanvasError);
18
+ }
19
+ };
20
+ // Capture the element as an image and return a promise
21
+ export const captureElementAsImage = (element, format) => {
22
+ return new Promise((resolve, reject) => {
23
+ html2canvas(element, {
24
+ useCORS: true,
25
+ scrollX: 0,
26
+ scrollY: -window.scrollY,
27
+ logging: false,
28
+ backgroundColor: null,
29
+ })
30
+ .then((canvas) => {
31
+ const imgData = canvas.toDataURL(`image/${format}`);
32
+ resolve(imgData);
33
+ })
34
+ .catch((error) => reject(error));
35
+ });
36
+ };
37
+ // Downloads the org chart as a PDF document.
38
+ export const createPDF = (element) => {
39
+ html2canvas(element, {
40
+ useCORS: true,
41
+ scale: 4,
42
+ scrollX: 0,
43
+ scrollY: -window.scrollY,
44
+ logging: false,
45
+ backgroundColor: null,
46
+ })
47
+ .then((canvas) => {
48
+ const imgData = canvas.toDataURL('image/png'); // Capture as PNG (or you can use JPEG)
49
+ const pdf = new jsPDF('p', 'mm', 'a4'); // Standard A4 page size
50
+ // Get the dimensions of the PDF page
51
+ const pdfWidth = pdf.internal.pageSize.width;
52
+ const pdfHeight = pdf.internal.pageSize.height;
53
+ const canvasWidth = canvas.width;
54
+ const canvasHeight = canvas.height;
55
+ const aspectRatio = canvasWidth / canvasHeight;
56
+ let imgWidth = pdfWidth;
57
+ let imgHeight = pdfWidth / aspectRatio;
58
+ // If the image height exceeds the PDF page height, adjust it
59
+ if (imgHeight > pdfHeight) {
60
+ imgHeight = pdfHeight;
61
+ imgWidth = pdfHeight * aspectRatio;
62
+ }
63
+ // Add the image to the PDF
64
+ pdf.addImage(imgData, 'PNG', 0, 20, imgWidth, imgHeight); // Fit image on PDF page
65
+ pdf.save('organization-chart.pdf'); // Download the PDF
66
+ })
67
+ .catch(handleCanvasError);
68
+ };
69
+ // Download the captured image in the required format (PNG/JPEG)
70
+ export const downloadImage = (imgData, format) => {
71
+ const link = document.createElement('a');
72
+ link.href = imgData;
73
+ link.download = `organization-chart.${format}`;
74
+ link.click();
75
+ };
76
+ // Error handler for any issues during canvas generation or file creation
77
+ export const handleCanvasError = (error) => {
78
+ console.error('Error generating file:', error);
79
+ };
80
+ export const checkPropsType = (props) => {
81
+ if (props.isDisplayHambergerMenu !== undefined && typeof props.isDisplayHambergerMenu !== 'boolean') {
82
+ console.error('Error: isDisplayHambergerMenu should be a boolean.');
83
+ }
84
+ if (props.isDisplaySearchBar !== undefined && typeof props.isDisplaySearchBar !== 'boolean') {
85
+ console.error('Error: isDisplaySearchBar should be a boolean.');
86
+ }
87
+ if (!['portrait', 'triangle', 'landscape'].includes(props.nodeTemplate)) {
88
+ console.error('Error: nodeTemplate should be "portrait", "triangle", or "landscape".');
89
+ }
90
+ if (!Array.isArray(props.hambergerMenuList)) {
91
+ console.error('Error: hambergerMenuList should be an array.');
92
+ }
93
+ else {
94
+ props.hambergerMenuList.forEach(item => {
95
+ if (typeof item.label !== 'string') {
96
+ console.error('Error: hambergerMenuList label should be a string.');
97
+ }
98
+ if (typeof item.id !== 'number') {
99
+ console.error('Error: hambergerMenuList id should be a number.');
100
+ }
101
+ });
102
+ }
103
+ // Check if greyNodeStyle is of type CustomNodeStyle
104
+ const greyNodeStyle = props.greyNodeStyle;
105
+ if (greyNodeStyle) {
106
+ if (greyNodeStyle.backgroundColor && typeof greyNodeStyle.backgroundColor !== 'string') {
107
+ console.error('Error: greyNodeStyle.backgroundColor should be a string.');
108
+ }
109
+ if (greyNodeStyle.color && typeof greyNodeStyle.color !== 'string') {
110
+ console.error('Error: greyNodeStyle.color should be a string.');
111
+ }
112
+ if (greyNodeStyle.padding && typeof greyNodeStyle.padding !== 'string') {
113
+ console.error('Error: greyNodeStyle.padding should be a string.');
114
+ }
115
+ if (greyNodeStyle.borderRadius && typeof greyNodeStyle.borderRadius !== 'string') {
116
+ console.error('Error: greyNodeStyle.borderRadius should be a string.');
117
+ }
118
+ }
119
+ // Check if orgData is an array of OrgDataItem objects
120
+ if (!Array.isArray(props.orgData)) {
121
+ console.error('Error: orgData should be an array.');
122
+ }
123
+ else {
124
+ props.orgData.forEach(item => checkOrgDataItem(item));
125
+ }
126
+ };
127
+ export const checkOrgDataItem = (item) => {
128
+ if (item.label !== undefined && typeof item.label !== 'string') {
129
+ console.error('Error: OrgDataItem label should be a string.');
130
+ }
131
+ if (item.expanded !== undefined && typeof item.expanded !== 'boolean') {
132
+ console.error('Error: OrgDataItem expanded should be a boolean.');
133
+ }
134
+ if (item.description !== undefined && typeof item.description !== 'string') {
135
+ console.error('Error: OrgDataItem description should be a string.');
136
+ }
137
+ if (item.customNodeStyle !== undefined) {
138
+ const customNodeStyle = item.customNodeStyle;
139
+ if (customNodeStyle.backgroundColor && typeof customNodeStyle.backgroundColor !== 'string') {
140
+ console.error('Error: customNodeStyle.backgroundColor should be a string.');
141
+ }
142
+ if (customNodeStyle.color && typeof customNodeStyle.color !== 'string') {
143
+ console.error('Error: customNodeStyle.color should be a string.');
144
+ }
145
+ if (customNodeStyle.padding && typeof customNodeStyle.padding !== 'string') {
146
+ console.error('Error: customNodeStyle.padding should be a string.');
147
+ }
148
+ if (customNodeStyle.borderRadius && typeof customNodeStyle.borderRadius !== 'string') {
149
+ console.error('Error: customNodeStyle.borderRadius should be a string.');
150
+ }
151
+ }
152
+ if (item.data) {
153
+ if (item.data.image !== undefined && typeof item.data.image !== 'string') {
154
+ console.error('Error: OrgDataItem data.image should be a string.');
155
+ }
156
+ if (item.data.name !== undefined && typeof item.data.name !== 'string') {
157
+ console.error('Error: OrgDataItem data.name should be a string.');
158
+ }
159
+ if (typeof item.data.title !== 'string') {
160
+ console.error('Error: OrgDataItem data.title should be a string.');
161
+ }
162
+ }
163
+ if (item.children && Array.isArray(item.children)) {
164
+ item.children.forEach(child => checkOrgDataItem(child)); // Recursive call for children
165
+ }
166
+ if (item.originalStyle) {
167
+ const originalStyle = item.originalStyle;
168
+ if (originalStyle.backgroundColor && typeof originalStyle.backgroundColor !== 'string') {
169
+ console.error('Error: originalStyle.backgroundColor should be a string.');
170
+ }
171
+ if (originalStyle.color && typeof originalStyle.color !== 'string') {
172
+ console.error('Error: originalStyle.color should be a string.');
173
+ }
174
+ if (originalStyle.padding && typeof originalStyle.padding !== 'string') {
175
+ console.error('Error: originalStyle.padding should be a string.');
176
+ }
177
+ if (originalStyle.borderRadius && typeof originalStyle.borderRadius !== 'string') {
178
+ console.error('Error: originalStyle.borderRadius should be a string.');
179
+ }
180
+ }
181
+ };
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtZG93bmxvYWQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jaGFydC1kb3dubG9hZC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQTJCLEVBQUUsTUFBOEIsRUFBUSxFQUFFO0lBQ2pHLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLE9BQU87S0FDUjtJQUVELCtEQUErRDtJQUMvRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDcEIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzNCO1NBQU07UUFDTCxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDLENBQUE7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLE1BQXNCLEVBQW1CLEVBQUU7SUFDckcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsS0FBSztZQUNk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YUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDaEYsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQ3hFO0tBQ0Y7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc1BERiB9IGZyb20gJ2pzcGRmJztcclxuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcclxuaW1wb3J0IHsgT3JnRGF0YSwgT3JnRGF0YUl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL29yZy1jaGFydCc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkQ2hhcnQgPSAoY2hhcnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnIHwgJ3BkZicpOiB2b2lkID0+IHtcclxuICBpZiAoIWNoYXJ0Q29udGFpbmVyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdDaGFydCBjb250YWluZXIgbm90IGZvdW5kIScpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FwdHVyZSB0aGUgY2hhcnQgY29udGFpbmVyIGFzIGFuIGltYWdlIChlaXRoZXIgUE5HIG9yIEpQRUcpXHJcbiAgaWYgKGZvcm1hdCA9PT0gJ3BkZicpIHtcclxuICAgIGNyZWF0ZVBERihjaGFydENvbnRhaW5lcik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNhcHR1cmVFbGVtZW50QXNJbWFnZShjaGFydENvbnRhaW5lciwgZm9ybWF0KVxyXG4gICAgICAudGhlbigoaW1nRGF0YSkgPT4ge1xyXG4gICAgICAgIGRvd25sb2FkSW1hZ2UoaW1nRGF0YSwgZm9ybWF0KTsgLy8gRG93bmxvYWQgYXMgUE5HIG9yIEpQRUdcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGhhbmRsZUNhbnZhc0Vycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENhcHR1cmUgdGhlIGVsZW1lbnQgYXMgYW4gaW1hZ2UgYW5kIHJldHVybiBhIHByb21pc2VcclxuZXhwb3J0IGNvbnN0IGNhcHR1cmVFbGVtZW50QXNJbWFnZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZm9ybWF0OiAncG5nJyB8ICdqcGVnJyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGh0bWwyY2FudmFzKGVsZW1lbnQsIHtcclxuICAgICAgdXNlQ09SUzogdHJ1ZSxcclxuICAgICAgc2Nyb2xsWDogMCxcclxuICAgICAgc2Nyb2xsWTogLXdpbmRvdy5zY3JvbGxZLFxyXG4gICAgICBsb2dnaW5nOiBmYWxzZSxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGNhbnZhcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke2Zvcm1hdH1gKTtcclxuICAgICAgICByZXNvbHZlKGltZ0RhdGEpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gRG93bmxvYWRzIHRoZSBvcmcgY2hhcnQgYXMgYSBQREYgZG9jdW1lbnQuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVQREYgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcclxuICBodG1sMmNhbnZhcyhlbGVtZW50LCB7XHJcbiAgICB1c2VDT1JTOiB0cnVlLFxyXG4gICAgc2NhbGU6IDQsIFxyXG4gICAgc2Nyb2xsWDogMCxcclxuICAgIHNjcm9sbFk6IC13aW5kb3cuc2Nyb2xsWSxcclxuICAgIGxvZ2dpbmc6IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gIH0pXHJcbiAgICAudGhlbigoY2FudmFzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsgLy8gQ2FwdHVyZSBhcyBQTkcgKG9yIHlvdSBjYW4gdXNlIEpQRUcpXHJcbiAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpOyAvLyBTdGFuZGFyZCBBNCBwYWdlIHNpemVcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUERGIHBhZ2VcclxuICAgICAgY29uc3QgcGRmV2lkdGggPSBwZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICAgIGNvbnN0IHBkZkhlaWdodCA9IHBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY2FudmFzV2lkdGggLyBjYW52YXNIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgaW1nV2lkdGggPSBwZGZXaWR0aDtcclxuICAgICAgbGV0IGltZ0hlaWdodCA9IHBkZldpZHRoIC8gYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAvLyBJZiB0aGUgaW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdGhlIFBERiBwYWdlIGhlaWdodCwgYWRqdXN0IGl0XHJcbiAgICAgIGlmIChpbWdIZWlnaHQgPiBwZGZIZWlnaHQpIHtcclxuICAgICAgICBpbWdIZWlnaHQgPSBwZGZIZWlnaHQ7XHJcbiAgICAgICAgaW1nV2lkdGggPSBwZGZIZWlnaHQgKiBhc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIHRoZSBpbWFnZSB0byB0aGUgUERGXHJcbiAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMCwgMjAsIGltZ1dpZHRoLCBpbWdIZWlnaHQpOyAvLyBGaXQgaW1hZ2Ugb24gUERGIHBhZ2VcclxuICAgICAgcGRmLnNhdmUoJ29yZ2FuaXphdGlvbi1jaGFydC5wZGYnKTsgLy8gRG93bmxvYWQgdGhlIFBERlxyXG4gICAgfSlcclxuICAgIC5jYXRjaChoYW5kbGVDYW52YXNFcnJvcik7XHJcbn1cclxuXHJcbi8vIERvd25sb2FkIHRoZSBjYXB0dXJlZCBpbWFnZSBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0IChQTkcvSlBFRylcclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkSW1hZ2UgPSAoaW1nRGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICBsaW5rLmhyZWYgPSBpbWdEYXRhO1xyXG4gIGxpbmsuZG93bmxvYWQgPSBgb3JnYW5pemF0aW9uLWNoYXJ0LiR7Zm9ybWF0fWA7XHJcbiAgbGluay5jbGljaygpO1xyXG59XHJcblxyXG4vLyBFcnJvciBoYW5kbGVyIGZvciBhbnkgaXNzdWVzIGR1cmluZyBjYW52YXMgZ2VuZXJhdGlvbiBvciBmaWxlIGNyZWF0aW9uXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDYW52YXNFcnJvciA9IChlcnJvcjogYW55KTogdm9pZCA9PiB7XHJcbiAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBmaWxlOicsIGVycm9yKTtcclxufVxyXG5cclxuICBcclxuZXhwb3J0IGNvbnN0IGNoZWNrUHJvcHNUeXBlID0gKHByb3BzOiBPcmdEYXRhKTogdm9pZCA9PiB7XHJcbiAgICBpZiAocHJvcHMuaXNEaXNwbGF5SGFtYmVyZ2VyTWVudSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwcm9wcy5pc0Rpc3BsYXlIYW1iZXJnZXJNZW51ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheUhhbWJlcmdlck1lbnUgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgIH1cclxuICBcclxuICAgIGlmIChwcm9wcy5pc0Rpc3BsYXlTZWFyY2hCYXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcHMuaXNEaXNwbGF5U2VhcmNoQmFyICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheVNlYXJjaEJhciBzaG91bGQgYmUgYSBib29sZWFuLicpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgaWYgKCFbJ3BvcnRyYWl0JywgJ3RyaWFuZ2xlJywgJ2xhbmRzY2FwZSddLmluY2x1ZGVzKHByb3BzLm5vZGVUZW1wbGF0ZSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG5vZGVUZW1wbGF0ZSBzaG91bGQgYmUgXCJwb3J0cmFpdFwiLCBcInRyaWFuZ2xlXCIsIG9yIFwibGFuZHNjYXBlXCIuJyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcHMuaGFtYmVyZ2VyTWVudUxpc3QpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5oYW1iZXJnZXJNZW51TGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5sYWJlbCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5pZCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBpZCBzaG91bGQgYmUgYSBudW1iZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENoZWNrIGlmIGdyZXlOb2RlU3R5bGUgaXMgb2YgdHlwZSBDdXN0b21Ob2RlU3R5bGVcclxuICAgIGNvbnN0IGdyZXlOb2RlU3R5bGUgPSBwcm9wcy5ncmV5Tm9kZVN0eWxlO1xyXG4gICAgaWYgKGdyZXlOb2RlU3R5bGUpIHtcclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmV5Tm9kZVN0eWxlLmNvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBncmV5Tm9kZVN0eWxlLmNvbG9yIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JleU5vZGVTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGdyZXlOb2RlU3R5bGUucGFkZGluZyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBDaGVjayBpZiBvcmdEYXRhIGlzIGFuIGFycmF5IG9mIE9yZ0RhdGFJdGVtIG9iamVjdHNcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wcy5vcmdEYXRhKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JnRGF0YSBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5vcmdEYXRhLmZvckVhY2goaXRlbSA9PiBjaGVja09yZ0RhdGFJdGVtKGl0ZW0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBleHBvcnQgY29uc3QgY2hlY2tPcmdEYXRhSXRlbSA9IChpdGVtOiBPcmdEYXRhSXRlbSk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5sYWJlbCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmxhYmVsICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBPcmdEYXRhSXRlbSBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmV4cGFuZGVkICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZXhwYW5kZWQgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmN1c3RvbU5vZGVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTm9kZVN0eWxlID0gaXRlbS5jdXN0b21Ob2RlU3R5bGU7XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21Ob2RlU3R5bGUuY29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5jb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBjdXN0b21Ob2RlU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VzdG9tTm9kZVN0eWxlLnBhZGRpbmcgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uZGF0YSkge1xyXG4gICAgICAgIGlmIChpdGVtLmRhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLmltYWdlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRhdGEuaW1hZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5kYXRhLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLm5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS5uYW1lIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmRhdGEudGl0bGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS50aXRsZSBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGVja09yZ0RhdGFJdGVtKGNoaWxkKSk7IC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBjaGlsZHJlblxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0ub3JpZ2luYWxTdHlsZSkge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSBpdGVtLm9yaWdpbmFsU3R5bGU7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmlnaW5hbFN0eWxlLmNvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG9yaWdpbmFsU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JpZ2luYWxTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JpZ2luYWxTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==