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,190 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, ViewChild } from '@angular/core';
|
|
2
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
3
|
-
import * as lodash from 'lodash';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
6
|
-
import * as i2 from "../../../services/dataset.service";
|
|
7
|
-
import * as i3 from "../../../services/data-processor.service";
|
|
8
|
-
import * as i4 from "@angular/common";
|
|
9
|
-
import * as i5 from "@angular/material/legacy-button";
|
|
10
|
-
import * as i6 from "@angular/material/icon";
|
|
11
|
-
import * as i7 from "@angular/cdk/drag-drop";
|
|
12
|
-
import * as i8 from "@angular/forms";
|
|
13
|
-
import * as i9 from "@angular/material/legacy-select";
|
|
14
|
-
import * as i10 from "@angular/material/legacy-core";
|
|
15
|
-
import * as i11 from "@angular/material/legacy-slide-toggle";
|
|
16
|
-
import * as i12 from "@angular/material/legacy-checkbox";
|
|
17
|
-
import * as i13 from "@angular/material/legacy-radio";
|
|
18
|
-
import * as i14 from "../../task-time-periods/task-time-periods.component";
|
|
19
|
-
const _ = lodash.default;
|
|
20
|
-
export class SnapshotProfileDialogComponent {
|
|
21
|
-
constructor(dialogRef, data, datasetService, dataProcessorService) {
|
|
22
|
-
this.dialogRef = dialogRef;
|
|
23
|
-
this.data = data;
|
|
24
|
-
this.datasetService = datasetService;
|
|
25
|
-
this.dataProcessorService = dataProcessorService;
|
|
26
|
-
this.columns = [];
|
|
27
|
-
this._ = _;
|
|
28
|
-
this.defaultOffsets = [
|
|
29
|
-
{
|
|
30
|
-
label: '1 Day Ago',
|
|
31
|
-
value: 1
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
label: '7 Days Ago',
|
|
35
|
-
value: 7
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
label: '30 Days Ago',
|
|
39
|
-
value: 30
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
label: '90 Days Ago',
|
|
43
|
-
value: 90
|
|
44
|
-
}
|
|
45
|
-
];
|
|
46
|
-
this.allSelected = false;
|
|
47
|
-
this.parameters = [];
|
|
48
|
-
this.Object = Object;
|
|
49
|
-
}
|
|
50
|
-
async ngOnInit() {
|
|
51
|
-
this.columns = this.data.columns || [];
|
|
52
|
-
this.snapshot = this.data.snapshot || {
|
|
53
|
-
type: 'tabulardatasetsnapshot',
|
|
54
|
-
taskTimePeriods: [],
|
|
55
|
-
trigger: 'scheduled',
|
|
56
|
-
config: {
|
|
57
|
-
keyFieldNames: [],
|
|
58
|
-
timeLapsedFields: [],
|
|
59
|
-
createHistory: true,
|
|
60
|
-
createLatest: true,
|
|
61
|
-
indexes: [],
|
|
62
|
-
parameterValues: {},
|
|
63
|
-
readChunkSize: 50000
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
if (!this.snapshot.config.indexes) {
|
|
67
|
-
this.snapshot.config.indexes = [];
|
|
68
|
-
}
|
|
69
|
-
if (!this.snapshot.config.parameterValues || Array.isArray(this.snapshot.config.parameterValues)) {
|
|
70
|
-
this.snapshot.config.parameterValues = {};
|
|
71
|
-
}
|
|
72
|
-
this.datasetInstanceId = this.data.datasetInstanceId || null;
|
|
73
|
-
this.snapshot.relatedObjectType = 'DatasetInstance';
|
|
74
|
-
this.snapshot.relatedObjectPrimaryKey = this.datasetInstanceId;
|
|
75
|
-
if (this.data.datasetInstance) {
|
|
76
|
-
this.parameters = await this.datasetService.getEvaluatedParameters(this.data.datasetInstance);
|
|
77
|
-
_.forEach(this.parameters, parameter => {
|
|
78
|
-
if (parameter.type === 'list') {
|
|
79
|
-
this.loadListParameters(parameter);
|
|
80
|
-
}
|
|
81
|
-
this.snapshot.config.parameterValues[parameter.name] = (this.snapshot.config.parameterValues[parameter.name] || parameter.defaultValue) || '';
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
if (!this.columns.length && this.datasetInstanceId) {
|
|
85
|
-
const dataset = await this.datasetService.getDataset(this.datasetInstanceId);
|
|
86
|
-
const res = await this.datasetService.evaluateDataset(dataset);
|
|
87
|
-
this.columns = res.columns;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async loadListParameters(parameter) {
|
|
91
|
-
if (parameter.settings && parameter.settings.datasetInstance) {
|
|
92
|
-
return this.datasetService.evaluateDataset(parameter.settings.datasetInstance, '0', '100000')
|
|
93
|
-
.then((data) => {
|
|
94
|
-
const list = _.map(data.allData, item => {
|
|
95
|
-
return { label: item[parameter.settings.labelColumn], value: item[parameter.settings.valueColumn] };
|
|
96
|
-
});
|
|
97
|
-
parameter.list = _.uniqWith(list, _.isEqual);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
removeIndex(index) {
|
|
102
|
-
const message = 'Are you sure you would like to remove this Index?';
|
|
103
|
-
if (window.confirm(message)) {
|
|
104
|
-
this.snapshot.config.indexes.splice(index, 1);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
selectAll(event) {
|
|
108
|
-
event.preventDefault();
|
|
109
|
-
this.allSelected = !this.allSelected;
|
|
110
|
-
this.toggleAllSelection();
|
|
111
|
-
}
|
|
112
|
-
toggleAllSelection() {
|
|
113
|
-
if (this.allSelected) {
|
|
114
|
-
this.selectKeyFields.options.forEach((item) => item.select());
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this.selectKeyFields.options.forEach((item) => item.deselect());
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
keyFieldClick() {
|
|
121
|
-
let newStatus = true;
|
|
122
|
-
this.selectKeyFields.options.forEach((item) => {
|
|
123
|
-
if (!item.selected) {
|
|
124
|
-
newStatus = false;
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
this.allSelected = newStatus;
|
|
128
|
-
}
|
|
129
|
-
updateCreateHistory(value) {
|
|
130
|
-
if (value) {
|
|
131
|
-
this.snapshot.config.createLatest = true;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
removeTimeLapsedField(index) {
|
|
135
|
-
const message = 'Are you sure you would like to remove this snapshot profile?';
|
|
136
|
-
if (window.confirm(message)) {
|
|
137
|
-
this.snapshot.config.timeLapsedFields.splice(index, 1);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
addTimeLapsedField() {
|
|
141
|
-
this.newTimeLapse = {};
|
|
142
|
-
}
|
|
143
|
-
saveTimeLapse() {
|
|
144
|
-
const cloned = _.clone(this.newTimeLapse);
|
|
145
|
-
this.newTimeLapse = null;
|
|
146
|
-
const customIndex = cloned.dayOffsets.indexOf('CUSTOM');
|
|
147
|
-
if (customIndex > -1) {
|
|
148
|
-
cloned.dayOffsets.splice(customIndex);
|
|
149
|
-
cloned.dayOffsets.push(cloned.customDayOffsets);
|
|
150
|
-
delete cloned.customDayOffsets;
|
|
151
|
-
}
|
|
152
|
-
this.snapshot.config.timeLapsedFields.push(cloned);
|
|
153
|
-
}
|
|
154
|
-
async saveSnapshot() {
|
|
155
|
-
if (this.timePeriods && this.timePeriods.timeForm && this.timePeriods.timeForm.valid) {
|
|
156
|
-
this.timePeriods.addTimePeriod();
|
|
157
|
-
}
|
|
158
|
-
if (this.timeLapseForm && this.timeLapseForm.valid) {
|
|
159
|
-
this.saveTimeLapse();
|
|
160
|
-
}
|
|
161
|
-
setTimeout(async () => {
|
|
162
|
-
if (this.selectModel.valid) {
|
|
163
|
-
await this.dataProcessorService.saveProcessor(this.snapshot);
|
|
164
|
-
this.dialogRef.close(true);
|
|
165
|
-
}
|
|
166
|
-
}, 0);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
SnapshotProfileDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SnapshotProfileDialogComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DatasetService }, { token: i3.DataProcessorService }], target: i0.ɵɵFactoryTarget.Component });
|
|
170
|
-
SnapshotProfileDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SnapshotProfileDialogComponent, selector: "ki-snapshot-profile-dialog", host: { classAttribute: "dialog-wrapper" }, viewQueries: [{ propertyName: "selectKeyFields", first: true, predicate: ["selectKeyFields"], descendants: true }, { propertyName: "timePeriods", first: true, predicate: ["timePeriods"], descendants: true }, { propertyName: "timeLapseForm", first: true, predicate: ["timeLapseForm"], descendants: true }, { propertyName: "selectModel", first: true, predicate: ["selectModel"], descendants: true }], ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Snapshot Profile</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <ng-template [ngIf]=\"snapshot\">\n\n\n <div class=\"dialog-content\">\n\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Create a snapshot profile</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Enter the following information in order to\n configure your snapshot.</p>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Title<span class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" #snapshotTitle=\"ngModel\"\n [ngClass]=\"{'border border-red-600': snapshotTitle.invalid}\"\n [(ngModel)]=\"snapshot.title\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n\n <div *ngIf=\"snapshot.config.parameterValues && Object.keys(snapshot.config.parameterValues).length\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Parameter Values\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <ng-template ngFor let-parameterKey [ngForOf]=\"Object.keys(snapshot.config.parameterValues)\">\n <div class=\"text-gray-600 text-xs\">{{_.startCase(parameterKey)}}</div>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'text'\">\n <input type=\"text\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'numeric'\">\n <input type=\"number\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'list'\">\n <select class=\"pr-8\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n <option *ngFor=\"let item of _.find(parameters, {name: parameterKey}).list\" [value]=\"item.value\">\n {{item.label}}</option>\n </select>\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'date'\">\n <input type=\"date\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'datetime'\">\n <input type=\"datetime-local\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'boolean'\">\n <mat-slide-toggle class=\"pr-8\" color=\"primary\"\n [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n </mat-slide-toggle>\n </ng-template>\n </ng-template>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Trigger</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.trigger\">\n <mat-radio-button class=\"mr-4\" value=\"scheduled\">Scheduled</mat-radio-button>\n <mat-radio-button value=\"adhoc\">Ad hoc</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Processor</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.type\">\n <mat-radio-button class=\"mr-4\" value=\"tabulardatasetsnapshot\">Standard\n </mat-radio-button>\n <mat-radio-button value=\"tabulardatasetincrementalsnapshot\">Incremental\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n\n <ng-template [ngIf]=\"snapshot.type === 'tabulardatasetincrementalsnapshot'\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Field Name\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesFieldName\"\n name=\"newerValuesFieldName\" required>\n <mat-option [value]=\"column.name\"\n *ngFor=\"let column of columns\">{{ column.title }}\n </mat-option>\n </mat-select>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Rules\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesRules\"\n name=\"newerValuesRules\" required>\n <mat-option value=\"GREATER\">Greater Than</mat-option>\n <mat-option value=\"GREATER_OR_EQUAL\">Greater Than or Equal To</mat-option>\n <mat-option value=\"LESSER\">Lesser Than</mat-option>\n <mat-option value=\"LESSER_OR_EQUAL\">Lesser Than or Equal To</mat-option>\n </mat-select>\n </div>\n </div>\n </ng-template>\n\n <div *ngIf=\"snapshot.type === 'tabulardatasetsnapshot'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Type</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0 flex flex-col\">\n <mat-checkbox [(ngModel)]=\"snapshot.config.createHistory\"\n (ngModelChange)=\"updateCreateHistory($event)\">\n Historical\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-4\">Create regular data snapshots based on the\n time periods below.\n </div>\n <mat-checkbox [(ngModel)]=\"snapshot.config.createLatest\"\n [disabled]=\"snapshot.config.createHistory\">\n Latest\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-2\">Save the latest data snapshot as it's own\n entity, separate from the history.\n </div>\n <div\n *ngIf=\"!_.some([snapshot.config.createHistory, snapshot.config.createLatest])\"\n class=\"mt-6 border-l-4 border-red-600 bg-red-50 p-4\">\n <div class=\"flex items-center\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/exclamation-triangle -->\n <svg class=\"h-5 w-5 text-red-600\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"mb-0 text-sm text-red-700\">\n Please select one snapshot type.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"snapshot.trigger === 'scheduled'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Time Periods</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <ki-task-time-periods #timePeriods class=\"block\" [showTitle]=\"false\"\n [(taskTimePeriods)]=\"snapshot.taskTimePeriods\"></ki-task-time-periods>\n </div>\n </div>\n\n\n\n\n <div *ngIf=\"snapshot.config.createHistory && snapshot.type === 'tabulardatasetsnapshot'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">Time Lapse\n Fields</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <div class=\"time-lapsed-field\"\n *ngFor=\"let timeLapse of snapshot.config.timeLapsedFields; let i = index\">\n <div>\n <div class=\"mb-1\"><b>Day Offsets:</b> {{ timeLapse.dayOffsets.join(', ') }}\n </div>\n <div><b>Field Names:</b> {{ timeLapse.fieldNames.join(', ') }}</div>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeTimeLapsedField(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n <button mat-button color=\"primary\" (click)=\"addTimeLapsedField()\">\n <mat-icon>date_range</mat-icon> Add time lapsed field\n </button>\n\n <div class=\"w-full bg-gray-50 p-4 mt-4\" *ngIf=\"newTimeLapse\">\n <div class=\"mb-2 text-xs \">Select the desired offsets for the time lapse, along\n with field names then click\n <span class=\"font-medium\">Save time lapse</span></div>\n <form #timeLapseForm=\"ngForm\" class=\"w-1/2\">\n <label class=\"mb-4\">\n Day Offsets\n <mat-select [(ngModel)]=\"newTimeLapse.dayOffsets\"\n name=\"offsets\" required multiple>\n <mat-option [value]=\"offset.value\"\n *ngFor=\"let offset of defaultOffsets\">{{ offset.label }}\n </mat-option>\n <mat-option [value]=\"'CUSTOM'\">Custom period</mat-option>\n </mat-select>\n </label>\n\n <label class=\"mb-4\"\n *ngIf=\"newTimeLapse.dayOffsets && newTimeLapse.dayOffsets.indexOf('CUSTOM') > -1\">\n Custom Offset\n <div class=\"mt-1 flex custom-offset shadow-sm\">\n <input type=\"number\" name=\"custom-offset\"\n [(ngModel)]=\"newTimeLapse.customDayOffsets\"\n class=\"flex-1 block w-full sm:text-sm border-gray-300\">\n <span\n class=\"inline-flex items-center px-3 border border-l-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Days Ago\n </span>\n </div>\n </label>\n\n <label class=\"mb-4\">\n Field Names\n <mat-select [(ngModel)]=\"newTimeLapse.fieldNames\" multiple name=\"names\">\n <mat-option *ngFor=\"let column of columns\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n </label>\n\n <div class=\"align-center justify-between\">\n <div></div>\n <button mat-flat-button color=\"primary\" (click)=\"saveTimeLapse()\"\n [disabled]=\"timeLapseForm.invalid\">Save time lapse\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Key Fields<span *ngIf=\"snapshot.config.timeLapsedFields.length\"\n class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n\n <mat-select #selectModel=\"ngModel\" #selectKeyFields\n [required]=\"snapshot.config.timeLapsedFields.length > 0\"\n [(ngModel)]=\"snapshot.config.keyFieldNames\" multiple\n [ngClass]=\"{'border-red-600': selectModel.invalid}\">\n <div class=\"px-4 py-3 font-normal flex items-center cursor-pointer\"\n (click)=\"selectAll($event)\">\n <mat-checkbox [(ngModel)]=\"allSelected\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"toggleAllSelection()\"></mat-checkbox>\n <span class=\"ml-2\">Select All</span>\n </div>\n <mat-option *ngFor=\"let column of columns\" (click)=\"keyFieldClick()\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n <div class=\"mt-2 text-xs \">\n Select the key fields for this data feed. <br>\n <ng-template [ngIf]=\"snapshot.trigger === 'scheduled'\">\n This required where <span class=\"font-medium\">Time Lapse Fields</span> have\n been\n specified.\n </ng-template>\n </div>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Indexes\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n\n\n <ng-template ngFor let-snapshotIndex [ngForOf]=\"snapshot.config.indexes\"\n let-i=\"index\">\n <div class=\"flex items-center justify-between\">\n <mat-select [ngClass]=\"{'border-red-600': !snapshot.config.indexes[i].fieldNames.length}\"\n [(ngModel)]=\"snapshot.config.indexes[i].fieldNames\"\n multiple>\n <mat-option *ngFor=\"let column of columns\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n <button mat-icon-button color=\"warn\" (click)=\"removeIndex(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </ng-template>\n\n <button mat-stroked-button color=\"primary\" class=\"mt-2 mr-2 bg-white\"\n (click)=\"snapshot.config.indexes.push({fieldNames: []})\">\n Add Indexes\n </button>\n\n <div class=\"mt-2 text-xs \">\n Select the fields you would like to set database indexes on. <br>\n </div>\n </div>\n </div>\n\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Read chunk size\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\"\n [(ngModel)]=\"snapshot.config.readChunkSize\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n\n <div class=\"mt-2 text-xs \">\n Set the chunk size for reading data when generating this snapshot. This can be usefully\n overridden to larger values if the query is expected to be very slow or smaller values\n if the dataset is very wide.\n </div>\n </div>\n\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"dialog-footer\">\n\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" (click)=\"saveSnapshot()\"\n [disabled]=\"!snapshot.title || selectModel.invalid\">\n {{ snapshot.id ? 'Update' : 'Add' }} Snapshot Profile\n </button>\n </div>\n\n </ng-template>\n\n</div>\n\n\n", styles: ["input,select,textarea,mat-select{max-width:500px}.time-lapsed-field{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem;border-radius:4px;border:1px solid #dadada;width:100%;max-width:500px}.custom-offset input{border-top-right-radius:0;border-bottom-right-radius:0}.custom-offset span{border-top-right-radius:4px;border-bottom-right-radius:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.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: i6.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: i7.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: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i9.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i11.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i12.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.TaskTimePeriodsComponent, selector: "ki-task-time-periods", inputs: ["taskTimePeriods", "showTitle"], outputs: ["taskTimePeriodsChange"] }] });
|
|
171
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SnapshotProfileDialogComponent, decorators: [{
|
|
172
|
-
type: Component,
|
|
173
|
-
args: [{ selector: 'ki-snapshot-profile-dialog', 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>Snapshot Profile</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <ng-template [ngIf]=\"snapshot\">\n\n\n <div class=\"dialog-content\">\n\n <div class=\"space-y-8 divide-y divide-gray-200\">\n <div class=\"space-y-8 divide-y divide-gray-200 sm:space-y-5\">\n\n <div class=\"space-y-6 sm:space-y-5\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Create a snapshot profile</h3>\n <p class=\"mt-1 max-w-2xl text-sm text-gray-500\">Enter the following information in order to\n configure your snapshot.</p>\n </div>\n <div class=\"space-y-6 sm:space-y-5\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Title<span class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\" #snapshotTitle=\"ngModel\"\n [ngClass]=\"{'border border-red-600': snapshotTitle.invalid}\"\n [(ngModel)]=\"snapshot.title\" required\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </div>\n </div>\n\n <div *ngIf=\"snapshot.config.parameterValues && Object.keys(snapshot.config.parameterValues).length\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Parameter Values\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <ng-template ngFor let-parameterKey [ngForOf]=\"Object.keys(snapshot.config.parameterValues)\">\n <div class=\"text-gray-600 text-xs\">{{_.startCase(parameterKey)}}</div>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'text'\">\n <input type=\"text\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'numeric'\">\n <input type=\"number\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'list'\">\n <select class=\"pr-8\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n <option *ngFor=\"let item of _.find(parameters, {name: parameterKey}).list\" [value]=\"item.value\">\n {{item.label}}</option>\n </select>\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'date'\">\n <input type=\"date\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'datetime'\">\n <input type=\"datetime-local\" [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\"\n placeholder=\"Enter a value for {{_.startCase(parameterKey)}}\"\n class=\"mb-2 block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n </ng-template>\n <ng-template [ngIf]=\"_.find(parameters, {name: parameterKey})?.type === 'boolean'\">\n <mat-slide-toggle class=\"pr-8\" color=\"primary\"\n [(ngModel)]=\"snapshot.config.parameterValues[parameterKey]\">\n </mat-slide-toggle>\n </ng-template>\n </ng-template>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Trigger</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.trigger\">\n <mat-radio-button class=\"mr-4\" value=\"scheduled\">Scheduled</mat-radio-button>\n <mat-radio-button value=\"adhoc\">Ad hoc</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Processor</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-radio-group [(ngModel)]=\"snapshot.type\">\n <mat-radio-button class=\"mr-4\" value=\"tabulardatasetsnapshot\">Standard\n </mat-radio-button>\n <mat-radio-button value=\"tabulardatasetincrementalsnapshot\">Incremental\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n\n <ng-template [ngIf]=\"snapshot.type === 'tabulardatasetincrementalsnapshot'\">\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Field Name\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesFieldName\"\n name=\"newerValuesFieldName\" required>\n <mat-option [value]=\"column.name\"\n *ngFor=\"let column of columns\">{{ column.title }}\n </mat-option>\n </mat-select>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Newer Values Rules\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <mat-select [(ngModel)]=\"snapshot.config.newerValuesRules\"\n name=\"newerValuesRules\" required>\n <mat-option value=\"GREATER\">Greater Than</mat-option>\n <mat-option value=\"GREATER_OR_EQUAL\">Greater Than or Equal To</mat-option>\n <mat-option value=\"LESSER\">Lesser Than</mat-option>\n <mat-option value=\"LESSER_OR_EQUAL\">Lesser Than or Equal To</mat-option>\n </mat-select>\n </div>\n </div>\n </ng-template>\n\n <div *ngIf=\"snapshot.type === 'tabulardatasetsnapshot'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Snapshot Type</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0 flex flex-col\">\n <mat-checkbox [(ngModel)]=\"snapshot.config.createHistory\"\n (ngModelChange)=\"updateCreateHistory($event)\">\n Historical\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-4\">Create regular data snapshots based on the\n time periods below.\n </div>\n <mat-checkbox [(ngModel)]=\"snapshot.config.createLatest\"\n [disabled]=\"snapshot.config.createHistory\">\n Latest\n </mat-checkbox>\n <div class=\"text-xs text-gray-600 mb-2\">Save the latest data snapshot as it's own\n entity, separate from the history.\n </div>\n <div\n *ngIf=\"!_.some([snapshot.config.createHistory, snapshot.config.createLatest])\"\n class=\"mt-6 border-l-4 border-red-600 bg-red-50 p-4\">\n <div class=\"flex items-center\">\n <div class=\"flex-shrink-0\">\n <!-- Heroicon name: mini/exclamation-triangle -->\n <svg class=\"h-5 w-5 text-red-600\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"mb-0 text-sm text-red-700\">\n Please select one snapshot type.\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"snapshot.trigger === 'scheduled'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Time Periods</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <ki-task-time-periods #timePeriods class=\"block\" [showTitle]=\"false\"\n [(taskTimePeriods)]=\"snapshot.taskTimePeriods\"></ki-task-time-periods>\n </div>\n </div>\n\n\n\n\n <div *ngIf=\"snapshot.config.createHistory && snapshot.type === 'tabulardatasetsnapshot'\"\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">Time Lapse\n Fields</label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <div class=\"time-lapsed-field\"\n *ngFor=\"let timeLapse of snapshot.config.timeLapsedFields; let i = index\">\n <div>\n <div class=\"mb-1\"><b>Day Offsets:</b> {{ timeLapse.dayOffsets.join(', ') }}\n </div>\n <div><b>Field Names:</b> {{ timeLapse.fieldNames.join(', ') }}</div>\n </div>\n <button mat-icon-button color=\"warn\" (click)=\"removeTimeLapsedField(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n <button mat-button color=\"primary\" (click)=\"addTimeLapsedField()\">\n <mat-icon>date_range</mat-icon> Add time lapsed field\n </button>\n\n <div class=\"w-full bg-gray-50 p-4 mt-4\" *ngIf=\"newTimeLapse\">\n <div class=\"mb-2 text-xs \">Select the desired offsets for the time lapse, along\n with field names then click\n <span class=\"font-medium\">Save time lapse</span></div>\n <form #timeLapseForm=\"ngForm\" class=\"w-1/2\">\n <label class=\"mb-4\">\n Day Offsets\n <mat-select [(ngModel)]=\"newTimeLapse.dayOffsets\"\n name=\"offsets\" required multiple>\n <mat-option [value]=\"offset.value\"\n *ngFor=\"let offset of defaultOffsets\">{{ offset.label }}\n </mat-option>\n <mat-option [value]=\"'CUSTOM'\">Custom period</mat-option>\n </mat-select>\n </label>\n\n <label class=\"mb-4\"\n *ngIf=\"newTimeLapse.dayOffsets && newTimeLapse.dayOffsets.indexOf('CUSTOM') > -1\">\n Custom Offset\n <div class=\"mt-1 flex custom-offset shadow-sm\">\n <input type=\"number\" name=\"custom-offset\"\n [(ngModel)]=\"newTimeLapse.customDayOffsets\"\n class=\"flex-1 block w-full sm:text-sm border-gray-300\">\n <span\n class=\"inline-flex items-center px-3 border border-l-0 border-gray-300 bg-gray-50 text-gray-500 text-sm\">\n Days Ago\n </span>\n </div>\n </label>\n\n <label class=\"mb-4\">\n Field Names\n <mat-select [(ngModel)]=\"newTimeLapse.fieldNames\" multiple name=\"names\">\n <mat-option *ngFor=\"let column of columns\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n </label>\n\n <div class=\"align-center justify-between\">\n <div></div>\n <button mat-flat-button color=\"primary\" (click)=\"saveTimeLapse()\"\n [disabled]=\"timeLapseForm.invalid\">Save time lapse\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Key Fields<span *ngIf=\"snapshot.config.timeLapsedFields.length\"\n class=\"ml-1 text-red-600\">*</span>\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n\n <mat-select #selectModel=\"ngModel\" #selectKeyFields\n [required]=\"snapshot.config.timeLapsedFields.length > 0\"\n [(ngModel)]=\"snapshot.config.keyFieldNames\" multiple\n [ngClass]=\"{'border-red-600': selectModel.invalid}\">\n <div class=\"px-4 py-3 font-normal flex items-center cursor-pointer\"\n (click)=\"selectAll($event)\">\n <mat-checkbox [(ngModel)]=\"allSelected\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"toggleAllSelection()\"></mat-checkbox>\n <span class=\"ml-2\">Select All</span>\n </div>\n <mat-option *ngFor=\"let column of columns\" (click)=\"keyFieldClick()\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n <div class=\"mt-2 text-xs \">\n Select the key fields for this data feed. <br>\n <ng-template [ngIf]=\"snapshot.trigger === 'scheduled'\">\n This required where <span class=\"font-medium\">Time Lapse Fields</span> have\n been\n specified.\n </ng-template>\n </div>\n </div>\n </div>\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Indexes\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n\n\n <ng-template ngFor let-snapshotIndex [ngForOf]=\"snapshot.config.indexes\"\n let-i=\"index\">\n <div class=\"flex items-center justify-between\">\n <mat-select [ngClass]=\"{'border-red-600': !snapshot.config.indexes[i].fieldNames.length}\"\n [(ngModel)]=\"snapshot.config.indexes[i].fieldNames\"\n multiple>\n <mat-option *ngFor=\"let column of columns\"\n [value]=\"column.name\">{{ column.title }}\n </mat-option>\n </mat-select>\n <button mat-icon-button color=\"warn\" (click)=\"removeIndex(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </ng-template>\n\n <button mat-stroked-button color=\"primary\" class=\"mt-2 mr-2 bg-white\"\n (click)=\"snapshot.config.indexes.push({fieldNames: []})\">\n Add Indexes\n </button>\n\n <div class=\"mt-2 text-xs \">\n Select the fields you would like to set database indexes on. <br>\n </div>\n </div>\n </div>\n\n\n <div\n class=\"sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-t sm:border-gray-200 sm:pt-5\">\n <label class=\"block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2\">\n Read chunk size\n </label>\n <div class=\"mt-1 sm:col-span-2 sm:mt-0\">\n <input type=\"text\"\n [(ngModel)]=\"snapshot.config.readChunkSize\"\n class=\"block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm\">\n\n <div class=\"mt-2 text-xs \">\n Set the chunk size for reading data when generating this snapshot. This can be usefully\n overridden to larger values if the query is expected to be very slow or smaller values\n if the dataset is very wide.\n </div>\n </div>\n\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"dialog-footer\">\n\n <button mat-stroked-button color=\"primary\" mat-dialog-close>Cancel</button>\n\n <button mat-flat-button color=\"primary\" (click)=\"saveSnapshot()\"\n [disabled]=\"!snapshot.title || selectModel.invalid\">\n {{ snapshot.id ? 'Update' : 'Add' }} Snapshot Profile\n </button>\n </div>\n\n </ng-template>\n\n</div>\n\n\n", styles: ["input,select,textarea,mat-select{max-width:500px}.time-lapsed-field{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem;border-radius:4px;border:1px solid #dadada;width:100%;max-width:500px}.custom-offset input{border-top-right-radius:0;border-bottom-right-radius:0}.custom-offset span{border-top-right-radius:4px;border-bottom-right-radius:4px}\n"] }]
|
|
174
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
175
|
-
type: Inject,
|
|
176
|
-
args: [MAT_DIALOG_DATA]
|
|
177
|
-
}] }, { type: i2.DatasetService }, { type: i3.DataProcessorService }]; }, propDecorators: { selectKeyFields: [{
|
|
178
|
-
type: ViewChild,
|
|
179
|
-
args: ['selectKeyFields']
|
|
180
|
-
}], timePeriods: [{
|
|
181
|
-
type: ViewChild,
|
|
182
|
-
args: ['timePeriods']
|
|
183
|
-
}], timeLapseForm: [{
|
|
184
|
-
type: ViewChild,
|
|
185
|
-
args: ['timeLapseForm']
|
|
186
|
-
}], selectModel: [{
|
|
187
|
-
type: ViewChild,
|
|
188
|
-
args: ['selectModel']
|
|
189
|
-
}] } });
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtcHJvZmlsZS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZXhwbG9yZXIvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZXhwbG9yZXIvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxzQkFBc0IsSUFBSSxlQUFlLEVBQXFDLE1BQU0saUNBQWlDLENBQUM7QUFFOUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNakMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQVF6QixNQUFNLE9BQU8sOEJBQThCO0lBa0N2QyxZQUFtQixTQUF1RCxFQUM5QixJQUFTLEVBQ2pDLGNBQThCLEVBQzlCLG9CQUEwQztRQUgzQyxjQUFTLEdBQVQsU0FBUyxDQUE4QztRQUM5QixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBN0J2RCxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBRWxCLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixtQkFBYyxHQUFHO1lBQ3BCO2dCQUNJLEtBQUssRUFBRSxXQUFXO2dCQUNsQixLQUFLLEVBQUUs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Z0JBQ3hCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQzs7NEhBaExRLDhCQUE4QixvREFtQ25CLGVBQWU7Z0hBbkMxQiw4QkFBOEIsNmZDakIzQyx5KzBCQXVYQTs0RkR0V2EsOEJBQThCO2tCQU4xQyxTQUFTOytCQUNJLDRCQUE0QixRQUdoQyxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQzs7MEJBcUNsQixNQUFNOzJCQUFDLGVBQWU7NEdBakNMLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNGLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDSSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0EsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSwgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQge0RhdGFzZXRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kYXRhc2V0LnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge01hdExlZ2FjeVNlbGVjdCBhcyBNYXRTZWxlY3R9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zZWxlY3QnO1xuaW1wb3J0IHsgTWF0TGVnYWN5T3B0aW9uIGFzIE1hdE9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1jb3JlJztcbmltcG9ydCB7VGFza1RpbWVQZXJpb2RzQ29tcG9uZW50fSBmcm9tICcuLi8uLi90YXNrLXRpbWUtcGVyaW9kcy90YXNrLXRpbWUtcGVyaW9kcy5jb21wb25lbnQnO1xuaW1wb3J0IHtOZ0Zvcm0sIE5nTW9kZWx9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RGF0YVByb2Nlc3NvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RhdGEtcHJvY2Vzc29yLnNlcnZpY2UnO1xuY29uc3QgXyA9IGxvZGFzaC5kZWZhdWx0O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLXNuYXBzaG90LXByb2ZpbGUtZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc25hcHNob3QtcHJvZmlsZS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NuYXBzaG90LXByb2ZpbGUtZGlhbG9nLmNvbXBvbmVudC5zYXNzJ10sXG4gICAgaG9zdDoge2NsYXNzOiAnZGlhbG9nLXdyYXBwZXInfVxufSlcbmV4cG9ydCBjbGFzcyBTbmFwc2hvdFByb2ZpbGVEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0S2V5RmllbGRzJykgc2VsZWN0S2V5RmllbGRzOiBNYXRTZWxlY3Q7XG4gICAgQFZpZXdDaGlsZCgndGltZVBlcmlvZHMnKSB0aW1lUGVyaW9kczogVGFza1RpbWVQZXJpb2RzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3RpbWVMYXBzZUZvcm0nKSB0aW1lTGFwc2VGb3JtOiBOZ0Zvcm07XG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0TW9kZWwnKSBzZWxlY3RNb2RlbDogTmdNb2RlbDtcblxuICAgIHB1YmxpYyBzbmFwc2hvdDogYW55O1xuICAgIHB1YmxpYyBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgbmV3VGltZUxhcHNlOiBhbnk7XG4gICAgcHVibGljIF8gPSBfO1xuICAgIHB1YmxpYyBkZWZhdWx0T2Zmc2V0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICcxIERheSBBZ28nLFxuICAgICAgICAgICAgdmFsdWU6IDFcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICc3IERheXMgQWdvJyxcbiAgICAgICAgICAgIHZhbHVlOiA3XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnMzAgRGF5cyBBZ28nLFxuICAgICAgICAgICAgdmFsdWU6IDMwXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnOTAgRGF5cyBBZ28nLFxuICAgICAgICAgICAgdmFsdWU6IDkwXG4gICAgICAgIH1cbiAgICBdO1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBwYXJhbWV0ZXJzOiBhbnkgPSBbXTtcblxuICAgIHByaXZhdGUgZGF0YXNldEluc3RhbmNlSWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U25hcHNob3RQcm9maWxlRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBEYXRhc2V0U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFQcm9jZXNzb3JTZXJ2aWNlOiBEYXRhUHJvY2Vzc29yU2VydmljZSkge1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGEuY29sdW1ucyB8fCBbXTtcblxuICAgICAgICB0aGlzLnNuYXBzaG90ID0gdGhpcy5kYXRhLnNuYXBzaG90IHx8IHtcbiAgICAgICAgICAgIHR5cGU6ICd0YWJ1bGFyZGF0YXNldHNuYXBzaG90JyxcbiAgICAgICAgICAgIHRhc2tUaW1lUGVyaW9kczogW10sXG4gICAgICAgICAgICB0cmlnZ2VyOiAnc2NoZWR1bGVkJyxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIGtleUZpZWxkTmFtZXM6IFtdLFxuICAgICAgICAgICAgICAgIHRpbWVMYXBzZWRGaWVsZHM6IFtdLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUhpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgY3JlYXRlTGF0ZXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGluZGV4ZXM6IFtdLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlczoge30sXG4gICAgICAgICAgICAgICAgcmVhZENodW5rU2l6ZTogNTAwMDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRoaXMuc25hcHNob3QuY29uZmlnLmluZGV4ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuY29uZmlnLmluZGV4ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zbmFwc2hvdC5jb25maWcucGFyYW1ldGVyVmFsdWVzIHx8IEFycmF5LmlzQXJyYXkodGhpcy5zbmFwc2hvdC5jb25maWcucGFyYW1ldGVyVmFsdWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5jb25maWcucGFyYW1ldGVyVmFsdWVzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFzZXRJbnN0YW5jZUlkID0gdGhpcy5kYXRhLmRhdGFzZXRJbnN0YW5jZUlkIHx8IG51bGw7XG5cbiAgICAgICAgdGhpcy5zbmFwc2hvdC5yZWxhdGVkT2JqZWN0VHlwZSA9ICdEYXRhc2V0SW5zdGFuY2UnO1xuICAgICAgICB0aGlzLnNuYXBzaG90LnJlbGF0ZWRPYmplY3RQcmltYXJ5S2V5ID0gdGhpcy5kYXRhc2V0SW5zdGFuY2VJZDtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLmRhdGFzZXRJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gYXdhaXQgdGhpcy5kYXRhc2V0U2VydmljZS5nZXRFdmFsdWF0ZWRQYXJhbWV0ZXJzKHRoaXMuZGF0YS5kYXRhc2V0SW5zdGFuY2UpO1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMucGFyYW1ldGVycywgcGFyYW1ldGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRMaXN0UGFyYW1ldGVycyhwYXJhbWV0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LmNvbmZpZy5wYXJhbWV0ZXJWYWx1ZXNbcGFyYW1ldGVyLm5hbWVdID0gKHRoaXMuc25hcHNob3QuY29uZmlnLnBhcmFtZXRlclZhbHVlc1twYXJhbWV0ZXIubmFtZV0gfHwgcGFyYW1ldGVyLmRlZmF1bHRWYWx1ZSkgfHwgJyc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5zLmxlbmd0aCAmJiB0aGlzLmRhdGFzZXRJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0ID0gYXdhaXQgdGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhc2V0KHRoaXMuZGF0YXNldEluc3RhbmNlSWQpO1xuICAgICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmRhdGFzZXRTZXJ2aWNlLmV2YWx1YXRlRGF0YXNldChkYXRhc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlcy5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRMaXN0UGFyYW1ldGVycyhwYXJhbWV0ZXI6IGFueSkge1xuICAgICAgICBpZiAocGFyYW1ldGVyLnNldHRpbmdzICYmIHBhcmFtZXRlci5zZXR0aW5ncy5kYXRhc2V0SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFzZXRTZXJ2aWNlLmV2YWx1YXRlRGF0YXNldChwYXJhbWV0ZXIuc2V0dGluZ3MuZGF0YXNldEluc3RhbmNlLCAnMCcsICcxMDAwMDAnKVxuICAgICAgICAgICAgICAgIC50aGVuKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IF8ubWFwKGRhdGEuYWxsRGF0YSwgaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2xhYmVsOiBpdGVtW3BhcmFtZXRlci5zZXR0aW5ncy5sYWJlbENvbHVtbl0sIHZhbHVlOiBpdGVtW3BhcmFtZXRlci5zZXR0aW5ncy52YWx1ZUNvbHVtbl19O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmxpc3QgPSBfLnVuaXFXaXRoKGxpc3QsIF8uaXNFcXVhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgdGhpcyBJbmRleD8nO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuY29uZmlnLmluZGV4ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RBbGwoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9ICF0aGlzLmFsbFNlbGVjdGVkO1xuICAgICAgICB0aGlzLnRvZ2dsZUFsbFNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVBbGxTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEtleUZpZWxkcy5vcHRpb25zLmZvckVhY2goKGl0ZW06IE1hdE9wdGlvbikgPT4gaXRlbS5zZWxlY3QoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEtleUZpZWxkcy5vcHRpb25zLmZvckVhY2goKGl0ZW06IE1hdE9wdGlvbikgPT4gaXRlbS5kZXNlbGVjdCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlGaWVsZENsaWNrKCkge1xuICAgICAgICBsZXQgbmV3U3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RLZXlGaWVsZHMub3B0aW9ucy5mb3JFYWNoKChpdGVtOiBNYXRPcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIG5ld1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IG5ld1N0YXR1cztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ3JlYXRlSGlzdG9yeSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuY29uZmlnLmNyZWF0ZUxhdGVzdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlVGltZUxhcHNlZEZpZWxkKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIHJlbW92ZSB0aGlzIHNuYXBzaG90IHByb2ZpbGU/JztcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LmNvbmZpZy50aW1lTGFwc2VkRmllbGRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVGltZUxhcHNlZEZpZWxkKCkge1xuICAgICAgICB0aGlzLm5ld1RpbWVMYXBzZSA9IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlVGltZUxhcHNlKCkge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBfLmNsb25lKHRoaXMubmV3VGltZUxhcHNlKTtcbiAgICAgICAgdGhpcy5uZXdUaW1lTGFwc2UgPSBudWxsO1xuICAgICAgICBjb25zdCBjdXN0b21JbmRleCA9IGNsb25lZC5kYXlPZmZzZXRzLmluZGV4T2YoJ0NVU1RPTScpO1xuICAgICAgICBpZiAoY3VzdG9tSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgY2xvbmVkLmRheU9mZnNldHMuc3BsaWNlKGN1c3RvbUluZGV4KTtcbiAgICAgICAgICAgIGNsb25lZC5kYXlPZmZzZXRzLnB1c2goY2xvbmVkLmN1c3RvbURheU9mZnNldHMpO1xuICAgICAgICAgICAgZGVsZXRlIGNsb25lZC5jdXN0b21EYXlPZmZzZXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zbmFwc2hvdC5jb25maWcudGltZUxhcHNlZEZpZWxkcy5wdXNoKGNsb25lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNhdmVTbmFwc2hvdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVBlcmlvZHMgJiYgdGhpcy50aW1lUGVyaW9kcy50aW1lRm9ybSAmJiB0aGlzLnRpbWVQZXJpb2RzLnRpbWVGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQZXJpb2RzLmFkZFRpbWVQZXJpb2QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRpbWVMYXBzZUZvcm0gJiYgdGhpcy50aW1lTGFwc2VGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVUaW1lTGFwc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0TW9kZWwudmFsaWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFQcm9jZXNzb3JTZXJ2aWNlLnNhdmVQcm9jZXNzb3IodGhpcy5zbmFwc2hvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkb25seSBPYmplY3QgPSBPYmplY3Q7XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nXCIgY2RrRHJhZyBjZGtEcmFnUm9vdEVsZW1lbnQ9XCIuY2RrLW92ZXJsYXktcGFuZVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIGNka0RyYWdIYW5kbGU+XG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPlNuYXBzaG90IFByb2ZpbGU8L2gyPlxuXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdFwiPlxuXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTggZGl2aWRlLXkgZGl2aWRlLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktOCBkaXZpZGUteSBkaXZpZGUtZ3JheS0yMDAgc206c3BhY2UteS01XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktNiBzbTpzcGFjZS15LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1sZyBmb250LW1lZGl1bSBsZWFkaW5nLTYgdGV4dC1ncmF5LTkwMFwiPkNyZWF0ZSBhIHNuYXBzaG90IHByb2ZpbGU8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMSBtYXgtdy0yeGwgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+RW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiBvcmRlciB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgeW91ciBzbmFwc2hvdC48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTYgc206c3BhY2UteS01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtOmdyaWQgc206Z3JpZC1jb2xzLTMgc206aXRlbXMtc3RhcnQgc206Z2FwLTQgc206Ym9yZGVyLXQgc206Ym9yZGVyLWdyYXktMjAwIHNtOnB0LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNtOm10LXB4IHNtOnB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuYXBzaG90IFRpdGxlPHNwYW4gY2xhc3M9XCJtbC0xIHRleHQtcmVkLTYwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgI3NuYXBzaG90VGl0bGU9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlciBib3JkZXItcmVkLTYwMCc6IHNuYXBzaG90VGl0bGUuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic25hcHNob3QudGl0bGVcIiByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIG1heC13LWxnIHJvdW5kZWQtbWQgYm9yZGVyLWdyYXktMzAwIHNoYWRvdy1zbSBmb2N1czpib3JkZXItaW5kaWdvLTUwMCBmb2N1czpyaW5nLWluZGlnby01MDAgc206bWF4LXcteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbmFwc2hvdC5jb25maWcucGFyYW1ldGVyVmFsdWVzICYmIE9iamVjdC5rZXlzKHNuYXBzaG90LmNvbmZpZy5wYXJhbWV0ZXJWYWx1ZXMpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic206Z3JpZCBzbTpncmlkLWNvbHMtMyBzbTppdGVtcy1zdGFydCBzbTpnYXAtNCBzbTpib3JkZXItdCBzbTpib3JkZXItZ3JheS0yMDAgc206cHQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgc206bXQtcHggc206cHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIFZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbTpjb2wtc3Bhbi0yIHNtOm10LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtcGFyYW1ldGVyS2V5IFtuZ0Zvck9mXT1cIk9iamVjdC5rZXlzKHNuYXBzaG90LmNvbmZpZy5wYXJhbWV0ZXJWYWx1ZXMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZ3JheS02MDAgdGV4dC14c1wiPnt7Xy5zdGFydENhc2UocGFyYW1ldGVyS2V5KX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIl8uZmluZChwYXJhbWV0ZXJzLCB7bmFtZTogcGFyYW1ldGVyS2V5fSk/LnR5cGUgPT09ICd0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNuYXBzaG90LmNvbmZpZy5wYXJhbWV0ZXJWYWx1ZXNbcGFyYW1ldGVyS2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGEgdmFsdWUgZm9yIHt7Xy5zdGFydENhc2UocGFyYW1ldGVyS2V5KX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiBibG9jayB3LWZ1bGwgbWF4LXctbGcgcm91bmRlZC1tZCBib3JkZXItZ3JheS0zMDAgc2hhZG93LXNtIGZvY3VzOmJvcmRlci1pbmRpZ28tNTAwIGZvY3VzOnJpbmctaW5kaWdvLTUwMCBzbTptYXgtdy14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiXy5maW5kKHBhcmFtZXRlcnMsIHtuYW1lOiBwYXJhbWV0ZXJLZXl9KT8udHlwZSA9PT0gJ251bWVyaWMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5jb25maWcucGFyYW1ldGVyVmFsdWVzW3BhcmFtZXRlcktleV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhIHZhbHVlIGZvciB7e18uc3RhcnRDYXNlKHBhcmFtZXRlcktleSl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTIgYmxvY2sgdy1mdWxsIG1heC13LWxnIHJvdW5kZWQtbWQgYm9yZGVyLWdyYXktMzAwIHNoYWRvdy1zbSBmb2N1czpib3JkZXItaW5kaWdvLTUwMCBmb2N1czpyaW5nLWluZGlnby01MDAgc206bWF4LXcteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIl8uZmluZChwYXJhbWV0ZXJzLCB7bmFtZTogcGFyYW1ldGVyS2V5fSk/LnR5cGUgPT09ICdsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwicHItOFwiIFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLnBhcmFtZXRlclZhbHVlc1twYXJhbWV0ZXJLZXldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIF8uZmluZChwYXJhbWV0ZXJzLCB7bmFtZTogcGFyYW1ldGVyS2V5fSkubGlzdFwiIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmxhYmVsfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiXy5maW5kKHBhcmFtZXRlcnMsIHtuYW1lOiBwYXJhbWV0ZXJLZXl9KT8udHlwZSA9PT0gJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLnBhcmFtZXRlclZhbHVlc1twYXJhbWV0ZXJLZXldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYSB2YWx1ZSBmb3Ige3tfLnN0YXJ0Q2FzZShwYXJhbWV0ZXJLZXkpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0yIGJsb2NrIHctZnVsbCBtYXgtdy1sZyByb3VuZGVkLW1kIGJvcmRlci1ncmF5LTMwMCBzaGFkb3ctc20gZm9jdXM6Ym9yZGVyLWluZGlnby01MDAgZm9jdXM6cmluZy1pbmRpZ28tNTAwIHNtOm1heC13LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJfLmZpbmQocGFyYW1ldGVycywge25hbWU6IHBhcmFtZXRlcktleX0pPy50eXBlID09PSAnZGF0ZXRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBbKG5nTW9kZWwpXT1cInNuYXBzaG90LmNvbmZpZy5wYXJhbWV0ZXJWYWx1ZXNbcGFyYW1ldGVyS2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGEgdmFsdWUgZm9yIHt7Xy5zdGFydENhc2UocGFyYW1ldGVyS2V5KX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiBibG9jayB3LWZ1bGwgbWF4LXctbGcgcm91bmRlZC1tZCBib3JkZXItZ3JheS0zMDAgc2hhZG93LXNtIGZvY3VzOmJvcmRlci1pbmRpZ28tNTAwIGZvY3VzOnJpbmctaW5kaWdvLTUwMCBzbTptYXgtdy14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiXy5maW5kKHBhcmFtZXRlcnMsIHtuYW1lOiBwYXJhbWV0ZXJLZXl9KT8udHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIGNsYXNzPVwicHItOFwiIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLnBhcmFtZXRlclZhbHVlc1twYXJhbWV0ZXJLZXldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic206Z3JpZCBzbTpncmlkLWNvbHMtMyBzbTppdGVtcy1zdGFydCBzbTpnYXAtNCBzbTpib3JkZXItdCBzbTpib3JkZXItZ3JheS0yMDAgc206cHQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgc206bXQtcHggc206cHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU25hcHNob3QgVHJpZ2dlcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnRyaWdnZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm1yLTRcIiB2YWx1ZT1cInNjaGVkdWxlZFwiPlNjaGVkdWxlZDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImFkaG9jXCI+QWQgaG9jPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtOmdyaWQgc206Z3JpZC1jb2xzLTMgc206aXRlbXMtc3RhcnQgc206Z2FwLTQgc206Ym9yZGVyLXQgc206Ym9yZGVyLWdyYXktMjAwIHNtOnB0LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNtOm10LXB4IHNtOnB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuYXBzaG90IFByb2Nlc3NvcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm1yLTRcIiB2YWx1ZT1cInRhYnVsYXJkYXRhc2V0c25hcHNob3RcIj5TdGFuZGFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInRhYnVsYXJkYXRhc2V0aW5jcmVtZW50YWxzbmFwc2hvdFwiPkluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnR5cGUgPT09ICd0YWJ1bGFyZGF0YXNldGluY3JlbWVudGFsc25hcHNob3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic206Z3JpZCBzbTpncmlkLWNvbHMtMyBzbTppdGVtcy1zdGFydCBzbTpnYXAtNCBzbTpib3JkZXItdCBzbTpib3JkZXItZ3JheS0yMDAgc206cHQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNtOm10LXB4IHNtOnB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdlciBWYWx1ZXMgRmllbGQgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLm5ld2VyVmFsdWVzRmllbGROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwibmV3ZXJWYWx1ZXNGaWVsZE5hbWVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+e3sgY29sdW1uLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbTpncmlkIHNtOmdyaWQtY29scy0zIHNtOml0ZW1zLXN0YXJ0IHNtOmdhcC00IHNtOmJvcmRlci10IHNtOmJvcmRlci1ncmF5LTIwMCBzbTpwdC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgc206bXQtcHggc206cHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld2VyIFZhbHVlcyBSdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLm5ld2VyVmFsdWVzUnVsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJuZXdlclZhbHVlc1J1bGVzXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiR1JFQVRFUlwiPkdyZWF0ZXIgVGhhbjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHUkVBVEVSX09SX0VRVUFMXCI+R3JlYXRlciBUaGFuIG9yIEVxdWFsIFRvPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxFU1NFUlwiPkxlc3NlciBUaGFuPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxFU1NFUl9PUl9FUVVBTFwiPkxlc3NlciBUaGFuIG9yIEVxdWFsIFRvPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNuYXBzaG90LnR5cGUgPT09ICd0YWJ1bGFyZGF0YXNldHNuYXBzaG90J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtOmdyaWQgc206Z3JpZC1jb2xzLTMgc206aXRlbXMtc3RhcnQgc206Z2FwLTQgc206Ym9yZGVyLXQgc206Ym9yZGVyLWdyYXktMjAwIHNtOnB0LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNtOm10LXB4IHNtOnB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuYXBzaG90IFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbTpjb2wtc3Bhbi0yIHNtOm10LTAgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cInNuYXBzaG90LmNvbmZpZy5jcmVhdGVIaXN0b3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQ3JlYXRlSGlzdG9yeSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yaWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktNjAwIG1iLTRcIj5DcmVhdGUgcmVndWxhciBkYXRhIHNuYXBzaG90cyBiYXNlZCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHBlcmlvZHMgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5jb25maWcuY3JlYXRlTGF0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNuYXBzaG90LmNvbmZpZy5jcmVhdGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZ3JheS02MDAgbWItMlwiPlNhdmUgdGhlIGxhdGVzdCBkYXRhIHNuYXBzaG90IGFzIGl0J3Mgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LCBzZXBhcmF0ZSBmcm9tIHRoZSBoaXN0b3J5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhXy5zb21lKFtzbmFwc2hvdC5jb25maWcuY3JlYXRlSGlzdG9yeSwgc25hcHNob3QuY29uZmlnLmNyZWF0ZUxhdGVzdF0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTYgYm9yZGVyLWwtNCBib3JkZXItcmVkLTYwMCBiZy1yZWQtNTAgcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlcm9pY29uIG5hbWU6IG1pbmkvZXhjbGFtYXRpb24tdHJpYW5nbGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC01IHctNSB0ZXh0LXJlZC02MDBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguNDg1IDMuNDk1Yy42NzMtMS4xNjcgMi4zNTctMS4xNjcgMy4wMyAwbDYuMjggMTAuODc1Yy42NzMgMS4xNjctLjE3IDIuNjI1LTEuNTE2IDIuNjI1SDMuNzJjLTEuMzQ3IDAtMi4xODktMS40NTgtMS41MTUtMi42MjVMOC40ODUgMy40OTV6TTEwIDZhLjc1Ljc1IDAgMDEuNzUuNzV2My41YS43NS43NSAwIDAxLTEuNSAwdi0zLjVBLjc1Ljc1IDAgMDExMCA2em0wIDlhMSAxIDAgMTAwLTIgMSAxIDAgMDAwIDJ6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIHRleHQtc20gdGV4dC1yZWQtNzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBvbmUgc25hcHNob3QgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic25hcHNob3QudHJpZ2dlciA9PT0gJ3NjaGVkdWxlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbTpncmlkIHNtOmdyaWQtY29scy0zIHNtOml0ZW1zLXN0YXJ0IHNtOmdhcC00IHNtOmJvcmRlci10IHNtOmJvcmRlci1ncmF5LTIwMCBzbTpwdC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBzbTptdC1weCBzbTpwdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFBlcmlvZHM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbTpjb2wtc3Bhbi0yIHNtOm10LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxraS10YXNrLXRpbWUtcGVyaW9kcyAjdGltZVBlcmlvZHMgY2xhc3M9XCJibG9ja1wiIFtzaG93VGl0bGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsodGFza1RpbWVQZXJpb2RzKV09XCJzbmFwc2hvdC50YXNrVGltZVBlcmlvZHNcIj48L2tpLXRhc2stdGltZS1wZXJpb2RzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbmFwc2hvdC5jb25maWcuY3JlYXRlSGlzdG9yeSAmJiBzbmFwc2hvdC50eXBlID09PSAndGFidWxhcmRhdGFzZXRzbmFwc2hvdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbTpncmlkIHNtOmdyaWQtY29scy0zIHNtOml0ZW1zLXN0YXJ0IHNtOmdhcC00IHNtOmJvcmRlci10IHNtOmJvcmRlci1ncmF5LTIwMCBzbTpwdC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBzbTptdC1weCBzbTpwdC0yXCI+VGltZSBMYXBzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgc206Y29sLXNwYW4tMiBzbTptdC0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1sYXBzZWQtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGltZUxhcHNlIG9mIHNuYXBzaG90LmNvbmZpZy50aW1lTGFwc2VkRmllbGRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTFcIj48Yj5EYXkgT2Zmc2V0czo8L2I+IHt7IHRpbWVMYXBzZS5kYXlPZmZzZXRzLmpvaW4oJywgJykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PGI+RmllbGQgTmFtZXM6PC9iPiB7eyB0aW1lTGFwc2UuZmllbGROYW1lcy5qb2luKCcsICcpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cInJlbW92ZVRpbWVMYXBzZWRGaWVsZChpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZFRpbWVMYXBzZWRGaWVsZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRhdGVfcmFuZ2U8L21hdC1pY29uPiZuYnNwO0FkZCB0aW1lIGxhcHNlZCBmaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYmctZ3JheS01MCBwLTQgbXQtNFwiICpuZ0lmPVwibmV3VGltZUxhcHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgdGV4dC14cyBcIj5TZWxlY3QgdGhlIGRlc2lyZWQgb2Zmc2V0cyBmb3IgdGhlIHRpbWUgbGFwc2UsIGFsb25nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmllbGQgbmFtZXMgdGhlbiBjbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+U2F2ZSB0aW1lIGxhcHNlPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtICN0aW1lTGFwc2VGb3JtPVwibmdGb3JtXCIgY2xhc3M9XCJ3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgT2Zmc2V0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJuZXdUaW1lTGFwc2UuZGF5T2Zmc2V0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib2Zmc2V0c1wiIHJlcXVpcmVkIG11bHRpcGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvZmZzZXQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvZmZzZXQgb2YgZGVmYXVsdE9mZnNldHNcIj57eyBvZmZzZXQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIidDVVNUT00nXCI+Q3VzdG9tIHBlcmlvZDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibmV3VGltZUxhcHNlLmRheU9mZnNldHMgJiYgbmV3VGltZUxhcHNlLmRheU9mZnNldHMuaW5kZXhPZignQ1VTVE9NJykgPiAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tIE9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgZmxleCBjdXN0b20tb2Zmc2V0IHNoYWRvdy1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmFtZT1cImN1c3RvbS1vZmZzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld1RpbWVMYXBzZS5jdXN0b21EYXlPZmZzZXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LTEgYmxvY2sgdy1mdWxsIHNtOnRleHQtc20gYm9yZGVyLWdyYXktMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcHgtMyBib3JkZXIgYm9yZGVyLWwtMCBib3JkZXItZ3JheS0zMDAgYmctZ3JheS01MCB0ZXh0LWdyYXktNTAwIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXlzIEFnb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwibmV3VGltZUxhcHNlLmZpZWxkTmFtZXNcIiBtdWx0aXBsZSBuYW1lPVwibmFtZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb2x1bW4ubmFtZVwiPnt7IGNvbHVtbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24tY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlVGltZUxhcHNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGltZUxhcHNlRm9ybS5pbnZhbGlkXCI+U2F2ZSB0aW1lIGxhcHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtOmdyaWQgc206Z3JpZC1jb2xzLTMgc206aXRlbXMtc3RhcnQgc206Z2FwLTQgc206Ym9yZGVyLXQgc206Ym9yZGVyLWdyYXktMjAwIHNtOnB0LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNtOm10LXB4IHNtOnB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSBGaWVsZHM8c3BhbiAqbmdJZj1cInNuYXBzaG90LmNvbmZpZy50aW1lTGFwc2VkRmllbGRzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0xIHRleHQtcmVkLTYwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtOmNvbC1zcGFuLTIgc206bXQtMFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAjc2VsZWN0TW9kZWw9XCJuZ01vZGVsXCIgI3NlbGVjdEtleUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInNuYXBzaG90LmNvbmZpZy50aW1lTGFwc2VkRmllbGRzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5jb25maWcua2V5RmllbGROYW1lc1wiIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlci1yZWQtNjAwJzogc2VsZWN0TW9kZWwuaW52YWxpZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBweS0zIGZvbnQtbm9ybWFsIGZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQWxsU2VsZWN0aW9uKClcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+U2VsZWN0IEFsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIiAoY2xpY2spPVwia2V5RmllbGRDbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sdW1uLm5hbWVcIj57eyBjb2x1bW4udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LXhzIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCB0aGUga2V5IGZpZWxkcyBmb3IgdGhpcyBkYXRhIGZlZWQuIDxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudHJpZ2dlciA9PT0gJ3NjaGVkdWxlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXF1aXJlZCB3aGVyZSA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+VGltZSBMYXBzZSBGaWVsZHM8L3NwYW4+IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic206Z3JpZCBzbTpncmlkLWNvbHMtMyBzbTppdGVtcy1zdGFydCBzbTpnYXAtNCBzbTpib3JkZXItdCBzbTpib3JkZXItZ3JheS0yMDAgc206cHQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgc206bXQtcHggc206cHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbTpjb2wtc3Bhbi0yIHNtOm10LTBcIj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LXNuYXBzaG90SW5kZXggW25nRm9yT2ZdPVwic25hcHNob3QuY29uZmlnLmluZGV4ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1pPVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtuZ0NsYXNzXT1cInsnYm9yZGVyLXJlZC02MDAnOiAhc25hcHNob3QuY29uZmlnLmluZGV4ZXNbaV0uZmllbGROYW1lcy5sZW5ndGh9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic25hcHNob3QuY29uZmlnLmluZGV4ZXNbaV0uZmllbGROYW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb2x1bW4ubmFtZVwiPnt7IGNvbHVtbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPVwid2FyblwiIChjbGljayk9XCJyZW1vdmVJbmRleChpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm10LTIgbXItMiBiZy13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzbmFwc2hvdC5jb25maWcuaW5kZXhlcy5wdXNoKHtmaWVsZE5hbWVzOiBbXX0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIEluZGV4ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LXhzIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCB0aGUgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHRvIHNldCBkYXRhYmFzZSBpbmRleGVzIG9uLiA8YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbTpncmlkIHNtOmdyaWQtY29scy0zIHNtOml0ZW1zLXN0YXJ0IHNtOmdhcC00IHNtOmJvcmRlci10IHNtOmJvcmRlci1ncmF5LTIwMCBzbTpwdC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBzbTptdC1weCBzbTpwdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgY2h1bmsgc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBzbTpjb2wtc3Bhbi0yIHNtOm10LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5jb25maWcucmVhZENodW5rU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgbWF4LXctbGcgcm91bmRlZC1tZCBib3JkZXItZ3JheS0zMDAgc2hhZG93LXNtIGZvY3VzOmJvcmRlci1pbmRpZ28tNTAwIGZvY3VzOnJpbmctaW5kaWdvLTUwMCBzbTptYXgtdy14cyBzbTp0ZXh0LXNtXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHRleHQteHMgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBjaHVuayBzaXplIGZvciByZWFkaW5nIGRhdGEgd2hlbiBnZW5lcmF0aW5nIHRoaXMgc25hcHNob3QuICBUaGlzIGNhbiBiZSB1c2VmdWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRkZW4gdG8gbGFyZ2VyIHZhbHVlcyBpZiB0aGUgcXVlcnkgaXMgZXhwZWN0ZWQgdG8gYmUgdmVyeSBzbG93IG9yIHNtYWxsZXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGRhdGFzZXQgaXMgdmVyeSB3aWRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1kaWFsb2ctY2xvc2U+Q2FuY2VsPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlU25hcHNob3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QudGl0bGUgfHwgc2VsZWN0TW9kZWwuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7IHNuYXBzaG90LmlkID8gJ1VwZGF0ZScgOiAnQWRkJyB9fSBTbmFwc2hvdCBQcm9maWxlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG48L2Rpdj5cblxuXG4iXX0=
|