dts-backoffice-util 5.0.0 → 6.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 (57) hide show
  1. package/README.md +1 -1
  2. package/dts-backoffice-util.d.ts +1 -0
  3. package/{esm2015/dts-backoffice-util.js → esm2020/dts-backoffice-util.mjs} +0 -0
  4. package/esm2020/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.mjs +269 -0
  5. package/{esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.js → esm2020/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.mjs} +0 -0
  6. package/esm2020/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.mjs +183 -0
  7. package/esm2020/lib/dts-backoffice-util.module.mjs +56 -0
  8. package/{esm2015/lib/interfaces/filter-range.interface.js → esm2020/lib/interfaces/filter-range.interface.mjs} +0 -0
  9. package/{esm2015/lib/interfaces/totvs-response.interface.js → esm2020/lib/interfaces/totvs-response.interface.mjs} +0 -0
  10. package/{esm2015/lib/model/session-info.model.js → esm2020/lib/model/session-info.model.mjs} +0 -0
  11. package/esm2020/lib/pipes/dts-date-format.pipe.mjs +20 -0
  12. package/esm2020/lib/services/breadcrumb-control.service.mjs +82 -0
  13. package/esm2020/lib/services/cache-params.service.mjs +25 -0
  14. package/esm2020/lib/services/menu-datasul.service.mjs +41 -0
  15. package/esm2020/lib/services/profile.service.mjs +55 -0
  16. package/esm2020/lib/services/report.service.mjs +57 -0
  17. package/esm2020/lib/services/session-info.service.mjs +36 -0
  18. package/esm2020/lib/services/translate.service.mjs +23 -0
  19. package/{esm2015/lib/utils/date.util.js → esm2020/lib/utils/date.util.mjs} +0 -0
  20. package/{esm2015/lib/utils/disclaimer.util.js → esm2020/lib/utils/disclaimer.util.mjs} +0 -0
  21. package/{esm2015/lib/utils/field-validation.util.js → esm2020/lib/utils/field-validation.util.mjs} +0 -0
  22. package/esm2020/lib/utils/file.util.mjs +122 -0
  23. package/{esm2015/lib/utils/filter-range.util.js → esm2020/lib/utils/filter-range.util.mjs} +0 -0
  24. package/{esm2015/lib/utils/generic-functions.utils.js → esm2020/lib/utils/generic-functions.utils.mjs} +0 -0
  25. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  26. package/fesm2015/{dts-backoffice-util.js → dts-backoffice-util.mjs} +132 -181
  27. package/fesm2015/dts-backoffice-util.mjs.map +1 -0
  28. package/fesm2020/dts-backoffice-util.mjs +1844 -0
  29. package/fesm2020/dts-backoffice-util.mjs.map +1 -0
  30. package/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.d.ts +3 -0
  31. package/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.d.ts +3 -0
  32. package/lib/dts-backoffice-util.module.d.ts +10 -0
  33. package/lib/pipes/dts-date-format.pipe.d.ts +3 -0
  34. package/lib/services/breadcrumb-control.service.d.ts +3 -0
  35. package/lib/services/cache-params.service.d.ts +3 -0
  36. package/lib/services/menu-datasul.service.d.ts +3 -0
  37. package/lib/services/profile.service.d.ts +3 -0
  38. package/lib/services/report.service.d.ts +3 -0
  39. package/lib/services/session-info.service.d.ts +3 -0
  40. package/lib/services/translate.service.d.ts +3 -0
  41. package/package.json +22 -10
  42. package/bundles/dts-backoffice-util.umd.js +0 -2017
  43. package/bundles/dts-backoffice-util.umd.js.map +0 -1
  44. package/dts-backoffice-util.metadata.json +0 -1
  45. package/esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.js +0 -274
  46. package/esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.js +0 -190
  47. package/esm2015/lib/dts-backoffice-util.module.js +0 -40
  48. package/esm2015/lib/pipes/dts-date-format.pipe.js +0 -17
  49. package/esm2015/lib/services/breadcrumb-control.service.js +0 -88
  50. package/esm2015/lib/services/cache-params.service.js +0 -32
  51. package/esm2015/lib/services/menu-datasul.service.js +0 -47
  52. package/esm2015/lib/services/profile.service.js +0 -65
  53. package/esm2015/lib/services/report.service.js +0 -65
  54. package/esm2015/lib/services/session-info.service.js +0 -46
  55. package/esm2015/lib/services/translate.service.js +0 -21
  56. package/esm2015/lib/utils/file.util.js +0 -128
  57. package/fesm2015/dts-backoffice-util.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ export class UserLoginService {
7
+ constructor(http) {
8
+ this.http = http;
9
+ this.apiUrl = '/totvs-menu/rest/getSessionInfo';
10
+ this.userLogin = undefined;
11
+ }
12
+ getUserLogin() {
13
+ if (localStorage.getItem('username')) {
14
+ return of(localStorage.getItem('username'));
15
+ }
16
+ if (this.userLogin) {
17
+ return of(this.userLogin);
18
+ }
19
+ else {
20
+ return this.http.get(`${this.apiUrl}`)
21
+ .pipe(map((response) => {
22
+ this.userLogin = response.userName;
23
+ return response.userName;
24
+ }));
25
+ }
26
+ }
27
+ }
28
+ /** @nocollapse */ UserLoginService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UserLoginService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
29
+ /** @nocollapse */ UserLoginService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UserLoginService, providedIn: 'root' });
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UserLoginService, decorators: [{
31
+ type: Injectable,
32
+ args: [{
33
+ providedIn: 'root'
34
+ }]
35
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1pbmZvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvc2VydmljZXMvc2Vzc2lvbi1pbmZvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS3JDLE1BQU0sT0FBTyxnQkFBZ0I7SUFLekIsWUFBbUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUgxQixXQUFNLEdBQUcsaUNBQWlDLENBQUM7UUFDcEQsY0FBUyxHQUFHLFNBQVMsQ0FBQztJQUVpQixDQUFDO0lBRXhDLFlBQVk7UUFDUixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBZSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ25DLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1g7SUFDTCxDQUFDOztpSUFyQlEsZ0JBQWdCO3FJQUFoQixnQkFBZ0IsY0FGYixNQUFNOzRGQUVULGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IElTZXNzaW9uSW5mbyB9IGZyb20gJy4uL21vZGVsL3Nlc3Npb24taW5mby5tb2RlbCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckxvZ2luU2VydmljZSB7XHJcblxyXG4gICAgcmVhZG9ubHkgYXBpVXJsID0gJy90b3R2cy1tZW51L3Jlc3QvZ2V0U2Vzc2lvbkluZm8nO1xyXG4gICAgdXNlckxvZ2luID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuXHJcbiAgICBnZXRVc2VyTG9naW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJuYW1lJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VybmFtZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZXJMb2dpbikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy51c2VyTG9naW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElTZXNzaW9uSW5mbz4oYCR7dGhpcy5hcGlVcmx9YClcclxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJMb2dpbiA9IHJlc3BvbnNlLnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS51c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,23 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class TranslateService {
4
+ static getSuportLanguage() {
5
+ return ['pt-BR', 'pt', 'en-US', 'en', 'es'];
6
+ }
7
+ static getDefaultCurrencyCode() {
8
+ return '$';
9
+ }
10
+ static getCurrentLanguage() {
11
+ const locale = localStorage.getItem('user.language') || navigator.language;
12
+ if (locale && this.getSuportLanguage().includes(locale)) {
13
+ return locale;
14
+ }
15
+ return 'en-US';
16
+ }
17
+ }
18
+ /** @nocollapse */ TranslateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TranslateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
19
+ /** @nocollapse */ TranslateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TranslateService });
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TranslateService, decorators: [{
21
+ type: Injectable
22
+ }] });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUV6QixNQUFNLENBQUMsaUJBQWlCO1FBQ3BCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0I7UUFDekIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQjtRQUNyQixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFFM0UsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUUzRSxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDOztpSUFoQlEsZ0JBQWdCO3FJQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZVNlcnZpY2Uge1xyXG5cclxuICAgIHN0YXRpYyBnZXRTdXBvcnRMYW5ndWFnZSgpIHtcclxuICAgICAgICByZXR1cm4gWydwdC1CUicsICdwdCcsICdlbi1VUycsICdlbicsICdlcyddO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXREZWZhdWx0Q3VycmVuY3lDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiAnJCc7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEN1cnJlbnRMYW5ndWFnZSgpIHtcclxuICAgICAgICBjb25zdCBsb2NhbGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci5sYW5ndWFnZScpIHx8IG5hdmlnYXRvci5sYW5ndWFnZTtcclxuXHJcbiAgICAgICAgaWYgKGxvY2FsZSAmJiB0aGlzLmdldFN1cG9ydExhbmd1YWdlKCkuaW5jbHVkZXMobG9jYWxlKSkgeyByZXR1cm4gbG9jYWxlOyB9XHJcblxyXG4gICAgICAgIHJldHVybiAnZW4tVVMnO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,122 @@
1
+ export class FileUtil {
2
+ constructor() { }
3
+ static downloadFile(data, fileName, contentType, base64) {
4
+ base64 = (base64 === false) ? false : true;
5
+ const dataBlob = base64 ? this.b64toBlob(data, contentType) : data;
6
+ this.download(dataBlob, fileName);
7
+ }
8
+ static downloadData(data, dwldDataParam = null) {
9
+ if (!data) {
10
+ return;
11
+ }
12
+ if (!dwldDataParam) {
13
+ dwldDataParam = new DownloadDataParams();
14
+ }
15
+ if (!dwldDataParam.fileName) {
16
+ dwldDataParam.fileName = 'data.csv';
17
+ }
18
+ if (!dwldDataParam.literals) {
19
+ dwldDataParam.literals = {};
20
+ }
21
+ if (!dwldDataParam.columnDelimiter) {
22
+ dwldDataParam.columnDelimiter = ';';
23
+ }
24
+ if (!dwldDataParam.columnList) {
25
+ dwldDataParam.columnList = [];
26
+ }
27
+ if (!dwldDataParam.columnExclude) {
28
+ dwldDataParam.columnExclude = [];
29
+ }
30
+ const datab64 = btoa(this.jsonToString(data, dwldDataParam));
31
+ this.downloadFile(datab64, dwldDataParam.fileName, 'text/csv');
32
+ }
33
+ static download(file, fileName) {
34
+ const binaryData = [file];
35
+ const downloadLink = document.createElement('a');
36
+ const urlDownload = window.URL.createObjectURL(new Blob(binaryData, { type: file.type }));
37
+ downloadLink.href = urlDownload;
38
+ downloadLink.setAttribute('download', fileName);
39
+ document.body.appendChild(downloadLink);
40
+ downloadLink.click();
41
+ window.URL.revokeObjectURL(urlDownload);
42
+ downloadLink.remove();
43
+ }
44
+ static b64toBlob(b64Data, contentType, sliceSize) {
45
+ contentType = contentType || '';
46
+ sliceSize = sliceSize || 512;
47
+ const byteCharacters = atob(b64Data);
48
+ const byteArrays = [];
49
+ for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
50
+ const slice = byteCharacters.slice(offset, offset + sliceSize);
51
+ const byteNumbers = new Array(slice.length);
52
+ for (let i = 0; i < slice.length; i++) {
53
+ byteNumbers[i] = slice.charCodeAt(i);
54
+ }
55
+ const byteArray = new Uint8Array(byteNumbers);
56
+ byteArrays.push(byteArray);
57
+ }
58
+ const blob = new Blob(byteArrays, { type: contentType });
59
+ return blob;
60
+ }
61
+ static jsonToString(jsonData, dwldDataParam) {
62
+ if (!jsonData || jsonData.length === 0) {
63
+ return '';
64
+ }
65
+ const lineDelimiter = '\n';
66
+ let columnOrig = null;
67
+ let columnHeader = null;
68
+ const keys = [];
69
+ let includeKey;
70
+ if (dwldDataParam.columnList &&
71
+ dwldDataParam.columnList.length > 0) {
72
+ columnOrig = dwldDataParam.columnList;
73
+ }
74
+ else {
75
+ columnOrig = Object.keys(jsonData[0]);
76
+ }
77
+ columnOrig.forEach(key => {
78
+ includeKey = true;
79
+ if (dwldDataParam.columnExclude &&
80
+ dwldDataParam.columnExclude.length > 0 &&
81
+ dwldDataParam.columnExclude.indexOf(key) !== -1) {
82
+ includeKey = false;
83
+ }
84
+ if (includeKey) {
85
+ keys.push(key);
86
+ columnHeader = (!columnHeader) ? '' : columnHeader + dwldDataParam.columnDelimiter;
87
+ columnHeader += (dwldDataParam.literals[key]) ? dwldDataParam.literals[key] : key;
88
+ }
89
+ });
90
+ const lineStr = jsonData.reduce((accLineStr, currentItem) => {
91
+ let first = true;
92
+ let columnValue = null;
93
+ keys.forEach(key => {
94
+ if (!first) {
95
+ accLineStr += dwldDataParam.columnDelimiter;
96
+ }
97
+ columnValue = currentItem[key];
98
+ if (columnValue === null || columnValue === undefined) {
99
+ columnValue = '';
100
+ }
101
+ switch (typeof (columnValue)) {
102
+ case 'number':
103
+ columnValue = columnValue.toLocaleString();
104
+ break;
105
+ case 'boolean':
106
+ columnValue = (dwldDataParam.literals[`${columnValue}`]) ?
107
+ dwldDataParam.literals[`${columnValue}`] : columnValue;
108
+ break;
109
+ case 'object':
110
+ columnValue = JSON.stringify(columnValue);
111
+ }
112
+ accLineStr += columnValue;
113
+ first = false;
114
+ });
115
+ return accLineStr + lineDelimiter;
116
+ }, columnHeader + lineDelimiter);
117
+ return lineStr;
118
+ }
119
+ }
120
+ export class DownloadDataParams {
121
+ }
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHRzLWJhY2tvZmZpY2UtdXRpbC9zcmMvbGliL3V0aWxzL2ZpbGUudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUVqQixnQkFDSSxDQUFDO0lBRUwsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFTLEVBQUUsUUFBZ0IsRUFBRSxXQUFvQixFQUFFLE1BQWdCO1FBQ25GLE1BQU0sR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWdCLEVBQUUsZ0JBQXFDLElBQUk7UUFDM0UsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87U0FBRTtRQUV0QixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQUUsYUFBYSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztTQUFFO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQUUsYUFBYSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7U0FBRTtRQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUFFLGFBQWEsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQUU7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUU7WUFBRSxhQUFhLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztTQUFFO1FB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IEZpbGVVdGlsIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICkgeyB9XHJcblxyXG4gICAgc3RhdGljIGRvd25sb2FkRmlsZShkYXRhOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcsIGNvbnRlbnRUeXBlPzogc3RyaW5nLCBiYXNlNjQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgYmFzZTY0ID0gKGJhc2U2NCA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFCbG9iID0gYmFzZTY0ID8gdGhpcy5iNjR0b0Jsb2IoZGF0YSwgY29udGVudFR5cGUpIDogZGF0YTtcclxuICAgICAgICB0aGlzLmRvd25sb2FkKGRhdGFCbG9iLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGRvd25sb2FkRGF0YShkYXRhOiBBcnJheTxhbnk+LCBkd2xkRGF0YVBhcmFtOiBJRG93bmxvYWREYXRhUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZGF0YSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtKSB7IGR3bGREYXRhUGFyYW0gPSBuZXcgRG93bmxvYWREYXRhUGFyYW1zKCk7IH1cclxuICAgICAgICBpZiAoIWR3bGREYXRhUGFyYW0uZmlsZU5hbWUpIHsgZHdsZERhdGFQYXJhbS5maWxlTmFtZSA9ICdkYXRhLmNzdic7IH1cclxuICAgICAgICBpZiAoIWR3bGREYXRhUGFyYW0ubGl0ZXJhbHMpIHsgZHdsZERhdGFQYXJhbS5saXRlcmFscyA9IHt9OyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmNvbHVtbkRlbGltaXRlcikgeyBkd2xkRGF0YVBhcmFtLmNvbHVtbkRlbGltaXRlciA9ICc7JzsgfVxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbS5jb2x1bW5MaXN0KSB7IGR3bGREYXRhUGFyYW0uY29sdW1uTGlzdCA9IFtdOyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmNvbHVtbkV4Y2x1ZGUpIHsgZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlID0gW107IH1cclxuXHJcbiAgICAgICAgY29uc3QgZGF0YWI2NCA9IGJ0b2EodGhpcy5qc29uVG9TdHJpbmcoZGF0YSwgZHdsZERhdGFQYXJhbSkpO1xyXG4gICAgICAgIHRoaXMuZG93bmxvYWRGaWxlKGRhdGFiNjQsIGR3bGREYXRhUGFyYW0uZmlsZU5hbWUsICd0ZXh0L2NzdicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGRvd25sb2FkKGZpbGU6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBiaW5hcnlEYXRhID0gW2ZpbGVdO1xyXG4gICAgICAgIGNvbnN0IGRvd25sb2FkTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICBjb25zdCB1cmxEb3dubG9hZCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKGJpbmFyeURhdGEsIHsgdHlwZTogZmlsZS50eXBlIH0pKTtcclxuXHJcbiAgICAgICAgZG93bmxvYWRMaW5rLmhyZWYgPSB1cmxEb3dubG9hZDtcclxuICAgICAgICBkb3dubG9hZExpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkTGluayk7XHJcbiAgICAgICAgZG93bmxvYWRMaW5rLmNsaWNrKCk7XHJcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsRG93bmxvYWQpO1xyXG4gICAgICAgIGRvd25sb2FkTGluay5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBiNjR0b0Jsb2IoYjY0RGF0YTogYW55LCBjb250ZW50VHlwZT86IHN0cmluZywgc2xpY2VTaXplPzogbnVtYmVyKTogQmxvYiB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZSB8fCAnJztcclxuICAgICAgICBzbGljZVNpemUgPSBzbGljZVNpemUgfHwgNTEyO1xyXG5cclxuICAgICAgICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoYjY0RGF0YSk7XHJcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5cyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IG9mZnNldCArPSBzbGljZVNpemUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShzbGljZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcclxuICAgICAgICAgICAgYnl0ZUFycmF5cy5wdXNoKGJ5dGVBcnJheSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoYnl0ZUFycmF5cywgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcclxuICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBqc29uVG9TdHJpbmcoanNvbkRhdGE6IEFycmF5PGFueT4sIGR3bGREYXRhUGFyYW06IElEb3dubG9hZERhdGFQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghanNvbkRhdGEgfHwganNvbkRhdGEubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJzsgfVxyXG5cclxuICAgICAgICBjb25zdCBsaW5lRGVsaW1pdGVyID0gJ1xcbic7XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5PcmlnID0gbnVsbDtcclxuICAgICAgICBsZXQgY29sdW1uSGVhZGVyID0gbnVsbDtcclxuICAgICAgICBjb25zdCBrZXlzID0gW107XHJcbiAgICAgICAgbGV0IGluY2x1ZGVLZXk6IGJvb2xlYW47XHJcblxyXG4gICAgICAgIGlmIChkd2xkRGF0YVBhcmFtLmNvbHVtbkxpc3QgJiZcclxuICAgICAgICAgICAgZHdsZERhdGFQYXJhbS5jb2x1bW5MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29sdW1uT3JpZyA9IGR3bGREYXRhUGFyYW0uY29sdW1uTGlzdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2x1bW5PcmlnID0gT2JqZWN0LmtleXMoanNvbkRhdGFbMF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sdW1uT3JpZy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGluY2x1ZGVLZXkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZSAmJlxyXG4gICAgICAgICAgICAgICAgZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgIGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZS5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpbmNsdWRlS2V5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpbmNsdWRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkhlYWRlciA9ICghY29sdW1uSGVhZGVyKSA/ICcnIDogY29sdW1uSGVhZGVyICsgZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXI7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5IZWFkZXIgKz0gKGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNba2V5XSkgPyBkd2xkRGF0YVBhcmFtLmxpdGVyYWxzW2tleV0gOiBrZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluZVN0ciA9IGpzb25EYXRhLnJlZHVjZSgoYWNjTGluZVN0ciwgY3VycmVudEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGNvbHVtblZhbHVlID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeyBhY2NMaW5lU3RyICs9IGR3bGREYXRhUGFyYW0uY29sdW1uRGVsaW1pdGVyOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBjdXJyZW50SXRlbVtrZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtblZhbHVlID09PSBudWxsIHx8IGNvbHVtblZhbHVlID09PSB1bmRlZmluZWQpIHsgY29sdW1uVmFsdWUgPSAnJzsgfVxyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgKGNvbHVtblZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlID0gY29sdW1uVmFsdWUudG9Mb2NhbGVTdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlID0gKGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNbYCR7Y29sdW1uVmFsdWV9YF0pID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNbYCR7Y29sdW1uVmFsdWV9YF0gOiBjb2x1bW5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBKU09OLnN0cmluZ2lmeShjb2x1bW5WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhY2NMaW5lU3RyICs9IGNvbHVtblZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGFjY0xpbmVTdHIgKyBsaW5lRGVsaW1pdGVyO1xyXG5cclxuICAgICAgICB9LCBjb2x1bW5IZWFkZXIgKyBsaW5lRGVsaW1pdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmVTdHI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURvd25sb2FkRGF0YVBhcmFtcyB7XHJcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbGl0ZXJhbHM6IGFueTtcclxuICAgIGNvbHVtbkRlbGltaXRlcjogc3RyaW5nO1xyXG4gICAgY29sdW1uTGlzdDogQXJyYXk8c3RyaW5nPjtcclxuICAgIGNvbHVtbkV4Y2x1ZGU6IEFycmF5PHN0cmluZz47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEb3dubG9hZERhdGFQYXJhbXMgaW1wbGVtZW50cyBJRG93bmxvYWREYXRhUGFyYW1zIHtcclxuICAgIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBsaXRlcmFsczogYW55O1xyXG4gICAgY29sdW1uRGVsaW1pdGVyOiBzdHJpbmc7XHJcbiAgICBjb2x1bW5MaXN0OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgY29sdW1uRXhjbHVkZTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG4iXX0=