ng-kinintel 0.0.397 → 20.0.2
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/fesm2022/ng-kinintel.mjs +11874 -0
- package/fesm2022/ng-kinintel.mjs.map +1 -0
- package/index.d.ts +2818 -5
- package/package.json +6 -14
- package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
- package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
- package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
- package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
- package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
- package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
- package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
- package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
- package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
- package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
- package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
- package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
- package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
- package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
- package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
- package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
- package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
- package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
- package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
- package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
- package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
- package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
- package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
- package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
- package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
- package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
- package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
- package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
- package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
- package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
- package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
- package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
- package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
- package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
- package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
- package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
- package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
- package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
- package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
- package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
- package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
- package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
- package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
- package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
- package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
- package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
- package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
- package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
- package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
- package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
- package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
- package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
- package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
- package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
- package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
- package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
- package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
- package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
- package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
- package/esm2020/lib/kinintel-config.mjs +0 -3
- package/esm2020/lib/ng-kinintel.module.mjs +0 -437
- package/esm2020/lib/objects/action-event.mjs +0 -16
- package/esm2020/lib/services/alert.service.mjs +0 -52
- package/esm2020/lib/services/dashboard.service.mjs +0 -75
- package/esm2020/lib/services/data-processor.service.mjs +0 -56
- package/esm2020/lib/services/data-search.service.mjs +0 -36
- package/esm2020/lib/services/dataset.service.mjs +0 -187
- package/esm2020/lib/services/datasource.service.mjs +0 -93
- package/esm2020/lib/services/external.service.mjs +0 -33
- package/esm2020/lib/services/feed.service.mjs +0 -50
- package/esm2020/lib/services/notification.service.mjs +0 -41
- package/esm2020/lib/services/project.service.mjs +0 -130
- package/esm2020/lib/services/tag.service.mjs +0 -63
- package/esm2020/ng-kinintel.mjs +0 -5
- package/esm2020/public-api.mjs +0 -43
- package/fesm2015/ng-kinintel.mjs +0 -12182
- package/fesm2015/ng-kinintel.mjs.map +0 -1
- package/fesm2020/ng-kinintel.mjs +0 -11872
- package/fesm2020/ng-kinintel.mjs.map +0 -1
- package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
- package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
- package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
- package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
- package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
- package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
- package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
- package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
- package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
- package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
- package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
- package/lib/components/dashboards/dashboards.component.d.ts +0 -56
- package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
- package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
- package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
- package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
- package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
- package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
- package/lib/components/data-picker/data-picker.component.d.ts +0 -32
- package/lib/components/data-search/data-search.component.d.ts +0 -5
- package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
- package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
- package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
- package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
- package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
- package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
- package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
- package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
- package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
- package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset.component.d.ts +0 -74
- package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
- package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
- package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
- package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
- package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
- package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
- package/lib/components/datasource/datasource.component.d.ts +0 -46
- package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
- package/lib/components/export-project/export-project.component.d.ts +0 -9
- package/lib/components/feeds/feed/feed.component.d.ts +0 -30
- package/lib/components/feeds/feeds.component.d.ts +0 -47
- package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
- package/lib/components/marketplace/marketplace.component.d.ts +0 -42
- package/lib/components/metadata/metadata.component.d.ts +0 -24
- package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
- package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
- package/lib/components/project-picker/project-picker.component.d.ts +0 -37
- package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
- package/lib/components/project-settings/project-settings.component.d.ts +0 -40
- package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
- package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
- package/lib/components/query-caching/query-caching.component.d.ts +0 -38
- package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
- package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
- package/lib/components/snapshots/snapshots.component.d.ts +0 -52
- package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
- package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
- package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
- package/lib/guards/dashboard-changes.guard.d.ts +0 -11
- package/lib/kinintel-config.d.ts +0 -10
- package/lib/ng-kinintel.module.d.ts +0 -116
- package/lib/objects/action-event.d.ts +0 -12
- package/lib/services/alert.service.d.ts +0 -17
- package/lib/services/dashboard.service.d.ts +0 -25
- package/lib/services/data-processor.service.d.ts +0 -18
- package/lib/services/data-search.service.d.ts +0 -14
- package/lib/services/dataset.service.d.ts +0 -56
- package/lib/services/datasource.service.d.ts +0 -34
- package/lib/services/external.service.d.ts +0 -12
- package/lib/services/feed.service.d.ts +0 -19
- package/lib/services/notification.service.d.ts +0 -16
- package/lib/services/project.service.d.ts +0 -27
- package/lib/services/tag.service.d.ts +0 -19
- package/public-api.d.ts +0 -38
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { Component, Inject } from '@angular/core';
|
|
3
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
4
|
-
import * as lodash from 'lodash';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
7
|
-
import * as i2 from "../../../../services/datasource.service";
|
|
8
|
-
import * as i3 from "@angular/common";
|
|
9
|
-
import * as i4 from "@angular/material/legacy-button";
|
|
10
|
-
import * as i5 from "@angular/material/icon";
|
|
11
|
-
import * as i6 from "@angular/cdk/drag-drop";
|
|
12
|
-
import * as i7 from "@angular/forms";
|
|
13
|
-
import * as i8 from "@angular/material/legacy-select";
|
|
14
|
-
import * as i9 from "@angular/material/legacy-core";
|
|
15
|
-
import * as i10 from "@angular/material/legacy-checkbox";
|
|
16
|
-
const _ = lodash.default;
|
|
17
|
-
export class AdvancedSettingsComponent {
|
|
18
|
-
constructor(dialogRef, data, datasourceService) {
|
|
19
|
-
this.dialogRef = dialogRef;
|
|
20
|
-
this.data = data;
|
|
21
|
-
this.datasourceService = datasourceService;
|
|
22
|
-
this._ = _;
|
|
23
|
-
this.columns = [];
|
|
24
|
-
this.columns2 = [];
|
|
25
|
-
this.advancedSettings = {
|
|
26
|
-
showAutoIncrement: false,
|
|
27
|
-
primaryKeys: [],
|
|
28
|
-
indexes: [{ fieldNames: [] }]
|
|
29
|
-
};
|
|
30
|
-
this.errorMessage = '';
|
|
31
|
-
}
|
|
32
|
-
ngOnInit() {
|
|
33
|
-
this.datasourceUpdate = this.data.datasourceUpdate;
|
|
34
|
-
this.datasourceInstanceKey = this.data.datasourceInstanceKey;
|
|
35
|
-
this.advancedSettings.showAutoIncrement = this.data.showAutoIncrement || false;
|
|
36
|
-
this.advancedSettings.primaryKeys = _.clone(_.filter(this.data.columns, { keyField: true }));
|
|
37
|
-
this.allColumns = _.clone(this.data.columns);
|
|
38
|
-
this.columns = _.clone(_.filter(this.data.columns, col => {
|
|
39
|
-
return !col.keyField;
|
|
40
|
-
}));
|
|
41
|
-
this.columns2 = _.clone(_.filter(this.data.columns, col => {
|
|
42
|
-
return true;
|
|
43
|
-
}));
|
|
44
|
-
if (this.datasourceUpdate.indexes && this.datasourceUpdate.indexes.length) {
|
|
45
|
-
this.advancedSettings.indexes = this.datasourceUpdate.indexes;
|
|
46
|
-
this.advancedSettings.indexes.forEach(indexObj => {
|
|
47
|
-
indexObj.indexCols = _.clone(_.filter(this.data.columns, col => {
|
|
48
|
-
return indexObj.fieldNames.indexOf(col.name) > -1;
|
|
49
|
-
}));
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
drop(event) {
|
|
54
|
-
if (event.previousContainer === event.container) {
|
|
55
|
-
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
dropIndex(event, data) {
|
|
62
|
-
moveItemInArray(data || event.container.data, event.previousIndex, event.currentIndex);
|
|
63
|
-
}
|
|
64
|
-
updateIndexes(index) {
|
|
65
|
-
index.indexCols.forEach(col => {
|
|
66
|
-
if (index.fieldNames.indexOf(col.name) === -1) {
|
|
67
|
-
index.fieldNames.push(col.name);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
index.fieldNames.forEach((fieldName, nameIndex) => {
|
|
71
|
-
if (_.findIndex(index.indexCols, { name: fieldName }) === -1) {
|
|
72
|
-
index.fieldNames.splice(nameIndex, 1);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
async saveChanges() {
|
|
77
|
-
this.errorMessage = '';
|
|
78
|
-
// Map the importKey so it doesn't get wiped.
|
|
79
|
-
this.datasourceUpdate.importKey = this.datasourceUpdate.instanceImportKey;
|
|
80
|
-
this.datasourceUpdate.indexes = _.filter(this.advancedSettings.indexes, index => {
|
|
81
|
-
return index.fieldNames.length;
|
|
82
|
-
});
|
|
83
|
-
let showAutoIncrement = this.advancedSettings.showAutoIncrement;
|
|
84
|
-
if (this.advancedSettings.primaryKeys.length) {
|
|
85
|
-
showAutoIncrement = false;
|
|
86
|
-
_.remove(this.allColumns, { type: 'id' });
|
|
87
|
-
this.allColumns.map(column => {
|
|
88
|
-
column.keyField = !!_.find(this.advancedSettings.primaryKeys, { name: column.name });
|
|
89
|
-
return column;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
if (!_.find(this.allColumns, { type: 'id' })) {
|
|
94
|
-
this.allColumns.map(column => {
|
|
95
|
-
column.keyField = false;
|
|
96
|
-
return column;
|
|
97
|
-
});
|
|
98
|
-
this.allColumns.unshift({
|
|
99
|
-
title: 'ID',
|
|
100
|
-
name: 'id',
|
|
101
|
-
type: 'id'
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
this.datasourceUpdate.fields = this.allColumns.map(column => {
|
|
106
|
-
if (column.name === column.previousName) {
|
|
107
|
-
delete column.previousName;
|
|
108
|
-
}
|
|
109
|
-
return column;
|
|
110
|
-
});
|
|
111
|
-
try {
|
|
112
|
-
await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);
|
|
113
|
-
this.dialogRef.close({ datasourceUpdate: this.datasourceUpdate, columns: this.allColumns, showAutoIncrement });
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
const error = e.error;
|
|
117
|
-
this.errorMessage = error.message || 'There was a problem updating this datasource. Please check your settings and try again.';
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
AdvancedSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AdvancedSettingsComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DatasourceService }], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
-
AdvancedSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AdvancedSettingsComponent, selector: "ki-advanced-settings", host: { classAttribute: "dialog-wrapper" }, ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Advanced Settings</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"rounded-md bg-red-50 p-4 mb-4\" *ngIf=\"errorMessage\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There was an issue saving your datasource.</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li>{{errorMessage}}</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <mat-checkbox class=\"mb-0\" [(ngModel)]=\"advancedSettings.showAutoIncrement\"\n [disabled]=\"advancedSettings.primaryKeys.length\">\n Show Auto Increment Column\n </mat-checkbox>\n <div class=\"text-xs text-gray-500 mb-8\">By default, datasources are created with an auto increment ID primary\n key\n column. Show this column using the toggle above.\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Create custom primary key</div>\n <div class=\"text-gray-500 text-sm mb-6\">Drag column(s) to make up the primary key for this datasource</div>\n\n <div class=\"flex justify-between\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n\n <div\n cdkDropList\n #columnList=\"cdkDropList\"\n [cdkDropListData]=\"columns\"\n [cdkDropListConnectedTo]=\"[pkList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n <div class=\"example-box\" *ngFor=\"let item of columns\" cdkDrag>{{ item.title }}</div>\n </div>\n </div>\n\n <div class=\"example-container\">\n <div class=\"font-medium\">Primary Key(s)</div>\n\n <div\n cdkDropList\n #pkList=\"cdkDropList\"\n [cdkDropListData]=\"advancedSettings.primaryKeys\"\n [cdkDropListConnectedTo]=\"[columnList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n <div class=\"example-box\" *ngFor=\"let item of advancedSettings.primaryKeys\" cdkDrag>\n {{ item.title }}\n </div>\n </div>\n </div>\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Datasource Indexes</div>\n <div class=\"text-gray-500 text-sm mb-6\">Select the columns to be indexed and drag to reorder if required.</div>\n\n <ng-template ngFor let-aIndex [ngForOf]=\"advancedSettings.indexes\" let-i=index>\n <div class=\"flex justify-between p-3 mb-3 bg-gray-50\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n\n <mat-select [(ngModel)]=\"aIndex.indexCols\" (ngModelChange)=\"updateIndexes(aIndex)\" [multiple]=\"true\">\n <mat-option *ngFor=\"let column of columns2\" [value]=\"column\">\n {{column.title}}\n </mat-option>\n </mat-select>\n\n </div>\n\n <div class=\"example-container\">\n <div class=\"font-medium\">Indexes</div>\n\n <div\n cdkDropList\n class=\"example-list\"\n (cdkDropListDropped)=\"dropIndex($event, aIndex.fieldNames)\">\n <div class=\"example-box\" *ngFor=\"let item of aIndex.fieldNames\" cdkDrag>\n {{ aIndex.indexCols.length ? _.find(aIndex.indexCols, {name: item})?.title : '' }}\n </div>\n </div>\n </div>\n\n <button mat-icon-button color=\"warn\" class=\"self-center\" type=\"button\"\n (click)=\"advancedSettings.indexes.splice(i, 1)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </div>\n </ng-template>\n <div class=\"flex justify-between\">\n <div></div>\n <button mat-stroked-button color=\"primary\" type=\"button\"\n (click)=\"advancedSettings.indexes.push({fieldNames: []})\">\n Create additional index\n </button>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <div></div>\n <button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveChanges()\">Save Changes\n </button>\n </div>\n\n</div>\n\n\n", styles: [".example-container{width:400px;max-width:100%;margin:0 25px 25px 0;display:inline-block;vertical-align:top}.example-list{border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden;display:block}.example-box{padding:10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
|
|
123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AdvancedSettingsComponent, decorators: [{
|
|
124
|
-
type: Component,
|
|
125
|
-
args: [{ selector: 'ki-advanced-settings', host: { class: 'dialog-wrapper' }, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Advanced Settings</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"rounded-md bg-red-50 p-4 mb-4\" *ngIf=\"errorMessage\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There was an issue saving your datasource.</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li>{{errorMessage}}</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <mat-checkbox class=\"mb-0\" [(ngModel)]=\"advancedSettings.showAutoIncrement\"\n [disabled]=\"advancedSettings.primaryKeys.length\">\n Show Auto Increment Column\n </mat-checkbox>\n <div class=\"text-xs text-gray-500 mb-8\">By default, datasources are created with an auto increment ID primary\n key\n column. Show this column using the toggle above.\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Create custom primary key</div>\n <div class=\"text-gray-500 text-sm mb-6\">Drag column(s) to make up the primary key for this datasource</div>\n\n <div class=\"flex justify-between\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n\n <div\n cdkDropList\n #columnList=\"cdkDropList\"\n [cdkDropListData]=\"columns\"\n [cdkDropListConnectedTo]=\"[pkList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n <div class=\"example-box\" *ngFor=\"let item of columns\" cdkDrag>{{ item.title }}</div>\n </div>\n </div>\n\n <div class=\"example-container\">\n <div class=\"font-medium\">Primary Key(s)</div>\n\n <div\n cdkDropList\n #pkList=\"cdkDropList\"\n [cdkDropListData]=\"advancedSettings.primaryKeys\"\n [cdkDropListConnectedTo]=\"[columnList]\"\n class=\"example-list\"\n (cdkDropListDropped)=\"drop($event)\">\n <div class=\"example-box\" *ngFor=\"let item of advancedSettings.primaryKeys\" cdkDrag>\n {{ item.title }}\n </div>\n </div>\n </div>\n </div>\n\n <hr>\n\n <div class=\"font-medium text-base mt-6\">Datasource Indexes</div>\n <div class=\"text-gray-500 text-sm mb-6\">Select the columns to be indexed and drag to reorder if required.</div>\n\n <ng-template ngFor let-aIndex [ngForOf]=\"advancedSettings.indexes\" let-i=index>\n <div class=\"flex justify-between p-3 mb-3 bg-gray-50\">\n <div class=\"example-container\">\n <div class=\"font-medium\">Available Columns</div>\n\n <mat-select [(ngModel)]=\"aIndex.indexCols\" (ngModelChange)=\"updateIndexes(aIndex)\" [multiple]=\"true\">\n <mat-option *ngFor=\"let column of columns2\" [value]=\"column\">\n {{column.title}}\n </mat-option>\n </mat-select>\n\n </div>\n\n <div class=\"example-container\">\n <div class=\"font-medium\">Indexes</div>\n\n <div\n cdkDropList\n class=\"example-list\"\n (cdkDropListDropped)=\"dropIndex($event, aIndex.fieldNames)\">\n <div class=\"example-box\" *ngFor=\"let item of aIndex.fieldNames\" cdkDrag>\n {{ aIndex.indexCols.length ? _.find(aIndex.indexCols, {name: item})?.title : '' }}\n </div>\n </div>\n </div>\n\n <button mat-icon-button color=\"warn\" class=\"self-center\" type=\"button\"\n (click)=\"advancedSettings.indexes.splice(i, 1)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </div>\n </ng-template>\n <div class=\"flex justify-between\">\n <div></div>\n <button mat-stroked-button color=\"primary\" type=\"button\"\n (click)=\"advancedSettings.indexes.push({fieldNames: []})\">\n Create additional index\n </button>\n </div>\n\n </div>\n\n <div class=\"dialog-footer\">\n <div></div>\n <button mat-flat-button color=\"primary\" type=\"button\"\n (click)=\"saveChanges()\">Save Changes\n </button>\n </div>\n\n</div>\n\n\n", styles: [".example-container{width:400px;max-width:100%;margin:0 25px 25px 0;display:inline-block;vertical-align:top}.example-list{border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden;display:block}.example-box{padding:10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
|
|
126
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
127
|
-
type: Inject,
|
|
128
|
-
args: [MAT_DIALOG_DATA]
|
|
129
|
-
}] }, { type: i2.DatasourceService }]; } });
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvYWR2YW5jZWQtc2V0dGluZ3MvYWR2YW5jZWQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvYWR2YW5jZWQtc2V0dGluZ3MvYWR2YW5jZWQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLGVBQWUsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFDSCxzQkFBc0IsSUFBSSxlQUFlLEVBRTVDLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQUdqQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBUXpCLE1BQU0sT0FBTyx5QkFBeUI7SUFnQmxDLFlBQW1CLFNBQWtELEVBQ3pCLElBQVMsRUFDakMsaUJBQW9DO1FBRnJDLGNBQVMsR0FBVCxTQUFTLENBQXlDO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWhCakQsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUNuQixxQkFBZ0IsR0FBUTtZQUMzQixpQkFB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LE1BQU0sQ0FBQyxZQUFZLENBQUM7YUFDOUI7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUk7WUFDQSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO1NBQ2hIO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSx5RkFBeUYsQ0FBQztTQUNsSTtJQUNMLENBQUM7O3VIQTVIUSx5QkFBeUIsb0RBaUJkLGVBQWU7MkdBakIxQix5QkFBeUIsd0dDakJ0Qyx5b0xBcUlBOzRGRHBIYSx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0ksc0JBQXNCLFFBRzFCLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDOzswQkFtQmxCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW19IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTUFUX0xFR0FDWV9ESUFMT0dfREFUQSBhcyBNQVRfRElBTE9HX0RBVEEsXG4gICAgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZlxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCAqIGFzIGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtEYXRhc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZGF0YXNvdXJjZS5zZXJ2aWNlJztcblxuY29uc3QgXyA9IGxvZGFzaC5kZWZhdWx0O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLWFkdmFuY2VkLXNldHRpbmdzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXNldHRpbmdzLmNvbXBvbmVudC5zYXNzJ10sXG4gICAgaG9zdDoge2NsYXNzOiAnZGlhbG9nLXdyYXBwZXInfVxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgY29sdW1uczogYW55ID0gW107XG4gICAgcHVibGljIGNvbHVtbnMyOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgYWR2YW5jZWRTZXR0aW5nczogYW55ID0ge1xuICAgICAgICBzaG93QXV0b0luY3JlbWVudDogZmFsc2UsXG4gICAgICAgIHByaW1hcnlLZXlzOiBbXSxcbiAgICAgICAgaW5kZXhlczogW3tmaWVsZE5hbWVzOiBbXX1dXG4gICAgfTtcbiAgICBwdWJsaWMgZGF0YXNvdXJjZVVwZGF0ZTogYW55O1xuICAgIHB1YmxpYyBlcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIHByaXZhdGUgZGF0YXNvdXJjZUluc3RhbmNlS2V5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBhbGxDb2x1bW5zOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWR2YW5jZWRTZXR0aW5nc0NvbXBvbmVudD4sXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc291cmNlU2VydmljZTogRGF0YXNvdXJjZVNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlID0gdGhpcy5kYXRhLmRhdGFzb3VyY2VVcGRhdGU7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5ID0gdGhpcy5kYXRhLmRhdGFzb3VyY2VJbnN0YW5jZUtleTtcblxuICAgICAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3Muc2hvd0F1dG9JbmNyZW1lbnQgPSB0aGlzLmRhdGEuc2hvd0F1dG9JbmNyZW1lbnQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5wcmltYXJ5S2V5cyA9IF8uY2xvbmUoXy5maWx0ZXIodGhpcy5kYXRhLmNvbHVtbnMsIHtrZXlGaWVsZDogdHJ1ZX0pKTtcbiAgICAgICAgdGhpcy5hbGxDb2x1bW5zID0gXy5jbG9uZSh0aGlzLmRhdGEuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IF8uY2xvbmUoXy5maWx0ZXIodGhpcy5kYXRhLmNvbHVtbnMsIGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWNvbC5rZXlGaWVsZDtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmNvbHVtbnMyID0gXy5jbG9uZShfLmZpbHRlcih0aGlzLmRhdGEuY29sdW1ucywgY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS5pbmRleGVzICYmIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS5pbmRleGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzLmluZGV4ZXMgPSB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW5kZXhlcztcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5ncy5pbmRleGVzLmZvckVhY2goaW5kZXhPYmogPT4ge1xuICAgICAgICAgICAgICAgIGluZGV4T2JqLmluZGV4Q29scyA9IF8uY2xvbmUoXy5maWx0ZXIodGhpcy5kYXRhLmNvbHVtbnMsIGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleE9iai5maWVsZE5hbWVzLmluZGV4T2YoY29sLm5hbWUpID4gLTE7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBtb3ZlSXRlbUluQXJyYXkoZXZlbnQuY29udGFpbmVyLmRhdGEsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFycmF5SXRlbShcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLFxuICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgICAgICAgZXZlbnQuY3VycmVudEluZGV4LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkcm9wSW5kZXgoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPiwgZGF0YT86IGFueSkge1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoZGF0YSB8fCBldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlSW5kZXhlcyhpbmRleDogYW55KSB7XG4gICAgICAgIGluZGV4LmluZGV4Q29scy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXguZmllbGROYW1lcy5pbmRleE9mKGNvbC5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleC5maWVsZE5hbWVzLnB1c2goY29sLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXguZmllbGROYW1lcy5mb3JFYWNoKChmaWVsZE5hbWU6IHN0cmluZywgbmFtZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChfLmZpbmRJbmRleChpbmRleC5pbmRleENvbHMsIHtuYW1lOiBmaWVsZE5hbWV9KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleC5maWVsZE5hbWVzLnNwbGljZShuYW1lSW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZUNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICAgICAgLy8gTWFwIHRoZSBpbXBvcnRLZXkgc28gaXQgZG9lc24ndCBnZXQgd2lwZWQuXG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS5pbXBvcnRLZXkgPSB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXk7XG5cbiAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLmluZGV4ZXMgPSBfLmZpbHRlcih0aGlzLmFkdmFuY2VkU2V0dGluZ3MuaW5kZXhlcywgaW5kZXggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4LmZpZWxkTmFtZXMubGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHNob3dBdXRvSW5jcmVtZW50ID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzLnNob3dBdXRvSW5jcmVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmFkdmFuY2VkU2V0dGluZ3MucHJpbWFyeUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzaG93QXV0b0luY3JlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgXy5yZW1vdmUodGhpcy5hbGxDb2x1bW5zLCB7dHlwZTogJ2lkJ30pO1xuXG4gICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmtleUZpZWxkID0gISFfLmZpbmQodGhpcy5hZHZhbmNlZFNldHRpbmdzLnByaW1hcnlLZXlzLCB7bmFtZTogY29sdW1uLm5hbWV9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghXy5maW5kKHRoaXMuYWxsQ29sdW1ucywge3R5cGU6ICdpZCd9KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsQ29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmtleUZpZWxkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnSUQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaWQnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuZmllbGRzID0gdGhpcy5hbGxDb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSBjb2x1bW4ucHJldmlvdXNOYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5wcmV2aW91c05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS51cGRhdGVDdXN0b21EYXRhc291cmNlKHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LCB0aGlzLmRhdGFzb3VyY2VVcGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe2RhdGFzb3VyY2VVcGRhdGU6IHRoaXMuZGF0YXNvdXJjZVVwZGF0ZSwgY29sdW1uczogdGhpcy5hbGxDb2x1bW5zLCBzaG93QXV0b0luY3JlbWVudH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGUuZXJyb3I7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgJ1RoZXJlIHdhcyBhIHByb2JsZW0gdXBkYXRpbmcgdGhpcyBkYXRhc291cmNlLiBQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncyBhbmQgdHJ5IGFnYWluLic7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJkaWFsb2dcIiBjZGtEcmFnIGNka0RyYWdSb290RWxlbWVudD1cIi5jZGstb3ZlcmxheS1wYW5lXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+QWR2YW5jZWQgU2V0dGluZ3M8L2gyPlxuXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGVudFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZGVkLW1kIGJnLXJlZC01MCBwLTQgbWItNFwiICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQtcmVkLTQwMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2ek04LjI4IDcuMjJhLjc1Ljc1IDAgMDAtMS4wNiAxLjA2TDguOTQgMTBsLTEuNzIgMS43MmEuNzUuNzUgMCAxMDEuMDYgMS4wNkwxMCAxMS4wNmwxLjcyIDEuNzJhLjc1Ljc1IDAgMTAxLjA2LTEuMDZMMTEuMDYgMTBsMS43Mi0xLjcyYS43NS43NSAwIDAwLTEuMDYtMS4wNkwxMCA4Ljk0IDguMjggNy4yMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXJlZC04MDBcIj5UaGVyZSB3YXMgYW4gaXNzdWUgc2F2aW5nIHlvdXIgZGF0YXNvdXJjZS48L2gzPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LXNtIHRleHQtcmVkLTcwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIHJvbGU9XCJsaXN0XCIgY2xhc3M9XCJsaXN0LWRpc2Mgc3BhY2UteS0xIHBsLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+e3tlcnJvck1lc3NhZ2V9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibWItMFwiIFsobmdNb2RlbCldPVwiYWR2YW5jZWRTZXR0aW5ncy5zaG93QXV0b0luY3JlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkdmFuY2VkU2V0dGluZ3MucHJpbWFyeUtleXMubGVuZ3RoXCI+XG4gICAgICAgICAgICBTaG93IEF1dG8gSW5jcmVtZW50IENvbHVtblxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgdGV4dC1ncmF5LTUwMCBtYi04XCI+QnkgZGVmYXVsdCwgZGF0YXNvdXJjZXMgYXJlIGNyZWF0ZWQgd2l0aCBhbiBhdXRvIGluY3JlbWVudCBJRCBwcmltYXJ5XG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICAgIGNvbHVtbi4gU2hvdyB0aGlzIGNvbHVtbiB1c2luZyB0aGUgdG9nZ2xlIGFib3ZlLlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aHI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtYmFzZSBtdC02XCI+Q3JlYXRlIGN1c3RvbSBwcmltYXJ5IGtleTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ncmF5LTUwMCB0ZXh0LXNtIG1iLTZcIj5EcmFnIGNvbHVtbihzKSB0byBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhpcyBkYXRhc291cmNlPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5BdmFpbGFibGUgQ29sdW1uczwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgICAgICAjY29sdW1uTGlzdD1cImNka0Ryb3BMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiW3BrTGlzdF1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWJveFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbHVtbnNcIiBjZGtEcmFnPnt7IGl0ZW0udGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5QcmltYXJ5IEtleShzKTwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgICAgICAjcGtMaXN0PVwiY2RrRHJvcExpc3RcIlxuICAgICAgICAgICAgICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cImFkdmFuY2VkU2V0dGluZ3MucHJpbWFyeUtleXNcIlxuICAgICAgICAgICAgICAgICAgICBbY2RrRHJvcExpc3RDb25uZWN0ZWRUb109XCJbY29sdW1uTGlzdF1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWJveFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkdmFuY2VkU2V0dGluZ3MucHJpbWFyeUtleXNcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aHI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtYmFzZSBtdC02XCI+RGF0YXNvdXJjZSBJbmRleGVzPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNTAwIHRleHQtc20gbWItNlwiPlNlbGVjdCB0aGUgY29sdW1ucyB0byBiZSBpbmRleGVkIGFuZCBkcmFnIHRvIHJlb3JkZXIgaWYgcmVxdWlyZWQuPC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1hSW5kZXggW25nRm9yT2ZdPVwiYWR2YW5jZWRTZXR0aW5ncy5pbmRleGVzXCIgbGV0LWk9aW5kZXg+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gcC0zIG1iLTMgYmctZ3JheS01MFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5BdmFpbGFibGUgQ29sdW1uczwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiYUluZGV4LmluZGV4Q29sc1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUluZGV4ZXMoYUluZGV4KVwiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMyXCIgW3ZhbHVlXT1cImNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sdW1uLnRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+SW5kZXhlczwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BJbmRleCgkZXZlbnQsIGFJbmRleC5maWVsZE5hbWVzKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtYm94XCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYUluZGV4LmZpZWxkTmFtZXNcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFJbmRleC5pbmRleENvbHMubGVuZ3RoID8gXy5maW5kKGFJbmRleC5pbmRleENvbHMsIHtuYW1lOiBpdGVtfSk/LnRpdGxlIDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwid2FyblwiIGNsYXNzPVwic2VsZi1jZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZHZhbmNlZFNldHRpbmdzLmluZGV4ZXMuc3BsaWNlKGksIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZW1vdmVfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZHZhbmNlZFNldHRpbmdzLmluZGV4ZXMucHVzaCh7ZmllbGROYW1lczogW119KVwiPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBhZGRpdGlvbmFsIGluZGV4XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ2hhbmdlcygpXCI+U2F2ZSBDaGFuZ2VzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG48L2Rpdj5cblxuXG4iXX0=
|
package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Input } from '@angular/core';
|
|
2
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
5
|
-
import * as i2 from "../../../../services/datasource.service";
|
|
6
|
-
import * as i3 from "@angular/material/legacy-snack-bar";
|
|
7
|
-
import * as i4 from "@angular/common/http";
|
|
8
|
-
import * as i5 from "@angular/common";
|
|
9
|
-
import * as i6 from "@angular/material/legacy-button";
|
|
10
|
-
import * as i7 from "@angular/material/icon";
|
|
11
|
-
import * as i8 from "@angular/cdk/drag-drop";
|
|
12
|
-
import * as i9 from "@angular/forms";
|
|
13
|
-
import * as i10 from "@angular/cdk/clipboard";
|
|
14
|
-
export class ApiAccessComponent {
|
|
15
|
-
constructor(dialogRef, data, datasourceService, snackBar, http) {
|
|
16
|
-
this.dialogRef = dialogRef;
|
|
17
|
-
this.data = data;
|
|
18
|
-
this.datasourceService = datasourceService;
|
|
19
|
-
this.snackBar = snackBar;
|
|
20
|
-
this.http = http;
|
|
21
|
-
this.listQueryString = '';
|
|
22
|
-
this.showExample = false;
|
|
23
|
-
}
|
|
24
|
-
async ngOnInit() {
|
|
25
|
-
this.backendURL = this.data.backendURL;
|
|
26
|
-
this.datasourceUpdate = this.data.datasourceUpdate;
|
|
27
|
-
this.datasourceInstanceKey = this.data.datasourceInstanceKey;
|
|
28
|
-
this.columns = this.data.columns;
|
|
29
|
-
this.showExample = !!this.datasourceUpdate.instanceImportKey;
|
|
30
|
-
const example = ['[{'];
|
|
31
|
-
this.columns.forEach((column, index) => {
|
|
32
|
-
if (column.type !== 'id') {
|
|
33
|
-
example.push('<span class="text-cta">"' + column.name + '":</span> ' + this.getColumnTypeDisplayString(column.type));
|
|
34
|
-
if (index !== this.columns.length - 1) {
|
|
35
|
-
example.push(', ');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
this.listQueryString += column.name + '_eq=VALUE&';
|
|
39
|
-
if (index == this.columns.length - 1)
|
|
40
|
-
this.listQueryString += 'query=' + column.name + '+isnotnull&sort=' + column.name + '|desc';
|
|
41
|
-
});
|
|
42
|
-
example.push('}]');
|
|
43
|
-
this.createExample = example.join('');
|
|
44
|
-
const update = ['[{'];
|
|
45
|
-
this.columns.forEach((column, index) => {
|
|
46
|
-
update.push('<span class="text-cta">"' + column.name + '":</span> ' + this.getColumnTypeDisplayString(column.type));
|
|
47
|
-
if (index !== this.columns.length - 1) {
|
|
48
|
-
update.push(', ');
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
update.push('}]');
|
|
52
|
-
this.updateExample = update.join('');
|
|
53
|
-
const deleteString = ['[{'];
|
|
54
|
-
this.columns.forEach((column, index) => {
|
|
55
|
-
if (column.type === 'id' || column.keyField) {
|
|
56
|
-
if (index > 0) {
|
|
57
|
-
deleteString.push(', ');
|
|
58
|
-
}
|
|
59
|
-
deleteString.push('<span class="text-cta">"' + column.name + '":</span> ' + this.getColumnTypeDisplayString(column.type));
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
deleteString.push('}]');
|
|
63
|
-
this.deleteExample = deleteString.join('');
|
|
64
|
-
const deleteFiltered = ['[{'];
|
|
65
|
-
if (this.columns.length > 0) {
|
|
66
|
-
deleteFiltered.push('<span class="text-cta">"column":</span> "' + this.columns[0].name + '", <span class="text-cta">"value:</span> "25", <span class="text-cta">"matchType:</span> "eq"');
|
|
67
|
-
}
|
|
68
|
-
deleteFiltered.push('}]');
|
|
69
|
-
this.deleteFilteredExample = deleteFiltered.join('');
|
|
70
|
-
this.apiKeys = await this.http.get('/account/apikey/first/customdatasourceupdate').toPromise();
|
|
71
|
-
}
|
|
72
|
-
getColumnTypeDisplayString(columnType) {
|
|
73
|
-
let exampleValue = null;
|
|
74
|
-
switch (columnType) {
|
|
75
|
-
case "integer":
|
|
76
|
-
exampleValue = 10;
|
|
77
|
-
break;
|
|
78
|
-
case "id":
|
|
79
|
-
exampleValue = 1;
|
|
80
|
-
break;
|
|
81
|
-
case "float":
|
|
82
|
-
exampleValue = "1.5";
|
|
83
|
-
break;
|
|
84
|
-
case "date":
|
|
85
|
-
exampleValue = "2025-01-01";
|
|
86
|
-
break;
|
|
87
|
-
case "datetime":
|
|
88
|
-
exampleValue = "2025-01-01 10:00:00";
|
|
89
|
-
break;
|
|
90
|
-
case "boolean":
|
|
91
|
-
exampleValue = "true";
|
|
92
|
-
break;
|
|
93
|
-
default:
|
|
94
|
-
exampleValue = "string value";
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
return columnType === "id" || columnType === "integer" || columnType === "float" || columnType === "boolean" ? exampleValue : '"' + exampleValue + '"';
|
|
98
|
-
}
|
|
99
|
-
copied() {
|
|
100
|
-
this.snackBar.open('Copied to Clipboard', null, {
|
|
101
|
-
duration: 2000,
|
|
102
|
-
verticalPosition: 'top'
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
async saveApiAccess() {
|
|
106
|
-
await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, {
|
|
107
|
-
title: this.datasourceUpdate.title,
|
|
108
|
-
importKey: this.datasourceUpdate.instanceImportKey,
|
|
109
|
-
fields: this.datasourceUpdate.fields,
|
|
110
|
-
adds: [],
|
|
111
|
-
updates: [],
|
|
112
|
-
deletes: [],
|
|
113
|
-
replaces: []
|
|
114
|
-
});
|
|
115
|
-
if (this.showExample) {
|
|
116
|
-
this.dialogRef.close();
|
|
117
|
-
}
|
|
118
|
-
this.showExample = !!this.datasourceUpdate.instanceImportKey;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
ApiAccessComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiAccessComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DatasourceService }, { token: i3.MatLegacySnackBar }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
-
ApiAccessComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ApiAccessComponent, selector: "ki-api-access", inputs: { apiKeys: "apiKeys" }, host: { classAttribute: "dialog-wrapper" }, ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>API Access</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Import Key\n </div>\n\n <div class=\"mb-4\">\n <input class=\"mt-2 w-full\" type=\"text\" [(ngModel)]=\"datasourceUpdate.instanceImportKey\"\n placeholder=\"Enter import key\">\n <small class=\"font-normal\">This will be used as part of the API request</small>\n </div>\n\n <ng-template [ngIf]=\"showExample\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Example API Usage\n </div>\n\n <div class=\"relative w-full mb-8\">\n <div class=\"text-base font-semibold\">List</div>\n <div class=\"text-sm mb-2\">\n Return the data for this datasource.\n <br><br>\n Filtering of the returned data can be effected by supplying parameters of the format <b>FIELD_MATCHTYPE</b>\n where FIELD matches one of\n the field names defined in the data source and MATCHTYPE should be one of the following values.\n <br><br>\n <table>\n <tr>\n <th>Match Type</th>\n <th>Description</th>\n <th>Example</th>\n </tr>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n <td>id_eq=3</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n <td>id_neq=7</td>\n </tr>\n <tr>\n <td>isnull</td>\n <td>for a null match</td>\n <td>id_isnull=1</td>\n </tr>\n <tr>\n <td>isnotnull</td>\n <td>for a not null match</td>\n <td>id_isnotnull=1</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n <td>id_gt=1</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n <td>id_lt=1</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n <td>id_gte=1</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n <td>id_lte=10</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n <td>name_startswith=app</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n <td>name_endswith=app</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>for a string contains match</td>\n <td>name_contains=app</td>\n </tr>\n <tr>\n <td>like</td>\n <td>for a wildcard or regular expression match. Simple wildcards can be supplied using * for\n one or more characters. Regular expressions\n can be supplied by surrounding the value with / delimiters.\n </td>\n <td>name_like=ap*, name_like=/^ap.*le$/</td>\n </tr>\n <tr>\n <td>in</td>\n <td>for where the value is one of a list supplied in comma separated format</td>\n <td>name_in=\"apple,pear,banana\"</td>\n </tr>\n <tr>\n <td>notin</td>\n <td>for where the value is not one of a list supplied in comma separated format</td>\n <td>name_notin=\"apple,pear,banana\"</td>\n </tr>\n </table>\n <br><br>\n Alternatively, advanced queries can be supplied using the built in Data Query Language passed as a <b>query</b> parameter which should be suitable URL encoded.\n <br><br>\n e.g. <code>query=((id >= 5 && name like 'app*') || id < 3)</code>\n <br><br>\n Results can be sorted by supplying a <b>sort</b> parameter which identifies columns to sort and\n directions (either asc or desc) using pipe separation\n <br><br>\n By default the first 100 rows will be returned. Paging can be achieved by supplying\n <b>limit</b> and <b>offset</b> parameters.\n </div>\n <div #list class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>GET</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}?{{listQueryString}}\n &limit=50&offset=10</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"list.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Create</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Replace</div>\n <div class=\"text-sm mb-2\">\n Replace a set of rows to the data source identified by the passed import key. This will perform\n an insert or update depending on whether the row already exists according to the unique key.\n </div>\n <div #replace class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PATCH</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"replace.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Update</div>\n <div class=\"text-sm mb-2\">\n Update a set of rows to the data source identified by the passed import key. This will perform\n an update based upon the unique key and will not add any new rows if they don't already exist.\n </div>\n <div #update class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PUT</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"update.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows explicitly by unique key for the data source identified by the passed import\n key.\n </div>\n <div #delete class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"delete.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteExample\">\n </pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Filtered Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows using one or more filter expressions additively to identify the rows for\n deletion for the data source identified by the passed import key.\n <br><br>\n Filters are supplied as objects containing a column name supplied as the <b>column</b> property, a\n match value supplied as the <b>value</b> property and a match type supplied as\n the <b>matchType</b> property.\n <br><br>\n Possible values for the <b>matchType</b> are:<br><br>\n <table>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n </tr>\n <tr>\n <td>null</td>\n <td>for a null match</td>\n </tr>\n <tr>\n <td>notnull</td>\n <td>for a not null match</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>or a string contains match</td>\n </tr>\n </table>\n\n\n </div>\n <div #deleteFiltered class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/filtered/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"deleteFiltered.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteFilteredExample\"></pre>\n </div>\n\n\n </ng-template>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveApiAccess()\">Save</button>\n </div>\n\n</div>\n\n\n", styles: [""], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }] });
|
|
123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiAccessComponent, decorators: [{
|
|
124
|
-
type: Component,
|
|
125
|
-
args: [{ selector: 'ki-api-access', host: { class: 'dialog-wrapper' }, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>API Access</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Import Key\n </div>\n\n <div class=\"mb-4\">\n <input class=\"mt-2 w-full\" type=\"text\" [(ngModel)]=\"datasourceUpdate.instanceImportKey\"\n placeholder=\"Enter import key\">\n <small class=\"font-normal\">This will be used as part of the API request</small>\n </div>\n\n <ng-template [ngIf]=\"showExample\">\n\n <div class=\"text-lg font-semibold mb-4\">\n Example API Usage\n </div>\n\n <div class=\"relative w-full mb-8\">\n <div class=\"text-base font-semibold\">List</div>\n <div class=\"text-sm mb-2\">\n Return the data for this datasource.\n <br><br>\n Filtering of the returned data can be effected by supplying parameters of the format <b>FIELD_MATCHTYPE</b>\n where FIELD matches one of\n the field names defined in the data source and MATCHTYPE should be one of the following values.\n <br><br>\n <table>\n <tr>\n <th>Match Type</th>\n <th>Description</th>\n <th>Example</th>\n </tr>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n <td>id_eq=3</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n <td>id_neq=7</td>\n </tr>\n <tr>\n <td>isnull</td>\n <td>for a null match</td>\n <td>id_isnull=1</td>\n </tr>\n <tr>\n <td>isnotnull</td>\n <td>for a not null match</td>\n <td>id_isnotnull=1</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n <td>id_gt=1</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n <td>id_lt=1</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n <td>id_gte=1</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n <td>id_lte=10</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n <td>name_startswith=app</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n <td>name_endswith=app</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>for a string contains match</td>\n <td>name_contains=app</td>\n </tr>\n <tr>\n <td>like</td>\n <td>for a wildcard or regular expression match. Simple wildcards can be supplied using * for\n one or more characters. Regular expressions\n can be supplied by surrounding the value with / delimiters.\n </td>\n <td>name_like=ap*, name_like=/^ap.*le$/</td>\n </tr>\n <tr>\n <td>in</td>\n <td>for where the value is one of a list supplied in comma separated format</td>\n <td>name_in=\"apple,pear,banana\"</td>\n </tr>\n <tr>\n <td>notin</td>\n <td>for where the value is not one of a list supplied in comma separated format</td>\n <td>name_notin=\"apple,pear,banana\"</td>\n </tr>\n </table>\n <br><br>\n Alternatively, advanced queries can be supplied using the built in Data Query Language passed as a <b>query</b> parameter which should be suitable URL encoded.\n <br><br>\n e.g. <code>query=((id >= 5 && name like 'app*') || id < 3)</code>\n <br><br>\n Results can be sorted by supplying a <b>sort</b> parameter which identifies columns to sort and\n directions (either asc or desc) using pipe separation\n <br><br>\n By default the first 100 rows will be returned. Paging can be achieved by supplying\n <b>limit</b> and <b>offset</b> parameters.\n </div>\n <div #list class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>GET</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}?{{listQueryString}}\n &limit=50&offset=10</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"list.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Create</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\" bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Replace</div>\n <div class=\"text-sm mb-2\">\n Replace a set of rows to the data source identified by the passed import key. This will perform\n an insert or update depending on whether the row already exists according to the unique key.\n </div>\n <div #replace class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PATCH</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"replace.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Update</div>\n <div class=\"text-sm mb-2\">\n Update a set of rows to the data source identified by the passed import key. This will perform\n an update based upon the unique key and will not add any new rows if they don't already exist.\n </div>\n <div #update class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>PUT</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"update.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"updateExample\"></pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows explicitly by unique key for the data source identified by the passed import\n key.\n </div>\n <div #delete class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"delete.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteExample\">\n </pre>\n </div>\n\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Filtered Delete</div>\n <div class=\"text-sm mb-2\">\n Delete a set of rows using one or more filter expressions additively to identify the rows for\n deletion for the data source identified by the passed import key.\n <br><br>\n Filters are supplied as objects containing a column name supplied as the <b>column</b> property, a\n match value supplied as the <b>value</b> property and a match type supplied as\n the <b>matchType</b> property.\n <br><br>\n Possible values for the <b>matchType</b> are:<br><br>\n <table>\n <tr>\n <td>eq</td>\n <td>for an equals match</td>\n </tr>\n <tr>\n <td>neq</td>\n <td>for a not equals match</td>\n </tr>\n <tr>\n <td>null</td>\n <td>for a null match</td>\n </tr>\n <tr>\n <td>notnull</td>\n <td>for a not null match</td>\n </tr>\n <tr>\n <td>gt</td>\n <td>for a greater than match</td>\n </tr>\n <tr>\n <td>lt</td>\n <td>for a less than match</td>\n </tr>\n <tr>\n <td>gte</td>\n <td>for a greater than or equals match</td>\n </tr>\n <tr>\n <td>lte</td>\n <td>for a less than or equals match</td>\n </tr>\n <tr>\n <td>startswith</td>\n <td>for a string starts with match</td>\n </tr>\n <tr>\n <td>endswith</td>\n <td>for a string ends with match</td>\n </tr>\n <tr>\n <td>contains</td>\n <td>or a string contains match</td>\n </tr>\n </table>\n\n\n </div>\n <div #deleteFiltered class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4\">\n <pre class=\"whitespace-normal\">curl -H <span\n class=\"text-cta\">\"API-KEY:<b>{{apiKeys ? apiKeys.apiKey : '[[apiKey]]'}}</b>\"</span> -H <span\n class=\"text-cta\">\"API-SECRET:<b>{{apiKeys ? apiKeys.apiSecret : '[[apiSecret]]'}}</b>\"</span></pre>\n <pre class=\"whitespace-normal\"> -X <b>DELETE</b> <span class=\"text-cta\">{{backendURL}}\n /api/tabularData/filtered/{{datasourceUpdate.instanceImportKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"deleteFiltered.textContent\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-4 mb-8\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"deleteFilteredExample\"></pre>\n </div>\n\n\n </ng-template>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveApiAccess()\">Save</button>\n </div>\n\n</div>\n\n\n" }]
|
|
126
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
127
|
-
type: Inject,
|
|
128
|
-
args: [MAT_DIALOG_DATA]
|
|
129
|
-
}] }, { type: i2.DatasourceService }, { type: i3.MatLegacySnackBar }, { type: i4.HttpClient }]; }, propDecorators: { apiKeys: [{
|
|
130
|
-
type: Input
|
|
131
|
-
}] } });
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWFjY2Vzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXNvdXJjZS9jcmVhdGUtZGF0YXNvdXJjZS9hcGktYWNjZXNzL2FwaS1hY2Nlc3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvYXBpLWFjY2Vzcy9hcGktYWNjZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQ0gsc0JBQXNCLElBQUksZUFBZSxFQUU1QyxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFXekMsTUFBTSxPQUFPLGtCQUFrQjtJQWUzQixZQUFtQixTQUEyQyxFQUNsQixJQUFTLEVBQ2pDLGlCQUFvQyxFQUNwQyxRQUFxQixFQUNyQixJQUFnQjtRQUpqQixjQUFTLEdBQVQsU0FBUyxDQUFrQztRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBWDdCLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBSzdCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO0lBTzNCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMs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QkFBZ0IsRUFBQzs7MEJBa0JsQixNQUFNOzJCQUFDLGVBQWU7cUlBZDFCLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSxcbiAgICBNYXRMZWdhY3lEaWFsb2dSZWYgYXMgTWF0RGlhbG9nUmVmXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHtEYXRhc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7TWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2ktYXBpLWFjY2VzcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FwaS1hY2Nlc3MuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FwaS1hY2Nlc3MuY29tcG9uZW50LnNhc3MnXSxcbiAgICBob3N0OiB7Y2xhc3M6ICdkaWFsb2ctd3JhcHBlcid9XG59KVxuZXhwb3J0IGNsYXNzIEFwaUFjY2Vzc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBhcGlLZXlzOiBhbnk7XG5cbiAgICBwdWJsaWMgYmFja2VuZFVSTDogc3RyaW5nO1xuICAgIHB1YmxpYyBkYXRhc291cmNlVXBkYXRlOiBhbnk7XG4gICAgcHVibGljIGRhdGFzb3VyY2VJbnN0YW5jZUtleTogYW55O1xuICAgIHB1YmxpYyBjb2x1bW5zOiBhbnk7XG4gICAgcHVibGljIGxpc3RRdWVyeVN0cmluZzogc3RyaW5nID0gJyc7XG4gICAgcHVibGljIGNyZWF0ZUV4YW1wbGU6IHN0cmluZztcbiAgICBwdWJsaWMgdXBkYXRlRXhhbXBsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZWxldGVFeGFtcGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcmVkRXhhbXBsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzaG93RXhhbXBsZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFwaUFjY2Vzc0NvbXBvbmVudD4sXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc291cmNlU2VydmljZTogRGF0YXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYmFja2VuZFVSTCA9IHRoaXMuZGF0YS5iYWNrZW5kVVJMO1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUgPSB0aGlzLmRhdGEuZGF0YXNvdXJjZVVwZGF0ZTtcbiAgICAgICAgdGhpcy5kYXRhc291cmNlSW5zdGFuY2VLZXkgPSB0aGlzLmRhdGEuZGF0YXNvdXJjZUluc3RhbmNlS2V5O1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGEuY29sdW1ucztcblxuICAgICAgICB0aGlzLnNob3dFeGFtcGxlID0gISF0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXk7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZSA9IFsnW3snXTtcblxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi50eXBlICE9PSAnaWQnKSB7XG4gICAgICAgICAgICAgICAgZXhhbXBsZS5wdXNoKCc8c3BhbiBjbGFzcz1cInRleHQtY3RhXCI+XCInICsgY29sdW1uLm5hbWUgKyAnXCI6PC9zcGFuPiAnICsgdGhpcy5nZXRDb2x1bW5UeXBlRGlzcGxheVN0cmluZyhjb2x1bW4udHlwZSkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhhbXBsZS5wdXNoKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGlzdFF1ZXJ5U3RyaW5nICs9IGNvbHVtbi5uYW1lICsgJ19lcT1WQUxVRSYnO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMuY29sdW1ucy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIHRoaXMubGlzdFF1ZXJ5U3RyaW5nICs9ICdxdWVyeT0nICsgY29sdW1uLm5hbWUgKyAnK2lzbm90bnVsbCZzb3J0PScgKyBjb2x1bW4ubmFtZSArICd8ZGVzYyc7XG4gICAgICAgIH0pO1xuICAgICAgICBleGFtcGxlLnB1c2goJ31dJyk7XG4gICAgICAgIHRoaXMuY3JlYXRlRXhhbXBsZSA9IGV4YW1wbGUuam9pbignJyk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlID0gWydbeyddO1xuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlLnB1c2goJzxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj5cIicgKyBjb2x1bW4ubmFtZSArICdcIjo8L3NwYW4+ICcgKyB0aGlzLmdldENvbHVtblR5cGVEaXNwbGF5U3RyaW5nKGNvbHVtbi50eXBlKSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHRoaXMuY29sdW1ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlLnB1c2goJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUucHVzaCgnfV0nKTtcbiAgICAgICAgdGhpcy51cGRhdGVFeGFtcGxlID0gdXBkYXRlLmpvaW4oJycpO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZVN0cmluZzogc3RyaW5nW10gPSBbJ1t7J107XG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdpZCcgfHwgY29sdW1uLmtleUZpZWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGVTdHJpbmcucHVzaCgnLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RyaW5nLnB1c2goJzxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj5cIicgKyBjb2x1bW4ubmFtZSArICdcIjo8L3NwYW4+ICcgKyB0aGlzLmdldENvbHVtblR5cGVEaXNwbGF5U3RyaW5nKGNvbHVtbi50eXBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbGV0ZVN0cmluZy5wdXNoKCd9XScpO1xuICAgICAgICB0aGlzLmRlbGV0ZUV4YW1wbGUgPSBkZWxldGVTdHJpbmcuam9pbignJyk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlRmlsdGVyZWQ6IHN0cmluZ1tdID0gWydbeyddO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZUZpbHRlcmVkLnB1c2goJzxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj5cImNvbHVtblwiOjwvc3Bhbj4gXCInICsgdGhpcy5jb2x1bW5zWzBdLm5hbWUgKyAnXCIsIDxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj5cInZhbHVlOjwvc3Bhbj4gXCIyNVwiLCA8c3BhbiBjbGFzcz1cInRleHQtY3RhXCI+XCJtYXRjaFR5cGU6PC9zcGFuPiBcImVxXCInKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVGaWx0ZXJlZC5wdXNoKCd9XScpO1xuICAgICAgICB0aGlzLmRlbGV0ZUZpbHRlcmVkRXhhbXBsZSA9IGRlbGV0ZUZpbHRlcmVkLmpvaW4oJycpO1xuXG4gICAgICAgIHRoaXMuYXBpS2V5cyA9IGF3YWl0IHRoaXMuaHR0cC5nZXQoJy9hY2NvdW50L2FwaWtleS9maXJzdC9jdXN0b21kYXRhc291cmNldXBkYXRlJykudG9Qcm9taXNlKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGdldENvbHVtblR5cGVEaXNwbGF5U3RyaW5nKGNvbHVtblR5cGUpIHtcbiAgICAgICAgbGV0IGV4YW1wbGVWYWx1ZSA9IG51bGw7XG4gICAgICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgICAgICBleGFtcGxlVmFsdWUgPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpZFwiOlxuICAgICAgICAgICAgICAgIGV4YW1wbGVWYWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgICAgICAgICAgICBleGFtcGxlVmFsdWUgPSBcIjEuNVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgICAgICAgICBleGFtcGxlVmFsdWU9IFwiMjAyNS0wMS0wMVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgICAgICAgICAgZXhhbXBsZVZhbHVlID0gXCIyMDI1LTAxLTAxIDEwOjAwOjAwXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICAgIGV4YW1wbGVWYWx1ZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBleGFtcGxlVmFsdWUgPSBcInN0cmluZyB2YWx1ZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5UeXBlID09PSBcImlkXCIgfHwgY29sdW1uVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHwgY29sdW1uVHlwZSA9PT0gXCJmbG9hdFwiIHx8IGNvbHVtblR5cGUgPT09IFwiYm9vbGVhblwiID8gZXhhbXBsZVZhbHVlIDogJ1wiJyArIGV4YW1wbGVWYWx1ZSArICdcIic7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcGllZCgpIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDb3BpZWQgdG8gQ2xpcGJvYXJkJywgbnVsbCwge1xuICAgICAgICAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZUFwaUFjY2VzcygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS51cGRhdGVDdXN0b21EYXRhc291cmNlKHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LCB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy5kYXRhc291cmNlVXBkYXRlLnRpdGxlLFxuICAgICAgICAgICAgaW1wb3J0S2V5OiB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXksXG4gICAgICAgICAgICBmaWVsZHM6IHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS5maWVsZHMsXG4gICAgICAgICAgICBhZGRzOiBbXSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IFtdLFxuICAgICAgICAgICAgZGVsZXRlczogW10sXG4gICAgICAgICAgICByZXBsYWNlczogW11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2hvd0V4YW1wbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dFeGFtcGxlID0gISF0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRpYWxvZ1wiIGNka0RyYWcgY2RrRHJhZ1Jvb3RFbGVtZW50PVwiLmNkay1vdmVybGF5LXBhbmVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT5BUEkgQWNjZXNzPC9oMj5cblxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIG1iLTRcIj5cbiAgICAgICAgICAgIEltcG9ydCBLZXlcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm10LTIgdy1mdWxsXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImRhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXlcIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgaW1wb3J0IGtleVwiPlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZm9udC1ub3JtYWxcIj5UaGlzIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBBUEkgcmVxdWVzdDwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzaG93RXhhbXBsZVwiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIG1iLTRcIj5cbiAgICAgICAgICAgICAgICBFeGFtcGxlIEFQSSBVc2FnZVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgbWItOFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1zZW1pYm9sZFwiPkxpc3Q8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhpcyBkYXRhc291cmNlLlxuICAgICAgICAgICAgICAgICAgICA8YnI+PGJyPlxuICAgICAgICAgICAgICAgICAgICBGaWx0ZXJpbmcgb2YgdGhlIHJldHVybmVkIGRhdGEgY2FuIGJlIGVmZmVjdGVkIGJ5IHN1cHBseWluZyBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXQgPGI+RklFTERfTUFUQ0hUWVBFPC9iPlxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBGSUVMRCBtYXRjaGVzIG9uZSBvZlxuICAgICAgICAgICAgICAgICAgICB0aGUgZmllbGQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgZGF0YSBzb3VyY2UgYW5kIE1BVENIVFlQRSBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLlxuICAgICAgICAgICAgICAgICAgICA8YnI+PGJyPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk1hdGNoIFR5cGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkV4YW1wbGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ZXE8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYW4gZXF1YWxzIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aWRfZXE9MzwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5uZXE8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYSBub3QgZXF1YWxzIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aWRfbmVxPTc8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aXNudWxsPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgbnVsbCBtYXRjaDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmlkX2lzbnVsbD0xPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmlzbm90bnVsbDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIG5vdCBudWxsIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aWRfaXNub3RudWxsPTE8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Z3Q8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYSBncmVhdGVyIHRoYW4gbWF0Y2g8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5pZF9ndD0xPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmx0PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgbGVzcyB0aGFuIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aWRfbHQ9MTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5ndGU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+aWRfZ3RlPTE8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bHRlPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgbGVzcyB0aGFuIG9yIGVxdWFscyBtYXRjaDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmlkX2x0ZT0xMDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5zdGFydHN3aXRoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bmFtZV9zdGFydHN3aXRoPWFwcDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5lbmRzd2l0aDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIHN0cmluZyBlbmRzIHdpdGggbWF0Y2g8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5uYW1lX2VuZHN3aXRoPWFwcDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5jb250YWluczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIHN0cmluZyBjb250YWlucyBtYXRjaDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPm5hbWVfY29udGFpbnM9YXBwPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmxpa2U8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYSB3aWxkY2FyZCBvciByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2guIFNpbXBsZSB3aWxkY2FyZHMgY2FuIGJlIHN1cHBsaWVkIHVzaW5nICogZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMuIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHN1cHBsaWVkIGJ5IHN1cnJvdW5kaW5nIHRoZSB2YWx1ZSB3aXRoIC8gZGVsaW1pdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5uYW1lX2xpa2U9YXAqLCBuYW1lX2xpa2U9L15hcC4qbGUkLzwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5pbjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciB3aGVyZSB0aGUgdmFsdWUgaXMgb25lIG9mIGEgbGlzdCBzdXBwbGllZCBpbiBjb21tYSBzZXBhcmF0ZWQgZm9ybWF0PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bmFtZV9pbj1cImFwcGxlLHBlYXIsYmFuYW5hXCI8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bm90aW48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3Igd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCBvbmUgb2YgYSBsaXN0IHN1cHBsaWVkIGluIGNvbW1hIHNlcGFyYXRlZCBmb3JtYXQ8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5uYW1lX25vdGluPVwiYXBwbGUscGVhcixiYW5hbmFcIjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8YnI+PGJyPlxuICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCBhZHZhbmNlZCBxdWVyaWVzIGNhbiBiZSBzdXBwbGllZCB1c2luZyB0aGUgYnVpbHQgaW4gRGF0YSBRdWVyeSBMYW5ndWFnZSBwYXNzZWQgYXMgYSA8Yj5xdWVyeTwvYj4gcGFyYW1ldGVyIHdoaWNoIHNob3VsZCBiZSBzdWl0YWJsZSBVUkwgZW5jb2RlZC5cbiAgICAgICAgICAgICAgICAgICAgPGJyPjxicj5cbiAgICAgICAgICAgICAgICAgICAgZS5nLiAgPGNvZGU+cXVlcnk9KChpZCA+PSA1ICYmIG5hbWUgbGlrZSAnYXBwKicpIHx8IGlkIDwgMyk8L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgIDxicj48YnI+XG4gICAgICAgICAgICAgICAgICAgIFJlc3VsdHMgY2FuIGJlIHNvcnRlZCBieSBzdXBwbHlpbmcgYSA8Yj5zb3J0PC9iPiBwYXJhbWV0ZXIgd2hpY2ggaWRlbnRpZmllcyBjb2x1bW5zIHRvIHNvcnQgYW5kXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgKGVpdGhlciBhc2Mgb3IgZGVzYykgdXNpbmcgcGlwZSBzZXBhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIDxicj48YnI+XG4gICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgdGhlIGZpcnN0IDEwMCByb3dzIHdpbGwgYmUgcmV0dXJuZWQuIFBhZ2luZyBjYW4gYmUgYWNoaWV2ZWQgYnkgc3VwcGx5aW5nXG4gICAgICAgICAgICAgICAgICAgIDxiPmxpbWl0PC9iPiBhbmQgPGI+b2Zmc2V0PC9iPiBwYXJhbWV0ZXJzLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgI2xpc3QgY2xhc3M9XCIgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cIndoaXRlc3BhY2Utbm9ybWFsXCI+Y3VybCAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLUtFWTo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaUtleSA6ICdbW2FwaUtleV1dJ319PC9iPlwiPC9zcGFuPiAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLVNFQ1JFVDo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaVNlY3JldCA6ICdbW2FwaVNlY3JldF1dJ319PC9iPlwiPC9zcGFuPjwvcHJlPlxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIj4gLVggPGI+R0VUPC9iPiA8c3BhbiBjbGFzcz1cInRleHQtY3RhXCI+e3tiYWNrZW5kVVJMfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC9hcGkvdGFidWxhckRhdGEve3tkYXRhc291cmNlVXBkYXRlLmluc3RhbmNlSW1wb3J0S2V5fX0/e3tsaXN0UXVlcnlTdHJpbmd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0PTUwJm9mZnNldD0xMDwvc3Bhbj48L3ByZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImxpc3QudGV4dENvbnRlbnRcIiAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cImNvcGllZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13aGl0ZSBhYnNvbHV0ZSBib3R0b20tMCByaWdodC0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1zZW1pYm9sZFwiPkNyZWF0ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IGEgc2V0IG9mIG5ldyByb3dzIHRvIHRoZSBkYXRhIHNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXNzZWQgaW1wb3J0IGtleVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgI2NyZWF0ZSBjbGFzcz1cIiBiZy1ncmF5LTgwMCBib3JkZXItMiBib3JkZXItZ3JheS05MDAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIj5jdXJsIC1IIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY3RhXCI+XCJBUEktS0VZOjxiPnt7YXBpS2V5cyA/IGFwaUtleXMuYXBpS2V5IDogJ1tbYXBpS2V5XV0nfX08L2I+XCI8L3NwYW4+IC1IIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY3RhXCI+XCJBUEktU0VDUkVUOjxiPnt7YXBpS2V5cyA/IGFwaUtleXMuYXBpU2VjcmV0IDogJ1tbYXBpU2VjcmV0XV0nfX08L2I+XCI8L3NwYW4+PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiPiAtWCA8Yj5QT1NUPC9iPiA8c3BhbiBjbGFzcz1cInRleHQtY3RhXCI+e3tiYWNrZW5kVVJMfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC9hcGkvdGFidWxhckRhdGEve3tkYXRhc291cmNlVXBkYXRlLmluc3RhbmNlSW1wb3J0S2V5fX08L3NwYW4+PC9wcmU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2Nka0NvcHlUb0NsaXBib2FyZF09XCJjcmVhdGUudGV4dENvbnRlbnRcIiAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cImNvcGllZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13aGl0ZSBhYnNvbHV0ZSBib3R0b20tMCByaWdodC0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtc20gbXktMVwiPkV4YW1wbGUgUGF5bG9hZDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGJnLWdyYXktODAwIGJvcmRlci0yIGJvcmRlci1ncmF5LTkwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgcC00IG1iLThcIj5cbiAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIiBbaW5uZXJIVE1MXT1cImNyZWF0ZUV4YW1wbGVcIj48L3ByZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkXCI+UmVwbGFjZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBhIHNldCBvZiByb3dzIHRvIHRoZSBkYXRhIHNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXNzZWQgaW1wb3J0IGtleS4gVGhpcyB3aWxsIHBlcmZvcm1cbiAgICAgICAgICAgICAgICAgICAgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcm93IGFscmVhZHkgZXhpc3RzIGFjY29yZGluZyB0byB0aGUgdW5pcXVlIGtleS5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICNyZXBsYWNlIGNsYXNzPVwicmVsYXRpdmUgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cIndoaXRlc3BhY2Utbm9ybWFsXCI+Y3VybCAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLUtFWTo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaUtleSA6ICdbW2FwaUtleV1dJ319PC9iPlwiPC9zcGFuPiAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLVNFQ1JFVDo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaVNlY3JldCA6ICdbW2FwaVNlY3JldF1dJ319PC9iPlwiPC9zcGFuPjwvcHJlPlxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIj4gLVggPGI+UEFUQ0g8L2I+IDxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj57e2JhY2tlbmRVUkx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgL2FwaS90YWJ1bGFyRGF0YS97e2RhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXl9fTwvc3Bhbj48L3ByZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cInJlcGxhY2UudGV4dENvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXdoaXRlIGFic29sdXRlIGJvdHRvbS0wIHJpZ2h0LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtc20gbXktMVwiPkV4YW1wbGUgUGF5bG9hZDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGJnLWdyYXktODAwIGJvcmRlci0yIGJvcmRlci1ncmF5LTkwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgcC00IG1iLThcIj5cbiAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIiBbaW5uZXJIVE1MXT1cInVwZGF0ZUV4YW1wbGVcIj48L3ByZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkXCI+VXBkYXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICBVcGRhdGUgYSBzZXQgb2Ygcm93cyB0byB0aGUgZGF0YSBzb3VyY2UgaWRlbnRpZmllZCBieSB0aGUgcGFzc2VkIGltcG9ydCBrZXkuIFRoaXMgd2lsbCBwZXJmb3JtXG4gICAgICAgICAgICAgICAgICAgIGFuIHVwZGF0ZSBiYXNlZCB1cG9uIHRoZSB1bmlxdWUga2V5IGFuZCB3aWxsIG5vdCBhZGQgYW55IG5ldyByb3dzIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICN1cGRhdGUgY2xhc3M9XCJyZWxhdGl2ZSBiZy1ncmF5LTgwMCBib3JkZXItMiBib3JkZXItZ3JheS05MDAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIj5jdXJsIC1IIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY3RhXCI+XCJBUEktS0VZOjxiPnt7YXBpS2V5cyA/IGFwaUtleXMuYXBpS2V5IDogJ1tbYXBpS2V5XV0nfX08L2I+XCI8L3NwYW4+IC1IIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY3RhXCI+XCJBUEktU0VDUkVUOjxiPnt7YXBpS2V5cyA/IGFwaUtleXMuYXBpU2VjcmV0IDogJ1tbYXBpU2VjcmV0XV0nfX08L2I+XCI8L3NwYW4+PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiPiAtWCA8Yj5QVVQ8L2I+IDxzcGFuIGNsYXNzPVwidGV4dC1jdGFcIj57e2JhY2tlbmRVUkx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgL2FwaS90YWJ1bGFyRGF0YS97e2RhdGFzb3VyY2VVcGRhdGUuaW5zdGFuY2VJbXBvcnRLZXl9fTwvc3Bhbj48L3ByZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cInVwZGF0ZS50ZXh0Q29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtd2hpdGUgYWJzb2x1dGUgYm90dG9tLTAgcmlnaHQtMFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBteS0xXCI+RXhhbXBsZSBQYXlsb2FkPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTQgbWItOFwiPlxuICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiIFtpbm5lckhUTUxdPVwidXBkYXRlRXhhbXBsZVwiPjwvcHJlPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtc2VtaWJvbGRcIj5EZWxldGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZSBhIHNldCBvZiByb3dzIGV4cGxpY2l0bHkgYnkgdW5pcXVlIGtleSBmb3IgdGhlIGRhdGEgc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIHBhc3NlZCBpbXBvcnRcbiAgICAgICAgICAgICAgICAgICAga2V5LlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgI2RlbGV0ZSBjbGFzcz1cInJlbGF0aXZlIGJnLWdyYXktODAwIGJvcmRlci0yIGJvcmRlci1ncmF5LTkwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgcC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiPmN1cmwgLUggPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jdGFcIj5cIkFQSS1LRVk6PGI+e3thcGlLZXlzID8gYXBpS2V5cy5hcGlLZXkgOiAnW1thcGlLZXldXSd9fTwvYj5cIjwvc3Bhbj4gLUggPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jdGFcIj5cIkFQSS1TRUNSRVQ6PGI+e3thcGlLZXlzID8gYXBpS2V5cy5hcGlTZWNyZXQgOiAnW1thcGlTZWNyZXRdXSd9fTwvYj5cIjwvc3Bhbj48L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cIndoaXRlc3BhY2Utbm9ybWFsXCI+IC1YIDxiPkRFTEVURTwvYj4gPHNwYW4gY2xhc3M9XCJ0ZXh0LWN0YVwiPnt7YmFja2VuZFVSTH19XG4gICAgICAgICAgICAgICAgICAgICAgICAvYXBpL3RhYnVsYXJEYXRhL3t7ZGF0YXNvdXJjZVVwZGF0ZS5pbnN0YW5jZUltcG9ydEtleX19PC9zcGFuPjwvcHJlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFtjZGtDb3B5VG9DbGlwYm9hcmRdPVwiZGVsZXRlLnRleHRDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13aGl0ZSBhYnNvbHV0ZSBib3R0b20tMCByaWdodC0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG15LTFcIj5FeGFtcGxlIFBheWxvYWQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBiZy1ncmF5LTgwMCBib3JkZXItMiBib3JkZXItZ3JheS05MDAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHAtNCBtYi04XCI+XG4gICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIiBbaW5uZXJIVE1MXT1cImRlbGV0ZUV4YW1wbGVcIj5cbiAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtc2VtaWJvbGRcIj5GaWx0ZXJlZCBEZWxldGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZSBhIHNldCBvZiByb3dzIHVzaW5nIG9uZSBvciBtb3JlIGZpbHRlciBleHByZXNzaW9ucyBhZGRpdGl2ZWx5IHRvIGlkZW50aWZ5IHRoZSByb3dzIGZvclxuICAgICAgICAgICAgICAgICAgICBkZWxldGlvbiBmb3IgdGhlIGRhdGEgc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIHBhc3NlZCBpbXBvcnQga2V5LlxuICAgICAgICAgICAgICAgICAgICA8YnI+PGJyPlxuICAgICAgICAgICAgICAgICAgICBGaWx0ZXJzIGFyZSBzdXBwbGllZCBhcyBvYmplY3RzIGNvbnRhaW5pbmcgYSBjb2x1bW4gbmFtZSBzdXBwbGllZCBhcyB0aGUgPGI+Y29sdW1uPC9iPiBwcm9wZXJ0eSwgYVxuICAgICAgICAgICAgICAgICAgICBtYXRjaCB2YWx1ZSBzdXBwbGllZCBhcyB0aGUgPGI+dmFsdWU8L2I+IHByb3BlcnR5IGFuZCBhIG1hdGNoIHR5cGUgc3VwcGxpZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgdGhlIDxiPm1hdGNoVHlwZTwvYj4gcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICAgIDxicj48YnI+XG4gICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIDxiPm1hdGNoVHlwZTwvYj4gYXJlOjxicj48YnI+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ZXE8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5mb3IgYW4gZXF1YWxzIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPm5lcTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIG5vdCBlcXVhbHMgbWF0Y2g8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bnVsbDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIG51bGwgbWF0Y2g8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bm90bnVsbDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIG5vdCBudWxsIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmd0PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgZ3JlYXRlciB0aGFuIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmx0PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgbGVzcyB0aGFuIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmd0ZTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZvciBhIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgbWF0Y2g8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+bHRlPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgbGVzcyB0aGFuIG9yIGVxdWFscyBtYXRjaDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5zdGFydHN3aXRoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmVuZHN3aXRoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Zm9yIGEgc3RyaW5nIGVuZHMgd2l0aCBtYXRjaDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5jb250YWluczwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPm9yIGEgc3RyaW5nIGNvbnRhaW5zIG1hdGNoPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgI2RlbGV0ZUZpbHRlcmVkIGNsYXNzPVwicmVsYXRpdmUgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cIndoaXRlc3BhY2Utbm9ybWFsXCI+Y3VybCAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLUtFWTo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaUtleSA6ICdbW2FwaUtleV1dJ319PC9iPlwiPC9zcGFuPiAtSCA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWN0YVwiPlwiQVBJLVNFQ1JFVDo8Yj57e2FwaUtleXMgPyBhcGlLZXlzLmFwaVNlY3JldCA6ICdbW2FwaVNlY3JldF1dJ319PC9iPlwiPC9zcGFuPjwvcHJlPlxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1ub3JtYWxcIj4gLVggPGI+REVMRVRFPC9iPiA8c3BhbiBjbGFzcz1cInRleHQtY3RhXCI+e3tiYWNrZW5kVVJMfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC9hcGkvdGFidWxhckRhdGEvZmlsdGVyZWQve3tkYXRhc291cmNlVXBkYXRlLmluc3RhbmNlSW1wb3J0S2V5fX08L3NwYW4+PC9wcmU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2Nka0NvcHlUb0NsaXBib2FyZF09XCJkZWxldGVGaWx0ZXJlZC50ZXh0Q29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtd2hpdGUgYWJzb2x1dGUgYm90dG9tLTAgcmlnaHQtMFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBteS0xXCI+RXhhbXBsZSBQYXlsb2FkPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTQgbWItOFwiPlxuICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiIFtpbm5lckhUTUxdPVwiZGVsZXRlRmlsdGVyZWRFeGFtcGxlXCI+PC9wcmU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBtYXQtc3Ryb2tlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzYXZlQXBpQWNjZXNzKClcIj5TYXZlPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbiJdfQ==
|