client-core-services 1.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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,166 @@
1
+ import { Injectable, EventEmitter } from '@angular/core';
2
+ import { json2csv } from 'json-2-csv';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class ChartService {
6
+ constructor(datePipe) {
7
+ this.datePipe = datePipe;
8
+ this.filterRest = new EventEmitter(false);
9
+ }
10
+ async getDownloadData(chart, object) {
11
+ let DataList = [];
12
+ let fileName = object.name;
13
+ let blobUrl = '';
14
+ await chart.getData().then((chartdata) => {
15
+ let data = chartdata.documents;
16
+ let fields = chartdata.fields;
17
+ if (data && data.length > 0) {
18
+ data.forEach((obj) => {
19
+ let modifyObj = {};
20
+ Object.keys(fields).forEach((key) => {
21
+ const value = fields[key];
22
+ const val = obj[key];
23
+ if (val && val.constructor && val.constructor.name == "Date") {
24
+ const format = object.dateFormat ? object.dateFormat : 'dd/MM/yyyy';
25
+ modifyObj[value] = this.datePipe.transform(val, format);
26
+ }
27
+ else {
28
+ modifyObj[value] = obj[key];
29
+ }
30
+ });
31
+ DataList.push(modifyObj);
32
+ });
33
+ }
34
+ if (DataList && DataList.length > 0) {
35
+ //blobUrl = this.downloadFile(DataList);
36
+ let csvData = json2csv(DataList);
37
+ blobUrl = this.createBlobUrl(csvData);
38
+ }
39
+ });
40
+ return {
41
+ url: blobUrl,
42
+ name: fileName
43
+ };
44
+ }
45
+ downloadFile(data) {
46
+ const replacer = (key, value) => (value === null ? '' : value); // specify how you want to handle null values here
47
+ const header = Object.keys(data[0]);
48
+ const csv = data.map((row) => header
49
+ .map((fieldName) => JSON.stringify(row[fieldName], replacer))
50
+ .join(','));
51
+ csv.unshift(header.join(','));
52
+ const csvArray = csv.join('\r\n');
53
+ return this.createBlobUrl(csvArray);
54
+ }
55
+ createBlobUrl(value) {
56
+ return new Blob([value], { type: 'text/csv' });
57
+ }
58
+ downlodBlobData(blob, fileName) {
59
+ const a = document.createElement('a');
60
+ const url = window.URL.createObjectURL(blob);
61
+ a.href = url;
62
+ a.download = fileName;
63
+ a.click();
64
+ window.URL.revokeObjectURL(url);
65
+ a.remove();
66
+ }
67
+ resetChartFilter() {
68
+ this.filterRest.emit(true);
69
+ }
70
+ getFilterData(dashbord, formValue) {
71
+ let fields = dashbord.fields && dashbord.fields.length > 0 ? dashbord.fields : [];
72
+ let filterValue = this.getMongochartFilterValue(fields, formValue);
73
+ let filterData = this.getMongodbFilterObject(filterValue);
74
+ return filterData;
75
+ }
76
+ getMongochartFilterValue(fields, object) {
77
+ let modifyObject = {};
78
+ let objectCopy = JSON.parse(JSON.stringify(object));
79
+ if (fields && fields.length > 0 && Object.keys(objectCopy).length > 0) {
80
+ fields.forEach((field) => {
81
+ let key = field.field_name;
82
+ if (object && object[key] && object[key] != '') {
83
+ let newDateObjec = {};
84
+ let date = new Date();
85
+ switch (field.type) {
86
+ case 'typeahead':
87
+ if (objectCopy[key] && typeof objectCopy[key] == 'object') {
88
+ modifyObject[key + '._id'] = objectCopy[key]._id;
89
+ }
90
+ else {
91
+ modifyObject[key] = objectCopy[key];
92
+ }
93
+ break;
94
+ case 'dropdown':
95
+ if (field.datatype == "object") {
96
+ if (field.multi_select) {
97
+ let idList = [];
98
+ if (object[key] && object[key].length > 0) {
99
+ object[key].forEach((data) => {
100
+ idList.push(data._id);
101
+ });
102
+ }
103
+ if (idList && idList.length > 0) {
104
+ modifyObject[key + '._id'] = idList;
105
+ }
106
+ }
107
+ else {
108
+ modifyObject[key + '._id'] = objectCopy[key]._id;
109
+ }
110
+ }
111
+ else {
112
+ modifyObject[key] = objectCopy[key];
113
+ }
114
+ break;
115
+ case 'date':
116
+ let formateDate = this.datePipe.transform(objectCopy[key], 'yyyy-MM-dd');
117
+ let selectedDate = new Date(formateDate);
118
+ selectedDate.setTime(selectedDate.getTime() + (24 * 3600000));
119
+ newDateObjec = {};
120
+ date = new Date(formateDate);
121
+ newDateObjec['$gt'] = date;
122
+ newDateObjec['$lte'] = selectedDate;
123
+ modifyObject[key] = newDateObjec;
124
+ break;
125
+ case 'daterange':
126
+ if (object[key].start && object[key].end && object[key].start != '' && object[key].end != '') {
127
+ let startDate = this.datePipe.transform(object[key].start, 'yyyy-MM-dd');
128
+ let endDate = this.datePipe.transform(object[key].end, 'yyyy-MM-dd');
129
+ let modifyEndDate = new Date(endDate);
130
+ modifyEndDate.setTime(modifyEndDate.getTime() + (24 * 3600000));
131
+ newDateObjec = {};
132
+ newDateObjec['$gt'] = new Date(startDate);
133
+ newDateObjec['$lte'] = new Date(modifyEndDate);
134
+ modifyObject[key] = newDateObjec;
135
+ }
136
+ break;
137
+ default:
138
+ modifyObject[key] = objectCopy[key];
139
+ break;
140
+ }
141
+ }
142
+ });
143
+ }
144
+ return modifyObject;
145
+ }
146
+ getMongodbFilterObject(data) {
147
+ let object = {};
148
+ if (Object.keys(data).length > 0) {
149
+ Object.keys(data).forEach(key => {
150
+ if (data[key] && data[key] != '') {
151
+ object[key] = data[key];
152
+ }
153
+ });
154
+ }
155
+ return object;
156
+ }
157
+ }
158
+ ChartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
159
+ ChartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, providedIn: 'root' });
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChartService, decorators: [{
161
+ type: Injectable,
162
+ args: [{
163
+ providedIn: 'root'
164
+ }]
165
+ }], ctorParameters: function () { return [{ type: i1.DatePipe }]; } });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvY2hhcnQvY2hhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFDLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFLdEMsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFDVSxRQUFpQjtRQUFqQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBRjNCLGVBQVUsR0FBcUIsSUFBSSxZQUFZLENBQU0sS0FBSyxDQUFDLENBQUM7SUFHeEQsQ0FBQztJQUVMLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBUyxFQUFDLE1BQVU7UUFDeEMsSUFBSSxRQUFRLEdBQU8sRUFBRSxDQUFDO1FBQ3RCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDL0IsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM5QixJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO29CQUN2QixJQUFJLFNBQVMsR0FBTyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2xDLE1BQU0sS0FBSyxHQUFH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QUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSxFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsganNvbjJjc3YgfSBmcm9tICdqc29uLTItY3N2JztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXJ0U2VydmljZSB7XHJcblxyXG4gIGZpbHRlclJlc3Q6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oZmFsc2UpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTpEYXRlUGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIGdldERvd25sb2FkRGF0YShjaGFydDphbnksb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgRGF0YUxpc3Q6YW55ID0gW107XHJcbiAgICBsZXQgZmlsZU5hbWUgPSBvYmplY3QubmFtZTtcclxuICAgIGxldCBibG9iVXJsIDphbnkgPSAnJztcclxuICAgIGF3YWl0IGNoYXJ0LmdldERhdGEoKS50aGVuKChjaGFydGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgZGF0YSA9IGNoYXJ0ZGF0YS5kb2N1bWVudHM7XHJcbiAgICAgIGxldCBmaWVsZHMgPSBjaGFydGRhdGEuZmllbGRzO1xyXG4gICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChvYmo6YW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgbW9kaWZ5T2JqOmFueSA9IHt9O1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gb2JqW2tleV1cclxuICAgICAgICAgICAgaWYodmFsICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB2YWwuY29uc3RydWN0b3IubmFtZSA9PSBcIkRhdGVcIil7XHJcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gb2JqZWN0LmRhdGVGb3JtYXQgPyBvYmplY3QuZGF0ZUZvcm1hdCA6ICdkZC9NTS95eXl5JztcclxuICAgICAgICAgICAgICBtb2RpZnlPYmpbdmFsdWVdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsLGZvcm1hdCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIG1vZGlmeU9ialt2YWx1ZV0gPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBEYXRhTGlzdC5wdXNoKG1vZGlmeU9iaik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoRGF0YUxpc3QgJiYgRGF0YUxpc3QubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgLy9ibG9iVXJsID0gdGhpcy5kb3dubG9hZEZpbGUoRGF0YUxpc3QpO1xyXG4gICAgICAgIGxldCBjc3ZEYXRhID0ganNvbjJjc3YoRGF0YUxpc3QpO1xyXG4gICAgICAgIGJsb2JVcmwgPSB0aGlzLmNyZWF0ZUJsb2JVcmwoY3N2RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdXJsOiBibG9iVXJsLFxyXG4gICAgICBuYW1lOiBmaWxlTmFtZVxyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgZG93bmxvYWRGaWxlKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgcmVwbGFjZXIgPSAoa2V5OmFueSwgdmFsdWU6YW55KSA9PiAodmFsdWUgPT09IG51bGwgPyAnJyA6IHZhbHVlKTsgLy8gc3BlY2lmeSBob3cgeW91IHdhbnQgdG8gaGFuZGxlIG51bGwgdmFsdWVzIGhlcmVcclxuICAgIGNvbnN0IGhlYWRlciA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xyXG4gICAgY29uc3QgY3N2ID0gZGF0YS5tYXAoKHJvdzphbnkpID0+XHJcbiAgICAgIGhlYWRlclxyXG4gICAgICAgIC5tYXAoKGZpZWxkTmFtZSkgPT4gSlNPTi5zdHJpbmdpZnkocm93W2ZpZWxkTmFtZV0sIHJlcGxhY2VyKSlcclxuICAgICAgICAuam9pbignLCcpXHJcbiAgICApO1xyXG4gICAgY3N2LnVuc2hpZnQoaGVhZGVyLmpvaW4oJywnKSk7XHJcbiAgICBjb25zdCBjc3ZBcnJheSA9IGNzdi5qb2luKCdcXHJcXG4nKTtcclxuICAgIHJldHVybiAgdGhpcy5jcmVhdGVCbG9iVXJsKGNzdkFycmF5KTtcclxuICB9XHJcbiAgY3JlYXRlQmxvYlVybCh2YWx1ZTphbnkpe1xyXG4gICAgcmV0dXJuIG5ldyBCbG9iKFt2YWx1ZV0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcclxuICB9XHJcbiAgZG93bmxvZEJsb2JEYXRhKGJsb2I6YW55LGZpbGVOYW1lOnN0cmluZyl7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgIGEuaHJlZiA9IHVybDtcclxuICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgICBhLmNsaWNrKCk7XHJcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgICAgIGEucmVtb3ZlKCk7XHJcbiAgfVxyXG4gIHJlc2V0Q2hhcnRGaWx0ZXIoKXtcclxuICAgIHRoaXMuZmlsdGVyUmVzdC5lbWl0KHRydWUpO1xyXG4gIH1cclxuICBnZXRGaWx0ZXJEYXRhKGRhc2hib3JkOmFueSxmb3JtVmFsdWU6YW55KXtcclxuICAgIGxldCBmaWVsZHMgPSBkYXNoYm9yZC5maWVsZHMgJiYgZGFzaGJvcmQuZmllbGRzLmxlbmd0aCA+IDAgPyBkYXNoYm9yZC5maWVsZHMgOiBbXTtcclxuICAgIGxldCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZ2V0TW9uZ29jaGFydEZpbHRlclZhbHVlKGZpZWxkcyxmb3JtVmFsdWUpO1xyXG4gICAgbGV0IGZpbHRlckRhdGEgPSB0aGlzLmdldE1vbmdvZGJGaWx0ZXJPYmplY3QoZmlsdGVyVmFsdWUpO1xyXG4gICAgcmV0dXJuIGZpbHRlckRhdGE7XHJcbiAgfVxyXG4gIGdldE1vbmdvY2hhcnRGaWx0ZXJWYWx1ZShmaWVsZHM6YW55LG9iamVjdDphbnkpe1xyXG4gICAgbGV0IG1vZGlmeU9iamVjdDphbnkgPSB7fTtcclxuICAgIGxldCBvYmplY3RDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhvYmplY3RDb3B5KS5sZW5ndGggPiAwKXtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3Rba2V5XSAmJiBvYmplY3Rba2V5XSAhPSAnJyl7XHJcbiAgICAgICAgICBsZXQgbmV3RGF0ZU9iamVjOmFueSA9IHt9O1xyXG4gICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3R5cGVhaGVhZCc6XHJcbiAgICAgICAgICAgICAgaWYob2JqZWN0Q29weVtrZXldICYmIHR5cGVvZiBvYmplY3RDb3B5W2tleV0gPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgbW9kaWZ5T2JqZWN0W2tleSsnLl9pZCddID0gb2JqZWN0Q29weVtrZXldLl9pZDtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXldID0gb2JqZWN0Q29weVtrZXldO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZHJvcGRvd24nOlxyXG4gICAgICAgICAgICAgIGlmKGZpZWxkLmRhdGF0eXBlID09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQubXVsdGlfc2VsZWN0KXtcclxuICAgICAgICAgICAgICAgICAgbGV0IGlkTGlzdDphbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYob2JqZWN0W2tleV0gJiYgb2JqZWN0W2tleV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0uZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlkTGlzdC5wdXNoKGRhdGEuX2lkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihpZExpc3QgJiYgaWRMaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXkrJy5faWQnXSA9IGlkTGlzdDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdFtrZXkrJy5faWQnXSA9IG9iamVjdENvcHlba2V5XS5faWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9IG9iamVjdENvcHlba2V5XTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgICAgIGxldCBmb3JtYXRlRGF0ZTphbnkgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShvYmplY3RDb3B5W2tleV0sICd5eXl5LU1NLWRkJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGZvcm1hdGVEYXRlKTtcclxuICAgICAgICAgICAgICBzZWxlY3RlZERhdGUuc2V0VGltZShzZWxlY3RlZERhdGUuZ2V0VGltZSgpKygyNCozNjAwMDAwKSk7XHJcbiAgICAgICAgICAgICAgbmV3RGF0ZU9iamVjID0ge307XHJcbiAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGZvcm1hdGVEYXRlKTtcclxuICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRndCddID0gZGF0ZTtcclxuICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRsdGUnXSA9IHNlbGVjdGVkRGF0ZTtcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9ICBuZXdEYXRlT2JqZWM7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGVyYW5nZSc6XHJcbiAgICAgICAgICAgICAgaWYob2JqZWN0W2tleV0uc3RhcnQgJiYgb2JqZWN0W2tleV0uZW5kICYmIG9iamVjdFtrZXldLnN0YXJ0ICE9ICcnICYmIG9iamVjdFtrZXldLmVuZCAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnREYXRlOmFueSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG9iamVjdFtrZXldLnN0YXJ0LCd5eXl5LU1NLWRkJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kRGF0ZTphbnkgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShvYmplY3Rba2V5XS5lbmQsJ3l5eXktTU0tZGQnKTtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RpZnlFbmREYXRlID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBtb2RpZnlFbmREYXRlLnNldFRpbWUobW9kaWZ5RW5kRGF0ZS5nZXRUaW1lKCkrKDI0KjM2MDAwMDApKTtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGVPYmplYyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbmV3RGF0ZU9iamVjWyckZ3QnXSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBuZXdEYXRlT2JqZWNbJyRsdGUnXSA9IG5ldyBEYXRlKG1vZGlmeUVuZERhdGUpO1xyXG4gICAgICAgICAgICAgICAgbW9kaWZ5T2JqZWN0W2tleV0gPSAgbmV3RGF0ZU9iamVjO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBtb2RpZnlPYmplY3Rba2V5XSA9IG9iamVjdENvcHlba2V5XTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeU9iamVjdDtcclxuICB9XHJcbiAgZ2V0TW9uZ29kYkZpbHRlck9iamVjdChkYXRhOmFueSl7XHJcbiAgICBsZXQgb2JqZWN0OmFueSA9IHt9O1xyXG4gICAgaWYoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCl7XHJcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBpZihkYXRhW2tleV0gJiYgZGF0YVtrZXldICE9ICcnKXtcclxuICAgICAgICAgIG9iamVjdFtrZXldID0gZGF0YVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxufVxyXG4iXX0=