@firestitch/system 13.0.13 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/modules/query-logs/components/explain/explain.component.d.ts +8 -8
- package/app/modules/query-logs/components/explain/index.d.ts +1 -1
- package/app/modules/query-logs/components/index.d.ts +3 -3
- package/app/modules/query-logs/components/query-log/index.d.ts +1 -1
- package/app/modules/query-logs/components/query-log/query-log.component.d.ts +27 -27
- package/app/modules/query-logs/components/query-logs/index.d.ts +1 -1
- package/app/modules/query-logs/components/query-logs/query-logs.component.d.ts +20 -20
- package/app/modules/query-logs/query-logs.module.d.ts +23 -23
- package/app/modules/system/components/api-log/api-log.component.d.ts +13 -13
- package/app/modules/system/components/api-log/index.d.ts +1 -1
- package/app/modules/system/components/api-logs/api-logs.component.d.ts +21 -21
- package/app/modules/system/components/api-logs/index.d.ts +1 -1
- package/app/modules/system/components/cron/cron.component.d.ts +25 -25
- package/app/modules/system/components/cron/index.d.ts +1 -1
- package/app/modules/system/components/cron-log/cron-log.component.d.ts +12 -12
- package/app/modules/system/components/cron-log/index.d.ts +1 -1
- package/app/modules/system/components/cron-next-run/cron-next-run.component.d.ts +18 -18
- package/app/modules/system/components/cron-next-run/index.d.ts +1 -1
- package/app/modules/system/components/crons/crons.component.d.ts +43 -43
- package/app/modules/system/components/crons/index.d.ts +1 -1
- package/app/modules/system/components/dashboard/dashboard.component.d.ts +28 -28
- package/app/modules/system/components/dashboard/index.d.ts +1 -1
- package/app/modules/system/components/info/index.d.ts +1 -1
- package/app/modules/system/components/info/info.component.d.ts +11 -11
- package/app/modules/system/components/process/index.d.ts +1 -1
- package/app/modules/system/components/process/process.component.d.ts +45 -45
- package/app/modules/system/components/processes/index.d.ts +1 -1
- package/app/modules/system/components/processes/processes.component.d.ts +36 -36
- package/app/modules/system/components/server-log/index.d.ts +1 -1
- package/app/modules/system/components/server-log/server-log.component.d.ts +10 -10
- package/app/modules/system/components/server-logs/index.d.ts +1 -1
- package/app/modules/system/components/server-logs/server-logs.component.d.ts +21 -21
- package/app/modules/system/components/settings/index.d.ts +1 -1
- package/app/modules/system/components/settings/settings.component.d.ts +30 -30
- package/app/modules/system/components/upgrade-logs/index.d.ts +1 -1
- package/app/modules/system/components/upgrade-logs/upgrade-logs.component.d.ts +17 -17
- package/app/modules/system/consts/api-log-states.const.d.ts +5 -5
- package/app/modules/system/consts/cron-log-states.const.d.ts +6 -6
- package/app/modules/system/consts/cron-process-states.const.d.ts +4 -4
- package/app/modules/system/consts/cron-states.const.d.ts +5 -5
- package/app/modules/system/consts/index.d.ts +7 -7
- package/app/modules/system/consts/process-process-states.const.d.ts +4 -4
- package/app/modules/system/consts/process-states.const.d.ts +5 -5
- package/app/modules/system/consts/setting-interface-types.const.d.ts +5 -5
- package/app/modules/system/enums/api-log-state.enum.d.ts +5 -5
- package/app/modules/system/enums/cron-log-state.enum.d.ts +14 -14
- package/app/modules/system/enums/cron-state.enum.d.ts +9 -9
- package/app/modules/system/enums/index.d.ts +5 -5
- package/app/modules/system/enums/process-state.enum.d.ts +8 -8
- package/app/modules/system/enums/setting-interface-type.enum.d.ts +14 -14
- package/app/modules/system/fs-system.module.d.ts +47 -47
- package/app/modules/system/helpers/index-name-value.d.ts +1 -1
- package/app/modules/system/injectors/system-config.injector.d.ts +2 -2
- package/app/modules/system/interfaces/dashboard-action.d.ts +5 -5
- package/app/modules/system/interfaces/index.d.ts +4 -4
- package/app/modules/system/interfaces/process-action.d.ts +6 -6
- package/app/modules/system/interfaces/process.d.ts +26 -26
- package/app/modules/system/interfaces/system-config.d.ts +2 -2
- package/app/modules/system/pipes/key-name-value.pipe.d.ts +8 -8
- package/esm2020/app/modules/query-logs/components/explain/explain.component.mjs +23 -23
- package/esm2020/app/modules/query-logs/components/explain/index.mjs +1 -1
- package/esm2020/app/modules/query-logs/components/index.mjs +4 -4
- package/esm2020/app/modules/query-logs/components/query-log/index.mjs +1 -1
- package/esm2020/app/modules/query-logs/components/query-log/query-log.component.mjs +58 -58
- package/esm2020/app/modules/query-logs/components/query-logs/index.mjs +1 -1
- package/esm2020/app/modules/query-logs/components/query-logs/query-logs.component.mjs +84 -84
- package/esm2020/app/modules/query-logs/query-logs.module.mjs +83 -85
- package/esm2020/app/modules/system/components/api-log/api-log.component.mjs +34 -34
- package/esm2020/app/modules/system/components/api-log/index.mjs +2 -2
- package/esm2020/app/modules/system/components/api-logs/api-logs.component.mjs +69 -69
- package/esm2020/app/modules/system/components/api-logs/index.mjs +2 -2
- package/esm2020/app/modules/system/components/cron/cron.component.mjs +105 -105
- package/esm2020/app/modules/system/components/cron/index.mjs +2 -2
- package/esm2020/app/modules/system/components/cron-log/cron-log.component.mjs +37 -37
- package/esm2020/app/modules/system/components/cron-log/index.mjs +2 -2
- package/esm2020/app/modules/system/components/cron-next-run/cron-next-run.component.mjs +98 -98
- package/esm2020/app/modules/system/components/cron-next-run/index.mjs +1 -1
- package/esm2020/app/modules/system/components/crons/crons.component.mjs +235 -235
- package/esm2020/app/modules/system/components/crons/index.mjs +2 -2
- package/esm2020/app/modules/system/components/dashboard/dashboard.component.mjs +84 -84
- package/esm2020/app/modules/system/components/dashboard/index.mjs +2 -2
- package/esm2020/app/modules/system/components/info/index.mjs +2 -2
- package/esm2020/app/modules/system/components/info/info.component.mjs +31 -31
- package/esm2020/app/modules/system/components/process/index.mjs +2 -2
- package/esm2020/app/modules/system/components/process/process.component.mjs +98 -98
- package/esm2020/app/modules/system/components/processes/index.mjs +2 -2
- package/esm2020/app/modules/system/components/processes/processes.component.mjs +177 -177
- package/esm2020/app/modules/system/components/server-log/index.mjs +2 -2
- package/esm2020/app/modules/system/components/server-log/server-log.component.mjs +38 -38
- package/esm2020/app/modules/system/components/server-logs/index.mjs +2 -2
- package/esm2020/app/modules/system/components/server-logs/server-logs.component.mjs +53 -53
- package/esm2020/app/modules/system/components/settings/index.mjs +2 -2
- package/esm2020/app/modules/system/components/settings/settings.component.mjs +138 -138
- package/esm2020/app/modules/system/components/upgrade-logs/index.mjs +2 -2
- package/esm2020/app/modules/system/components/upgrade-logs/upgrade-logs.component.mjs +44 -44
- package/esm2020/app/modules/system/consts/api-log-states.const.mjs +7 -7
- package/esm2020/app/modules/system/consts/cron-log-states.const.mjs +15 -15
- package/esm2020/app/modules/system/consts/cron-process-states.const.mjs +4 -4
- package/esm2020/app/modules/system/consts/cron-states.const.mjs +10 -10
- package/esm2020/app/modules/system/consts/index.mjs +7 -7
- package/esm2020/app/modules/system/consts/process-process-states.const.mjs +5 -5
- package/esm2020/app/modules/system/consts/process-states.const.mjs +10 -10
- package/esm2020/app/modules/system/consts/setting-interface-types.const.mjs +12 -12
- package/esm2020/app/modules/system/enums/api-log-state.enum.mjs +7 -7
- package/esm2020/app/modules/system/enums/cron-log-state.enum.mjs +15 -15
- package/esm2020/app/modules/system/enums/cron-state.enum.mjs +11 -11
- package/esm2020/app/modules/system/enums/index.mjs +6 -6
- package/esm2020/app/modules/system/enums/process-state.enum.mjs +10 -10
- package/esm2020/app/modules/system/enums/setting-interface-type.enum.mjs +16 -16
- package/esm2020/app/modules/system/fs-system.module.mjs +177 -179
- package/esm2020/app/modules/system/helpers/index-name-value.mjs +8 -8
- package/esm2020/app/modules/system/injectors/system-config.injector.mjs +3 -3
- package/esm2020/app/modules/system/interfaces/dashboard-action.mjs +2 -2
- package/esm2020/app/modules/system/interfaces/index.mjs +4 -4
- package/esm2020/app/modules/system/interfaces/process-action.mjs +2 -2
- package/esm2020/app/modules/system/interfaces/process.mjs +1 -1
- package/esm2020/app/modules/system/interfaces/system-config.mjs +2 -2
- package/esm2020/app/modules/system/pipes/key-name-value.pipe.mjs +21 -21
- package/esm2020/firestitch-system.mjs +4 -4
- package/esm2020/public_api.mjs +20 -20
- package/fesm2015/firestitch-system.mjs +1486 -1490
- package/fesm2015/firestitch-system.mjs.map +1 -1
- package/fesm2020/firestitch-system.mjs +1492 -1496
- package/fesm2020/firestitch-system.mjs.map +1 -1
- package/{firestitch-system.d.ts → index.d.ts} +5 -5
- package/package.json +3 -3
- package/public_api.d.ts +21 -21
|
@@ -1,236 +1,236 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
-
import { parse } from '@firestitch/date';
|
|
4
|
-
import { ItemType } from '@firestitch/filter';
|
|
5
|
-
import { FsListComponent } from '@firestitch/list';
|
|
6
|
-
import { FsMessage } from '@firestitch/message';
|
|
7
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
-
import { SelectionActionType } from '@firestitch/selection';
|
|
9
|
-
import { Subject } from 'rxjs';
|
|
10
|
-
import { map, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
11
|
-
import { differenceInSeconds } from 'date-fns';
|
|
12
|
-
import { CronProcessStates, CronStates } from '../../consts';
|
|
13
|
-
import { CronState } from '../../enums';
|
|
14
|
-
import { indexNameValue } from '../../helpers/index-name-value';
|
|
15
|
-
import { CronComponent } from '../cron/cron.component';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@firestitch/message";
|
|
18
|
-
import * as i2 from "@angular/material/dialog";
|
|
19
|
-
import * as i3 from "@firestitch/prompt";
|
|
20
|
-
import * as i4 from "@
|
|
21
|
-
import * as i5 from "@firestitch/
|
|
22
|
-
import * as i6 from "@firestitch/
|
|
23
|
-
import * as i7 from "
|
|
24
|
-
import * as i8 from "
|
|
25
|
-
export class CronsComponent {
|
|
26
|
-
constructor(_message, _dialog, _prompt) {
|
|
27
|
-
this._message = _message;
|
|
28
|
-
this._dialog = _dialog;
|
|
29
|
-
this._prompt = _prompt;
|
|
30
|
-
this.config = null;
|
|
31
|
-
this.CronStates = indexNameValue(CronStates);
|
|
32
|
-
this.CronProcessStates = indexNameValue(CronProcessStates);
|
|
33
|
-
this.CronState = CronState;
|
|
34
|
-
this._destroy$ = new Subject();
|
|
35
|
-
}
|
|
36
|
-
ngOnInit() {
|
|
37
|
-
this._configList();
|
|
38
|
-
}
|
|
39
|
-
open(cron) {
|
|
40
|
-
this._dialog.open(CronComponent, {
|
|
41
|
-
data: {
|
|
42
|
-
cron,
|
|
43
|
-
loadCronLogs: this.loadCronLogs,
|
|
44
|
-
loadCron: this.loadCron,
|
|
45
|
-
cronActions: this.getCronActions(),
|
|
46
|
-
},
|
|
47
|
-
width: '85%',
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
getCronActions() {
|
|
51
|
-
return [
|
|
52
|
-
{
|
|
53
|
-
action: (data) => {
|
|
54
|
-
return this.queue(data)
|
|
55
|
-
.pipe(tap(() => {
|
|
56
|
-
this._message.success('Queued cron');
|
|
57
|
-
this.list.reload();
|
|
58
|
-
}));
|
|
59
|
-
},
|
|
60
|
-
label: 'Queue',
|
|
61
|
-
show: (cron) => {
|
|
62
|
-
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
action: (data) => {
|
|
67
|
-
return this.run(data)
|
|
68
|
-
.pipe(tap(() => {
|
|
69
|
-
this._message.success('Cron ran');
|
|
70
|
-
this.list.reload();
|
|
71
|
-
}));
|
|
72
|
-
},
|
|
73
|
-
label: 'Run',
|
|
74
|
-
show: (cron) => {
|
|
75
|
-
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
action: (data) => {
|
|
80
|
-
return this.enable(data)
|
|
81
|
-
.pipe(tap(() => {
|
|
82
|
-
this._message.success('Enabled cron');
|
|
83
|
-
this.list.reload();
|
|
84
|
-
}));
|
|
85
|
-
},
|
|
86
|
-
label: 'Enable',
|
|
87
|
-
show: (cron) => {
|
|
88
|
-
return cron.state === CronState.Disabled;
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
action: (data) => {
|
|
93
|
-
return this.disable(data)
|
|
94
|
-
.pipe(tap(() => {
|
|
95
|
-
this._message.success('Disabled cron');
|
|
96
|
-
this.list.reload();
|
|
97
|
-
}));
|
|
98
|
-
},
|
|
99
|
-
label: 'Disable',
|
|
100
|
-
show: (cron) => {
|
|
101
|
-
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
action: (data) => {
|
|
106
|
-
return this._prompt.confirm({
|
|
107
|
-
title: 'Confirm',
|
|
108
|
-
template: 'Are you sure you would like to kill the cron?',
|
|
109
|
-
})
|
|
110
|
-
.pipe(switchMap(() => {
|
|
111
|
-
return this.kill(data);
|
|
112
|
-
}), tap(() => {
|
|
113
|
-
this._message.success('Killed cron');
|
|
114
|
-
this.list.reload();
|
|
115
|
-
}), takeUntil(this._destroy$));
|
|
116
|
-
},
|
|
117
|
-
label: 'Kill',
|
|
118
|
-
show: (cron) => {
|
|
119
|
-
return cron.state === CronState.Running;
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
action: (data) => {
|
|
124
|
-
return this._prompt.confirm({
|
|
125
|
-
title: 'Confirm',
|
|
126
|
-
template: 'Are you sure you would like to reset the cron?',
|
|
127
|
-
})
|
|
128
|
-
.pipe(switchMap(() => {
|
|
129
|
-
return this.enable(data);
|
|
130
|
-
}), tap(() => {
|
|
131
|
-
this._message.success('Reset cron');
|
|
132
|
-
this.list.reload();
|
|
133
|
-
}), takeUntil(this._destroy$));
|
|
134
|
-
},
|
|
135
|
-
label: 'Reset',
|
|
136
|
-
show: (cron) => {
|
|
137
|
-
return cron.state === CronState.Killing || cron.state === CronState.Running || cron.state === CronState.Failed || cron.state === CronState.Queued;
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
];
|
|
141
|
-
}
|
|
142
|
-
ngOnDestroy() {
|
|
143
|
-
this._destroy$.next();
|
|
144
|
-
this._destroy$.complete();
|
|
145
|
-
}
|
|
146
|
-
_configList() {
|
|
147
|
-
this.config = {
|
|
148
|
-
paging: false,
|
|
149
|
-
filters: [
|
|
150
|
-
{
|
|
151
|
-
type: ItemType.Keyword,
|
|
152
|
-
name: 'keyword',
|
|
153
|
-
label: 'Search',
|
|
154
|
-
},
|
|
155
|
-
],
|
|
156
|
-
rowActions: this.getCronActions()
|
|
157
|
-
.map((rowAction) => {
|
|
158
|
-
return {
|
|
159
|
-
...rowAction,
|
|
160
|
-
click: (cron) => {
|
|
161
|
-
rowAction.action(cron)
|
|
162
|
-
.subscribe();
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
}),
|
|
166
|
-
fetch: (query) => {
|
|
167
|
-
query = {
|
|
168
|
-
...query,
|
|
169
|
-
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
170
|
-
};
|
|
171
|
-
return this.loadCrons(query)
|
|
172
|
-
.pipe(map((crons) => ({
|
|
173
|
-
data: crons
|
|
174
|
-
.map((cron) => {
|
|
175
|
-
return {
|
|
176
|
-
...cron,
|
|
177
|
-
runningDuration: differenceInSeconds(parse(cron.createDate), new Date()),
|
|
178
|
-
};
|
|
179
|
-
}),
|
|
180
|
-
})));
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
if (this.bulk) {
|
|
184
|
-
this.config.selection = {
|
|
185
|
-
selectAll: false,
|
|
186
|
-
actions: [
|
|
187
|
-
{
|
|
188
|
-
type: SelectionActionType.Action,
|
|
189
|
-
name: 'disable',
|
|
190
|
-
label: 'Disable',
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
type: SelectionActionType.Action,
|
|
194
|
-
name: 'enable',
|
|
195
|
-
label: 'Enable',
|
|
196
|
-
},
|
|
197
|
-
],
|
|
198
|
-
actionSelected: (action) => {
|
|
199
|
-
return this.bulk(action.action.name, action.selected)
|
|
200
|
-
.pipe(tap(() => {
|
|
201
|
-
this.list.reload();
|
|
202
|
-
this._message.success('Applied Changes');
|
|
203
|
-
}));
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
CronsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
210
|
-
CronsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
212
|
-
type: Component,
|
|
213
|
-
args: [{ selector: 'fs-system-crons', template: "<fs-list [config]=\"config\">\n <fs-list-column>\n <ng-template fs-list-header>Name</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"open(row)\">{{row.name}}</a>\n <div *ngIf=\"row.cronSetting\">\n <small>{{row.cronSetting.summary}}</small>\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column align=\"center\">\n <ng-template fs-list-header>Status</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.host || row.processId; else status\">\n <fs-popover \n [maxWidth]=\"null\"\n [template]=\"statusPopover\" \n [indication]=\"true\"\n size=\"small\">\n <ng-container *ngTemplateOutlet=\"status\"></ng-container>\n </fs-popover>\n <ng-template #statusPopover>\n <div *ngIf=\"row.host\">Host: {{row.host}}</div>\n <div *ngIf=\"row.processId\">Process ID: {{row.processId}}</div>\n <div *ngIf=\"row.processState\">Process State: {{CronProcessStates[row.processState]}}</div>\n </ng-template>\n </ng-container>\n <ng-template #status>\n {{CronStates[row.state]}}\n </ng-template>\n <ng-container *ngIf=\"row.state === CronState.Running\">\n <div class=\"small\">\n Duration: {{ row.runningDuration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-container> \n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Last Ran</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n <div class=\"small\" *ngIf=\"row.duration\">\n Duration: {{ row.duration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-template>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Next Run</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== CronState.Disabled\">\n <app-next-run [cron]=\"row\"></app-next-run>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Timeout Hours</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.cronSetting.timeout}}\n </ng-template>\n </fs-list-column>\n</fs-list>\n"
|
|
214
|
-
}], ctorParameters: function () { return [{ type: i1.FsMessage }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { list: [{
|
|
215
|
-
type: ViewChild,
|
|
216
|
-
args: [FsListComponent, { static: true }]
|
|
217
|
-
}], enable: [{
|
|
218
|
-
type: Input
|
|
219
|
-
}], disable: [{
|
|
220
|
-
type: Input
|
|
221
|
-
}], kill: [{
|
|
222
|
-
type: Input
|
|
223
|
-
}], queue: [{
|
|
224
|
-
type: Input
|
|
225
|
-
}], run: [{
|
|
226
|
-
type: Input
|
|
227
|
-
}], loadCrons: [{
|
|
228
|
-
type: Input
|
|
229
|
-
}], loadCron: [{
|
|
230
|
-
type: Input
|
|
231
|
-
}], loadCronLogs: [{
|
|
232
|
-
type: Input
|
|
233
|
-
}], bulk: [{
|
|
234
|
-
type: Input
|
|
235
|
-
}] } });
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
+
import { parse } from '@firestitch/date';
|
|
4
|
+
import { ItemType } from '@firestitch/filter';
|
|
5
|
+
import { FsListComponent } from '@firestitch/list';
|
|
6
|
+
import { FsMessage } from '@firestitch/message';
|
|
7
|
+
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
+
import { SelectionActionType } from '@firestitch/selection';
|
|
9
|
+
import { Subject } from 'rxjs';
|
|
10
|
+
import { map, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
11
|
+
import { differenceInSeconds } from 'date-fns';
|
|
12
|
+
import { CronProcessStates, CronStates } from '../../consts';
|
|
13
|
+
import { CronState } from '../../enums';
|
|
14
|
+
import { indexNameValue } from '../../helpers/index-name-value';
|
|
15
|
+
import { CronComponent } from '../cron/cron.component';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@firestitch/message";
|
|
18
|
+
import * as i2 from "@angular/material/dialog";
|
|
19
|
+
import * as i3 from "@firestitch/prompt";
|
|
20
|
+
import * as i4 from "@angular/common";
|
|
21
|
+
import * as i5 from "@firestitch/date";
|
|
22
|
+
import * as i6 from "@firestitch/list";
|
|
23
|
+
import * as i7 from "@firestitch/popover";
|
|
24
|
+
import * as i8 from "../cron-next-run/cron-next-run.component";
|
|
25
|
+
export class CronsComponent {
|
|
26
|
+
constructor(_message, _dialog, _prompt) {
|
|
27
|
+
this._message = _message;
|
|
28
|
+
this._dialog = _dialog;
|
|
29
|
+
this._prompt = _prompt;
|
|
30
|
+
this.config = null;
|
|
31
|
+
this.CronStates = indexNameValue(CronStates);
|
|
32
|
+
this.CronProcessStates = indexNameValue(CronProcessStates);
|
|
33
|
+
this.CronState = CronState;
|
|
34
|
+
this._destroy$ = new Subject();
|
|
35
|
+
}
|
|
36
|
+
ngOnInit() {
|
|
37
|
+
this._configList();
|
|
38
|
+
}
|
|
39
|
+
open(cron) {
|
|
40
|
+
this._dialog.open(CronComponent, {
|
|
41
|
+
data: {
|
|
42
|
+
cron,
|
|
43
|
+
loadCronLogs: this.loadCronLogs,
|
|
44
|
+
loadCron: this.loadCron,
|
|
45
|
+
cronActions: this.getCronActions(),
|
|
46
|
+
},
|
|
47
|
+
width: '85%',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
getCronActions() {
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
action: (data) => {
|
|
54
|
+
return this.queue(data)
|
|
55
|
+
.pipe(tap(() => {
|
|
56
|
+
this._message.success('Queued cron');
|
|
57
|
+
this.list.reload();
|
|
58
|
+
}));
|
|
59
|
+
},
|
|
60
|
+
label: 'Queue',
|
|
61
|
+
show: (cron) => {
|
|
62
|
+
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
action: (data) => {
|
|
67
|
+
return this.run(data)
|
|
68
|
+
.pipe(tap(() => {
|
|
69
|
+
this._message.success('Cron ran');
|
|
70
|
+
this.list.reload();
|
|
71
|
+
}));
|
|
72
|
+
},
|
|
73
|
+
label: 'Run',
|
|
74
|
+
show: (cron) => {
|
|
75
|
+
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
action: (data) => {
|
|
80
|
+
return this.enable(data)
|
|
81
|
+
.pipe(tap(() => {
|
|
82
|
+
this._message.success('Enabled cron');
|
|
83
|
+
this.list.reload();
|
|
84
|
+
}));
|
|
85
|
+
},
|
|
86
|
+
label: 'Enable',
|
|
87
|
+
show: (cron) => {
|
|
88
|
+
return cron.state === CronState.Disabled;
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
action: (data) => {
|
|
93
|
+
return this.disable(data)
|
|
94
|
+
.pipe(tap(() => {
|
|
95
|
+
this._message.success('Disabled cron');
|
|
96
|
+
this.list.reload();
|
|
97
|
+
}));
|
|
98
|
+
},
|
|
99
|
+
label: 'Disable',
|
|
100
|
+
show: (cron) => {
|
|
101
|
+
return cron.state === CronState.Idle || cron.state === CronState.Failed;
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
action: (data) => {
|
|
106
|
+
return this._prompt.confirm({
|
|
107
|
+
title: 'Confirm',
|
|
108
|
+
template: 'Are you sure you would like to kill the cron?',
|
|
109
|
+
})
|
|
110
|
+
.pipe(switchMap(() => {
|
|
111
|
+
return this.kill(data);
|
|
112
|
+
}), tap(() => {
|
|
113
|
+
this._message.success('Killed cron');
|
|
114
|
+
this.list.reload();
|
|
115
|
+
}), takeUntil(this._destroy$));
|
|
116
|
+
},
|
|
117
|
+
label: 'Kill',
|
|
118
|
+
show: (cron) => {
|
|
119
|
+
return cron.state === CronState.Running;
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
action: (data) => {
|
|
124
|
+
return this._prompt.confirm({
|
|
125
|
+
title: 'Confirm',
|
|
126
|
+
template: 'Are you sure you would like to reset the cron?',
|
|
127
|
+
})
|
|
128
|
+
.pipe(switchMap(() => {
|
|
129
|
+
return this.enable(data);
|
|
130
|
+
}), tap(() => {
|
|
131
|
+
this._message.success('Reset cron');
|
|
132
|
+
this.list.reload();
|
|
133
|
+
}), takeUntil(this._destroy$));
|
|
134
|
+
},
|
|
135
|
+
label: 'Reset',
|
|
136
|
+
show: (cron) => {
|
|
137
|
+
return cron.state === CronState.Killing || cron.state === CronState.Running || cron.state === CronState.Failed || cron.state === CronState.Queued;
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
ngOnDestroy() {
|
|
143
|
+
this._destroy$.next();
|
|
144
|
+
this._destroy$.complete();
|
|
145
|
+
}
|
|
146
|
+
_configList() {
|
|
147
|
+
this.config = {
|
|
148
|
+
paging: false,
|
|
149
|
+
filters: [
|
|
150
|
+
{
|
|
151
|
+
type: ItemType.Keyword,
|
|
152
|
+
name: 'keyword',
|
|
153
|
+
label: 'Search',
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
rowActions: this.getCronActions()
|
|
157
|
+
.map((rowAction) => {
|
|
158
|
+
return {
|
|
159
|
+
...rowAction,
|
|
160
|
+
click: (cron) => {
|
|
161
|
+
rowAction.action(cron)
|
|
162
|
+
.subscribe();
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}),
|
|
166
|
+
fetch: (query) => {
|
|
167
|
+
query = {
|
|
168
|
+
...query,
|
|
169
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
170
|
+
};
|
|
171
|
+
return this.loadCrons(query)
|
|
172
|
+
.pipe(map((crons) => ({
|
|
173
|
+
data: crons
|
|
174
|
+
.map((cron) => {
|
|
175
|
+
return {
|
|
176
|
+
...cron,
|
|
177
|
+
runningDuration: differenceInSeconds(parse(cron.createDate), new Date()),
|
|
178
|
+
};
|
|
179
|
+
}),
|
|
180
|
+
})));
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
if (this.bulk) {
|
|
184
|
+
this.config.selection = {
|
|
185
|
+
selectAll: false,
|
|
186
|
+
actions: [
|
|
187
|
+
{
|
|
188
|
+
type: SelectionActionType.Action,
|
|
189
|
+
name: 'disable',
|
|
190
|
+
label: 'Disable',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: SelectionActionType.Action,
|
|
194
|
+
name: 'enable',
|
|
195
|
+
label: 'Enable',
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
actionSelected: (action) => {
|
|
199
|
+
return this.bulk(action.action.name, action.selected)
|
|
200
|
+
.pipe(tap(() => {
|
|
201
|
+
this.list.reload();
|
|
202
|
+
this._message.success('Applied Changes');
|
|
203
|
+
}));
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
CronsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CronsComponent, deps: [{ token: i1.FsMessage }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
|
|
210
|
+
CronsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CronsComponent, selector: "fs-system-crons", inputs: { enable: "enable", disable: "disable", kill: "kill", queue: "queue", run: "run", loadCrons: "loadCrons", loadCron: "loadCron", loadCronLogs: "loadCronLogs", bulk: "bulk" }, viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true, static: true }], ngImport: i0, template: "<fs-list [config]=\"config\">\n <fs-list-column>\n <ng-template fs-list-header>Name</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"open(row)\">{{row.name}}</a>\n <div *ngIf=\"row.cronSetting\">\n <small>{{row.cronSetting.summary}}</small>\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column align=\"center\">\n <ng-template fs-list-header>Status</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.host || row.processId; else status\">\n <fs-popover \n [maxWidth]=\"null\"\n [template]=\"statusPopover\" \n [indication]=\"true\"\n size=\"small\">\n <ng-container *ngTemplateOutlet=\"status\"></ng-container>\n </fs-popover>\n <ng-template #statusPopover>\n <div *ngIf=\"row.host\">Host: {{row.host}}</div>\n <div *ngIf=\"row.processId\">Process ID: {{row.processId}}</div>\n <div *ngIf=\"row.processState\">Process State: {{CronProcessStates[row.processState]}}</div>\n </ng-template>\n </ng-container>\n <ng-template #status>\n {{CronStates[row.state]}}\n </ng-template>\n <ng-container *ngIf=\"row.state === CronState.Running\">\n <div class=\"small\">\n Duration: {{ row.runningDuration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-container> \n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Last Ran</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n <div class=\"small\" *ngIf=\"row.duration\">\n Duration: {{ row.duration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-template>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Next Run</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== CronState.Disabled\">\n <app-next-run [cron]=\"row\"></app-next-run>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Timeout Hours</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.cronSetting.timeout}}\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.FsDateAgoComponent, selector: "fs-date-ago", inputs: ["date", "showTime", "format", "showTooltip", "tooltipDateFormat"] }, { kind: "component", type: i6.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i6.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { kind: "directive", type: i6.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i6.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { kind: "component", type: i7.FsPopoverComponent, selector: "fs-popover" }, { kind: "component", type: i8.CronNextRunComponent, selector: "app-next-run", inputs: ["cron"] }, { kind: "pipe", type: i5.FsDateDurationPipe, name: "fsDateDuration" }] });
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CronsComponent, decorators: [{
|
|
212
|
+
type: Component,
|
|
213
|
+
args: [{ selector: 'fs-system-crons', template: "<fs-list [config]=\"config\">\n <fs-list-column>\n <ng-template fs-list-header>Name</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"open(row)\">{{row.name}}</a>\n <div *ngIf=\"row.cronSetting\">\n <small>{{row.cronSetting.summary}}</small>\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column align=\"center\">\n <ng-template fs-list-header>Status</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.host || row.processId; else status\">\n <fs-popover \n [maxWidth]=\"null\"\n [template]=\"statusPopover\" \n [indication]=\"true\"\n size=\"small\">\n <ng-container *ngTemplateOutlet=\"status\"></ng-container>\n </fs-popover>\n <ng-template #statusPopover>\n <div *ngIf=\"row.host\">Host: {{row.host}}</div>\n <div *ngIf=\"row.processId\">Process ID: {{row.processId}}</div>\n <div *ngIf=\"row.processState\">Process State: {{CronProcessStates[row.processState]}}</div>\n </ng-template>\n </ng-container>\n <ng-template #status>\n {{CronStates[row.state]}}\n </ng-template>\n <ng-container *ngIf=\"row.state === CronState.Running\">\n <div class=\"small\">\n Duration: {{ row.runningDuration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-container> \n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Last Ran</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n <div class=\"small\" *ngIf=\"row.duration\">\n Duration: {{ row.duration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-template>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Next Run</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== CronState.Disabled\">\n <app-next-run [cron]=\"row\"></app-next-run>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Timeout Hours</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.cronSetting.timeout}}\n </ng-template>\n </fs-list-column>\n</fs-list>\n" }]
|
|
214
|
+
}], ctorParameters: function () { return [{ type: i1.FsMessage }, { type: i2.MatDialog }, { type: i3.FsPrompt }]; }, propDecorators: { list: [{
|
|
215
|
+
type: ViewChild,
|
|
216
|
+
args: [FsListComponent, { static: true }]
|
|
217
|
+
}], enable: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], disable: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], kill: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], queue: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], run: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], loadCrons: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], loadCron: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}], loadCronLogs: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], bulk: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}] } });
|
|
236
236
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL2Nyb25zL2Nyb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9ucy9jcm9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBd0IsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFF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QUFwQixLQUFLO2dCQUNVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTGlzdEFjdGlvblNlbGVjdGVkLCBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL2xpc3QnO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25BY3Rpb25UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5TZWNvbmRzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBDcm9uUHJvY2Vzc1N0YXRlcywgQ3JvblN0YXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0cyc7XG5pbXBvcnQgeyBDcm9uU3RhdGUgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBpbmRleE5hbWVWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXgtbmFtZS12YWx1ZSc7XG5pbXBvcnQgeyBDcm9uQ29tcG9uZW50IH0gZnJvbSAnLi4vY3Jvbi9jcm9uLmNvbXBvbmVudCc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtc3lzdGVtLWNyb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nyb25zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JvbnMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBsaXN0OiBGc0xpc3RDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgcHVibGljIGVuYWJsZTogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZTogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMga2lsbDogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgcXVldWU6IChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgcHVibGljIHJ1bjogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZENyb25zOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueVtdPjtcbiAgQElucHV0KCkgcHVibGljIGxvYWRDcm9uOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkQ3JvbkxvZ3M6IChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8eyBkYXRhOiBhbnlbXTsgcGFnaW5nOiBhbnkgfT47XG4gIEBJbnB1dCgpIHB1YmxpYyBidWxrOiAoYWN0aW9uTmFtZTogc3RyaW5nLCBkYXRhOiBhbnlbXSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIHB1YmxpYyBjb25maWc6IEZzTGlzdENvbmZpZyA9IG51bGw7XG4gIHB1YmxpYyBDcm9uU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQ3JvblN0YXRlcyk7XG4gIHB1YmxpYyBDcm9uUHJvY2Vzc1N0YXRlcyA9IGluZGV4TmFtZVZhbHVlKENyb25Qcm9jZXNzU3RhdGVzKTtcbiAgcHVibGljIENyb25TdGF0ZSA9IENyb25TdGF0ZTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgX3Byb21wdDogRnNQcm9tcHQsXG4gICkgeyB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbmZpZ0xpc3QoKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKGNyb24pIHtcbiAgICB0aGlzLl9kaWFsb2cub3BlbihDcm9uQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNyb24sXG4gICAgICAgIGxvYWRDcm9uTG9nczogdGhpcy5sb2FkQ3JvbkxvZ3MsXG4gICAgICAgIGxvYWRDcm9uOiB0aGlzLmxvYWRDcm9uLFxuICAgICAgICBjcm9uQWN0aW9uczogdGhpcy5nZXRDcm9uQWN0aW9ucygpLFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiAnODUlJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcm9uQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBhY3Rpb246IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoZGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUXVldWVkIGNyb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6ICdRdWV1ZScsXG4gICAgICAgIHNob3c6IChjcm9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5JZGxlIHx8IGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5GYWlsZWQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhY3Rpb246IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucnVuKGRhdGEpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0Nyb24gcmFuJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsOiAnUnVuJyxcbiAgICAgICAgc2hvdzogKGNyb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLklkbGUgfHwgY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLkZhaWxlZDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGUoZGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnRW5hYmxlZCBjcm9uJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsOiAnRW5hYmxlJyxcbiAgICAgICAgc2hvdzogKGNyb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLkRpc2FibGVkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGUoZGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnRGlzYWJsZWQgY3JvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBsYWJlbDogJ0Rpc2FibGUnLFxuICAgICAgICBzaG93OiAoY3JvbikgPT4ge1xuICAgICAgICAgIHJldHVybiBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuSWRsZSB8fCBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuRmFpbGVkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICAgICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgICAgICAgdGVtcGxhdGU6ICdBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8ga2lsbCB0aGUgY3Jvbj8nLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5raWxsKGRhdGEpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0tpbGxlZCBjcm9uJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsOiAnS2lsbCcsXG4gICAgICAgIHNob3c6IChjcm9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5SdW5uaW5nO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICAgICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgICAgICAgdGVtcGxhdGU6ICdBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gcmVzZXQgdGhlIGNyb24/JyxcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlKGRhdGEpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1Jlc2V0IGNyb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6ICdSZXNldCcsXG4gICAgICAgIHNob3c6IChjcm9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5LaWxsaW5nIHx8IGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5SdW5uaW5nIHx8IGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5GYWlsZWQgfHwgY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLlF1ZXVlZDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZ0xpc3QoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBwYWdpbmc6IGZhbHNlLFxuICAgICAgZmlsdGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgICBuYW1lOiAna2V5d29yZCcsXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJvd0FjdGlvbnM6IHRoaXMuZ2V0Q3JvbkFjdGlvbnMoKVxuICAgICAgICAubWFwKChyb3dBY3Rpb24pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucm93QWN0aW9uLFxuICAgICAgICAgICAgY2xpY2s6IChjcm9uKSA9PiB7XG4gICAgICAgICAgICAgIHJvd0FjdGlvbi5hY3Rpb24oY3JvbilcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgZmV0Y2g6IChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeSA9IHsgXG4gICAgICAgICAgLi4ucXVlcnksXG4gICAgICAgICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ3JvbnMocXVlcnkpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGNyb25zKSA9PiAoe1xuICAgICAgICAgICAgICBkYXRhOiBjcm9uc1xuICAgICAgICAgICAgICAgIC5tYXAoKGNyb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNyb24sXG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdEdXJhdGlvbjogZGlmZmVyZW5jZUluU2Vjb25kcyhwYXJzZShjcm9uLmNyZWF0ZURhdGUpLCBuZXcgRGF0ZSgpKSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmKHRoaXMuYnVsaykge1xuICAgICAgdGhpcy5jb25maWcuc2VsZWN0aW9uID0ge1xuICAgICAgICBzZWxlY3RBbGw6IGZhbHNlLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogU2VsZWN0aW9uQWN0aW9uVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICBuYW1lOiAnZGlzYWJsZScsXG4gICAgICAgICAgICBsYWJlbDogJ0Rpc2FibGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogU2VsZWN0aW9uQWN0aW9uVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICBuYW1lOiAnZW5hYmxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25TZWxlY3RlZDogKGFjdGlvbjogRnNMaXN0QWN0aW9uU2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWxrKGFjdGlvbi5hY3Rpb24ubmFtZSwgYWN0aW9uLnNlbGVjdGVkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQXBwbGllZCBDaGFuZ2VzJyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCI8ZnMtbGlzdCBbY29uZmlnXT1cImNvbmZpZ1wiPlxuICA8ZnMtbGlzdC1jb2x1bW4+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPk5hbWU8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgPGEgKGNsaWNrKT1cIm9wZW4ocm93KVwiPnt7cm93Lm5hbWV9fTwvYT5cbiAgICAgIDxkaXYgKm5nSWY9XCJyb3cuY3JvblNldHRpbmdcIj5cbiAgICAgICAgPHNtYWxsPnt7cm93LmNyb25TZXR0aW5nLnN1bW1hcnl9fTwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuICA8ZnMtbGlzdC1jb2x1bW4gYWxpZ249XCJjZW50ZXJcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+U3RhdHVzPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cuaG9zdCB8fCByb3cucHJvY2Vzc0lkOyBlbHNlIHN0YXR1c1wiPlxuICAgICAgICA8ZnMtcG9wb3ZlciBcbiAgICAgICAgICAgIFttYXhXaWR0aF09XCJudWxsXCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJzdGF0dXNQb3BvdmVyXCIgXG4gICAgICAgICAgICBbaW5kaWNhdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N0YXR1c1BvcG92ZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5ob3N0XCI+SG9zdDoge3tyb3cuaG9zdH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5wcm9jZXNzSWRcIj5Qcm9jZXNzIElEOiB7e3Jvdy5wcm9jZXNzSWR9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucHJvY2Vzc1N0YXRlXCI+UHJvY2VzcyBTdGF0ZToge3tDcm9uUHJvY2Vzc1N0YXRlc1tyb3cucHJvY2Vzc1N0YXRlXX19PC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzPlxuICAgICAgICB7e0Nyb25TdGF0ZXNbcm93LnN0YXRlXX19XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy5zdGF0ZSA9PT0gQ3JvblN0YXRlLlJ1bm5pbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgRHVyYXRpb246IHt7IHJvdy5ydW5uaW5nRHVyYXRpb24gfCBmc0RhdGVEdXJhdGlvbjogeyBob3VyczogdHJ1ZSwgbWludXRlczogdHJ1ZSwgc2Vjb25kczogdHJ1ZSB9IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+ICAgICAgXG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5MYXN0IFJhbjwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmR1cmF0aW9uPT09bnVsbDsgZWxzZSBsYXN0UmFuXCI+XG4gICAgICAgIE5ldmVyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdFJhbj5cbiAgICAgICAgPGZzLWRhdGUtYWdvIFtkYXRlXT1cInJvdy5jcmVhdGVEYXRlXCI+PC9mcy1kYXRlLWFnbz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgKm5nSWY9XCJyb3cuZHVyYXRpb25cIj5cbiAgICAgICAgICBEdXJhdGlvbjoge3sgcm93LmR1cmF0aW9uIHwgZnNEYXRlRHVyYXRpb246IHsgaG91cnM6IHRydWUsIG1pbnV0ZXM6IHRydWUsIHNlY29uZHM6IHRydWUgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5OZXh0IFJ1bjwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnN0YXRlICE9PSBDcm9uU3RhdGUuRGlzYWJsZWRcIj5cbiAgICAgICAgPGFwcC1uZXh0LXJ1biBbY3Jvbl09XCJyb3dcIj48L2FwcC1uZXh0LXJ1bj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+VGltZW91dCBIb3VyczwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICB7e3Jvdy5jcm9uU2V0dGluZy50aW1lb3V0fX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuPC9mcy1saXN0PlxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './crons.component';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './crons.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvY3JvbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY3JvbnMuY29tcG9uZW50JztcbiJdfQ==
|