@sinequa/assistant 3.4.4 → 3.5.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/chat/charts/chart/chart.component.d.ts +13 -0
- package/chat/chat-message/chat-message.component.d.ts +10 -3
- package/chat/chat.component.d.ts +27 -6
- package/chat/debug-message/debug-message.component.d.ts +17 -0
- package/chat/types.d.ts +29 -3
- package/chat/websocket-chat.service.d.ts +1 -0
- package/esm2020/chat/charts/chart/chart.component.mjs +40 -0
- package/esm2020/chat/chat-message/chat-message.component.mjs +37 -9
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +2 -1
- package/esm2020/chat/chat.component.mjs +49 -12
- package/esm2020/chat/chat.service.mjs +2 -1
- package/esm2020/chat/debug-message/debug-message.component.mjs +43 -0
- package/esm2020/chat/rest-chat.service.mjs +4 -2
- package/esm2020/chat/types.mjs +6 -3
- package/esm2020/chat/websocket-chat.service.mjs +15 -6
- package/fesm2015/sinequa-assistant-chat.mjs +184 -27
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +180 -27
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -11,6 +11,7 @@ import { InitialsAvatarComponent } from "../initials-avatar/initials-avatar.comp
|
|
|
11
11
|
import { ChatReferenceComponent } from "../chat-reference/chat-reference.component";
|
|
12
12
|
import "prismjs-components-importer/esm";
|
|
13
13
|
import 'prismjs/plugins/autoloader/prism-autoloader';
|
|
14
|
+
import { ChartComponent } from "../charts/chart/chart.component";
|
|
14
15
|
import * as i0 from "@angular/core";
|
|
15
16
|
import * as i1 from "@sinequa/components/search";
|
|
16
17
|
import * as i2 from "@sinequa/components/utils";
|
|
@@ -28,6 +29,9 @@ export class ChatMessageComponent {
|
|
|
28
29
|
this.canEdit = false;
|
|
29
30
|
this.canRegenerate = false;
|
|
30
31
|
this.canCopy = false;
|
|
32
|
+
this.canDebug = false;
|
|
33
|
+
this.canLike = false;
|
|
34
|
+
this.canDislike = false;
|
|
31
35
|
this.openDocument = new EventEmitter();
|
|
32
36
|
this.openPreview = new EventEmitter();
|
|
33
37
|
this.suggestAction = new EventEmitter();
|
|
@@ -36,6 +40,7 @@ export class ChatMessageComponent {
|
|
|
36
40
|
this.regenerate = new EventEmitter();
|
|
37
41
|
this.like = new EventEmitter();
|
|
38
42
|
this.dislike = new EventEmitter();
|
|
43
|
+
this.debug = new EventEmitter();
|
|
39
44
|
this.references = [];
|
|
40
45
|
this.referenceMap = new Map();
|
|
41
46
|
this.showReferences = true;
|
|
@@ -100,10 +105,6 @@ export class ChatMessageComponent {
|
|
|
100
105
|
return tree;
|
|
101
106
|
};
|
|
102
107
|
}
|
|
103
|
-
get name() {
|
|
104
|
-
return !this.principalService.principal ? ''
|
|
105
|
-
: this.principalService.principal['fullName'] || this.principalService.principal.name;
|
|
106
|
-
}
|
|
107
108
|
ngOnChanges(changes) {
|
|
108
109
|
if (changes.streaming) {
|
|
109
110
|
this.collapseProgress = !this.streaming;
|
|
@@ -121,6 +122,12 @@ export class ChatMessageComponent {
|
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
}
|
|
125
|
+
if (m.content.startsWith("<chartjs>")) {
|
|
126
|
+
m.messageType = "CHART";
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
m.messageType = "MARKDOWN";
|
|
130
|
+
}
|
|
124
131
|
}
|
|
125
132
|
this.processor = unified()
|
|
126
133
|
.use(remarkParse)
|
|
@@ -134,6 +141,13 @@ export class ChatMessageComponent {
|
|
|
134
141
|
ngAfterViewInit() {
|
|
135
142
|
Prism?.highlightAllUnder?.(this.el.nativeElement);
|
|
136
143
|
}
|
|
144
|
+
get name() {
|
|
145
|
+
return !this.principalService.principal ? ''
|
|
146
|
+
: this.principalService.principal['fullName'] || this.principalService.principal.name;
|
|
147
|
+
}
|
|
148
|
+
get isAdmin() {
|
|
149
|
+
return this.principalService.principal?.isAdministrator || false;
|
|
150
|
+
}
|
|
137
151
|
getLinkText(node) {
|
|
138
152
|
if (node.text) {
|
|
139
153
|
return node.text; // Return directly if text is provided in node.text ([Example link](https://example.com))
|
|
@@ -166,10 +180,16 @@ export class ChatMessageComponent {
|
|
|
166
180
|
getReferenceMatches(content) {
|
|
167
181
|
return Array.from(content.matchAll(/\[(\s*\d+(?:\.\d+)?\s*)\]/g));
|
|
168
182
|
}
|
|
169
|
-
|
|
170
|
-
this.ui.copyToClipboard(
|
|
183
|
+
_copyToClipboard(content) {
|
|
184
|
+
this.ui.copyToClipboard(content);
|
|
185
|
+
}
|
|
186
|
+
copyMessage(message) {
|
|
187
|
+
this._copyToClipboard(message.content);
|
|
171
188
|
this.copy.emit(message);
|
|
172
189
|
}
|
|
190
|
+
copyCode(code) {
|
|
191
|
+
this._copyToClipboard(code);
|
|
192
|
+
}
|
|
173
193
|
openAttachmentPreview(attachment, partId) {
|
|
174
194
|
this.openPreview.emit({ reference: attachment, partId });
|
|
175
195
|
}
|
|
@@ -178,11 +198,11 @@ export class ChatMessageComponent {
|
|
|
178
198
|
}
|
|
179
199
|
}
|
|
180
200
|
ChatMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, deps: [{ token: i1.SearchService }, { token: i2.UIService }, { token: i3.PrincipalWebService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
181
|
-
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <remark *ngIf=\"message?.role === 'assistant'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\"\n (click)=\"edit.emit(message)\">\n<i class=\"fas fa-edit\"></i>\n</button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyToClipboard(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n<!-- <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"message.role === 'assistant' && !streaming\" sqTooltip=\"Like the answer\"\n (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button> -->\n<!-- <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"message.role === 'assistant' && !streaming\" sqTooltip=\"Report an issue\"\n (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button> -->\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\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-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-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}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:block;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
201
|
+
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy", canDebug: "canDebug", canLike: "canLike", canDislike: "canDislike" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike", debug: "debug" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\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-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-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}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:block;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }, { kind: "component", type: ChartComponent, selector: "sq-assistant-chart", inputs: ["rawChartData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
182
202
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, decorators: [{
|
|
183
203
|
type: Component,
|
|
184
204
|
args: [{ selector: "sq-chat-message", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UtilsModule, CollapseModule, RemarkModule,
|
|
185
|
-
InitialsAvatarComponent, ChatReferenceComponent], template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <remark *ngIf=\"message?.role === 'assistant'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\"\n (click)=\"edit.emit(message)\">\n<i class=\"fas fa-edit\"></i>\n</button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyToClipboard(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n<!-- <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"message.role === 'assistant' && !streaming\" sqTooltip=\"Like the answer\"\n (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button> -->\n<!-- <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"message.role === 'assistant' && !streaming\" sqTooltip=\"Report an issue\"\n (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button> -->\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\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-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-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}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:block;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
205
|
+
InitialsAvatarComponent, ChatReferenceComponent, ChartComponent], template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\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-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-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}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:block;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
186
206
|
}], ctorParameters: function () { return [{ type: i1.SearchService }, { type: i2.UIService }, { type: i3.PrincipalWebService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { message: [{
|
|
187
207
|
type: Input
|
|
188
208
|
}], conversation: [{
|
|
@@ -201,6 +221,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
201
221
|
type: Input
|
|
202
222
|
}], canCopy: [{
|
|
203
223
|
type: Input
|
|
224
|
+
}], canDebug: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], canLike: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], canDislike: [{
|
|
229
|
+
type: Input
|
|
204
230
|
}], openDocument: [{
|
|
205
231
|
type: Output
|
|
206
232
|
}], openPreview: [{
|
|
@@ -217,5 +243,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
217
243
|
type: Output
|
|
218
244
|
}], dislike: [{
|
|
219
245
|
type: Output
|
|
246
|
+
}], debug: [{
|
|
247
|
+
type: Output
|
|
220
248
|
}] } });
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7Ozs7Ozs7O0FBZXJELE1BQU0sT0FBTyxvQkFBb0I7SUFtQy9CLFlBQ1MsYUFBNEIsRUFDNUIsRUFBYSxFQUNiLGdCQUFxQyxFQUNyQyxHQUFzQixF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O3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsV2ViU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlc1wiO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3NlYXJjaFwiO1xuaW1wb3J0IHsgQ2hhdENvbnRleHRBdHRhY2htZW50LCBDaGF0TWVzc2FnZSwgU3VnZ2VzdGVkQWN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IHVuaWZpZWQsIFByb2Nlc3NvciB9IGZyb20gXCJ1bmlmaWVkXCI7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSBcInJlbWFyay1wYXJzZVwiO1xuaW1wb3J0IHsgdmlzaXQsIENPTlRJTlVFLCBFWElUIH0gZnJvbSBcInVuaXN0LXV0aWwtdmlzaXRcIjtcbmltcG9ydCB7IFRleHQsIFBhcmVudCwgQ29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCJ1bmlzdFwiO1xuaW1wb3J0IHsgVUlTZXJ2aWNlLCBVdGlsc01vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gXCJyZW1hcmstZ2ZtXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb2xsYXBzZU1vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL2NvbGxhcHNlXCI7XG5pbXBvcnQgeyBSZW1hcmtNb2R1bGUgfSBmcm9tIFwibmd4LXJlbWFya1wiO1xuaW1wb3J0IHsgSW5pdGlhbHNBdmF0YXJDb21wb25lbnQgfSBmcm9tIFwiLi4vaW5pdGlhbHMtYXZhdGFyL2luaXRpYWxzLWF2YXRhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoYXRSZWZlcmVuY2VDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hhdC1yZWZlcmVuY2UvY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50XCI7XG5cbmltcG9ydCBcInByaXNtanMtY29tcG9uZW50cy1pbXBvcnRlci9lc21cIjtcbmltcG9ydCAncHJpc21qcy9wbHVnaW5zL2F1dG9sb2FkZXIvcHJpc20tYXV0b2xvYWRlcic7XG5cbmRlY2xhcmUgbW9kdWxlIFByaXNtIHtcbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsVW5kZXIoZWw6IEhUTUxFbGVtZW50KTogdm9pZDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNxLWNoYXQtbWVzc2FnZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVXRpbHNNb2R1bGUsIENvbGxhcHNlTW9kdWxlLCBSZW1hcmtNb2R1bGUsXG4gICAgSW5pdGlhbHNBdmF0YXJDb21wb25lbnQsIENoYXRSZWZlcmVuY2VDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbjogQ2hhdE1lc3NhZ2VbXTtcbiAgQElucHV0KCkgc3VnZ2VzdGVkQWN0aW9uczogU3VnZ2VzdGVkQWN0aW9uW10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzdHJlYW1pbmc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuUmVnZW5lcmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5Db3B5OiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvcGVuRG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtyZWZlcmVuY2U6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyfT4oKTtcbiAgQE91dHB1dCgpIG9wZW5QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjx7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0+KCk7XG4gIEBPdXRwdXQoKSBzdWdnZXN0QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTdWdnZXN0ZWRBY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGNvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgcmVnZW5lcmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBsaWtlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGRpc2xpa2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuXG4gIHByb2Nlc3NvcjogUHJvY2Vzc29yO1xuXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIHNob3dSZWZlcmVuY2VzOiBib29sZWFuID0gdHJ1ZTtcbiAgY29sbGFwc2VQcm9ncmVzczogYm9vbGVhbjtcbiAgaWNvblNpemUgPSAyNDtcblxuICBsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICF0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsID8gJydcbiAgICAgIDogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbFsnZnVsbE5hbWUnXSBhcyBzdHJpbmcgfHwgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbC5uYW1lO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgcHVibGljIHByaW5jaXBhbFNlcnZpY2U6IFByaW5jaXBhbFdlYlNlcnZpY2UsXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnN0cmVhbWluZykge1xuICAgICAgdGhpcy5jb2xsYXBzZVByb2dyZXNzID0gIXRoaXMuc3RyZWFtaW5nO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UgJiYgdGhpcy5tZXNzYWdlPy5yb2xlID09PSBcImFzc2lzdGFudFwiKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBbXTtcbiAgICAgIHRoaXMucmVmZXJlbmNlTWFwLmNsZWFyKCk7XG4gICAgICBmb3IgKGxldCBtIG9mIHRoaXMuY29udmVyc2F0aW9uKSB7XG4gICAgICAgIGlmIChtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRhdHRhY2htZW50KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50IG9mIG0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlTWFwLnNldCgnJyArIGF0dGFjaG1lbnQuY29udGV4dElkLCB7IC4uLmF0dGFjaG1lbnQsICRwYXJ0SWQ6IGF0dGFjaG1lbnQucGFydHM/LlswXS5wYXJ0SWQgfSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGFjaG1lbnQucGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVmSWQgPSBgJHthdHRhY2htZW50LmNvbnRleHRJZH0uJHthdHRhY2htZW50LnBhcnRzW2ldLnBhcnRJZH1gO1xuICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZU1hcC5zZXQocmVmSWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0c1tpXS5wYXJ0SWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgICAgIC51c2UocmVtYXJrUGFyc2UpXG4gICAgICAgIC51c2UocmVtYXJrR2ZtKVxuICAgICAgICAudXNlKCgpID0+IHRoaXMucmVmZXJlbmNlUGx1Z2luKTtcblxuICAgICAgaWYgKHRoaXMuc3RyZWFtaW5nKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3IudXNlKCgpID0+IHRoaXMucGxhY2Vob2xkZXJQbHVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBQcmlzbT8uaGlnaGxpZ2h0QWxsVW5kZXI/Lih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgVW5pZmllZCBwbHVnaW4gbG9va3MgYSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlcyBhbnkgcmVmZXJlbmNlIGluIHRoZVxuICAgKiBmb3JtIFsxXSwgWzIuM10sIGV0Yy4gd2l0aCBjdXN0b20gbm9kZXMgb2YgdHlwZSBcImNoYXQtcmVmZXJlbmNlXCIuXG4gICAqL1xuICByZWZlcmVuY2VQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgLy8gVmlzaXQgYWxsIHRleHQgbm9kZXNcbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XG4gICAgICBsZXQgdGV4dCA9IG5vZGUudmFsdWU7XG5cbiAgICAgIHRleHQgPSB0aGlzLnJlZm9ybWF0UmVmZXJlbmNlcyh0ZXh0KTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLmdldFJlZmVyZW5jZU1hdGNoZXModGV4dCk7XG5cbiAgICAgIC8vIFF1aXQgaWYgbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kXG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlczogKENvbnRlbnQgJiB7IGVuZDogbnVtYmVyIH0pW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCByZWZJZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgW3JlZl0gPSByZWZJZC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIFdlIGZpbmQgYSB2YWxpZCByZWZlcmVuY2UgaW4gdGhlIHRleHRcbiAgICAgICAgaWYgKCFpc05hTigrcmVmKSkge1xuICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKCtyZWYpOyAvLyBBZGQgaXQgdG8gdGhlIHNldCBvZiB1c2VkIHJlZmVyZW5jZXNcblxuICAgICAgICAgIC8vIElmIG5lZWRlZCwgaW5zZXJ0IGEgdGV4dCBub2RlIGJlZm9yZSB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG5vZGVzLmF0KC0xKSA/PyB7IGVuZDogMCB9O1xuICAgICAgICAgIGlmIChtYXRjaC5pbmRleCEgPiBjdXJyZW50LmVuZCkge1xuICAgICAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZTogdGV4dC5zdWJzdHJpbmcoY3VycmVudC5lbmQsIG1hdGNoLmluZGV4ISksIGVuZDogbWF0Y2guaW5kZXghIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBhIGN1c3RvbSByZWZlcmVuY2Ugbm9kZVxuICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcImNoYXQtcmVmZXJlbmNlXCIsIHJlZklkLCBlbmQ6IG1hdGNoLmluZGV4ISArIG1hdGNoWzBdLmxlbmd0aCB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUXVpdCBpZiBubyByZWZlcmVuY2VzIHdlcmUgZm91bmRcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZXMuYXQoLTEpIS5lbmQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICBub2Rlcy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHZhbHVlOiB0ZXh0LnN1YnN0cmluZyhub2Rlcy5hdCgtMSkhLmVuZCwgdGV4dC5sZW5ndGgpLCBlbmQ6IHRleHQubGVuZ3RoIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGN1cnJlbnQgdGV4dCBub2RlIGZyb20gdGhlIHBhcmVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgbm9kZXNcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEsIC4uLm5vZGVzKTtcblxuICAgICAgcmV0dXJuIGluZGV4ICsgbm9kZXMubGVuZ3RoOyAvLyBWaXNpdCB0aGUgbmV4dCBub2RlIGFmdGVyIHRoZSBpbnNlcnRlZCBvbmVzXG4gICAgfSk7XG5cbiAgICBpZiAocmVmZXJlbmNlcy5zaXplID4gMCkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gQXJyYXkuZnJvbShyZWZlcmVuY2VzLnZhbHVlcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAgIC5tYXAociA9PiAnJyArIHIpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgcGxhY2Vob2xkZXJQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgdmlzaXQodHJlZSwgXCJ0ZXh0XCIsIChub2RlOiBUZXh0LCBpbmRleDogbnVtYmVyLCBwYXJlbnQ6IFBhcmVudCkgPT4ge1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goeyB0eXBlOiBcInN0cmVhbWluZy1wbGFjZWhvbGRlclwiIH0gYXMgYW55KTtcbiAgICAgIHJldHVybiBFWElUO1xuICAgIH0sIHRydWUpO1xuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRMaW5rVGV4dChub2RlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgIHJldHVybiBub2RlLnRleHQ7IC8vIFJldHVybiBkaXJlY3RseSBpZiB0ZXh0IGlzIHByb3ZpZGVkIGluIG5vZGUudGV4dCAoW0V4YW1wbGUgbGlua10oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGZvciB0ZXh0IGNvbnRlbnQgaW4gY2hpbGQgbm9kZXNcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmIGNoaWxkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLnZhbHVlOyAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCB0ZXh0IG5vZGUgZm91bmQgKFsqKkVtcGhhc2l6ZWQgTGluayBUZXh0KipdKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMuZ2V0TGlua1RleHQoY2hpbGQpOyAvLyBSZWN1cnNpdmVseSBzZWFyY2ggY2hpbGQgbm9kZXMgKFshW0V4YW1wbGUgaW1hZ2VdKGh0dHBzOi8vZXhhbXBsZS5jb20vaW1hZ2UucG5nKV0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQ7IC8vIFJldHVybiB0ZXh0IGNvbnRlbnQgaWYgZm91bmRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdsaW5rJzsgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBubyB0ZXh0IGNvbnRlbnQgaXMgZm91bmRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZvcm1hdCBbaWRzOiAxMi4yLCA0Mi41XSB0byBbMTIuMl1bNDIuNV1cbiAgICovXG4gIHJlZm9ybWF0UmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9cXFsoPzppZHM/Oj9cXHMqKT8oPzpkb2N1bWVudHM/Oj9cXHMqKT8oXFxzKig/Oiw/XFxzKlxcZCsoPzpcXC5cXGQrKT8oPzpcXC5wYXJ0KT9cXHMqKSspXFxdL2csXG4gICAgICAoc3RyLCBtYXRjaDogc3RyaW5nKSA9PiBgWyR7bWF0Y2gucmVwbGFjZSgvXFwucGFydC9nLCBcIlwiKS5zcGxpdCgnLCcpLmpvaW4oXCJdIFtcIil9XWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoIGFsbCByZWZlcmVuY2VzIGluIGEgZ2l2ZW4gbWVzc2FnZVxuICAgKi9cbiAgZ2V0UmVmZXJlbmNlTWF0Y2hlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb250ZW50Lm1hdGNoQWxsKC9cXFsoXFxzKlxcZCsoPzpcXC5cXGQrKT9cXHMqKVxcXS9nKSk7XG4gIH1cblxuICBjb3B5VG9DbGlwYm9hcmQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcbiAgICB0aGlzLnVpLmNvcHlUb0NsaXBib2FyZChtZXNzYWdlLmNvbnRlbnQpO1xuICAgIHRoaXMuY29weS5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgb3BlbkF0dGFjaG1lbnRQcmV2aWV3KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICB9XG5cbiAgb3Blbk9yaWdpbmFsQXR0YWNobWVudChhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xuICAgIHRoaXMub3BlbkRvY3VtZW50LmVtaXQoe3JlZmVyZW5jZTogYXR0YWNobWVudCwgcGFydElkfSk7XG4gIH1cbn1cbiIsIjwhLS0gTWVzc2FnZSBpY29uIC0tPlxuPHNwYW4gY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbdGl0bGVdPVwibWVzc2FnZT8ucm9sZVwiPlxuICA8aSBjbGFzcz1cImQtYmxvY2tcIiBbc3R5bGUud2lkdGgucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIiFtZXNzYWdlXCI+PC9pPlxuICA8aSBbbmdDbGFzc109XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIm1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIj48L2k+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5yb2xlID09PSAndXNlcidcIj5cbiAgICA8aSBbbmdDbGFzc109XCJ1c2VyTWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCIgKm5nSWY9XCIhIXVzZXJNZXNzYWdlSWNvbjsgZWxzZSBpbml0aWFsc0F2YXRhclwiPjwvaT5cbiAgICA8bmctdGVtcGxhdGUgI2luaXRpYWxzQXZhdGFyPlxuICAgICAgPHNxLWluaXRpYWxzLWF2YXRhciBbZnVsbE5hbWVdPVwibmFtZVwiPjwvc3EtaW5pdGlhbHMtYXZhdGFyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9zcGFuPlxuXG48IS0tIE1lc3NhZ2UgYm9keSAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFtuZ0NsYXNzXT1cIidtZXNzYWdlLScrbWVzc2FnZS5yb2xlXCI+XG5cbiAgPGRpdiAqbmdJZj1cIm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzIGFzIHByb2dyZXNzXCIgY2xhc3M9XCJzbWFsbCBtcy0zIG1iLTJcIj5cbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJjb2xsYXBzZVByb2dyZXNzID0gIWNvbGxhcHNlUHJvZ3Jlc3M7IGZhbHNlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICBWaWV3IHByb2dyZXNzXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXt7Y29sbGFwc2VQcm9ncmVzcz8gJ3JpZ2h0JyA6ICdkb3duJ319XCI+PC9pPlxuICAgIDwvYT5cbiAgICA8c3EtY29sbGFwc2UgW2NvbGxhcHNlZF09XCJjb2xsYXBzZVByb2dyZXNzXCI+XG4gICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN0ZXAgb2YgcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZ3IGZhLWNoZWNrIHRleHQtc3VjY2Vzc1wiICpuZ0lmPVwic3RlcC5kb25lXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZncgZmEtc3BpbiBmYS1jaXJjbGUtbm90Y2hcIiAqbmdJZj1cIiFzdGVwLmRvbmVcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTIgZnctYm9sZFwiPnt7c3RlcC50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdGVwLmNvbnRlbnRcIj46IHt7c3RlcC5jb250ZW50fX08L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcS1jb2xsYXBzZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XG5cbiAgICA8cmVtYXJrICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIiBbbWFya2Rvd25dPVwibWVzc2FnZS5jb250ZW50XCIgW3Byb2Nlc3Nvcl09XCJwcm9jZXNzb3JcIj5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwiY2hhdC1yZWZlcmVuY2VcIiBsZXQtcmVmPlxuXG4gICAgICAgIDxhICpuZ0lmPVwicmVmZXJlbmNlTWFwLmdldChyZWYucmVmSWQpIGFzIGF0dGFjaG1lbnQ7IGVsc2Ugc3RhdGljUmVmVHBsXCJcbiAgICAgICAgICBjbGFzcz1cInJlZmVyZW5jZVwiXG4gICAgICAgICAgW3NxVG9vbHRpcF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwidG9vbHRpcFRwbFwiXG4gICAgICAgICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgPnt7cmVmLnJlZklkfX1cbiAgICAgICAgPC9hPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdGljUmVmVHBsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVmZXJlbmNlXCI+e3tyZWYucmVmSWR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwic3RyZWFtaW5nLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXItZ2xvd1wiICpuZ0lmPVwic3RyZWFtaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlciBtcy0xXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJjb2RlXCIgbGV0LW5vZGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4+e3tub2RlLmxhbmd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5VG9DbGlwYm9hcmQobm9kZS52YWx1ZSlcIj48aSBjbGFzcz1cImZhciBmYS1mdyBmYS1jbGlwYm9hcmRcIj48L2k+IENvcHkgY29kZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319IG15LTAgcm91bmRlZC0wIHJvdW5kZWQtYm90dG9tXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319XCI+e3tub2RlLnZhbHVlfX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwibGlua1wiIGxldC1ub2RlPlxuICAgICAgICA8YSBbaHJlZl09XCJub2RlLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57e2dldExpbmtUZXh0KG5vZGUpfX08L2E+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9yZW1hcms+XG5cbiAgICA8cCAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICd1c2VyJ1wiPnt7bWVzc2FnZS5jb250ZW50fX08L3A+XG5cbiAgICA8IS0tIExpc3Qgb2YgcmVmZXJlbmNlLCBpZiBhbnkgLS0+XG4gICAgPGRpdiAqbmdJZj1cInJlZmVyZW5jZXM/Lmxlbmd0aFwiIGNsYXNzPVwicmVmZXJlbmNlc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWZlcmVuY2VzLXRpdGxlXCI+UmVmZXJlbmNlczwvc3Bhbj4gPGkgY2xhc3M9XCJmYXMgcmVmZXJlbmNlcy1jb2xsYXBzZVwiIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwic2hvd1JlZmVyZW5jZXNcIiBbY2xhc3MuZmEtY2hldnJvbi1yaWdodF09XCIhc2hvd1JlZmVyZW5jZXNcIiAoY2xpY2spPVwic2hvd1JlZmVyZW5jZXM9IXNob3dSZWZlcmVuY2VzXCI+PC9pPlxuICAgICAgPHNxLWNvbGxhcHNlIFtjb2xsYXBzZWRdPVwiIXNob3dSZWZlcmVuY2VzXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlc1wiPlxuICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJyZWZlcmVuY2VNYXAuZ2V0KHJlZmVyZW5jZSkgYXMgYXR0YWNobWVudFwiICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3EtY2hhdC1yZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJhdHRhY2htZW50LiRleHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0YWNobWVudF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VdPVwicmVmZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9zcS1jb2xsYXBzZT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICAgIDwhLS0gRWRpdCAvIFJlZ2VuZXJhdGUgZmxvYXRpbmcgYWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cInNxLWNoYXQtbWVzc2FnZS1hY3Rpb25zXCIgKm5nSWY9XCJtZXNzYWdlXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkVkaXRcIiBzcVRvb2x0aXA9XCJFZGl0IG1lc3NhZ2VcIlxuICAgIChjbGljayk9XCJlZGl0LmVtaXQobWVzc2FnZSlcIj5cbjxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XG48L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuQ29weVwiIHNxVG9vbHRpcD1cIkNvcHkgdG8gY2xpcGJvYXJkXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2xpcGJvYXJkXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5SZWdlbmVyYXRlXCIgc3FUb29sdGlwPVwiUmVnZW5lcmF0ZSBtZXNzYWdlXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGUuZW1pdChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG48IS0tICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIFtjbGFzcy5ib3VuY2VdPVwibGlrZWRcIiAqbmdJZj1cIm1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgIXN0cmVhbWluZ1wiIHNxVG9vbHRpcD1cIkxpa2UgdGhlIGFuc3dlclwiXG4gICAgICAoY2xpY2spPVwibGlrZS5lbWl0KG1lc3NhZ2UpOyBsaWtlZCA9IHRydWU7XCI+XG4gICAgICA8aSBjbGFzcz1cImZhciBmYS10aHVtYnMtdXBcIj48L2k+XG4gICAgPC9idXR0b24+IC0tPlxuPCEtLSAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYm91bmNlXCIgIFtjbGFzcy5ib3VuY2VdPVwiZGlzbGlrZWRcIiAqbmdJZj1cIm1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgIXN0cmVhbWluZ1wiIHNxVG9vbHRpcD1cIlJlcG9ydCBhbiBpc3N1ZVwiXG4gICAgICAoY2xpY2spPVwiZGlzbGlrZS5lbWl0KG1lc3NhZ2UpOyBkaXNsaWtlZCA9IHRydWU7XCI+XG4gICAgICA8aSBjbGFzcz1cImZhciBmYS10aHVtYnMtZG93blwiPjwvaT5cbiAgICA8L2J1dHRvbj4gLS0+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGlzdCBvZiBzdWdnZXN0ZWQgYWN0aW9ucywgaWYgYW55IC0tPlxuICA8ZGl2ICpuZ0lmPVwic3VnZ2VzdGVkQWN0aW9uc1wiIGNsYXNzPVwibXQtMiBtZXNzYWdlLXN1Z2dlc3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvblwiICpuZ0Zvcj1cImxldCBzdWdnZXN0ZWRBY3Rpb24gb2Ygc3VnZ2VzdGVkQWN0aW9uc1wiIChjbGljayk9XCJzdWdnZXN0QWN0aW9uLmVtaXQoc3VnZ2VzdGVkQWN0aW9uKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxuICAgICAgICA8cD48aSBjbGFzcz1cImZhcyBmYS1jbGlwYm9hcmQtcXVlc3Rpb25cIj48L2k+IHt7c3VnZ2VzdGVkQWN0aW9uLmNvbnRlbnR9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI3Rvb2x0aXBUcGwgbGV0LXJlZj5cbiAgICA8c3EtY2hhdC1yZWZlcmVuY2VcbiAgICAgIGNsYXNzPVwiZXhwYW5kZWRcIlxuICAgICAgW2F0dGFjaG1lbnRdPVwicmVmXCJcbiAgICAgIFtyZWZlcmVuY2VdPVwicmVmLmNvbnRleHRJZFwiXG4gICAgICBbcGFydElkXT1cInJlZi4kcGFydElkXCJcbiAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50LCByZWYuJHBhcnRJZClcIlxuICAgICAgKG9wZW5Eb2N1bWVudCk9XCJvcGVuT3JpZ2luYWxBdHRhY2htZW50KCRldmVudCwgcmVmLiRwYXJ0SWQpXCI+XG4gICAgPC9zcS1jaGF0LXJlZmVyZW5jZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPC9kaXY+XG4iXX0=
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7OztBQWVqRSxNQUFNLE9BQU8sb0JBQW9CO0lBa0MvQixZQUNT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S0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLCBBZnRlclZpZXdJbml0LCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFByaW5jaXBhbFdlYlNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9zZWFyY2hcIjtcbmltcG9ydCB7IENoYXRDb250ZXh0QXR0YWNobWVudCwgQ2hhdE1lc3NhZ2UsIFN1Z2dlc3RlZEFjdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyB1bmlmaWVkLCBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gXCJyZW1hcmstcGFyc2VcIjtcbmltcG9ydCB7IHZpc2l0LCBDT05USU5VRSwgRVhJVCB9IGZyb20gXCJ1bmlzdC11dGlsLXZpc2l0XCI7XG5pbXBvcnQgeyBUZXh0LCBQYXJlbnQsIENvbnRlbnQgfSBmcm9tIFwibWRhc3RcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwidW5pc3RcIjtcbmltcG9ydCB7IFVJU2VydmljZSwgVXRpbHNNb2R1bGUgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy91dGlsc1wiO1xuaW1wb3J0IHJlbWFya0dmbSBmcm9tIFwicmVtYXJrLWdmbVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29sbGFwc2VNb2R1bGUgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9jb2xsYXBzZVwiO1xuaW1wb3J0IHsgUmVtYXJrTW9kdWxlIH0gZnJvbSBcIm5neC1yZW1hcmtcIjtcbmltcG9ydCB7IEluaXRpYWxzQXZhdGFyQ29tcG9uZW50IH0gZnJvbSBcIi4uL2luaXRpYWxzLWF2YXRhci9pbml0aWFscy1hdmF0YXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDaGF0UmVmZXJlbmNlQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXQtcmVmZXJlbmNlL2NoYXQtcmVmZXJlbmNlLmNvbXBvbmVudFwiO1xuXG5pbXBvcnQgXCJwcmlzbWpzLWNvbXBvbmVudHMtaW1wb3J0ZXIvZXNtXCI7XG5pbXBvcnQgJ3ByaXNtanMvcGx1Z2lucy9hdXRvbG9hZGVyL3ByaXNtLWF1dG9sb2FkZXInO1xuaW1wb3J0IHsgQ2hhcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hhcnRzL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudFwiO1xuXG5kZWNsYXJlIG1vZHVsZSBQcmlzbSB7XG4gIGZ1bmN0aW9uIGhpZ2hsaWdodEFsbFVuZGVyKGVsOiBIVE1MRWxlbWVudCk6IHZvaWQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzcS1jaGF0LW1lc3NhZ2VcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFV0aWxzTW9kdWxlLCBDb2xsYXBzZU1vZHVsZSwgUmVtYXJrTW9kdWxlLFxuICAgIEluaXRpYWxzQXZhdGFyQ29tcG9uZW50LCBDaGF0UmVmZXJlbmNlQ29tcG9uZW50LCBDaGFydENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQ2hhdE1lc3NhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBtZXNzYWdlOiBDaGF0TWVzc2FnZTtcbiAgQElucHV0KCkgY29udmVyc2F0aW9uOiBDaGF0TWVzc2FnZVtdO1xuICBASW5wdXQoKSBzdWdnZXN0ZWRBY3Rpb25zOiBTdWdnZXN0ZWRBY3Rpb25bXSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgYXNzaXN0YW50TWVzc2FnZUljb246IHN0cmluZztcbiAgQElucHV0KCkgdXNlck1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0cmVhbWluZzogYm9vbGVhbjtcbiAgQElucHV0KCkgY2FuRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5SZWdlbmVyYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkNvcHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuTGlrZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5EaXNsaWtlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvcGVuRG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtyZWZlcmVuY2U6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyfT4oKTtcbiAgQE91dHB1dCgpIG9wZW5QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjx7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0+KCk7XG4gIEBPdXRwdXQoKSBzdWdnZXN0QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTdWdnZXN0ZWRBY3Rpb24+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGNvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgcmVnZW5lcmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBsaWtlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGRpc2xpa2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgZGVidWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuXG4gIHByb2Nlc3NvcjogUHJvY2Vzc29yO1xuXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIHNob3dSZWZlcmVuY2VzOiBib29sZWFuID0gdHJ1ZTtcbiAgY29sbGFwc2VQcm9ncmVzczogYm9vbGVhbjtcbiAgaWNvblNpemUgPSAyNDtcblxuICBsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgIHB1YmxpYyB1aTogVUlTZXJ2aWNlLFxuICAgIHB1YmxpYyBwcmluY2lwYWxTZXJ2aWNlOiBQcmluY2lwYWxXZWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5zdHJlYW1pbmcpIHtcbiAgICAgIHRoaXMuY29sbGFwc2VQcm9ncmVzcyA9ICF0aGlzLnN0cmVhbWluZztcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlICYmIHRoaXMubWVzc2FnZT8ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gW107XG4gICAgICB0aGlzLnJlZmVyZW5jZU1hcC5jbGVhcigpO1xuICAgICAgZm9yIChsZXQgbSBvZiB0aGlzLmNvbnZlcnNhdGlvbikge1xuICAgICAgICBpZiAobS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCkge1xuICAgICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRhdHRhY2htZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZU1hcC5zZXQoJycgKyBhdHRhY2htZW50LmNvbnRleHRJZCwgeyAuLi5hdHRhY2htZW50LCAkcGFydElkOiBhdHRhY2htZW50LnBhcnRzPy5bMF0ucGFydElkIH0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRhY2htZW50LnBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlZklkID0gYCR7YXR0YWNobWVudC5jb250ZXh0SWR9LiR7YXR0YWNobWVudC5wYXJ0c1tpXS5wYXJ0SWR9YDtcbiAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KHJlZklkLCB7IC4uLmF0dGFjaG1lbnQsICRwYXJ0SWQ6IGF0dGFjaG1lbnQucGFydHNbaV0ucGFydElkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG0uY29udGVudC5zdGFydHNXaXRoKFwiPGNoYXJ0anM+XCIpKXtcbiAgICAgICAgICBtLm1lc3NhZ2VUeXBlID0gXCJDSEFSVFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgbS5tZXNzYWdlVHlwZSA9IFwiTUFSS0RPV05cIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnByb2Nlc3NvciA9IHVuaWZpZWQoKVxuICAgICAgICAudXNlKHJlbWFya1BhcnNlKVxuICAgICAgICAudXNlKHJlbWFya0dmbSlcbiAgICAgICAgLnVzZSgoKSA9PiB0aGlzLnJlZmVyZW5jZVBsdWdpbik7XG5cbiAgICAgIGlmICh0aGlzLnN0cmVhbWluZykge1xuICAgICAgICB0aGlzLnByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29yLnVzZSgoKSA9PiB0aGlzLnBsYWNlaG9sZGVyUGx1Z2luKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgUHJpc20/LmhpZ2hsaWdodEFsbFVuZGVyPy4odGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICF0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsID8gJydcbiAgICAgIDogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbFsnZnVsbE5hbWUnXSBhcyBzdHJpbmcgfHwgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbC5uYW1lO1xuICB9XG5cbiAgZ2V0IGlzQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWw/LmlzQWRtaW5pc3RyYXRvciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIFVuaWZpZWQgcGx1Z2luIGxvb2tzIGEgdGV4dCBub2RlcyBhbmQgcmVwbGFjZXMgYW55IHJlZmVyZW5jZSBpbiB0aGVcbiAgICogZm9ybSBbMV0sIFsyLjNdLCBldGMuIHdpdGggY3VzdG9tIG5vZGVzIG9mIHR5cGUgXCJjaGF0LXJlZmVyZW5jZVwiLlxuICAgKi9cbiAgcmVmZXJlbmNlUGx1Z2luID0gKHRyZWU6IE5vZGUpID0+IHtcblxuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgIC8vIFZpc2l0IGFsbCB0ZXh0IG5vZGVzXG4gICAgdmlzaXQodHJlZSwgXCJ0ZXh0XCIsIChub2RlOiBUZXh0LCBpbmRleDogbnVtYmVyLCBwYXJlbnQ6IFBhcmVudCkgPT4ge1xuICAgICAgbGV0IHRleHQgPSBub2RlLnZhbHVlO1xuXG4gICAgICB0ZXh0ID0gdGhpcy5yZWZvcm1hdFJlZmVyZW5jZXModGV4dCk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5nZXRSZWZlcmVuY2VNYXRjaGVzKHRleHQpO1xuXG4gICAgICAvLyBRdWl0IGlmIG5vIHJlZmVyZW5jZXMgd2VyZSBmb3VuZFxuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBDT05USU5VRTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZXM6IChDb250ZW50ICYgeyBlbmQ6IG51bWJlciB9KVtdID0gW107XG5cbiAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgcmVmSWQgPSBtYXRjaFsxXS50cmltKCk7XG4gICAgICAgIGNvbnN0IFtyZWZdID0gcmVmSWQuc3BsaXQoXCIuXCIpO1xuICAgICAgICAvLyBXZSBmaW5kIGEgdmFsaWQgcmVmZXJlbmNlIGluIHRoZSB0ZXh0XG4gICAgICAgIGlmICghaXNOYU4oK3JlZikpIHtcbiAgICAgICAgICByZWZlcmVuY2VzLmFkZCgrcmVmKTsgLy8gQWRkIGl0IHRvIHRoZSBzZXQgb2YgdXNlZCByZWZlcmVuY2VzXG5cbiAgICAgICAgICAvLyBJZiBuZWVkZWQsIGluc2VydCBhIHRleHQgbm9kZSBiZWZvcmUgdGhlIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBub2Rlcy5hdCgtMSkgPz8geyBlbmQ6IDAgfTtcbiAgICAgICAgICBpZiAobWF0Y2guaW5kZXghID4gY3VycmVudC5lbmQpIHtcbiAgICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcInRleHRcIiwgdmFsdWU6IHRleHQuc3Vic3RyaW5nKGN1cnJlbnQuZW5kLCBtYXRjaC5pbmRleCEpLCBlbmQ6IG1hdGNoLmluZGV4ISB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBZGQgYSBjdXN0b20gcmVmZXJlbmNlIG5vZGVcbiAgICAgICAgICBub2Rlcy5wdXNoKHsgdHlwZTogXCJjaGF0LXJlZmVyZW5jZVwiLCByZWZJZCwgZW5kOiBtYXRjaC5pbmRleCEgKyBtYXRjaFswXS5sZW5ndGggfSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFF1aXQgaWYgbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kXG4gICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBDT05USU5VRTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVzLmF0KC0xKSEuZW5kIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZTogdGV4dC5zdWJzdHJpbmcobm9kZXMuYXQoLTEpIS5lbmQsIHRleHQubGVuZ3RoKSwgZW5kOiB0ZXh0Lmxlbmd0aCB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoZSBjdXJyZW50IHRleHQgbm9kZSBmcm9tIHRoZSBwYXJlbnQgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IG5vZGVzXG4gICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxLCAuLi5ub2Rlcyk7XG5cbiAgICAgIHJldHVybiBpbmRleCArIG5vZGVzLmxlbmd0aDsgLy8gVmlzaXQgdGhlIG5leHQgbm9kZSBhZnRlciB0aGUgaW5zZXJ0ZWQgb25lc1xuICAgIH0pO1xuXG4gICAgaWYgKHJlZmVyZW5jZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlcyA9IEFycmF5LmZyb20ocmVmZXJlbmNlcy52YWx1ZXMoKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKVxuICAgICAgICAubWFwKHIgPT4gJycgKyByKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIHBsYWNlaG9sZGVyUGx1Z2luID0gKHRyZWU6IE5vZGUpID0+IHtcblxuICAgIHZpc2l0KHRyZWUsIFwidGV4dFwiLCAobm9kZTogVGV4dCwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBQYXJlbnQpID0+IHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHsgdHlwZTogXCJzdHJlYW1pbmctcGxhY2Vob2xkZXJcIiB9IGFzIGFueSk7XG4gICAgICByZXR1cm4gRVhJVDtcbiAgICB9LCB0cnVlKTtcblxuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgZ2V0TGlua1RleHQobm9kZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAobm9kZS50ZXh0KSB7XG4gICAgICByZXR1cm4gbm9kZS50ZXh0OyAvLyBSZXR1cm4gZGlyZWN0bHkgaWYgdGV4dCBpcyBwcm92aWRlZCBpbiBub2RlLnRleHQgKFtFeGFtcGxlIGxpbmtdKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBmb3IgdGV4dCBjb250ZW50IGluIGNoaWxkIG5vZGVzXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICd0ZXh0JyAmJiBjaGlsZC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjaGlsZC52YWx1ZTsgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgdGV4dCBub2RlIGZvdW5kIChbKipFbXBoYXNpemVkIExpbmsgVGV4dCoqXShodHRwczovL2V4YW1wbGUuY29tKSlcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB0aGlzLmdldExpbmtUZXh0KGNoaWxkKTsgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGNoaWxkIG5vZGVzIChbIVtFeGFtcGxlIGltYWdlXShodHRwczovL2V4YW1wbGUuY29tL2ltYWdlLnBuZyldKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxuICAgICAgICAgIGlmICh0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50OyAvLyBSZXR1cm4gdGV4dCBjb250ZW50IGlmIGZvdW5kXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnbGluayc7IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm8gdGV4dCBjb250ZW50IGlzIGZvdW5kXG4gIH1cblxuICAvKipcbiAgICogUmVmb3JtYXQgW2lkczogMTIuMiwgNDIuNV0gdG8gWzEyLjJdWzQyLjVdXG4gICAqL1xuICByZWZvcm1hdFJlZmVyZW5jZXMoY29udGVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvXFxbKD86aWRzPzo/XFxzKik/KD86ZG9jdW1lbnRzPzo/XFxzKik/KFxccyooPzosP1xccypcXGQrKD86XFwuXFxkKyk/KD86XFwucGFydCk/XFxzKikrKVxcXS9nLFxuICAgICAgKHN0ciwgbWF0Y2g6IHN0cmluZykgPT4gYFske21hdGNoLnJlcGxhY2UoL1xcLnBhcnQvZywgXCJcIikuc3BsaXQoJywnKS5qb2luKFwiXSBbXCIpfV1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBhbGwgcmVmZXJlbmNlcyBpbiBhIGdpdmVuIG1lc3NhZ2VcbiAgICovXG4gIGdldFJlZmVyZW5jZU1hdGNoZXMoY29udGVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29udGVudC5tYXRjaEFsbCgvXFxbKFxccypcXGQrKD86XFwuXFxkKyk/XFxzKilcXF0vZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29weVRvQ2xpcGJvYXJkKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHRoaXMudWkuY29weVRvQ2xpcGJvYXJkKGNvbnRlbnQpO1xuXG4gIH1cblxuICBjb3B5TWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xuICAgIHRoaXMuX2NvcHlUb0NsaXBib2FyZChtZXNzYWdlLmNvbnRlbnQpO1xuICAgIHRoaXMuY29weS5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgY29weUNvZGUoY29kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29weVRvQ2xpcGJvYXJkKGNvZGUpO1xuICB9XG5cbiAgb3BlbkF0dGFjaG1lbnRQcmV2aWV3KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICB9XG5cbiAgb3Blbk9yaWdpbmFsQXR0YWNobWVudChhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xuICAgIHRoaXMub3BlbkRvY3VtZW50LmVtaXQoe3JlZmVyZW5jZTogYXR0YWNobWVudCwgcGFydElkfSk7XG4gIH1cbn1cbiIsIjwhLS0gTWVzc2FnZSBpY29uIC0tPlxuPHNwYW4gY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbdGl0bGVdPVwibWVzc2FnZT8ucm9sZVwiPlxuICA8aSBjbGFzcz1cImQtYmxvY2tcIiBbc3R5bGUud2lkdGgucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIiFtZXNzYWdlXCI+PC9pPlxuICA8aSBbbmdDbGFzc109XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIm1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIj48L2k+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5yb2xlID09PSAndXNlcidcIj5cbiAgICA8aSBbbmdDbGFzc109XCJ1c2VyTWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCIgKm5nSWY9XCIhIXVzZXJNZXNzYWdlSWNvbjsgZWxzZSBpbml0aWFsc0F2YXRhclwiPjwvaT5cbiAgICA8bmctdGVtcGxhdGUgI2luaXRpYWxzQXZhdGFyPlxuICAgICAgPHNxLWluaXRpYWxzLWF2YXRhciBbZnVsbE5hbWVdPVwibmFtZVwiPjwvc3EtaW5pdGlhbHMtYXZhdGFyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9zcGFuPlxuXG48IS0tIE1lc3NhZ2UgYm9keSAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFtuZ0NsYXNzXT1cIidtZXNzYWdlLScrbWVzc2FnZS5yb2xlXCI+XG5cbiAgPGRpdiAqbmdJZj1cIm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzIGFzIHByb2dyZXNzXCIgY2xhc3M9XCJzbWFsbCBtcy0zIG1iLTJcIj5cbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJjb2xsYXBzZVByb2dyZXNzID0gIWNvbGxhcHNlUHJvZ3Jlc3M7IGZhbHNlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICBWaWV3IHByb2dyZXNzXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXt7Y29sbGFwc2VQcm9ncmVzcz8gJ3JpZ2h0JyA6ICdkb3duJ319XCI+PC9pPlxuICAgIDwvYT5cbiAgICA8c3EtY29sbGFwc2UgW2NvbGxhcHNlZF09XCJjb2xsYXBzZVByb2dyZXNzXCI+XG4gICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN0ZXAgb2YgcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZ3IGZhLWNoZWNrIHRleHQtc3VjY2Vzc1wiICpuZ0lmPVwic3RlcC5kb25lXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZncgZmEtc3BpbiBmYS1jaXJjbGUtbm90Y2hcIiAqbmdJZj1cIiFzdGVwLmRvbmVcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTIgZnctYm9sZFwiPnt7c3RlcC50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdGVwLmNvbnRlbnRcIj46IHt7c3RlcC5jb250ZW50fX08L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcS1jb2xsYXBzZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgbWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ0NIQVJUJ1wiPlxuICAgICAgPHNxLWFzc2lzdGFudC1jaGFydCBbcmF3Q2hhcnREYXRhXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvc3EtYXNzaXN0YW50LWNoYXJ0PlxuICAgIDwvZGl2PlxuXG4gICAgPHJlbWFyayAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNQVJLRE9XTidcIiBbbWFya2Rvd25dPVwibWVzc2FnZS5jb250ZW50XCIgW3Byb2Nlc3Nvcl09XCJwcm9jZXNzb3JcIj5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwiY2hhdC1yZWZlcmVuY2VcIiBsZXQtcmVmPlxuXG4gICAgICAgIDxhICpuZ0lmPVwicmVmZXJlbmNlTWFwLmdldChyZWYucmVmSWQpIGFzIGF0dGFjaG1lbnQ7IGVsc2Ugc3RhdGljUmVmVHBsXCJcbiAgICAgICAgICBjbGFzcz1cInJlZmVyZW5jZVwiXG4gICAgICAgICAgW3NxVG9vbHRpcF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwidG9vbHRpcFRwbFwiXG4gICAgICAgICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgPnt7cmVmLnJlZklkfX1cbiAgICAgICAgPC9hPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdGljUmVmVHBsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVmZXJlbmNlXCI+e3tyZWYucmVmSWR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwic3RyZWFtaW5nLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXItZ2xvd1wiICpuZ0lmPVwic3RyZWFtaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlciBtcy0xXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJjb2RlXCIgbGV0LW5vZGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4+e3tub2RlLmxhbmd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5Q29kZShub2RlLnZhbHVlKVwiPjxpIGNsYXNzPVwiZmFyIGZhLWZ3IGZhLWNsaXBib2FyZFwiPjwvaT4gQ29weSBjb2RlPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHByZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX0gbXktMCByb3VuZGVkLTAgcm91bmRlZC1ib3R0b21cIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX1cIj57e25vZGUudmFsdWV9fTwvY29kZT48L3ByZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJsaW5rXCIgbGV0LW5vZGU+XG4gICAgICAgIDxhIFtocmVmXT1cIm5vZGUudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7Z2V0TGlua1RleHQobm9kZSl9fTwvYT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8L3JlbWFyaz5cblxuICAgIDxwICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ3VzZXInXCI+e3ttZXNzYWdlLmNvbnRlbnR9fTwvcD5cblxuICAgIDwhLS0gTGlzdCBvZiByZWZlcmVuY2UsIGlmIGFueSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwicmVmZXJlbmNlcz8ubGVuZ3RoXCIgY2xhc3M9XCJyZWZlcmVuY2VzXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlZmVyZW5jZXMtdGl0bGVcIj5SZWZlcmVuY2VzPC9zcGFuPiA8aSBjbGFzcz1cImZhcyByZWZlcmVuY2VzLWNvbGxhcHNlXCIgW2NsYXNzLmZhLWNoZXZyb24tZG93bl09XCJzaG93UmVmZXJlbmNlc1wiIFtjbGFzcy5mYS1jaGV2cm9uLXJpZ2h0XT1cIiFzaG93UmVmZXJlbmNlc1wiIChjbGljayk9XCJzaG93UmVmZXJlbmNlcz0hc2hvd1JlZmVyZW5jZXNcIj48L2k+XG4gICAgICA8c3EtY29sbGFwc2UgW2NvbGxhcHNlZF09XCIhc2hvd1JlZmVyZW5jZXNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzXCI+XG4gICAgICAgICAgICAgIDxsaSAqbmdJZj1cInJlZmVyZW5jZU1hcC5nZXQocmVmZXJlbmNlKSBhcyBhdHRhY2htZW50XCIgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcS1jaGF0LXJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImF0dGFjaG1lbnQuJGV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRhY2htZW50XT1cImF0dGFjaG1lbnRcIlxuICAgICAgICAgICAgICAgICAgW3JlZmVyZW5jZV09XCJyZWZlcmVuY2VcIlxuICAgICAgICAgICAgICAgICAgKG9wZW5QcmV2aWV3KT1cIm9wZW5BdHRhY2htZW50UHJldmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChvcGVuRG9jdW1lbnQpPVwib3Blbk9yaWdpbmFsQXR0YWNobWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9zcS1jaGF0LXJlZmVyZW5jZT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3NxLWNvbGxhcHNlPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gICAgPCEtLSBFZGl0IC8gUmVnZW5lcmF0ZSBmbG9hdGluZyBhY3Rpb25zIC0tPlxuICA8ZGl2IGNsYXNzPVwic3EtY2hhdC1tZXNzYWdlLWFjdGlvbnNcIiAqbmdJZj1cIm1lc3NhZ2VcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuRWRpdFwiIHNxVG9vbHRpcD1cIkVkaXQgbWVzc2FnZVwiIChjbGljayk9XCJlZGl0LmVtaXQobWVzc2FnZSlcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkNvcHlcIiBzcVRvb2x0aXA9XCJDb3B5IHRvIGNsaXBib2FyZFwiIChjbGljayk9XCJjb3B5TWVzc2FnZShtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2xpcGJvYXJkXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5SZWdlbmVyYXRlXCIgc3FUb29sdGlwPVwiUmVnZW5lcmF0ZSBtZXNzYWdlXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGUuZW1pdChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiBbY2xhc3MuYm91bmNlXT1cImxpa2VkXCIgKm5nSWY9XCJjYW5MaWtlXCIgc3FUb29sdGlwPVwiTGlrZSB0aGUgYW5zd2VyXCIgKGNsaWNrKT1cImxpa2UuZW1pdChtZXNzYWdlKTsgbGlrZWQgPSB0cnVlO1wiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLXVwXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJvdW5jZVwiICBbY2xhc3MuYm91bmNlXT1cImRpc2xpa2VkXCIgKm5nSWY9XCJjYW5EaXNsaWtlXCIgc3FUb29sdGlwPVwiUmVwb3J0IGFuIGlzc3VlXCIgKGNsaWNrKT1cImRpc2xpa2UuZW1pdChtZXNzYWdlKTsgZGlzbGlrZWQgPSB0cnVlO1wiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLWRvd25cIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkRlYnVnXCIgc3FUb29sdGlwPVwiU2hvdyBMb2cgSW5mb3JtYXRpb25cIiAoY2xpY2spPVwiZGVidWcuZW1pdChtZXNzYWdlKTtcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWxpc3QtYWx0XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIExpc3Qgb2Ygc3VnZ2VzdGVkIGFjdGlvbnMsIGlmIGFueSAtLT5cbiAgPGRpdiAqbmdJZj1cInN1Z2dlc3RlZEFjdGlvbnNcIiBjbGFzcz1cIm10LTIgbWVzc2FnZS1zdWdnZXN0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3RlZC1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkQWN0aW9uIG9mIHN1Z2dlc3RlZEFjdGlvbnNcIiAoY2xpY2spPVwic3VnZ2VzdEFjdGlvbi5lbWl0KHN1Z2dlc3RlZEFjdGlvbilcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgPHA+PGkgY2xhc3M9XCJmYXMgZmEtY2xpcGJvYXJkLXF1ZXN0aW9uXCI+PC9pPiB7e3N1Z2dlc3RlZEFjdGlvbi5jb250ZW50fX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlICN0b29sdGlwVHBsIGxldC1yZWY+XG4gICAgPHNxLWNoYXQtcmVmZXJlbmNlXG4gICAgICBjbGFzcz1cImV4cGFuZGVkXCJcbiAgICAgIFthdHRhY2htZW50XT1cInJlZlwiXG4gICAgICBbcmVmZXJlbmNlXT1cInJlZi5jb250ZXh0SWRcIlxuICAgICAgW3BhcnRJZF09XCJyZWYuJHBhcnRJZFwiXG4gICAgICAob3BlblByZXZpZXcpPVwib3BlbkF0dGFjaG1lbnRQcmV2aWV3KCRldmVudCwgcmVmLiRwYXJ0SWQpXCJcbiAgICAgIChvcGVuRG9jdW1lbnQpPVwib3Blbk9yaWdpbmFsQXR0YWNobWVudCgkZXZlbnQsIHJlZi4kcGFydElkKVwiPlxuICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvZGl2PlxuIl19
|
|
@@ -87,6 +87,7 @@ export class ChatSettingsV3Component {
|
|
|
87
87
|
else {
|
|
88
88
|
this.chatService.updateChatConfig(this.config);
|
|
89
89
|
}
|
|
90
|
+
this.chatService.generateAuditEvent("configuration.edit", { 'configuration': JSON.stringify(this.config) });
|
|
90
91
|
this._update.emit(this.config);
|
|
91
92
|
}
|
|
92
93
|
/**
|
|
@@ -110,4 +111,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
110
111
|
type: Output,
|
|
111
112
|
args: ["cancel"]
|
|
112
113
|
}] } });
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFTckQsTUFBTSxPQUFPLHVCQUF1QjtJQVBwQztRQVdvQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN6QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUkzRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsY0FBUyxHQUF1QyxFQUFF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SUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzs4QkFJM0IsVUFBVTtzQkFBbEIsS0FBSztnQkFFWSxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ0UsT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGF0Q29uZmlnLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYmFzZVwiO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1jaGF0LXNldHRpbmdzLXYzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuc2Nzc1wiXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRTZXR0aW5nc1YzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgQE91dHB1dChcInVwZGF0ZVwiKSBfdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xuICBAT3V0cHV0KFwiY2FuY2VsXCIpIF9jYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBjb25maWc6IENoYXRDb25maWc7XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgc2VsZWN0ZWRNb2RlbDogR2xsbU1vZGVsRGVzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIGZ1bmN0aW9uczoge25hbWU6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbn1bXSA9IFtdO1xuICBpc0FkbWluID0gZmFsc2U7XG5cbiAgcHVibGljIGxvZ2luU2VydmljZSA9IGluamVjdChMb2dpblNlcnZpY2UpO1xuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsV2ViU2VydmljZSk7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDb25maWckKSxcbiAgICAgICAgZmlsdGVyKGluaXRDb25maWcgPT4gISFpbml0Q29uZmlnKVxuICAgICAgKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzQWRtaW5pc3RyYXRvcjtcbiAgICAgICAgLy8gSW5pdCBjb25maWcgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNoYXQgY29uZmlnLCBzbyB0aGF0IGl0IHdvbid0IGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyIHVudGlsIGhlIGNsaWNrcyBvbiBzYXZlXG4gICAgICAgIHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25maWckLnZhbHVlKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcbiAgICAgICAgdGhpcy5pbml0RnVuY3Rpb25zTGlzdCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBoYXNQcm9tcHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHQ7XG4gIH1cblxuICBnZXQgaGFzQWR2YW5jZWRQYXJhbWV0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy50ZW1wZXJhdHVyZVxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRvcF9wXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MubWF4X3Rva2VucztcbiAgfVxuXG4gIGdldCBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3Muc2VydmljZXNNb2RlbHNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5mdW5jdGlvbnNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1Z1xuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zO1xuICB9XG5cbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlID0gdGhpcy5pbnN0YW5jZU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMuaW5zdGFuY2VJZCk7XG4gIH1cblxuICBvbkNoYXRNb2RlbENoYW5nZShzZWxlY3RlZE1vZGVsOiBHbGxtTW9kZWxEZXNjcmlwdGlvbikge1xuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBtb2RlbFxuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCA9IHNlbGVjdGVkTW9kZWwuc2VydmljZUlkO1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQgPSBzZWxlY3RlZE1vZGVsLm1vZGVsSWQ7XG4gIH1cblxuICBnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhdFNlcnZpY2UuZnVuY3Rpb25zPy5maW5kKGZuID0+IGZuLmZ1bmN0aW9uTmFtZSA9PT0gbmFtZSk/LmRlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICB0b2dnbGVGdW5jdGlvbnNTZWxlY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBlbmFibGVkIHByb3BlcnR5IG9mIHRoZSBmdW5jdGlvblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnMuZmluZEluZGV4KGZ1bmMgPT4gZnVuYy5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9uc1tpbmRleF0uZW5hYmxlZCA9IHRoaXMuZnVuY3Rpb25zW2luZGV4XS5lbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RnVuY3Rpb25zTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbHRlcihmdW5jID0+ICEhdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBmdW5jLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBuZXcgY2hhdCBjb25maWcgaW4gdGhlIGNoYXQgc2VydmljZSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogSWYgdGhlIHVzZXIgaGFzIG5ldmVyIG1vZGlmaWVkIHRoZSBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byBzYXZlIHRoZSBoYXNoIG9mIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlcywgYXMgZGVmaW5lZCBieSB0aGUgYWRtaW4sIGluIG9yZGVyIHRvIHByb3Blcmx5IHRyYWNrIGNoYW5nZXMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgY29uc3QgdXNlclNldHRpbmdzQ29uZmlnID0gdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRzW3RoaXMuaW5zdGFuY2VJZF0gfHwge307XG4gICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykgeyAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSB1c2VyIG1ha2VzIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICBjb25zdCBzdGFuZGFyZENoYXRDb25maWcgPSB0aGlzLmFwcFNlcnZpY2UuYXBwPy5kYXRhPy5hc3Npc3RhbnRzPy5bdGhpcy5pbnN0YW5jZUlkXTtcbiAgICAgIGNvbnN0IGhhc2hlcyA9IHsgLi4udXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcywgXCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiOiBVdGlscy5zaGE1MTIoSlNPTi5zdHJpbmdpZnkoc3RhbmRhcmRDaGF0Q29uZmlnLmRlZmF1bHRWYWx1ZXMpKSB9O1xuICAgICAgdGhpcy5jaGF0U2VydmljZS51cGRhdGVDaGF0Q29uZmlnKHRoaXMuY29uZmlnLCBoYXNoZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcodGhpcy5jb25maWcpO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGUuZW1pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBjdXJyZW50IGNoYW5nZXNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLl9jYW5jZWwuZW1pdCh0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25maWckLnZhbHVlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNxLWNoYXQtc2V0dGluZ3NcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVwiPlxuICA8ZGl2IGNsYXNzPVwic2V0dGluZ3MtcGFuZWwgY2FyZC1ib2R5IHNtYWxsXCIgKm5nSWY9XCJjb25maWdcIj5cblxuICAgIDxoNSAqbmdJZj1cImhhc01vZGVsXCI+TW9kZWw8L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnNlcnZpY2VzTW9kZWxzXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiZ2xsbU1vZGVsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TW9kZWw8L2xhYmVsPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJnbGxtTW9kZWxcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYXRNb2RlbENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGVsIG9mIGNoYXRTZXJ2aWNlLm1vZGVsc1wiIFtuZ1ZhbHVlXT1cIm1vZGVsXCI+e3ttb2RlbC5kaXNwbGF5TmFtZX19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmZ1bmN0aW9uc1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImdsbG1GdW5jdGlvbnNcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5GdW5jdGlvbnM8L2xhYmVsPlxuICAgICAgPGRpdiBpZD1cImdsbG1GdW5jdGlvbnNcIiAqbmdGb3I9XCJsZXQgZnVuYyBvZiBmdW5jdGlvbnNcIiBjbGFzcz1cIm11bHRpLW9wdGlvbiBmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiByb2xlPVwic3dpdGNoXCIgW2lkXT1cImZ1bmMubmFtZVwiIFsobmdNb2RlbCldPVwiZnVuYy5lbmFibGVkXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVGdW5jdGlvbnNTZWxlY3Rpb24oZnVuYy5uYW1lKVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCJmdW5jLm5hbWVcIiBbdGl0bGVdPVwiZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbihmdW5jLm5hbWUpXCI+e3sgZnVuYy5uYW1lIH19PC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kZWJ1Z1wiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBpZD1cImRlYnVnXCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5kZWJ1Z1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImRlYnVnXCI+RGVidWc8L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRldGFpbHMgKm5nSWY9XCJoYXNBZHZhbmNlZFBhcmFtZXRlcnNcIj5cbiAgICAgIDxzdW1tYXJ5PkFkdmFuY2VkIHBhcmFtZXRlcnM8L3N1bW1hcnk+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy50ZW1wZXJhdHVyZVwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwidGVtcGVyYXR1cmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5UZW1wZXJhdHVyZToge3tjb25maWcuZGVmYXVsdFZhbHVlcy50ZW1wZXJhdHVyZX19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZm9ybS1yYW5nZSBmb3JtLXJhbmdlLXNtXCIgbWluPVwiMFwiIG1heD1cIjJcIiBzdGVwPVwiMC4xXCIgaWQ9XCJ0ZW1wZXJhdHVyZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy50ZW1wZXJhdHVyZVwiPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy50b3BfcFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwidG9wLXBcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Ub3AgUDoge3tjb25maWcuZGVmYXVsdFZhbHVlcy50b3BfcH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZm9ybS1yYW5nZSBmb3JtLXJhbmdlLXNtXCIgbWluPVwiMFwiIG1heD1cIjFcIiBzdGVwPVwiMC4wNVwiIGlkPVwidG9wLXBcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudG9wX3BcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MubWF4X3Rva2Vuc1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWF4LXRva2Vuc1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPk1heCBnZW5lcmF0ZWQgdG9rZW5zIHBlciBhbnN3ZXI6XG4gICAgICAgICAge3tjb25maWcuZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIxXCIgbWF4PVwiMjA0OFwiIHN0ZXA9XCIxXCIgaWQ9XCJtYXgtdG9rZW5zXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnNcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGV0YWlscz5cblxuICAgIDxocj5cblxuICAgIDxoNSAqbmdJZj1cImhhc1Byb21wdHNcIj5Qcm9tcHRzPC9oNT5cbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaW5pdGlhbFN5c3RlbVByb21wdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN5c3RlbSBwcm9tcHQgKGhpZGRlbik8L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsU3lzdGVtUHJvbXB0XCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5zeXN0ZW1Qcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmRpc3BsYXlVc2VyUHJvbXB0XCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaW5pdGlhbFVzZXJQcm9tcHRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Jbml0aWFsIHVzZXIgcHJvbXB0PC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiaW5pdGlhbFVzZXJQcm9tcHRcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnVzZXJQcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLXBhbmVsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMVwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAqbmdJZj1cImNvbmZpZ1wiIChjbGljayk9XCJzYXZlKClcIj5TYXZlPC9idXR0b24+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFTckQsTUFBTSxPQUFPLHVCQUF1QjtJQVBwQztRQVdvQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN6QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUkzRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsY0FBUyxHQUF1QyxFQUFFLENBQUM7UUFDbkQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVULGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3hELHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9DLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0E2RnhDO0lBM0ZDLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEVBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEVBQ3ZDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUM3QyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQ25DLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBVSxDQUFDLGVBQWUsQ0FBQztZQUNoRSx3SEFBd0g7WUFDeEgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6SCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPO2VBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQjtlQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU87ZUFDZCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVztlQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSztlQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPO2VBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWM7ZUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVM7ZUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7ZUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVc7ZUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7ZUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGlCQUFpQixDQUFDLGFBQW1DO1FBQ25ELGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUM3RCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBWTtRQUNqQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUM3RixDQUFDO0lBRUQsd0JBQXdCLENBQUMsSUFBWTtRQUNuQyw4Q0FBOEM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNyRixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9JLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsRUFBRSx3RkFBd0Y7WUFDL0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5SSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDeEQ7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDOztvSEE3R1UsdUJBQXVCO3dHQUF2Qix1QkFBdUIsd0tDbkJwQyxtcUhBaUVBLHNkRGhEWSxZQUFZLCtQQUFFLFdBQVc7MkZBRXhCLHVCQUF1QjtrQkFQbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FHbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzs4QkFJM0IsVUFBVTtzQkFBbEIsS0FBSztnQkFFWSxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ0UsT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGF0Q29uZmlnLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYmFzZVwiO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1jaGF0LXNldHRpbmdzLXYzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuc2Nzc1wiXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRTZXR0aW5nc1YzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgQE91dHB1dChcInVwZGF0ZVwiKSBfdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xuICBAT3V0cHV0KFwiY2FuY2VsXCIpIF9jYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBjb25maWc6IENoYXRDb25maWc7XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgc2VsZWN0ZWRNb2RlbDogR2xsbU1vZGVsRGVzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIGZ1bmN0aW9uczoge25hbWU6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbn1bXSA9IFtdO1xuICBpc0FkbWluID0gZmFsc2U7XG5cbiAgcHVibGljIGxvZ2luU2VydmljZSA9IGluamVjdChMb2dpblNlcnZpY2UpO1xuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsV2ViU2VydmljZSk7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDb25maWckKSxcbiAgICAgICAgZmlsdGVyKGluaXRDb25maWcgPT4gISFpbml0Q29uZmlnKVxuICAgICAgKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzQWRtaW5pc3RyYXRvcjtcbiAgICAgICAgLy8gSW5pdCBjb25maWcgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNoYXQgY29uZmlnLCBzbyB0aGF0IGl0IHdvbid0IGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyIHVudGlsIGhlIGNsaWNrcyBvbiBzYXZlXG4gICAgICAgIHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25maWckLnZhbHVlKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcbiAgICAgICAgdGhpcy5pbml0RnVuY3Rpb25zTGlzdCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBoYXNQcm9tcHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHQ7XG4gIH1cblxuICBnZXQgaGFzQWR2YW5jZWRQYXJhbWV0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy50ZW1wZXJhdHVyZVxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRvcF9wXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MubWF4X3Rva2VucztcbiAgfVxuXG4gIGdldCBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3Muc2VydmljZXNNb2RlbHNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5mdW5jdGlvbnNcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1Z1xuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zO1xuICB9XG5cbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlID0gdGhpcy5pbnN0YW5jZU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMuaW5zdGFuY2VJZCk7XG4gIH1cblxuICBvbkNoYXRNb2RlbENoYW5nZShzZWxlY3RlZE1vZGVsOiBHbGxtTW9kZWxEZXNjcmlwdGlvbikge1xuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBtb2RlbFxuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCA9IHNlbGVjdGVkTW9kZWwuc2VydmljZUlkO1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQgPSBzZWxlY3RlZE1vZGVsLm1vZGVsSWQ7XG4gIH1cblxuICBnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhdFNlcnZpY2UuZnVuY3Rpb25zPy5maW5kKGZuID0+IGZuLmZ1bmN0aW9uTmFtZSA9PT0gbmFtZSk/LmRlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICB0b2dnbGVGdW5jdGlvbnNTZWxlY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBlbmFibGVkIHByb3BlcnR5IG9mIHRoZSBmdW5jdGlvblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnMuZmluZEluZGV4KGZ1bmMgPT4gZnVuYy5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9uc1tpbmRleF0uZW5hYmxlZCA9IHRoaXMuZnVuY3Rpb25zW2luZGV4XS5lbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RnVuY3Rpb25zTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbHRlcihmdW5jID0+ICEhdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBmdW5jLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBuZXcgY2hhdCBjb25maWcgaW4gdGhlIGNoYXQgc2VydmljZSBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXNcbiAgICogSWYgdGhlIHVzZXIgaGFzIG5ldmVyIG1vZGlmaWVkIHRoZSBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byBzYXZlIHRoZSBoYXNoIG9mIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHZhbHVlcywgYXMgZGVmaW5lZCBieSB0aGUgYWRtaW4sIGluIG9yZGVyIHRvIHByb3Blcmx5IHRyYWNrIGNoYW5nZXMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgY29uc3QgdXNlclNldHRpbmdzQ29uZmlnID0gdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRzW3RoaXMuaW5zdGFuY2VJZF0gfHwge307XG4gICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykgeyAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSB1c2VyIG1ha2VzIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICBjb25zdCBzdGFuZGFyZENoYXRDb25maWcgPSB0aGlzLmFwcFNlcnZpY2UuYXBwPy5kYXRhPy5hc3Npc3RhbnRzPy5bdGhpcy5pbnN0YW5jZUlkXTtcbiAgICAgIGNvbnN0IGhhc2hlcyA9IHsgLi4udXNlclNldHRpbmdzQ29uZmlnLmhhc2hlcywgXCJhcHBsaWVkLWRlZmF1bHRWYWx1ZXMtaGFzaFwiOiBVdGlscy5zaGE1MTIoSlNPTi5zdHJpbmdpZnkoc3RhbmRhcmRDaGF0Q29uZmlnLmRlZmF1bHRWYWx1ZXMpKSB9O1xuICAgICAgdGhpcy5jaGF0U2VydmljZS51cGRhdGVDaGF0Q29uZmlnKHRoaXMuY29uZmlnLCBoYXNoZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcodGhpcy5jb25maWcpO1xuICAgIH1cbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdlbmVyYXRlQXVkaXRFdmVudChcImNvbmZpZ3VyYXRpb24uZWRpdFwiLCB7ICdjb25maWd1cmF0aW9uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpIH0pO1xuICAgIHRoaXMuX3VwZGF0ZS5lbWl0KHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdGhlIGN1cnJlbnQgY2hhbmdlc1xuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX2NhbmNlbC5lbWl0KHRoaXMuY2hhdFNlcnZpY2UuY2hhdENvbmZpZyQudmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3EtY2hhdC1zZXR0aW5nc1wiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5XCI+XG4gIDxkaXYgY2xhc3M9XCJzZXR0aW5ncy1wYW5lbCBjYXJkLWJvZHkgc21hbGxcIiAqbmdJZj1cImNvbmZpZ1wiPlxuXG4gICAgPGg1ICpuZ0lmPVwiaGFzTW9kZWxcIj5Nb2RlbDwvaDU+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3Muc2VydmljZXNNb2RlbHNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJnbGxtTW9kZWxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Nb2RlbDwvbGFiZWw+XG4gICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cImdsbG1Nb2RlbFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhdE1vZGVsQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9kZWwgb2YgY2hhdFNlcnZpY2UubW9kZWxzXCIgW25nVmFsdWVdPVwibW9kZWxcIj57e21vZGVsLmRpc3BsYXlOYW1lfX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZnVuY3Rpb25zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiZ2xsbUZ1bmN0aW9uc1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkZ1bmN0aW9uczwvbGFiZWw+XG4gICAgICA8ZGl2IGlkPVwiZ2xsbUZ1bmN0aW9uc1wiICpuZ0Zvcj1cImxldCBmdW5jIG9mIGZ1bmN0aW9uc1wiIGNsYXNzPVwibXVsdGktb3B0aW9uIGZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBbaWRdPVwiZnVuYy5uYW1lXCIgWyhuZ01vZGVsKV09XCJmdW5jLmVuYWJsZWRcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZUZ1bmN0aW9uc1NlbGVjdGlvbihmdW5jLm5hbWUpXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImZ1bmMubmFtZVwiIFt0aXRsZV09XCJnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGZ1bmMubmFtZSlcIj57eyBmdW5jLm5hbWUgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmRlYnVnXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiIGlkPVwiZGVidWdcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLmRlYnVnXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZGVidWdcIj5EZWJ1ZzwvbGFiZWw+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGV0YWlscyAqbmdJZj1cImhhc0FkdmFuY2VkUGFyYW1ldGVyc1wiPlxuICAgICAgPHN1bW1hcnk+QWR2YW5jZWQgcGFyYW1ldGVyczwvc3VtbWFyeT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0ZW1wZXJhdHVyZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRlbXBlcmF0dXJlOiB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIwXCIgbWF4PVwiMlwiIHN0ZXA9XCIwLjFcIiBpZD1cInRlbXBlcmF0dXJlXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnRvcF9wXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0b3AtcFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRvcCBQOiB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLnRvcF9wfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmb3JtLXJhbmdlIGZvcm0tcmFuZ2Utc21cIiBtaW49XCIwXCIgbWF4PVwiMVwiIHN0ZXA9XCIwLjA1XCIgaWQ9XCJ0b3AtcFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy50b3BfcFwiPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJtYXgtdG9rZW5zXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TWF4IGdlbmVyYXRlZCB0b2tlbnMgcGVyIGFuc3dlcjpcbiAgICAgICAgICB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnN9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjFcIiBtYXg9XCIyMDQ4XCIgc3RlcD1cIjFcIiBpZD1cIm1heC10b2tlbnNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMubWF4X3Rva2Vuc1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kZXRhaWxzPlxuXG4gICAgPGhyPlxuXG4gICAgPGg1ICpuZ0lmPVwiaGFzUHJvbXB0c1wiPlByb21wdHM8L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmRpc3BsYXlTeXN0ZW1Qcm9tcHRcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJpbml0aWFsU3lzdGVtUHJvbXB0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3lzdGVtIHByb21wdCAoaGlkZGVuKTwvbGFiZWw+XG4gICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImluaXRpYWxTeXN0ZW1Qcm9tcHRcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnN5c3RlbVByb21wdFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHRcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJpbml0aWFsVXNlclByb21wdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkluaXRpYWwgdXNlciBwcm9tcHQ8L2xhYmVsPlxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsVXNlclByb21wdFwiIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudXNlclByb21wdFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtcGFuZWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtZS0xXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiICpuZ0lmPVwiY29uZmlnXCIgKGNsaWNrKT1cInNhdmUoKVwiPlNhdmU8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
|