gamma-app-controller 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/application-controller/application-content.service.mjs +32 -1
- package/esm2020/lib/application-controller/application-controller.module.mjs +37 -5
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +4 -4
- package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +95 -0
- package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +173 -0
- package/esm2020/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.mjs +77 -0
- package/esm2020/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.mjs +171 -0
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +4 -4
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/gamma-app-controller.mjs +635 -115
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +641 -115
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-content.service.d.ts +4 -0
- package/lib/application-controller/application-controller.module.d.ts +15 -11
- package/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.d.ts +41 -0
- package/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.d.ts +136 -0
- package/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.d.ts +42 -0
- package/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.d.ts +49 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../common";
|
|
4
|
+
import * as i2 from "ngx-toastr";
|
|
5
|
+
import * as i3 from "@angular/router";
|
|
6
|
+
import * as i4 from "../../application-content.service";
|
|
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
|
+
import * as i9 from "@angular/material/icon";
|
|
12
|
+
import * as i10 from "../../shared/loading/loading.component";
|
|
13
|
+
import * as i11 from "../online-metrics/online-metrics.component";
|
|
14
|
+
import * as i12 from "../ofline-metrics/ofline-metrics.component";
|
|
15
|
+
export class CreateMetricsComponent {
|
|
16
|
+
constructor(commonService, toastr, router, service) {
|
|
17
|
+
this.commonService = commonService;
|
|
18
|
+
this.toastr = toastr;
|
|
19
|
+
this.router = router;
|
|
20
|
+
this.service = service;
|
|
21
|
+
this.reqFieldsDataSource = [];
|
|
22
|
+
this.isreqFields = false;
|
|
23
|
+
this.iscdrParams = false;
|
|
24
|
+
this.cdrFieldsDataSource = [];
|
|
25
|
+
this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
|
|
26
|
+
this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
|
|
27
|
+
this.kpi_enrichment_name = [];
|
|
28
|
+
this.reqShortDataSource = [];
|
|
29
|
+
this.filterMapingDatasource = [];
|
|
30
|
+
this.isModelVisible = false;
|
|
31
|
+
this.isSqlCopiedText = false;
|
|
32
|
+
this.isReconColume = false;
|
|
33
|
+
this.reconColumeDatasource = [];
|
|
34
|
+
this.isQueryTypeSelect = false;
|
|
35
|
+
this.mesuresAndDimentionsColumns = [];
|
|
36
|
+
this.metricOnlineObject = {
|
|
37
|
+
"metricName": "msc_voice_day_metric",
|
|
38
|
+
"metricId": "",
|
|
39
|
+
"metricDisplayName": "Metric Voice Day Metric",
|
|
40
|
+
"metricType": "online",
|
|
41
|
+
"source": {
|
|
42
|
+
"datasource": "huawei-msc",
|
|
43
|
+
"eventName": "huawei_msc_fct",
|
|
44
|
+
"filters": [
|
|
45
|
+
{ "fieldName": "event_type_key", "operation": "string", "threshold": "1,5,6", "comparator": "in" }
|
|
46
|
+
],
|
|
47
|
+
"exclusions": [
|
|
48
|
+
{ "fieldName": "", "operation": "", "threshold": "", "comparator": "" }
|
|
49
|
+
],
|
|
50
|
+
"dimensions": [
|
|
51
|
+
{ "fieldName": "xdr_date", "aliasName": "record_date", "dataType": "string", "format": "yyyyMMdd" },
|
|
52
|
+
{ "fieldName": "event_type_key", "aliasName": "event_type", "dataType": "string" },
|
|
53
|
+
{ "fieldName": "srv_type_key", "aliasName": "srv_type", "dataType": "string" },
|
|
54
|
+
{ "fieldName": "other_nw_ind_key", "aliasName": "nw_call_type", "dataType": "string" },
|
|
55
|
+
{ "fieldName": "xdr_date", "aliasName": "hour", "dataType": "int", "method": "getHour" },
|
|
56
|
+
{ "fieldName": "other_msisdn_iso_code", "aliasName": "country", "dataType": "string" },
|
|
57
|
+
{ "fieldName": "other_oper", "aliasName": "operator", "dataType": "string" },
|
|
58
|
+
{ "fieldName": "event_direction_key", "aliasName": "direction", "dataType": "string" }
|
|
59
|
+
],
|
|
60
|
+
"measures": [
|
|
61
|
+
{ "fieldName": "original_dur", "aliasName": "msc_mou", "dataType": "double", "type": "sum" },
|
|
62
|
+
{ "aliasName": "msc_count", "type": "count" }
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"target": {
|
|
66
|
+
"databaseName": "rafmdb",
|
|
67
|
+
"dbConfig": "mongo",
|
|
68
|
+
"tableName": "msc_daily_metric",
|
|
69
|
+
"partitionColumn": "",
|
|
70
|
+
"dimensionColumns": ["record_date", "event_type", "srv_type", "direction", "nw_call_type", "hour",
|
|
71
|
+
"country", "operator"
|
|
72
|
+
],
|
|
73
|
+
"measureColumns": [
|
|
74
|
+
"msc_mou", "msc_count"
|
|
75
|
+
],
|
|
76
|
+
"createTable": false,
|
|
77
|
+
"writeDisposition": "append"
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.metricMainObject = {
|
|
81
|
+
"metricName": "msc_voice_day_metric",
|
|
82
|
+
"metricId": "",
|
|
83
|
+
"metricDisplayName": "Metric Voice Day Metric",
|
|
84
|
+
"metricType": "online",
|
|
85
|
+
};
|
|
86
|
+
this.metricOflineObject = {
|
|
87
|
+
"metricName": "",
|
|
88
|
+
"metricId": "",
|
|
89
|
+
"metricDisplayName": "",
|
|
90
|
+
"metricType": "offline",
|
|
91
|
+
"runner": "",
|
|
92
|
+
"source": {
|
|
93
|
+
"databaseName": "rafms",
|
|
94
|
+
"dbConfig": "bigquery",
|
|
95
|
+
"queryTemplate": "",
|
|
96
|
+
"queryTemplateFile": ""
|
|
97
|
+
},
|
|
98
|
+
"target": {
|
|
99
|
+
"databaseName": "rafmdb",
|
|
100
|
+
"dbConfig": "mysql",
|
|
101
|
+
"tableName": "",
|
|
102
|
+
"dimensionColumns": [],
|
|
103
|
+
"measureColumns": [],
|
|
104
|
+
"partitionColumn": "",
|
|
105
|
+
"createTable": true,
|
|
106
|
+
"writeDisposition": "append"
|
|
107
|
+
},
|
|
108
|
+
"execution": {
|
|
109
|
+
"type": "scheduled",
|
|
110
|
+
"jobGroupId": "",
|
|
111
|
+
"arguments": [
|
|
112
|
+
{
|
|
113
|
+
"argumentName": "start_date",
|
|
114
|
+
"labelName": "Event Start Date",
|
|
115
|
+
"datatype": "timestamp",
|
|
116
|
+
"runtimeValue": "static",
|
|
117
|
+
"function": "D1_START"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"argumentName": "end_date",
|
|
121
|
+
"labelName": "Event End Date",
|
|
122
|
+
"runtimeValue": "static",
|
|
123
|
+
"datatype": "timestamp",
|
|
124
|
+
"function": "D1_END"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
ngOnInit() {
|
|
131
|
+
}
|
|
132
|
+
getMetricType(e) {
|
|
133
|
+
if (e.event) {
|
|
134
|
+
this.metrictype = e.value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
submittOnlineMetrics(data) {
|
|
138
|
+
data["appName"] = "pronto";
|
|
139
|
+
data["metricId"] = "";
|
|
140
|
+
data["activated"] = false;
|
|
141
|
+
console.log(data);
|
|
142
|
+
this.service.saveOnlineMetricConfig(data).subscribe({
|
|
143
|
+
next: (data) => {
|
|
144
|
+
this.toastr.success("Online Metrics Updates Successfully");
|
|
145
|
+
this.router.navigate(['/apps/controlPanel/metricController']);
|
|
146
|
+
}, error: (err) => {
|
|
147
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Metrics Config');
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
submittOfflineMetrics(data) {
|
|
152
|
+
data["appName"] = "pronto";
|
|
153
|
+
data["metricId"] = "";
|
|
154
|
+
data["activated"] = false;
|
|
155
|
+
console.log(data);
|
|
156
|
+
this.service.editOfflineMetricConfig(data).subscribe({
|
|
157
|
+
next: (data) => {
|
|
158
|
+
this.toastr.success("Offline Metrics Updates Successfully");
|
|
159
|
+
this.router.navigate(['/apps/controlPanel/metricController']);
|
|
160
|
+
}, error: (err) => {
|
|
161
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Metrics Config');
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
console.log(data);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
CreateMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.Router }, { token: i4.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
168
|
+
CreateMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CreateMetricsComponent, selector: "app-create-metrics", ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Create Metrics\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <!-- <div class=\"flex justify-between items-center border-l-2 p-0 m-0 relative\">\n <div class=\"mx-4\">\n <div class=\"text-lg font-bold mx-4 corsur-pointer\" (click)=\"openDateFilter()\">\n {{selectedDateAndTime}}\n <i class=\"fa fa-calendar\"></i>\n </div>\n </div>\n </div> -->\n </div>\n\n </div>\n\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <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\">Metric Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Display Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricDisplayName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Id</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricId\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Type</div>\n <dx-select-box [items]=\"['online','ofline']\" [(ngModel)]=\"metricMainObject.metricType\"\n (onValueChanged)=\"getMetricType($event)\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"metricMainObject.metricType == 'online'\">\n <app-online-metrics [onlineMetricData]=\"metricOnlineObject\"\n (getMetRicOnlineDataSet)=\"submittOnlineMetrics($event)\"></app-online-metrics>\n </ng-container>\n <ng-container *ngIf=\"metricMainObject.metricType == 'ofline'\">\n <app-ofline-metrics [onflineMetricData]=\"metricOflineObject\"\n (getMetRicOflineDataSet)=\"submittOfflineMetrics($event)\"></app-ofline-metrics>\n </ng-container>\n\n\n </div>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ 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.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: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i11.OnlineMetricsComponent, selector: "app-online-metrics", inputs: ["onlineMetricData"], outputs: ["getMetRicOnlineDataSet"] }, { kind: "component", type: i12.OflineMetricsComponent, selector: "app-ofline-metrics", inputs: ["onflineMetricData"], outputs: ["getMetRicOflineDataSet"] }] });
|
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateMetricsComponent, decorators: [{
|
|
170
|
+
type: Component,
|
|
171
|
+
args: [{ selector: 'app-create-metrics', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Create Metrics\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <!-- <div class=\"flex justify-between items-center border-l-2 p-0 m-0 relative\">\n <div class=\"mx-4\">\n <div class=\"text-lg font-bold mx-4 corsur-pointer\" (click)=\"openDateFilter()\">\n {{selectedDateAndTime}}\n <i class=\"fa fa-calendar\"></i>\n </div>\n </div>\n </div> -->\n </div>\n\n </div>\n\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <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\">Metric Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Display Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricDisplayName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Id</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.metricId\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Metric Type</div>\n <dx-select-box [items]=\"['online','ofline']\" [(ngModel)]=\"metricMainObject.metricType\"\n (onValueChanged)=\"getMetricType($event)\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"metricMainObject.metricType == 'online'\">\n <app-online-metrics [onlineMetricData]=\"metricOnlineObject\"\n (getMetRicOnlineDataSet)=\"submittOnlineMetrics($event)\"></app-online-metrics>\n </ng-container>\n <ng-container *ngIf=\"metricMainObject.metricType == 'ofline'\">\n <app-ofline-metrics [onflineMetricData]=\"metricOflineObject\"\n (getMetRicOflineDataSet)=\"submittOfflineMetrics($event)\"></app-ofline-metrics>\n </ng-container>\n\n\n </div>\n </div>\n </div>\n</div>" }]
|
|
172
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.Router }, { type: i4.ApplicationContentService }]; } });
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvY3JlYXRlLW1ldHJpY3MvY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBVy9FLE1BQU0sT0FBTyxzQkFBc0I7SUEwSGpDLFlBQW1CLGFBQTRCLEVBQ3JDLE1BQXFCLEVBQ3JCLE1BQWMsRUFDZCxPQUFrQztRQUh6QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNyQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQTFINUMsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixpQkFBWSxHQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNyRixpQkFBWSxHQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFL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Q0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtnQkFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUE7WUFDL0QsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO1lBQ3pHLENBQUM7U0FDRixDQUFDLENBQUE7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7O21IQXRLVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiwwRENibkMsMnJHQWdFTTsyRkRuRE8sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNyZWF0ZS1tZXRyaWNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1tZXRyaWNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLW1ldHJpY3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVNZXRyaWNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICAvLyBASW5wdXQoKSBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgcmVxRmllbGRzRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGlzcmVxRmllbGRzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzY2RyUGFyYW1zOiBib29sZWFuID0gZmFsc2U7XG4gIGNkckZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBrcGlfZnVuY3Rpb246IGFueSA9IFtcInN1bVwiLCBcImNvdW50XCIsIFwiYXZnXCIsIFwibWF4XCIsIFwibWluXCIsIFwic3RkZGV2XCIsIFwiY291bnRfZGlzdGluY3RcIl1cbiAga3BpX29wZXJhdG9yOiBhbnkgPSBbXCJlcVwiLCBcImd0ZVwiLCBcImx0ZVwiLCBcIm5lXCIsIFwiaW5cIiwgXCJub3RJblwiXVxuICBrcGlfZW5yaWNobWVudF9uYW1lOiBhbnkgPSBbXTtcbiAgcmVxU2hvcnREYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgZmlsdGVyTWFwaW5nRGF0YXNvdXJjZTogYW55ID0gW107XG4gIHF1ZXJ5X2RhdGE6IGFueTtcbiAgaXNNb2RlbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTcWxDb3BpZWRUZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIHF1ZXJ5QnVsZGVyRGF0YXNldDogYW55O1xuICBpc1JlY29uQ29sdW1lOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEBPdXRwdXQoKSBwdWJsaWMgZ2V0UXVlcnlCdWxiZGVyRGF0YVNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVjb25Db2x1bWVEYXRhc291cmNlID0gW107XG5cbiAgc2VsZWN0ZWREYXRhU291cmNlOiBhbnk7XG4gIGlzUXVlcnlUeXBlU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgbWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zID0gW107XG4gIG1ldHJpY09ubGluZU9iamVjdCA9IHtcbiAgICBcIm1ldHJpY05hbWVcIjogXCJtc2Nfdm9pY2VfZGF5X21ldHJpY1wiLFxuICAgIFwibWV0cmljSWRcIjogXCJcIixcbiAgICBcIm1ldHJpY0Rpc3BsYXlOYW1lXCI6IFwiTWV0cmljIFZvaWNlIERheSBNZXRyaWNcIixcbiAgICBcIm1ldHJpY1R5cGVcIjogXCJvbmxpbmVcIixcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcImRhdGFzb3VyY2VcIjogXCJodWF3ZWktbXNjXCIsXG4gICAgICBcImV2ZW50TmFtZVwiOiBcImh1YXdlaV9tc2NfZmN0XCIsXG4gICAgICBcImZpbHRlcnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiZXZlbnRfdHlwZV9rZXlcIiwgXCJvcGVyYXRpb25cIjogXCJzdHJpbmdcIiwgXCJ0aHJlc2hvbGRcIjogXCIxLDUsNlwiLCBcImNvbXBhcmF0b3JcIjogXCJpblwiIH1cbiAgICAgIF0sXG4gICAgICBcImV4Y2x1c2lvbnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiXCIsIFwib3BlcmF0aW9uXCI6IFwiXCIsIFwidGhyZXNob2xkXCI6IFwiXCIsIFwiY29tcGFyYXRvclwiOiBcIlwiIH1cbiAgICAgIF0sXG4gICAgICBcImRpbWVuc2lvbnNcIjogW1xuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwieGRyX2RhdGVcIiwgXCJhbGlhc05hbWVcIjogXCJyZWNvcmRfZGF0ZVwiLCBcImRhdGFUeXBlXCI6IFwic3RyaW5nXCIsIFwiZm9ybWF0XCI6IFwieXl5eU1NZGRcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwiZXZlbnRfdHlwZV9rZXlcIiwgXCJhbGlhc05hbWVcIjogXCJldmVudF90eXBlXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwic3J2X3R5cGVfa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwic3J2X3R5cGVcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvdGhlcl9ud19pbmRfa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwibndfY2FsbF90eXBlXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IFwiZmllbGROYW1lXCI6IFwieGRyX2RhdGVcIiwgXCJhbGlhc05hbWVcIjogXCJob3VyXCIsIFwiZGF0YVR5cGVcIjogXCJpbnRcIiwgXCJtZXRob2RcIjogXCJnZXRIb3VyXCIgfSxcbiAgICAgICAgeyBcImZpZWxkTmFtZVwiOiBcIm90aGVyX21zaXNkbl9pc29fY29kZVwiLCBcImFsaWFzTmFtZVwiOiBcImNvdW50cnlcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvdGhlcl9vcGVyXCIsIFwiYWxpYXNOYW1lXCI6IFwib3BlcmF0b3JcIiwgXCJkYXRhVHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJldmVudF9kaXJlY3Rpb25fa2V5XCIsIFwiYWxpYXNOYW1lXCI6IFwiZGlyZWN0aW9uXCIsIFwiZGF0YVR5cGVcIjogXCJzdHJpbmdcIiB9XG4gICAgICBdLFxuICAgICAgXCJtZWFzdXJlc1wiOiBbXG4gICAgICAgIHsgXCJmaWVsZE5hbWVcIjogXCJvcmlnaW5hbF9kdXJcIiwgXCJhbGlhc05hbWVcIjogXCJtc2NfbW91XCIsIFwiZGF0YVR5cGVcIjogXCJkb3VibGVcIiwgXCJ0eXBlXCI6IFwic3VtXCIgfSxcbiAgICAgICAgeyBcImFsaWFzTmFtZVwiOiBcIm1zY19jb3VudFwiLCBcInR5cGVcIjogXCJjb3VudFwiIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIFwidGFyZ2V0XCI6IHtcbiAgICAgIFwiZGF0YWJhc2VOYW1lXCI6IFwicmFmbWRiXCIsXG4gICAgICBcImRiQ29uZmlnXCI6IFwibW9uZ29cIixcbiAgICAgIFwidGFibGVOYW1lXCI6IFwibXNjX2RhaWx5X21ldHJpY1wiLFxuICAgICAgXCJwYXJ0aXRpb25Db2x1bW5cIjogXCJcIixcbiAgICAgIFwiZGltZW5zaW9uQ29sdW1uc1wiOiBbXCJyZWNvcmRfZGF0ZVwiLCBcImV2ZW50X3R5cGVcIiwgXCJzcnZfdHlwZVwiLCBcImRpcmVjdGlvblwiLCBcIm53X2NhbGxfdHlwZVwiLCBcImhvdXJcIixcbiAgICAgICAgXCJjb3VudHJ5XCIsIFwib3BlcmF0b3JcIlxuICAgICAgXSxcbiAgICAgIFwibWVhc3VyZUNvbHVtbnNcIjogW1xuICAgICAgICBcIm1zY19tb3VcIiwgXCJtc2NfY291bnRcIlxuICAgICAgXSxcbiAgICAgIFwiY3JlYXRlVGFibGVcIjogZmFsc2UsXG4gICAgICBcIndyaXRlRGlzcG9zaXRpb25cIjogXCJhcHBlbmRcIlxuICAgIH1cbiAgfVxuICBtZXRyaWNNYWluT2JqZWN0OiBhbnkgPSB7XG4gICAgXCJtZXRyaWNOYW1lXCI6IFwibXNjX3ZvaWNlX2RheV9tZXRyaWNcIixcbiAgICBcIm1ldHJpY0lkXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNEaXNwbGF5TmFtZVwiOiBcIk1ldHJpYyBWb2ljZSBEYXkgTWV0cmljXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib25saW5lXCIsXG4gIH07XG5cbiAgbWV0cmljT2ZsaW5lT2JqZWN0ID0ge1xuICAgIFwibWV0cmljTmFtZVwiOiBcIlwiLFxuICAgIFwibWV0cmljSWRcIjogXCJcIixcbiAgICBcIm1ldHJpY0Rpc3BsYXlOYW1lXCI6IFwiXCIsXG4gICAgXCJtZXRyaWNUeXBlXCI6IFwib2ZmbGluZVwiLFxuICAgIFwicnVubmVyXCI6XCJcIixcbiAgICBcInNvdXJjZVwiOiB7XG4gICAgICBcImRhdGFiYXNlTmFtZVwiOiBcInJhZm1zXCIsXG4gICAgICBcImRiQ29uZmlnXCI6IFwiYmlncXVlcnlcIixcbiAgICAgIFwicXVlcnlUZW1wbGF0ZVwiOiBcIlwiLFxuICAgICAgXCJxdWVyeVRlbXBsYXRlRmlsZVwiOiBcIlwiXG4gICAgfSxcbiAgICBcInRhcmdldFwiOiB7XG4gICAgICBcImRhdGFiYXNlTmFtZVwiOiBcInJhZm1kYlwiLFxuICAgICAgXCJkYkNvbmZpZ1wiOiBcIm15c3FsXCIsXG4gICAgICBcInRhYmxlTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkaW1lbnNpb25Db2x1bW5zXCI6IFtdLFxuICAgICAgXCJtZWFzdXJlQ29sdW1uc1wiOiBbXSxcbiAgICAgIFwicGFydGl0aW9uQ29sdW1uXCI6IFwiXCIsXG4gICAgICBcImNyZWF0ZVRhYmxlXCI6IHRydWUsXG4gICAgICBcIndyaXRlRGlzcG9zaXRpb25cIjogXCJhcHBlbmRcIlxuICAgIH0sXG4gICAgXCJleGVjdXRpb25cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic2NoZWR1bGVkXCIsXG4gICAgICBcImpvYkdyb3VwSWRcIjogXCJcIixcbiAgICAgIFwiYXJndW1lbnRzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwic3RhcnRfZGF0ZVwiLFxuICAgICAgICAgIFwibGFiZWxOYW1lXCI6IFwiRXZlbnQgU3RhcnQgRGF0ZVwiLFxuICAgICAgICAgIFwiZGF0YXR5cGVcIjogXCJ0aW1lc3RhbXBcIixcbiAgICAgICAgICBcInJ1bnRpbWVWYWx1ZVwiOiBcInN0YXRpY1wiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJEMV9TVEFSVFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImFyZ3VtZW50TmFtZVwiOiBcImVuZF9kYXRlXCIsXG4gICAgICAgICAgXCJsYWJlbE5hbWVcIjogXCJFdmVudCBFbmQgRGF0ZVwiLFxuICAgICAgICAgIFwicnVudGltZVZhbHVlXCI6IFwic3RhdGljXCIsXG4gICAgICAgICAgXCJkYXRhdHlwZVwiOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJEMV9FTkRcIlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cblxuICBnZXRNZXRyaWNUeXBlKGUpIHtcbiAgICBpZiAoZS5ldmVudCkge1xuICAgICAgdGhpcy5tZXRyaWN0eXBlID0gZS52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXR0T25saW5lTWV0cmljcyhkYXRhKSB7XG4gICAgZGF0YVtcImFwcE5hbWVcIl0gPSBcInByb250b1wiO1xuICAgIGRhdGFbXCJtZXRyaWNJZFwiXSA9IFwiXCI7XG4gICAgZGF0YVtcImFjdGl2YXRlZFwiXSA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHRoaXMuc2VydmljZS5zYXZlT25saW5lTWV0cmljQ29uZmlnKGRhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJPbmxpbmUgTWV0cmljcyBVcGRhdGVzIFN1Y2Nlc3NmdWxseVwiKVxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHBzL2NvbnRyb2xQYW5lbC9tZXRyaWNDb250cm9sbGVyJ10pXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ3JlYXRlIE1ldHJpY3MgQ29uZmlnJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHN1Ym1pdHRPZmZsaW5lTWV0cmljcyhkYXRhKSB7XG4gICAgZGF0YVtcImFwcE5hbWVcIl0gPSBcInByb250b1wiO1xuICAgIGRhdGFbXCJtZXRyaWNJZFwiXSA9IFwiXCI7XG4gICAgZGF0YVtcImFjdGl2YXRlZFwiXSA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHRoaXMuc2VydmljZS5lZGl0T2ZmbGluZU1ldHJpY0NvbmZpZyhkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiT2ZmbGluZSBNZXRyaWNzIFVwZGF0ZXMgU3VjY2Vzc2Z1bGx5XCIpXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FwcHMvY29udHJvbFBhbmVsL21ldHJpY0NvbnRyb2xsZXInXSlcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDcmVhdGUgTWV0cmljcyBDb25maWcnKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc29sZS5sb2coZGF0YSk7XG4gIH1cblxuXG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiAgZGFyazpiZy10cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtY29sIG1sLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCAgaXRlbXMtY2VudGVyIGZsb2F0LXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24tc2l6ZS0yXCIgW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19zb2xpZDp0ZW1wbGF0ZSdcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGgyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMnhsIG1kOnRleHQtMnhsIHB5LTMgZm9udC1leHRyYWJvbGQgaXRlbXMtY2VudGVyIG1sLTIgdHJhY2tpbmctdGlnaHQgbGVhZGluZy01IHRydW5jYXRlIGNhcGl0YWxpemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBNZXRyaWNzXG4gICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWwtMiBwLTAgbS0wIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGcgZm9udC1ib2xkIG14LTQgY29yc3VyLXBvaW50ZXJcIiAoY2xpY2spPVwib3BlbkRhdGVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVBbmRUaW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5NZXRyaWMgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+TWV0cmljIERpc3BsYXkgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNEaXNwbGF5TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPk1ldHJpYyBJZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNJZFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPk1ldHJpYyBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydvbmxpbmUnLCdvZmxpbmUnXVwiIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0TWV0cmljVHlwZSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlID09ICdvbmxpbmUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtb25saW5lLW1ldHJpY3MgW29ubGluZU1ldHJpY0RhdGFdPVwibWV0cmljT25saW5lT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChnZXRNZXRSaWNPbmxpbmVEYXRhU2V0KT1cInN1Ym1pdHRPbmxpbmVNZXRyaWNzKCRldmVudClcIj48L2FwcC1vbmxpbmUtbWV0cmljcz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWV0cmljTWFpbk9iamVjdC5tZXRyaWNUeXBlID09ICdvZmxpbmUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtb2ZsaW5lLW1ldHJpY3MgW29uZmxpbmVNZXRyaWNEYXRhXT1cIm1ldHJpY09mbGluZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZ2V0TWV0UmljT2ZsaW5lRGF0YVNldCk9XCJzdWJtaXR0T2ZmbGluZU1ldHJpY3MoJGV2ZW50KVwiPjwvYXBwLW9mbGluZS1tZXRyaWNzPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../common";
|
|
4
|
+
import * as i2 from "ngx-toastr";
|
|
5
|
+
import * as i3 from "../../application-content.service";
|
|
6
|
+
import * as i4 from "@angular/common";
|
|
7
|
+
import * as i5 from "devextreme-angular/ui/check-box";
|
|
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 OflineMetricsComponent {
|
|
12
|
+
constructor(commonService, toastr, service) {
|
|
13
|
+
this.commonService = commonService;
|
|
14
|
+
this.toastr = toastr;
|
|
15
|
+
this.service = service;
|
|
16
|
+
this.reqFieldsDataSource = [];
|
|
17
|
+
this.isreqFields = false;
|
|
18
|
+
this.iscdrParams = false;
|
|
19
|
+
this.cdrFieldsDataSource = [];
|
|
20
|
+
this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
|
|
21
|
+
this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
|
|
22
|
+
this.kpi_enrichment_name = [];
|
|
23
|
+
this.reqShortDataSource = [];
|
|
24
|
+
this.filterMapingDatasource = [];
|
|
25
|
+
this.isModelVisible = false;
|
|
26
|
+
this.isSqlCopiedText = false;
|
|
27
|
+
this.isReconColume = false;
|
|
28
|
+
this.getMetRicOflineDataSet = new EventEmitter();
|
|
29
|
+
this.functionNameContainer = ["LASTDAY_START", "D_1_START", "LASTDAY_END", "D_1_END", "LASTDAY2_START", "D_2_START", "LASTDAY2_END", "D_2_END", "D_7_START", "D_7_END", "TODAY_START", "TODAY_END", "WEEK_START", "WEEK_END", "MONTH_START", "MONTH_END", "HOUR_START", "HOUR_END", "LASTHOUR_START", "LASTHOUR_END"];
|
|
30
|
+
this.reconColumeDatasource = [];
|
|
31
|
+
this.isQueryTypeSelect = false;
|
|
32
|
+
this.mesuresAndDimentionsColumns = [];
|
|
33
|
+
this.metricMainObject = {};
|
|
34
|
+
}
|
|
35
|
+
set onflineMetricData(value) {
|
|
36
|
+
this.metricMainObject = value;
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
this.service.listColumnEnrichmentFunctions().subscribe(data => {
|
|
40
|
+
this.kpi_enrichment_name = data;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
addArguments() {
|
|
44
|
+
let obj = {
|
|
45
|
+
"argumentName": "",
|
|
46
|
+
"labelName": "",
|
|
47
|
+
"runtimeValue": "",
|
|
48
|
+
"dataType": "",
|
|
49
|
+
"function": ""
|
|
50
|
+
};
|
|
51
|
+
this.metricMainObject.execution.arguments.push(obj);
|
|
52
|
+
}
|
|
53
|
+
deleteArguments(i) {
|
|
54
|
+
this.metricMainObject.execution.arguments.splice(i, 1);
|
|
55
|
+
}
|
|
56
|
+
createOflineMetrics() {
|
|
57
|
+
this.getMetRicOflineDataSet.emit(this.metricMainObject);
|
|
58
|
+
}
|
|
59
|
+
getDataConfig(e) {
|
|
60
|
+
if (e.event) {
|
|
61
|
+
this.selectedDataSource = e.value;
|
|
62
|
+
this.isQueryTypeSelect = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
OflineMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
67
|
+
OflineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OflineMetricsComponent, selector: "app-ofline-metrics", inputs: { onflineMetricData: "onflineMetricData" }, outputs: { getMetRicOflineDataSet: "getMetRicOflineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\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\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</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)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { 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.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"] }] });
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{ selector: 'app-ofline-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\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\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</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)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>" }]
|
|
71
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.ApplicationContentService }]; }, propDecorators: { getMetRicOflineDataSet: [{
|
|
72
|
+
type: Output
|
|
73
|
+
}], onflineMetricData: [{
|
|
74
|
+
type: Input,
|
|
75
|
+
args: ['onflineMetricData']
|
|
76
|
+
}] } });
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBc0NqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFuQzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRiwwQkFBcUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFalQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBRzNCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxnQ0FBMkIsR0FBRyxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVEsRUFBRSxDQUFDO0lBWW1HLENBQUM7SUFQL0gsSUFDSSxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsV0FBVyxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0QsZUFBZSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFJRCxtQkFBbUI7UUFHakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBSUQsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBRUgsQ0FBQzs7bUhBOUVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZLQ1ZuQyx1OE5BaUpNOzJGRHZJTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dLQXFCYixzQkFBc0I7c0JBQXRDLE1BQU07Z0JBZUgsaUJBQWlCO3NCQURwQixLQUFLO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vZmxpbmUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vZmxpbmUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29mbGluZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2ZsaW5lTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGdldE1ldFJpY09mbGluZURhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXIgPSBbXCJMQVNUREFZX1NUQVJUXCIsIFwiRF8xX1NUQVJUXCIsIFwiTEFTVERBWV9FTkRcIiwgXCJEXzFfRU5EXCIsIFwiTEFTVERBWTJfU1RBUlRcIiwgXCJEXzJfU1RBUlRcIiwgXCJMQVNUREFZMl9FTkRcIiwgXCJEXzJfRU5EXCIsIFwiRF83X1NUQVJUXCIsIFwiRF83X0VORFwiLCBcIlRPREFZX1NUQVJUXCIsIFwiVE9EQVlfRU5EXCIsIFwiV0VFS19TVEFSVFwiLCBcIldFRUtfRU5EXCIsIFwiTU9OVEhfU1RBUlRcIiwgXCJNT05USF9FTkRcIiwgXCJIT1VSX1NUQVJUXCIsIFwiSE9VUl9FTkRcIiwgXCJMQVNUSE9VUl9TVEFSVFwiLCBcIkxBU1RIT1VSX0VORFwiXTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmZsaW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmZsaW5lTWV0cmljRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdCA9IHZhbHVlO1xuICB9XG5cblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UubGlzdENvbHVtbkVucmljaG1lbnRGdW5jdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmtwaV9lbnJpY2htZW50X25hbWUgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhZGRBcmd1bWVudHMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiXCIsXG4gICAgICBcImxhYmVsTmFtZVwiOiBcIlwiLFxuICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QuZXhlY3V0aW9uLmFyZ3VtZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUFyZ3VtZW50cyhpKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHMuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgY3JlYXRlT2ZsaW5lTWV0cmljcygpIHtcblxuXG4gICAgdGhpcy5nZXRNZXRSaWNPZmxpbmVEYXRhU2V0LmVtaXQodGhpcy5tZXRyaWNNYWluT2JqZWN0KVxuICB9XG5cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBCYXNpY1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBSdW5uZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnJ1bm5lclwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gVGFyZ2V0XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGFiYXNlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kYXRhYmFzZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEQiBDb25maWcgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUYWJsZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQudGFibGVOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGltZW5zaW9uIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kaW1lbnNpb25Db2x1bW5zXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTWVhc3VyZSBDb2x1bW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQubWVhc3VyZUNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBQYXJ0aXRpb24gQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQucGFydGl0aW9uQ29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gV3JpdGUgRGlzcG9zaXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC53cml0ZURpc3Bvc2l0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTIgbXQtOFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggdGV4dD1cIkNyZWF0ZSBUYWJsZVwiIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuY3JlYXRlVGFibGVcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IFNvdXJjZVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhYmFzZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGF0YWJhc2VOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGIgQ29uZmlnPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLnF1ZXJ5VGVtcGxhdGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZSBGaWxlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UucXVlcnlUZW1wbGF0ZUZpbGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPkV4ZWN1dGlvblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi50eXBlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gSm9iIEdyb3VwSWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5qb2JHcm91cElkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0cmljTWFpbk9iamVjdC5leGVjdXRpb24uYXJndW1lbnRzOyBsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXJndW1lbnQgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uYXJndW1lbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IExhYmVsIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmxhYmVsTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJmdW5jdGlvbk5hbWVDb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZnVuY3Rpb25cIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBydW50aW1lVmFsdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnc3RhdGljJywnZHluYW1pYyddXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnJ1bnRpbWVWYWx1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC03IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlQXJndW1lbnRzKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQXJndW1lbnRzKClcIj5BZGRcbiAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVPZmxpbmVNZXRyaWNzKClcIj5cbiAgICAgICAgU2F2ZSBPZmxpbmUgTWV0cmljc1xuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
|