@sinequa/assistant 3.9.2 → 3.9.3
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/chat/chat.component.d.ts +35 -38
- package/chat/chat.service.d.ts +190 -84
- package/chat/debug-message/debug-message-details/debug-message-details.component.d.ts +19 -0
- package/chat/debug-message/debug-message.component.d.ts +9 -12
- package/chat/debug-message/debug-message.service.d.ts +15 -0
- package/chat/documents-upload/document-list/document-list.component.d.ts +1 -0
- package/chat/public-api.d.ts +0 -2
- package/chat/saved-chats/i18n/en.json +1 -1
- package/chat/saved-chats/i18n/fr.json +1 -1
- package/chat/saved-chats/saved-chats.component.d.ts +1 -0
- package/chat/saved-chats/saved-chats.service.d.ts +27 -0
- package/chat/services/assistant-configuration.service.d.ts +34 -0
- package/chat/services/assistant-metadata.service.d.ts +18 -0
- package/chat/services/assistant-tokens-tracking.service.d.ts +23 -0
- package/chat/services/assistant-ws-frames.service.d.ts +50 -0
- package/chat/services/signalR-connection.service.d.ts +25 -0
- package/chat/types.d.ts +12 -3
- package/chat/utils/utils.service.d.ts +67 -0
- package/esm2022/chat/chat.component.mjs +198 -227
- package/esm2022/chat/chat.service.mjs +450 -267
- package/esm2022/chat/debug-message/debug-message-details/debug-message-details.component.mjs +43 -0
- package/esm2022/chat/debug-message/debug-message.component.mjs +27 -30
- package/esm2022/chat/debug-message/debug-message.service.mjs +52 -0
- package/esm2022/chat/dialogs/rename-saved-chat.component.mjs +6 -5
- package/esm2022/chat/documents-upload/document-list/document-list.component.mjs +4 -2
- package/esm2022/chat/public-api.mjs +1 -3
- package/esm2022/chat/saved-chats/saved-chats.component.mjs +11 -10
- package/esm2022/chat/saved-chats/saved-chats.service.mjs +165 -0
- package/esm2022/chat/services/assistant-configuration.service.mjs +171 -0
- package/esm2022/chat/services/assistant-metadata.service.mjs +67 -0
- package/esm2022/chat/services/assistant-tokens-tracking.service.mjs +57 -0
- package/esm2022/chat/services/assistant-ws-frames.service.mjs +392 -0
- package/esm2022/chat/services/signalR-connection.service.mjs +109 -0
- package/esm2022/chat/types.mjs +1 -1
- package/esm2022/chat/unified-plugins/embedded-image-reference.plugin.mjs +2 -3
- package/esm2022/chat/utils/utils.service.mjs +170 -0
- package/fesm2022/sinequa-assistant-chat.mjs +2020 -1648
- package/fesm2022/sinequa-assistant-chat.mjs.map +1 -1
- package/package.json +1 -1
- package/chat/rest-chat.service.d.ts +0 -31
- package/chat/websocket-chat.service.d.ts +0 -102
- package/esm2022/chat/rest-chat.service.mjs +0 -300
- package/esm2022/chat/websocket-chat.service.mjs +0 -659
|
@@ -5,6 +5,7 @@ import { BehaviorSubject, Subscription, combineLatest, filter, of, switchMap, ta
|
|
|
5
5
|
import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';
|
|
6
6
|
import { parseISO, toDate } from "date-fns";
|
|
7
7
|
import { isAuthenticated } from "@sinequa/atomic";
|
|
8
|
+
import { AssistantUtils } from "../utils/utils.service";
|
|
8
9
|
import { DialogDeleteSavedChatComponent } from "../dialogs/delete-saved-chat.component";
|
|
9
10
|
import { DialogRenameSavedChatComponent } from "../dialogs/rename-saved-chat.component";
|
|
10
11
|
import { InstanceManagerService } from "../instance-manager.service";
|
|
@@ -21,11 +22,14 @@ export class SavedChatsComponent {
|
|
|
21
22
|
this.instanceManagerService = inject(InstanceManagerService);
|
|
22
23
|
this.notificationsService = inject(NotificationsService);
|
|
23
24
|
this.transloco = inject(TranslocoService);
|
|
25
|
+
this.assistantUtils = inject(AssistantUtils);
|
|
24
26
|
}
|
|
25
27
|
ngOnInit() {
|
|
26
28
|
this.subscription.add(of(isAuthenticated()).pipe(tap(_ => this.instantiateChatService()), switchMap(_ => this.chatService.userOverride$), switchMap(_ => this.chatService.initProcess$), filter(success => !!success), tap(_ => {
|
|
27
29
|
this.onListSavedChat();
|
|
28
|
-
this.chatService.
|
|
30
|
+
if (!!this.chatService.assistantConfig$.value.savedChatSettings?.enabled) {
|
|
31
|
+
this.chatService.listSavedChat();
|
|
32
|
+
}
|
|
29
33
|
})).subscribe());
|
|
30
34
|
}
|
|
31
35
|
ngOnDestroy() {
|
|
@@ -38,18 +42,15 @@ export class SavedChatsComponent {
|
|
|
38
42
|
this.subscription.add(combineLatest([
|
|
39
43
|
this.chatService.savedChats$,
|
|
40
44
|
this.transloco.langChanges$
|
|
41
|
-
]).subscribe(([savedChats]) =>
|
|
42
|
-
this.groupedSavedChats$.next(this._groupSavedChatsByDate(savedChats));
|
|
43
|
-
}));
|
|
45
|
+
]).pipe(filter(([savedChats]) => !!savedChats)).subscribe(([savedChats]) => this.groupedSavedChats$.next(this._groupSavedChatsByDate(savedChats))));
|
|
44
46
|
}
|
|
45
47
|
onLoad(savedChat) {
|
|
46
48
|
if (!!this.chatService.streaming$.value || !!this.chatService.stoppingGeneration$.value) {
|
|
47
49
|
return;
|
|
48
50
|
}
|
|
49
|
-
this.chatService.setSavedChatId(savedChat.id);
|
|
50
51
|
this.chatService.generateChatId(savedChat.id);
|
|
51
52
|
this.chatService.loadSavedChat$.next(savedChat);
|
|
52
|
-
this.chatService.listSavedChat();
|
|
53
|
+
this.chatService.listSavedChat(); // assuming saved chats operations are certainly enabled at this level
|
|
53
54
|
this.load.emit(savedChat);
|
|
54
55
|
}
|
|
55
56
|
_groupSavedChatsByDate(savedChats) {
|
|
@@ -57,7 +58,7 @@ export class SavedChatsComponent {
|
|
|
57
58
|
savedChats
|
|
58
59
|
.sort((a, b) => parseISO(b.modifiedUTC).getTime() - parseISO(a.modifiedUTC).getTime())
|
|
59
60
|
.forEach(savedChat => {
|
|
60
|
-
const groupKey = this.
|
|
61
|
+
const groupKey = this.assistantUtils.getTimeKey(toDate(parseISO(savedChat.modifiedUTC))); // Must convert the UTC date to local date before passing to _getTimeKey
|
|
61
62
|
if (!groupedSavedChats.has(groupKey)) {
|
|
62
63
|
groupedSavedChats.set(groupKey, []);
|
|
63
64
|
}
|
|
@@ -67,11 +68,11 @@ export class SavedChatsComponent {
|
|
|
67
68
|
;
|
|
68
69
|
}
|
|
69
70
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedChatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SavedChatsComponent, isStandalone: true, selector: "sq-saved-chats-v3", inputs: { instanceId: "instanceId" }, outputs: { load: "load", delete: "delete" }, providers: [provideTranslocoScope('saved-chats', 'chat')], ngImport: i0, template: "<ng-container *ngIf=\"(chatService.assistantConfig$ | async)?.savedChatSettings.display\">\n <div *ngIf=\"chatService.savedChatsError$ | async\" class=\"alert alert-danger\">\n {{ 'savedChats.
|
|
71
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SavedChatsComponent, isStandalone: true, selector: "sq-saved-chats-v3", inputs: { instanceId: "instanceId" }, outputs: { load: "load", delete: "delete" }, providers: [provideTranslocoScope('saved-chats', 'chat')], ngImport: i0, template: "<ng-container *ngIf=\"(chatService.assistantConfig$ | async)?.savedChatSettings.display\">\n <div *ngIf=\"chatService.savedChatsError$ | async\" class=\"alert alert-danger\">\n {{ 'savedChats.listError' | transloco }}\n </div>\n <div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\"\n (click)=\"onLoad(savedChat)\"\n class=\"saved-chat p-2\"\n [class.forbidden]=\"(chatService.streaming$ | async) || (chatService.stoppingGeneration$ | async)\"\n [class.active]=\"chatService.chatId === savedChat.id\">\n <span class=\"title me-1\" [sqTooltip]=\"savedChat.title\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-pen mx-1\" [sqTooltip]=\"'savedChats.rename' | transloco\" (click)=\"renameDialog.showModal($event, savedChat)\"></i>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'savedChats.delete' | transloco\" (click)=\"deleteDialog.showModal($event, savedChat)\"></i>\n </div>\n </div>\n</ng-container>\n\n<sq-dialog-delete-saved-chat [chatService]=\"chatService\" (delete)=\"delete.emit($event)\" #deleteDialog />\n<sq-dialog-rename-saved-chat [chatService]=\"chatService\" #renameDialog />\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}.saved-chats .saved-chat-date{font-size:12px;font-weight:500;color:#a9a9a9;margin-top:.5rem}.saved-chats .saved-chat{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.saved-chats .saved-chat span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.saved-chats .saved-chat .saved-chat-actions{display:none}.saved-chats .saved-chat:hover,.saved-chats .saved-chat.active{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-saved-chat-hover-background, #FFF8F1)}.saved-chats .saved-chat:hover .saved-chat-actions{display:block}.saved-chats .saved-chat.forbidden{cursor:not-allowed}.saved-chats .title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: DialogRenameSavedChatComponent, selector: "sq-dialog-rename-saved-chat", inputs: ["chatService"] }, { kind: "component", type: DialogDeleteSavedChatComponent, selector: "sq-dialog-delete-saved-chat", inputs: ["chatService"], outputs: ["delete"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
|
|
71
72
|
}
|
|
72
73
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedChatsComponent, decorators: [{
|
|
73
74
|
type: Component,
|
|
74
|
-
args: [{ selector: 'sq-saved-chats-v3', standalone: true, providers: [provideTranslocoScope('saved-chats', 'chat')], imports: [CommonModule, FormsModule, TooltipDirective, DialogRenameSavedChatComponent, DialogDeleteSavedChatComponent, TranslocoPipe], template: "<ng-container *ngIf=\"(chatService.assistantConfig$ | async)?.savedChatSettings.display\">\n <div *ngIf=\"chatService.savedChatsError$ | async\" class=\"alert alert-danger\">\n {{ 'savedChats.
|
|
75
|
+
args: [{ selector: 'sq-saved-chats-v3', standalone: true, providers: [provideTranslocoScope('saved-chats', 'chat')], imports: [CommonModule, FormsModule, TooltipDirective, DialogRenameSavedChatComponent, DialogDeleteSavedChatComponent, TranslocoPipe], template: "<ng-container *ngIf=\"(chatService.assistantConfig$ | async)?.savedChatSettings.display\">\n <div *ngIf=\"chatService.savedChatsError$ | async\" class=\"alert alert-danger\">\n {{ 'savedChats.listError' | transloco }}\n </div>\n <div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\"\n (click)=\"onLoad(savedChat)\"\n class=\"saved-chat p-2\"\n [class.forbidden]=\"(chatService.streaming$ | async) || (chatService.stoppingGeneration$ | async)\"\n [class.active]=\"chatService.chatId === savedChat.id\">\n <span class=\"title me-1\" [sqTooltip]=\"savedChat.title\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-pen mx-1\" [sqTooltip]=\"'savedChats.rename' | transloco\" (click)=\"renameDialog.showModal($event, savedChat)\"></i>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'savedChats.delete' | transloco\" (click)=\"deleteDialog.showModal($event, savedChat)\"></i>\n </div>\n </div>\n</ng-container>\n\n<sq-dialog-delete-saved-chat [chatService]=\"chatService\" (delete)=\"delete.emit($event)\" #deleteDialog />\n<sq-dialog-rename-saved-chat [chatService]=\"chatService\" #renameDialog />\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}.saved-chats .saved-chat-date{font-size:12px;font-weight:500;color:#a9a9a9;margin-top:.5rem}.saved-chats .saved-chat{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.saved-chats .saved-chat span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.saved-chats .saved-chat .saved-chat-actions{display:none}.saved-chats .saved-chat:hover,.saved-chats .saved-chat.active{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-saved-chat-hover-background, #FFF8F1)}.saved-chats .saved-chat:hover .saved-chat-actions{display:block}.saved-chats .saved-chat.forbidden{cursor:not-allowed}.saved-chats .title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
75
76
|
}], propDecorators: { instanceId: [{
|
|
76
77
|
type: Input
|
|
77
78
|
}], load: [{
|
|
@@ -79,4 +80,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
79
80
|
}], delete: [{
|
|
80
81
|
type: Output
|
|
81
82
|
}] } });
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2hhdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2xELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhC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QUFxQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUNoRCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsOEJBQThCLEVBQUUsOEJBQThCLEVBQUUsYUFBYSxDQUFDOzhCQUk1SCxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG9mLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBwcm92aWRlVHJhbnNsb2NvU2NvcGUsIFRyYW5zbG9jb1BpcGUsIFRyYW5zbG9jb1NlcnZpY2UgfSBmcm9tICdAanN2ZXJzZS90cmFuc2xvY28nO1xuaW1wb3J0IHsgcGFyc2VJU08sIHRvRGF0ZSB9IGZyb20gXCJkYXRlLWZuc1wiO1xuXG5pbXBvcnQgeyBpc0F1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiQHNpbmVxdWEvYXRvbWljXCI7XG5cbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgRGlhbG9nRGVsZXRlU2F2ZWRDaGF0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2RpYWxvZ3MvZGVsZXRlLXNhdmVkLWNoYXQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEaWFsb2dSZW5hbWVTYXZlZENoYXRDb21wb25lbnQgfSBmcm9tIFwiLi4vZGlhbG9ncy9yZW5hbWUtc2F2ZWQtY2hhdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gXCIuLi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBTYXZlZENoYXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1zYXZlZC1jaGF0cy12MycsXG4gIHRlbXBsYXRlVXJsOiAnc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2F2ZWQtY2hhdHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbcHJvdmlkZVRyYW5zbG9jb1Njb3BlKCdzYXZlZC1jaGF0cycsICdjaGF0JyldLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgVG9vbHRpcERpcmVjdGl2ZSwgRGlhbG9nUmVuYW1lU2F2ZWRDaGF0Q29tcG9uZW50LCBEaWFsb2dEZWxldGVTYXZlZENoYXRDb21wb25lbnQsIFRyYW5zbG9jb1BpcGVdXG59KVxuZXhwb3J0IGNsYXNzIFNhdmVkQ2hhdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGFwcHJvcHJpYXRlIGNoYXRTZXJ2aWNlIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlICovXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcblxuICBAT3V0cHV0KCkgbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2F2ZWRDaGF0PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTYXZlZENoYXQ+KCk7XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIGdyb3VwZWRTYXZlZENoYXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBrZXk6IHN0cmluZywgdmFsdWU6IFNhdmVkQ2hhdFtdIH1bXT4oW10pO1xuXG4gIHB1YmxpYyBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEluc3RhbmNlTWFuYWdlclNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jbyA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBvZihpc0F1dGhlbnRpY2F0ZWQoKSkucGlwZShcbiAgICAgICAgdGFwKF8gPT4gdGhpcy5pbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRQcm9jZXNzJCksXG4gICAgICAgIGZpbHRlcihzdWNjZXNzID0+ICEhc3VjY2VzcyksXG4gICAgICAgIHRhcChfID0+IHtcbiAgICAgICAgICB0aGlzLm9uTGlzdFNhdmVkQ2hhdCgpO1xuICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlID0gdGhpcy5pbnN0YW5jZU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMuaW5zdGFuY2VJZCk7XG4gIH1cblxuICBvbkxpc3RTYXZlZENoYXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2F2ZWRDaGF0cyQsXG4gICAgICAgIHRoaXMudHJhbnNsb2NvLmxhbmdDaGFuZ2VzJFxuICAgICAgXSkuc3Vic2NyaWJlKChbc2F2ZWRDaGF0c10pID0+IHtcbiAgICAgICAgdGhpcy5ncm91cGVkU2F2ZWRDaGF0cyQubmV4dCh0aGlzLl9ncm91cFNhdmVkQ2hhdHNCeURhdGUoc2F2ZWRDaGF0cykpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb25Mb2FkKHNhdmVkQ2hhdDogU2F2ZWRDaGF0KSB7XG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZS5zdHJlYW1pbmckLnZhbHVlIHx8ICEhdGhpcy5jaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQoc2F2ZWRDaGF0LmlkKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQ2hhdElkKHNhdmVkQ2hhdC5pZCk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5sb2FkU2F2ZWRDaGF0JC5uZXh0KHNhdmVkQ2hhdCk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5saXN0U2F2ZWRDaGF0KCk7XG4gICAgdGhpcy5sb2FkLmVtaXQoc2F2ZWRDaGF0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dyb3VwU2F2ZWRDaGF0c0J5RGF0ZShzYXZlZENoYXRzOiBTYXZlZENoYXRbXSk6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBTYXZlZENoYXRbXSB9W10ge1xuICAgIGNvbnN0IGdyb3VwZWRTYXZlZENoYXRzID0gbmV3IE1hcDxzdHJpbmcsIFNhdmVkQ2hhdFtdPigpO1xuXG4gICAgc2F2ZWRDaGF0c1xuICAgICAgLnNvcnQoKGEsIGIpID0+IHBhcnNlSVNPKGIubW9kaWZpZWRVVEMpLmdldFRpbWUoKSAtIHBhcnNlSVNPKGEubW9kaWZpZWRVVEMpLmdldFRpbWUoKSlcbiAgICAgIC5mb3JFYWNoKHNhdmVkQ2hhdCA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwS2V5ID0gdGhpcy5jaGF0U2VydmljZS5nZXRUaW1lS2V5KHRvRGF0ZShwYXJzZUlTTyhzYXZlZENoYXQubW9kaWZpZWRVVEMpKSk7IC8vIE11c3QgY29udmVydCB0aGUgVVRDIGRhdGUgdG8gbG9jYWwgZGF0ZSBiZWZvcmUgcGFzc2luZyB0byBfZ2V0VGltZUtleVxuXG4gICAgICAgIGlmICghZ3JvdXBlZFNhdmVkQ2hhdHMuaGFzKGdyb3VwS2V5KSkge1xuICAgICAgICAgIGdyb3VwZWRTYXZlZENoYXRzLnNldChncm91cEtleSwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXBlZFNhdmVkQ2hhdHMuZ2V0KGdyb3VwS2V5KSEucHVzaChzYXZlZENoYXQpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cGVkU2F2ZWRDaGF0cywgKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSk7O1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiKGNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQgfCBhc3luYyk/LnNhdmVkQ2hhdFNldHRpbmdzLmRpc3BsYXlcIj5cbiAgPGRpdiAqbmdJZj1cImNoYXRTZXJ2aWNlLnNhdmVkQ2hhdHNFcnJvciQgfCBhc3luY1wiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gICAge3sgJ3NhdmVkQ2hhdHMuZXJyb3InIHwgdHJhbnNsb2NvIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiAoZ3JvdXBlZFNhdmVkQ2hhdHMkIHwgYXN5bmMpXCIgY2xhc3M9XCJzYXZlZC1jaGF0c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzYXZlZC1jaGF0LWRhdGVcIj57e2dyb3VwLmtleX19PC9kaXY+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgc2F2ZWRDaGF0IG9mIGdyb3VwLnZhbHVlXCJcbiAgICAgIChjbGljayk9XCJvbkxvYWQoc2F2ZWRDaGF0KVwiXG4gICAgICBjbGFzcz1cInNhdmVkLWNoYXQgcC0yXCJcbiAgICAgIFtjbGFzcy5mb3JiaWRkZW5dPVwiKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgfHwgKGNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQgfCBhc3luYylcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjaGF0U2VydmljZS5zYXZlZENoYXRJZCA9PT0gc2F2ZWRDaGF0LmlkXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRpdGxlIG1lLTFcIiBbc3FUb29sdGlwXT1cInNhdmVkQ2hhdC50aXRsZVwiPnt7c2F2ZWRDaGF0LnRpdGxlfX08L3NwYW4+XG4gICAgICA8aSBjbGFzcz1cInNhdmVkLWNoYXQtYWN0aW9ucyBmYXMgZmEtcGVuIG14LTFcIiBbc3FUb29sdGlwXT1cIidzYXZlZENoYXRzLnJlbmFtZScgfCB0cmFuc2xvY29cIiAoY2xpY2spPVwicmVuYW1lRGlhbG9nLnNob3dNb2RhbCgkZXZlbnQsIHNhdmVkQ2hhdClcIj48L2k+XG4gICAgICA8aSBjbGFzcz1cInNhdmVkLWNoYXQtYWN0aW9ucyBmYXMgZmEtdHJhc2ggbXMtMVwiIFtzcVRvb2x0aXBdPVwiJ3NhdmVkQ2hhdHMuZGVsZXRlJyB8IHRyYW5zbG9jb1wiIChjbGljayk9XCJkZWxldGVEaWFsb2cuc2hvd01vZGFsKCRldmVudCwgc2F2ZWRDaGF0KVwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPHNxLWRpYWxvZy1kZWxldGUtc2F2ZWQtY2hhdCBbY2hhdFNlcnZpY2VdPVwiY2hhdFNlcnZpY2VcIiAoZGVsZXRlKT1cImRlbGV0ZS5lbWl0KCRldmVudClcIiAjZGVsZXRlRGlhbG9nIC8+XG48c3EtZGlhbG9nLXJlbmFtZS1zYXZlZC1jaGF0IFtjaGF0U2VydmljZV09XCJjaGF0U2VydmljZVwiICNyZW5hbWVEaWFsb2cgLz5cbiJdfQ==
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2hhdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FB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QkFBbUIsbUpBSG5CLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLDBCQ3hCM0QsK3hDQW9CQSxxbUVES1ksWUFBWSxvVEFBRSxXQUFXLCtCQUFFLGdCQUFnQixxTUFBRSw4QkFBOEIsaUdBQUUsOEJBQThCLGlIQUFFLGFBQWE7OzRGQUV6SCxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsbUJBQW1CLGNBR2pCLElBQUksYUFDTCxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUNoRCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsOEJBQThCLEVBQUUsOEJBQThCLEVBQUUsYUFBYSxDQUFDOzhCQUk1SCxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG9mLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBwcm92aWRlVHJhbnNsb2NvU2NvcGUsIFRyYW5zbG9jb1BpcGUsIFRyYW5zbG9jb1NlcnZpY2UgfSBmcm9tICdAanN2ZXJzZS90cmFuc2xvY28nO1xuaW1wb3J0IHsgcGFyc2VJU08sIHRvRGF0ZSB9IGZyb20gXCJkYXRlLWZuc1wiO1xuXG5pbXBvcnQgeyBpc0F1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiQHNpbmVxdWEvYXRvbWljXCI7XG5cbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQXNzaXN0YW50VXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHsgRGlhbG9nRGVsZXRlU2F2ZWRDaGF0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2RpYWxvZ3MvZGVsZXRlLXNhdmVkLWNoYXQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEaWFsb2dSZW5hbWVTYXZlZENoYXRDb21wb25lbnQgfSBmcm9tIFwiLi4vZGlhbG9ncy9yZW5hbWUtc2F2ZWQtY2hhdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gXCIuLi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBTYXZlZENoYXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1zYXZlZC1jaGF0cy12MycsXG4gIHRlbXBsYXRlVXJsOiAnc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2F2ZWQtY2hhdHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbcHJvdmlkZVRyYW5zbG9jb1Njb3BlKCdzYXZlZC1jaGF0cycsICdjaGF0JyldLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgVG9vbHRpcERpcmVjdGl2ZSwgRGlhbG9nUmVuYW1lU2F2ZWRDaGF0Q29tcG9uZW50LCBEaWFsb2dEZWxldGVTYXZlZENoYXRDb21wb25lbnQsIFRyYW5zbG9jb1BpcGVdXG59KVxuZXhwb3J0IGNsYXNzIFNhdmVkQ2hhdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGFwcHJvcHJpYXRlIGNoYXRTZXJ2aWNlIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlICovXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcblxuICBAT3V0cHV0KCkgbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2F2ZWRDaGF0PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTYXZlZENoYXQ+KCk7XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIGdyb3VwZWRTYXZlZENoYXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBrZXk6IHN0cmluZywgdmFsdWU6IFNhdmVkQ2hhdFtdIH1bXT4oW10pO1xuXG4gIHB1YmxpYyBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEluc3RhbmNlTWFuYWdlclNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jbyA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3Npc3RhbnRVdGlscyA9IGluamVjdChBc3Npc3RhbnRVdGlscyk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgb2YoaXNBdXRoZW50aWNhdGVkKCkpLnBpcGUoXG4gICAgICAgIHRhcChfID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgc3dpdGNoTWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS51c2VyT3ZlcnJpZGUkKSxcbiAgICAgICAgc3dpdGNoTWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS5pbml0UHJvY2VzcyQpLFxuICAgICAgICBmaWx0ZXIoc3VjY2VzcyA9PiAhIXN1Y2Nlc3MpLFxuICAgICAgICB0YXAoXyA9PiB7XG4gICAgICAgICAgdGhpcy5vbkxpc3RTYXZlZENoYXQoKTtcbiAgICAgICAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLnNhdmVkQ2hhdFNldHRpbmdzPy5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmxpc3RTYXZlZENoYXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcbiAgfVxuXG4gIG9uTGlzdFNhdmVkQ2hhdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5zYXZlZENoYXRzJCxcbiAgICAgICAgdGhpcy50cmFuc2xvY28ubGFuZ0NoYW5nZXMkXG4gICAgICBdKS5waXBlKFxuICAgICAgICBmaWx0ZXIoKFtzYXZlZENoYXRzXSkgPT4gISFzYXZlZENoYXRzKVxuICAgICAgKS5zdWJzY3JpYmUoKFtzYXZlZENoYXRzXSkgPT4gdGhpcy5ncm91cGVkU2F2ZWRDaGF0cyQubmV4dCh0aGlzLl9ncm91cFNhdmVkQ2hhdHNCeURhdGUoc2F2ZWRDaGF0cykpKVxuICAgICk7XG4gIH1cblxuICBvbkxvYWQoc2F2ZWRDaGF0OiBTYXZlZENoYXQpIHtcbiAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQudmFsdWUgfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnN0b3BwaW5nR2VuZXJhdGlvbiQudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5nZW5lcmF0ZUNoYXRJZChzYXZlZENoYXQuaWQpO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UubG9hZFNhdmVkQ2hhdCQubmV4dChzYXZlZENoYXQpO1xuICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpOyAvLyBhc3N1bWluZyBzYXZlZCBjaGF0cyBvcGVyYXRpb25zIGFyZSBjZXJ0YWlubHkgZW5hYmxlZCBhdCB0aGlzIGxldmVsXG4gICAgdGhpcy5sb2FkLmVtaXQoc2F2ZWRDaGF0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dyb3VwU2F2ZWRDaGF0c0J5RGF0ZShzYXZlZENoYXRzOiBTYXZlZENoYXRbXSk6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBTYXZlZENoYXRbXSB9W10ge1xuICAgIGNvbnN0IGdyb3VwZWRTYXZlZENoYXRzID0gbmV3IE1hcDxzdHJpbmcsIFNhdmVkQ2hhdFtdPigpO1xuXG4gICAgc2F2ZWRDaGF0c1xuICAgICAgLnNvcnQoKGEsIGIpID0+IHBhcnNlSVNPKGIubW9kaWZpZWRVVEMpLmdldFRpbWUoKSAtIHBhcnNlSVNPKGEubW9kaWZpZWRVVEMpLmdldFRpbWUoKSlcbiAgICAgIC5mb3JFYWNoKHNhdmVkQ2hhdCA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwS2V5ID0gdGhpcy5hc3Npc3RhbnRVdGlscy5nZXRUaW1lS2V5KHRvRGF0ZShwYXJzZUlTTyhzYXZlZENoYXQubW9kaWZpZWRVVEMpKSk7IC8vIE11c3QgY29udmVydCB0aGUgVVRDIGRhdGUgdG8gbG9jYWwgZGF0ZSBiZWZvcmUgcGFzc2luZyB0byBfZ2V0VGltZUtleVxuXG4gICAgICAgIGlmICghZ3JvdXBlZFNhdmVkQ2hhdHMuaGFzKGdyb3VwS2V5KSkge1xuICAgICAgICAgIGdyb3VwZWRTYXZlZENoYXRzLnNldChncm91cEtleSwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXBlZFNhdmVkQ2hhdHMuZ2V0KGdyb3VwS2V5KSEucHVzaChzYXZlZENoYXQpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cGVkU2F2ZWRDaGF0cywgKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSk7O1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiKGNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQgfCBhc3luYyk/LnNhdmVkQ2hhdFNldHRpbmdzLmRpc3BsYXlcIj5cbiAgPGRpdiAqbmdJZj1cImNoYXRTZXJ2aWNlLnNhdmVkQ2hhdHNFcnJvciQgfCBhc3luY1wiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gICAge3sgJ3NhdmVkQ2hhdHMubGlzdEVycm9yJyB8IHRyYW5zbG9jbyB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgKGdyb3VwZWRTYXZlZENoYXRzJCB8IGFzeW5jKVwiIGNsYXNzPVwic2F2ZWQtY2hhdHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtY2hhdC1kYXRlXCI+e3tncm91cC5rZXl9fTwvZGl2PlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IHNhdmVkQ2hhdCBvZiBncm91cC52YWx1ZVwiXG4gICAgICAoY2xpY2spPVwib25Mb2FkKHNhdmVkQ2hhdClcIlxuICAgICAgY2xhc3M9XCJzYXZlZC1jaGF0IHAtMlwiXG4gICAgICBbY2xhc3MuZm9yYmlkZGVuXT1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpIHx8IChjaGF0U2VydmljZS5zdG9wcGluZ0dlbmVyYXRpb24kIHwgYXN5bmMpXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY2hhdFNlcnZpY2UuY2hhdElkID09PSBzYXZlZENoYXQuaWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGUgbWUtMVwiIFtzcVRvb2x0aXBdPVwic2F2ZWRDaGF0LnRpdGxlXCI+e3tzYXZlZENoYXQudGl0bGV9fTwvc3Bhbj5cbiAgICAgIDxpIGNsYXNzPVwic2F2ZWQtY2hhdC1hY3Rpb25zIGZhcyBmYS1wZW4gbXgtMVwiIFtzcVRvb2x0aXBdPVwiJ3NhdmVkQ2hhdHMucmVuYW1lJyB8IHRyYW5zbG9jb1wiIChjbGljayk9XCJyZW5hbWVEaWFsb2cuc2hvd01vZGFsKCRldmVudCwgc2F2ZWRDaGF0KVwiPjwvaT5cbiAgICAgIDxpIGNsYXNzPVwic2F2ZWQtY2hhdC1hY3Rpb25zIGZhcyBmYS10cmFzaCBtcy0xXCIgW3NxVG9vbHRpcF09XCInc2F2ZWRDaGF0cy5kZWxldGUnIHwgdHJhbnNsb2NvXCIgKGNsaWNrKT1cImRlbGV0ZURpYWxvZy5zaG93TW9kYWwoJGV2ZW50LCBzYXZlZENoYXQpXCI+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48c3EtZGlhbG9nLWRlbGV0ZS1zYXZlZC1jaGF0IFtjaGF0U2VydmljZV09XCJjaGF0U2VydmljZVwiIChkZWxldGUpPVwiZGVsZXRlLmVtaXQoJGV2ZW50KVwiICNkZWxldGVEaWFsb2cgLz5cbjxzcS1kaWFsb2ctcmVuYW1lLXNhdmVkLWNoYXQgW2NoYXRTZXJ2aWNlXT1cImNoYXRTZXJ2aWNlXCIgI3JlbmFtZURpYWxvZyAvPlxuIl19
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { from, throwError } from 'rxjs';
|
|
3
|
+
import { tap, catchError, map } from 'rxjs/operators';
|
|
4
|
+
import { get, post } from '@sinequa/atomic';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class SavedChatsService {
|
|
7
|
+
constructor() { }
|
|
8
|
+
init(config) {
|
|
9
|
+
if (this.operationConfig) {
|
|
10
|
+
console.warn('SavedChatsService already initialized.');
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
this.operationConfig = config;
|
|
14
|
+
}
|
|
15
|
+
ensureInitialized() {
|
|
16
|
+
if (!this.operationConfig) {
|
|
17
|
+
throw new Error('SavedChatsService not initialized. Call init() first.');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
listChats() {
|
|
21
|
+
this.ensureInitialized();
|
|
22
|
+
const config = this.operationConfig;
|
|
23
|
+
if (!config.isSavedChatsEnabled()) {
|
|
24
|
+
throwError(() => new Error("Operations on saved chats are disabled"));
|
|
25
|
+
}
|
|
26
|
+
const data = {
|
|
27
|
+
action: "SavedChatList",
|
|
28
|
+
appName: config.getAppName(),
|
|
29
|
+
instanceId: config.getInstanceId(),
|
|
30
|
+
debug: config.getDebugFlag()
|
|
31
|
+
};
|
|
32
|
+
const searchParams = new URLSearchParams(Object.entries(data).reduce((acc, [key, value]) => {
|
|
33
|
+
acc[key] = String(value);
|
|
34
|
+
return acc;
|
|
35
|
+
}, {}));
|
|
36
|
+
from(get(`plugin/${config.getRestUrl()}`, searchParams)).pipe(tap(res => {
|
|
37
|
+
config.updateSavedChatsList(res.savedChats);
|
|
38
|
+
config.setSavedChatsErrorStatus(false);
|
|
39
|
+
}), catchError((error) => {
|
|
40
|
+
const errorMsg = 'Error occurred while calling the SavedChatList API: ' + error.error?.errorMessage;
|
|
41
|
+
console.error('SavedChatsService: ' + errorMsg);
|
|
42
|
+
config.setSavedChatsErrorStatus(true);
|
|
43
|
+
return throwError(() => error);
|
|
44
|
+
})).subscribe();
|
|
45
|
+
}
|
|
46
|
+
getChatById(id) {
|
|
47
|
+
this.ensureInitialized();
|
|
48
|
+
const config = this.operationConfig;
|
|
49
|
+
if (!config.isSavedChatsEnabled()) {
|
|
50
|
+
return throwError(() => new Error("Operations on saved chats are disabled"));
|
|
51
|
+
}
|
|
52
|
+
const data = {
|
|
53
|
+
action: "SavedChatGet",
|
|
54
|
+
appName: config.getAppName(),
|
|
55
|
+
instanceId: config.getInstanceId(),
|
|
56
|
+
chatId: id,
|
|
57
|
+
debug: config.getDebugFlag()
|
|
58
|
+
};
|
|
59
|
+
const searchParams = new URLSearchParams(Object.entries(data).reduce((acc, [key, value]) => {
|
|
60
|
+
acc[key] = String(value);
|
|
61
|
+
return acc;
|
|
62
|
+
}, {}));
|
|
63
|
+
return from(get(`plugin/${config.getRestUrl()}`, searchParams)).pipe(tap(res => {
|
|
64
|
+
config.generateAuditEvent('ast-saved-chat.load', { duration: res.executionTimeMilliseconds }, res.savedChat.id);
|
|
65
|
+
}), map(res => res.savedChat), catchError((error) => {
|
|
66
|
+
const errorMsg = 'Error occurred while calling the SavedChatGet API: ' + error.error?.errorMessage;
|
|
67
|
+
console.error('SavedChatsService: ' + errorMsg);
|
|
68
|
+
return throwError(() => error);
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
addChat(id, messages) {
|
|
72
|
+
this.ensureInitialized();
|
|
73
|
+
const config = this.operationConfig;
|
|
74
|
+
if (!config.isSavedChatsEnabled()) {
|
|
75
|
+
return throwError(() => new Error("Operations on saved chats are disabled"));
|
|
76
|
+
}
|
|
77
|
+
const data = {
|
|
78
|
+
action: "SavedChatAdd",
|
|
79
|
+
appName: config.getAppName(),
|
|
80
|
+
instanceId: config.getInstanceId(),
|
|
81
|
+
chatId: id,
|
|
82
|
+
history: messages,
|
|
83
|
+
debug: config.getDebugFlag()
|
|
84
|
+
};
|
|
85
|
+
return from(post(`plugin/${config.getRestUrl()}`, data)).pipe(tap(res => {
|
|
86
|
+
config.generateAuditEvent('ast-saved-chat.add', { duration: res.executionTimeMilliseconds }, res.savedChat.id);
|
|
87
|
+
}), catchError((error) => {
|
|
88
|
+
const errorMsg = 'Error occurred while calling the SavedChatAdd API: ' + error.error?.errorMessage;
|
|
89
|
+
console.error('SavedChatsService: ' + errorMsg);
|
|
90
|
+
return throwError(() => error);
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
updateChat(id, name, messages) {
|
|
94
|
+
this.ensureInitialized();
|
|
95
|
+
const config = this.operationConfig;
|
|
96
|
+
if (!config.isSavedChatsEnabled()) {
|
|
97
|
+
return throwError(() => new Error("Operations on saved chats are disabled"));
|
|
98
|
+
}
|
|
99
|
+
const data = {
|
|
100
|
+
action: "SavedChatUpdate",
|
|
101
|
+
appName: config.getAppName(),
|
|
102
|
+
instanceId: config.getInstanceId(),
|
|
103
|
+
chatId: id,
|
|
104
|
+
debug: config.getDebugFlag()
|
|
105
|
+
};
|
|
106
|
+
if (name)
|
|
107
|
+
data["title"] = name;
|
|
108
|
+
if (messages)
|
|
109
|
+
data["history"] = messages;
|
|
110
|
+
return from(post(`plugin/${config.getRestUrl()}`, data)).pipe(catchError((error) => {
|
|
111
|
+
const errorMsg = 'Error occurred while calling the SavedChatUpdate API: ' + error.error?.errorMessage;
|
|
112
|
+
console.error('SavedChatsService: ' + errorMsg);
|
|
113
|
+
return throwError(() => error);
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
deleteChat(ids) {
|
|
117
|
+
this.ensureInitialized();
|
|
118
|
+
const config = this.operationConfig;
|
|
119
|
+
if (!config.isSavedChatsEnabled()) {
|
|
120
|
+
return throwError(() => new Error("Operations on saved chats are disabled"));
|
|
121
|
+
}
|
|
122
|
+
const data = {
|
|
123
|
+
action: "SavedChatDelete",
|
|
124
|
+
appName: config.getAppName(),
|
|
125
|
+
instanceId: config.getInstanceId(),
|
|
126
|
+
chatIds: ids,
|
|
127
|
+
debug: config.getDebugFlag()
|
|
128
|
+
};
|
|
129
|
+
return from(post(`plugin/${config.getRestUrl()}`, data)).pipe(catchError((error) => {
|
|
130
|
+
return throwError(() => error);
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
isExistingChat(id) {
|
|
134
|
+
this.ensureInitialized();
|
|
135
|
+
const config = this.operationConfig;
|
|
136
|
+
if (!config.isSavedChatsEnabled()) {
|
|
137
|
+
return throwError(() => new Error("Operations on saved chats are disabled"));
|
|
138
|
+
}
|
|
139
|
+
const data = {
|
|
140
|
+
action: "SavedChatExist",
|
|
141
|
+
appName: config.getAppName(),
|
|
142
|
+
instanceId: config.getInstanceId(),
|
|
143
|
+
chatId: id,
|
|
144
|
+
debug: config.getDebugFlag()
|
|
145
|
+
};
|
|
146
|
+
const searchParams = new URLSearchParams(Object.entries(data).reduce((acc, [key, value]) => {
|
|
147
|
+
acc[key] = String(value);
|
|
148
|
+
return acc;
|
|
149
|
+
}, {}));
|
|
150
|
+
return from(get(`plugin/${config.getRestUrl()}`, searchParams)).pipe(map(res => res.exists), catchError((error) => {
|
|
151
|
+
const errorMsg = 'Error occurred while calling the SavedChatExist API: ' + error.error?.errorMessage;
|
|
152
|
+
console.error('SavedChatsService: ' + errorMsg);
|
|
153
|
+
return throwError(() => error);
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedChatsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
157
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedChatsService, providedIn: 'root' }); }
|
|
158
|
+
}
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedChatsService, decorators: [{
|
|
160
|
+
type: Injectable,
|
|
161
|
+
args: [{
|
|
162
|
+
providedIn: 'root'
|
|
163
|
+
}]
|
|
164
|
+
}], ctorParameters: () => [] });
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2hhdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3NhdmVkLWNoYXRzL3NhdmVkLWNoYXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQXlCNUMsTUFBTSxPQUFPLGlCQUFpQjtJQUc1QixnQkFBZSxDQUFDO0lBRVQsSUFBSSxDQUFDLE1BQWlDO1FBQzNDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUN2RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWdCLENBQUM7UUFFckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMs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O1lBQ25CLE1BQU0sUUFBUSxHQUFHLHVEQUF1RCxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1lBQ3JHLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDaEQsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7K0dBak1VLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdldCwgcG9zdCB9IGZyb20gJ0BzaW5lcXVhL2F0b21pYyc7XG5cbmltcG9ydCB7XG4gIENoYXRNZXNzYWdlLFxuICBTYXZlZENoYXQsXG4gIFNhdmVkQ2hhdEhpc3RvcnksXG4gIFNhdmVkQ2hhdFJlc3BvbnNlLFxuICBEZWxldGVTYXZlZENoYXRSZXNwb25zZVxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRDaGF0c09wZXJhdGlvbkNvbmZpZyB7XG4gIGdldEFwcE5hbWU6ICgpID0+IHN0cmluZztcbiAgZ2V0SW5zdGFuY2VJZDogKCkgPT4gc3RyaW5nO1xuICBnZXRSZXN0VXJsOiAoKSA9PiBzdHJpbmc7XG4gIGdldERlYnVnRmxhZzogKCkgPT4gYm9vbGVhbjtcbiAgaXNTYXZlZENoYXRzRW5hYmxlZDogKCkgPT4gYm9vbGVhbjtcblxuICBzZXRTYXZlZENoYXRzRXJyb3JTdGF0dXM6IChoYXNFcnJvcjogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlU2F2ZWRDaGF0c0xpc3Q6IChjaGF0czogU2F2ZWRDaGF0W10pID0+IHZvaWQ7XG4gIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGU6IHN0cmluZywgZGV0YWlsczogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNhdmVkQ2hhdHNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBvcGVyYXRpb25Db25maWc6IFNhdmVkQ2hhdHNPcGVyYXRpb25Db25maWcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBpbml0KGNvbmZpZzogU2F2ZWRDaGF0c09wZXJhdGlvbkNvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbkNvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKCdTYXZlZENoYXRzU2VydmljZSBhbHJlYWR5IGluaXRpYWxpemVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZXJhdGlvbkNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlSW5pdGlhbGl6ZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wZXJhdGlvbkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTYXZlZENoYXRzU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdCgpIGZpcnN0LicpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsaXN0Q2hhdHMoKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMub3BlcmF0aW9uQ29uZmlnITtcblxuICAgIGlmICghY29uZmlnLmlzU2F2ZWRDaGF0c0VuYWJsZWQoKSkge1xuICAgICAgdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoXCJPcGVyYXRpb25zIG9uIHNhdmVkIGNoYXRzIGFyZSBkaXNhYmxlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRMaXN0XCIsXG4gICAgICBhcHBOYW1lOiBjb25maWcuZ2V0QXBwTmFtZSgpLFxuICAgICAgaW5zdGFuY2VJZDogY29uZmlnLmdldEluc3RhbmNlSWQoKSxcbiAgICAgIGRlYnVnOiBjb25maWcuZ2V0RGVidWdGbGFnKClcbiAgICB9O1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoT2JqZWN0LmVudHJpZXMoZGF0YSkucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSk7XG5cbiAgICBmcm9tKGdldDx7IHNhdmVkQ2hhdHM6IFNhdmVkQ2hhdFtdIH0+KGBwbHVnaW4vJHtjb25maWcuZ2V0UmVzdFVybCgpfWAsIHNlYXJjaFBhcmFtcykpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHtcbiAgICAgICAgY29uZmlnLnVwZGF0ZVNhdmVkQ2hhdHNMaXN0KHJlcy5zYXZlZENoYXRzKTtcbiAgICAgICAgY29uZmlnLnNldFNhdmVkQ2hhdHNFcnJvclN0YXR1cyhmYWxzZSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdExpc3QgQVBJOiAnICsgZXJyb3IuZXJyb3I/LmVycm9yTWVzc2FnZTtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZWRDaGF0c1NlcnZpY2U6ICcgKyBlcnJvck1zZyk7XG4gICAgICAgIGNvbmZpZy5zZXRTYXZlZENoYXRzRXJyb3JTdGF0dXModHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGF0QnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMub3BlcmF0aW9uQ29uZmlnITtcblxuICAgIGlmICghY29uZmlnLmlzU2F2ZWRDaGF0c0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKFwiT3BlcmF0aW9ucyBvbiBzYXZlZCBjaGF0cyBhcmUgZGlzYWJsZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0R2V0XCIsXG4gICAgICBhcHBOYW1lOiBjb25maWcuZ2V0QXBwTmFtZSgpLFxuICAgICAgaW5zdGFuY2VJZDogY29uZmlnLmdldEluc3RhbmNlSWQoKSxcbiAgICAgIGNoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogY29uZmlnLmdldERlYnVnRmxhZygpXG4gICAgfTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpO1xuXG4gICAgcmV0dXJuIGZyb20oZ2V0PHsgc2F2ZWRDaGF0OiBTYXZlZENoYXRIaXN0b3J5LCBleGVjdXRpb25UaW1lTWlsbGlzZWNvbmRzOiBudW1iZXIgfT4oYHBsdWdpbi8ke2NvbmZpZy5nZXRSZXN0VXJsKCl9YCwgc2VhcmNoUGFyYW1zKSkucGlwZShcbiAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICBjb25maWcuZ2VuZXJhdGVBdWRpdEV2ZW50KCdhc3Qtc2F2ZWQtY2hhdC5sb2FkJywgeyBkdXJhdGlvbjogcmVzLmV4ZWN1dGlvblRpbWVNaWxsaXNlY29uZHMgfSwgcmVzLnNhdmVkQ2hhdC5pZCk7XG4gICAgICB9KSxcbiAgICAgIG1hcChyZXMgPT4gcmVzLnNhdmVkQ2hhdCksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvck1zZyA9ICdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRHZXQgQVBJOiAnICsgZXJyb3IuZXJyb3I/LmVycm9yTWVzc2FnZTtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZWRDaGF0c1NlcnZpY2U6ICcgKyBlcnJvck1zZyk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDaGF0KGlkOiBzdHJpbmcsIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRSZXNwb25zZT4ge1xuICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLm9wZXJhdGlvbkNvbmZpZyE7XG5cbiAgICBpZiAoIWNvbmZpZy5pc1NhdmVkQ2hhdHNFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihcIk9wZXJhdGlvbnMgb24gc2F2ZWQgY2hhdHMgYXJlIGRpc2FibGVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdEFkZFwiLFxuICAgICAgYXBwTmFtZTogY29uZmlnLmdldEFwcE5hbWUoKSxcbiAgICAgIGluc3RhbmNlSWQ6IGNvbmZpZy5nZXRJbnN0YW5jZUlkKCksXG4gICAgICBjaGF0SWQ6IGlkLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBkZWJ1ZzogY29uZmlnLmdldERlYnVnRmxhZygpXG4gICAgfTtcblxuICAgIHJldHVybiBmcm9tKHBvc3Q8U2F2ZWRDaGF0UmVzcG9uc2U+KGBwbHVnaW4vJHtjb25maWcuZ2V0UmVzdFVybCgpfWAsIGRhdGEpKS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB7XG4gICAgICAgIGNvbmZpZy5nZW5lcmF0ZUF1ZGl0RXZlbnQoJ2FzdC1zYXZlZC1jaGF0LmFkZCcsIHsgZHVyYXRpb246IHJlcy5leGVjdXRpb25UaW1lTWlsbGlzZWNvbmRzIH0sIHJlcy5zYXZlZENoYXQuaWQpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvck1zZyA9ICdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRBZGQgQVBJOiAnICsgZXJyb3IuZXJyb3I/LmVycm9yTWVzc2FnZTtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZWRDaGF0c1NlcnZpY2U6ICcgKyBlcnJvck1zZyk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDaGF0KGlkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIG1lc3NhZ2VzPzogQ2hhdE1lc3NhZ2VbXSk6IE9ic2VydmFibGU8U2F2ZWRDaGF0UmVzcG9uc2U+IHtcbiAgICB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5vcGVyYXRpb25Db25maWchO1xuXG4gICAgaWYgKCFjb25maWcuaXNTYXZlZENoYXRzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoXCJPcGVyYXRpb25zIG9uIHNhdmVkIGNoYXRzIGFyZSBkaXNhYmxlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdFVwZGF0ZVwiLFxuICAgICAgYXBwTmFtZTogY29uZmlnLmdldEFwcE5hbWUoKSxcbiAgICAgIGluc3RhbmNlSWQ6IGNvbmZpZy5nZXRJbnN0YW5jZUlkKCksXG4gICAgICBjaGF0SWQ6IGlkLFxuICAgICAgZGVidWc6IGNvbmZpZy5nZXREZWJ1Z0ZsYWcoKVxuICAgIH07XG5cbiAgICBpZiAobmFtZSkgZGF0YVtcInRpdGxlXCJdID0gbmFtZTtcbiAgICBpZiAobWVzc2FnZXMpIGRhdGFbXCJoaXN0b3J5XCJdID0gbWVzc2FnZXM7XG5cbiAgICByZXR1cm4gZnJvbShwb3N0PFNhdmVkQ2hhdFJlc3BvbnNlPihgcGx1Z2luLyR7Y29uZmlnLmdldFJlc3RVcmwoKX1gLCBkYXRhKSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdFVwZGF0ZSBBUEk6ICcgKyBlcnJvci5lcnJvcj8uZXJyb3JNZXNzYWdlO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTYXZlZENoYXRzU2VydmljZTogJyArIGVycm9yTXNnKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZUNoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8RGVsZXRlU2F2ZWRDaGF0UmVzcG9uc2U+IHtcbiAgICB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5vcGVyYXRpb25Db25maWchO1xuXG4gICAgaWYgKCFjb25maWcuaXNTYXZlZENoYXRzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoXCJPcGVyYXRpb25zIG9uIHNhdmVkIGNoYXRzIGFyZSBkaXNhYmxlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXREZWxldGVcIixcbiAgICAgIGFwcE5hbWU6IGNvbmZpZy5nZXRBcHBOYW1lKCksXG4gICAgICBpbnN0YW5jZUlkOiBjb25maWcuZ2V0SW5zdGFuY2VJZCgpLFxuICAgICAgY2hhdElkczogaWRzLFxuICAgICAgZGVidWc6IGNvbmZpZy5nZXREZWJ1Z0ZsYWcoKVxuICAgIH07XG5cbiAgICByZXR1cm4gZnJvbShwb3N0PERlbGV0ZVNhdmVkQ2hhdFJlc3BvbnNlPihgcGx1Z2luLyR7Y29uZmlnLmdldFJlc3RVcmwoKX1gLCBkYXRhKSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0V4aXN0aW5nQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMub3BlcmF0aW9uQ29uZmlnITtcblxuICAgIGlmICghY29uZmlnLmlzU2F2ZWRDaGF0c0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKFwiT3BlcmF0aW9ucyBvbiBzYXZlZCBjaGF0cyBhcmUgZGlzYWJsZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiU2F2ZWRDaGF0RXhpc3RcIixcbiAgICAgIGFwcE5hbWU6IGNvbmZpZy5nZXRBcHBOYW1lKCksXG4gICAgICBpbnN0YW5jZUlkOiBjb25maWcuZ2V0SW5zdGFuY2VJZCgpLFxuICAgICAgY2hhdElkOiBpZCxcbiAgICAgIGRlYnVnOiBjb25maWcuZ2V0RGVidWdGbGFnKClcbiAgICB9O1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoT2JqZWN0LmVudHJpZXMoZGF0YSkucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSk7XG5cbiAgICByZXR1cm4gZnJvbShnZXQ8eyBleGlzdHM6IGJvb2xlYW4sIGV4ZWN1dGlvblRpbWU6IHN0cmluZywgZXhlY3V0aW9uVGltZU1pbGxpc2Vjb25kczogbnVtYmVyIH0+KGBwbHVnaW4vJHtjb25maWcuZ2V0UmVzdFVybCgpfWAsIHNlYXJjaFBhcmFtcykpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5leGlzdHMpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSAnRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0RXhpc3QgQVBJOiAnICsgZXJyb3IuZXJyb3I/LmVycm9yTWVzc2FnZTtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZWRDaGF0c1NlcnZpY2U6ICcgKyBlcnJvck1zZyk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { TranslocoService } from '@jsverse/transloco';
|
|
3
|
+
import { fetchApp, fetchPrincipal, fetchUserSettings, sha512, } from '@sinequa/atomic';
|
|
4
|
+
import { DialogUpdatesComponent } from '../dialogs/updates.component';
|
|
5
|
+
import { AppService } from './app.service';
|
|
6
|
+
import { DialogService } from './dialog.service';
|
|
7
|
+
import { NotificationsService } from './notification.service';
|
|
8
|
+
import { PrincipalService } from './principal.service';
|
|
9
|
+
import { UserSettingsWebService } from './user-settings.service';
|
|
10
|
+
import { chatConfigSchema } from '../types';
|
|
11
|
+
import { getAssistantJsonFromCCApp } from '../utils/assistant-json';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export class AssistantConfigurationService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.appService = inject(AppService);
|
|
16
|
+
this.userSettingsService = inject(UserSettingsWebService);
|
|
17
|
+
this.principalService = inject(PrincipalService);
|
|
18
|
+
this.modalService = inject(DialogService);
|
|
19
|
+
this.notificationsService = inject(NotificationsService);
|
|
20
|
+
this.transloco = inject(TranslocoService);
|
|
21
|
+
}
|
|
22
|
+
init(context) {
|
|
23
|
+
if (this.context) {
|
|
24
|
+
console.warn('AssistantConfigurationService already initialized.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.context = context;
|
|
28
|
+
}
|
|
29
|
+
ensureInitialized() {
|
|
30
|
+
if (!this.context) {
|
|
31
|
+
throw new Error('AssistantConfigurationService not initialized. Call init() first.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
getAssistantsSetting() {
|
|
35
|
+
if (!this.userSettingsService.userSettings) {
|
|
36
|
+
this.userSettingsService.userSettings = {};
|
|
37
|
+
}
|
|
38
|
+
if (!this.userSettingsService.userSettings["assistants"]) {
|
|
39
|
+
this.userSettingsService.userSettings["assistants"] = {};
|
|
40
|
+
}
|
|
41
|
+
return this.userSettingsService.userSettings["assistants"];
|
|
42
|
+
}
|
|
43
|
+
async initChatConfig() {
|
|
44
|
+
this.ensureInitialized();
|
|
45
|
+
const context = this.context;
|
|
46
|
+
// fetch the standard app config to get the defaultValues of the chat config for the given instance
|
|
47
|
+
// Persist the app in the app service
|
|
48
|
+
const capp = await fetchApp();
|
|
49
|
+
this.appService.app = capp;
|
|
50
|
+
const settings = await fetchUserSettings();
|
|
51
|
+
this.userSettingsService.userSettings = settings;
|
|
52
|
+
const key = context.getChatInstanceId();
|
|
53
|
+
const userSettingsConfig = this.getAssistantsSetting()[key] || {};
|
|
54
|
+
const principal = await fetchPrincipal();
|
|
55
|
+
this.principalService.principal = principal;
|
|
56
|
+
const standardChatConfig = getAssistantJsonFromCCApp(this.appService.app, key);
|
|
57
|
+
try {
|
|
58
|
+
// Validate the whole config object against the schema
|
|
59
|
+
chatConfigSchema.parse(standardChatConfig);
|
|
60
|
+
// If the user preferences do not contain a config's defaultValues object, keep using the standard app config and nothing to store in the user preferences
|
|
61
|
+
if (!userSettingsConfig.defaultValues) {
|
|
62
|
+
context.setAssistantConfig({ ...standardChatConfig });
|
|
63
|
+
context.setInitConfigStatus(true);
|
|
64
|
+
}
|
|
65
|
+
else { // If the user has its own defaultValues in its userSettings, then we need to check for potential updates made by admins in the meantime and how he wants to manage them
|
|
66
|
+
// Retrieve already stored hashes in the user settings if exists
|
|
67
|
+
const appliedDefaultValuesHash = userSettingsConfig.hashes?.["applied-defaultValues-hash"];
|
|
68
|
+
const skippedDefaultValuesHash = userSettingsConfig.hashes?.["skipped-defaultValues-hash"];
|
|
69
|
+
// Create a hash of the current defaultValues of the standardChatConfig
|
|
70
|
+
const currentDefaultValuesHash = await sha512(JSON.stringify(standardChatConfig.defaultValues));
|
|
71
|
+
// Implement the tracking mechanism to notify the user about the available updates in the defaultValues object of the standard app config
|
|
72
|
+
const condition = (currentDefaultValuesHash !== appliedDefaultValuesHash) && (currentDefaultValuesHash !== skippedDefaultValuesHash);
|
|
73
|
+
if (condition) {
|
|
74
|
+
this.modalService.open(DialogUpdatesComponent)
|
|
75
|
+
.then(res => {
|
|
76
|
+
if (res === "dialog-confirm") {
|
|
77
|
+
const hashes = { ...userSettingsConfig.hashes, "applied-defaultValues-hash": currentDefaultValuesHash, "skipped-defaultValues-hash": undefined };
|
|
78
|
+
// Update the chat config and store its defaultValues in the user preferences
|
|
79
|
+
this.updateChatConfig({ ...standardChatConfig }, hashes, true);
|
|
80
|
+
context.setInitConfigStatus(true);
|
|
81
|
+
context.generateAuditEvent("ast-configuration.click", { 'configuration': JSON.stringify({ ...standardChatConfig }) });
|
|
82
|
+
}
|
|
83
|
+
else if (res === "dialog-no") {
|
|
84
|
+
// Do not notify the user about changes while this skipped version is not updated
|
|
85
|
+
const hashes = { ...userSettingsConfig.hashes, "skipped-defaultValues-hash": currentDefaultValuesHash };
|
|
86
|
+
this.updateChatConfig({ ...standardChatConfig, defaultValues: userSettingsConfig.defaultValues }, hashes, false);
|
|
87
|
+
context.setInitConfigStatus(true);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Just pick the version in the user settings, nothing to be updated
|
|
91
|
+
context.setAssistantConfig({ ...standardChatConfig, defaultValues: userSettingsConfig.defaultValues });
|
|
92
|
+
context.setInitConfigStatus(true);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// No available updates Or updates has been already skipped, then just pick the version in the user settings
|
|
98
|
+
context.setAssistantConfig({ ...standardChatConfig, defaultValues: userSettingsConfig.defaultValues });
|
|
99
|
+
context.setInitConfigStatus(true);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.notificationsService.error(`Missing valid configuration for the assistant instance '${key}'. See the browser console messages for details on the missing or incorrect properties.`);
|
|
105
|
+
// Ensure error is properly typed for accessing 'issues'
|
|
106
|
+
const issues = (error instanceof Error && 'issues' in error) ? error.issues : undefined;
|
|
107
|
+
throw new Error(`Missing valid configuration for the assistant instance '${key}' . \n ${JSON.stringify(issues, null, 2)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
updateChatConfig(config, hashes, notify = true, successCallback, errorCallback) {
|
|
111
|
+
this.ensureInitialized();
|
|
112
|
+
const context = this.context;
|
|
113
|
+
context.setAssistantConfig(config);
|
|
114
|
+
const assistants = Object.assign({}, this.getAssistantsSetting());
|
|
115
|
+
const chatInstanceId = context.getChatInstanceId();
|
|
116
|
+
assistants[chatInstanceId] = { ...assistants[chatInstanceId], defaultValues: config.defaultValues };
|
|
117
|
+
if (hashes)
|
|
118
|
+
assistants[chatInstanceId].hashes = hashes;
|
|
119
|
+
this.userSettingsService.patch({ assistants }).subscribe(() => {
|
|
120
|
+
if (notify) {
|
|
121
|
+
if (successCallback) {
|
|
122
|
+
successCallback();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.notificationsService.success(this.transloco.translate('chat.saveChatConfig.success', { value: chatInstanceId }));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}, error => {
|
|
129
|
+
if (notify) {
|
|
130
|
+
if (errorCallback) {
|
|
131
|
+
errorCallback();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.notificationsService.error(this.transloco.translate('chat.saveChatConfig.fail', { value: chatInstanceId }));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
console.error("Could not patch assistants!", error);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
getWSRequestsUrl() {
|
|
141
|
+
this.ensureInitialized();
|
|
142
|
+
const context = this.context;
|
|
143
|
+
const url = context.getAssistantConfigValue()?.connectionSettings.websocketEndpoint;
|
|
144
|
+
if (url) {
|
|
145
|
+
context.setWSRequestsUrl(url);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
throw new Error(`The property 'websocketEndpoint' must be provided`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
getRESTRequestsUrl() {
|
|
152
|
+
this.ensureInitialized();
|
|
153
|
+
const context = this.context;
|
|
154
|
+
const url = context.getAssistantConfigValue()?.connectionSettings.restEndpoint;
|
|
155
|
+
if (url) {
|
|
156
|
+
context.setRESTRequestsUrl(url);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
throw new Error(`The property 'restEndpoint' must be provided`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssistantConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
163
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssistantConfigurationService, providedIn: 'root' }); }
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssistantConfigurationService, decorators: [{
|
|
166
|
+
type: Injectable,
|
|
167
|
+
args: [{
|
|
168
|
+
providedIn: 'root'
|
|
169
|
+
}]
|
|
170
|
+
}], ctorParameters: () => [] });
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0YW50LWNvbmZpZ3VyYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3NlcnZpY2VzL2Fzc2lzdGFudC1jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUNMLFFBQVEsRUFDUixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFpQnBFLE1BQU0sT0FBTyw2QkFBNkI7SUFVeEM7UUFQUSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLHdCQUFtQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLGlCQUFZLEdBQUcsTUFBTSxD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QU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcbmltcG9ydCB7XG4gIGZldGNoQXBwLFxuICBmZXRjaFByaW5jaXBhbCxcbiAgZmV0Y2hVc2VyU2V0dGluZ3MsXG4gIHNoYTUxMixcbn0gZnJvbSAnQHNpbmVxdWEvYXRvbWljJztcblxuaW1wb3J0IHsgRGlhbG9nVXBkYXRlc0NvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZ3MvdXBkYXRlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4vYXBwLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4vZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tICcuL3ByaW5jaXBhbC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXR0aW5nc1dlYlNlcnZpY2UgfSBmcm9tICcuL3VzZXItc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBDaGF0Q29uZmlnLCBjaGF0Q29uZmlnU2NoZW1hIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QXNzaXN0YW50SnNvbkZyb21DQ0FwcCB9IGZyb20gJy4uL3V0aWxzL2Fzc2lzdGFudC1qc29uJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCB7XG4gIGdldENoYXRJbnN0YW5jZUlkOiAoKSA9PiBzdHJpbmc7XG4gIGdldENoYXRJZDogKCkgPT4gc3RyaW5nO1xuICBnZXRBc3Npc3RhbnRDb25maWdWYWx1ZTogKCkgPT4gQ2hhdENvbmZpZyB8IHVuZGVmaW5lZDtcblxuICBzZXRBc3Npc3RhbnRDb25maWc6IChjb25maWc6IENoYXRDb25maWcgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHNldFdTUmVxdWVzdHNVcmw6ICh1cmw6IHN0cmluZykgPT4gdm9pZDtcbiAgc2V0UkVTVFJlcXVlc3RzVXJsOiAodXJsOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldEluaXRDb25maWdTdGF0dXM6IChzdGF0dXM6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdlbmVyYXRlQXVkaXRFdmVudDogKHR5cGU6IHN0cmluZywgZGV0YWlsczogUmVjb3JkPHN0cmluZywgYW55PiwgaWQ/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFzc2lzdGFudENvbmZpZ3VyYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb250ZXh0OiBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGFwcFNlcnZpY2UgPSBpbmplY3QoQXBwU2VydmljZSk7XG4gIHByaXZhdGUgdXNlclNldHRpbmdzU2VydmljZSA9IGluamVjdChVc2VyU2V0dGluZ3NXZWJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gaW5qZWN0KFByaW5jaXBhbFNlcnZpY2UpO1xuICBwcml2YXRlIG1vZGFsU2VydmljZSA9IGluamVjdChEaWFsb2dTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgaW5pdChjb250ZXh0OiBBc3Npc3RhbnRDb25maWd1cmF0aW9uT3BlcmF0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2UgYWxyZWFkeSBpbml0aWFsaXplZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlSW5pdGlhbGl6ZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzaXN0YW50Q29uZmlndXJhdGlvblNlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXQoKSBmaXJzdC4nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0QXNzaXN0YW50c1NldHRpbmcoKTogYW55IHtcbiAgICBpZiAoIXRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3MgPSB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnVzZXJTZXR0aW5nc1NlcnZpY2UudXNlclNldHRpbmdzW1wiYXNzaXN0YW50c1wiXSkge1xuICAgICAgdGhpcy51c2VyU2V0dGluZ3NTZXJ2aWNlLnVzZXJTZXR0aW5nc1tcImFzc2lzdGFudHNcIl0gPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXNlclNldHRpbmdzU2VydmljZS51c2VyU2V0dGluZ3NbXCJhc3Npc3RhbnRzXCJdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXRDaGF0Q29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0ITtcblxuICAgIC8vIGZldGNoIHRoZSBzdGFuZGFyZCBhcHAgY29uZmlnIHRvIGdldCB0aGUgZGVmYXVsdFZhbHVlcyBvZiB0aGUgY2hhdCBjb25maWcgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZVxuICAgIC8vIFBlcnNpc3QgdGhlIGFwcCBpbiB0aGUgYXBwIHNlcnZpY2VcbiAgICBjb25zdCBjYXBwID0gYXdhaXQgZmV0Y2hBcHAoKTtcbiAgICB0aGlzLmFwcFNlcnZpY2UuYXBwID0gY2FwcDtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgZmV0Y2hVc2VyU2V0dGluZ3M8e30+KCk7XG4gICAgdGhpcy51c2VyU2V0dGluZ3NTZXJ2aWNlLnVzZXJTZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIGNvbnN0IGtleSA9IGNvbnRleHQuZ2V0Q2hhdEluc3RhbmNlSWQoKTtcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NDb25maWcgPSB0aGlzLmdldEFzc2lzdGFudHNTZXR0aW5nKClba2V5XSB8fCB7fTtcblxuICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IGZldGNoUHJpbmNpcGFsKCk7XG4gICAgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbCA9IHByaW5jaXBhbDtcblxuICAgIGNvbnN0IHN0YW5kYXJkQ2hhdENvbmZpZyA9IGdldEFzc2lzdGFudEpzb25Gcm9tQ0NBcHAodGhpcy5hcHBTZXJ2aWNlLmFwcCwga2V5KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgd2hvbGUgY29uZmlnIG9iamVjdCBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICAgIGNoYXRDb25maWdTY2hlbWEucGFyc2Uoc3RhbmRhcmRDaGF0Q29uZmlnKTtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHByZWZlcmVuY2VzIGRvIG5vdCBjb250YWluIGEgY29uZmlnJ3MgZGVmYXVsdFZhbHVlcyBvYmplY3QsIGtlZXAgdXNpbmcgdGhlIHN0YW5kYXJkIGFwcCBjb25maWcgYW5kIG5vdGhpbmcgdG8gc3RvcmUgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICAgIGlmICghdXNlclNldHRpbmdzQ29uZmlnLmRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgY29udGV4dC5zZXRBc3Npc3RhbnRDb25maWcoeyAuLi5zdGFuZGFyZENoYXRDb25maWcgfSk7XG4gICAgICAgIGNvbnRleHQuc2V0SW5pdENvbmZpZ1N0YXR1cyh0cnVlKTtcbiAgICAgIH0gZWxzZSB7Ly8gSWYgdGhlIHVzZXIgaGFzIGl0cyBvd24gZGVmYXVsdFZhbHVlcyBpbiBpdHMgdXNlclNldHRpbmdzLCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCB1cGRhdGVzIG1hZGUgYnkgYWRtaW5zIGluIHRoZSBtZWFudGltZSBhbmQgaG93IGhlIHdhbnRzIHRvIG1hbmFnZSB0aGVtXG5cbiAgICAgICAgLy8gUmV0cmlldmUgYWxyZWFkeSBzdG9yZWQgaGFzaGVzIGluIHRoZSB1c2VyIHNldHRpbmdzIGlmIGV4aXN0c1xuICAgICAgICBjb25zdCBhcHBsaWVkRGVmYXVsdFZhbHVlc0hhc2ggPSB1c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzPy5bXCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiXTtcbiAgICAgICAgY29uc3Qgc2tpcHBlZERlZmF1bHRWYWx1ZXNIYXNoID0gdXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcz8uW1wic2tpcHBlZC1kZWZhdWx0VmFsdWVzLWhhc2hcIl07XG4gICAgICAgIC8vIENyZWF0ZSBhIGhhc2ggb2YgdGhlIGN1cnJlbnQgZGVmYXVsdFZhbHVlcyBvZiB0aGUgc3RhbmRhcmRDaGF0Q29uZmlnXG4gICAgICAgIGNvbnN0IGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCA9IGF3YWl0IHNoYTUxMihKU09OLnN0cmluZ2lmeShzdGFuZGFyZENoYXRDb25maWcuZGVmYXVsdFZhbHVlcykpO1xuXG4gICAgICAgIC8vIEltcGxlbWVudCB0aGUgdHJhY2tpbmcgbWVjaGFuaXNtIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dCB0aGUgYXZhaWxhYmxlIHVwZGF0ZXMgaW4gdGhlIGRlZmF1bHRWYWx1ZXMgb2JqZWN0IG9mIHRoZSBzdGFuZGFyZCBhcHAgY29uZmlnXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IChjdXJyZW50RGVmYXVsdFZhbHVlc0hhc2ggIT09IGFwcGxpZWREZWZhdWx0VmFsdWVzSGFzaCkgJiYgKGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCAhPT0gc2tpcHBlZERlZmF1bHRWYWx1ZXNIYXNoKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGlhbG9nVXBkYXRlc0NvbXBvbmVudClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMgPT09IFwiZGlhbG9nLWNvbmZpcm1cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hlcyA9IHsgLi4udXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcywgXCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiOiBjdXJyZW50RGVmYXVsdFZhbHVlc0hhc2gsIFwic2tpcHBlZC1kZWZhdWx0VmFsdWVzLWhhc2hcIjogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjaGF0IGNvbmZpZyBhbmQgc3RvcmUgaXRzIGRlZmF1bHRWYWx1ZXMgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXRDb25maWcoeyAuLi5zdGFuZGFyZENoYXRDb25maWcgfSwgaGFzaGVzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNldEluaXRDb25maWdTdGF0dXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5nZW5lcmF0ZUF1ZGl0RXZlbnQoXCJhc3QtY29uZmlndXJhdGlvbi5jbGlja1wiLCB7ICdjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkoeyAuLi5zdGFuZGFyZENoYXRDb25maWcgfSkgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBcImRpYWxvZy1ub1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IG5vdGlmeSB0aGUgdXNlciBhYm91dCBjaGFuZ2VzIHdoaWxlIHRoaXMgc2tpcHBlZCB2ZXJzaW9uIGlzIG5vdCB1cGRhdGVkXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzaGVzID0geyAuLi51c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzLCBcInNraXBwZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI6IGN1cnJlbnREZWZhdWx0VmFsdWVzSGFzaCB9O1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhdENvbmZpZyh7IC4uLnN0YW5kYXJkQ2hhdENvbmZpZywgZGVmYXVsdFZhbHVlczogdXNlclNldHRpbmdzQ29uZmlnLmRlZmF1bHRWYWx1ZXMgfSwgaGFzaGVzLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbml0Q29uZmlnU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEp1c3QgcGljayB0aGUgdmVyc2lvbiBpbiB0aGUgdXNlciBzZXR0aW5ncywgbm90aGluZyB0byBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgICAgY29udGV4dC5zZXRBc3Npc3RhbnRDb25maWcoeyAuLi5zdGFuZGFyZENoYXRDb25maWcsIGRlZmF1bHRWYWx1ZXM6IHVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5pdENvbmZpZ1N0YXR1cyh0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gYXZhaWxhYmxlIHVwZGF0ZXMgT3IgdXBkYXRlcyBoYXMgYmVlbiBhbHJlYWR5IHNraXBwZWQsIHRoZW4ganVzdCBwaWNrIHRoZSB2ZXJzaW9uIGluIHRoZSB1c2VyIHNldHRpbmdzXG4gICAgICAgICAgY29udGV4dC5zZXRBc3Npc3RhbnRDb25maWcoeyAuLi5zdGFuZGFyZENoYXRDb25maWcsIGRlZmF1bHRWYWx1ZXM6IHVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzIH0pO1xuICAgICAgICAgIGNvbnRleHQuc2V0SW5pdENvbmZpZ1N0YXR1cyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGBNaXNzaW5nIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UgJyR7a2V5fScuIFNlZSB0aGUgYnJvd3NlciBjb25zb2xlIG1lc3NhZ2VzIGZvciBkZXRhaWxzIG9uIHRoZSBtaXNzaW5nIG9yIGluY29ycmVjdCBwcm9wZXJ0aWVzLmApO1xuICAgICAgLy8gRW5zdXJlIGVycm9yIGlzIHByb3Blcmx5IHR5cGVkIGZvciBhY2Nlc3NpbmcgJ2lzc3VlcydcbiAgICAgIGNvbnN0IGlzc3VlcyA9IChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdpc3N1ZXMnIGluIGVycm9yKSA/IChlcnJvciBhcyBhbnkpLmlzc3VlcyA6IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZCBjb25maWd1cmF0aW9uIGZvciB0aGUgYXNzaXN0YW50IGluc3RhbmNlICcke2tleX0nIC4gXFxuICR7SlNPTi5zdHJpbmdpZnkoaXNzdWVzLCBudWxsLCAyKX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2hhdENvbmZpZyhcbiAgICBjb25maWc6IENoYXRDb25maWcsXG4gICAgaGFzaGVzPzogeyBcImFwcGxpZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI/OiBzdHJpbmcsIFwic2tpcHBlZC1kZWZhdWx0VmFsdWVzLWhhc2hcIj86IHN0cmluZyB9LFxuICAgIG5vdGlmeSA9IHRydWUsXG4gICAgc3VjY2Vzc0NhbGxiYWNrPzogKCkgPT4gYW55LFxuICAgIGVycm9yQ2FsbGJhY2s/OiAoKSA9PiBhbnlcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQhO1xuXG4gICAgY29udGV4dC5zZXRBc3Npc3RhbnRDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGFzc2lzdGFudHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldEFzc2lzdGFudHNTZXR0aW5nKCkpO1xuICAgIGNvbnN0IGNoYXRJbnN0YW5jZUlkID0gY29udGV4dC5nZXRDaGF0SW5zdGFuY2VJZCgpO1xuICAgIGFzc2lzdGFudHNbY2hhdEluc3RhbmNlSWRdID0geyAuLi5hc3Npc3RhbnRzW2NoYXRJbnN0YW5jZUlkXSwgZGVmYXVsdFZhbHVlczogY29uZmlnLmRlZmF1bHRWYWx1ZXMgfTtcbiAgICBpZiAoaGFzaGVzKSBhc3Npc3RhbnRzW2NoYXRJbnN0YW5jZUlkXS5oYXNoZXMgPSBoYXNoZXM7XG5cbiAgICB0aGlzLnVzZXJTZXR0aW5nc1NlcnZpY2UucGF0Y2goeyBhc3Npc3RhbnRzIH0pLnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1Y2Nlc3ModGhpcy50cmFuc2xvY28udHJhbnNsYXRlKCdjaGF0LnNhdmVDaGF0Q29uZmlnLnN1Y2Nlc3MnLCB7IHZhbHVlOiBjaGF0SW5zdGFuY2VJZCB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXQuc2F2ZUNoYXRDb25maWcuZmFpbCcsIHsgdmFsdWU6IGNoYXRJbnN0YW5jZUlkIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBwYXRjaCBhc3Npc3RhbnRzIVwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXU1JlcXVlc3RzVXJsKCkge1xuICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0ITtcbiAgICBjb25zdCB1cmwgPSBjb250ZXh0LmdldEFzc2lzdGFudENvbmZpZ1ZhbHVlKCk/LmNvbm5lY3Rpb25TZXR0aW5ncy53ZWJzb2NrZXRFbmRwb2ludDtcbiAgICBpZiAodXJsKSB7XG4gICAgICBjb250ZXh0LnNldFdTUmVxdWVzdHNVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgJ3dlYnNvY2tldEVuZHBvaW50JyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFJFU1RSZXF1ZXN0c1VybCgpIHtcbiAgICB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dCE7XG4gICAgY29uc3QgdXJsID0gY29udGV4dC5nZXRBc3Npc3RhbnRDb25maWdWYWx1ZSgpPy5jb25uZWN0aW9uU2V0dGluZ3MucmVzdEVuZHBvaW50O1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnRleHQuc2V0UkVTVFJlcXVlc3RzVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5ICdyZXN0RW5kcG9pbnQnIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|