@dollhousemcp/mcp-server 2.0.5 → 2.0.6
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/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts +2 -0
- package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/IntrospectionResolver.js +4 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +13 -7
- package/dist/handlers/mcp-aql/OperationRouter.d.ts +9 -0
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +53 -2
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +42 -3
- package/dist/index.js +28 -2
- package/dist/server/tools/MCPAQLTools.js +5 -1
- package/dist/web/public/app.js +24 -6
- package/dist/web/server.d.ts +3 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +40 -16
- package/package.json +1 -1
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
package/dist/web/public/app.js
CHANGED
|
@@ -1941,14 +1941,32 @@ function safeParseYaml(content) {
|
|
|
1941
1941
|
});
|
|
1942
1942
|
};
|
|
1943
1943
|
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1944
|
+
// Tab selection priority: URL hash > localStorage > first-visit setup > portfolio default
|
|
1945
|
+
function applyHashTab() {
|
|
1946
|
+
const hashTab = globalThis.location.hash.replace('#', '');
|
|
1947
|
+
if (hashTab && document.getElementById('tab-' + hashTab)) {
|
|
1948
|
+
switchToTab(hashTab);
|
|
1949
|
+
lazyInitTab(hashTab, tabInits);
|
|
1950
|
+
localStorage.setItem(TAB_KEY, hashTab);
|
|
1951
|
+
history.replaceState(null, '', globalThis.location.pathname);
|
|
1952
|
+
return true;
|
|
1953
|
+
}
|
|
1954
|
+
return false;
|
|
1950
1955
|
}
|
|
1951
1956
|
|
|
1957
|
+
if (!applyHashTab()) {
|
|
1958
|
+
const savedTab = localStorage.getItem(TAB_KEY);
|
|
1959
|
+
if (savedTab) {
|
|
1960
|
+
switchToTab(savedTab);
|
|
1961
|
+
} else if (!localStorage.getItem(SETUP_SEEN_KEY)) {
|
|
1962
|
+
localStorage.setItem(SETUP_SEEN_KEY, '1');
|
|
1963
|
+
switchToTab('setup');
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
// Handle hash changes for deep-linking (e.g., open_logs operation)
|
|
1968
|
+
globalThis.addEventListener('hashchange', () => applyHashTab());
|
|
1969
|
+
|
|
1952
1970
|
if (consoleTabs) {
|
|
1953
1971
|
consoleTabs.addEventListener('click', (e) => {
|
|
1954
1972
|
const btn = e.target.closest('.console-tab');
|
package/dist/web/server.d.ts
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
import type { MCPAQLHandler } from '../handlers/mcp-aql/MCPAQLHandler.js';
|
|
14
14
|
import type { MemoryLogSink } from '../logging/sinks/MemoryLogSink.js';
|
|
15
15
|
import type { MemoryMetricsSink } from '../metrics/sinks/MemoryMetricsSink.js';
|
|
16
|
+
/** Check whether the web server has been started in this process. */
|
|
17
|
+
export declare function isWebServerRunning(): boolean;
|
|
16
18
|
/**
|
|
17
19
|
* Options for starting the web server.
|
|
18
20
|
*/
|
|
@@ -87,5 +89,5 @@ export declare function startWebServer(options: WebServerOptions): Promise<WebSe
|
|
|
87
89
|
* @param port - Port to bind to (default: 3939)
|
|
88
90
|
* @returns Result with URL, server status, and browser open status
|
|
89
91
|
*/
|
|
90
|
-
export declare function openPortfolioBrowser(portfolioDir: string, port?: number, mcpAqlHandler?: MCPAQLHandler): Promise<BrowserOpenResult>;
|
|
92
|
+
export declare function openPortfolioBrowser(portfolioDir: string, port?: number, mcpAqlHandler?: MCPAQLHandler, tab?: string): Promise<BrowserOpenResult>;
|
|
91
93
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/web/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAW/E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kFAAkF;IAClF,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,SAAS,EAAE,MAAM,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,GAAG,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9E,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,cAAc,KAAK,IAAI,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAW/E,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kFAAkF;IAClF,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,SAAS,EAAE,MAAM,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,GAAG,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9E,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,cAAc,KAAK,IAAI,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsKxF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuBvJ"}
|
package/dist/web/server.js
CHANGED
|
@@ -29,6 +29,10 @@ const ALLOWED_PAGE_EXTENSIONS = new Set(['.html', '.htm']);
|
|
|
29
29
|
/** Track whether the web server is already running in-process. */
|
|
30
30
|
let serverRunning = false;
|
|
31
31
|
let serverPort = DEFAULT_PORT;
|
|
32
|
+
/** Check whether the web server has been started in this process. */
|
|
33
|
+
export function isWebServerRunning() {
|
|
34
|
+
return serverRunning;
|
|
35
|
+
}
|
|
32
36
|
/**
|
|
33
37
|
* Open a URL in the system's default browser.
|
|
34
38
|
*
|
|
@@ -192,17 +196,38 @@ export async function startWebServer(options) {
|
|
|
192
196
|
}
|
|
193
197
|
res.sendFile(join(publicDir, 'index.html'));
|
|
194
198
|
});
|
|
195
|
-
// Bind to localhost only
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
199
|
+
// Bind to localhost only — handle port conflicts gracefully
|
|
200
|
+
// NOTE: console.log is intentional here (not logger). In --web standalone mode,
|
|
201
|
+
// the user sees terminal output directly. logger.info writes to the structured
|
|
202
|
+
// log system (MemoryLogSink → SSE → web console). Both are needed: console.log
|
|
203
|
+
// for the human at the terminal, logger for the log viewer tab.
|
|
204
|
+
await new Promise((resolve) => {
|
|
205
|
+
const httpServer = app.listen(port, '127.0.0.1', () => {
|
|
206
|
+
serverRunning = true;
|
|
207
|
+
serverPort = port;
|
|
208
|
+
const url = `http://${CONSOLE_HOST}:${port}`;
|
|
209
|
+
const fallbackUrl = `http://127.0.0.1:${port}`;
|
|
210
|
+
logger.info(`[WebUI] Management console running at ${url}`);
|
|
211
|
+
console.log(`\n DollhouseMCP Management Console\n ${url}\n ${fallbackUrl} (fallback)\n`);
|
|
212
|
+
if (options.openBrowser) {
|
|
213
|
+
openInBrowser(url);
|
|
214
|
+
}
|
|
215
|
+
resolve();
|
|
216
|
+
});
|
|
217
|
+
httpServer.on('error', (err) => {
|
|
218
|
+
if (err.code === 'EADDRINUSE') {
|
|
219
|
+
const url = `http://${CONSOLE_HOST}:${port}`;
|
|
220
|
+
logger.info(`[WebUI] Port ${port} already in use — opening existing console`);
|
|
221
|
+
console.log(`\n DollhouseMCP Management Console (existing instance)\n ${url}\n`);
|
|
222
|
+
if (options.openBrowser) {
|
|
223
|
+
openInBrowser(url);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
logger.error(`[WebUI] Failed to bind port ${port}: ${err.message}`);
|
|
228
|
+
}
|
|
229
|
+
resolve(); // Web console is optional — don't block startup
|
|
230
|
+
});
|
|
206
231
|
});
|
|
207
232
|
return result;
|
|
208
233
|
}
|
|
@@ -219,9 +244,10 @@ export async function startWebServer(options) {
|
|
|
219
244
|
* @param port - Port to bind to (default: 3939)
|
|
220
245
|
* @returns Result with URL, server status, and browser open status
|
|
221
246
|
*/
|
|
222
|
-
export async function openPortfolioBrowser(portfolioDir, port, mcpAqlHandler) {
|
|
247
|
+
export async function openPortfolioBrowser(portfolioDir, port, mcpAqlHandler, tab) {
|
|
223
248
|
const targetPort = port || DEFAULT_PORT;
|
|
224
|
-
const
|
|
249
|
+
const baseUrl = `http://${CONSOLE_HOST}:${targetPort}`;
|
|
250
|
+
const url = tab ? `${baseUrl}/#${tab}` : baseUrl;
|
|
225
251
|
const alreadyRunning = serverRunning;
|
|
226
252
|
if (!serverRunning) {
|
|
227
253
|
await startWebServer({
|
|
@@ -230,8 +256,6 @@ export async function openPortfolioBrowser(portfolioDir, port, mcpAqlHandler) {
|
|
|
230
256
|
openBrowser: false, // We'll open manually below to capture the result
|
|
231
257
|
mcpAqlHandler,
|
|
232
258
|
});
|
|
233
|
-
// Wait briefly for the server to bind
|
|
234
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
235
259
|
}
|
|
236
260
|
const browserResult = await openInBrowser(url);
|
|
237
261
|
return {
|
|
@@ -241,4 +265,4 @@ export async function openPortfolioBrowser(portfolioDir, port, mcpAqlHandler) {
|
|
|
241
265
|
...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
|
|
242
266
|
};
|
|
243
267
|
}
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUE0QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRTNELGtF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QUN4QyxNQUFNLEdBQUcsR0FBRyxVQUFVLFlBQVksSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNuRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7SUFFckMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sY0FBYyxDQUFDO1lBQ25CLFlBQVk7WUFDWixJQUFJLEVBQUUsVUFBVTtZQUNoQixXQUFXLEVBQUUsS0FBSyxFQUFFLGtEQUFrRDtZQUN0RSxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsc0NBQXNDO1FBQ3RDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHO1FBQ0gsY0FBYztRQUNkLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztRQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsOENBQThDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hJLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEb2xsaG91c2VNQ1AgV2ViIFVJIFNlcnZlclxuICpcbiAqIExpZ2h0d2VpZ2h0IEV4cHJlc3Mgc2VydmVyIGZvciBicm93c2luZyBwb3J0Zm9saW8gZWxlbWVudHMgaW4gYSBicm93c2VyLlxuICogQm91bmQgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFJlYWQtb25seSBmb3IgVjEuXG4gKlxuICogQ2FuIGJlIHN0YXJ0ZWQgc3RhbmRhbG9uZSAoYC0td2ViYCBmbGFnKSBvciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlclxuICogcHJvY2VzcyB2aWEgYG9wZW5Qb3J0Zm9saW9Ccm93c2VyKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83MDRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83NzRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlQXBpUm91dGVzLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nUm91dGVzLCB0eXBlIExvZ1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL2xvZ1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVNZXRyaWNzUm91dGVzLCB0eXBlIE1ldHJpY3NSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9tZXRyaWNzUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhlYWx0aFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL2hlYWx0aFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXR1cFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3NldHVwUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgREVGQVVMVF9QT1JUID0gMzkzOTtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG5cbi8qKiBUcmFjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBpbi1wcm9jZXNzLiAqL1xubGV0IHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbmxldCBzZXJ2ZXJQb3J0ID0gREVGQVVMVF9QT1JUO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlck9wdGlvbnMge1xuICAvKiogUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0OiAzOTM5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbykgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBPcGVuIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnRpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuQnJvd3Nlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNQ1BBUUxIYW5kbGVyIGZvciByb3V0aW5nIHRocm91Z2ggdGhlIE1DUC1BUUwgcGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIEFQSSByb3V0ZXMgdXNlIHRoZSBnYXRld2F5ICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKS5cbiAgICogV2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgKiBJc3N1ZSAjNzk2OiBXZWIgTUNQLUFRTCBHYXRld2F5LlxuICAgKi9cbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIC8qKiBNZW1vcnlMb2dTaW5rIGZvciBsb2cgcm91dGVzIChvcHRpb25hbCDigJQgbG9ncyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1lbW9yeU1ldHJpY3NTaW5rIGZvciBtZXRyaWNzIHJvdXRlcyAob3B0aW9uYWwg4oCUIG1ldHJpY3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIEFkZGl0aW9uYWwgcm91dGVycyB0byBtb3VudCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjayAoZS5nLiwgaW5nZXN0IHJvdXRlcykgKi9cbiAgYWRkaXRpb25hbFJvdXRlcnM/OiBpbXBvcnQoJ2V4cHJlc3MnKS5Sb3V0ZXJbXTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgLy8gQWNjZXB0IGxvY2FsaG9zdCwgMTI3LjAuMC4xLCBhbmQgKi5sb2NhbGhvc3Qgc3ViZG9tYWlucyAoUkZDIDY3NjEpXG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8obG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuMXxbXFx3LV0rXFwubG9jYWxob3N0KVs6L10vLnRlc3QodXJsU3RyKSkge1xuICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VSTCBtdXN0IGJlIGEgbG9jYWxob3N0IEhUVFAgVVJMJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXhlY0ZpbGUoY21kLCBbdXJsU3RyXSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgYXV0by1vcGVuIGJyb3dzZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlci5cbiAqXG4gKiBCaW5kcyB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gU2VydmVzIHRoZSBwb3J0Zm9saW8gYnJvd3NlclxuICogZnJvbnRlbmQgYW5kIEFQSSByb3V0ZXMgZm9yIHJlYWRpbmcgZWxlbWVudHMuXG4gKlxuICogSWRlbXBvdGVudDogaWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9wdGlvbmFsbHkgb3BlbnMgdGhlXG4gKiBicm93c2VyIHdpdGhvdXQgc3RhcnRpbmcgYSBzZWNvbmQgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSG9va3MgZm9yIERJIHdpcmluZyAobG9nIGJyb2FkY2FzdCwgbWV0cmljcyBvblNuYXBzaG90KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRXZWJTZXJ2ZXIob3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V2ViU2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCA9IHt9O1xuXG4gIGlmIChzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtzZXJ2ZXJQb3J0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuICByZXN1bHQuYXBwID0gYXBwO1xuICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG5cbiAgLy8gU2VjdXJpdHkgaGVhZGVyc1xuICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUZyYW1lLU9wdGlvbnMnLCAnREVOWScpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1JlZmVycmVyLVBvbGljeScsICduby1yZWZlcnJlcicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsIGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFtcbiAgICAgIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIsXG4gICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnIGNkbi5qc2RlbGl2ci5uZXQgY2RuanMuY2xvdWRmbGFyZS5jb21cIixcbiAgICAgIFwic3R5bGUtc3JjICdzZWxmJyAndW5zYWZlLWlubGluZScgY2RuanMuY2xvdWRmbGFyZS5jb20gY2RuLmpzZGVsaXZyLm5ldFwiLFxuICAgICAgXCJjb25uZWN0LXNyYyAnc2VsZicgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVwiLFxuICAgICAgXCJmb250LXNyYyAnc2VsZidcIixcbiAgICBdLmpvaW4oJzsgJykpO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gU2V0dXAgcm91dGVzOiBhdXRvLWluc3RhbGwgRG9sbGhvdXNlTUNQIHRvIE1DUCBjbGllbnRzIChtb3VudCBCRUZPUkUgQVBJIHJvdXRlcylcbiAgYXBwLnVzZShleHByZXNzLmpzb24oeyBsaW1pdDogJzFrYicsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSk7XG4gIGNvbnN0IHsgaW5zdGFsbEhhbmRsZXIsIG9wZW5Db25maWdIYW5kbGVyLCB2ZXJzaW9uSGFuZGxlciwgbWNwYlJlZGlyZWN0SGFuZGxlciwgZGV0ZWN0SGFuZGxlciB9ID0gY3JlYXRlU2V0dXBSb3V0ZXMoKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvaW5zdGFsbCcsIGluc3RhbGxIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvb3Blbi1jb25maWcnLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBBUEkgcm91dGVzIOKAlCB1c2UgTUNQLUFRTCBnYXRld2F5IHdoZW4gaGFuZGxlciBpcyBhdmFpbGFibGUgKElzc3VlICM3OTYpXG4gIGlmIChvcHRpb25zLm1jcEFxbEhhbmRsZXIpIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlR2F0ZXdheUFwaVJvdXRlcyhvcHRpb25zLm1jcEFxbEhhbmRsZXIsIG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG5cbiAgICAvLyBQZXJtaXNzaW9uIGV2YWx1YXRpb24gcm91dGVzIChQT1NUIC9ldmFsdWF0ZV9wZXJtaXNzaW9uLCBHRVQgL3Blcm1pc3Npb25zL3N0YXR1cylcbiAgICBjb25zdCB7IHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3JvdXRlcy9wZXJtaXNzaW9uUm91dGVzLmpzJyk7XG4gICAgY29uc3QgcGVybVJvdXRlciA9IChhd2FpdCBpbXBvcnQoJ2V4cHJlc3MnKSkuUm91dGVyKCk7XG4gICAgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzKHBlcm1Sb3V0ZXIsIG9wdGlvbnMubWNwQXFsSGFuZGxlcik7XG4gICAgYXBwLnVzZSgnL2FwaScsIHBlcm1Sb3V0ZXIpO1xuXG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBNQ1AtQVFMIEdhdGV3YXkgKyBwZXJtaXNzaW9uIHJvdXRlcycpO1xuICB9IGVsc2Uge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVBcGlSb3V0ZXMob3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcbiAgICBsb2dnZXIud2FybignW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyAobm8gTUNQLUFRTCBoYW5kbGVyIGF2YWlsYWJsZSknKTtcbiAgfVxuXG4gIC8vIENvbnNvbGUgcm91dGVzOiBsb2dzLCBtZXRyaWNzLCBoZWFsdGhcbiAgbGV0IGxvZ1JvdXRlczogTG9nUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuICBsZXQgbWV0cmljc1JvdXRlczogTWV0cmljc1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgbG9nUm91dGVzID0gY3JlYXRlTG9nUm91dGVzKG9wdGlvbnMubWVtb3J5U2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGxvZ1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5sb2dCcm9hZGNhc3QgPSBsb2dSb3V0ZXMuYnJvYWRjYXN0O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIExvZyB2aWV3ZXIgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9sb2dzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZXRyaWNzU2luaykge1xuICAgIG1ldHJpY3NSb3V0ZXMgPSBjcmVhdGVNZXRyaWNzUm91dGVzKG9wdGlvbnMubWV0cmljc1NpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBtZXRyaWNzUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0Lm1ldHJpY3NPblNuYXBzaG90ID0gbWV0cmljc1JvdXRlcy5vblNuYXBzaG90O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIE1ldHJpY3Mgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9tZXRyaWNzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgaGVhbHRoUm91dGVyID0gY3JlYXRlSGVhbHRoUm91dGVzKHtcbiAgICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICAgIG1ldHJpY3NTaW5rOiBvcHRpb25zLm1ldHJpY3NTaW5rLFxuICAgICAgbG9nQ2xpZW50Q291bnQ6IGxvZ1JvdXRlcyA/IGxvZ1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgICBtZXRyaWNzQ2xpZW50Q291bnQ6IG1ldHJpY3NSb3V0ZXMgPyBtZXRyaWNzUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvYXBpJywgaGVhbHRoUm91dGVyKTtcbiAgfVxuXG4gIC8vIFNlcnZlIH4vLmRvbGxob3VzZS9wYWdlcy8gYXQgL3BhZ2VzLyDigJQgZGFzaGJvYXJkcywgZ2VuZXJhdGVkIGNvbnRlbnQsIHN0YWNrIHZpZXdzXG4gIGNvbnN0IHBhZ2VzRGlyID0gam9pbihkaXJuYW1lKG9wdGlvbnMucG9ydGZvbGlvRGlyKSwgJ3BhZ2VzJyk7XG4gIG1rZGlyKHBhZ2VzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KS5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBjcmVhdGUgcGFnZXMgZGlyZWN0b3J5OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH0pO1xuICBhcHAudXNlKCcvcGFnZXMnLCBleHByZXNzLnN0YXRpYyhwYWdlc0RpcikpO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wYWdlc1xuICAgKiBMaXN0cyBhdmFpbGFibGUgSFRNTCBwYWdlcyBpbiB+Ly5kb2xsaG91c2UvcGFnZXMvLlxuICAgKiBSZXR1cm5zIHBhZ2UgbmFtZXMgYW5kIHRoZWlyIFVSTHMgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuXG4gICAqL1xuICBhcHAuZ2V0KCcvYXBpL3BhZ2VzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGFnZXNEaXIpO1xuICAgICAgY29uc3QgcGFnZXMgPSBmaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIEFMTE9XRURfUEFHRV9FWFRFTlNJT05TLmhhcyhleHRuYW1lKGYpKSlcbiAgICAgICAgLm1hcChmID0+ICh7IG5hbWU6IGYsIHVybDogYC9wYWdlcy8ke2Z9YCB9KSk7XG4gICAgICByZXMuanNvbih7IHBhZ2VzLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzLmpzb24oeyBwYWdlczogW10sIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGRpdGlvbmFsIHJvdXRlcnMgKGUuZy4sIHVuaWZpZWQgY29uc29sZSBpbmdlc3Qgcm91dGVzKSDigJQgbXVzdCBtb3VudCBiZWZvcmUgU1BBIGZhbGxiYWNrXG4gIG9wdGlvbnMuYWRkaXRpb25hbFJvdXRlcnM/LmZvckVhY2gocm91dGVyID0+IGFwcC51c2Uocm91dGVyKSk7XG5cbiAgLy8gU3RhdGljIGZyb250ZW5kIGZpbGVzXG4gIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oX19kaXJuYW1lLCAncHVibGljJyk7XG4gIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMocHVibGljRGlyKSk7XG5cbiAgLy8gU1BBIGZhbGxiYWNrXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnNlbmRGaWxlKGpvaW4ocHVibGljRGlyLCAnaW5kZXguaHRtbCcpKTtcbiAgfSk7XG5cbiAgLy8gQmluZCB0byBsb2NhbGhvc3Qgb25seVxuICBhcHAubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnLCAoKSA9PiB7XG4gICAgc2VydmVyUnVubmluZyA9IHRydWU7XG4gICAgc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWA7XG4gICAgY29uc3QgZmFsbGJhY2tVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBNYW5hZ2VtZW50IGNvbnNvbGUgcnVubmluZyBhdCAke3VybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlXFxuICAke3VybH1cXG4gICR7ZmFsbGJhY2tVcmx9IChmYWxsYmFjaylcXG5gKTtcblxuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKHVybCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIHBvcnRmb2xpbyBicm93c2VyIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyIHByb2Nlc3MuXG4gKlxuICogU3RhcnRzIHRoZSB3ZWIgc2VydmVyIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gb3BlbnMgdGhlIHN5c3RlbVxuICogYnJvd3NlciB0byB0aGUgcG9ydGZvbGlvIFVJLiBSZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBpbmRpY2F0aW5nXG4gKiB3aGV0aGVyIHRoZSBzZXJ2ZXIgc3RhcnRlZCBhbmQgdGhlIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBDYWxsZWQgYnkgdGhlIGBvcGVuX3BvcnRmb2xpb19icm93c2VyYCBNQ1AtQVFMIG9wZXJhdGlvbiAoSXNzdWUgIzc3NCkuXG4gKlxuICogQHBhcmFtIHBvcnRmb2xpb0RpciAtIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pXG4gKiBAcGFyYW0gcG9ydCAtIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdDogMzkzOSlcbiAqIEByZXR1cm5zIFJlc3VsdCB3aXRoIFVSTCwgc2VydmVyIHN0YXR1cywgYW5kIGJyb3dzZXIgb3BlbiBzdGF0dXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Qb3J0Zm9saW9Ccm93c2VyKHBvcnRmb2xpb0Rpcjogc3RyaW5nLCBwb3J0PzogbnVtYmVyLCBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcik6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IHBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCB1cmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3RhcmdldFBvcnR9YDtcbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0V2ViU2VydmVyKHtcbiAgICAgIHBvcnRmb2xpb0RpcixcbiAgICAgIHBvcnQ6IHRhcmdldFBvcnQsXG4gICAgICBvcGVuQnJvd3NlcjogZmFsc2UsIC8vIFdlJ2xsIG9wZW4gbWFudWFsbHkgYmVsb3cgdG8gY2FwdHVyZSB0aGUgcmVzdWx0XG4gICAgICBtY3BBcWxIYW5kbGVyLFxuICAgIH0pO1xuICAgIC8vIFdhaXQgYnJpZWZseSBmb3IgdGhlIHNlcnZlciB0byBiaW5kXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpO1xuICB9XG5cbiAgY29uc3QgYnJvd3NlclJlc3VsdCA9IGF3YWl0IG9wZW5JbkJyb3dzZXIodXJsKTtcblxuICByZXR1cm4ge1xuICAgIHVybCxcbiAgICBhbHJlYWR5UnVubmluZyxcbiAgICBicm93c2VyT3BlbmVkOiBicm93c2VyUmVzdWx0LnN1Y2Nlc3MsXG4gICAgLi4uKGJyb3dzZXJSZXN1bHQuZXJyb3IgPyB7IHdhcm5pbmc6IGBCcm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseTogJHticm93c2VyUmVzdWx0LmVycm9yfS4gT3BlbiAke3VybH0gbWFudWFsbHkuYCB9IDoge30pLFxuICB9O1xufVxuIl19
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUE0QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRTNELGtF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LENBQUM7SUFFckMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sY0FBYyxDQUFDO1lBQ25CLFlBQVk7WUFDWixJQUFJLEVBQUUsVUFBVTtZQUNoQixXQUFXLEVBQUUsS0FBSyxFQUFFLGtEQUFrRDtZQUN0RSxhQUFhO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHO1FBQ0gsY0FBYztRQUNkLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztRQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsOENBQThDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hJLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEb2xsaG91c2VNQ1AgV2ViIFVJIFNlcnZlclxuICpcbiAqIExpZ2h0d2VpZ2h0IEV4cHJlc3Mgc2VydmVyIGZvciBicm93c2luZyBwb3J0Zm9saW8gZWxlbWVudHMgaW4gYSBicm93c2VyLlxuICogQm91bmQgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFJlYWQtb25seSBmb3IgVjEuXG4gKlxuICogQ2FuIGJlIHN0YXJ0ZWQgc3RhbmRhbG9uZSAoYC0td2ViYCBmbGFnKSBvciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlclxuICogcHJvY2VzcyB2aWEgYG9wZW5Qb3J0Zm9saW9Ccm93c2VyKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83MDRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83NzRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlQXBpUm91dGVzLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nUm91dGVzLCB0eXBlIExvZ1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL2xvZ1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVNZXRyaWNzUm91dGVzLCB0eXBlIE1ldHJpY3NSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9tZXRyaWNzUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhlYWx0aFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL2hlYWx0aFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXR1cFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3NldHVwUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgREVGQVVMVF9QT1JUID0gMzkzOTtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG5cbi8qKiBUcmFjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBpbi1wcm9jZXNzLiAqL1xubGV0IHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbmxldCBzZXJ2ZXJQb3J0ID0gREVGQVVMVF9QT1JUO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlck9wdGlvbnMge1xuICAvKiogUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0OiAzOTM5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbykgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBPcGVuIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnRpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuQnJvd3Nlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNQ1BBUUxIYW5kbGVyIGZvciByb3V0aW5nIHRocm91Z2ggdGhlIE1DUC1BUUwgcGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIEFQSSByb3V0ZXMgdXNlIHRoZSBnYXRld2F5ICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKS5cbiAgICogV2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgKiBJc3N1ZSAjNzk2OiBXZWIgTUNQLUFRTCBHYXRld2F5LlxuICAgKi9cbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIC8qKiBNZW1vcnlMb2dTaW5rIGZvciBsb2cgcm91dGVzIChvcHRpb25hbCDigJQgbG9ncyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1lbW9yeU1ldHJpY3NTaW5rIGZvciBtZXRyaWNzIHJvdXRlcyAob3B0aW9uYWwg4oCUIG1ldHJpY3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIEFkZGl0aW9uYWwgcm91dGVycyB0byBtb3VudCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjayAoZS5nLiwgaW5nZXN0IHJvdXRlcykgKi9cbiAgYWRkaXRpb25hbFJvdXRlcnM/OiBpbXBvcnQoJ2V4cHJlc3MnKS5Sb3V0ZXJbXTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgLy8gQWNjZXB0IGxvY2FsaG9zdCwgMTI3LjAuMC4xLCBhbmQgKi5sb2NhbGhvc3Qgc3ViZG9tYWlucyAoUkZDIDY3NjEpXG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC8obG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuMXxbXFx3LV0rXFwubG9jYWxob3N0KVs6L10vLnRlc3QodXJsU3RyKSkge1xuICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VSTCBtdXN0IGJlIGEgbG9jYWxob3N0IEhUVFAgVVJMJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXhlY0ZpbGUoY21kLCBbdXJsU3RyXSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgYXV0by1vcGVuIGJyb3dzZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBwb3J0Zm9saW8gd2ViIHNlcnZlci5cbiAqXG4gKiBCaW5kcyB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gU2VydmVzIHRoZSBwb3J0Zm9saW8gYnJvd3NlclxuICogZnJvbnRlbmQgYW5kIEFQSSByb3V0ZXMgZm9yIHJlYWRpbmcgZWxlbWVudHMuXG4gKlxuICogSWRlbXBvdGVudDogaWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9wdGlvbmFsbHkgb3BlbnMgdGhlXG4gKiBicm93c2VyIHdpdGhvdXQgc3RhcnRpbmcgYSBzZWNvbmQgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSG9va3MgZm9yIERJIHdpcmluZyAobG9nIGJyb2FkY2FzdCwgbWV0cmljcyBvblNuYXBzaG90KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRXZWJTZXJ2ZXIob3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V2ViU2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCA9IHt9O1xuXG4gIGlmIChzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtzZXJ2ZXJQb3J0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuICByZXN1bHQuYXBwID0gYXBwO1xuICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG5cbiAgLy8gU2VjdXJpdHkgaGVhZGVyc1xuICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLUZyYW1lLU9wdGlvbnMnLCAnREVOWScpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1JlZmVycmVyLVBvbGljeScsICduby1yZWZlcnJlcicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsIGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFtcbiAgICAgIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIsXG4gICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnIGNkbi5qc2RlbGl2ci5uZXQgY2RuanMuY2xvdWRmbGFyZS5jb21cIixcbiAgICAgIFwic3R5bGUtc3JjICdzZWxmJyAndW5zYWZlLWlubGluZScgY2RuanMuY2xvdWRmbGFyZS5jb20gY2RuLmpzZGVsaXZyLm5ldFwiLFxuICAgICAgXCJjb25uZWN0LXNyYyAnc2VsZicgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVwiLFxuICAgICAgXCJmb250LXNyYyAnc2VsZidcIixcbiAgICBdLmpvaW4oJzsgJykpO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gU2V0dXAgcm91dGVzOiBhdXRvLWluc3RhbGwgRG9sbGhvdXNlTUNQIHRvIE1DUCBjbGllbnRzIChtb3VudCBCRUZPUkUgQVBJIHJvdXRlcylcbiAgYXBwLnVzZShleHByZXNzLmpzb24oeyBsaW1pdDogJzFrYicsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSk7XG4gIGNvbnN0IHsgaW5zdGFsbEhhbmRsZXIsIG9wZW5Db25maWdIYW5kbGVyLCB2ZXJzaW9uSGFuZGxlciwgbWNwYlJlZGlyZWN0SGFuZGxlciwgZGV0ZWN0SGFuZGxlciB9ID0gY3JlYXRlU2V0dXBSb3V0ZXMoKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvaW5zdGFsbCcsIGluc3RhbGxIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvb3Blbi1jb25maWcnLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBBUEkgcm91dGVzIOKAlCB1c2UgTUNQLUFRTCBnYXRld2F5IHdoZW4gaGFuZGxlciBpcyBhdmFpbGFibGUgKElzc3VlICM3OTYpXG4gIGlmIChvcHRpb25zLm1jcEFxbEhhbmRsZXIpIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlR2F0ZXdheUFwaVJvdXRlcyhvcHRpb25zLm1jcEFxbEhhbmRsZXIsIG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG5cbiAgICAvLyBQZXJtaXNzaW9uIGV2YWx1YXRpb24gcm91dGVzIChQT1NUIC9ldmFsdWF0ZV9wZXJtaXNzaW9uLCBHRVQgL3Blcm1pc3Npb25zL3N0YXR1cylcbiAgICBjb25zdCB7IHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3JvdXRlcy9wZXJtaXNzaW9uUm91dGVzLmpzJyk7XG4gICAgY29uc3QgcGVybVJvdXRlciA9IChhd2FpdCBpbXBvcnQoJ2V4cHJlc3MnKSkuUm91dGVyKCk7XG4gICAgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzKHBlcm1Sb3V0ZXIsIG9wdGlvbnMubWNwQXFsSGFuZGxlcik7XG4gICAgYXBwLnVzZSgnL2FwaScsIHBlcm1Sb3V0ZXIpO1xuXG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBNQ1AtQVFMIEdhdGV3YXkgKyBwZXJtaXNzaW9uIHJvdXRlcycpO1xuICB9IGVsc2Uge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVBcGlSb3V0ZXMob3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcbiAgICBsb2dnZXIud2FybignW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyAobm8gTUNQLUFRTCBoYW5kbGVyIGF2YWlsYWJsZSknKTtcbiAgfVxuXG4gIC8vIENvbnNvbGUgcm91dGVzOiBsb2dzLCBtZXRyaWNzLCBoZWFsdGhcbiAgbGV0IGxvZ1JvdXRlczogTG9nUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuICBsZXQgbWV0cmljc1JvdXRlczogTWV0cmljc1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgbG9nUm91dGVzID0gY3JlYXRlTG9nUm91dGVzKG9wdGlvbnMubWVtb3J5U2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGxvZ1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5sb2dCcm9hZGNhc3QgPSBsb2dSb3V0ZXMuYnJvYWRjYXN0O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIExvZyB2aWV3ZXIgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9sb2dzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZXRyaWNzU2luaykge1xuICAgIG1ldHJpY3NSb3V0ZXMgPSBjcmVhdGVNZXRyaWNzUm91dGVzKG9wdGlvbnMubWV0cmljc1NpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBtZXRyaWNzUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0Lm1ldHJpY3NPblNuYXBzaG90ID0gbWV0cmljc1JvdXRlcy5vblNuYXBzaG90O1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIE1ldHJpY3Mgcm91dGVzIG1vdW50ZWQgYXQgL2FwaS9tZXRyaWNzJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5tZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgaGVhbHRoUm91dGVyID0gY3JlYXRlSGVhbHRoUm91dGVzKHtcbiAgICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICAgIG1ldHJpY3NTaW5rOiBvcHRpb25zLm1ldHJpY3NTaW5rLFxuICAgICAgbG9nQ2xpZW50Q291bnQ6IGxvZ1JvdXRlcyA/IGxvZ1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgICBtZXRyaWNzQ2xpZW50Q291bnQ6IG1ldHJpY3NSb3V0ZXMgPyBtZXRyaWNzUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvYXBpJywgaGVhbHRoUm91dGVyKTtcbiAgfVxuXG4gIC8vIFNlcnZlIH4vLmRvbGxob3VzZS9wYWdlcy8gYXQgL3BhZ2VzLyDigJQgZGFzaGJvYXJkcywgZ2VuZXJhdGVkIGNvbnRlbnQsIHN0YWNrIHZpZXdzXG4gIGNvbnN0IHBhZ2VzRGlyID0gam9pbihkaXJuYW1lKG9wdGlvbnMucG9ydGZvbGlvRGlyKSwgJ3BhZ2VzJyk7XG4gIG1rZGlyKHBhZ2VzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KS5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBjcmVhdGUgcGFnZXMgZGlyZWN0b3J5OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH0pO1xuICBhcHAudXNlKCcvcGFnZXMnLCBleHByZXNzLnN0YXRpYyhwYWdlc0RpcikpO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wYWdlc1xuICAgKiBMaXN0cyBhdmFpbGFibGUgSFRNTCBwYWdlcyBpbiB+Ly5kb2xsaG91c2UvcGFnZXMvLlxuICAgKiBSZXR1cm5zIHBhZ2UgbmFtZXMgYW5kIHRoZWlyIFVSTHMgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuXG4gICAqL1xuICBhcHAuZ2V0KCcvYXBpL3BhZ2VzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGFnZXNEaXIpO1xuICAgICAgY29uc3QgcGFnZXMgPSBmaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIEFMTE9XRURfUEFHRV9FWFRFTlNJT05TLmhhcyhleHRuYW1lKGYpKSlcbiAgICAgICAgLm1hcChmID0+ICh7IG5hbWU6IGYsIHVybDogYC9wYWdlcy8ke2Z9YCB9KSk7XG4gICAgICByZXMuanNvbih7IHBhZ2VzLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzLmpzb24oeyBwYWdlczogW10sIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGRpdGlvbmFsIHJvdXRlcnMgKGUuZy4sIHVuaWZpZWQgY29uc29sZSBpbmdlc3Qgcm91dGVzKSDigJQgbXVzdCBtb3VudCBiZWZvcmUgU1BBIGZhbGxiYWNrXG4gIG9wdGlvbnMuYWRkaXRpb25hbFJvdXRlcnM/LmZvckVhY2gocm91dGVyID0+IGFwcC51c2Uocm91dGVyKSk7XG5cbiAgLy8gU3RhdGljIGZyb250ZW5kIGZpbGVzXG4gIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oX19kaXJuYW1lLCAncHVibGljJyk7XG4gIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMocHVibGljRGlyKSk7XG5cbiAgLy8gU1BBIGZhbGxiYWNrXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnNlbmRGaWxlKGpvaW4ocHVibGljRGlyLCAnaW5kZXguaHRtbCcpKTtcbiAgfSk7XG5cbiAgLy8gQmluZCB0byBsb2NhbGhvc3Qgb25seSDigJQgaGFuZGxlIHBvcnQgY29uZmxpY3RzIGdyYWNlZnVsbHlcbiAgLy8gTk9URTogY29uc29sZS5sb2cgaXMgaW50ZW50aW9uYWwgaGVyZSAobm90IGxvZ2dlcikuIEluIC0td2ViIHN0YW5kYWxvbmUgbW9kZSxcbiAgLy8gdGhlIHVzZXIgc2VlcyB0ZXJtaW5hbCBvdXRwdXQgZGlyZWN0bHkuIGxvZ2dlci5pbmZvIHdyaXRlcyB0byB0aGUgc3RydWN0dXJlZFxuICAvLyBsb2cgc3lzdGVtIChNZW1vcnlMb2dTaW5rIOKGkiBTU0Ug4oaSIHdlYiBjb25zb2xlKS4gQm90aCBhcmUgbmVlZGVkOiBjb25zb2xlLmxvZ1xuICAvLyBmb3IgdGhlIGh1bWFuIGF0IHRoZSB0ZXJtaW5hbCwgbG9nZ2VyIGZvciB0aGUgbG9nIHZpZXdlciB0YWIuXG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaHR0cFNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICAgIHNlcnZlclJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YDtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gICAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBNYW5hZ2VtZW50IGNvbnNvbGUgcnVubmluZyBhdCAke3VybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuXG4gICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICBvcGVuSW5Ccm93c2VyKHVybCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgaHR0cFNlcnZlci5vbignZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2Ug4oCUIG9wZW5pbmcgZXhpc3RpbmcgY29uc29sZWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlIChleGlzdGluZyBpbnN0YW5jZSlcXG4gICR7dXJsfVxcbmApO1xuICAgICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICAgIG9wZW5JbkJyb3dzZXIodXJsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byBiaW5kIHBvcnQgJHtwb3J0fTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTsgLy8gV2ViIGNvbnNvbGUgaXMgb3B0aW9uYWwg4oCUIGRvbid0IGJsb2NrIHN0YXJ0dXBcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBPcGVuIHRoZSBwb3J0Zm9saW8gYnJvd3NlciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlciBwcm9jZXNzLlxuICpcbiAqIFN0YXJ0cyB0aGUgd2ViIHNlcnZlciBpZiBub3QgYWxyZWFkeSBydW5uaW5nLCB0aGVuIG9wZW5zIHRoZSBzeXN0ZW1cbiAqIGJyb3dzZXIgdG8gdGhlIHBvcnRmb2xpbyBVSS4gUmV0dXJucyBhIHJlc3VsdCBvYmplY3QgaW5kaWNhdGluZ1xuICogd2hldGhlciB0aGUgc2VydmVyIHN0YXJ0ZWQgYW5kIHRoZSBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogQ2FsbGVkIGJ5IHRoZSBgb3Blbl9wb3J0Zm9saW9fYnJvd3NlcmAgTUNQLUFRTCBvcGVyYXRpb24gKElzc3VlICM3NzQpLlxuICpcbiAqIEBwYXJhbSBwb3J0Zm9saW9EaXIgLSBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKVxuICogQHBhcmFtIHBvcnQgLSBQb3J0IHRvIGJpbmQgdG8gKGRlZmF1bHQ6IDM5MzkpXG4gKiBAcmV0dXJucyBSZXN1bHQgd2l0aCBVUkwsIHNlcnZlciBzdGF0dXMsIGFuZCBicm93c2VyIG9wZW4gc3RhdHVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuUG9ydGZvbGlvQnJvd3Nlcihwb3J0Zm9saW9EaXI6IHN0cmluZywgcG9ydD86IG51bWJlciwgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXIsIHRhYj86IHN0cmluZyk6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IHBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCBiYXNlVXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHt0YXJnZXRQb3J0fWA7XG4gIGNvbnN0IHVybCA9IHRhYiA/IGAke2Jhc2VVcmx9LyMke3RhYn1gIDogYmFzZVVybDtcbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0V2ViU2VydmVyKHtcbiAgICAgIHBvcnRmb2xpb0RpcixcbiAgICAgIHBvcnQ6IHRhcmdldFBvcnQsXG4gICAgICBvcGVuQnJvd3NlcjogZmFsc2UsIC8vIFdlJ2xsIG9wZW4gbWFudWFsbHkgYmVsb3cgdG8gY2FwdHVyZSB0aGUgcmVzdWx0XG4gICAgICBtY3BBcWxIYW5kbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgYnJvd3NlclJlc3VsdCA9IGF3YWl0IG9wZW5JbkJyb3dzZXIodXJsKTtcblxuICByZXR1cm4ge1xuICAgIHVybCxcbiAgICBhbHJlYWR5UnVubmluZyxcbiAgICBicm93c2VyT3BlbmVkOiBicm93c2VyUmVzdWx0LnN1Y2Nlc3MsXG4gICAgLi4uKGJyb3dzZXJSZXN1bHQuZXJyb3IgPyB7IHdhcm5pbmc6IGBCcm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseTogJHticm93c2VyUmVzdWx0LmVycm9yfS4gT3BlbiAke3VybH0gbWFudWFsbHkuYCB9IDoge30pLFxuICB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.6",
|
|
4
4
|
"description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.DollhouseMCP/mcp-server",
|
|
4
4
|
"title": "DollhouseMCP",
|
|
5
5
|
"description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.6",
|
|
7
7
|
"homepage": "https://dollhousemcp.com",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
{
|
|
30
30
|
"registryType": "npm",
|
|
31
31
|
"identifier": "@dollhousemcp/mcp-server",
|
|
32
|
-
"version": "2.0.
|
|
32
|
+
"version": "2.0.6",
|
|
33
33
|
"transport": {
|
|
34
34
|
"type": "stdio"
|
|
35
35
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/constants/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,UAAU,6BAA6B,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// Auto-generated version constant
|
|
2
|
-
export const VERSION = "1.6.5";
|
|
3
|
-
export const BUILD_DATE = "2025-08-26T15:30:22.187Z";
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQ0FBa0M7QUFDbEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBdXRvLWdlbmVyYXRlZCB2ZXJzaW9uIGNvbnN0YW50XG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS42LjVcIjtcbmV4cG9ydCBjb25zdCBCVUlMRF9EQVRFID0gXCIyMDI1LTA4LTI2VDE1OjMwOjIyLjE4N1pcIjtcbiJdfQ==
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SSE-based real-time log viewer sink.
|
|
3
|
-
*
|
|
4
|
-
* Implements ILogSink and runs an opt-in Express HTTP server that:
|
|
5
|
-
* - Serves a browser-based log viewer at GET /
|
|
6
|
-
* - Streams log entries via SSE at GET /logs/stream
|
|
7
|
-
* - Exposes a JSON query endpoint at GET /logs (delegates to MemoryLogSink)
|
|
8
|
-
* - Provides a health endpoint at GET /health
|
|
9
|
-
*
|
|
10
|
-
* See docs/LOGGING-DESIGN.md §4.6 for the full design.
|
|
11
|
-
*/
|
|
12
|
-
import type { ILogSink, UnifiedLogEntry } from '../types.js';
|
|
13
|
-
import type { MemoryLogSink } from './MemoryLogSink.js';
|
|
14
|
-
export interface SSELogSinkOptions {
|
|
15
|
-
port: number;
|
|
16
|
-
memorySink: MemoryLogSink;
|
|
17
|
-
}
|
|
18
|
-
export declare class SSELogSink implements ILogSink {
|
|
19
|
-
private readonly app;
|
|
20
|
-
private server;
|
|
21
|
-
private readonly clients;
|
|
22
|
-
private readonly memorySink;
|
|
23
|
-
private readonly port;
|
|
24
|
-
private readonly startTime;
|
|
25
|
-
constructor(options: SSELogSinkOptions);
|
|
26
|
-
write(entry: UnifiedLogEntry): void;
|
|
27
|
-
flush(): Promise<void>;
|
|
28
|
-
close(): Promise<void>;
|
|
29
|
-
start(): Promise<void>;
|
|
30
|
-
get clientCount(): number;
|
|
31
|
-
getPort(): number;
|
|
32
|
-
private setupRoutes;
|
|
33
|
-
private matchesFilter;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=SSELogSink.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SSELogSink.d.ts","sourceRoot":"","sources":["../../../src/logging/sinks/SSELogSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,CAAC;CAC3B;AAcD,qBAAa,UAAW,YAAW,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,OAAO,EAAE,iBAAiB;IAWtC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,IAAI,MAAM;IAWjB,OAAO,CAAC,WAAW;IA4FnB,OAAO,CAAC,aAAa;CAkBtB"}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SSE-based real-time log viewer sink.
|
|
3
|
-
*
|
|
4
|
-
* Implements ILogSink and runs an opt-in Express HTTP server that:
|
|
5
|
-
* - Serves a browser-based log viewer at GET /
|
|
6
|
-
* - Streams log entries via SSE at GET /logs/stream
|
|
7
|
-
* - Exposes a JSON query endpoint at GET /logs (delegates to MemoryLogSink)
|
|
8
|
-
* - Provides a health endpoint at GET /health
|
|
9
|
-
*
|
|
10
|
-
* See docs/LOGGING-DESIGN.md §4.6 for the full design.
|
|
11
|
-
*/
|
|
12
|
-
import express from 'express';
|
|
13
|
-
import { LOG_LEVEL_PRIORITY } from '../types.js';
|
|
14
|
-
import { getViewerHtml } from '../viewer/viewerHtml.js';
|
|
15
|
-
export class SSELogSink {
|
|
16
|
-
app;
|
|
17
|
-
server = null;
|
|
18
|
-
clients = new Set();
|
|
19
|
-
memorySink;
|
|
20
|
-
port;
|
|
21
|
-
startTime = Date.now();
|
|
22
|
-
constructor(options) {
|
|
23
|
-
this.port = options.port;
|
|
24
|
-
this.memorySink = options.memorySink;
|
|
25
|
-
this.app = express();
|
|
26
|
-
this.setupRoutes();
|
|
27
|
-
}
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
// ILogSink
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
write(entry) {
|
|
32
|
-
for (const client of this.clients) {
|
|
33
|
-
if (this.matchesFilter(entry, client.filter)) {
|
|
34
|
-
client.res.write(`data: ${JSON.stringify(entry)}\n\n`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async flush() {
|
|
39
|
-
// No-op — SSE writes are immediate.
|
|
40
|
-
}
|
|
41
|
-
async close() {
|
|
42
|
-
// End all client connections
|
|
43
|
-
for (const client of this.clients) {
|
|
44
|
-
client.res.end();
|
|
45
|
-
}
|
|
46
|
-
this.clients.clear();
|
|
47
|
-
// Shut down HTTP server
|
|
48
|
-
if (this.server) {
|
|
49
|
-
await new Promise((resolve) => {
|
|
50
|
-
this.server.close(() => resolve());
|
|
51
|
-
});
|
|
52
|
-
this.server = null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
// Lifecycle
|
|
57
|
-
// ---------------------------------------------------------------------------
|
|
58
|
-
async start() {
|
|
59
|
-
return new Promise((resolve) => {
|
|
60
|
-
this.server = this.app.listen(this.port, '127.0.0.1', () => {
|
|
61
|
-
this.server.unref();
|
|
62
|
-
resolve();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
get clientCount() {
|
|
67
|
-
return this.clients.size;
|
|
68
|
-
}
|
|
69
|
-
getPort() {
|
|
70
|
-
if (!this.server)
|
|
71
|
-
return this.port;
|
|
72
|
-
const addr = this.server.address();
|
|
73
|
-
if (addr && typeof addr === 'object')
|
|
74
|
-
return addr.port;
|
|
75
|
-
return this.port;
|
|
76
|
-
}
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// Routes
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
setupRoutes() {
|
|
81
|
-
// Viewer HTML
|
|
82
|
-
this.app.get('/', (_req, res) => {
|
|
83
|
-
const actualPort = this.getPort();
|
|
84
|
-
res.type('html').send(getViewerHtml(actualPort));
|
|
85
|
-
});
|
|
86
|
-
// SSE stream
|
|
87
|
-
this.app.get('/logs/stream', (req, res) => {
|
|
88
|
-
res.writeHead(200, {
|
|
89
|
-
'Content-Type': 'text/event-stream',
|
|
90
|
-
'Cache-Control': 'no-cache',
|
|
91
|
-
'Connection': 'keep-alive',
|
|
92
|
-
});
|
|
93
|
-
res.write(':connected\n\n');
|
|
94
|
-
const filter = {};
|
|
95
|
-
if (typeof req.query['category'] === 'string' && req.query['category']) {
|
|
96
|
-
filter.category = req.query['category'];
|
|
97
|
-
}
|
|
98
|
-
if (typeof req.query['level'] === 'string' && req.query['level']) {
|
|
99
|
-
filter.level = req.query['level'];
|
|
100
|
-
}
|
|
101
|
-
if (typeof req.query['source'] === 'string' && req.query['source']) {
|
|
102
|
-
filter.source = req.query['source'];
|
|
103
|
-
}
|
|
104
|
-
if (typeof req.query['correlationId'] === 'string' && req.query['correlationId']) {
|
|
105
|
-
filter.correlationId = req.query['correlationId'];
|
|
106
|
-
}
|
|
107
|
-
const client = { res, filter };
|
|
108
|
-
this.clients.add(client);
|
|
109
|
-
// Backfill recent history so the viewer shows context on connect
|
|
110
|
-
const history = this.memorySink.query({ category: 'all', limit: 500 });
|
|
111
|
-
// Send oldest-first so the viewer displays in chronological order
|
|
112
|
-
const entries = history.entries.slice().reverse();
|
|
113
|
-
for (const entry of entries) {
|
|
114
|
-
res.write(`data: ${JSON.stringify(entry)}\n\n`);
|
|
115
|
-
}
|
|
116
|
-
req.on('close', () => {
|
|
117
|
-
this.clients.delete(client);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
// JSON query (delegates to MemoryLogSink)
|
|
121
|
-
this.app.get('/logs', (req, res) => {
|
|
122
|
-
const options = {};
|
|
123
|
-
if (typeof req.query['category'] === 'string' && req.query['category']) {
|
|
124
|
-
options['category'] = req.query['category'];
|
|
125
|
-
}
|
|
126
|
-
if (typeof req.query['level'] === 'string' && req.query['level']) {
|
|
127
|
-
options['level'] = req.query['level'];
|
|
128
|
-
}
|
|
129
|
-
if (typeof req.query['source'] === 'string' && req.query['source']) {
|
|
130
|
-
options['source'] = req.query['source'];
|
|
131
|
-
}
|
|
132
|
-
if (typeof req.query['message'] === 'string' && req.query['message']) {
|
|
133
|
-
options['message'] = req.query['message'];
|
|
134
|
-
}
|
|
135
|
-
if (typeof req.query['limit'] === 'string') {
|
|
136
|
-
options['limit'] = parseInt(req.query['limit'], 10);
|
|
137
|
-
}
|
|
138
|
-
if (typeof req.query['offset'] === 'string') {
|
|
139
|
-
options['offset'] = parseInt(req.query['offset'], 10);
|
|
140
|
-
}
|
|
141
|
-
if (typeof req.query['since'] === 'string' && req.query['since']) {
|
|
142
|
-
options['since'] = req.query['since'];
|
|
143
|
-
}
|
|
144
|
-
if (typeof req.query['until'] === 'string' && req.query['until']) {
|
|
145
|
-
options['until'] = req.query['until'];
|
|
146
|
-
}
|
|
147
|
-
const result = this.memorySink.query(options);
|
|
148
|
-
res.json(result);
|
|
149
|
-
});
|
|
150
|
-
// Health
|
|
151
|
-
this.app.get('/health', (_req, res) => {
|
|
152
|
-
res.json({
|
|
153
|
-
status: 'ok',
|
|
154
|
-
clients: this.clientCount,
|
|
155
|
-
uptime: Math.floor((Date.now() - this.startTime) / 1000),
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
// ---------------------------------------------------------------------------
|
|
160
|
-
// Filter matching
|
|
161
|
-
// ---------------------------------------------------------------------------
|
|
162
|
-
matchesFilter(entry, filter) {
|
|
163
|
-
if (filter.category && entry.category !== filter.category) {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
if (filter.level && LOG_LEVEL_PRIORITY[entry.level] < LOG_LEVEL_PRIORITY[filter.level]) {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
if (filter.source) {
|
|
170
|
-
const needle = filter.source.toLowerCase();
|
|
171
|
-
if (!entry.source.toLowerCase().includes(needle)) {
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (filter.correlationId && entry.correlationId !== filter.correlationId) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1NFTG9nU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sb2dnaW5nL3NpbmtzL1NTRUxvZ1NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUk5QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBbUJ4RCxNQUFNLE9BQU8sVUFBVTtJQUNKLEdBQUcsQ0FBNkI7SUFDekMsTUFBTSxHQUFrQixJQUFJLENBQUM7SUFDcEIsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUFDL0IsVUFBVSxDQUFnQjtJQUMxQixJQUFJLENBQVM7SUFDYixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRXhDLFlBQVksT0FBMEI7UUFDcEMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLFdBQVc7SUFDWCw4RUFBOEU7SUFFOUUsS0FBSyxDQUFDLEtBQXNCO1FBQzFCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFD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Q0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTU0UtYmFzZWQgcmVhbC10aW1lIGxvZyB2aWV3ZXIgc2luay5cbiAqXG4gKiBJbXBsZW1lbnRzIElMb2dTaW5rIGFuZCBydW5zIGFuIG9wdC1pbiBFeHByZXNzIEhUVFAgc2VydmVyIHRoYXQ6XG4gKiAtIFNlcnZlcyBhIGJyb3dzZXItYmFzZWQgbG9nIHZpZXdlciBhdCBHRVQgL1xuICogLSBTdHJlYW1zIGxvZyBlbnRyaWVzIHZpYSBTU0UgYXQgR0VUIC9sb2dzL3N0cmVhbVxuICogLSBFeHBvc2VzIGEgSlNPTiBxdWVyeSBlbmRwb2ludCBhdCBHRVQgL2xvZ3MgKGRlbGVnYXRlcyB0byBNZW1vcnlMb2dTaW5rKVxuICogLSBQcm92aWRlcyBhIGhlYWx0aCBlbmRwb2ludCBhdCBHRVQgL2hlYWx0aFxuICpcbiAqIFNlZSBkb2NzL0xPR0dJTkctREVTSUdOLm1kIMKnNC42IGZvciB0aGUgZnVsbCBkZXNpZ24uXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHR5cGUgeyBJTG9nU2luaywgVW5pZmllZExvZ0VudHJ5LCBMb2dDYXRlZ29yeSwgTG9nTGV2ZWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBMT0dfTEVWRUxfUFJJT1JJVFkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHsgZ2V0Vmlld2VySHRtbCB9IGZyb20gJy4uL3ZpZXdlci92aWV3ZXJIdG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTU0VMb2dTaW5rT3B0aW9ucyB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgbWVtb3J5U2luazogTWVtb3J5TG9nU2luaztcbn1cblxuaW50ZXJmYWNlIFNTRUNsaWVudEZpbHRlciB7XG4gIGNhdGVnb3J5PzogTG9nQ2F0ZWdvcnk7XG4gIGxldmVsPzogTG9nTGV2ZWw7XG4gIHNvdXJjZT86IHN0cmluZztcbiAgY29ycmVsYXRpb25JZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNTRUNsaWVudCB7XG4gIHJlczogUmVzcG9uc2U7XG4gIGZpbHRlcjogU1NFQ2xpZW50RmlsdGVyO1xufVxuXG5leHBvcnQgY2xhc3MgU1NFTG9nU2luayBpbXBsZW1lbnRzIElMb2dTaW5rIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IFJldHVyblR5cGU8dHlwZW9mIGV4cHJlc3M+O1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50cyA9IG5ldyBTZXQ8U1NFQ2xpZW50PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU1NFTG9nU2lua09wdGlvbnMpIHtcbiAgICB0aGlzLnBvcnQgPSBvcHRpb25zLnBvcnQ7XG4gICAgdGhpcy5tZW1vcnlTaW5rID0gb3B0aW9ucy5tZW1vcnlTaW5rO1xuICAgIHRoaXMuYXBwID0gZXhwcmVzcygpO1xuICAgIHRoaXMuc2V0dXBSb3V0ZXMoKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBJTG9nU2lua1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICB3cml0ZShlbnRyeTogVW5pZmllZExvZ0VudHJ5KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgdGhpcy5jbGllbnRzKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzRmlsdGVyKGVudHJ5LCBjbGllbnQuZmlsdGVyKSkge1xuICAgICAgICBjbGllbnQucmVzLndyaXRlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGVudHJ5KX1cXG5cXG5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBOby1vcCDigJQgU1NFIHdyaXRlcyBhcmUgaW1tZWRpYXRlLlxuICB9XG5cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRW5kIGFsbCBjbGllbnQgY29ubmVjdGlvbnNcbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB0aGlzLmNsaWVudHMpIHtcbiAgICAgIGNsaWVudC5yZXMuZW5kKCk7XG4gICAgfVxuICAgIHRoaXMuY2xpZW50cy5jbGVhcigpO1xuXG4gICAgLy8gU2h1dCBkb3duIEhUVFAgc2VydmVyXG4gICAgaWYgKHRoaXMuc2VydmVyKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLnNlcnZlciEuY2xvc2UoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXJ2ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlciA9IHRoaXMuYXBwLmxpc3Rlbih0aGlzLnBvcnQsICcxMjcuMC4wLjEnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmVyIS51bnJlZigpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjbGllbnRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNsaWVudHMuc2l6ZTtcbiAgfVxuXG4gIGdldFBvcnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSByZXR1cm4gdGhpcy5wb3J0O1xuICAgIGNvbnN0IGFkZHIgPSB0aGlzLnNlcnZlci5hZGRyZXNzKCk7XG4gICAgaWYgKGFkZHIgJiYgdHlwZW9mIGFkZHIgPT09ICdvYmplY3QnKSByZXR1cm4gYWRkci5wb3J0O1xuICAgIHJldHVybiB0aGlzLnBvcnQ7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm91dGVzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgc2V0dXBSb3V0ZXMoKTogdm9pZCB7XG4gICAgLy8gVmlld2VyIEhUTUxcbiAgICB0aGlzLmFwcC5nZXQoJy8nLCAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsUG9ydCA9IHRoaXMuZ2V0UG9ydCgpO1xuICAgICAgcmVzLnR5cGUoJ2h0bWwnKS5zZW5kKGdldFZpZXdlckh0bWwoYWN0dWFsUG9ydCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NFIHN0cmVhbVxuICAgIHRoaXMuYXBwLmdldCgnL2xvZ3Mvc3RyZWFtJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2V2ZW50LXN0cmVhbScsXG4gICAgICAgICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyxcbiAgICAgICAgJ0Nvbm5lY3Rpb24nOiAna2VlcC1hbGl2ZScsXG4gICAgICB9KTtcbiAgICAgIHJlcy53cml0ZSgnOmNvbm5lY3RlZFxcblxcbicpO1xuXG4gICAgICBjb25zdCBmaWx0ZXI6IFNTRUNsaWVudEZpbHRlciA9IHt9O1xuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbJ2NhdGVnb3J5J10gPT09ICdzdHJpbmcnICYmIHJlcS5xdWVyeVsnY2F0ZWdvcnknXSkge1xuICAgICAgICBmaWx0ZXIuY2F0ZWdvcnkgPSByZXEucXVlcnlbJ2NhdGVnb3J5J10gYXMgTG9nQ2F0ZWdvcnk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVsnbGV2ZWwnXSA9PT0gJ3N0cmluZycgJiYgcmVxLnF1ZXJ5WydsZXZlbCddKSB7XG4gICAgICAgIGZpbHRlci5sZXZlbCA9IHJlcS5xdWVyeVsnbGV2ZWwnXSBhcyBMb2dMZXZlbDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVxLnF1ZXJ5Wydzb3VyY2UnXSA9PT0gJ3N0cmluZycgJiYgcmVxLnF1ZXJ5Wydzb3VyY2UnXSkge1xuICAgICAgICBmaWx0ZXIuc291cmNlID0gcmVxLnF1ZXJ5Wydzb3VyY2UnXTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVxLnF1ZXJ5Wydjb3JyZWxhdGlvbklkJ10gPT09ICdzdHJpbmcnICYmIHJlcS5xdWVyeVsnY29ycmVsYXRpb25JZCddKSB7XG4gICAgICAgIGZpbHRlci5jb3JyZWxhdGlvbklkID0gcmVxLnF1ZXJ5Wydjb3JyZWxhdGlvbklkJ107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsaWVudDogU1NFQ2xpZW50ID0geyByZXMsIGZpbHRlciB9O1xuICAgICAgdGhpcy5jbGllbnRzLmFkZChjbGllbnQpO1xuXG4gICAgICAvLyBCYWNrZmlsbCByZWNlbnQgaGlzdG9yeSBzbyB0aGUgdmlld2VyIHNob3dzIGNvbnRleHQgb24gY29ubmVjdFxuICAgICAgY29uc3QgaGlzdG9yeSA9IHRoaXMubWVtb3J5U2luay5xdWVyeSh7IGNhdGVnb3J5OiAnYWxsJywgbGltaXQ6IDUwMCB9KTtcbiAgICAgIC8vIFNlbmQgb2xkZXN0LWZpcnN0IHNvIHRoZSB2aWV3ZXIgZGlzcGxheXMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgY29uc3QgZW50cmllcyA9IGhpc3RvcnkuZW50cmllcy5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZW50cnkpfVxcblxcbmApO1xuICAgICAgfVxuXG4gICAgICByZXEub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEpTT04gcXVlcnkgKGRlbGVnYXRlcyB0byBNZW1vcnlMb2dTaW5rKVxuICAgIHRoaXMuYXBwLmdldCgnL2xvZ3MnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbJ2NhdGVnb3J5J10gPT09ICdzdHJpbmcnICYmIHJlcS5xdWVyeVsnY2F0ZWdvcnknXSkge1xuICAgICAgICBvcHRpb25zWydjYXRlZ29yeSddID0gcmVxLnF1ZXJ5WydjYXRlZ29yeSddO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbJ2xldmVsJ10gPT09ICdzdHJpbmcnICYmIHJlcS5xdWVyeVsnbGV2ZWwnXSkge1xuICAgICAgICBvcHRpb25zWydsZXZlbCddID0gcmVxLnF1ZXJ5WydsZXZlbCddO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbJ3NvdXJjZSddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3NvdXJjZSddKSB7XG4gICAgICAgIG9wdGlvbnNbJ3NvdXJjZSddID0gcmVxLnF1ZXJ5Wydzb3VyY2UnXTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVxLnF1ZXJ5WydtZXNzYWdlJ10gPT09ICdzdHJpbmcnICYmIHJlcS5xdWVyeVsnbWVzc2FnZSddKSB7XG4gICAgICAgIG9wdGlvbnNbJ21lc3NhZ2UnXSA9IHJlcS5xdWVyeVsnbWVzc2FnZSddO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbJ2xpbWl0J10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9wdGlvbnNbJ2xpbWl0J10gPSBwYXJzZUludChyZXEucXVlcnlbJ2xpbWl0J10sIDEwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVxLnF1ZXJ5WydvZmZzZXQnXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0aW9uc1snb2Zmc2V0J10gPSBwYXJzZUludChyZXEucXVlcnlbJ29mZnNldCddLCAxMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVsnc2luY2UnXSA9PT0gJ3N0cmluZycgJiYgcmVxLnF1ZXJ5WydzaW5jZSddKSB7XG4gICAgICAgIG9wdGlvbnNbJ3NpbmNlJ10gPSByZXEucXVlcnlbJ3NpbmNlJ107XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVsndW50aWwnXSA9PT0gJ3N0cmluZycgJiYgcmVxLnF1ZXJ5Wyd1bnRpbCddKSB7XG4gICAgICAgIG9wdGlvbnNbJ3VudGlsJ10gPSByZXEucXVlcnlbJ3VudGlsJ107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWVtb3J5U2luay5xdWVyeShvcHRpb25zKTtcbiAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgfSk7XG5cbiAgICAvLyBIZWFsdGhcbiAgICB0aGlzLmFwcC5nZXQoJy9oZWFsdGgnLCAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgcmVzLmpzb24oe1xuICAgICAgICBzdGF0dXM6ICdvaycsXG4gICAgICAgIGNsaWVudHM6IHRoaXMuY2xpZW50Q291bnQsXG4gICAgICAgIHVwdGltZTogTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRmlsdGVyIG1hdGNoaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgbWF0Y2hlc0ZpbHRlcihlbnRyeTogVW5pZmllZExvZ0VudHJ5LCBmaWx0ZXI6IFNTRUNsaWVudEZpbHRlcik6IGJvb2xlYW4ge1xuICAgIGlmIChmaWx0ZXIuY2F0ZWdvcnkgJiYgZW50cnkuY2F0ZWdvcnkgIT09IGZpbHRlci5jYXRlZ29yeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLmxldmVsICYmIExPR19MRVZFTF9QUklPUklUWVtlbnRyeS5sZXZlbF0gPCBMT0dfTEVWRUxfUFJJT1JJVFlbZmlsdGVyLmxldmVsXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnNvdXJjZSkge1xuICAgICAgY29uc3QgbmVlZGxlID0gZmlsdGVyLnNvdXJjZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFlbnRyeS5zb3VyY2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuZWVkbGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbHRlci5jb3JyZWxhdGlvbklkICYmIGVudHJ5LmNvcnJlbGF0aW9uSWQgIT09IGZpbHRlci5jb3JyZWxhdGlvbklkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedded HTML template for the DollhouseMCP Log Viewer.
|
|
3
|
-
*
|
|
4
|
-
* Returns a self-contained vanilla JS/CSS page that connects to the
|
|
5
|
-
* SSELogSink's /logs/stream endpoint via EventSource. See docs/LOGGING-DESIGN.md §4.6.
|
|
6
|
-
*/
|
|
7
|
-
export declare function getViewerHtml(port: number): string;
|
|
8
|
-
//# sourceMappingURL=viewerHtml.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"viewerHtml.d.ts","sourceRoot":"","sources":["../../../src/logging/viewer/viewerHtml.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoMlD"}
|