@sachin9822/reports-lib 0.0.81 → 0.0.83

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.
@@ -7,13 +7,11 @@ export class ReportService {
7
7
  this.http = http;
8
8
  this.errorHandler = errorHandler;
9
9
  this.injector = injector;
10
- this.systemReportUrl = '/api/v1/CompanyConfiguration/SystemReports';
11
10
  this.serviceUrl = "https://4xplus-local.xpressmoney.tech:8752";
12
- this.AccGlDetailsEnquiryReportUrl = "/api/v1/Report/AccGlDetailsEnquiryReport";
13
11
  }
14
12
  getAccGLDetailsReport(formattedDate, dateType, sysCompanyCode, sysUserId, companyName) {
15
13
  if (formattedDate) {
16
- const apiPath = `${this.serviceUrl}${this.AccGlDetailsEnquiryReportUrl}/GetAccGLFDetailsEnquiryReport/${formattedDate}/${dateType}/${sysCompanyCode}/${sysUserId}/${companyName}`;
14
+ const apiPath = `${this.serviceUrl}/api/v1/Report/AccGlDetailsEnquiryReport/GetAccGLFDetailsEnquiryReport/${formattedDate}/${dateType}/${sysCompanyCode}/${sysUserId}/${companyName}`;
17
15
  return this.http.get(apiPath);
18
16
  }
19
17
  else {
@@ -41,4 +39,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
41
39
  providedIn: 'root'
42
40
  }]
43
41
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.ErrorHandler }, { type: i0.Injector }]; } });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0IsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQU05QyxNQUFNLE9BQU8sYUFBYTtJQVV4QixZQUFvQixJQUFnQixFQUFVLFlBQTBCLEVBQVUsUUFBa0I7UUFBaEYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUo1RixvQkFBZSxHQUFHLDRDQUE0QyxDQUFDO1FBS3JFLElBQUksQ0FBQyxVQUFVLEdBQUcsNENBQTRDLENBQUM7UUFDOUQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLDBDQUEwQyxDQUFDO0lBRWxGLENBQUM7SUFNTSxxQkFBcUIsQ0FBQyxhQUFpQyxFQUFFLFFBQWdCLEVBQUUsY0FBc0IsRUFBRSxTQUFpQixFQUFFLFdBQW1CO1FBRzlJLElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLGtDQUFrQyxhQUFhLElBQUksUUFBUSxJQUFJLGNBQWMsSUFBSSxTQUFTLElBQUksV0FBVyxFQUFFLENBQUM7WUFDbEwsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBaUMsT0FBTyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUVMLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxPQUFPLEdBQUcsNEVBQTRFLFdBQVcscUJBQXFCLENBQUMsQ0FBQywyQ0FBMkM7WUFHekssT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFLTSw2QkFBNkI7UUFDbEMsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlELElBQUksZUFBZSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVoRSxJQUFJLGNBQWMsRUFBRTtZQUNsQixPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDTCxPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xEO0lBR0gsQ0FBQzs7MEdBbERVLGFBQWE7OEdBQWIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2FjYy1nbC1kZXRhaWxzLWVucXVpcnktcmVwb3J0L2FjY2dsLWRldGFpbHMtZW5xdWlyeS1yZXBvcnRtb2RlbCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U2VydmljZSB7XG5cblxuXG4gIHByaXZhdGUgc2VydmljZVVybDogc3RyaW5nO1xuICBwcml2YXRlIEFjY0dsRGV0YWlsc0VucXVpcnlSZXBvcnRVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBzeXN0ZW1SZXBvcnRVcmwgPSAnL2FwaS92MS9Db21wYW55Q29uZmlndXJhdGlvbi9TeXN0ZW1SZXBvcnRzJztcblxuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMuc2VydmljZVVybCA9IFwiaHR0cHM6Ly80eHBsdXMtbG9jYWwueHByZXNzbW9uZXkudGVjaDo4NzUyXCI7XG4gICAgIHRoaXMuQWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydFVybCA9IFwiL2FwaS92MS9SZXBvcnQvQWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydFwiO1xuXG4gIH1cblxuXG5cblxuXG4gIHB1YmxpYyBnZXRBY2NHTERldGFpbHNSZXBvcnQoZm9ybWF0dGVkRGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkYXRlVHlwZTogc3RyaW5nLCBzeXNDb21wYW55Q29kZTogc3RyaW5nLCBzeXNVc2VySWQ6IHN0cmluZywgY29tcGFueU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8QWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydE1vZGVsPiB7XG5cblxuICAgIGlmIChmb3JtYXR0ZWREYXRlKSB7XG4gICAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5zZXJ2aWNlVXJsfSR7dGhpcy5BY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0VXJsfS9HZXRBY2NHTEZEZXRhaWxzRW5xdWlyeVJlcG9ydC8ke2Zvcm1hdHRlZERhdGV9LyR7ZGF0ZVR5cGV9LyR7c3lzQ29tcGFueUNvZGV9LyR7c3lzVXNlcklkfS8ke2NvbXBhbnlOYW1lfWA7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0TW9kZWw+KGFwaVBhdGgpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVEYXRlID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEludmFsaWQgRGF0ZSBGb3JtYXQhXFxuRGF0ZSBzaG91bGQgYmUgaW4gZGQvTU0veXl5eSBmb3JtYXQuXFxuRm9yIGV4YW1wbGU6ICR7ZXhhbXBsZURhdGV9IGFzIGRheS9tb250aC95ZWFyLmA7IC8vXFxuTm90ZSA6IFllYXIgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiA5OTk5XG5cblxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuXG5cblxuICBwdWJsaWMgZ2V0VXNlck5hbWVGcm9tU2Vzc2lvblN0b3JhZ2UoKTogc3RyaW5nIHtcbiAgICBsZXQgZm9zc2lsVXNlck5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpO1xuICAgIGxldCBlenJlbWl0dXNlcm5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlenJlbWl0dXNlcm5hbWUnKTtcblxuICAgIGlmIChmb3NzaWxVc2VyTmFtZSkge1xuICAgICAgcmV0dXJuIGZvc3NpbFVzZXJOYW1lLnJlcGxhY2UoL15cIiguKilcIiQvLCAnJDEnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGV6cmVtaXR1c2VybmFtZS5yZXBsYWNlKC9eXCIoLiopXCIkLywgJyQxJyk7XG4gICAgfVxuXG5cbiAgfVxuXG5cbn1cbiJdfQ==
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0IsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQU05QyxNQUFNLE9BQU8sYUFBYTtJQUl4QixZQUFvQixJQUFnQixFQUFVLFlBQTBCLEVBQVUsUUFBa0I7UUFBaEYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsRyxJQUFJLENBQUMsVUFBVSxHQUFHLDRDQUE0QyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxhQUFpQyxFQUFFLFFBQWdCLEVBQUUsY0FBc0IsRUFBRSxTQUFpQixFQUFFLFdBQW1CO1FBQzlJLElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsMEVBQTBFLGFBQWEsSUFBSSxRQUFRLElBQUksY0FBYyxJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN0TCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFpQyxPQUFPLENBQUMsQ0FBQztTQUMvRDthQUFNO1lBRUwsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzRCxNQUFNLE9BQU8sR0FBRyw0RUFBNEUsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDLDJDQUEyQztZQUN6SyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUVNLDZCQUE2QjtRQUNsQyxJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUQsSUFBSSxlQUFlLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhFLElBQUksY0FBYyxFQUFFO1lBQ2xCLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDOzswR0E3QlUsYUFBYTs4R0FBYixhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvYWNjLWdsLWRldGFpbHMtZW5xdWlyeS1yZXBvcnQvYWNjZ2wtZGV0YWlscy1lbnF1aXJ5LXJlcG9ydG1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTZXJ2aWNlIHtcblxuICBwcml2YXRlIHNlcnZpY2VVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5zZXJ2aWNlVXJsID0gXCJodHRwczovLzR4cGx1cy1sb2NhbC54cHJlc3Ntb25leS50ZWNoOjg3NTJcIjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY2NHTERldGFpbHNSZXBvcnQoZm9ybWF0dGVkRGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkYXRlVHlwZTogc3RyaW5nLCBzeXNDb21wYW55Q29kZTogc3RyaW5nLCBzeXNVc2VySWQ6IHN0cmluZywgY29tcGFueU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8QWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydE1vZGVsPiB7XG4gICAgaWYgKGZvcm1hdHRlZERhdGUpIHtcbiAgICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvQWNjR2xEZXRhaWxzRW5xdWlyeVJlcG9ydC9HZXRBY2NHTEZEZXRhaWxzRW5xdWlyeVJlcG9ydC8ke2Zvcm1hdHRlZERhdGV9LyR7ZGF0ZVR5cGV9LyR7c3lzQ29tcGFueUNvZGV9LyR7c3lzVXNlcklkfS8ke2NvbXBhbnlOYW1lfWA7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0TW9kZWw+KGFwaVBhdGgpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVEYXRlID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEludmFsaWQgRGF0ZSBGb3JtYXQhXFxuRGF0ZSBzaG91bGQgYmUgaW4gZGQvTU0veXl5eSBmb3JtYXQuXFxuRm9yIGV4YW1wbGU6ICR7ZXhhbXBsZURhdGV9IGFzIGRheS9tb250aC95ZWFyLmA7IC8vXFxuTm90ZSA6IFllYXIgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiA5OTk5XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyTmFtZUZyb21TZXNzaW9uU3RvcmFnZSgpIDogc3RyaW5nIHtcbiAgICBsZXQgZm9zc2lsVXNlck5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpO1xuICAgIGxldCBlenJlbWl0dXNlcm5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlenJlbWl0dXNlcm5hbWUnKTtcblxuICAgIGlmIChmb3NzaWxVc2VyTmFtZSkge1xuICAgICAgcmV0dXJuIGZvc3NpbFVzZXJOYW1lLnJlcGxhY2UoL15cIiguKilcIiQvLCAnJDEnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGV6cmVtaXR1c2VybmFtZS5yZXBsYWNlKC9eXCIoLiopXCIkLywgJyQxJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,77 +1,203 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import jsPDF from 'jspdf';
2
3
  import 'jspdf-autotable';
4
+ import * as ExcelJS from 'exceljs';
3
5
  import * as FileSaver from 'file-saver';
4
6
  import * as i0 from "@angular/core";
5
7
  export class ExportService {
6
- constructor() { }
7
- exportToPdf(headers, rows, doc, startY, fileName) {
8
- const columnStyles = {};
9
- headers.forEach((_, i) => {
10
- columnStyles[i] = { cellWidth: 'auto' };
8
+ constructor() {
9
+ this.pdfFontSize = 10;
10
+ this.pdfLineHeight = 7;
11
+ this.pdfLeftMargin = 15;
12
+ this.loadImageAsBase64('assets/images/XMLogo.png').then(base64 => {
13
+ this.logoBase64 = base64;
14
+ });
15
+ }
16
+ // ------------------------ Utility ------------------------
17
+ loadImageAsBase64(imagePath) {
18
+ return new Promise((resolve, reject) => {
19
+ const img = new Image();
20
+ img.crossOrigin = 'anonymous';
21
+ img.src = imagePath;
22
+ img.onload = () => {
23
+ const scale = 6;
24
+ const canvas = document.createElement('canvas');
25
+ canvas.width = img.width * scale;
26
+ canvas.height = img.height * scale;
27
+ const ctx = canvas.getContext('2d');
28
+ if (ctx) {
29
+ ctx.scale(scale, scale);
30
+ ctx.drawImage(img, 0, 0);
31
+ const base64 = canvas.toDataURL('image/png', 1.0); // 1.0 = highest quality
32
+ resolve(base64);
33
+ }
34
+ else {
35
+ reject('Failed to get canvas context.');
36
+ }
37
+ };
38
+ img.onerror = () => reject('Failed to load image: ' + imagePath);
39
+ });
40
+ }
41
+ formatDate(value) {
42
+ const date = new Date(value);
43
+ return isNaN(date.getTime()) ? '' :
44
+ `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()}`;
45
+ }
46
+ formatDateTime(date) {
47
+ return `${date.getDate().toString().padStart(2, '0')}/` +
48
+ `${(date.getMonth() + 1).toString().padStart(2, '0')}/` +
49
+ `${date.getFullYear()} ` +
50
+ `${date.getHours().toString().padStart(2, '0')}:` +
51
+ `${date.getMinutes().toString().padStart(2, '0')}`;
52
+ }
53
+ generateReportMetadata(metadata) {
54
+ return metadata.filter(([_, value]) => value !== undefined && value !== null);
55
+ }
56
+ prepareExportTable(data, columnDefs, options = {}) {
57
+ const { excludeFields = ['srno', 'serial', 'action'], currencyFields = [] } = options;
58
+ const filteredColumns = columnDefs.filter(col => col.field &&
59
+ !excludeFields.some(ex => col.field.toLowerCase().includes(ex)) &&
60
+ !excludeFields.some(ex => col.headerName?.toLowerCase().includes(ex)));
61
+ const headers = ['Sr No', ...filteredColumns.map(col => col.headerName || col.field)];
62
+ const rows = data.map((row, index) => {
63
+ const rowData = filteredColumns.map(col => {
64
+ let value = row[col.field];
65
+ const fieldName = col.field?.toLowerCase() || '';
66
+ // Handle various date field names
67
+ if ((fieldName.includes('date') ||
68
+ fieldName.includes('businessdate')) &&
69
+ value) {
70
+ value = this.formatDate(value);
71
+ }
72
+ // Format currency fields
73
+ if (currencyFields.includes(col.field) && value != null) {
74
+ value = parseFloat(value).toFixed(3);
75
+ }
76
+ return value ?? '';
77
+ });
78
+ return [index + 1, ...rowData];
79
+ });
80
+ return { headers, rows };
81
+ }
82
+ // ------------------------ PDF Universal ------------------------
83
+ async exportToPdfUniversal(title, metadata, headers, rows, fileName) {
84
+ const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: [400, 210] });
85
+ const logoWidth = 38.4, logoHeight = 17.5, logoX = 15, logoY = 10;
86
+ const pageWidth = doc.internal.pageSize.width;
87
+ const titleY = 18;
88
+ if (this.logoBase64) {
89
+ doc.addImage(this.logoBase64, 'PNG', logoX, logoY, logoWidth, logoHeight);
90
+ }
91
+ doc.setFontSize(15);
92
+ doc.setFont('helvetica', 'bold');
93
+ doc.text(title, pageWidth / 2, titleY, { align: 'center' });
94
+ let currentY = titleY + 14;
95
+ doc.setFontSize(this.pdfFontSize);
96
+ metadata.forEach(([label, value], i) => {
97
+ const y = currentY + i * this.pdfLineHeight;
98
+ doc.setFont('helvetica', 'bold');
99
+ doc.text(label, this.pdfLeftMargin, y);
100
+ const labelWidth = doc.getTextWidth(label + ' ');
101
+ doc.setFont('helvetica', 'normal');
102
+ doc.text(value, this.pdfLeftMargin + labelWidth, y);
11
103
  });
104
+ currentY += metadata.length * this.pdfLineHeight + 5;
105
+ const columnStyles = {};
106
+ headers.forEach((_, i) => columnStyles[i] = { cellWidth: 'auto' });
12
107
  doc.autoTable({
13
108
  head: [headers],
14
109
  body: rows,
15
- startY: startY,
110
+ startY: currentY,
16
111
  theme: 'grid',
17
112
  headStyles: {
18
- fillColor: [220, 220, 220],
19
- textColor: 0,
20
- fontStyle: 'bold',
21
- fontSize: 9,
22
- halign: 'center',
23
- },
24
- bodyStyles: {
25
- fontSize: 8,
26
- fillColor: [255, 255, 255],
27
- textColor: [0, 0, 0],
28
- },
29
- styles: {
30
- cellPadding: 2,
31
- overflow: 'linebreak',
32
- minCellHeight: 6,
113
+ fillColor: [220, 220, 220], textColor: 0,
114
+ fontStyle: 'bold', fontSize: 9, halign: 'center',
33
115
  },
34
- columnStyles: columnStyles,
116
+ bodyStyles: { fontSize: 8, fillColor: [255, 255, 255], textColor: [0, 0, 0] },
117
+ styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 },
118
+ columnStyles
35
119
  });
36
120
  doc.save(fileName);
37
121
  }
38
- exportToExcel(headers, rows, worksheet, workbook, fileName) {
39
- // Add header row
40
- const headerRow = worksheet.addRow(headers);
41
- headerRow.font = { bold: true };
42
- headerRow.fill = {
43
- type: 'pattern',
44
- pattern: 'solid',
45
- fgColor: { argb: 'D9D9D9' }
46
- };
47
- headerRow.alignment = { vertical: 'middle', horizontal: 'center' };
48
- headerRow.border = {
49
- top: { style: 'thin' }, bottom: { style: 'thin' },
50
- left: { style: 'thin' }, right: { style: 'thin' }
51
- };
52
- const dataStartRow = worksheet.lastRow.number + 1;
53
- // Add data rows
54
- rows.forEach(rowData => {
55
- const dataRow = worksheet.addRow(rowData);
56
- dataRow.border = {
57
- top: { style: 'thin' }, bottom: { style: 'thin' },
58
- left: { style: 'thin' }, right: { style: 'thin' }
122
+ // ------------------------ Excel Universal ------------------------
123
+ exportToExcelUniversal(title, metadata, headers, rows, fileName) {
124
+ const workbook = new ExcelJS.Workbook();
125
+ const worksheet = workbook.addWorksheet(title);
126
+ let currentRow = 1;
127
+ // Add image if available
128
+ if (this.logoBase64) {
129
+ const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
130
+ const imageId = workbook.addImage({
131
+ base64: base64Data,
132
+ extension: 'png',
133
+ });
134
+ // Place image at top-left (e.g., A1:C4)
135
+ worksheet.addImage(imageId, {
136
+ tl: { col: 0, row: 0 },
137
+ ext: { width: 145, height: 66 },
138
+ editAs: 'oneCell'
139
+ });
140
+ }
141
+ // Add title aligned in middle horizontally (merged across all columns)
142
+ const titleRow = worksheet.getRow(currentRow);
143
+ titleRow.getCell(4).value = title;
144
+ titleRow.getCell(4).font = { bold: true, size: 16 };
145
+ titleRow.getCell(4).alignment = { vertical: 'middle', horizontal: 'left' };
146
+ const titleMergeEnd = String.fromCharCode(64 + headers.length);
147
+ worksheet.mergeCells(`D${currentRow}:${titleMergeEnd}${currentRow}`);
148
+ currentRow += 3; // Move past image space
149
+ // Add metadata
150
+ metadata.forEach(([label, value]) => {
151
+ const row = worksheet.getRow(currentRow++);
152
+ const cell = row.getCell(1);
153
+ cell.value = {
154
+ richText: [
155
+ { text: `${label}: `, font: { bold: true } },
156
+ { text: value ?? '', font: { bold: false } }
157
+ ]
158
+ };
159
+ worksheet.mergeCells(`A${row.number}:${String.fromCharCode(64 + headers.length)}${row.number}`);
160
+ });
161
+ worksheet.addRow([]);
162
+ currentRow++;
163
+ // Add table header row
164
+ const headerRow = worksheet.getRow(currentRow++);
165
+ headers.forEach((header, i) => {
166
+ const cell = headerRow.getCell(i + 1);
167
+ cell.value = header;
168
+ cell.font = { bold: true };
169
+ cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
170
+ cell.alignment = { vertical: 'middle', horizontal: 'center' };
171
+ cell.border = {
172
+ top: { style: 'thin' },
173
+ bottom: { style: 'thin' },
174
+ left: { style: 'thin' },
175
+ right: { style: 'thin' }
59
176
  };
60
177
  });
61
- const totalColumns = headers.length;
62
- // Auto-width for each column
63
- for (let i = 1; i <= totalColumns; i++) {
64
- let maxLength = 5;
65
- const headerVal = headerRow.getCell(i).value?.toString() ?? '';
66
- maxLength = Math.max(maxLength, headerVal.length);
178
+ const dataStartRow = currentRow;
179
+ rows.forEach(rowData => {
180
+ const row = worksheet.getRow(currentRow++);
181
+ rowData.forEach((value, i) => {
182
+ const cell = row.getCell(i + 1);
183
+ cell.value = value;
184
+ cell.border = {
185
+ top: { style: 'thin' },
186
+ bottom: { style: 'thin' },
187
+ left: { style: 'thin' },
188
+ right: { style: 'thin' }
189
+ };
190
+ });
191
+ });
192
+ // Auto column widths
193
+ for (let i = 1; i <= headers.length; i++) {
194
+ let maxLength = headers[i - 1].length;
67
195
  for (let rowNum = dataStartRow; rowNum <= worksheet.lastRow.number; rowNum++) {
68
- const cell = worksheet.getRow(rowNum).getCell(i);
69
- const val = cell.value ? cell.value.toString() : '';
196
+ const val = worksheet.getRow(rowNum).getCell(i).value?.toString() || '';
70
197
  maxLength = Math.max(maxLength, val.length);
71
198
  }
72
199
  worksheet.getColumn(i).width = maxLength + 2;
73
200
  }
74
- // Export as Excel file
75
201
  workbook.xlsx.writeBuffer().then(buffer => {
76
202
  const blob = new Blob([buffer], {
77
203
  type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
@@ -79,11 +205,16 @@ export class ExportService {
79
205
  FileSaver.saveAs(blob, fileName);
80
206
  });
81
207
  }
82
- exportToCsv(headers, rows, metadata = [], fileName) {
83
- // Combine metadata + blank line + headers + data
84
- const csvContent = [...metadata, [], headers, ...rows]
85
- .map(e => e.join(','))
86
- .join('\n');
208
+ // ------------------------ CSV Universal ------------------------
209
+ exportToCsvUniversal(title, metadata, headers, rows, fileName) {
210
+ const metaRows = metadata.map(([k, v]) => [`${k}: ${v}`]);
211
+ const csvContent = [
212
+ [title],
213
+ ...metaRows,
214
+ [],
215
+ headers,
216
+ ...rows.map(row => row.map(value => `"${value}"`))
217
+ ].map(e => e.join(',')).join('\n');
87
218
  this.downloadFile(csvContent, fileName, 'text/csv');
88
219
  }
89
220
  downloadFile(data, filename, type) {
@@ -104,4 +235,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
104
235
  providedIn: 'root'
105
236
  }]
106
237
  }], ctorParameters: function () { return []; } });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8saUJBQWlCLENBQUM7QUFFekIsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7O0FBWXhDLE1BQU0sT0FBTyxhQUFhO0lBRXhCLGdCQUFnQixDQUFDO0lBS2pCLFdBQVcsQ0FBQyxPQUFpQixFQUFFLElBQWEsRUFBRSxHQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQ3hGLE1BQU0sWUFBWSxHQUEyQixFQUFFLENBQUM7UUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ1osSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2YsSUFBSSxFQUFFLElBQUk7WUFDVixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUMxQixTQUFTLEVBQUUsQ0FBQztnQkFDWixTQUFTLEVBQUUsTUFBTTtnQkFDakIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7Z0JBQzFC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LENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzBHQWxJVSxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcbmltcG9ydCAnanNwZGYtYXV0b3RhYmxlJztcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5cblxuZGVjbGFyZSBtb2R1bGUgJ2pzcGRmJyB7XG4gIGludGVyZmFjZSBqc1BERiB7XG4gICAgYXV0b1RhYmxlOiAob3B0aW9uczogYW55KSA9PiBqc1BERjtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG5cbiAgXG5cbiAgZXhwb3J0VG9QZGYoaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IGFueVtdW10sIGRvYzoganNQREYsIHN0YXJ0WTogbnVtYmVyLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiB7IFtrZXk6IG51bWJlcl06IGFueSB9ID0ge307XG4gICAgaGVhZGVycy5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICBjb2x1bW5TdHlsZXNbaV0gPSB7IGNlbGxXaWR0aDogJ2F1dG8nIH07XG4gICAgfSk7XG5cbiAgICBkb2MuYXV0b1RhYmxlKHtcbiAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcbiAgICAgIGJvZHk6IHJvd3MsXG4gICAgICBzdGFydFk6IHN0YXJ0WSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkU3R5bGVzOiB7XG4gICAgICAgIGZpbGxDb2xvcjogWzIyMCwgMjIwLCAyMjBdLFxuICAgICAgICB0ZXh0Q29sb3I6IDAsXG4gICAgICAgIGZvbnRTdHlsZTogJ2JvbGQnLFxuICAgICAgICBmb250U2l6ZTogOSxcbiAgICAgICAgaGFsaWduOiAnY2VudGVyJyxcbiAgICAgIH0sXG4gICAgICBib2R5U3R5bGVzOiB7XG4gICAgICAgIGZvbnRTaXplOiA4LFxuICAgICAgICBmaWxsQ29sb3I6IFsyNTUsIDI1NSwgMjU1XSxcbiAgICAgICAgdGV4dENvbG9yOiBbMCwgMCwgMF0sXG4gICAgICB9LFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGNlbGxQYWRkaW5nOiAyLFxuICAgICAgICBvdmVyZmxvdzogJ2xpbmVicmVhaycsXG4gICAgICAgIG1pbkNlbGxIZWlnaHQ6IDYsXG4gICAgICB9LFxuICAgICAgY29sdW1uU3R5bGVzOiBjb2x1bW5TdHlsZXMsXG4gICAgfSk7XG5cbiAgICBkb2Muc2F2ZShmaWxlTmFtZSk7XG4gIH1cblxuXG5cblxuXG4gIGV4cG9ydFRvRXhjZWwoXG4gICAgaGVhZGVyczogc3RyaW5nW10sXG4gICAgcm93czogYW55W11bXSxcbiAgICB3b3Jrc2hlZXQ6IEV4Y2VsSlMuV29ya3NoZWV0LFxuICAgIHdvcmtib29rOiBFeGNlbEpTLldvcmtib29rLFxuICAgIGZpbGVOYW1lOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgLy8gQWRkIGhlYWRlciByb3dcbiAgICBjb25zdCBoZWFkZXJSb3cgPSB3b3Jrc2hlZXQuYWRkUm93KGhlYWRlcnMpO1xuICAgIGhlYWRlclJvdy5mb250ID0geyBib2xkOiB0cnVlIH07XG4gICAgaGVhZGVyUm93LmZpbGwgPSB7XG4gICAgICB0eXBlOiAncGF0dGVybicsXG4gICAgICBwYXR0ZXJuOiAnc29saWQnLFxuICAgICAgZmdDb2xvcjogeyBhcmdiOiAnRDlEOUQ5JyB9XG4gICAgfTtcbiAgICBoZWFkZXJSb3cuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XG4gICAgaGVhZGVyUm93LmJvcmRlciA9IHtcbiAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXG4gICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSwgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGFTdGFydFJvdyA9IHdvcmtzaGVldC5sYXN0Um93IS5udW1iZXIgKyAxO1xuXG4gICAgLy8gQWRkIGRhdGEgcm93c1xuICAgIHJvd3MuZm9yRWFjaChyb3dEYXRhID0+IHtcbiAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuYWRkUm93KHJvd0RhdGEpO1xuICAgICAgZGF0YVJvdy5ib3JkZXIgPSB7XG4gICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXG4gICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b3RhbENvbHVtbnMgPSBoZWFkZXJzLmxlbmd0aDtcblxuICAgIC8vIEF1dG8td2lkdGggZm9yIGVhY2ggY29sdW1uXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxDb2x1bW5zOyBpKyspIHtcbiAgICAgIGxldCBtYXhMZW5ndGggPSA1O1xuICAgICAgY29uc3QgaGVhZGVyVmFsID0gaGVhZGVyUm93LmdldENlbGwoaSkudmFsdWU/LnRvU3RyaW5nKCkgPz8gJyc7XG4gICAgICBtYXhMZW5ndGggPSBNYXRoLm1heChtYXhMZW5ndGgsIGhlYWRlclZhbC5sZW5ndGgpO1xuXG4gICAgICBmb3IgKGxldCByb3dOdW0gPSBkYXRhU3RhcnRSb3c7IHJvd051bSA8PSB3b3Jrc2hlZXQubGFzdFJvdyEubnVtYmVyOyByb3dOdW0rKykge1xuICAgICAgICBjb25zdCBjZWxsID0gd29ya3NoZWV0LmdldFJvdyhyb3dOdW0pLmdldENlbGwoaSk7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNlbGwudmFsdWUgPyBjZWxsLnZhbHVlLnRvU3RyaW5nKCkgOiAnJztcbiAgICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXgobWF4TGVuZ3RoLCB2YWwubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgd29ya3NoZWV0LmdldENvbHVtbihpKS53aWR0aCA9IG1heExlbmd0aCArIDI7XG4gICAgfVxuXG4gICAgLy8gRXhwb3J0IGFzIEV4Y2VsIGZpbGVcbiAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihidWZmZXIgPT4ge1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCdcbiAgICAgIH0pO1xuICAgICAgRmlsZVNhdmVyLnNhdmVBcyhibG9iLCBmaWxlTmFtZSk7XG4gICAgfSk7XG4gIH1cblxuXG5cblxuXG5cbiAgZXhwb3J0VG9Dc3YoXG4gICAgaGVhZGVyczogc3RyaW5nW10sXG4gICAgcm93czogc3RyaW5nW11bXSxcbiAgICBtZXRhZGF0YTogc3RyaW5nW11bXSA9IFtdLFxuICAgIGZpbGVOYW1lOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgLy8gQ29tYmluZSBtZXRhZGF0YSArIGJsYW5rIGxpbmUgKyBoZWFkZXJzICsgZGF0YVxuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbLi4ubWV0YWRhdGEsIFtdLCBoZWFkZXJzLCAuLi5yb3dzXVxuICAgICAgLm1hcChlID0+IGUuam9pbignLCcpKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgdGhpcy5kb3dubG9hZEZpbGUoY3N2Q29udGVudCwgZmlsZU5hbWUsICd0ZXh0L2NzdicpO1xuICB9XG5cbiAgcHJpdmF0ZSBkb3dubG9hZEZpbGUoZGF0YTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGUgfSk7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGxpbmsuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICB9XG5cblxuXG5cbn1cbiJdfQ==
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDOztBQVl4QyxNQUFNLE9BQU8sYUFBYTtJQU94QjtRQUxpQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUlsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNERBQTREO0lBQ3BELGlCQUFpQixDQUFDLFNBQWlCO1FBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUM5QixHQUFHLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztZQUVwQixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDaEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxD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QVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XG5pbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XG5pbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnO1xuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG5cbmRlY2xhcmUgbW9kdWxlICdqc3BkZicge1xuICBpbnRlcmZhY2UganNQREYge1xuICAgIGF1dG9UYWJsZTogKG9wdGlvbnM6IGFueSkgPT4ganNQREY7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwZGZGb250U2l6ZSA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBkZkxpbmVIZWlnaHQgPSA3O1xuICBwcml2YXRlIHJlYWRvbmx5IHBkZkxlZnRNYXJnaW4gPSAxNTtcbiAgcHJpdmF0ZSBsb2dvQmFzZTY0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkSW1hZ2VBc0Jhc2U2NCgnYXNzZXRzL2ltYWdlcy9YTUxvZ28ucG5nJykudGhlbihiYXNlNjQgPT4ge1xuICAgICAgdGhpcy5sb2dvQmFzZTY0ID0gYmFzZTY0O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFV0aWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgbG9hZEltYWdlQXNCYXNlNjQoaW1hZ2VQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgaW1nLnNyYyA9IGltYWdlUGF0aDtcblxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSA2O1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoICogc2NhbGU7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0ICogc2NhbGU7XG5cbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICBjdHguc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJywgMS4wKTsgLy8gMS4wID0gaGlnaGVzdCBxdWFsaXR5XG4gICAgICAgICAgcmVzb2x2ZShiYXNlNjQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnRmFpbGVkIHRvIGdldCBjYW52YXMgY29udGV4dC4nKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgaW1hZ2VQYXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdERhdGUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gJycgOlxuICAgICAgYCR7ZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS8keyhkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9LyR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gIH1cbiAgZm9ybWF0RGF0ZVRpbWUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2RhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0vYCArXG4gICAgICBgJHsoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS9gICtcbiAgICAgIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0gYCArXG4gICAgICBgJHtkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfTpgICtcbiAgICAgIGAke2RhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgZ2VuZXJhdGVSZXBvcnRNZXRhZGF0YShtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdKTogW3N0cmluZywgc3RyaW5nXVtdIHtcbiAgICByZXR1cm4gbWV0YWRhdGEuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKTtcbiAgfVxuXG4gIHByZXBhcmVFeHBvcnRUYWJsZShkYXRhOiBhbnlbXSwgY29sdW1uRGVmczogYW55W10sIG9wdGlvbnM6IHtcbiAgICBleGNsdWRlRmllbGRzPzogc3RyaW5nW10sXG4gICAgY3VycmVuY3lGaWVsZHM/OiBzdHJpbmdbXVxuICB9ID0ge30pOiB7IGhlYWRlcnM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXVtdIH0ge1xuICAgIGNvbnN0IHsgZXhjbHVkZUZpZWxkcyA9IFsnc3JubycsICdzZXJpYWwnLCAnYWN0aW9uJ10sIGN1cnJlbmN5RmllbGRzID0gW10gfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSBjb2x1bW5EZWZzLmZpbHRlcihjb2wgPT5cbiAgICAgIGNvbC5maWVsZCAmJlxuICAgICAgIWV4Y2x1ZGVGaWVsZHMuc29tZShleCA9PiBjb2wuZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhleCkpICYmXG4gICAgICAhZXhjbHVkZUZpZWxkcy5zb21lKGV4ID0+IGNvbC5oZWFkZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGV4KSlcbiAgICApO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IFsnU3IgTm8nLCAuLi5maWx0ZXJlZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyTmFtZSB8fCBjb2wuZmllbGQpXTtcblxuICAgIGNvbnN0IHJvd3MgPSBkYXRhLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93RGF0YSA9IGZpbHRlcmVkQ29sdW1ucy5tYXAoY29sID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gcm93W2NvbC5maWVsZF07XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGNvbC5maWVsZD8udG9Mb3dlckNhc2UoKSB8fCAnJztcblxuICAgICAgICAvLyBIYW5kbGUgdmFyaW91cyBkYXRlIGZpZWxkIG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZmllbGROYW1lLmluY2x1ZGVzKCdkYXRlJykgfHxcbiAgICAgICAgICAgIGZpZWxkTmFtZS5pbmNsdWRlcygnYnVzaW5lc3NkYXRlJykpICYmXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdERhdGUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbmN5IGZpZWxkc1xuICAgICAgICBpZiAoY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKDMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSA/PyAnJztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtpbmRleCArIDEsIC4uLnJvd0RhdGFdO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGhlYWRlcnMsIHJvd3MgfTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQREYgVW5pdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBhc3luYyBleHBvcnRUb1BkZlVuaXZlcnNhbCh0aXRsZTogc3RyaW5nLCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdLCBoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogYW55W11bXSwgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7IG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJywgdW5pdDogJ21tJywgZm9ybWF0OiBbNDAwLCAyMTBdIH0pO1xuXG4gICAgY29uc3QgbG9nb1dpZHRoID0gMzguNCwgbG9nb0hlaWdodCA9IDE3LjUsIGxvZ29YID0gMTUsIGxvZ29ZID0gMTA7XG4gICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IHRpdGxlWSA9IDE4O1xuXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xuICAgICAgZG9jLmFkZEltYWdlKHRoaXMubG9nb0Jhc2U2NCwgJ1BORycsIGxvZ29YLCBsb2dvWSwgbG9nb1dpZHRoLCBsb2dvSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBkb2Muc2V0Rm9udFNpemUoMTUpO1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy50ZXh0KHRpdGxlLCBwYWdlV2lkdGggLyAyLCB0aXRsZVksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgbGV0IGN1cnJlbnRZID0gdGl0bGVZICsgMTQ7XG4gICAgZG9jLnNldEZvbnRTaXplKHRoaXMucGRmRm9udFNpemUpO1xuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdLCBpKSA9PiB7XG4gICAgICBjb25zdCB5ID0gY3VycmVudFkgKyBpICogdGhpcy5wZGZMaW5lSGVpZ2h0O1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgICBkb2MudGV4dChsYWJlbCwgdGhpcy5wZGZMZWZ0TWFyZ2luLCB5KTtcbiAgICAgIGNvbnN0IGxhYmVsV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGxhYmVsICsgJyAnKTtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgdGhpcy5wZGZMZWZ0TWFyZ2luICsgbGFiZWxXaWR0aCwgeSk7XG4gICAgfSk7XG4gICAgY3VycmVudFkgKz0gbWV0YWRhdGEubGVuZ3RoICogdGhpcy5wZGZMaW5lSGVpZ2h0ICsgNTtcblxuICAgIGNvbnN0IGNvbHVtblN0eWxlczogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHt9O1xuICAgIGhlYWRlcnMuZm9yRWFjaCgoXywgaSkgPT4gY29sdW1uU3R5bGVzW2ldID0geyBjZWxsV2lkdGg6ICdhdXRvJyB9KTtcblxuICAgIGRvYy5hdXRvVGFibGUoe1xuICAgICAgaGVhZDogW2hlYWRlcnNdLFxuICAgICAgYm9keTogcm93cyxcbiAgICAgIHN0YXJ0WTogY3VycmVudFksXG4gICAgICB0aGVtZTogJ2dyaWQnLFxuICAgICAgaGVhZFN0eWxlczoge1xuICAgICAgICBmaWxsQ29sb3I6IFsyMjAsIDIyMCwgMjIwXSwgdGV4dENvbG9yOiAwLFxuICAgICAgICBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDksIGhhbGlnbjogJ2NlbnRlcicsXG4gICAgICB9LFxuICAgICAgYm9keVN0eWxlczogeyBmb250U2l6ZTogOCwgZmlsbENvbG9yOiBbMjU1LCAyNTUsIDI1NV0sIHRleHRDb2xvcjogWzAsIDAsIDBdIH0sXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIG92ZXJmbG93OiAnbGluZWJyZWFrJywgbWluQ2VsbEhlaWdodDogNiB9LFxuICAgICAgY29sdW1uU3R5bGVzXG4gICAgfSk7XG5cbiAgICBkb2Muc2F2ZShmaWxlTmFtZSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXhjZWwgVW5pdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBleHBvcnRUb0V4Y2VsVW5pdmVyc2FsKHRpdGxlOiBzdHJpbmcsIG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10sIGhlYWRlcnM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXVtdLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCh0aXRsZSk7XG5cbiAgICBsZXQgY3VycmVudFJvdyA9IDE7XG5cbiAgICAvLyBBZGQgaW1hZ2UgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcbiAgICAgIGNvbnN0IGltYWdlSWQgPSB3b3JrYm9vay5hZGRJbWFnZSh7XG4gICAgICAgIGJhc2U2NDogYmFzZTY0RGF0YSxcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQbGFjZSBpbWFnZSBhdCB0b3AtbGVmdCAoZS5nLiwgQTE6QzQpXG4gICAgICB3b3Jrc2hlZXQuYWRkSW1hZ2UoaW1hZ2VJZCwge1xuICAgICAgICB0bDogeyBjb2w6IDAsIHJvdzogMCB9LFxuICAgICAgICBleHQ6IHsgd2lkdGg6IDE0NSwgaGVpZ2h0OiA2NiB9LFxuICAgICAgICBlZGl0QXM6ICdvbmVDZWxsJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRpdGxlIGFsaWduZWQgaW4gbWlkZGxlIGhvcml6b250YWxseSAobWVyZ2VkIGFjcm9zcyBhbGwgY29sdW1ucylcbiAgICBjb25zdCB0aXRsZVJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdyk7XG4gICAgdGl0bGVSb3cuZ2V0Q2VsbCg0KS52YWx1ZSA9IHRpdGxlO1xuICAgIHRpdGxlUm93LmdldENlbGwoNCkuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDQpLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnbGVmdCcgfTtcblxuICAgIGNvbnN0IHRpdGxlTWVyZ2VFbmQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0ICsgaGVhZGVycy5sZW5ndGgpO1xuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGBEJHtjdXJyZW50Um93fToke3RpdGxlTWVyZ2VFbmR9JHtjdXJyZW50Um93fWApO1xuICAgIGN1cnJlbnRSb3cgKz0gMzsgLy8gTW92ZSBwYXN0IGltYWdlIHNwYWNlXG5cbiAgICAvLyBBZGQgbWV0YWRhdGFcbiAgICBtZXRhZGF0YS5mb3JFYWNoKChbbGFiZWwsIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xuICAgICAgY29uc3QgY2VsbCA9IHJvdy5nZXRDZWxsKDEpO1xuICAgICAgY2VsbC52YWx1ZSA9IHtcbiAgICAgICAgcmljaFRleHQ6IFtcbiAgICAgICAgICB7IHRleHQ6IGAke2xhYmVsfTogYCwgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcbiAgICAgICAgICB7IHRleHQ6IHZhbHVlID8/ICcnLCBmb250OiB7IGJvbGQ6IGZhbHNlIH0gfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYEEke3Jvdy5udW1iZXJ9OiR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NCArIGhlYWRlcnMubGVuZ3RoKX0ke3Jvdy5udW1iZXJ9YCk7XG4gICAgfSk7XG5cbiAgICB3b3Jrc2hlZXQuYWRkUm93KFtdKTtcbiAgICBjdXJyZW50Um93Kys7XG5cbiAgICAvLyBBZGQgdGFibGUgaGVhZGVyIHJvd1xuICAgIGNvbnN0IGhlYWRlclJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcbiAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlciwgaSkgPT4ge1xuICAgICAgY29uc3QgY2VsbCA9IGhlYWRlclJvdy5nZXRDZWxsKGkgKyAxKTtcbiAgICAgIGNlbGwudmFsdWUgPSBoZWFkZXI7XG4gICAgICBjZWxsLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcbiAgICAgIGNlbGwuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEOUQ5RDknIH0gfTtcbiAgICAgIGNlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XG4gICAgICBjZWxsLmJvcmRlciA9IHtcbiAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRhdGFTdGFydFJvdyA9IGN1cnJlbnRSb3c7XG4gICAgcm93cy5mb3JFYWNoKHJvd0RhdGEgPT4ge1xuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xuICAgICAgcm93RGF0YS5mb3JFYWNoKCh2YWx1ZSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBjZWxsID0gcm93LmdldENlbGwoaSArIDEpO1xuICAgICAgICBjZWxsLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGNlbGwuYm9yZGVyID0ge1xuICAgICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXG4gICAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcbiAgICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQXV0byBjb2x1bW4gd2lkdGhzXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1heExlbmd0aCA9IGhlYWRlcnNbaSAtIDFdLmxlbmd0aDtcbiAgICAgIGZvciAobGV0IHJvd051bSA9IGRhdGFTdGFydFJvdzsgcm93TnVtIDw9IHdvcmtzaGVldC5sYXN0Um93IS5udW1iZXI7IHJvd051bSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHdvcmtzaGVldC5nZXRSb3cocm93TnVtKS5nZXRDZWxsKGkpLnZhbHVlPy50b1N0cmluZygpIHx8ICcnO1xuICAgICAgICBtYXhMZW5ndGggPSBNYXRoLm1heChtYXhMZW5ndGgsIHZhbC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgd29ya3NoZWV0LmdldENvbHVtbihpKS53aWR0aCA9IG1heExlbmd0aCArIDI7XG4gICAgfVxuXG4gICAgd29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpLnRoZW4oYnVmZmVyID0+IHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXG4gICAgICB9KTtcbiAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgZmlsZU5hbWUpO1xuICAgIH0pO1xuICB9XG5cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1NWIFVuaXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZXhwb3J0VG9Dc3ZVbml2ZXJzYWwodGl0bGU6IHN0cmluZywgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXSwgaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IGFueVtdW10sIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhUm93cyA9IG1ldGFkYXRhLm1hcCgoW2ssIHZdKSA9PiBbYCR7a306ICR7dn1gXSk7XG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtcbiAgICAgIFt0aXRsZV0sXG4gICAgICAuLi5tZXRhUm93cyxcbiAgICAgIFtdLFxuICAgICAgaGVhZGVycyxcbiAgICAgIC4uLnJvd3MubWFwKHJvdyA9PiByb3cubWFwKHZhbHVlID0+IGBcIiR7dmFsdWV9XCJgKSlcbiAgICBdLm1hcChlID0+IGUuam9pbignLCcpKS5qb2luKCdcXG4nKTtcblxuICAgIHRoaXMuZG93bmxvYWRGaWxlKGNzdkNvbnRlbnQsIGZpbGVOYW1lLCAndGV4dC9jc3YnKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRGaWxlKGRhdGE6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlIH0pO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICBsaW5rLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgfVxuXG59XG4iXX0=