@yuuvis/client-shell-core 2.20.1 → 3.0.0-beta.20.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/esm2022/index.js +15 -0
- package/esm2022/index.js.map +1 -0
- package/esm2022/lib/client-shell.assets.js +12 -0
- package/esm2022/lib/client-shell.assets.js.map +1 -0
- package/esm2022/lib/models/client-shell.interface.js +5 -0
- package/esm2022/lib/models/client-shell.interface.js.map +1 -0
- package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js +94 -0
- package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js.map +1 -0
- package/esm2022/lib/services/command-palette/command-palette.interface.js +2 -0
- package/esm2022/lib/services/command-palette/command-palette.interface.js.map +1 -0
- package/esm2022/lib/services/command-palette/command-palette.service.js +120 -0
- package/esm2022/lib/services/command-palette/command-palette.service.js.map +1 -0
- package/esm2022/lib/services/feature/feature.guard.js +9 -0
- package/esm2022/lib/services/feature/feature.guard.js.map +1 -0
- package/esm2022/lib/services/feature/feature.interface.js +2 -0
- package/esm2022/lib/services/feature/feature.interface.js.map +1 -0
- package/esm2022/lib/services/feature/feature.providers.js +14 -0
- package/esm2022/lib/services/feature/feature.providers.js.map +1 -0
- package/esm2022/lib/services/feature/feature.service.js +141 -0
- package/esm2022/lib/services/feature/feature.service.js.map +1 -0
- package/esm2022/lib/services/feature/index.js +5 -0
- package/esm2022/lib/services/feature/index.js.map +1 -0
- package/esm2022/lib/services/shell/noop.extension.js +13 -0
- package/esm2022/lib/services/shell/noop.extension.js.map +1 -0
- package/esm2022/lib/services/shell/requirements.parser.js +7 -0
- package/esm2022/lib/services/shell/requirements.parser.js.map +1 -0
- package/esm2022/lib/services/shell/shell.bootstrap.js +84 -0
- package/esm2022/lib/services/shell/shell.bootstrap.js.map +1 -0
- package/esm2022/lib/services/shell/shell.providers.js +20 -0
- package/esm2022/lib/services/shell/shell.providers.js.map +1 -0
- package/esm2022/lib/services/shell/shell.service.js +455 -0
- package/esm2022/lib/services/shell/shell.service.js.map +1 -0
- package/esm2022/lib/services/shell-config/shell-config.const.js +17 -0
- package/esm2022/lib/services/shell-config/shell-config.const.js.map +1 -0
- package/esm2022/lib/services/shell-config/shell-config.interface.js +2 -0
- package/esm2022/lib/services/shell-config/shell-config.interface.js.map +1 -0
- package/esm2022/lib/services/shell-config/shell-config.service.js +100 -0
- package/esm2022/lib/services/shell-config/shell-config.service.js.map +1 -0
- package/esm2022/lib/services/shell-notifications/shell-notifications.interface.js +2 -0
- package/esm2022/lib/services/shell-notifications/shell-notifications.interface.js.map +1 -0
- package/esm2022/lib/services/shell-notifications/shell-notifications.service.js +84 -0
- package/esm2022/lib/services/shell-notifications/shell-notifications.service.js.map +1 -0
- package/esm2022/lib/tile-extension.interface.js +2 -0
- package/esm2022/lib/tile-extension.interface.js.map +1 -0
- package/esm2022/yuuvis-client-shell-core.js +5 -0
- package/esm2022/yuuvis-client-shell-core.js.map +1 -0
- package/lib/services/command-palette/command-palette/command-palette.component.d.ts +2 -2
- package/package.json +10 -10
- package/yuuvis-client-shell-core.d.ts +5 -0
- package/esm2022/index.mjs +0 -15
- package/esm2022/lib/client-shell.assets.mjs +0 -12
- package/esm2022/lib/models/client-shell.interface.mjs +0 -5
- package/esm2022/lib/services/command-palette/command-palette/command-palette.component.mjs +0 -101
- package/esm2022/lib/services/command-palette/command-palette.interface.mjs +0 -2
- package/esm2022/lib/services/command-palette/command-palette.service.mjs +0 -120
- package/esm2022/lib/services/feature/feature.guard.mjs +0 -9
- package/esm2022/lib/services/feature/feature.interface.mjs +0 -2
- package/esm2022/lib/services/feature/feature.providers.mjs +0 -14
- package/esm2022/lib/services/feature/feature.service.mjs +0 -141
- package/esm2022/lib/services/feature/index.mjs +0 -5
- package/esm2022/lib/services/shell/noop.extension.mjs +0 -13
- package/esm2022/lib/services/shell/requirements.parser.mjs +0 -7
- package/esm2022/lib/services/shell/shell.bootstrap.mjs +0 -84
- package/esm2022/lib/services/shell/shell.providers.mjs +0 -20
- package/esm2022/lib/services/shell/shell.service.mjs +0 -456
- package/esm2022/lib/services/shell-config/shell-config.const.mjs +0 -17
- package/esm2022/lib/services/shell-config/shell-config.interface.mjs +0 -2
- package/esm2022/lib/services/shell-config/shell-config.service.mjs +0 -100
- package/esm2022/lib/services/shell-notifications/shell-notifications.interface.mjs +0 -2
- package/esm2022/lib/services/shell-notifications/shell-notifications.service.mjs +0 -84
- package/esm2022/lib/tile-extension.interface.mjs +0 -2
- package/esm2022/yuuvis-client-shell-core.mjs +0 -5
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { inject, provideAppInitializer } from '@angular/core';
|
|
2
|
-
import { FeatureService } from '../feature/feature.service';
|
|
3
|
-
import { NoopExtension } from './noop.extension';
|
|
4
|
-
export const importShellExtensions = (extensionImports) => {
|
|
5
|
-
const providers = [];
|
|
6
|
-
// TODO: find proper way of typing
|
|
7
|
-
const ne = NoopExtension;
|
|
8
|
-
providers.push(ne);
|
|
9
|
-
extensionImports.forEach((extensionImport) => {
|
|
10
|
-
providers.push(extensionImport.extension);
|
|
11
|
-
providers.push(provideAppInitializer(() => {
|
|
12
|
-
const e = inject(FeatureService).canUseFeatureById(extensionImport.id)
|
|
13
|
-
? extensionImport.extension
|
|
14
|
-
: NoopExtension;
|
|
15
|
-
return inject(e).init();
|
|
16
|
-
}));
|
|
17
|
-
});
|
|
18
|
-
return providers;
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwucHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC9zaGVsbC5wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixNQUFNLEVBQUUscUJBQXFCLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRW5HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxnQkFBd0MsRUFBMEIsRUFBRTtJQUN4RyxNQUFNLFNBQVMsR0FBMkIsRUFBRSxDQUFDO0lBQzdDLGtDQUFrQztJQUNsQyxNQUFNLEVBQUUsR0FBRyxhQUFvQixDQUFDO0lBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBMEIsQ0FBQyxDQUFDO0lBQzNDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFO1FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQTRDLENBQUMsQ0FBQztRQUM3RSxTQUFTLENBQUMsSUFBSSxDQUNaLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUN6QixNQUFNLENBQUMsR0FBd0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pHLENBQUMsQ0FBRSxlQUFlLENBQUMsU0FBaUQ7Z0JBQ3BFLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDbEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIGluamVjdCwgcHJvdmlkZUFwcEluaXRpYWxpemVyLCBQcm92aWRlclRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbGllbnRTaGVsbEV4dGVuc2lvbiwgU2hlbGxFeHRlbnNpb25JbXBvcnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2xpZW50LXNoZWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGZWF0dXJlU2VydmljZSB9IGZyb20gJy4uL2ZlYXR1cmUvZmVhdHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vb3BFeHRlbnNpb24gfSBmcm9tICcuL25vb3AuZXh0ZW5zaW9uJztcblxuZXhwb3J0IGNvbnN0IGltcG9ydFNoZWxsRXh0ZW5zaW9ucyA9IChleHRlbnNpb25JbXBvcnRzOiBTaGVsbEV4dGVuc2lvbkltcG9ydFtdKTogRW52aXJvbm1lbnRQcm92aWRlcnNbXSA9PiB7XG4gIGNvbnN0IHByb3ZpZGVyczogRW52aXJvbm1lbnRQcm92aWRlcnNbXSA9IFtdO1xuICAvLyBUT0RPOiBmaW5kIHByb3BlciB3YXkgb2YgdHlwaW5nXG4gIGNvbnN0IG5lID0gTm9vcEV4dGVuc2lvbiBhcyBhbnk7XG4gIHByb3ZpZGVycy5wdXNoKG5lIGFzIEVudmlyb25tZW50UHJvdmlkZXJzKTtcbiAgZXh0ZW5zaW9uSW1wb3J0cy5mb3JFYWNoKChleHRlbnNpb25JbXBvcnQpID0+IHtcbiAgICBwcm92aWRlcnMucHVzaChleHRlbnNpb25JbXBvcnQuZXh0ZW5zaW9uIGFzIHVua25vd24gYXMgRW52aXJvbm1lbnRQcm92aWRlcnMpO1xuICAgIHByb3ZpZGVycy5wdXNoKFxuICAgICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgICAgY29uc3QgZTogUHJvdmlkZXJUb2tlbjxDbGllbnRTaGVsbEV4dGVuc2lvbj4gPSBpbmplY3QoRmVhdHVyZVNlcnZpY2UpLmNhblVzZUZlYXR1cmVCeUlkKGV4dGVuc2lvbkltcG9ydC5pZClcbiAgICAgICAgICA/IChleHRlbnNpb25JbXBvcnQuZXh0ZW5zaW9uIGFzIFByb3ZpZGVyVG9rZW48Q2xpZW50U2hlbGxFeHRlbnNpb24+KVxuICAgICAgICAgIDogTm9vcEV4dGVuc2lvbjtcbiAgICAgICAgcmV0dXJuIGluamVjdChlKS5pbml0KCk7XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gcHJvdmlkZXJzO1xufTtcbiJdfQ==
|
|
@@ -1,456 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { inject, Injectable, signal } from '@angular/core';
|
|
3
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
-
import { MatIconRegistry } from '@angular/material/icon';
|
|
5
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
6
|
-
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
|
7
|
-
import { ApiBase, BaseObjectTypeField, ConfigService, DmsService, SystemService, SystemType, TranslateService, UserService, Utils } from '@yuuvis/client-core';
|
|
8
|
-
import { BehaviorSubject, debounceTime, filter, first, firstValueFrom, fromEvent, map, of, tap } from 'rxjs';
|
|
9
|
-
import { CLIENT_SHELL_ASSETS } from '../../client-shell.assets';
|
|
10
|
-
import { SHELL_CONFIG_TYPES } from '../shell-config/shell-config.const';
|
|
11
|
-
import { ShellConfigService } from '../shell-config/shell-config.service';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
export class ShellService {
|
|
14
|
-
#dmsService;
|
|
15
|
-
#dialog;
|
|
16
|
-
#system;
|
|
17
|
-
#userService;
|
|
18
|
-
// TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace
|
|
19
|
-
// #iconRegistry = inject(YuvMatIconRegistry);
|
|
20
|
-
#iconRegistry;
|
|
21
|
-
#shellConfig;
|
|
22
|
-
#configService;
|
|
23
|
-
#sanitizer;
|
|
24
|
-
#router;
|
|
25
|
-
#route;
|
|
26
|
-
#DOCUMENT;
|
|
27
|
-
// Apps can register their own setting components to be shown in shell settings
|
|
28
|
-
#appSettings;
|
|
29
|
-
#defaultShellConfig;
|
|
30
|
-
constructor() {
|
|
31
|
-
this.#dmsService = inject(DmsService);
|
|
32
|
-
this.#dialog = inject(MatDialog);
|
|
33
|
-
this.#system = inject(SystemService);
|
|
34
|
-
this.#userService = inject(UserService);
|
|
35
|
-
// TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace
|
|
36
|
-
// #iconRegistry = inject(YuvMatIconRegistry);
|
|
37
|
-
this.#iconRegistry = inject(MatIconRegistry);
|
|
38
|
-
this.#shellConfig = inject(ShellConfigService);
|
|
39
|
-
this.#configService = inject(ConfigService);
|
|
40
|
-
this.#sanitizer = inject(DomSanitizer);
|
|
41
|
-
this.#router = inject(Router);
|
|
42
|
-
this.#route = inject(ActivatedRoute);
|
|
43
|
-
this.#DOCUMENT = inject(DOCUMENT);
|
|
44
|
-
this.translate = inject(TranslateService);
|
|
45
|
-
this._busyCount = 0;
|
|
46
|
-
this.isBusySubject = new BehaviorSubject(false);
|
|
47
|
-
this.isBusy$ = this.isBusySubject.asObservable().pipe(debounceTime(500));
|
|
48
|
-
// Apps can register their own setting components to be shown in shell settings
|
|
49
|
-
this.#appSettings = signal([]);
|
|
50
|
-
this.appSettings = this.#appSettings.asReadonly();
|
|
51
|
-
this.appBaseRoutes = {};
|
|
52
|
-
this.#defaultShellConfig = {
|
|
53
|
-
appIcon: CLIENT_SHELL_ASSETS.appIcon,
|
|
54
|
-
shellIconNamespace: CLIENT_SHELL_ASSETS.shellIconNamespace
|
|
55
|
-
};
|
|
56
|
-
this.shellConfig = signal(this.#defaultShellConfig);
|
|
57
|
-
this.apps = signal([]);
|
|
58
|
-
/** TODO: implement this feature ????
|
|
59
|
-
* Global shortcuts are captured by the shell to provide a consistent experience
|
|
60
|
-
* accross all apps. Search is one example. Apps should not define their own shourtcuts
|
|
61
|
-
* for search. Instead they should subscribe to the global shortcuts and initialize their
|
|
62
|
-
* search based on the global search shortcut.
|
|
63
|
-
*/
|
|
64
|
-
this.globalShortcuts$ = fromEvent(document, 'keydown').pipe(map((e) => {
|
|
65
|
-
// global shortcut for search
|
|
66
|
-
// if (e.ctrlKey && e.code === 'KeyF') {
|
|
67
|
-
// e.preventDefault();
|
|
68
|
-
// return GlobalShortcut.search;
|
|
69
|
-
// }
|
|
70
|
-
return undefined;
|
|
71
|
-
}), filter((s) => s !== undefined), map((s) => s));
|
|
72
|
-
this._extensions = {};
|
|
73
|
-
this._objectFlavors = [];
|
|
74
|
-
this._objectCreateFlavors = [];
|
|
75
|
-
this.translate.onLangChange.subscribe(() => {
|
|
76
|
-
this.apps.set(this.#getMappedApps(this.apps()));
|
|
77
|
-
});
|
|
78
|
-
// track open dialogs in an auxillary route to support closing them on back navigation
|
|
79
|
-
// as this is the expected behaviour on mobile devices
|
|
80
|
-
this.#dialog.afterOpened.subscribe((ref) => {
|
|
81
|
-
this.#router.navigate([{ outlets: { dt: ['dialogs', this.#dialog.openDialogs.map((d, i) => i).join('-')] } }], {
|
|
82
|
-
// replaceUrl: true,
|
|
83
|
-
queryParamsHandling: 'preserve'
|
|
84
|
-
});
|
|
85
|
-
ref.afterClosed().subscribe((res) => {
|
|
86
|
-
if (res?.closedByRoute)
|
|
87
|
-
return;
|
|
88
|
-
const openDialogs = this.#dialog.openDialogs.filter((d) => d.id !== ref.id);
|
|
89
|
-
// having no open dialogs, clear the auxillary route
|
|
90
|
-
const param = openDialogs.length > 0 ? ['dialogs', openDialogs.map((d, i) => i).join('-')] : null;
|
|
91
|
-
this.#router.navigate([{ outlets: { dt: param } }], { replaceUrl: true, queryParamsHandling: 'preserve' });
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
this.#router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe((e) => {
|
|
95
|
-
// when navigating and having no open dialogs, clear the auxillary route from the url
|
|
96
|
-
if (this.#dialog.openDialogs.length === 0 && e.urlAfterRedirects.match(/(dt:[.]*)/)) {
|
|
97
|
-
this.#router.navigate([{ outlets: { dt: null } }], { replaceUrl: true, queryParamsHandling: 'preserve' });
|
|
98
|
-
}
|
|
99
|
-
// if there are open dialogs and the primary route changed, close all open dialogs
|
|
100
|
-
if (this.#dialog.openDialogs.length > 0) {
|
|
101
|
-
if (this.primaryRouteChanged(this.#router.getCurrentNavigation())) {
|
|
102
|
-
this.#dialog.openDialogs.forEach((d) => d.close());
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
#getPrimaryRoute(nav) {
|
|
108
|
-
if (!nav)
|
|
109
|
-
return undefined;
|
|
110
|
-
const url = nav.finalUrl || nav.extractedUrl;
|
|
111
|
-
const urlTreeChildren = url.root.children['primary'];
|
|
112
|
-
return urlTreeChildren ? urlTreeChildren.segments.map((s) => s.path).join('/') : undefined;
|
|
113
|
-
}
|
|
114
|
-
primaryRouteChanged(nav) {
|
|
115
|
-
const previousNav = nav?.previousNavigation || null;
|
|
116
|
-
return this.#getPrimaryRoute(nav) !== this.#getPrimaryRoute(previousNav);
|
|
117
|
-
}
|
|
118
|
-
pickFile() {
|
|
119
|
-
const input = this.#DOCUMENT.createElement('input');
|
|
120
|
-
input.type = 'file';
|
|
121
|
-
input.click();
|
|
122
|
-
return fromEvent(input, 'change').pipe(map((e) => e.target.files?.[0] || null), tap(() => {
|
|
123
|
-
input.remove();
|
|
124
|
-
}));
|
|
125
|
-
}
|
|
126
|
-
setShellConfig(csc) {
|
|
127
|
-
this.shellConfig.update((sc) => ({
|
|
128
|
-
appIcon: csc.appIcon ?? sc.appIcon,
|
|
129
|
-
shellIconNamespace: csc.shellIconNamespace ?? sc.shellIconNamespace
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
setApps(apps) {
|
|
133
|
-
this.apps.set(this.#getMappedApps(apps));
|
|
134
|
-
const appBaseRoutes = {};
|
|
135
|
-
apps.forEach((a) => (appBaseRoutes[a.id] = a.path || ''));
|
|
136
|
-
this.appBaseRoutes = appBaseRoutes;
|
|
137
|
-
}
|
|
138
|
-
#getMappedApps(apps) {
|
|
139
|
-
return apps.map((a) => {
|
|
140
|
-
const ma = {
|
|
141
|
-
...a,
|
|
142
|
-
title: this.#getAppTitle(a)
|
|
143
|
-
};
|
|
144
|
-
if (a.options?.appClaimKey) {
|
|
145
|
-
ma.options = { ...ma.options, appClaim: this.#getAppClaim(a.options.appClaimKey) || a.options.appClaim };
|
|
146
|
-
}
|
|
147
|
-
return ma;
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
#getAppTitle(a) {
|
|
151
|
-
const translatedTitle = this.translate.instant(a.id);
|
|
152
|
-
return translatedTitle && !translatedTitle.startsWith('!missing') ? translatedTitle : a.title || '';
|
|
153
|
-
}
|
|
154
|
-
#getAppClaim(claimKey) {
|
|
155
|
-
const translatedClaim = this.translate.instant(claimKey);
|
|
156
|
-
return translatedClaim && !translatedClaim.startsWith('!missing') ? translatedClaim : undefined;
|
|
157
|
-
}
|
|
158
|
-
getApp(id) {
|
|
159
|
-
return this.apps().find((a) => id === a.id);
|
|
160
|
-
}
|
|
161
|
-
getApps(ids = []) {
|
|
162
|
-
return ids.length ? this.apps().filter((a) => ids.includes(a.id)) : this.apps();
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Register settings for apps to hook into shell settings page.
|
|
166
|
-
* @param appID ID of the app that exposes the settings
|
|
167
|
-
* @param cfg ShellAppSettings object containing the settings component
|
|
168
|
-
*/
|
|
169
|
-
registerAppSettings(cfg) {
|
|
170
|
-
this.#appSettings.set([...this.#appSettings(), cfg]);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Load persisted settings for a specific app
|
|
174
|
-
* @param appID ID of the app to load the settings for
|
|
175
|
-
*/
|
|
176
|
-
usersAppSettings$(appID) {
|
|
177
|
-
return this.#userService.user$.pipe(map((u) => {
|
|
178
|
-
return u && u.userSettings.clientAppSettings ? u.userSettings.clientAppSettings[appID] : undefined;
|
|
179
|
-
}));
|
|
180
|
-
}
|
|
181
|
-
saveUsersAppSettings(appID, settings) {
|
|
182
|
-
return this.#userService.saveUserSettings({ clientAppSettings: { [appID]: settings } });
|
|
183
|
-
}
|
|
184
|
-
addBusy() {
|
|
185
|
-
if (this._busyCount === 0) {
|
|
186
|
-
this.isBusySubject.next(true);
|
|
187
|
-
}
|
|
188
|
-
this._busyCount++;
|
|
189
|
-
}
|
|
190
|
-
removeBusy() {
|
|
191
|
-
this._busyCount--;
|
|
192
|
-
if (this._busyCount === 0) {
|
|
193
|
-
this.isBusySubject.next(false);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Exposes object create flavors to the shell.
|
|
198
|
-
* Thes flavors describe different ways of how objects can be created. So apps
|
|
199
|
-
* can register custom ways of creating objects that can then be used by other apps.
|
|
200
|
-
* @param flavors Create flavors to be exposed
|
|
201
|
-
*/
|
|
202
|
-
exposeObjectCreateFlavors(flavors) {
|
|
203
|
-
flavors.forEach((flavor) => {
|
|
204
|
-
const idx = this._objectCreateFlavors.findIndex((f) => f.id === flavor.id);
|
|
205
|
-
if (idx === -1)
|
|
206
|
-
this._objectCreateFlavors.push(flavor);
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Remove object create flavors from the shells registry
|
|
211
|
-
* @param flavors Create flavors to be removed
|
|
212
|
-
*/
|
|
213
|
-
concealObjectCreateFlavors(flavors) {
|
|
214
|
-
const fid = flavors.map((f) => f.id);
|
|
215
|
-
this._objectCreateFlavors = this._objectCreateFlavors.filter((f) => !fid.includes(f.id));
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Get all registerd object create flavors
|
|
219
|
-
*/
|
|
220
|
-
getObjectCreateFlavors() {
|
|
221
|
-
return this._objectCreateFlavors;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Exposes a list of object flavors to the shell.
|
|
225
|
-
* Flavors are able to be applied to objects and add new metadata properties to them.
|
|
226
|
-
* @param flavors Array of flavors to be exposed
|
|
227
|
-
* @param app Optional ID of the app that exposes the flavors (defaults to 'global' if not provided)
|
|
228
|
-
* @param origin Optional origin of the flavors. Flavors could be added by apps or derived
|
|
229
|
-
* from a configuration (defaults to 'app' if not provided)
|
|
230
|
-
*/
|
|
231
|
-
exposeObjectFlavors(flavors, app = 'global', origin = 'app') {
|
|
232
|
-
flavors.forEach((f) => this.exposeObjectFlavor(f, app, origin));
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Removes exposed object flavors from the shell.
|
|
236
|
-
* @param flavors Array of flavors to be concealed
|
|
237
|
-
*/
|
|
238
|
-
concealObjectFlavors(flavors, app = 'global') {
|
|
239
|
-
flavors.forEach((f) => this.concealObjectFlavor(f, app));
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Exposes an object flavor to the shell. Flavors are able to be applied to objects
|
|
243
|
-
* in order to add a new aspect to them. An object containing an image for example could
|
|
244
|
-
* be added a flavor of 'EXIF Data' that will add the corresponding SOT to it. This way the
|
|
245
|
-
* object gets new metadata properties. If supported, these metadata could even be extracted
|
|
246
|
-
* from the file and filled out automatically.
|
|
247
|
-
* @param flavor The flavor object to be exposed
|
|
248
|
-
* @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)
|
|
249
|
-
* @param origin Optional origin of the flavors. Flavors could be added by apps or derived
|
|
250
|
-
* from a configuration (defaults to 'app' if not provided)
|
|
251
|
-
*/
|
|
252
|
-
exposeObjectFlavor(flavor, app = 'global', origin = 'app') {
|
|
253
|
-
const idx = this._objectFlavors.findIndex((f) => f.id === flavor.id && f.app === app);
|
|
254
|
-
if (idx === -1)
|
|
255
|
-
this._objectFlavors.push({ ...flavor, app, origin });
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Removes an exposed object flavor from the shell.
|
|
259
|
-
* @param flavor Flavor to be concealed
|
|
260
|
-
* @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)
|
|
261
|
-
*/
|
|
262
|
-
concealObjectFlavor(flavor, app = 'global') {
|
|
263
|
-
this._objectFlavors = this._objectFlavors.filter((f) => {
|
|
264
|
-
const hasSameId = f.id === flavor.id;
|
|
265
|
-
const isFromSameApp = f.app === app;
|
|
266
|
-
return hasSameId && isFromSameApp ? false : true;
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Get registered object flavors
|
|
271
|
-
* @param app Optional app ID that restricts the returned flavors to the ones
|
|
272
|
-
* provided by a particular app. If not provided all flavors are returned
|
|
273
|
-
* @returns Array of matching object flavors
|
|
274
|
-
*/
|
|
275
|
-
getObjectFlavors(app) {
|
|
276
|
-
return app ? this._objectFlavors.filter((of) => of.app === app) : this._objectFlavors;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Triggers the application of an object flavor. If the flavor has an applyComponent
|
|
280
|
-
* defined, the overlay will be opened with the component. Otherwise the flavor will
|
|
281
|
-
* be applied directly to the object.
|
|
282
|
-
* @param dmsObject The object to apply the flavor to
|
|
283
|
-
* @param flavor The flavor to apply
|
|
284
|
-
* @param data Optional data to be passed to the flavor component
|
|
285
|
-
* @returns Observable that emits true if the flavor was applied successfully
|
|
286
|
-
*/
|
|
287
|
-
triggerApplyObjectFlavor(dmsObject, flavor, data, applyComponent) {
|
|
288
|
-
if (flavor.preventApply)
|
|
289
|
-
return of(false);
|
|
290
|
-
if (dmsObject) {
|
|
291
|
-
const ac = applyComponent || flavor.applyComponent;
|
|
292
|
-
if (ac) {
|
|
293
|
-
this.#dialog.open(ac, {
|
|
294
|
-
maxWidth: '90vw',
|
|
295
|
-
maxHeight: '90vh',
|
|
296
|
-
minWidth: '50vw',
|
|
297
|
-
data: {
|
|
298
|
-
dmsObject,
|
|
299
|
-
flavor,
|
|
300
|
-
data
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
return of(true);
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
307
|
-
const data = {};
|
|
308
|
-
data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];
|
|
309
|
-
return this.#dmsService.updateDmsObject(dmsObject?.id, data).pipe(map(() => true));
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
else
|
|
313
|
-
return of(false);
|
|
314
|
-
}
|
|
315
|
-
removeObjectFlavor(dmsObject, flavor) {
|
|
316
|
-
if (flavor.preventRemove)
|
|
317
|
-
return of(false);
|
|
318
|
-
const data = {
|
|
319
|
-
[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS].filter((sot) => sot !== flavor.sot)
|
|
320
|
-
};
|
|
321
|
-
return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Get object flavors applicable for a certain mimetype
|
|
325
|
-
* @param mimeType Mime type or mime type pattern like 'image/*'
|
|
326
|
-
* @param app Optional app ID that restricts the returned flavors to the ones
|
|
327
|
-
* provided by a particular app
|
|
328
|
-
* @param customFlavors Optional array of custom flavors to also take into account.
|
|
329
|
-
* This could be flavors managed by an app itself that are not supposed to be
|
|
330
|
-
* exposed to other apps
|
|
331
|
-
* @returns Array of matching object flavors
|
|
332
|
-
*/
|
|
333
|
-
getApplicableDocumentFlavors(mimeType, app, customFlavors) {
|
|
334
|
-
return [...(customFlavors || []), ...this._objectFlavors].filter((of) =>
|
|
335
|
-
// !of.preventApply &&
|
|
336
|
-
(!of.applicableTo?.folders || (of.applicableTo?.folders && of.applicableTo?.documents)) &&
|
|
337
|
-
(!of.applicableTo ||
|
|
338
|
-
!of.applicableTo?.mimeTypes ||
|
|
339
|
-
(of.applicableTo?.mimeTypes?.some((mtp) => Utils.patternToRegExp(mtp).test(mimeType)) &&
|
|
340
|
-
(!app || of.app === app))));
|
|
341
|
-
}
|
|
342
|
-
getApplicableFolderFlavors(app, customFlavors) {
|
|
343
|
-
return [...(customFlavors || []), ...this._objectFlavors].filter((of) => !of.preventApply && of.applicableTo?.folders && (!app || of.app === app));
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Get applied and applicable object flavors for a certain object
|
|
347
|
-
* @param dmsObject DmsObject to get flavors for
|
|
348
|
-
* @returns Object containing two arrays: applied and applicable flavors
|
|
349
|
-
*/
|
|
350
|
-
getAppliedObjectFlavors(dmsObject) {
|
|
351
|
-
const applied = [];
|
|
352
|
-
const applicable = [];
|
|
353
|
-
if (dmsObject) {
|
|
354
|
-
const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
355
|
-
if (dmsObject.content) {
|
|
356
|
-
this.getApplicableDocumentFlavors(dmsObject.content.mimeType).forEach((flavor) => {
|
|
357
|
-
flavor = {
|
|
358
|
-
...flavor,
|
|
359
|
-
name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),
|
|
360
|
-
description: this.#system.getLocalizedDescription(flavor.id) ||
|
|
361
|
-
(flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)
|
|
362
|
-
};
|
|
363
|
-
if (sots.includes(flavor.sot)) {
|
|
364
|
-
applied.push(flavor);
|
|
365
|
-
}
|
|
366
|
-
else if (!flavor.preventApply) {
|
|
367
|
-
applicable.push(flavor);
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
if (dmsObject.isFolder) {
|
|
372
|
-
this.getApplicableFolderFlavors().forEach((flavor) => {
|
|
373
|
-
flavor = {
|
|
374
|
-
...flavor,
|
|
375
|
-
name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),
|
|
376
|
-
description: this.#system.getLocalizedDescription(flavor.id) ||
|
|
377
|
-
(flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)
|
|
378
|
-
};
|
|
379
|
-
if (sots.includes(flavor.sot)) {
|
|
380
|
-
applied.push(flavor);
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
applicable.push(flavor);
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
return { applied, applicable };
|
|
389
|
-
}
|
|
390
|
-
getFlavorLabel(id) {
|
|
391
|
-
return this.#system.getLocalizedLabel(id) || this.translate.instant(id);
|
|
392
|
-
}
|
|
393
|
-
applyObjectFlavor(dmsObject, flavor, data = {}) {
|
|
394
|
-
const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
395
|
-
data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];
|
|
396
|
-
return this.#dmsService.updateDmsObject(dmsObject.id, data);
|
|
397
|
-
}
|
|
398
|
-
registerTileExtension(ext) {
|
|
399
|
-
this._extensions[ext.typeId] = ext;
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Get tile extensions for a certain type
|
|
403
|
-
* @param typeId ID of the type to fetch extesion for (objectTypeID or secondaryObjectTypeID)
|
|
404
|
-
* @returns
|
|
405
|
-
*/
|
|
406
|
-
getRegisteredTileExtensions() {
|
|
407
|
-
return this._extensions;
|
|
408
|
-
}
|
|
409
|
-
_initObjectTypeConfig() {
|
|
410
|
-
// load flavors from config
|
|
411
|
-
console.debug('Loading object type config...');
|
|
412
|
-
return firstValueFrom(this.#shellConfig.get(SHELL_CONFIG_TYPES).pipe(tap((res) => {
|
|
413
|
-
if (res) {
|
|
414
|
-
this.#registerObjectTypeIcons(res.data.map((t) => t.id));
|
|
415
|
-
const flv = res.data.map((t) => ({
|
|
416
|
-
id: t.id,
|
|
417
|
-
sot: t.id,
|
|
418
|
-
icon: t.id,
|
|
419
|
-
svgIcon: true,
|
|
420
|
-
objectTypeID: t.baseType,
|
|
421
|
-
applicableTo: {
|
|
422
|
-
folders: t.baseType === SystemType.FOLDER || t.baseType === SystemType.OBJECT,
|
|
423
|
-
documents: t.baseType === SystemType.DOCUMENT || t.baseType === SystemType.OBJECT,
|
|
424
|
-
mimeTypes: t.applicableToMimeTypes || undefined
|
|
425
|
-
},
|
|
426
|
-
useDefaultApplyComponent: !t.instantApply
|
|
427
|
-
}));
|
|
428
|
-
this.exposeObjectFlavors(flv, 'global', 'config');
|
|
429
|
-
}
|
|
430
|
-
})));
|
|
431
|
-
}
|
|
432
|
-
#registerObjectTypeIcons(ids) {
|
|
433
|
-
this.#system.system$.pipe(first()).subscribe(() => {
|
|
434
|
-
ids.forEach((id) => {
|
|
435
|
-
// split technical name e.g. 'system:document' and use the first part as namespace
|
|
436
|
-
const idTokens = id.split(':');
|
|
437
|
-
if (idTokens.length === 2) {
|
|
438
|
-
const uri = `${this.#configService.getApiBase(ApiBase.none, true)}${this.#system.getObjectTypeIconUri(id)}`;
|
|
439
|
-
this.#iconRegistry.addSvgIconInNamespace(idTokens[0], idTokens[1], this.#sanitizer.bypassSecurityTrustResourceUrl(uri));
|
|
440
|
-
}
|
|
441
|
-
});
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
|
-
_init() {
|
|
445
|
-
// the place for initialization tasks if
|
|
446
|
-
}
|
|
447
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ShellService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
448
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ShellService, providedIn: 'root' }); }
|
|
449
|
-
}
|
|
450
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ShellService, decorators: [{
|
|
451
|
-
type: Injectable,
|
|
452
|
-
args: [{
|
|
453
|
-
providedIn: 'root'
|
|
454
|
-
}]
|
|
455
|
-
}], ctorParameters: () => [] });
|
|
456
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwvc2hlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFjLGFBQWEsRUFBRSxNQUFNLEVBQTRCLE1BQU0saUJBQWlCLENBQUM7QUFDOUcsT0FBTyxFQUNMLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsYUFBYSxFQUViLFVBQVUsRUFFVixhQUFhLEVBQ2IsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsS0FBSyxFQUVOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxjQUFjLEVBQ2QsU0FBUyxFQUNULEdBQUcsRUFFSCxFQUFFLEVBQ0YsR0FBRyxFQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFVaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBSzFFLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFdBQVcs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ZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb24sIE5hdmlnYXRpb25FbmQsIFJvdXRlciwgVXJsU2VnbWVudEdyb3VwLCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFwaUJhc2UsXG4gIEJhc2VPYmplY3RUeXBlRmllbGQsXG4gIENvbmZpZ1NlcnZpY2UsXG4gIERtc09iamVjdCxcbiAgRG1zU2VydmljZSxcbiAgT2JqZWN0Q3JlYXRlRmxhdm9yLFxuICBTeXN0ZW1TZXJ2aWNlLFxuICBTeXN0ZW1UeXBlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBVc2VyU2VydmljZSxcbiAgVXRpbHMsXG4gIFl1dlVzZXJcbn0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgdGFwXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ0xJRU5UX1NIRUxMX0FTU0VUUyB9IGZyb20gJy4uLy4uL2NsaWVudC1zaGVsbC5hc3NldHMnO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBBcHBGbGF2b3IsXG4gIENsaWVudFNoZWxsQ29uZmlnLFxuICBHbG9iYWxTaG9ydGN1dCxcbiAgT2JqZWN0Rmxhdm9yLFxuICBTaGVsbEFwcFNldHRpbmdzXG59IGZyb20gJy4uLy4uL21vZGVscy9jbGllbnQtc2hlbGwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRpbGVFeHRlbnNpb24gfSBmcm9tICcuLi8uLi90aWxlLWV4dGVuc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU0hFTExfQ09ORklHX1RZUEVTIH0gZnJvbSAnLi4vc2hlbGwtY29uZmlnL3NoZWxsLWNvbmZpZy5jb25zdCc7XG5pbXBvcnQgeyBDbGllbnRTaGVsbFR5cGUsIFNoZWxsQ29uZmlnIH0gZnJvbSAnLi4vc2hlbGwtY29uZmlnL3NoZWxsLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2hlbGxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2hlbGwtY29uZmlnL3NoZWxsLWNvbmZpZy5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2hlbGxTZXJ2aWNlIHtcbiAgI2Rtc1NlcnZpY2UgPSBpbmplY3QoRG1zU2VydmljZSk7XG5cbiAgI2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICAjc3lzdGVtID0gaW5qZWN0KFN5c3RlbVNlcnZpY2UpO1xuICAjdXNlclNlcnZpY2UgPSBpbmplY3QoVXNlclNlcnZpY2UpO1xuICAvLyBUT0RPOiBOZWVkIG9yaWduYWwgTWF0SWNvblJlZ2lzdHJ5IHRvICNyZWdpc3Rlck9iamVjdFR5cGVJY29ucywgb3RoZXJ3aXNlIGljb25zIGNvdWxkIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSBuYW1lc3BhY2VcbiAgLy8gI2ljb25SZWdpc3RyeSA9IGluamVjdChZdXZNYXRJY29uUmVnaXN0cnkpO1xuICAjaWNvblJlZ2lzdHJ5ID0gaW5qZWN0KE1hdEljb25SZWdpc3RyeSk7XG4gICNzaGVsbENvbmZpZyA9IGluamVjdChTaGVsbENvbmZpZ1NlcnZpY2UpO1xuICAjY29uZmlnU2VydmljZSA9IGluamVjdChDb25maWdTZXJ2aWNlKTtcbiAgI3Nhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xuICAjcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICNyb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gICNET0NVTUVOVCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgX2J1c3lDb3VudCA9IDA7XG4gIHByaXZhdGUgaXNCdXN5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpc0J1c3kkID0gdGhpcy5pc0J1c3lTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpO1xuXG4gIC8vIEFwcHMgY2FuIHJlZ2lzdGVyIHRoZWlyIG93biBzZXR0aW5nIGNvbXBvbmVudHMgdG8gYmUgc2hvd24gaW4gc2hlbGwgc2V0dGluZ3NcbiAgI2FwcFNldHRpbmdzID0gc2lnbmFsPFNoZWxsQXBwU2V0dGluZ3NbXT4oW10pO1xuICBhcHBTZXR0aW5ncyA9IHRoaXMuI2FwcFNldHRpbmdzLmFzUmVhZG9ubHkoKTtcblxuICBhcHBCYXNlUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgI2RlZmF1bHRTaGVsbENvbmZpZzogQ2xpZW50U2hlbGxDb25maWcgPSB7XG4gICAgYXBwSWNvbjogQ0xJRU5UX1NIRUxMX0FTU0VUUy5hcHBJY29uLFxuICAgIHNoZWxsSWNvbk5hbWVzcGFjZTogQ0xJRU5UX1NIRUxMX0FTU0VUUy5zaGVsbEljb25OYW1lc3BhY2VcbiAgfTtcbiAgc2hlbGxDb25maWcgPSBzaWduYWw8Q2xpZW50U2hlbGxDb25maWc+KHRoaXMuI2RlZmF1bHRTaGVsbENvbmZpZyk7XG4gIGFwcHMgPSBzaWduYWw8QXBwW10+KFtdKTtcblxuICAvKiogVE9ETzogaW1wbGVtZW50IHRoaXMgZmVhdHVyZSA/Pz8/XG4gICAqIEdsb2JhbCBzaG9ydGN1dHMgYXJlIGNhcHR1cmVkIGJ5IHRoZSBzaGVsbCB0byBwcm92aWRlIGEgY29uc2lzdGVudCBleHBlcmllbmNlXG4gICAqIGFjY3Jvc3MgYWxsIGFwcHMuIFNlYXJjaCBpcyBvbmUgZXhhbXBsZS4gQXBwcyBzaG91bGQgbm90IGRlZmluZSB0aGVpciBvd24gc2hvdXJ0Y3V0c1xuICAgKiBmb3Igc2VhcmNoLiBJbnN0ZWFkIHRoZXkgc2hvdWxkIHN1YnNjcmliZSB0byB0aGUgZ2xvYmFsIHNob3J0Y3V0cyBhbmQgaW5pdGlhbGl6ZSB0aGVpclxuICAgKiBzZWFyY2ggYmFzZWQgb24gdGhlIGdsb2JhbCBzZWFyY2ggc2hvcnRjdXQuXG4gICAqL1xuICBnbG9iYWxTaG9ydGN1dHMkOiBPYnNlcnZhYmxlPEdsb2JhbFNob3J0Y3V0PiA9IGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKS5waXBlKFxuICAgIG1hcCgoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gZ2xvYmFsIHNob3J0Y3V0IGZvciBzZWFyY2hcbiAgICAgIC8vIGlmIChlLmN0cmxLZXkgJiYgZS5jb2RlID09PSAnS2V5RicpIHtcbiAgICAgIC8vICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gICByZXR1cm4gR2xvYmFsU2hvcnRjdXQuc2VhcmNoO1xuICAgICAgLy8gfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSxcbiAgICBmaWx0ZXIoKHM6IEdsb2JhbFNob3J0Y3V0IHwgdW5kZWZpbmVkKSA9PiBzICE9PSB1bmRlZmluZWQpLFxuICAgIG1hcCgocykgPT4gcyBhcyBHbG9iYWxTaG9ydGN1dClcbiAgKTtcblxuICBwcml2YXRlIF9leHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBUaWxlRXh0ZW5zaW9uPiA9IHt9O1xuICBwcml2YXRlIF9vYmplY3RGbGF2b3JzOiBPYmplY3RGbGF2b3JbXSA9IFtdO1xuICBwcml2YXRlIF9vYmplY3RDcmVhdGVGbGF2b3JzOiBPYmplY3RDcmVhdGVGbGF2b3JbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hcHBzLnNldCh0aGlzLiNnZXRNYXBwZWRBcHBzKHRoaXMuYXBwcygpKSk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFjayBvcGVuIGRpYWxvZ3MgaW4gYW4gYXV4aWxsYXJ5IHJvdXRlIHRvIHN1cHBvcnQgY2xvc2luZyB0aGVtIG9uIGJhY2sgbmF2aWdhdGlvblxuICAgIC8vIGFzIHRoaXMgaXMgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBvbiBtb2JpbGUgZGV2aWNlc1xuICAgIHRoaXMuI2RpYWxvZy5hZnRlck9wZW5lZC5zdWJzY3JpYmUoKHJlZjogTWF0RGlhbG9nUmVmPGFueSwgYW55PikgPT4ge1xuICAgICAgdGhpcy4jcm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgZHQ6IFsnZGlhbG9ncycsIHRoaXMuI2RpYWxvZy5vcGVuRGlhbG9ncy5tYXAoKGQsIGkpID0+IGkpLmpvaW4oJy0nKV0gfSB9XSwge1xuICAgICAgICAvLyByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAncHJlc2VydmUnXG4gICAgICB9KTtcbiAgICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmNsb3NlZEJ5Um91dGUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3BlbkRpYWxvZ3MgPSB0aGlzLiNkaWFsb2cub3BlbkRpYWxvZ3MuZmlsdGVyKChkKSA9PiBkLmlkICE9PSByZWYuaWQpO1xuICAgICAgICAvLyBoYXZpbmcgbm8gb3BlbiBkaWFsb2dzLCBjbGVhciB0aGUgYXV4aWxsYXJ5IHJvdXRlXG4gICAgICAgIGNvbnN0IHBhcmFtID0gb3BlbkRpYWxvZ3MubGVuZ3RoID4gMCA/IFsnZGlhbG9ncycsIG9wZW5EaWFsb2dzLm1hcCgoZCwgaSkgPT4gaSkuam9pbignLScpXSA6IG51bGw7XG4gICAgICAgIHRoaXMuI3JvdXRlci5uYXZpZ2F0ZShbeyBvdXRsZXRzOiB7IGR0OiBwYXJhbSB9IH1dLCB7IHJlcGxhY2VVcmw6IHRydWUsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdwcmVzZXJ2ZScgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLiNyb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKChlKSA9PiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgLy8gd2hlbiBuYXZpZ2F0aW5nIGFuZCBoYXZpbmcgbm8gb3BlbiBkaWFsb2dzLCBjbGVhciB0aGUgYXV4aWxsYXJ5IHJvdXRlIGZyb20gdGhlIHVybFxuICAgICAgaWYgKHRoaXMuI2RpYWxvZy5vcGVuRGlhbG9ncy5sZW5ndGggPT09IDAgJiYgZS51cmxBZnRlclJlZGlyZWN0cy5tYXRjaCgvKGR0OlsuXSopLykpIHtcbiAgICAgICAgdGhpcy4jcm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgZHQ6IG51bGwgfSB9XSwgeyByZXBsYWNlVXJsOiB0cnVlLCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAncHJlc2VydmUnIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGVyZSBhcmUgb3BlbiBkaWFsb2dzIGFuZCB0aGUgcHJpbWFyeSByb3V0ZSBjaGFuZ2VkLCBjbG9zZSBhbGwgb3BlbiBkaWFsb2dzXG4gICAgICBpZiAodGhpcy4jZGlhbG9nLm9wZW5EaWFsb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeVJvdXRlQ2hhbmdlZCh0aGlzLiNyb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSkpIHtcbiAgICAgICAgICB0aGlzLiNkaWFsb2cub3BlbkRpYWxvZ3MuZm9yRWFjaCgoZCkgPT4gZC5jbG9zZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgI2dldFByaW1hcnlSb3V0ZShuYXY6IE5hdmlnYXRpb24gfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIW5hdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB1cmw6IFVybFRyZWUgPSBuYXYuZmluYWxVcmwgfHwgbmF2LmV4dHJhY3RlZFVybDtcbiAgICBjb25zdCB1cmxUcmVlQ2hpbGRyZW46IFVybFNlZ21lbnRHcm91cCB8IHVuZGVmaW5lZCA9IHVybC5yb290LmNoaWxkcmVuWydwcmltYXJ5J107XG4gICAgcmV0dXJuIHVybFRyZWVDaGlsZHJlbiA/IHVybFRyZWVDaGlsZHJlbi5zZWdtZW50cy5tYXAoKHMpID0+IHMucGF0aCkuam9pbignLycpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpbWFyeVJvdXRlQ2hhbmdlZChuYXY6IE5hdmlnYXRpb24gfCBudWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldmlvdXNOYXYgPSBuYXY/LnByZXZpb3VzTmF2aWdhdGlvbiB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzLiNnZXRQcmltYXJ5Um91dGUobmF2KSAhPT0gdGhpcy4jZ2V0UHJpbWFyeVJvdXRlKHByZXZpb3VzTmF2KTtcbiAgfVxuXG4gIHBpY2tGaWxlKCk6IE9ic2VydmFibGU8RmlsZSB8IG51bGw+IHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuI0RPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5jbGljaygpO1xuICAgIHJldHVybiBmcm9tRXZlbnQoaW5wdXQsICdjaGFuZ2UnKS5waXBlKFxuICAgICAgbWFwKChlOiBFdmVudCkgPT4gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzPy5bMF0gfHwgbnVsbCksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBpbnB1dC5yZW1vdmUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldFNoZWxsQ29uZmlnKGNzYzogQ2xpZW50U2hlbGxDb25maWcpIHtcbiAgICB0aGlzLnNoZWxsQ29uZmlnLnVwZGF0ZSgoc2MpID0+ICh7XG4gICAgICBhcHBJY29uOiBjc2MuYXBwSWNvbiA/PyBzYy5hcHBJY29uLFxuICAgICAgc2hlbGxJY29uTmFtZXNwYWNlOiBjc2Muc2hlbGxJY29uTmFtZXNwYWNlID8/IHNjLnNoZWxsSWNvbk5hbWVzcGFjZVxuICAgIH0pKTtcbiAgfVxuXG4gIHNldEFwcHMoYXBwczogQXBwW10pIHtcbiAgICB0aGlzLmFwcHMuc2V0KHRoaXMuI2dldE1hcHBlZEFwcHMoYXBwcykpO1xuICAgIGNvbnN0IGFwcEJhc2VSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBhcHBzLmZvckVhY2goKGEpID0+IChhcHBCYXNlUm91dGVzW2EuaWRdID0gYS5wYXRoIHx8ICcnKSk7XG4gICAgdGhpcy5hcHBCYXNlUm91dGVzID0gYXBwQmFzZVJvdXRlcztcbiAgfVxuXG4gICNnZXRNYXBwZWRBcHBzKGFwcHM6IEFwcFtdKTogQXBwW10ge1xuICAgIHJldHVybiBhcHBzLm1hcCgoYSkgPT4ge1xuICAgICAgY29uc3QgbWEgPSB7XG4gICAgICAgIC4uLmEsXG4gICAgICAgIHRpdGxlOiB0aGlzLiNnZXRBcHBUaXRsZShhKVxuICAgICAgfTtcbiAgICAgIGlmIChhLm9wdGlvbnM/LmFwcENsYWltS2V5KSB7XG4gICAgICAgIG1hLm9wdGlvbnMgPSB7IC4uLm1hLm9wdGlvbnMsIGFwcENsYWltOiB0aGlzLiNnZXRBcHBDbGFpbShhLm9wdGlvbnMuYXBwQ2xhaW1LZXkpIHx8IGEub3B0aW9ucy5hcHBDbGFpbSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hO1xuICAgIH0pO1xuICB9XG5cbiAgI2dldEFwcFRpdGxlKGE6IEFwcCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlZFRpdGxlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChhLmlkKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZFRpdGxlICYmICF0cmFuc2xhdGVkVGl0bGUuc3RhcnRzV2l0aCgnIW1pc3NpbmcnKSA/IHRyYW5zbGF0ZWRUaXRsZSA6IChhLnRpdGxlIGFzIHN0cmluZykgfHwgJyc7XG4gIH1cblxuICAjZ2V0QXBwQ2xhaW0oY2xhaW1LZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdHJhbnNsYXRlZENsYWltID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChjbGFpbUtleSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWRDbGFpbSAmJiAhdHJhbnNsYXRlZENsYWltLnN0YXJ0c1dpdGgoJyFtaXNzaW5nJykgPyB0cmFuc2xhdGVkQ2xhaW0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBcHAoaWQ6IHN0cmluZyk6IEFwcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwcygpLmZpbmQoKGEpID0+IGlkID09PSBhLmlkKTtcbiAgfVxuXG4gIGdldEFwcHMoaWRzOiBzdHJpbmdbXSA9IFtdKTogQXBwW10ge1xuICAgIHJldHVybiBpZHMubGVuZ3RoID8gdGhpcy5hcHBzKCkuZmlsdGVyKChhKSA9PiBpZHMuaW5jbHVkZXMoYS5pZCkpIDogdGhpcy5hcHBzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIGFwcHMgdG8gaG9vayBpbnRvIHNoZWxsIHNldHRpbmdzIHBhZ2UuXG4gICAqIEBwYXJhbSBhcHBJRCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgc2V0dGluZ3NcbiAgICogQHBhcmFtIGNmZyBTaGVsbEFwcFNldHRpbmdzIG9iamVjdCBjb250YWluaW5nIHRoZSBzZXR0aW5ncyBjb21wb25lbnRcbiAgICovXG4gIHJlZ2lzdGVyQXBwU2V0dGluZ3MoY2ZnOiBTaGVsbEFwcFNldHRpbmdzKSB7XG4gICAgdGhpcy4jYXBwU2V0dGluZ3Muc2V0KFsuLi50aGlzLiNhcHBTZXR0aW5ncygpLCBjZmddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHBlcnNpc3RlZCBzZXR0aW5ncyBmb3IgYSBzcGVjaWZpYyBhcHBcbiAgICogQHBhcmFtIGFwcElEIElEIG9mIHRoZSBhcHAgdG8gbG9hZCB0aGUgc2V0dGluZ3MgZm9yXG4gICAqL1xuICB1c2Vyc0FwcFNldHRpbmdzJChhcHBJRDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTaGVsbEFwcFNldHRpbmdzIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuI3VzZXJTZXJ2aWNlLnVzZXIkLnBpcGUoXG4gICAgICBtYXAoKHU6IFl1dlVzZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHUgJiYgdS51c2VyU2V0dGluZ3MuY2xpZW50QXBwU2V0dGluZ3MgPyB1LnVzZXJTZXR0aW5ncy5jbGllbnRBcHBTZXR0aW5nc1thcHBJRF0gOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzYXZlVXNlcnNBcHBTZXR0aW5ncyhhcHBJRDogc3RyaW5nLCBzZXR0aW5nczogU2hlbGxBcHBTZXR0aW5ncyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuI3VzZXJTZXJ2aWNlLnNhdmVVc2VyU2V0dGluZ3MoeyBjbGllbnRBcHBTZXR0aW5nczogeyBbYXBwSURdOiBzZXR0aW5ncyB9IH0pO1xuICB9XG5cbiAgYWRkQnVzeSgpIHtcbiAgICBpZiAodGhpcy5fYnVzeUNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmlzQnVzeVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fYnVzeUNvdW50Kys7XG4gIH1cbiAgcmVtb3ZlQnVzeSgpIHtcbiAgICB0aGlzLl9idXN5Q291bnQtLTtcbiAgICBpZiAodGhpcy5fYnVzeUNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmlzQnVzeVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgb2JqZWN0IGNyZWF0ZSBmbGF2b3JzIHRvIHRoZSBzaGVsbC5cbiAgICogVGhlcyBmbGF2b3JzIGRlc2NyaWJlIGRpZmZlcmVudCB3YXlzIG9mIGhvdyBvYmplY3RzIGNhbiBiZSBjcmVhdGVkLiBTbyBhcHBzXG4gICAqIGNhbiByZWdpc3RlciBjdXN0b20gd2F5cyBvZiBjcmVhdGluZyBvYmplY3RzIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBieSBvdGhlciBhcHBzLlxuICAgKiBAcGFyYW0gZmxhdm9ycyBDcmVhdGUgZmxhdm9ycyB0byBiZSBleHBvc2VkXG4gICAqL1xuICBleHBvc2VPYmplY3RDcmVhdGVGbGF2b3JzKGZsYXZvcnM6IE9iamVjdENyZWF0ZUZsYXZvcltdKSB7XG4gICAgZmxhdm9ycy5mb3JFYWNoKChmbGF2b3I6IE9iamVjdENyZWF0ZUZsYXZvcikgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycy5maW5kSW5kZXgoKGYpID0+IGYuaWQgPT09IGZsYXZvci5pZCk7XG4gICAgICBpZiAoaWR4ID09PSAtMSkgdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycy5wdXNoKGZsYXZvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG9iamVjdCBjcmVhdGUgZmxhdm9ycyBmcm9tIHRoZSBzaGVsbHMgcmVnaXN0cnlcbiAgICogQHBhcmFtIGZsYXZvcnMgQ3JlYXRlIGZsYXZvcnMgdG8gYmUgcmVtb3ZlZFxuICAgKi9cbiAgY29uY2VhbE9iamVjdENyZWF0ZUZsYXZvcnMoZmxhdm9yczogT2JqZWN0Q3JlYXRlRmxhdm9yW10pIHtcbiAgICBjb25zdCBmaWQgPSBmbGF2b3JzLm1hcCgoZikgPT4gZi5pZCk7XG4gICAgdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycyA9IHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnMuZmlsdGVyKChmKSA9PiAhZmlkLmluY2x1ZGVzKGYuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZCBvYmplY3QgY3JlYXRlIGZsYXZvcnNcbiAgICovXG4gIGdldE9iamVjdENyZWF0ZUZsYXZvcnMoKTogT2JqZWN0Q3JlYXRlRmxhdm9yW10ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgYSBsaXN0IG9mIG9iamVjdCBmbGF2b3JzIHRvIHRoZSBzaGVsbC5cbiAgICogRmxhdm9ycyBhcmUgYWJsZSB0byBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIGFkZCBuZXcgbWV0YWRhdGEgcHJvcGVydGllcyB0byB0aGVtLlxuICAgKiBAcGFyYW0gZmxhdm9ycyBBcnJheSBvZiBmbGF2b3JzIHRvIGJlIGV4cG9zZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9ycyAoZGVmYXVsdHMgdG8gJ2dsb2JhbCcgaWYgbm90IHByb3ZpZGVkKVxuICAgKiBAcGFyYW0gb3JpZ2luIE9wdGlvbmFsIG9yaWdpbiBvZiB0aGUgZmxhdm9ycy4gRmxhdm9ycyBjb3VsZCBiZSBhZGRlZCBieSBhcHBzIG9yIGRlcml2ZWRcbiAgICogZnJvbSBhIGNvbmZpZ3VyYXRpb24gKGRlZmF1bHRzIHRvICdhcHAnIGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGV4cG9zZU9iamVjdEZsYXZvcnMoZmxhdm9yczogQXBwRmxhdm9yW10sIGFwcCA9ICdnbG9iYWwnLCBvcmlnaW46ICdhcHAnIHwgJ2NvbmZpZycgPSAnYXBwJykge1xuICAgIGZsYXZvcnMuZm9yRWFjaCgoZikgPT4gdGhpcy5leHBvc2VPYmplY3RGbGF2b3IoZiwgYXBwLCBvcmlnaW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV4cG9zZWQgb2JqZWN0IGZsYXZvcnMgZnJvbSB0aGUgc2hlbGwuXG4gICAqIEBwYXJhbSBmbGF2b3JzIEFycmF5IG9mIGZsYXZvcnMgdG8gYmUgY29uY2VhbGVkXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9ycyhmbGF2b3JzOiBBcHBGbGF2b3JbXSwgYXBwID0gJ2dsb2JhbCcpIHtcbiAgICBmbGF2b3JzLmZvckVhY2goKGYpID0+IHRoaXMuY29uY2VhbE9iamVjdEZsYXZvcihmLCBhcHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGFuIG9iamVjdCBmbGF2b3IgdG8gdGhlIHNoZWxsLiBGbGF2b3JzIGFyZSBhYmxlIHRvIGJlIGFwcGxpZWQgdG8gb2JqZWN0c1xuICAgKiBpbiBvcmRlciB0byBhZGQgYSBuZXcgYXNwZWN0IHRvIHRoZW0uIEFuIG9iamVjdCBjb250YWluaW5nIGFuIGltYWdlIGZvciBleGFtcGxlIGNvdWxkXG4gICAqIGJlIGFkZGVkIGEgZmxhdm9yIG9mICdFWElGIERhdGEnIHRoYXQgd2lsbCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgU09UIHRvIGl0LiBUaGlzIHdheSB0aGVcbiAgICogb2JqZWN0IGdldHMgbmV3IG1ldGFkYXRhIHByb3BlcnRpZXMuIElmIHN1cHBvcnRlZCwgdGhlc2UgbWV0YWRhdGEgY291bGQgZXZlbiBiZSBleHRyYWN0ZWRcbiAgICogZnJvbSB0aGUgZmlsZSBhbmQgZmlsbGVkIG91dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmxhdm9yIFRoZSBmbGF2b3Igb2JqZWN0IHRvIGJlIGV4cG9zZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqIEBwYXJhbSBvcmlnaW4gT3B0aW9uYWwgb3JpZ2luIG9mIHRoZSBmbGF2b3JzLiBGbGF2b3JzIGNvdWxkIGJlIGFkZGVkIGJ5IGFwcHMgb3IgZGVyaXZlZFxuICAgKiBmcm9tIGEgY29uZmlndXJhdGlvbiAoZGVmYXVsdHMgdG8gJ2FwcCcgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgZXhwb3NlT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJywgb3JpZ2luOiAnYXBwJyB8ICdjb25maWcnID0gJ2FwcCcpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbmRJbmRleCgoZikgPT4gZi5pZCA9PT0gZmxhdm9yLmlkICYmIGYuYXBwID09PSBhcHApO1xuICAgIGlmIChpZHggPT09IC0xKSB0aGlzLl9vYmplY3RGbGF2b3JzLnB1c2goeyAuLi5mbGF2b3IsIGFwcCwgb3JpZ2luIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXhwb3NlZCBvYmplY3QgZmxhdm9yIGZyb20gdGhlIHNoZWxsLlxuICAgKiBAcGFyYW0gZmxhdm9yIEZsYXZvciB0byBiZSBjb25jZWFsZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9yKGZsYXZvcjogQXBwRmxhdm9yLCBhcHAgPSAnZ2xvYmFsJykge1xuICAgIHRoaXMuX29iamVjdEZsYXZvcnMgPSB0aGlzLl9vYmplY3RGbGF2b3JzLmZpbHRlcigoZikgPT4ge1xuICAgICAgY29uc3QgaGFzU2FtZUlkID0gZi5pZCA9PT0gZmxhdm9yLmlkO1xuICAgICAgY29uc3QgaXNGcm9tU2FtZUFwcCA9IGYuYXBwID09PSBhcHA7XG4gICAgICByZXR1cm4gaGFzU2FtZUlkICYmIGlzRnJvbVNhbWVBcHAgPyBmYWxzZSA6IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlZ2lzdGVyZWQgb2JqZWN0IGZsYXZvcnNcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBhcHAgSUQgdGhhdCByZXN0cmljdHMgdGhlIHJldHVybmVkIGZsYXZvcnMgdG8gdGhlIG9uZXNcbiAgICogcHJvdmlkZWQgYnkgYSBwYXJ0aWN1bGFyIGFwcC4gSWYgbm90IHByb3ZpZGVkIGFsbCBmbGF2b3JzIGFyZSByZXR1cm5lZFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtYXRjaGluZyBvYmplY3QgZmxhdm9yc1xuICAgKi9cbiAgZ2V0T2JqZWN0Rmxhdm9ycyhhcHA/OiBzdHJpbmcpOiBPYmplY3RGbGF2b3JbXSB7XG4gICAgcmV0dXJuIGFwcCA/IHRoaXMuX29iamVjdEZsYXZvcnMuZmlsdGVyKChvZikgPT4gb2YuYXBwID09PSBhcHApIDogdGhpcy5fb2JqZWN0Rmxhdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgYXBwbGljYXRpb24gb2YgYW4gb2JqZWN0IGZsYXZvci4gSWYgdGhlIGZsYXZvciBoYXMgYW4gYXBwbHlDb21wb25lbnRcbiAgICogZGVmaW5lZCwgdGhlIG92ZXJsYXkgd2lsbCBiZSBvcGVuZWQgd2l0aCB0aGUgY29tcG9uZW50LiBPdGhlcndpc2UgdGhlIGZsYXZvciB3aWxsXG4gICAqIGJlIGFwcGxpZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIGRtc09iamVjdCBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBmbGF2b3IgdG9cbiAgICogQHBhcmFtIGZsYXZvciBUaGUgZmxhdm9yIHRvIGFwcGx5XG4gICAqIEBwYXJhbSBkYXRhIE9wdGlvbmFsIGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBmbGF2b3IgY29tcG9uZW50XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0cnVlIGlmIHRoZSBmbGF2b3Igd2FzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5XG4gICAqL1xuICB0cmlnZ2VyQXBwbHlPYmplY3RGbGF2b3IoXG4gICAgZG1zT2JqZWN0OiBEbXNPYmplY3QsXG4gICAgZmxhdm9yOiBPYmplY3RGbGF2b3IsXG4gICAgZGF0YT86IGFueSxcbiAgICBhcHBseUNvbXBvbmVudD86IFR5cGU8YW55PlxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAoZmxhdm9yLnByZXZlbnRBcHBseSkgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICBpZiAoZG1zT2JqZWN0KSB7XG4gICAgICBjb25zdCBhYyA9IGFwcGx5Q29tcG9uZW50IHx8IGZsYXZvci5hcHBseUNvbXBvbmVudDtcbiAgICAgIGlmIChhYykge1xuICAgICAgICB0aGlzLiNkaWFsb2cub3BlbihhYywge1xuICAgICAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICAgICAgbWluV2lkdGg6ICc1MHZ3JyxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBkbXNPYmplY3QsXG4gICAgICAgICAgICBmbGF2b3IsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgICBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gPSBbLi4uc290cywgZmxhdm9yLnNvdF07XG4gICAgICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3Q/LmlkLCBkYXRhKS5waXBlKG1hcCgoKSA9PiB0cnVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHJldHVybiBvZihmYWxzZSk7XG4gIH1cblxuICByZW1vdmVPYmplY3RGbGF2b3IoZG1zT2JqZWN0OiBEbXNPYmplY3QsIGZsYXZvcjogT2JqZWN0Rmxhdm9yKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoZmxhdm9yLnByZXZlbnRSZW1vdmUpIHJldHVybiBvZihmYWxzZSk7XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXTogKFxuICAgICAgICBkbXNPYmplY3QuZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdIGFzIHN0cmluZ1tdXG4gICAgICApLmZpbHRlcigoc290OiBzdHJpbmcpID0+IHNvdCAhPT0gZmxhdm9yLnNvdClcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3QuaWQsIGRhdGEpLnBpcGUobWFwKCgpID0+IHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb2JqZWN0IGZsYXZvcnMgYXBwbGljYWJsZSBmb3IgYSBjZXJ0YWluIG1pbWV0eXBlXG4gICAqIEBwYXJhbSBtaW1lVHlwZSBNaW1lIHR5cGUgb3IgbWltZSB0eXBlIHBhdHRlcm4gbGlrZSAnaW1hZ2UvKidcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBhcHAgSUQgdGhhdCByZXN0cmljdHMgdGhlIHJldHVybmVkIGZsYXZvcnMgdG8gdGhlIG9uZXNcbiAgICogcHJvdmlkZWQgYnkgYSBwYXJ0aWN1bGFyIGFwcFxuICAgKiBAcGFyYW0gY3VzdG9tRmxhdm9ycyBPcHRpb25hbCBhcnJheSBvZiBjdXN0b20gZmxhdm9ycyB0byBhbHNvIHRha2UgaW50byBhY2NvdW50LlxuICAgKiBUaGlzIGNvdWxkIGJlIGZsYXZvcnMgbWFuYWdlZCBieSBhbiBhcHAgaXRzZWxmIHRoYXQgYXJlIG5vdCBzdXBwb3NlZCB0byBiZVxuICAgKiBleHBvc2VkIHRvIG90aGVyIGFwcHNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWF0Y2hpbmcgb2JqZWN0IGZsYXZvcnNcbiAgICovXG4gIGdldEFwcGxpY2FibGVEb2N1bWVudEZsYXZvcnMobWltZVR5cGU6IHN0cmluZywgYXBwPzogc3RyaW5nLCBjdXN0b21GbGF2b3JzPzogT2JqZWN0Rmxhdm9yW10pOiBPYmplY3RGbGF2b3JbXSB7XG4gICAgcmV0dXJuIFsuLi4oY3VzdG9tRmxhdm9ycyB8fCBbXSksIC4uLnRoaXMuX29iamVjdEZsYXZvcnNdLmZpbHRlcihcbiAgICAgIChvZjogT2JqZWN0Rmxhdm9yKSA9PlxuICAgICAgICAvLyAhb2YucHJldmVudEFwcGx5ICYmXG4gICAgICAgICghb2YuYXBwbGljYWJsZVRvPy5mb2xkZXJzIHx8IChvZi5hcHBsaWNhYmxlVG8/LmZvbGRlcnMgJiYgb2YuYXBwbGljYWJsZVRvPy5kb2N1bWVudHMpKSAmJlxuICAgICAgICAoIW9mLmFwcGxpY2FibGVUbyB8fFxuICAgICAgICAgICFvZi5hcHBsaWNhYmxlVG8/Lm1pbWVUeXBlcyB8fFxuICAgICAgICAgIChvZi5hcHBsaWNhYmxlVG8/Lm1pbWVUeXBlcz8uc29tZSgobXRwKSA9PiBVdGlscy5wYXR0ZXJuVG9SZWdFeHAobXRwKS50ZXN0KG1pbWVUeXBlKSkgJiZcbiAgICAgICAgICAgICghYXBwIHx8IG9mLmFwcCA9PT0gYXBwKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldEFwcGxpY2FibGVGb2xkZXJGbGF2b3JzKGFwcD86IHN0cmluZywgY3VzdG9tRmxhdm9ycz86IE9iamVjdEZsYXZvcltdKTogT2JqZWN0Rmxhdm9yW10ge1xuICAgIHJldHVybiBbLi4uKGN1c3RvbUZsYXZvcnMgfHwgW10pLCAuLi50aGlzLl9vYmplY3RGbGF2b3JzXS5maWx0ZXIoXG4gICAgICAob2Y6IE9iamVjdEZsYXZvcikgPT4gIW9mLnByZXZlbnRBcHBseSAmJiBvZi5hcHBsaWNhYmxlVG8/LmZvbGRlcnMgJiYgKCFhcHAgfHwgb2YuYXBwID09PSBhcHApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXBwbGllZCBhbmQgYXBwbGljYWJsZSBvYmplY3QgZmxhdm9ycyBmb3IgYSBjZXJ0YWluIG9iamVjdFxuICAgKiBAcGFyYW0gZG1zT2JqZWN0IERtc09iamVjdCB0byBnZXQgZmxhdm9ycyBmb3JcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHdvIGFycmF5czogYXBwbGllZCBhbmQgYXBwbGljYWJsZSBmbGF2b3JzXG4gICAqL1xuICBnZXRBcHBsaWVkT2JqZWN0Rmxhdm9ycyhkbXNPYmplY3Q6IERtc09iamVjdCk6IHtcbiAgICBhcHBsaWVkOiBPYmplY3RGbGF2b3JbXTtcbiAgICBhcHBsaWNhYmxlOiBPYmplY3RGbGF2b3JbXTtcbiAgfSB7XG4gICAgY29uc3QgYXBwbGllZDogT2JqZWN0Rmxhdm9yW10gPSBbXTtcbiAgICBjb25zdCBhcHBsaWNhYmxlOiBPYmplY3RGbGF2b3JbXSA9IFtdO1xuICAgIGlmIChkbXNPYmplY3QpIHtcbiAgICAgIGNvbnN0IHNvdHM6IHN0cmluZ1tdID0gKGRtc09iamVjdC5kYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgICAgaWYgKGRtc09iamVjdC5jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZ2V0QXBwbGljYWJsZURvY3VtZW50Rmxhdm9ycyhkbXNPYmplY3QuY29udGVudC5taW1lVHlwZSkuZm9yRWFjaCgoZmxhdm9yOiBPYmplY3RGbGF2b3IpID0+IHtcbiAgICAgICAgICBmbGF2b3IgPSB7XG4gICAgICAgICAgICAuLi5mbGF2b3IsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLiNzeXN0ZW0uZ2V0TG9jYWxpemVkTGFiZWwoZmxhdm9yLmlkKSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGZsYXZvci5pZCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgdGhpcy4jc3lzdGVtLmdldExvY2FsaXplZERlc2NyaXB0aW9uKGZsYXZvci5pZCkgfHxcbiAgICAgICAgICAgICAgKGZsYXZvci5kZXNjcmlwdGlvbktleSA/IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZmxhdm9yLmRlc2NyaXB0aW9uS2V5KSA6IHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChzb3RzLmluY2x1ZGVzKGZsYXZvci5zb3QpKSB7XG4gICAgICAgICAgICBhcHBsaWVkLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFmbGF2b3IucHJldmVudEFwcGx5KSB7XG4gICAgICAgICAgICBhcHBsaWNhYmxlLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG1zT2JqZWN0LmlzRm9sZGVyKSB7XG4gICAgICAgIHRoaXMuZ2V0QXBwbGljYWJsZUZvbGRlckZsYXZvcnMoKS5mb3JFYWNoKChmbGF2b3I6IE9iamVjdEZsYXZvcikgPT4ge1xuICAgICAgICAgIGZsYXZvciA9IHtcbiAgICAgICAgICAgIC4uLmZsYXZvcixcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuI3N5c3RlbS5nZXRMb2NhbGl6ZWRMYWJlbChmbGF2b3IuaWQpIHx8IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZmxhdm9yLmlkKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICB0aGlzLiNzeXN0ZW0uZ2V0TG9jYWxpemVkRGVzY3JpcHRpb24oZmxhdm9yLmlkKSB8fFxuICAgICAgICAgICAgICAoZmxhdm9yLmRlc2NyaXB0aW9uS2V5ID8gdGhpcy50cmFuc2xhdGUuaW5zdGFudChmbGF2b3IuZGVzY3JpcHRpb25LZXkpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHNvdHMuaW5jbHVkZXMoZmxhdm9yLnNvdCkpIHtcbiAgICAgICAgICAgIGFwcGxpZWQucHVzaChmbGF2b3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBsaWNhYmxlLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhcHBsaWVkLCBhcHBsaWNhYmxlIH07XG4gIH1cblxuICBnZXRGbGF2b3JMYWJlbChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N5c3RlbS5nZXRMb2NhbGl6ZWRMYWJlbChpZCkgfHwgdGhpcy50cmFuc2xhdGUuaW5zdGFudChpZCk7XG4gIH1cblxuICBhcHBseU9iamVjdEZsYXZvcihcbiAgICBkbXNPYmplY3Q6IERtc09iamVjdCxcbiAgICBmbGF2b3I6IE9iamVjdEZsYXZvcixcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICk6IE9ic2VydmFibGU8RG1zT2JqZWN0PiB7XG4gICAgY29uc3Qgc290czogc3RyaW5nW10gPSAoZG1zT2JqZWN0LmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gWy4uLnNvdHMsIGZsYXZvci5zb3RdO1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwZGF0ZURtc09iamVjdChkbXNPYmplY3QuaWQsIGRhdGEpO1xuICB9XG5cbiAgcmVnaXN0ZXJUaWxlRXh0ZW5zaW9uKGV4dDogVGlsZUV4dGVuc2lvbikge1xuICAgIHRoaXMuX2V4dGVuc2lvbnNbZXh0LnR5cGVJZF0gPSBleHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRpbGUgZXh0ZW5zaW9ucyBmb3IgYSBjZXJ0YWluIHR5cGVcbiAgICogQHBhcmFtIHR5cGVJZCBJRCBvZiB0aGUgdHlwZSB0byBmZXRjaCBleHRlc2lvbiBmb3IgKG9iamVjdFR5cGVJRCBvciBzZWNvbmRhcnlPYmplY3RUeXBlSUQpXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRSZWdpc3RlcmVkVGlsZUV4dGVuc2lvbnMoKTogUmVjb3JkPHN0cmluZywgVGlsZUV4dGVuc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLl9leHRlbnNpb25zO1xuICB9XG5cbiAgX2luaXRPYmplY3RUeXBlQ29uZmlnKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIGxvYWQgZmxhdm9ycyBmcm9tIGNvbmZpZ1xuICAgIGNvbnNvbGUuZGVidWcoJ0xvYWRpbmcgb2JqZWN0IHR5cGUgY29uZmlnLi4uJyk7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy4jc2hlbGxDb25maWcuZ2V0KFNIRUxMX0NPTkZJR19UWVBFUykucGlwZShcbiAgICAgICAgdGFwKChyZXM6IFNoZWxsQ29uZmlnIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy4jcmVnaXN0ZXJPYmplY3RUeXBlSWNvbnMoKHJlcy5kYXRhIGFzIENsaWVudFNoZWxsVHlwZVtdKS5tYXAoKHQpID0+IHQuaWQpKTtcblxuICAgICAgICAgICAgY29uc3QgZmx2OiBBcHBGbGF2b3JbXSA9IChyZXMuZGF0YSBhcyBDbGllbnRTaGVsbFR5cGVbXSkubWFwKCh0KSA9PiAoe1xuICAgICAgICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgICAgICAgc290OiB0LmlkLFxuICAgICAgICAgICAgICBpY29uOiB0LmlkLFxuICAgICAgICAgICAgICBzdmdJY29uOiB0cnVlLFxuICAgICAgICAgICAgICBvYmplY3RUeXBlSUQ6IHQuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIGFwcGxpY2FibGVUbzoge1xuICAgICAgICAgICAgICAgIGZvbGRlcnM6IHQuYmFzZVR5cGUgPT09IFN5c3RlbVR5cGUuRk9MREVSIHx8IHQuYmFzZVR5cGUgPT09IFN5c3RlbVR5cGUuT0JKRUNULFxuICAgICAgICAgICAgICAgIGRvY3VtZW50czogdC5iYXNlVHlwZSA9PT0gU3lzdGVtVHlwZS5ET0NVTUVOVCB8fCB0LmJhc2VUeXBlID09PSBTeXN0ZW1UeXBlLk9CSkVDVCxcbiAgICAgICAgICAgICAgICBtaW1lVHlwZXM6IHQuYXBwbGljYWJsZVRvTWltZVR5cGVzIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1c2VEZWZhdWx0QXBwbHlDb21wb25lbnQ6ICF0Lmluc3RhbnRBcHBseVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGhpcy5leHBvc2VPYmplY3RGbGF2b3JzKGZsdiwgJ2dsb2JhbCcsICdjb25maWcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gICNyZWdpc3Rlck9iamVjdFR5cGVJY29ucyhpZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy4jc3lzdGVtLnN5c3RlbSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIC8vIHNwbGl0IHRlY2huaWNhbCBuYW1lIGUuZy4gJ3N5c3RlbTpkb2N1bWVudCcgYW5kIHVzZSB0aGUgZmlyc3QgcGFydCBhcyBuYW1lc3BhY2VcbiAgICAgICAgY29uc3QgaWRUb2tlbnMgPSBpZC5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy4jY29uZmlnU2VydmljZS5nZXRBcGlCYXNlKEFwaUJhc2Uubm9uZSwgdHJ1ZSl9JHt0aGlzLiNzeXN0ZW0uZ2V0T2JqZWN0VHlwZUljb25VcmkoaWQpfWA7XG4gICAgICAgICAgdGhpcy4jaWNvblJlZ2lzdHJ5LmFkZFN2Z0ljb25Jbk5hbWVzcGFjZShcbiAgICAgICAgICAgIGlkVG9rZW5zWzBdLFxuICAgICAgICAgICAgaWRUb2tlbnNbMV0sXG4gICAgICAgICAgICB0aGlzLiNzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVyaSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9pbml0KCkge1xuICAgIC8vIHRoZSBwbGFjZSBmb3IgaW5pdGlhbGl6YXRpb24gdGFza3MgaWZcbiAgfVxufVxuIl19
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { BaseObjectTypeField } from "@yuuvis/client-core";
|
|
2
|
-
export function getShellConfigQueryString(name, user = [], context) {
|
|
3
|
-
const conditions = [
|
|
4
|
-
`${SHELL_CONFIG_BASE.nameProperty} = '${name}'`,
|
|
5
|
-
...(context ? [`system:context = '${context}'`] : []),
|
|
6
|
-
...(user.length ? [`system:user IN (${user.map((u) => `'${u}'`).join(',')})`] : [])
|
|
7
|
-
];
|
|
8
|
-
return `SELECT * FROM ${SHELL_CONFIG_BASE.objectType} WHERE ${conditions.join(' AND ')} ORDER BY ${BaseObjectTypeField.MODIFICATION_DATE} DESC`;
|
|
9
|
-
}
|
|
10
|
-
export const SHELL_CONFIG_FEATURES = 'yuv:shell:features';
|
|
11
|
-
export const SHELL_CONFIG_TYPES = 'yuv:shell:types';
|
|
12
|
-
export const SHELL_CONFIG_BASE = {
|
|
13
|
-
objectType: 'system:item',
|
|
14
|
-
secondaryObjectType: 'system:configuration',
|
|
15
|
-
nameProperty: 'system:name'
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtY29uZmlnLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC1jb25maWcvc2hlbGwtY29uZmlnLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxJQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFnQjtJQUNqRixNQUFNLFVBQVUsR0FBRztRQUNqQixHQUFHLGlCQUFpQixDQUFDLFlBQVksT0FBTyxJQUFJLEdBQUc7UUFDL0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BGLENBQUM7SUFDRixPQUFPLGlCQUFpQixpQkFBaUIsQ0FBQyxVQUFVLFVBQVUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxtQkFBbUIsQ0FBQyxpQkFBaUIsT0FBTyxDQUFDO0FBQ2xKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixVQUFVLEVBQUUsYUFBYTtJQUN6QixtQkFBbUIsRUFBRSxzQkFBc0I7SUFDM0MsWUFBWSxFQUFFLGFBQWE7Q0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VPYmplY3RUeXBlRmllbGQgfSBmcm9tIFwiQHl1dXZpcy9jbGllbnQtY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hlbGxDb25maWdRdWVyeVN0cmluZyhuYW1lOiBzdHJpbmcsIHVzZXIgPSBbXSwgY29udGV4dD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgYCR7U0hFTExfQ09ORklHX0JBU0UubmFtZVByb3BlcnR5fSA9ICcke25hbWV9J2AsXG4gICAgLi4uKGNvbnRleHQgPyBbYHN5c3RlbTpjb250ZXh0ID0gJyR7Y29udGV4dH0nYF0gOiBbXSksXG4gICAgLi4uKHVzZXIubGVuZ3RoID8gW2BzeXN0ZW06dXNlciBJTiAoJHt1c2VyLm1hcCgodSkgPT4gYCcke3V9J2ApLmpvaW4oJywnKX0pYF0gOiBbXSlcbiAgXTtcbiAgcmV0dXJuIGBTRUxFQ1QgKiBGUk9NICR7U0hFTExfQ09ORklHX0JBU0Uub2JqZWN0VHlwZX0gV0hFUkUgJHtjb25kaXRpb25zLmpvaW4oJyBBTkQgJyl9IE9SREVSIEJZICR7QmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklDQVRJT05fREFURX0gREVTQ2A7XG59XG5cbmV4cG9ydCBjb25zdCBTSEVMTF9DT05GSUdfRkVBVFVSRVMgPSAneXV2OnNoZWxsOmZlYXR1cmVzJztcbmV4cG9ydCBjb25zdCBTSEVMTF9DT05GSUdfVFlQRVMgPSAneXV2OnNoZWxsOnR5cGVzJztcblxuZXhwb3J0IGNvbnN0IFNIRUxMX0NPTkZJR19CQVNFID0ge1xuICBvYmplY3RUeXBlOiAnc3lzdGVtOml0ZW0nLFxuICBzZWNvbmRhcnlPYmplY3RUeXBlOiAnc3lzdGVtOmNvbmZpZ3VyYXRpb24nLFxuICBuYW1lUHJvcGVydHk6ICdzeXN0ZW06bmFtZSdcbn07XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwtY29uZmlnL3NoZWxsLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2hlbGxDb25maWcge1xuICAgIC8vIHRoZSBpZCBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICBpZDogc3RyaW5nO1xuICAgIC8vIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8vIGNvbnRleHQgXG4gICAgY29udGV4dD86IHN0cmluZztcbiAgICAvLyB1c2VycyB0aGlzIGNvbmZpZyBhcHBsaWVzIHRvXG4gICAgdXNlcj86IHN0cmluZ1tdO1xuICAgIC8vIHRoZSBhY3R1YWxsIGNvbmZpZ3VyYXRpb24gZGF0YVxuICAgIGRhdGE6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U2hlbGxUeXBlIHtcbiAgICAvLyBvYmplY3QgdHlwZSBvciBTT1QgSURcbiAgICBpZDogc3RyaW5nO1xuICAgIGJhc2VUeXBlOiBzdHJpbmc7XG4gICAgaW5zdGFudEFwcGx5PzogYm9vbGVhblxuICAgIGFwcGxpY2FibGVUb01pbWVUeXBlcz86IHN0cmluZ1tdO1xuXG59Il19
|