valtech-components 4.0.1036 → 4.0.1038

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.
@@ -0,0 +1,176 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, computed, input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class AiMessageRendererComponent {
5
+ constructor() {
6
+ this.text = input('');
7
+ this.parts = computed(() => parseAiMessage(this.text()));
8
+ }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AiMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AiMessageRendererComponent, isStandalone: true, selector: "val-ai-message-renderer", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
11
+ <div class="ai-message">
12
+ @for (part of parts(); track part.id) {
13
+ @if (part.kind === 'code') {
14
+ <pre class="code"><code>{{ part.code }}</code></pre>
15
+ } @else {
16
+ @switch (part.tag) {
17
+ @case ('h3') {
18
+ <h3 class="heading" [innerHTML]="part.html"></h3>
19
+ }
20
+ @case ('ul') {
21
+ <ul class="list">
22
+ @for (item of part.items ?? []; track item) {
23
+ <li [innerHTML]="item"></li>
24
+ }
25
+ </ul>
26
+ }
27
+ @case ('ol') {
28
+ <ol class="list">
29
+ @for (item of part.items ?? []; track item) {
30
+ <li [innerHTML]="item"></li>
31
+ }
32
+ </ol>
33
+ }
34
+ @default {
35
+ <p class="text" [innerHTML]="part.html"></p>
36
+ }
37
+ }
38
+ }
39
+ }
40
+ </div>
41
+ `, isInline: true, styles: [":host{display:block}.ai-message{display:flex;flex-direction:column;gap:.65rem}.text,.heading,.list{margin:0;overflow-wrap:anywhere}.heading{font-size:1rem;line-height:1.3;font-weight:750}.text{white-space:pre-wrap}.list{display:flex;flex-direction:column;gap:.28rem;padding-inline-start:1.15rem}.code{max-width:100%;margin:0;padding:.75rem;overflow-x:auto;border-radius:8px;background:var(--val-ai-message-code-background, rgba(15, 23, 42, .06));color:var(--val-ai-message-code-color, currentColor);font-size:.82rem;line-height:1.45}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text ::ng-deep code,.heading ::ng-deep code,.list ::ng-deep code{padding:.08rem .28rem;border-radius:5px;background:var(--val-ai-message-inline-code-background, rgba(15, 23, 42, .08));font-size:.9em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AiMessageRendererComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'val-ai-message-renderer', standalone: true, imports: [CommonModule], template: `
46
+ <div class="ai-message">
47
+ @for (part of parts(); track part.id) {
48
+ @if (part.kind === 'code') {
49
+ <pre class="code"><code>{{ part.code }}</code></pre>
50
+ } @else {
51
+ @switch (part.tag) {
52
+ @case ('h3') {
53
+ <h3 class="heading" [innerHTML]="part.html"></h3>
54
+ }
55
+ @case ('ul') {
56
+ <ul class="list">
57
+ @for (item of part.items ?? []; track item) {
58
+ <li [innerHTML]="item"></li>
59
+ }
60
+ </ul>
61
+ }
62
+ @case ('ol') {
63
+ <ol class="list">
64
+ @for (item of part.items ?? []; track item) {
65
+ <li [innerHTML]="item"></li>
66
+ }
67
+ </ol>
68
+ }
69
+ @default {
70
+ <p class="text" [innerHTML]="part.html"></p>
71
+ }
72
+ }
73
+ }
74
+ }
75
+ </div>
76
+ `, styles: [":host{display:block}.ai-message{display:flex;flex-direction:column;gap:.65rem}.text,.heading,.list{margin:0;overflow-wrap:anywhere}.heading{font-size:1rem;line-height:1.3;font-weight:750}.text{white-space:pre-wrap}.list{display:flex;flex-direction:column;gap:.28rem;padding-inline-start:1.15rem}.code{max-width:100%;margin:0;padding:.75rem;overflow-x:auto;border-radius:8px;background:var(--val-ai-message-code-background, rgba(15, 23, 42, .06));color:var(--val-ai-message-code-color, currentColor);font-size:.82rem;line-height:1.45}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text ::ng-deep code,.heading ::ng-deep code,.list ::ng-deep code{padding:.08rem .28rem;border-radius:5px;background:var(--val-ai-message-inline-code-background, rgba(15, 23, 42, .08));font-size:.9em}\n"] }]
77
+ }] });
78
+ function parseAiMessage(text) {
79
+ const parts = [];
80
+ const fence = /```([^\n`]*)\n?([\s\S]*?)```/g;
81
+ let lastIndex = 0;
82
+ let index = 0;
83
+ let match;
84
+ while ((match = fence.exec(text)) !== null) {
85
+ const before = text.slice(lastIndex, match.index).trim();
86
+ if (before) {
87
+ parts.push(...parseMarkdownBlocks(before, index));
88
+ index = parts.length;
89
+ }
90
+ parts.push({
91
+ kind: 'code',
92
+ id: `code-${index++}`,
93
+ language: match[1]?.trim() ?? '',
94
+ code: match[2]?.trimEnd() ?? '',
95
+ });
96
+ lastIndex = fence.lastIndex;
97
+ }
98
+ const rest = text.slice(lastIndex).trim();
99
+ if (rest) {
100
+ parts.push(...parseMarkdownBlocks(rest, index));
101
+ }
102
+ return parts.length > 0 ? parts : [{ kind: 'block', id: 'text-0', tag: 'p', html: renderInline(text) }];
103
+ }
104
+ function parseMarkdownBlocks(text, offset) {
105
+ const blocks = [];
106
+ const lines = text.split('\n');
107
+ let paragraph = [];
108
+ let listItems = [];
109
+ let orderedItems = [];
110
+ let index = offset;
111
+ const flushParagraph = () => {
112
+ if (paragraph.length === 0)
113
+ return;
114
+ blocks.push({ kind: 'block', id: `text-${index++}`, tag: 'p', html: renderInline(paragraph.join('\n')) });
115
+ paragraph = [];
116
+ };
117
+ const flushLists = () => {
118
+ if (listItems.length > 0) {
119
+ blocks.push({ kind: 'block', id: `list-${index++}`, tag: 'ul', items: listItems });
120
+ listItems = [];
121
+ }
122
+ if (orderedItems.length > 0) {
123
+ blocks.push({ kind: 'block', id: `list-${index++}`, tag: 'ol', items: orderedItems });
124
+ orderedItems = [];
125
+ }
126
+ };
127
+ for (const raw of lines) {
128
+ const line = raw.trim();
129
+ if (!line) {
130
+ flushParagraph();
131
+ flushLists();
132
+ continue;
133
+ }
134
+ const heading = line.match(/^#{1,4}\s+(.+)$/);
135
+ if (heading) {
136
+ flushParagraph();
137
+ flushLists();
138
+ blocks.push({ kind: 'block', id: `heading-${index++}`, tag: 'h3', html: renderInline(heading[1]) });
139
+ continue;
140
+ }
141
+ const bullet = line.match(/^[-*]\s+(.+)$/);
142
+ if (bullet) {
143
+ flushParagraph();
144
+ orderedItems = [];
145
+ listItems.push(renderInline(bullet[1]));
146
+ continue;
147
+ }
148
+ const ordered = line.match(/^\d+\.\s+(.+)$/);
149
+ if (ordered) {
150
+ flushParagraph();
151
+ listItems = [];
152
+ orderedItems.push(renderInline(ordered[1]));
153
+ continue;
154
+ }
155
+ flushLists();
156
+ paragraph.push(raw);
157
+ }
158
+ flushParagraph();
159
+ flushLists();
160
+ return blocks;
161
+ }
162
+ function renderInline(text) {
163
+ return escapeHtml(text)
164
+ .replace(/`([^`]+)`/g, '<code>$1</code>')
165
+ .replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
166
+ .replace(/\*([^*]+)\*/g, '<em>$1</em>');
167
+ }
168
+ function escapeHtml(text) {
169
+ return text
170
+ .replace(/&/g, '&amp;')
171
+ .replace(/</g, '&lt;')
172
+ .replace(/>/g, '&gt;')
173
+ .replace(/"/g, '&quot;')
174
+ .replace(/'/g, '&#39;');
175
+ }
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktbWVzc2FnZS1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2FpLW1lc3NhZ2UtcmVuZGVyZXIvYWktbWVzc2FnZS1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFnSDNELE1BQU0sT0FBTywwQkFBMEI7SUExR3ZDO1FBMkdXLFNBQUksR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFFZixVQUFLLEdBQUcsUUFBUSxDQUFrQixHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN6RjsrR0FKWSwwQkFBMEI7bUdBQTFCLDBCQUEwQixvTkF0RzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULHE0QkFoQ1MsWUFBWTs7NEZBdUdYLDBCQUEwQjtrQkExR3RDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUOztBQTZFSCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE1BQU0sS0FBSyxHQUFvQixFQUFFLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUM7SUFDOUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksS0FBNkIsQ0FBQztJQUVsQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFB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N0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLFNBQVM7UUFDWCxDQUFDO1FBRUQsVUFBVSxFQUFFLENBQUM7UUFDYixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjLEVBQUUsQ0FBQztJQUNqQixVQUFVLEVBQUUsQ0FBQztJQUNiLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ3hDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztTQUNsRCxPQUFPLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFZO0lBQzlCLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG50eXBlIEFpTWVzc2FnZVBhcnQgPVxuICB8IHsga2luZDogJ2Jsb2NrJzsgaWQ6IHN0cmluZzsgdGFnOiAncCcgfCAnaDMnIHwgJ3VsJyB8ICdvbCc7IGh0bWw/OiBzdHJpbmc7IGl0ZW1zPzogc3RyaW5nW10gfVxuICB8IHsga2luZDogJ2NvZGUnOyBpZDogc3RyaW5nOyBjb2RlOiBzdHJpbmc7IGxhbmd1YWdlOiBzdHJpbmcgfTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWFpLW1lc3NhZ2UtcmVuZGVyZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYWktbWVzc2FnZVwiPlxuICAgICAgQGZvciAocGFydCBvZiBwYXJ0cygpOyB0cmFjayBwYXJ0LmlkKSB7XG4gICAgICAgIEBpZiAocGFydC5raW5kID09PSAnY29kZScpIHtcbiAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZVwiPjxjb2RlPnt7IHBhcnQuY29kZSB9fTwvY29kZT48L3ByZT5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQHN3aXRjaCAocGFydC50YWcpIHtcbiAgICAgICAgICAgIEBjYXNlICgnaDMnKSB7XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImhlYWRpbmdcIiBbaW5uZXJIVE1MXT1cInBhcnQuaHRtbFwiPjwvaDM+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3VsJykge1xuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBwYXJ0Lml0ZW1zID8/IFtdOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICA8bGkgW2lubmVySFRNTF09XCJpdGVtXCI+PC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ29sJykge1xuICAgICAgICAgICAgICA8b2wgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBwYXJ0Lml0ZW1zID8/IFtdOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICA8bGkgW2lubmVySFRNTF09XCJpdGVtXCI+PC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dFwiIFtpbm5lckhUTUxdPVwicGFydC5odG1sXCI+PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuXG4gICAgICAuYWktbWVzc2FnZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC42NXJlbTtcbiAgICAgIH1cblxuICAgICAgLnRleHQsXG4gICAgICAuaGVhZGluZyxcbiAgICAgIC5saXN0IHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgICAgIH1cblxuICAgICAgLmhlYWRpbmcge1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3NTA7XG4gICAgICB9XG5cbiAgICAgIC50ZXh0IHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgICAgfVxuXG4gICAgICAubGlzdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC4yOHJlbTtcbiAgICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDEuMTVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jb2RlIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gICAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdmFsLWFpLW1lc3NhZ2UtY29kZS1iYWNrZ3JvdW5kLCByZ2JhKDE1LCAyMywgNDIsIDAuMDYpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLXZhbC1haS1tZXNzYWdlLWNvZGUtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MnJlbTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICB9XG5cbiAgICAgIGNvZGUge1xuICAgICAgICBmb250LWZhbWlseTpcbiAgICAgICAgICB1aS1tb25vc3BhY2UsXG4gICAgICAgICAgU0ZNb25vLVJlZ3VsYXIsXG4gICAgICAgICAgTWVubG8sXG4gICAgICAgICAgTW9uYWNvLFxuICAgICAgICAgIENvbnNvbGFzLFxuICAgICAgICAgICdMaWJlcmF0aW9uIE1vbm8nLFxuICAgICAgICAgIG1vbm9zcGFjZTtcbiAgICAgIH1cblxuICAgICAgLnRleHQgOjpuZy1kZWVwIGNvZGUsXG4gICAgICAuaGVhZGluZyA6Om5nLWRlZXAgY29kZSxcbiAgICAgIC5saXN0IDo6bmctZGVlcCBjb2RlIHtcbiAgICAgICAgcGFkZGluZzogMC4wOHJlbSAwLjI4cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXZhbC1haS1tZXNzYWdlLWlubGluZS1jb2RlLWJhY2tncm91bmQsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFpTWVzc2FnZVJlbmRlcmVyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdGV4dCA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJ0cyA9IGNvbXB1dGVkPEFpTWVzc2FnZVBhcnRbXT4oKCkgPT4gcGFyc2VBaU1lc3NhZ2UodGhpcy50ZXh0KCkpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBaU1lc3NhZ2UodGV4dDogc3RyaW5nKTogQWlNZXNzYWdlUGFydFtdIHtcbiAgY29uc3QgcGFydHM6IEFpTWVzc2FnZVBhcnRbXSA9IFtdO1xuICBjb25zdCBmZW5jZSA9IC9gYGAoW15cXG5gXSopXFxuPyhbXFxzXFxTXSo/KWBgYC9nO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBmZW5jZS5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkudHJpbSgpO1xuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIHBhcnRzLnB1c2goLi4ucGFyc2VNYXJrZG93bkJsb2NrcyhiZWZvcmUsIGluZGV4KSk7XG4gICAgICBpbmRleCA9IHBhcnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKHtcbiAgICAgIGtpbmQ6ICdjb2RlJyxcbiAgICAgIGlkOiBgY29kZS0ke2luZGV4Kyt9YCxcbiAgICAgIGxhbmd1YWdlOiBtYXRjaFsxXT8udHJpbSgpID8/ICcnLFxuICAgICAgY29kZTogbWF0Y2hbMl0/LnRyaW1FbmQoKSA/PyAnJyxcbiAgICB9KTtcbiAgICBsYXN0SW5kZXggPSBmZW5jZS5sYXN0SW5kZXg7XG4gIH1cblxuICBjb25zdCByZXN0ID0gdGV4dC5zbGljZShsYXN0SW5kZXgpLnRyaW0oKTtcbiAgaWYgKHJlc3QpIHtcbiAgICBwYXJ0cy5wdXNoKC4uLnBhcnNlTWFya2Rvd25CbG9ja3MocmVzdCwgaW5kZXgpKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHMgOiBbeyBraW5kOiAnYmxvY2snLCBpZDogJ3RleHQtMCcsIHRhZzogJ3AnLCBodG1sOiByZW5kZXJJbmxpbmUodGV4dCkgfV07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFya2Rvd25CbG9ja3ModGV4dDogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IEFpTWVzc2FnZVBhcnRbXSB7XG4gIGNvbnN0IGJsb2NrczogQWlNZXNzYWdlUGFydFtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIGxldCBwYXJhZ3JhcGg6IHN0cmluZ1tdID0gW107XG4gIGxldCBsaXN0SXRlbXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcmRlcmVkSXRlbXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpbmRleCA9IG9mZnNldDtcblxuICBjb25zdCBmbHVzaFBhcmFncmFwaCA9ICgpID0+IHtcbiAgICBpZiAocGFyYWdyYXBoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGJsb2Nrcy5wdXNoKHsga2luZDogJ2Jsb2NrJywgaWQ6IGB0ZXh0LSR7aW5kZXgrK31gLCB0YWc6ICdwJywgaHRtbDogcmVuZGVySW5saW5lKHBhcmFncmFwaC5qb2luKCdcXG4nKSkgfSk7XG4gICAgcGFyYWdyYXBoID0gW107XG4gIH07XG4gIGNvbnN0IGZsdXNoTGlzdHMgPSAoKSA9PiB7XG4gICAgaWYgKGxpc3RJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBibG9ja3MucHVzaCh7IGtpbmQ6ICdibG9jaycsIGlkOiBgbGlzdC0ke2luZGV4Kyt9YCwgdGFnOiAndWwnLCBpdGVtczogbGlzdEl0ZW1zIH0pO1xuICAgICAgbGlzdEl0ZW1zID0gW107XG4gICAgfVxuICAgIGlmIChvcmRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgYmxvY2tzLnB1c2goeyBraW5kOiAnYmxvY2snLCBpZDogYGxpc3QtJHtpbmRleCsrfWAsIHRhZzogJ29sJywgaXRlbXM6IG9yZGVyZWRJdGVtcyB9KTtcbiAgICAgIG9yZGVyZWRJdGVtcyA9IFtdO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBsaW5lcykge1xuICAgIGNvbnN0IGxpbmUgPSByYXcudHJpbSgpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgZmx1c2hQYXJhZ3JhcGgoKTtcbiAgICAgIGZsdXNoTGlzdHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRpbmcgPSBsaW5lLm1hdGNoKC9eI3sxLDR9XFxzKyguKykkLyk7XG4gICAgaWYgKGhlYWRpbmcpIHtcbiAgICAgIGZsdXNoUGFyYWdyYXBoKCk7XG4gICAgICBmbHVzaExpc3RzKCk7XG4gICAgICBibG9ja3MucHVzaCh7IGtpbmQ6ICdibG9jaycsIGlkOiBgaGVhZGluZy0ke2luZGV4Kyt9YCwgdGFnOiAnaDMnLCBodG1sOiByZW5kZXJJbmxpbmUoaGVhZGluZ1sxXSkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBidWxsZXQgPSBsaW5lLm1hdGNoKC9eWy0qXVxccysoLispJC8pO1xuICAgIGlmIChidWxsZXQpIHtcbiAgICAgIGZsdXNoUGFyYWdyYXBoKCk7XG4gICAgICBvcmRlcmVkSXRlbXMgPSBbXTtcbiAgICAgIGxpc3RJdGVtcy5wdXNoKHJlbmRlcklubGluZShidWxsZXRbMV0pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyZWQgPSBsaW5lLm1hdGNoKC9eXFxkK1xcLlxccysoLispJC8pO1xuICAgIGlmIChvcmRlcmVkKSB7XG4gICAgICBmbHVzaFBhcmFncmFwaCgpO1xuICAgICAgbGlzdEl0ZW1zID0gW107XG4gICAgICBvcmRlcmVkSXRlbXMucHVzaChyZW5kZXJJbmxpbmUob3JkZXJlZFsxXSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmx1c2hMaXN0cygpO1xuICAgIHBhcmFncmFwaC5wdXNoKHJhdyk7XG4gIH1cblxuICBmbHVzaFBhcmFncmFwaCgpO1xuICBmbHVzaExpc3RzKCk7XG4gIHJldHVybiBibG9ja3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcklubGluZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcKlxcKihbXipdKylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooW14qXSspXFwqL2csICc8ZW0+JDE8L2VtPicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbn1cbiJdfQ==