gamma-app-controller 1.0.1

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/gamma-app-controller.mjs +2 -0
  3. package/esm2020/lib/application-controller/app.http.service.mjs +24 -0
  4. package/esm2020/lib/application-controller/application-content.service.mjs +482 -0
  5. package/esm2020/lib/application-controller/application-controller.module.mjs +324 -0
  6. package/esm2020/lib/application-controller/application-dataset-call.service.mjs +321 -0
  7. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +390 -0
  8. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +349 -0
  9. package/esm2020/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.mjs +148 -0
  10. package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.mjs +167 -0
  11. package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.mjs +17 -0
  12. package/esm2020/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.mjs +57 -0
  13. package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +409 -0
  14. package/esm2020/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.mjs +61 -0
  15. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +186 -0
  16. package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +134 -0
  17. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +559 -0
  18. package/esm2020/lib/application-controller/common-header/common-header.component.mjs +33 -0
  19. package/esm2020/lib/application-controller/common.mjs +1207 -0
  20. package/esm2020/lib/application-controller/environment.mjs +26 -0
  21. package/esm2020/lib/application-controller/kpi-comon-service.mjs +537 -0
  22. package/esm2020/lib/application-controller/kpi-service.mjs +108 -0
  23. package/esm2020/lib/application-controller/loading/loading.component.mjs +16 -0
  24. package/esm2020/lib/application-controller/loading/loadingModule.mjs +28 -0
  25. package/esm2020/lib/application-controller/moment-helper.mjs +4 -0
  26. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +977 -0
  27. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +172 -0
  28. package/esm2020/lib/application-controller/page-templates/cdr-config/cdr-config.component.mjs +227 -0
  29. package/esm2020/lib/application-controller/page-templates/dynamic-route-service.mjs +22 -0
  30. package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +118 -0
  31. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +181 -0
  32. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +71 -0
  33. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +266 -0
  34. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +159 -0
  35. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +144 -0
  36. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
  37. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +168 -0
  38. package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +74 -0
  39. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +118 -0
  40. package/esm2020/lib/application-controller/shared/api.service.mjs +117 -0
  41. package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +67 -0
  42. package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +37 -0
  43. package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +229 -0
  44. package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +144 -0
  45. package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +537 -0
  46. package/esm2020/lib/application-controller/shared/loader/loader.component.mjs +14 -0
  47. package/esm2020/lib/application-controller/shared/loading/loading.component.mjs +16 -0
  48. package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +28 -0
  49. package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +20 -0
  50. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +294 -0
  51. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +287 -0
  52. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +255 -0
  53. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +269 -0
  54. package/esm2020/lib/gamma-app-controller.component.mjs +16 -0
  55. package/esm2020/lib/gamma-app-controller.module.mjs +43 -0
  56. package/esm2020/lib/gamma-app-controller.service.mjs +20 -0
  57. package/esm2020/lib/icons.module.mjs +23 -0
  58. package/esm2020/public-api.mjs +49 -0
  59. package/fesm2015/gamma-app-controller.mjs +10250 -0
  60. package/fesm2015/gamma-app-controller.mjs.map +1 -0
  61. package/fesm2020/gamma-app-controller.mjs +10248 -0
  62. package/fesm2020/gamma-app-controller.mjs.map +1 -0
  63. package/index.d.ts +2 -0
  64. package/lib/application-controller/app.http.service.d.ts +15 -0
  65. package/lib/application-controller/application-content.service.d.ts +79 -0
  66. package/lib/application-controller/application-controller.module.d.ts +51 -0
  67. package/lib/application-controller/application-dataset-call.service.d.ts +20 -0
  68. package/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.d.ts +55 -0
  69. package/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.d.ts +121 -0
  70. package/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.d.ts +38 -0
  71. package/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.d.ts +42 -0
  72. package/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.d.ts +7 -0
  73. package/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.d.ts +21 -0
  74. package/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.d.ts +62 -0
  75. package/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.d.ts +22 -0
  76. package/lib/application-controller/application-filter/application-filter.component.d.ts +36 -0
  77. package/lib/application-controller/application-view-components/application-views/application-views.component.d.ts +47 -0
  78. package/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.d.ts +73 -0
  79. package/lib/application-controller/common-header/common-header.component.d.ts +15 -0
  80. package/lib/application-controller/common.d.ts +148 -0
  81. package/lib/application-controller/environment.d.ts +25 -0
  82. package/lib/application-controller/kpi-comon-service.d.ts +14 -0
  83. package/lib/application-controller/kpi-service.d.ts +6 -0
  84. package/lib/application-controller/loading/loading.component.d.ts +9 -0
  85. package/lib/application-controller/loading/loadingModule.d.ts +10 -0
  86. package/lib/application-controller/moment-helper.d.ts +3 -0
  87. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +188 -0
  88. package/lib/application-controller/page-controller/page-controller/page-controller.component.d.ts +47 -0
  89. package/lib/application-controller/page-templates/cdr-config/cdr-config.component.d.ts +44 -0
  90. package/lib/application-controller/page-templates/dynamic-route-service.d.ts +8 -0
  91. package/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +33 -0
  92. package/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.d.ts +43 -0
  93. package/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +20 -0
  94. package/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +51 -0
  95. package/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +32 -0
  96. package/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +31 -0
  97. package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +10 -0
  98. package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +26 -0
  99. package/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +21 -0
  100. package/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.d.ts +29 -0
  101. package/lib/application-controller/shared/api.service.d.ts +26 -0
  102. package/lib/application-controller/shared/app-title/app-title.component.d.ts +28 -0
  103. package/lib/application-controller/shared/gamam-widget/gamam-widget.component.d.ts +20 -0
  104. package/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.d.ts +45 -0
  105. package/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.d.ts +32 -0
  106. package/lib/application-controller/shared/kpi-comon-service.d.ts +14 -0
  107. package/lib/application-controller/shared/loader/loader.component.d.ts +8 -0
  108. package/lib/application-controller/shared/loading/loading.component.d.ts +9 -0
  109. package/lib/application-controller/shared/loading/loadingModule.d.ts +10 -0
  110. package/lib/application-controller/shared/safeHtmlPipe.d.ts +10 -0
  111. package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +83 -0
  112. package/lib/application-controller/support-components/dash-table/dash-table.component.d.ts +67 -0
  113. package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +70 -0
  114. package/lib/application-controller/support-components/table-with-bar/table-with-bar.component.d.ts +70 -0
  115. package/lib/gamma-app-controller.component.d.ts +5 -0
  116. package/lib/gamma-app-controller.module.d.ts +10 -0
  117. package/lib/gamma-app-controller.service.d.ts +7 -0
  118. package/lib/icons.module.d.ts +11 -0
  119. package/package.json +33 -0
  120. package/public-api.d.ts +48 -0
@@ -0,0 +1,148 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "ngx-toastr";
4
+ import * as i2 from "../../common";
5
+ import * as i3 from "../../application-content.service";
6
+ import * as i4 from "@angular/router";
7
+ import * as i5 from "@angular/common";
8
+ import * as i6 from "devextreme-angular/ui/select-box";
9
+ import * as i7 from "devextreme-angular/ui/text-box";
10
+ import * as i8 from "@angular/forms";
11
+ export class CreateDatasetJsonComponent {
12
+ constructor(toastr, commonService, service, activatedRoute) {
13
+ this.toastr = toastr;
14
+ this.commonService = commonService;
15
+ this.service = service;
16
+ this.activatedRoute = activatedRoute;
17
+ this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
18
+ this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn", "contains", "startsWith", "endsWith"];
19
+ this.getJsonDataset = new EventEmitter();
20
+ this.jsonContent = '';
21
+ }
22
+ set jsonDataset(value) {
23
+ if (value.queryConfig.mapedFilters == undefined) {
24
+ value.queryConfig.mapedFilters = [];
25
+ value.queryConfig.mapedFilters.push({ "localColumn": "", "serverColumn": "", "operatorName": "", "defaultValue": "", "dataType": "" });
26
+ }
27
+ this.apiBulderDataset = value;
28
+ }
29
+ ngOnInit() {
30
+ this.contentType = this.activatedRoute.snapshot.queryParams['contentType'];
31
+ }
32
+ addFilterMapingColumns() {
33
+ let obj = { "localColumn": "", "serverColumn": "", "operatorName": "", "defaultValue": "", "dataType": "" };
34
+ this.apiBulderDataset.queryConfig.mapedFilters.push(obj);
35
+ }
36
+ deleteFilterMapingColumns(i) {
37
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(i, 1);
38
+ }
39
+ saveColumnMaping() {
40
+ this.toastr.success('Maped Filter Successfully');
41
+ }
42
+ moveItemForColumns(index, direction) {
43
+ if (index < 0 || index >= this.apiBulderDataset.queryConfig.mapedFilters.length)
44
+ return;
45
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
46
+ if (newPosition < 0 || newPosition >= this.apiBulderDataset.queryConfig.mapedFilters.length)
47
+ return;
48
+ const itemToMove = this.apiBulderDataset.queryConfig.mapedFilters[index];
49
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(index, 1);
50
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(newPosition, 0, itemToMove);
51
+ }
52
+ createDataSet() {
53
+ if (!this.isJsonEditor && Object.keys(this.uploadedFileData).length == 0) {
54
+ this.toastr.error("Please Upload File");
55
+ return true;
56
+ }
57
+ if (this.uploadedFileData && !this.isJsonEditor) {
58
+ this.apiBulderDataset.queryConfig['jsonFileId'] = this.uploadedFileData.fileId;
59
+ }
60
+ if (this.isJsonEditor) {
61
+ this.apiBulderDataset.queryConfig['jsonPayload'] = this.jsonContent;
62
+ }
63
+ this.getJsonDataset.emit(this.apiBulderDataset);
64
+ }
65
+ onjsonFileSelected(event) {
66
+ this.isJsonEditor = false;
67
+ this.selectedJsonfile = event.target.files[0];
68
+ }
69
+ viewJsonEditor() {
70
+ this.selectedJsonfile = undefined;
71
+ this.uploadedFileData = undefined;
72
+ this.isJsonEditor = true;
73
+ }
74
+ uploadSelectedJsonFile() {
75
+ const formData = new FormData();
76
+ formData.append('file', this.selectedJsonfile, this.selectedJsonfile.name);
77
+ this.service.uploadDatasetJsonPayload(formData).subscribe({
78
+ next: (data) => {
79
+ this.uploadedFileData = data;
80
+ },
81
+ error: (err) => {
82
+ }
83
+ });
84
+ }
85
+ downloadJsonFile() {
86
+ let requestapi = this.apiBulderDataset.api + '?datasetId=' + this.apiBulderDataset.queryConfig.jsonFileId;
87
+ this.service.getJsonDatasetPayload(requestapi).subscribe({
88
+ next: (data) => {
89
+ this.exportJsonFile(data);
90
+ },
91
+ error: (err) => {
92
+ console.error('Error:', err);
93
+ }
94
+ });
95
+ }
96
+ exportJsonFile(item) {
97
+ if (!item) {
98
+ this.toastr.error('No data available to export.', 'Export Error');
99
+ return;
100
+ }
101
+ const jsonStr = JSON.stringify(item, null, 2);
102
+ const blob = new Blob([jsonStr], { type: 'application/json' });
103
+ const url = window.URL.createObjectURL(blob);
104
+ const anchor = document.createElement('a');
105
+ anchor.href = url;
106
+ anchor.download = `${item.viewName.replace(/ /g, '_')}.json`;
107
+ anchor.click();
108
+ window.URL.revokeObjectURL(url);
109
+ }
110
+ jsonValidator() {
111
+ this.validationMessage = '';
112
+ if (this.jsonContent.trim()) {
113
+ const arrayOfObjectsRegex = /^\s*\[\s*(\{\s*("[^"]*"\s*:\s*("[^"]*"|\d+|true|false|null)\s*,?\s*)+\}\s*,?\s*)*\]\s*$/;
114
+ if (arrayOfObjectsRegex.test(this.jsonContent)) {
115
+ try {
116
+ const parsedJson = JSON.parse(this.jsonContent);
117
+ if (Array.isArray(parsedJson) && parsedJson.every(item => typeof item === 'object' && item !== null)) {
118
+ this.validationMessage = '';
119
+ }
120
+ else {
121
+ this.validationMessage = 'Invalid JSON';
122
+ }
123
+ }
124
+ catch (e) {
125
+ this.validationMessage = 'Invalid JSON';
126
+ }
127
+ }
128
+ else {
129
+ this.validationMessage = 'Invalid JSON';
130
+ }
131
+ }
132
+ else {
133
+ this.validationMessage = '';
134
+ }
135
+ }
136
+ }
137
+ CreateDatasetJsonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CreateDatasetJsonComponent, deps: [{ token: i1.ToastrService }, { token: i2.CommonService }, { token: i3.ApplicationContentService }, { token: i4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
138
+ CreateDatasetJsonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: CreateDatasetJsonComponent, selector: "app-create-dataset-json", inputs: { jsonDataset: "jsonDataset" }, outputs: { getJsonDataset: "getJsonDataset" }, ngImport: i0, template: "<div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">End Point</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.api\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Api Type</div>\n <dx-select-box [dataSource]=\"['get','post']\" [(ngModel)]=\"apiBulderDataset.apiType\">\n </dx-select-box>\n </div>\n </div>\n\n\n <div class=\"my-4 p-3 justify-center items-center\">\n <div class=\"m-2 flex items-center justify-between\">\n <button class=\"{{commonService.btn_warning_md}} w-1/3\" (click)=\"viewJsonEditor()\">JSON Editor</button>\n <div class=\"text-lg\"> - OR - </div>\n <div class=\"mx-2\">\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2\">\n <input type=\"file\" #fileInput accept=\".json\"\n class=\"block p-2 text-sm text-gray-400 border border-gray-700 w-full rounded-lg bg-gray-800 focus:ring-blue-500 focus:border-blue-500\"\n (change)=\"onjsonFileSelected($event)\">\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"uploadSelectedJsonFile()\">Upload\n File</button>\n\n </div>\n <div class=\"mx-2\" *ngIf=\"contentType == 'edit'\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"downloadJsonFile()\">Download\n File</button>\n\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"m-4\" *ngIf=\"isJsonEditor\">\n <textarea [(ngModel)]=\"jsonContent\" rows=\"18\" (input)=\"jsonValidator()\"\n [ngClass]=\"{'border-red-500': validationMessage}\"\n class=\"block p-2.5 w-full text-lg text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500\"\n placeholder=\"Write your JSON here...\"></textarea>\n <div *ngIf=\"validationMessage\" class=\"text-red-500 mt-2\">{{ validationMessage }}</div>\n </div>\n </div>\n\n\n\n\n\n\n\n\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.mapedFilters; let i = index;\">\n\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Local Column</div>\n <dx-text-box [(ngModel)]=\"item.localColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Server Column</div>\n <dx-text-box [(ngModel)]=\"item.serverColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Operator</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_operator\"\n [(ngModel)]=\"item.operatorName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Default Value</div>\n <dx-text-box [(ngModel)]=\"item.defaultValue\"></dx-text-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.mapedFilters.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteFilterMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex flex-row\">\n <div class=\"w-1/2\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\" (click)=\"saveColumnMaping()\">Save\n Maping</button>\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n\n <div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createDataSet()\">\n Submit DataSet\n </button>\n </div>\n\n </div>\n</div>", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CreateDatasetJsonComponent, decorators: [{
140
+ type: Component,
141
+ args: [{ selector: 'app-create-dataset-json', template: "<div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">End Point</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.api\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Api Type</div>\n <dx-select-box [dataSource]=\"['get','post']\" [(ngModel)]=\"apiBulderDataset.apiType\">\n </dx-select-box>\n </div>\n </div>\n\n\n <div class=\"my-4 p-3 justify-center items-center\">\n <div class=\"m-2 flex items-center justify-between\">\n <button class=\"{{commonService.btn_warning_md}} w-1/3\" (click)=\"viewJsonEditor()\">JSON Editor</button>\n <div class=\"text-lg\"> - OR - </div>\n <div class=\"mx-2\">\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2\">\n <input type=\"file\" #fileInput accept=\".json\"\n class=\"block p-2 text-sm text-gray-400 border border-gray-700 w-full rounded-lg bg-gray-800 focus:ring-blue-500 focus:border-blue-500\"\n (change)=\"onjsonFileSelected($event)\">\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"uploadSelectedJsonFile()\">Upload\n File</button>\n\n </div>\n <div class=\"mx-2\" *ngIf=\"contentType == 'edit'\">\n <button class=\"{{commonService.btn_warning_md}}\" (click)=\"downloadJsonFile()\">Download\n File</button>\n\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"m-4\" *ngIf=\"isJsonEditor\">\n <textarea [(ngModel)]=\"jsonContent\" rows=\"18\" (input)=\"jsonValidator()\"\n [ngClass]=\"{'border-red-500': validationMessage}\"\n class=\"block p-2.5 w-full text-lg text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500\"\n placeholder=\"Write your JSON here...\"></textarea>\n <div *ngIf=\"validationMessage\" class=\"text-red-500 mt-2\">{{ validationMessage }}</div>\n </div>\n </div>\n\n\n\n\n\n\n\n\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.mapedFilters; let i = index;\">\n\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Local Column</div>\n <dx-text-box [(ngModel)]=\"item.localColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Server Column</div>\n <dx-text-box [(ngModel)]=\"item.serverColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Operator</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_operator\"\n [(ngModel)]=\"item.operatorName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Default Value</div>\n <dx-text-box [(ngModel)]=\"item.defaultValue\"></dx-text-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.mapedFilters.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteFilterMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex flex-row\">\n <div class=\"w-1/2\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\" (click)=\"saveColumnMaping()\">Save\n Maping</button>\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n\n <div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createDataSet()\">\n Submit DataSet\n </button>\n </div>\n\n </div>\n</div>" }]
142
+ }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.CommonService }, { type: i3.ApplicationContentService }, { type: i4.ActivatedRoute }]; }, propDecorators: { getJsonDataset: [{
143
+ type: Output
144
+ }], jsonDataset: [{
145
+ type: Input,
146
+ args: ['jsonDataset']
147
+ }] } });
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWRhdGFzZXQtanNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvYXBwbGljYXRpb24tZGF0YXNldC1jb21wb25lbnQvY3JlYXRlLWRhdGFzZXQtanNvbi9jcmVhdGUtZGF0YXNldC1qc29uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9hcHBsaWNhdGlvbi1kYXRhc2V0LWNvbXBvbmVudC9jcmVhdGUtZGF0YXNldC1qc29uL2NyZWF0ZS1kYXRhc2V0LWpzb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVkvRSxNQUFNLE9BQU8sMEJBQTBCO0lBc0JyQyxZQUNVLE1BQXFCLEVBQ3RCLGFBQTRCLEVBQzNCLE9BQWtDLEVBQ2xDLGNBQThCO1FBSDlCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBekJ4QyxpQkFBWSxHQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNyRixpQkFBWSxHQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlB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Q0UseUJBQXlCO3FNQU9sQixjQUFjO3NCQUE5QixNQUFNO2dCQVNILFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3JlYXRlLWRhdGFzZXQtanNvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtZGF0YXNldC1qc29uLmNvbXBvbmVudC5odG1sJyxcbiAgLy8gc3R5bGVVcmxzOiBbJy4vY3JlYXRlLWRhdGFzZXQtanNvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZURhdGFzZXRKc29uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIiwgXCJjb250YWluc1wiLCBcInN0YXJ0c1dpdGhcIiwgXCJlbmRzV2l0aFwiXVxuICBAT3V0cHV0KCkgcHVibGljIGdldEpzb25EYXRhc2V0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgYXBpQnVsZGVyRGF0YXNldDogYW55O1xuICBqc29uQ29udGVudDogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkSnNvbmZpbGU6IGFueTtcbiAgaXNKc29uRWRpdG9yOiBib29sZWFuO1xuICB1cGxvYWRlZEZpbGVEYXRhOiBhbnk7XG4gIHZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gIGNvbnRlbnRUeXBlOiBhbnk7XG4gIEBJbnB1dCgnanNvbkRhdGFzZXQnKVxuICBzZXQganNvbkRhdGFzZXQodmFsdWUpIHtcblxuICAgIGlmICh2YWx1ZS5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZS5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMgPSBbXTtcbiAgICAgIHZhbHVlLnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5wdXNoKHsgXCJsb2NhbENvbHVtblwiOiBcIlwiLCBcInNlcnZlckNvbHVtblwiOiBcIlwiLCBcIm9wZXJhdG9yTmFtZVwiOiBcIlwiLCBcImRlZmF1bHRWYWx1ZVwiOiBcIlwiLCBcImRhdGFUeXBlXCI6IFwiXCIgfSlcbiAgICB9XG5cbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudFR5cGUgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydjb250ZW50VHlwZSddO1xuICB9XG5cbiAgYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0geyBcImxvY2FsQ29sdW1uXCI6IFwiXCIsIFwic2VydmVyQ29sdW1uXCI6IFwiXCIsIFwib3BlcmF0b3JOYW1lXCI6IFwiXCIsIFwiZGVmYXVsdFZhbHVlXCI6IFwiXCIsIFwiZGF0YVR5cGVcIjogXCJcIiB9XG4gICAgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5wdXNoKG9iaik7XG5cbiAgfVxuXG4gIGRlbGV0ZUZpbHRlck1hcGluZ0NvbHVtbnMoaSkge1xuICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMuc3BsaWNlKGksIDEpXG5cbiAgfVxuXG4gIHNhdmVDb2x1bW5NYXBpbmcoKSB7XG4gICAgdGhpcy50b2FzdHIuc3VjY2VzcygnTWFwZWQgRmlsdGVyIFN1Y2Nlc3NmdWxseScpO1xuXG4gIH1cblxuXG5cbiAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzW2luZGV4XTtcbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7IC8vIFJlbW92ZSBpdGVtIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBjcmVhdGVEYXRhU2V0KCkge1xuXG4gICAgaWYgKCF0aGlzLmlzSnNvbkVkaXRvciAmJiBPYmplY3Qua2V5cyh0aGlzLnVwbG9hZGVkRmlsZURhdGEpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBVcGxvYWQgRmlsZVwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVEYXRhICYmICF0aGlzLmlzSnNvbkVkaXRvcikge1xuICAgICAgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnWydqc29uRmlsZUlkJ10gPSB0aGlzLnVwbG9hZGVkRmlsZURhdGEuZmlsZUlkO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0pzb25FZGl0b3IpIHtcbiAgICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZ1snanNvblBheWxvYWQnXSA9IHRoaXMuanNvbkNvbnRlbnQ7XG4gICAgfVxuICAgIHRoaXMuZ2V0SnNvbkRhdGFzZXQuZW1pdCh0aGlzLmFwaUJ1bGRlckRhdGFzZXQpXG4gIH1cblxuICBvbmpzb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaXNKc29uRWRpdG9yID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEpzb25maWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuXG4gIH1cblxuICB2aWV3SnNvbkVkaXRvcigpIHtcbiAgICB0aGlzLnNlbGVjdGVkSnNvbmZpbGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51cGxvYWRlZEZpbGVEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNKc29uRWRpdG9yID0gdHJ1ZTtcbiAgfVxuXG4gIHVwbG9hZFNlbGVjdGVkSnNvbkZpbGUoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCB0aGlzLnNlbGVjdGVkSnNvbmZpbGUsIHRoaXMuc2VsZWN0ZWRKc29uZmlsZS5uYW1lKTtcbiAgICB0aGlzLnNlcnZpY2UudXBsb2FkRGF0YXNldEpzb25QYXlsb2FkKGZvcm1EYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZURhdGEgPSBkYXRhO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcblxuICAgICAgfVxuICAgIH0pXG5cbiAgfVxuXG4gIGRvd25sb2FkSnNvbkZpbGUoKSB7XG5cbiAgICBsZXQgcmVxdWVzdGFwaSA9IHRoaXMuYXBpQnVsZGVyRGF0YXNldC5hcGkgKyAnP2RhdGFzZXRJZD0nICsgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLmpzb25GaWxlSWQ7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEpzb25EYXRhc2V0UGF5bG9hZChyZXF1ZXN0YXBpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmV4cG9ydEpzb25GaWxlKGRhdGEpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgZXhwb3J0SnNvbkZpbGUoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcignTm8gZGF0YSBhdmFpbGFibGUgdG8gZXhwb3J0LicsICdFeHBvcnQgRXJyb3InKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkoaXRlbSwgbnVsbCwgMik7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtqc29uU3RyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGFuY2hvci5ocmVmID0gdXJsO1xuICAgIGFuY2hvci5kb3dubG9hZCA9IGAke2l0ZW0udmlld05hbWUucmVwbGFjZSgvIC9nLCAnXycpfS5qc29uYDtcbiAgICBhbmNob3IuY2xpY2soKTtcbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICB9XG5cblxuXG4gIGpzb25WYWxpZGF0b3IoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuanNvbkNvbnRlbnQudHJpbSgpKSB7XG4gICAgICBjb25zdCBhcnJheU9mT2JqZWN0c1JlZ2V4ID0gL15cXHMqXFxbXFxzKihcXHtcXHMqKFwiW15cIl0qXCJcXHMqOlxccyooXCJbXlwiXSpcInxcXGQrfHRydWV8ZmFsc2V8bnVsbClcXHMqLD9cXHMqKStcXH1cXHMqLD9cXHMqKSpcXF1cXHMqJC87XG5cbiAgICAgIGlmIChhcnJheU9mT2JqZWN0c1JlZ2V4LnRlc3QodGhpcy5qc29uQ29udGVudCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRKc29uID0gSlNPTi5wYXJzZSh0aGlzLmpzb25Db250ZW50KTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZEpzb24pICYmIHBhcnNlZEpzb24uZXZlcnkoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICdJbnZhbGlkIEpTT04nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAnSW52YWxpZCBKU09OJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICdJbnZhbGlkIEpTT04nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG5cbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5FbmQgUG9pbnQ8L2Rpdj5cbiAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImFwaUJ1bGRlckRhdGFzZXQuYXBpXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+QXBpIFR5cGU8L2Rpdj5cbiAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtkYXRhU291cmNlXT1cIlsnZ2V0JywncG9zdCddXCIgWyhuZ01vZGVsKV09XCJhcGlCdWxkZXJEYXRhc2V0LmFwaVR5cGVcIj5cbiAgICAgICAgICAgIDwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJteS00IHAtMyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fSB3LTEvM1wiIChjbGljayk9XCJ2aWV3SnNvbkVkaXRvcigpXCI+SlNPTiBFZGl0b3I8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnXCI+IC0gT1IgLSA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0IGFjY2VwdD1cIi5qc29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJsb2NrICBwLTIgdGV4dC1zbSB0ZXh0LWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS03MDAgdy1mdWxsIHJvdW5kZWQtbGcgYmctZ3JheS04MDAgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25qc29uRmlsZVNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX1cIiAoY2xpY2spPVwidXBsb2FkU2VsZWN0ZWRKc29uRmlsZSgpXCI+VXBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZTwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiICpuZ0lmPVwiY29udGVudFR5cGUgPT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX1cIiAoY2xpY2spPVwiZG93bmxvYWRKc29uRmlsZSgpXCI+RG93bmxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tNFwiICpuZ0lmPVwiaXNKc29uRWRpdG9yXCI+XG4gICAgICAgICAgICA8dGV4dGFyZWEgWyhuZ01vZGVsKV09XCJqc29uQ29udGVudFwiIHJvd3M9XCIxOFwiIChpbnB1dCk9XCJqc29uVmFsaWRhdG9yKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYm9yZGVyLXJlZC01MDAnOiB2YWxpZGF0aW9uTWVzc2FnZX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgcC0yLjUgdy1mdWxsIHRleHQtbGcgdGV4dC1ncmF5LTkwMCBiZy1ncmF5LTUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMCBkYXJrOmJnLWdyYXktNzAwIGRhcms6Ym9yZGVyLWdyYXktNjAwIGRhcms6cGxhY2Vob2xkZXItZ3JheS00MDAgZGFyazp0ZXh0LXdoaXRlIGRhcms6Zm9jdXM6cmluZy1ibHVlLTUwMCBkYXJrOmZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIEpTT04gaGVyZS4uLlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGlvbk1lc3NhZ2VcIiBjbGFzcz1cInRleHQtcmVkLTUwMCBtdC0yXCI+e3sgdmFsaWRhdGlvbk1lc3NhZ2UgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuXG5cblxuXG5cblxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBGaWx0ZXIgTWFwaW5nXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXgganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVyczsgbGV0IGkgPSBpbmRleDtcIj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBMb2NhbCBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5sb2NhbENvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFNlcnZlciBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5zZXJ2ZXJDb2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBPcGVyYXRvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImtwaV9vcGVyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ub3BlcmF0b3JOYW1lXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhdHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZGF0YVR5cGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERlZmF1bHQgVmFsdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5kZWZhdWx0VmFsdWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LThcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC04IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWx0ZXJNYXBpbmdDb2x1bW5zKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNhdmVDb2x1bW5NYXBpbmcoKVwiPlNhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hcGluZzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlck1hcGluZ0NvbHVtbnMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwaW5nPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBteC0xIG15LTJcIiAoY2xpY2spPVwiY3JlYXRlRGF0YVNldCgpXCI+XG4gICAgICAgICAgICAgICAgU3VibWl0IERhdGFTZXRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,167 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { SqlPipe } from './sqlFormatter';
3
+ import cloneDeep from 'lodash-es/cloneDeep';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-toastr";
6
+ import * as i2 from "../../common";
7
+ import * as i3 from "./sqlFormatter";
8
+ import * as i4 from "../../application-content.service";
9
+ import * as i5 from "@angular/common";
10
+ import * as i6 from "devextreme-angular/ui/select-box";
11
+ import * as i7 from "devextreme-angular/ui/text-box";
12
+ import * as i8 from "@angular/forms";
13
+ export class CreateDatasetSqlComponent {
14
+ constructor(toastr, commonService, sqlFormatter, service) {
15
+ this.toastr = toastr;
16
+ this.commonService = commonService;
17
+ this.sqlFormatter = sqlFormatter;
18
+ this.service = service;
19
+ this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
20
+ this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn", "contains", "startsWith", "endsWith"];
21
+ this.getSqlQueryBulbderDataSet = new EventEmitter();
22
+ this.sqlString = '';
23
+ this.validateArgumentError = false;
24
+ this.formatButtonStatus = true;
25
+ this.validateStatus = false;
26
+ this.isValidate = true;
27
+ this.isNotValidate = true;
28
+ this.argumentData = [];
29
+ this.kpi_enrichment_name = [];
30
+ }
31
+ set sqlBulderDataset(value) {
32
+ if (value.queryConfig.mapedFilters == undefined) {
33
+ value.queryConfig.mapedFilters = [];
34
+ value.queryConfig.mapedFilters.push({ "localColumn": "", "serverColumn": "", "operatorName": "", "defaultValue": "", "dataType": "" });
35
+ }
36
+ if (value.queryConfig.templateQuery != "") {
37
+ this.queryStringData = value.queryConfig.templateQuery;
38
+ }
39
+ this.apiBulderDataset = value;
40
+ }
41
+ ngOnInit() {
42
+ this.service.listColumnEnrichmentFunctions().subscribe(data => {
43
+ this.kpi_enrichment_name = data;
44
+ });
45
+ }
46
+ addFilterMapingColumns() {
47
+ let obj = { "localColumn": "", "serverColumn": "", "operatorName": "", "defaultValue": "", "dataType": "" };
48
+ this.apiBulderDataset.queryConfig.mapedFilters.push(obj);
49
+ }
50
+ deleteFilterMapingColumns(i) {
51
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(i, 1);
52
+ }
53
+ saveColumnMaping() {
54
+ this.toastr.success('Maped Filter Successfully');
55
+ }
56
+ moveItemForColumns(index, direction) {
57
+ if (index < 0 || index >= this.apiBulderDataset.queryConfig.mapedFilters.length)
58
+ return;
59
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
60
+ if (newPosition < 0 || newPosition >= this.apiBulderDataset.queryConfig.mapedFilters.length)
61
+ return;
62
+ const itemToMove = this.apiBulderDataset.queryConfig.mapedFilters[index];
63
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(index, 1);
64
+ this.apiBulderDataset.queryConfig.mapedFilters.splice(newPosition, 0, itemToMove);
65
+ }
66
+ format() {
67
+ this.matches = [];
68
+ this.duplicateMatches = [];
69
+ this.argumentData = [];
70
+ let val;
71
+ let fval;
72
+ let splittedValuesOfQuery;
73
+ val = this.queryStringData;
74
+ const newVal = val.trim();
75
+ if (newVal === '' || newVal === undefined) {
76
+ }
77
+ else {
78
+ fval = this.sqlFormatter.transform(val);
79
+ splittedValuesOfQuery = val.split(' ').map(function (item) {
80
+ return item.trim().replace(/(^,)|(,)|(;)/g, '');
81
+ });
82
+ this.queryStringData = fval;
83
+ const re = /{([^}]+)}/g;
84
+ let m = [];
85
+ while (m = re.exec(fval)) {
86
+ this.duplicateMatches.push(m[1]);
87
+ }
88
+ this.matches = this.duplicateMatches.filter((v, i) => this.duplicateMatches.indexOf(v) === i);
89
+ for (let i = 0; i < this.matches.length; i++) {
90
+ let value;
91
+ let key;
92
+ let th_key;
93
+ let keyarr = [];
94
+ let th_keyArr = [];
95
+ value = this.matches[i];
96
+ keyarr = splittedValuesOfQuery.filter(s => s.includes('$P{' + this.matches[i] + '}'));
97
+ th_keyArr = splittedValuesOfQuery.filter(s => s.includes('$T{' + this.matches[i] + '}'));
98
+ if (keyarr.length !== 0) {
99
+ if (keyarr[0].split('=')[0].indexOf('.') > 0) {
100
+ key = keyarr[0].split('=')[0].split('.')[1];
101
+ }
102
+ else {
103
+ key = keyarr[0].split('=')[0];
104
+ let labelName = key.replace(/^./, key[0].toUpperCase());
105
+ }
106
+ }
107
+ this.argumentData.push(key);
108
+ }
109
+ this.isValidate = false;
110
+ this.isNotValidate = true;
111
+ }
112
+ }
113
+ validateNewReport() {
114
+ const argumentData = cloneDeep(this.argumentData).map(item => item.replace(/.*\{(.*)\}.*/, '$1'));
115
+ const mappedFilterColumns = this.apiBulderDataset.queryConfig.mapedFilters.map(element => element.localColumn);
116
+ this.apiBulderDataset.queryConfig.mapedFilters.forEach(element => {
117
+ if (argumentData.some(key => element.localColumn == key)) {
118
+ this.toastr.success('Validate For ' + element.localColumn);
119
+ this.isNotValidate = false;
120
+ }
121
+ else {
122
+ this.toastr.info('Missing Alias', element.localColumn);
123
+ }
124
+ });
125
+ argumentData.forEach(key => {
126
+ if (!mappedFilterColumns.includes(key)) {
127
+ this.toastr.info('Extra Argument Data', key);
128
+ }
129
+ });
130
+ }
131
+ moveItemForMeasuresColumns(index, direction) {
132
+ if (index < 0 || index >= this.apiBulderDataset.queryConfig.enrichments.length)
133
+ return;
134
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
135
+ if (newPosition < 0 || newPosition >= this.apiBulderDataset.queryConfig.enrichments.length)
136
+ return;
137
+ const itemToMove = this.apiBulderDataset.queryConfig.enrichments[index];
138
+ this.apiBulderDataset.queryConfig.enrichments.splice(index, 1);
139
+ this.apiBulderDataset.queryConfig.enrichments.splice(newPosition, 0, itemToMove);
140
+ }
141
+ addColumns() {
142
+ let obj = {
143
+ "columnName": "",
144
+ "enrichFunction": "",
145
+ };
146
+ this.apiBulderDataset.queryConfig.enrichments.push(obj);
147
+ }
148
+ deleteColumns(i) {
149
+ this.apiBulderDataset.queryConfig.enrichments.splice(i, 1);
150
+ }
151
+ createDataSet() {
152
+ this.apiBulderDataset.queryConfig['templateQuery'] = this.queryStringData;
153
+ this.getSqlQueryBulbderDataSet.emit(this.apiBulderDataset);
154
+ }
155
+ }
156
+ CreateDatasetSqlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CreateDatasetSqlComponent, deps: [{ token: i1.ToastrService }, { token: i2.CommonService }, { token: i3.SqlPipe }, { token: i4.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
157
+ CreateDatasetSqlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: CreateDatasetSqlComponent, selector: "app-create-dataset-sql", inputs: { sqlBulderDataset: "sqlBulderDataset" }, outputs: { getSqlQueryBulbderDataSet: "getSqlQueryBulbderDataSet" }, providers: [SqlPipe], ngImport: i0, template: "<div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">End Point</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.api\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Api Type</div>\n <dx-select-box [dataSource]=\"['get','post']\" [(ngModel)]=\"apiBulderDataset.apiType\">\n </dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Database Name</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.queryConfig.databaseName\">\n </dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">DB Config</div>\n <dx-select-box [items]=\"['impala','postgres','mysql','bigquery']\"\n [(ngModel)]=\"apiBulderDataset.queryConfig.dbConfig\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.mapedFilters; let i = index;\">\n\n\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Server Column</div>\n <dx-text-box [(ngModel)]=\"item.serverColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Local Column(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.localColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Operator</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_operator\"\n [(ngModel)]=\"item.operatorName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Default Value</div>\n <dx-text-box [(ngModel)]=\"item.defaultValue\"></dx-text-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.mapedFilters.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteFilterMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex flex-row\">\n <div class=\"w-1/2\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\" (click)=\"saveColumnMaping()\">Save\n Maping</button>\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n\n\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n Configure SQL Expression\n </h6>\n <div class=\"p-5 font-light border border-b-0 border-gray-200 dark:border-gray-700 dark:bg-gray-900\">\n <div class=\"mt-5 p-2\">\n <textarea id=\"message\" rows=\"20\"\n class=\"block p-2.5 w-full text-lg text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500\"\n placeholder=\"Write your SQL query here...\" [(ngModel)]=\"queryStringData\"\n id=\"exampleTextarea\">{{ sqlString | sql }}</textarea>\n\n\n <div class=\"row no-margin\" *ngIf=\"validateArgumentError\">\n <p class=\"text-red-400\">This query is not valid</p>\n </div>\n\n <div class=\"flex\">\n <button *ngIf=\"formatButtonStatus\" type=\"button\"\n class=\"focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4\n focus:ring-purple-300 font-medium dark:bg-purple-600 my-2 px-5 py-2.5 dark:hover:bg-purple-700 dark:focus:ring-purple-900\"\n (click)=\"format()\">Format\n </button>\n <button type=\"button\" *ngIf=\"!formatButtonStatus\"\n class=\"focus:outline-none text-white bg-yellow-800 hover:bg-yellow-500 focus:ring-4\n focus:ring-yellow-300 font-medium mr-2 px-5 py-2.5 my-2 dark:focus:ring-yellow-900\" (click)=\"format()\">\n Reformat\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-2\">\n\n </div>\n </div>\n <div class=\"my-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700 \">\n <h6 class=\"mb-2 font-bold tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n Data Enrichment\n </h6>\n <div class=\"grid grid-cols-1 gap-2 w-full\">\n <div class=\"p-2 w-full\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.enrichments; let i = index;\">\n <div class=\"flex flex-row\">\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Enrich Type</div>\n <dx-select-box [items]=\"['Basic','Lookup']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Enrich Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\"\n [(ngModel)]=\"item.enrichFunction\"></dx-select-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForMeasuresColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.enrichments.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForMeasuresColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n </div>\n </div>\n\n\n <div class=\"flex justify-end mt-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n\n\n\n <div class=\"flex w-full justify-end mt-5 border-t\">\n <button type=\"button\" class=\"{{commonService.btn_primary_md}} cursor-pointer mx-1 my-2\"\n (click)=\"validateNewReport()\" [disabled]=\"isValidate\">\n Validate\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createDataSet()\"\n [disabled]=\"isNotValidate\">\n Submit DataSet\n </button>\n </div>\n\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.SqlPipe, name: "sql" }] });
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: CreateDatasetSqlComponent, decorators: [{
159
+ type: Component,
160
+ args: [{ selector: 'app-create-dataset-sql', providers: [SqlPipe], template: "<div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">End Point</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.api\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Api Type</div>\n <dx-select-box [dataSource]=\"['get','post']\" [(ngModel)]=\"apiBulderDataset.apiType\">\n </dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Database Name</div>\n <dx-text-box [(ngModel)]=\"apiBulderDataset.queryConfig.databaseName\">\n </dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">DB Config</div>\n <dx-select-box [items]=\"['impala','postgres','mysql','bigquery']\"\n [(ngModel)]=\"apiBulderDataset.queryConfig.dbConfig\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.mapedFilters; let i = index;\">\n\n\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Server Column</div>\n <dx-text-box [(ngModel)]=\"item.serverColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Local Column(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.localColumn\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Operator</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_operator\"\n [(ngModel)]=\"item.operatorName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Default Value</div>\n <dx-text-box [(ngModel)]=\"item.defaultValue\"></dx-text-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.mapedFilters.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteFilterMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"flex flex-row\">\n <div class=\"w-1/2\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\" (click)=\"saveColumnMaping()\">Save\n Maping</button>\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n\n\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n Configure SQL Expression\n </h6>\n <div class=\"p-5 font-light border border-b-0 border-gray-200 dark:border-gray-700 dark:bg-gray-900\">\n <div class=\"mt-5 p-2\">\n <textarea id=\"message\" rows=\"20\"\n class=\"block p-2.5 w-full text-lg text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500\"\n placeholder=\"Write your SQL query here...\" [(ngModel)]=\"queryStringData\"\n id=\"exampleTextarea\">{{ sqlString | sql }}</textarea>\n\n\n <div class=\"row no-margin\" *ngIf=\"validateArgumentError\">\n <p class=\"text-red-400\">This query is not valid</p>\n </div>\n\n <div class=\"flex\">\n <button *ngIf=\"formatButtonStatus\" type=\"button\"\n class=\"focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4\n focus:ring-purple-300 font-medium dark:bg-purple-600 my-2 px-5 py-2.5 dark:hover:bg-purple-700 dark:focus:ring-purple-900\"\n (click)=\"format()\">Format\n </button>\n <button type=\"button\" *ngIf=\"!formatButtonStatus\"\n class=\"focus:outline-none text-white bg-yellow-800 hover:bg-yellow-500 focus:ring-4\n focus:ring-yellow-300 font-medium mr-2 px-5 py-2.5 my-2 dark:focus:ring-yellow-900\" (click)=\"format()\">\n Reformat\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end mt-2\">\n\n </div>\n </div>\n <div class=\"my-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700 \">\n <h6 class=\"mb-2 font-bold tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n Data Enrichment\n </h6>\n <div class=\"grid grid-cols-1 gap-2 w-full\">\n <div class=\"p-2 w-full\"\n *ngFor=\"let item of apiBulderDataset.queryConfig.enrichments; let i = index;\">\n <div class=\"flex flex-row\">\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Enrich Type</div>\n <dx-select-box [items]=\"['Basic','Lookup']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Enrich Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\"\n [(ngModel)]=\"item.enrichFunction\"></dx-select-box>\n </div>\n <div class=\"px-1 mt-8\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForMeasuresColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== apiBulderDataset.queryConfig.enrichments.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForMeasuresColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"px-1 mt-8 text-center\">\n\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n </div>\n </div>\n\n\n <div class=\"flex justify-end mt-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n\n\n\n <div class=\"flex w-full justify-end mt-5 border-t\">\n <button type=\"button\" class=\"{{commonService.btn_primary_md}} cursor-pointer mx-1 my-2\"\n (click)=\"validateNewReport()\" [disabled]=\"isValidate\">\n Validate\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createDataSet()\"\n [disabled]=\"isNotValidate\">\n Submit DataSet\n </button>\n </div>\n\n </div>\n</div>" }]
161
+ }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.CommonService }, { type: i3.SqlPipe }, { type: i4.ApplicationContentService }]; }, propDecorators: { getSqlQueryBulbderDataSet: [{
162
+ type: Output
163
+ }], sqlBulderDataset: [{
164
+ type: Input,
165
+ args: ['sqlBulderDataset']
166
+ }] } });
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWRhdGFzZXQtc3FsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9hcHBsaWNhdGlvbi1kYXRhc2V0LWNvbXBvbmVudC9jcmVhdGUtZGF0YXNldC1zcWwvY3JlYXRlLWRhdGFzZXQtc3FsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9hcHBsaWNhdGlvbi1kYXRhc2V0LWNvbXBvbmVudC9jcmVhdGUtZGF0YXNldC1zcWwvY3JlYXRlLWRhdGFzZXQtc3FsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7O0FBUzVDLE1BQU0sT0FBTyx5QkFBeUI7SUErQnBDLFlBQ1UsTUFBcUIsRUFDdEIsYUFBNEIsRUFDM0IsWUFBcUIsRUFDckIsT0FBa0M7UUFIbEMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQWxDNUMsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElB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Q0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLEdBQUcsR0FBRztZQUNSLFlBQVksRUFBRSxFQUFFO1lBQ2hCLGdCQUFnQixFQUFFLEVBQUU7U0FDckIsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBR0QsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFHRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDNUQsQ0FBQzs7c0hBN0xVLHlCQUF5QjswR0FBekIseUJBQXlCLHdLQUh6QixDQUFDLE9BQU8sQ0FBQywwQkNidEIsa3lVQWlNTTsyRkRqTE8seUJBQXlCO2tCQVByQyxTQUFTOytCQUNFLHdCQUF3QixhQUd2QixDQUFDLE9BQU8sQ0FBQzs4TEFNSCx5QkFBeUI7c0JBQXpDLE1BQU07Z0JBZ0JILGdCQUFnQjtzQkFEbkIsS0FBSzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgU3FsUGlwZSB9IGZyb20gJy4vc3FsRm9ybWF0dGVyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC1lcy9jbG9uZURlZXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3JlYXRlLWRhdGFzZXQtc3FsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1kYXRhc2V0LXNxbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1kYXRhc2V0LXNxbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtTcWxQaXBlXSxcblxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVEYXRhc2V0U3FsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIiwgXCJjb250YWluc1wiLCBcInN0YXJ0c1dpdGhcIiwgXCJlbmRzV2l0aFwiXVxuICBAT3V0cHV0KCkgcHVibGljIGdldFNxbFF1ZXJ5QnVsYmRlckRhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBhcGlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHF1ZXJ5U3RyaW5nRGF0YTogc3RyaW5nO1xuICBzcWxTdHJpbmcgPSAnJztcbiAgdmFsaWRhdGVBcmd1bWVudEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGZvcm1hdEJ1dHRvblN0YXR1czogYm9vbGVhbiA9IHRydWU7XG4gIHZhbGlkYXRlU3RhdHVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNWYWxpZGF0ZTogYm9vbGVhbiA9IHRydWU7XG4gIGlzTm90VmFsaWRhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBhcmd1bWVudERhdGE6IGFueSA9IFtdO1xuXG4gIGR1cGxpY2F0ZU1hdGNoZXM6IGFueTtcbiAgbWF0Y2hlczogYW55O1xuICBrcGlfZW5yaWNobWVudF9uYW1lOiBhbnkgPSBbXTtcbiAgQElucHV0KCdzcWxCdWxkZXJEYXRhc2V0JylcbiAgc2V0IHNxbEJ1bGRlckRhdGFzZXQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzID09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzID0gW107XG4gICAgICB2YWx1ZS5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMucHVzaCh7IFwibG9jYWxDb2x1bW5cIjogXCJcIiwgXCJzZXJ2ZXJDb2x1bW5cIjogXCJcIiwgXCJvcGVyYXRvck5hbWVcIjogXCJcIiwgXCJkZWZhdWx0VmFsdWVcIjogXCJcIiwgXCJkYXRhVHlwZVwiOiBcIlwiIH0pXG4gICAgfVxuICAgIGlmICh2YWx1ZS5xdWVyeUNvbmZpZy50ZW1wbGF0ZVF1ZXJ5ICE9IFwiXCIpIHtcbiAgICAgIHRoaXMucXVlcnlTdHJpbmdEYXRhID0gdmFsdWUucXVlcnlDb25maWcudGVtcGxhdGVRdWVyeTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc3FsRm9ybWF0dGVyOiBTcWxQaXBlLFxuICAgIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5saXN0Q29sdW1uRW5yaWNobWVudEZ1bmN0aW9ucygpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMua3BpX2VucmljaG1lbnRfbmFtZSA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGFkZEZpbHRlck1hcGluZ0NvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHsgXCJsb2NhbENvbHVtblwiOiBcIlwiLCBcInNlcnZlckNvbHVtblwiOiBcIlwiLCBcIm9wZXJhdG9yTmFtZVwiOiBcIlwiLCBcImRlZmF1bHRWYWx1ZVwiOiBcIlwiLCBcImRhdGFUeXBlXCI6IFwiXCIgfVxuICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMucHVzaChvYmopO1xuXG4gIH1cblxuICBkZWxldGVGaWx0ZXJNYXBpbmdDb2x1bW5zKGkpIHtcbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLnNwbGljZShpLCAxKVxuXG4gIH1cblxuICBzYXZlQ29sdW1uTWFwaW5nKCkge1xuICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ01hcGVkIEZpbHRlciBTdWNjZXNzZnVsbHknKTtcblxuICB9XG5cblxuXG4gIG1vdmVJdGVtRm9yQ29sdW1ucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVyc1tpbmRleF07XG4gICAgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cblxuXG4gIGZvcm1hdCgpOiBhbnkge1xuICAgIHRoaXMubWF0Y2hlcyA9IFtdO1xuICAgIHRoaXMuZHVwbGljYXRlTWF0Y2hlcyA9IFtdO1xuICAgIHRoaXMuYXJndW1lbnREYXRhID0gW107XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGxldCBmdmFsOiBhbnk7XG4gICAgbGV0IHNwbGl0dGVkVmFsdWVzT2ZRdWVyeTogYW55O1xuICAgIC8vIHZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlVGV4dGFyZWEnKVsndmFsdWUnXTtcbiAgICB2YWwgPSB0aGlzLnF1ZXJ5U3RyaW5nRGF0YTtcbiAgICBjb25zdCBuZXdWYWwgPSB2YWwudHJpbSgpO1xuICAgIGlmIChuZXdWYWwgPT09ICcnIHx8IG5ld1ZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyB0aGlzLnRvYXN0ci5lcnJvcignUXVlcnkgRW1wdHknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnZhbCA9IHRoaXMuc3FsRm9ybWF0dGVyLnRyYW5zZm9ybSh2YWwpO1xuICAgICAgc3BsaXR0ZWRWYWx1ZXNPZlF1ZXJ5ID0gdmFsLnNwbGl0KCcgJykubWFwKGZ1bmN0aW9uIChpdGVtKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udHJpbSgpLnJlcGxhY2UoLyheLCl8KCwpfCg7KS9nLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlVGV4dGFyZWEnKVsndmFsdWUnXSA9IGZ2YWw7XG4gICAgICB0aGlzLnF1ZXJ5U3RyaW5nRGF0YSA9IGZ2YWw7XG4gICAgICAvLyB0aGlzLnRvYXN0ci5zdWNjZXNzKCdRdWVyeSBGb3JtYXR0ZWQnKTtcbiAgICAgIGNvbnN0IHJlID0gL3soW159XSspfS9nO1xuICAgICAgbGV0IG0gPSBbXTtcbiAgICAgIHdoaWxlIChtID0gcmUuZXhlYyhmdmFsKSkge1xuICAgICAgICB0aGlzLmR1cGxpY2F0ZU1hdGNoZXMucHVzaChtWzFdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0Y2hlcyA9IHRoaXMuZHVwbGljYXRlTWF0Y2hlcy5maWx0ZXIoKHYsIGkpID0+IHRoaXMuZHVwbGljYXRlTWF0Y2hlcy5pbmRleE9mKHYpID09PSBpKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgICBsZXQga2V5OiBhbnk7XG4gICAgICAgIGxldCB0aF9rZXk6IGFueTtcbiAgICAgICAgbGV0IGtleWFyciA9IFtdO1xuICAgICAgICBsZXQgdGhfa2V5QXJyID0gW107XG4gICAgICAgIHZhbHVlID0gdGhpcy5tYXRjaGVzW2ldO1xuICAgICAgICBrZXlhcnIgPSBzcGxpdHRlZFZhbHVlc09mUXVlcnkuZmlsdGVyKHMgPT4gcy5pbmNsdWRlcygnJFB7JyArIHRoaXMubWF0Y2hlc1tpXSArICd9JykpO1xuICAgICAgICB0aF9rZXlBcnIgPSBzcGxpdHRlZFZhbHVlc09mUXVlcnkuZmlsdGVyKHMgPT4gcy5pbmNsdWRlcygnJFR7JyArIHRoaXMubWF0Y2hlc1tpXSArICd9JykpO1xuXG5cbiAgICAgICAgaWYgKGtleWFyci5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICBpZiAoa2V5YXJyWzBdLnNwbGl0KCc9JylbMF0uaW5kZXhPZignLicpID4gMCkge1xuICAgICAgICAgICAga2V5ID0ga2V5YXJyWzBdLnNwbGl0KCc9JylbMF0uc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0ga2V5YXJyWzBdLnNwbGl0KCc9JylbMF07XG4gICAgICAgICAgICBsZXQgbGFiZWxOYW1lID0ga2V5LnJlcGxhY2UoL14uLywga2V5WzBdLnRvVXBwZXJDYXNlKCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXJndW1lbnREYXRhLnB1c2goa2V5KVxuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNWYWxpZGF0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pc05vdFZhbGlkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmFyZ3VtZW50RGF0YSlcblxuXG5cbiAgfVxuXG5cbiAgdmFsaWRhdGVOZXdSZXBvcnQoKSB7XG4gICAgY29uc3QgYXJndW1lbnREYXRhID0gY2xvbmVEZWVwKHRoaXMuYXJndW1lbnREYXRhKS5tYXAoaXRlbSA9PiBpdGVtLnJlcGxhY2UoLy4qXFx7KC4qKVxcfS4qLywgJyQxJykpO1xuICAgIGNvbnN0IG1hcHBlZEZpbHRlckNvbHVtbnMgPSB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcubWFwZWRGaWx0ZXJzLm1hcChlbGVtZW50ID0+IGVsZW1lbnQubG9jYWxDb2x1bW4pO1xuXG4gICAgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLm1hcGVkRmlsdGVycy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGFyZ3VtZW50RGF0YS5zb21lKGtleSA9PiBlbGVtZW50LmxvY2FsQ29sdW1uID09IGtleSkpIHtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnVmFsaWRhdGUgRm9yICcgKyBlbGVtZW50LmxvY2FsQ29sdW1uKTtcbiAgICAgICAgdGhpcy5pc05vdFZhbGlkYXRlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvYXN0ci5pbmZvKCdNaXNzaW5nIEFsaWFzJywgZWxlbWVudC5sb2NhbENvbHVtbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhcmd1bWVudERhdGEuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKCFtYXBwZWRGaWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhpcy50b2FzdHIuaW5mbygnRXh0cmEgQXJndW1lbnQgRGF0YScsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIG1vdmVJdGVtRm9yTWVhc3VyZXNDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5lbnJpY2htZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuZW5yaWNobWVudHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLmVucmljaG1lbnRzW2luZGV4XTtcbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuZW5yaWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5hcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLmVucmljaG1lbnRzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgYWRkQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImVucmljaEZ1bmN0aW9uXCI6IFwiXCIsXG4gICAgfVxuICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5lbnJpY2htZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMuYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5lbnJpY2htZW50cy5zcGxpY2UoaSwgMSlcbiAgfVxuXG5cbiAgY3JlYXRlRGF0YVNldCgpIHtcbiAgICB0aGlzLmFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWdbJ3RlbXBsYXRlUXVlcnknXSA9IHRoaXMucXVlcnlTdHJpbmdEYXRhO1xuICAgIHRoaXMuZ2V0U3FsUXVlcnlCdWxiZGVyRGF0YVNldC5lbWl0KHRoaXMuYXBpQnVsZGVyRGF0YXNldClcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkVuZCBQb2ludDwvZGl2PlxuICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiYXBpQnVsZGVyRGF0YXNldC5hcGlcIj48L2R4LXRleHQtYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5BcGkgVHlwZTwvZGl2PlxuICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2RhdGFTb3VyY2VdPVwiWydnZXQnLCdwb3N0J11cIiBbKG5nTW9kZWwpXT1cImFwaUJ1bGRlckRhdGFzZXQuYXBpVHlwZVwiPlxuICAgICAgICAgICAgPC9keC1zZWxlY3QtYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5EYXRhYmFzZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJhcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLmRhdGFiYXNlTmFtZVwiPlxuICAgICAgICAgICAgPC9keC10ZXh0LWJveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+REIgQ29uZmlnPC9kaXY+XG4gICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcGlCdWxkZXJEYXRhc2V0LnF1ZXJ5Q29uZmlnLmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIE1hcGluZ1xuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnM7IGxldCBpID0gaW5kZXg7XCI+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBTZXJ2ZXIgQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uc2VydmVyQ29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTG9jYWwgQ29sdW1uKGFsaWFzTmFtZSk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5sb2NhbENvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IE9wZXJhdG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwia3BpX29wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5vcGVyYXRvck5hbWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIlsnZGF0ZScsJ3N0cmluZycsJ3RpbWVzdGFtcCcsJ2ludCcsICdkb3VibGUnLCAnYm9vbGVhbiddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGVmYXVsdCBWYWx1ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmRlZmF1bHRWYWx1ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtOFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LTggdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUZpbHRlck1hcGluZ0NvbHVtbnMoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2F2ZUNvbHVtbk1hcGluZygpXCI+U2F2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwaW5nPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXBpbmc8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTMgcC00IGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWQgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMiBmb250LWJvbGQgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItM1wiPlxuICAgICAgICAgICAgICAgIENvbmZpZ3VyZSBTUUwgRXhwcmVzc2lvblxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgZm9udC1saWdodCBib3JkZXIgYm9yZGVyLWItMCBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS03MDAgZGFyazpiZy1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01IHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJtZXNzYWdlXCIgcm93cz1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgcC0yLjUgdy1mdWxsIHRleHQtbGcgdGV4dC1ncmF5LTkwMCBiZy1ncmF5LTUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMCBkYXJrOmJnLWdyYXktNzAwIGRhcms6Ym9yZGVyLWdyYXktNjAwIGRhcms6cGxhY2Vob2xkZXItZ3JheS00MDAgZGFyazp0ZXh0LXdoaXRlIGRhcms6Zm9jdXM6cmluZy1ibHVlLTUwMCBkYXJrOmZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgU1FMIHF1ZXJ5IGhlcmUuLi5cIiBbKG5nTW9kZWwpXT1cInF1ZXJ5U3RyaW5nRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImV4YW1wbGVUZXh0YXJlYVwiPnt7ICBzcWxTdHJpbmcgfCBzcWwgfX08L3RleHRhcmVhPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBuby1tYXJnaW5cIiAqbmdJZj1cInZhbGlkYXRlQXJndW1lbnRFcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXJlZC00MDBcIj5UaGlzIHF1ZXJ5IGlzIG5vdCB2YWxpZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmb3JtYXRCdXR0b25TdGF0dXNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvY3VzOm91dGxpbmUtbm9uZSB0ZXh0LXdoaXRlIGJnLXB1cnBsZS03MDAgaG92ZXI6YmctcHVycGxlLTgwMCBmb2N1czpyaW5nLTRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1czpyaW5nLXB1cnBsZS0zMDAgZm9udC1tZWRpdW0gZGFyazpiZy1wdXJwbGUtNjAwIG15LTIgcHgtNSBweS0yLjUgZGFyazpob3ZlcjpiZy1wdXJwbGUtNzAwIGRhcms6Zm9jdXM6cmluZy1wdXJwbGUtOTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KClcIj5Gb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCIhZm9ybWF0QnV0dG9uU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvY3VzOm91dGxpbmUtbm9uZSB0ZXh0LXdoaXRlIGJnLXllbGxvdy04MDAgaG92ZXI6YmcteWVsbG93LTUwMCBmb2N1czpyaW5nLTRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1czpyaW5nLXllbGxvdy0zMDAgZm9udC1tZWRpdW0gbXItMiBweC01IHB5LTIuNSBteS0yIGRhcms6Zm9jdXM6cmluZy15ZWxsb3ctOTAwXCIgKGNsaWNrKT1cImZvcm1hdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBtdC0yXCI+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm0tMyBwLTQgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLWxnIHNoYWRvdy1tZCBkYXJrOmJnLWdyYXktODAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIFwiPlxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgRGF0YSBFbnJpY2htZW50XG4gICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMSBnYXAtMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMiB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYXBpQnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5lbnJpY2htZW50czsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBWYWx1ZSBGaWVsZChhbGlhc05hbWUpPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29sdW1uTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBFbnJpY2ggVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydCYXNpYycsJ0xvb2t1cCddXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRW5yaWNoIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJrcGlfZW5yaWNobWVudF9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5lbnJpY2hGdW5jdGlvblwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvck1lYXN1cmVzQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGFwaUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuZW5yaWNobWVudHMubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yTWVhc3VyZXNDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtOCB0ZXh0LWNlbnRlclwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW5zKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmFsaWRhdGVOZXdSZXBvcnQoKVwiIFtkaXNhYmxlZF09XCJpc1ZhbGlkYXRlXCI+XG4gICAgICAgICAgICAgICAgVmFsaWRhdGVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVEYXRhU2V0KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc05vdFZhbGlkYXRlXCI+XG4gICAgICAgICAgICAgICAgU3VibWl0IERhdGFTZXRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,17 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as vkbeautify from 'vkbeautify';
3
+ import * as i0 from "@angular/core";
4
+ export class SqlPipe {
5
+ transform(value) {
6
+ return vkbeautify.sql(value);
7
+ }
8
+ }
9
+ SqlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: SqlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
10
+ SqlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.3", ngImport: i0, type: SqlPipe, name: "sql" });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: SqlPipe, decorators: [{
12
+ type: Pipe,
13
+ args: [{
14
+ name: 'sql'
15
+ }]
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsRm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLWRhdGFzZXQtY29tcG9uZW50L2NyZWF0ZS1kYXRhc2V0LXNxbC9zcWxGb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUM7O0FBVXpDLE1BQU0sT0FBTyxPQUFPO0lBQ2hCLFNBQVMsQ0FBQyxLQUFhO1FBQ25CLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDOztvR0FIUSxPQUFPO2tHQUFQLE9BQU87MkZBQVAsT0FBTztrQkFIbkIsSUFBSTttQkFBQztvQkFDRixJQUFJLEVBQUUsS0FBSztpQkFDZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcblxuLyoqXG4gKiBHZW5lcmF0ZWQgY2xhc3MgZm9yIHRoZSBzYWZlSHRtbFZvdWNoZXJ0cmVhbmQgcGlwZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb3JlL1BpcGUgZm9yIG1vcmUgaW5mbyBvbiBBbmd1bGFyIFBpcGVzLlxuICovXG5AUGlwZSh7XG4gICAgbmFtZTogJ3NxbCdcbn0pXG5leHBvcnQgY2xhc3MgU3FsUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAgIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHZrYmVhdXRpZnkuc3FsKHZhbHVlKTtcbiAgICB9XG59XG4iXX0=