@ruc-lib/org-chart 3.2.0 → 4.0.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.
- package/README.md +39 -4
- package/fesm2022/ruc-lib-org-chart.mjs +403 -0
- package/fesm2022/ruc-lib-org-chart.mjs.map +1 -0
- package/index.d.ts +106 -2
- package/package.json +9 -21
- package/esm2020/index.mjs +0 -4
- package/esm2020/interfaces/org-chart.mjs +0 -2
- package/esm2020/lib/org-chart/org-chart.component.mjs +0 -216
- package/esm2020/lib/ruclib-org-chart.module.mjs +0 -26
- package/esm2020/ruc-lib-org-chart.mjs +0 -5
- package/esm2020/utils/chart-download.util.mjs +0 -182
- package/fesm2015/ruc-lib-org-chart.mjs +0 -416
- package/fesm2015/ruc-lib-org-chart.mjs.map +0 -1
- package/fesm2020/ruc-lib-org-chart.mjs +0 -428
- package/fesm2020/ruc-lib-org-chart.mjs.map +0 -1
- package/interfaces/org-chart.d.ts +0 -41
- package/lib/org-chart/org-chart.component.d.ts +0 -64
- package/lib/ruclib-org-chart.module.d.ts +0 -16
- package/utils/chart-download.util.d.ts +0 -8
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { ButtonModule } from 'primeng/button';
|
|
4
|
-
import { OrganizationChartModule } from 'primeng/organizationchart';
|
|
5
|
-
import { MatInputModule } from '@angular/material/input';
|
|
6
|
-
import { FormsModule } from '@angular/forms';
|
|
7
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
8
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
10
|
-
import { OrgChartComponent } from './org-chart/org-chart.component';
|
|
11
|
-
import { BrowserModule } from '@angular/platform-browser';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
export class RuclibOrgChartModule {
|
|
14
|
-
}
|
|
15
|
-
RuclibOrgChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
16
|
-
RuclibOrgChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, declarations: [OrgChartComponent], imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule], exports: [OrgChartComponent] });
|
|
17
|
-
RuclibOrgChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule] });
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, decorators: [{
|
|
19
|
-
type: NgModule,
|
|
20
|
-
args: [{
|
|
21
|
-
imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule],
|
|
22
|
-
declarations: [OrgChartComponent],
|
|
23
|
-
exports: [OrgChartComponent]
|
|
24
|
-
}]
|
|
25
|
-
}] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW9yZy1jaGFydC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vcmctY2hhcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPMUQsTUFBTSxPQUFPLG9CQUFvQjs7a0hBQXBCLG9CQUFvQjttSEFBcEIsb0JBQW9CLGlCQUhoQixpQkFBaUIsYUFEdEIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWEsYUFFOUksaUJBQWlCO21IQUVoQixvQkFBb0IsWUFKckIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWE7NEZBSTdJLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDO29CQUN6SixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDakMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7aUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb25DaGFydE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvb3JnYW5pemF0aW9uY2hhcnQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBPcmdDaGFydENvbXBvbmVudCB9IGZyb20gJy4vb3JnLWNoYXJ0L29yZy1jaGFydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgQnJvd3Nlck1vZHVsZSwgRm9ybXNNb2R1bGUsIE9yZ2FuaXphdGlvbkNoYXJ0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcclxuICBkZWNsYXJhdGlvbnM6IFtPcmdDaGFydENvbXBvbmVudF0sXHJcbiAgZXhwb3J0czogW09yZ0NoYXJ0Q29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUnVjbGliT3JnQ2hhcnRNb2R1bGUge31cclxuXHJcbiJdfQ==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi1vcmctY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVjLWxpYi1vcmctY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -1,182 +0,0 @@
|
|
|
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==
|